return true;
// Pass the argument.
- if (PerformCopyInitialization(Arg, ProtoArgType, AA_Passing))
- return true;
+ if (FDecl && i < FDecl->getNumParams()) {
+ ParmVarDecl *Param = FDecl->getParamDecl(i);
+ InitializedEntity Entity =InitializedEntity::InitializeParameter(Param);
+ OwningExprResult ArgE = PerformCopyInitialization(Entity,
+ SourceLocation(),
+ Owned(Arg));
+ if (ArgE.isInvalid())
+ return true;
+
+ Arg = ArgE.takeAs<Expr>();
+ } else {
+ if (PerformCopyInitialization(Arg, ProtoArgType, AA_Passing))
+ return true;
+ }
if (!ProtoArgType->isReferenceType())
Arg = MaybeBindToTemporary(Arg).takeAs<Expr>();
void InitializedEntity::InitDeclLoc() {
assert((Kind == EK_Variable || Kind == EK_Parameter || Kind == EK_Member) &&
"InitDeclLoc cannot be used with non-declaration entities.");
-
- if (TypeSourceInfo *DI = VariableOrMember->getTypeSourceInfo()) {
+
+ ASTContext &Context = VariableOrMember->getASTContext();
+ if (Kind == EK_Parameter &&
+ !Context.hasSameUnqualifiedType(
+ cast<ParmVarDecl>(VariableOrMember)->getOriginalType(),
+ VariableOrMember->getType())) {
+ // For a parameter whose type has decayed, use the decayed type to
+ // build new source information.
+ } else if (TypeSourceInfo *DI = VariableOrMember->getTypeSourceInfo()) {
TL = DI->getTypeLoc();
return;
}
// FIXME: Once we've gone through the effort to create the fake
// TypeSourceInfo, should we cache it in the declaration?
// (If not, we "leak" it).
- TypeSourceInfo *DI = VariableOrMember->getASTContext()
- .CreateTypeSourceInfo(VariableOrMember->getType());
+ TypeSourceInfo *DI
+ = Context.CreateTypeSourceInfo(VariableOrMember->getType());
DI->getTypeLoc().initialize(VariableOrMember->getLocation());
TL = DI->getTypeLoc();
}
QualType SourceType = CurInitExpr->getType();
Sema::AssignConvertType ConvTy =
S.CheckSingleAssignmentConstraints(Step->Type, CurInitExpr);
+
+ // If this is a call, allow conversion to a transparent union.
+ if (ConvTy != Sema::Compatible &&
+ Entity.getKind() == InitializedEntity::EK_Parameter &&
+ S.CheckTransparentUnionArgumentConstraints(Step->Type, CurInitExpr)
+ == Sema::Compatible)
+ ConvTy = Sema::Compatible;
+
if (S.DiagnoseAssignmentResult(ConvTy, Kind.getLocation(),
Step->Type, SourceType,
CurInitExpr, getAssignmentAction(Entity)))
void fn2();
};
struct Convertible { operator Base&(); };
-struct Priv : private Base {}; // expected-note 2 {{'private' inheritance specifier here}}
+struct Priv : private Base {}; // expected-note 4 {{'private' inheritance specifier here}}
struct Mid : Base {};
struct Fin : Mid, Derived {};
typedef void (Derived::*DFnPtr)();
(void)(i1 ? Base() : constder()); // expected-error {{incompatible operand types ('struct Base' and 'struct Derived const')}}
(void)(i1 ? constder() : Base()); // expected-error {{incompatible operand types ('struct Derived const' and 'struct Base')}}
- // FIXME: these are invalid hierarchy conversions
Priv priv;
Fin fin;
- (void)(i1 ? Base() : Priv()); // xpected-error private base
- (void)(i1 ? Priv() : Base()); // xpected-error private base
- (void)(i1 ? Base() : Fin()); // xpected-error ambiguous base
- (void)(i1 ? Fin() : Base()); // xpected-error ambiguous base
+ (void)(i1 ? Base() : Priv()); // expected-error{{conversion from 'struct Priv' to inaccessible base class 'struct Base'}}
+ (void)(i1 ? Priv() : Base()); // expected-error{{error: conversion from 'struct Priv' to inaccessible base class 'struct Base'}}
+ (void)(i1 ? Base() : Fin()); // expected-error{{ambiguous conversion from derived class 'struct Fin' to base class 'struct Base'}}
+ (void)(i1 ? Fin() : Base()); // expected-error{{ambiguous conversion from derived class 'struct Fin' to base class 'struct Base'}}
(void)(i1 ? base : priv); // expected-error {{conversion from 'struct Priv' to inaccessible base class 'struct Base'}}
(void)(i1 ? priv : base); // expected-error {{conversion from 'struct Priv' to inaccessible base class 'struct Base'}}
(void)(i1 ? base : fin); // expected-error {{ambiguous conversion from derived class 'struct Fin' to base class 'struct Base'}}
void test_X_elab(NS::X x) {
struct S4 *s4 = 0;
- x.test_elab2(s4); // expected-error{{incompatible type passing 'struct S4 *', expected 'struct NS::S4 *'}}
+ x.test_elab2(s4); // expected-error{{cannot initialize a parameter of type 'struct NS::S4 *' with an lvalue of type 'struct S4 *'}}
}
namespace NS {
// RUN: %clang_cc1 -fsyntax-only -verify %s
// PR4103: Make sure we have a location for the error
class A { float a(int *); int b(); };
-int A::b() { return a(a((int*)0)); } // expected-error {{incompatible type}}
+int A::b() { return a(a((int*)0)); } // expected-error {{cannot initialize a parameter of type 'int *' with an rvalue of type 'float'}}
void bar(id(^)(void));
void foo(id <NSObject>(^objectCreationBlock)(void)) {
- return bar(objectCreationBlock); // expected-warning{{incompatible pointer types passing 'id (^)()', expected 'id<NSObject> (^)()'}}
+ return bar(objectCreationBlock); // expected-warning{{incompatible pointer types converting 'id (^)()', expected 'id<NSObject> (^)()'}}
}
void bar2(id(*)(void));
void foo2(id <NSObject>(*objectCreationBlock)(void)) {
- return bar2(objectCreationBlock); // expected-warning{{incompatible pointer types passing 'id (*)()', expected 'id<NSObject> (*)()'}}
+ return bar2(objectCreationBlock); // expected-warning{{incompatible pointer types converting 'id (*)()', expected 'id<NSObject> (*)()'}}
}
void bar3(id(*)()); // expected-note{{candidate function}}
X1<int*>::Inner3<int> id3;
id3.f0(ip, i);
- id3.f0(dp, i); // expected-error{{incompatible type}}
+ id3.f0(dp, i); // expected-error{{cannot initialize a parameter of type 'int *' with an lvalue of type 'double *'}}
id3.f1(ip, i, ip);
id3.f1(ip, i, dp); // expected-note{{instantiation}}