diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-10-14 01:12:20 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-10-14 01:12:20 +0000 |
commit | 869d37e33388c353b5651b16eb1ecccf7132776e (patch) | |
tree | 44632a885b9b6234535e7b7c7a85b6a648d50e71 | |
parent | f70847deeff88c97d5a8898549ce8d4b4ad02b9e (diff) | |
download | bcm5719-llvm-869d37e33388c353b5651b16eb1ecccf7132776e.tar.gz bcm5719-llvm-869d37e33388c353b5651b16eb1ecccf7132776e.zip |
Use SubstInitializer instead of SubstExpr when instantiating a default
argument, in order to correctly instantiate the initializer.
llvm-svn: 284184
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 3 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/default-arg-temps.cpp | 9 |
2 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 45f8ca7515b..e301d789a4d 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -4559,7 +4559,8 @@ ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc, // default argument expression appears. ContextRAII SavedContext(*this, FD); LocalInstantiationScope Local(*this); - Result = SubstExpr(UninstExpr, MutiLevelArgList); + Result = SubstInitializer(UninstExpr, MutiLevelArgList, + /*DirectInit*/false); } if (Result.isInvalid()) return ExprError(); diff --git a/clang/test/CodeGenCXX/default-arg-temps.cpp b/clang/test/CodeGenCXX/default-arg-temps.cpp index 6a7f43a5128..f7b46818e39 100644 --- a/clang/test/CodeGenCXX/default-arg-temps.cpp +++ b/clang/test/CodeGenCXX/default-arg-temps.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple=x86_64-apple-darwin9 | FileCheck %s struct T { T(); @@ -71,3 +71,10 @@ namespace test1 { D d; } + +namespace test2 { + // CHECK: define linkonce_odr void @_ZN5test21AIiED2Ev( + template <typename T> struct A { A() {} ~A() {} }; + template <typename> void f(const A<int> & = {}) {} + void g() { f<int>(); } +} |