Improved support for default arguments in constructors for class templates.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79984 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index f4b5a57..c30b974 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -2442,29 +2442,28 @@
                             bool Elidable,
                             Expr **Exprs, 
                             unsigned NumExprs) {
-  CXXConstructExpr *Temp = CXXConstructExpr::Create(Context, DeclInitType, 
-                                                    Constructor, 
-                                                    Elidable, Exprs, NumExprs);
+  ExprOwningPtr<CXXConstructExpr> Temp(this, 
+                                       CXXConstructExpr::Create(Context, 
+                                                                DeclInitType, 
+                                                                Constructor, 
+                                                                Elidable,
+                                                                Exprs,
+                                                                NumExprs));
   // default arguments must be added to constructor call expression.
   FunctionDecl *FDecl = cast<FunctionDecl>(Constructor);
   unsigned NumArgsInProto = FDecl->param_size();
   for (unsigned j = NumExprs; j != NumArgsInProto; j++) {
-    Expr *DefaultExpr = FDecl->getParamDecl(j)->getDefaultArg();
-    
-    // If the default expression creates temporaries, we need to
-    // push them to the current stack of expression temporaries so they'll
-    // be properly destroyed.
-    if (CXXExprWithTemporaries *E 
-        = dyn_cast_or_null<CXXExprWithTemporaries>(DefaultExpr)) {
-      assert(!E->shouldDestroyTemporaries() && 
-             "Can't destroy temporaries in a default argument expr!");
-      for (unsigned I = 0, N = E->getNumTemporaries(); I != N; ++I)
-        ExprTemporaries.push_back(E->getTemporary(I));
-    }
-    Expr *Arg = CXXDefaultArgExpr::Create(Context, FDecl->getParamDecl(j));
-    Temp->setArg(j, Arg);
+    ParmVarDecl *Param = FDecl->getParamDecl(j);
+
+    OwningExprResult ArgExpr = 
+      BuildCXXDefaultArgExpr(/*FIXME:*/SourceLocation(),
+                             FDecl, Param);
+    if (ArgExpr.isInvalid())
+      return ExprError();
+
+    Temp->setArg(j, ArgExpr.takeAs<Expr>());
   }
-  return Owned(Temp);
+  return move(Temp);
 }
 
 bool Sema::InitializeVarWithConstructor(VarDecl *VD, 
diff --git a/test/SemaTemplate/default-expr-arguments.cpp b/test/SemaTemplate/default-expr-arguments.cpp
index 87532ef..34d2d9d 100644
--- a/test/SemaTemplate/default-expr-arguments.cpp
+++ b/test/SemaTemplate/default-expr-arguments.cpp
@@ -18,3 +18,11 @@
   f3(10);
   f3(S()); // expected-note{{in instantiation of default argument for 'f3<struct S>' required here}}
 }
+
+template<typename T> struct F {
+	F(T t = 10);
+};
+
+void g2() {
+	F<int> f;
+}