]> granicus.if.org Git - clang/commitdiff
Special-case default argument expression in instantiation. This should fix PR4301...
authorSebastian Redl <sebastian.redl@getdesigned.at>
Sun, 8 Nov 2009 13:56:19 +0000 (13:56 +0000)
committerSebastian Redl <sebastian.redl@getdesigned.at>
Sun, 8 Nov 2009 13:56:19 +0000 (13:56 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86465 91177308-0d34-0410-b5e6-96231b3b80d8

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

index dfe37d8caf17ccd270281f15efa6caade1c0c191..50070fc663fa56c8399a6189f084b9b15cc91af8 100644 (file)
@@ -427,6 +427,9 @@ namespace {
     Sema::OwningExprResult TransformDeclRefExpr(DeclRefExpr *E,
                                                 bool isAddressOfOperand);
 
+    Sema::OwningExprResult TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E,
+                                                      bool isAddressOfOperand);
+
     /// \brief Transforms a template type parameter type by performing
     /// substitution of the corresponding template type argument.
     QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB,
@@ -648,6 +651,15 @@ TemplateInstantiator::TransformDeclRefExpr(DeclRefExpr *E,
                                           isAddressOfOperand);
 }
 
+Sema::OwningExprResult TemplateInstantiator::TransformCXXDefaultArgExpr(
+    CXXDefaultArgExpr *E, bool isAddressOfOperand) {
+  assert(!cast<FunctionDecl>(E->getParam()->getDeclContext())->
+             getDescribedFunctionTemplate() &&
+         "Default arg expressions are never formed in dependent cases.");
+  return SemaRef.Owned(E->Retain());
+}
+
+
 QualType
 TemplateInstantiator::TransformTemplateTypeParmType(TypeLocBuilder &TLB,
                                                 TemplateTypeParmTypeLoc TL) {
index 9c0f1ecf0c3b7d5450194aa63a96b577efe7a9df..c136eee0f62bbffcf52bfa53a8d73f12839b1169 100644 (file)
@@ -108,3 +108,26 @@ struct D {
 };
 D::D() { } // expected-note {{in instantiation of default function argument expression for 'A<int *>' required he}}
 }
+
+// PR5301
+namespace pr5301 {
+  void f(int, int = 0);
+
+  template <typename T>
+  void g(T, T = 0);
+
+  template <int I>
+  void i(int a = I);
+
+  template <typename T>
+  void h(T t) {
+    f(0);
+    g(1);
+    g(t);
+    i<2>();
+  }
+
+  void test() {
+    h(0);
+  }
+}