]> granicus.if.org Git - clang/commitdiff
Add a null check that fixes the crash in PR4362, and make sure to instantiate non...
authorAnders Carlsson <andersca@mac.com>
Thu, 11 Jun 2009 16:06:49 +0000 (16:06 +0000)
committerAnders Carlsson <andersca@mac.com>
Thu, 11 Jun 2009 16:06:49 +0000 (16:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73193 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaTemplate.cpp
test/SemaTemplate/default-arguments.cpp

index f9176ca470c08afaff2b8135ca3b2108c98dfafe..f03c1acb8e2d3dbfa4fc62f12824c8e99b8be077 100644 (file)
@@ -1024,8 +1024,21 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template,
         if (!NTTP->hasDefaultArgument())
           break;
 
-        // FIXME: Instantiate default argument
-        Arg = TemplateArgument(NTTP->getDefaultArgument());
+        InstantiatingTemplate Inst(*this, TemplateLoc, 
+                                   Template, Converted.getFlatArgumentList(),
+                                   Converted.flatSize(),
+                                   SourceRange(TemplateLoc, RAngleLoc));
+        
+        TemplateArgumentList TemplateArgs(Context, Converted,
+                                          /*CopyArgs=*/false,
+                                          /*FlattenArgs=*/false);
+
+        Sema::OwningExprResult E = InstantiateExpr(NTTP->getDefaultArgument(), 
+                                                   TemplateArgs);
+        if (E.isInvalid())
+          return true;
+        
+        Arg = TemplateArgument(E.takeAs<Expr>());
       } else {
         TemplateTemplateParmDecl *TempParm 
           = cast<TemplateTemplateParmDecl>(*Param);      
@@ -1400,7 +1413,8 @@ bool Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param,
   // FIXME: Add template argument to Converted!
   if (InstantiatedParamType->isDependentType() || Arg->isTypeDependent()) {
     // FIXME: Produce a cloned, canonical expression?
-    Converted->push_back(TemplateArgument(Arg));
+    if (Converted)
+      Converted->push_back(TemplateArgument(Arg));
     return false;
   }
 
index 5b6ab7d1552c211d85cab821408120b92dd1a5a5..f9bb44ecb9c0ca32086cbeb05938bac0422762b1 100644 (file)
@@ -13,3 +13,12 @@ X<> *x4;
 
 template<typename T = int> struct Z { };
 template struct Z<>;
+
+// PR4362
+template<class T> struct a { };
+template<> struct a<int> { static const bool v = true; };
+
+template<class T, bool = a<T>::v> struct p { }; // expected-error {{no member named 'v'}}
+
+template struct p<bool>; // expected-note {{in instantiation of default argument for 'p<bool>' required here}}
+template struct p<int>;