diff options
-rw-r--r-- | lib/Sema/SemaExpr.cpp | 6 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateInstantiate.cpp | 9 | ||||
-rw-r--r-- | test/SemaCXX/conversion.cpp | 19 |
3 files changed, 30 insertions, 4 deletions
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 87a67ff632..4ed588565f 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -3300,9 +3300,11 @@ ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc, if (Result.isInvalid()) return ExprError(); + Expr *Arg = Result.takeAs<Expr>(); + CheckImplicitConversions(Arg, Arg->getExprLoc()); + Param->setDefaultArg(Arg); // Build the default argument expression. - return Owned(CXXDefaultArgExpr::Create(Context, CallLoc, Param, - Result.takeAs<Expr>())); + return Owned(CXXDefaultArgExpr::Create(Context, CallLoc, Param, Arg)); } // If the default expression creates temporaries, we need to diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 793ee0e50a..3635e64f3d 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -1594,8 +1594,13 @@ ParmVarDecl *Sema::SubstParmVarDecl(ParmVarDecl *OldParm, } else if (OldParm->hasUnparsedDefaultArg()) { NewParm->setUnparsedDefaultArg(); UnparsedDefaultArgInstantiations[OldParm].push_back(NewParm); - } else if (Expr *Arg = OldParm->getDefaultArg()) - NewParm->setUninstantiatedDefaultArg(Arg); + } else if (Expr *Arg = OldParm->getDefaultArg()) { + if (Arg->isInstantiationDependent() || + OldDI->getType()->isInstantiationDependentType()) + NewParm->setUninstantiatedDefaultArg(Arg); + else + NewParm->setDefaultArg(Arg); + } NewParm->setHasInheritedDefaultArg(OldParm->hasInheritedDefaultArg()); diff --git a/test/SemaCXX/conversion.cpp b/test/SemaCXX/conversion.cpp index a64b18721a..225bc837b5 100644 --- a/test/SemaCXX/conversion.cpp +++ b/test/SemaCXX/conversion.cpp @@ -81,3 +81,22 @@ void test3() { #define FINIT int a3 = NULL; FINIT // expected-warning {{implicit conversion of NULL constant to 'int'}} } + +namespace test4 { + template<typename T> + void tmpl(char c = NULL, // expected-warning {{implicit conversion of NULL constant to 'char'}} + T a = NULL, // expected-warning {{implicit conversion of NULL constant to 'char'}} \ + expected-warning {{implicit conversion of NULL constant to 'int'}} + T b = 1024) { // expected-warning {{implicit conversion from 'int' to 'char' changes value from 1024 to 0}} + } + + template<typename T> + void tmpl2(T t = NULL) { + } + + void func() { + tmpl<char>(); // expected-note {{in instantiation of default function argument expression for 'tmpl<char>' required here}} + tmpl<int>(); // expected-note {{in instantiation of default function argument expression for 'tmpl<int>' required here}} + tmpl2<int*>(); + } +} |