Use SubstInitializer instead of SubstExpr when instantiating a default
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 14 Oct 2016 01:12:20 +0000 (01:12 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 14 Oct 2016 01:12:20 +0000 (01:12 +0000)
argument, in order to correctly instantiate the initializer.

llvm-svn: 284184

clang/lib/Sema/SemaExpr.cpp
clang/test/CodeGenCXX/default-arg-temps.cpp

index 45f8ca7..e301d78 100644 (file)
@@ -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();
index 6a7f43a..f7b4681 100644 (file)
@@ -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>(); }
+}