diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2009-11-08 13:56:19 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2009-11-08 13:56:19 +0000 |
commit | a29e51bb9874bb9ce442efa271e87da237e4ce2c (patch) | |
tree | 399cffd42ba8bbfa34b45b8182e4e3dae691236a | |
parent | 28a109f63506d8c96e3fbf1b959b603ccec2f586 (diff) |
Special-case default argument expression in instantiation. This should fix PR4301. Doug, please double-check my assumptions. Read the PR for more details.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86465 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaTemplateInstantiate.cpp | 12 | ||||
-rw-r--r-- | test/SemaTemplate/default-expr-arguments.cpp | 23 |
2 files changed, 35 insertions, 0 deletions
diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index dfe37d8caf..50070fc663 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -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) { diff --git a/test/SemaTemplate/default-expr-arguments.cpp b/test/SemaTemplate/default-expr-arguments.cpp index 9c0f1ecf0c..c136eee0f6 100644 --- a/test/SemaTemplate/default-expr-arguments.cpp +++ b/test/SemaTemplate/default-expr-arguments.cpp @@ -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); + } +} |