BuildCXXConstructExpr now returns an OwningExprResult.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79975 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp
index 56d0456..174e8b6 100644
--- a/lib/AST/DeclCXX.cpp
+++ b/lib/AST/DeclCXX.cpp
@@ -454,7 +454,7 @@
   //   A default constructor for a class X is a constructor of class
   //   X that can be called without an argument.
   return (getNumParams() == 0) ||
-         (getNumParams() > 0 && getParamDecl(0)->getDefaultArg() != 0);
+         (getNumParams() > 0 && getParamDecl(0)->hasDefaultArg());
 }
 
 bool 
diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index 96ea420..a60c60c 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -1752,16 +1752,16 @@
                                     QualType DeclInitType, 
                                     Expr **Exprs, unsigned NumExprs);
 
-  Expr *BuildCXXConstructExpr(QualType DeclInitType,
-                              CXXConstructorDecl *Constructor,
-                              Expr **Exprs, unsigned NumExprs);
+  OwningExprResult BuildCXXConstructExpr(QualType DeclInitType,
+                                         CXXConstructorDecl *Constructor,
+                                         Expr **Exprs, unsigned NumExprs);
 
   /// BuildCXXConstructExpr - Creates a complete call to a constructor,
   /// including handling of its default argument expressions.
-  Expr *BuildCXXConstructExpr(QualType DeclInitType,
-                              CXXConstructorDecl *Constructor,
-                              bool Elidable,
-                              Expr **Exprs, unsigned NumExprs);
+  OwningExprResult BuildCXXConstructExpr(QualType DeclInitType,
+                                         CXXConstructorDecl *Constructor,
+                                         bool Elidable,
+                                         Expr **Exprs, unsigned NumExprs);
   
   /// BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating
   /// the default expr if needed.
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index 0ddf8b0..17e88b3 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -2407,9 +2407,10 @@
   CopyConstructor->setUsed();
 }
 
-Expr *Sema::BuildCXXConstructExpr(QualType DeclInitType,
-                                  CXXConstructorDecl *Constructor,
-                                  Expr **Exprs, unsigned NumExprs) {
+Sema::OwningExprResult
+Sema::BuildCXXConstructExpr(QualType DeclInitType,
+                            CXXConstructorDecl *Constructor,
+                            Expr **Exprs, unsigned NumExprs) {
   bool Elidable = false;
   
   // [class.copy]p15:
@@ -2435,10 +2436,12 @@
 
 /// BuildCXXConstructExpr - Creates a complete call to a constructor,
 /// including handling of its default argument expressions.
-Expr *Sema::BuildCXXConstructExpr(QualType DeclInitType, 
-                                  CXXConstructorDecl *Constructor,
-                                  bool Elidable,
-                                  Expr **Exprs, unsigned NumExprs) {
+Sema::OwningExprResult
+Sema::BuildCXXConstructExpr(QualType DeclInitType, 
+                            CXXConstructorDecl *Constructor,
+                            bool Elidable,
+                            Expr **Exprs, 
+                            unsigned NumExprs) {
   CXXConstructExpr *Temp = CXXConstructExpr::Create(Context, DeclInitType, 
                                                     Constructor, 
                                                     Elidable, Exprs, NumExprs);
@@ -2461,15 +2464,18 @@
     Expr *Arg = CXXDefaultArgExpr::Create(Context, FDecl->getParamDecl(j));
     Temp->setArg(j, Arg);
   }
-  return Temp;
+  return Owned(Temp);
 }
 
 void Sema::InitializeVarWithConstructor(VarDecl *VD, 
                                         CXXConstructorDecl *Constructor,
                                         QualType DeclInitType, 
                                         Expr **Exprs, unsigned NumExprs) {
-  Expr *Temp = BuildCXXConstructExpr(DeclInitType, Constructor, 
-                                     Exprs, NumExprs);  
+  OwningExprResult TempResult = BuildCXXConstructExpr(DeclInitType, Constructor, 
+                                                      Exprs, NumExprs);
+  assert(!TempResult.isInvalid() && "FIXME: Error handling");
+  
+  Expr *Temp = TempResult.takeAs<Expr>();
   MarkDeclarationReferenced(VD->getLocation(), Constructor);
   Temp = MaybeCreateCXXExprWithTemporaries(Temp, /*DestroyTemps=*/true);
   VD->setInit(Context, Temp);
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index d89a090..aefec6a 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -943,7 +943,13 @@
     // FIXME: When can ToType be a reference type?
     assert(!ToType->isReferenceType());
     
-    From = BuildCXXConstructExpr(ToType, SCS.CopyConstructor, &From, 1);
+    OwningExprResult FromResult = 
+      BuildCXXConstructExpr(ToType, SCS.CopyConstructor, &From, 1);
+    
+    if (FromResult.isInvalid())
+      return true;
+    
+    From = FromResult.takeAs<Expr>();
     return false;
   }
 
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index ce6a99a..405dd84 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -176,7 +176,13 @@
                                              DirectInit? IK_Direct : IK_Copy);
         if (!Constructor)
           return true;
-        Init = BuildCXXConstructExpr(DeclType, Constructor, &Init, 1);
+        
+        OwningExprResult InitResult = 
+          BuildCXXConstructExpr(DeclType, Constructor, &Init, 1);
+        if (InitResult.isInvalid())
+          return true;
+        
+        Init = InitResult.takeAs<Expr>();
         return false;
       }
       
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index 258993e..8220ec3 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -1380,10 +1380,8 @@
                                            MultiExprArg Args) {
     unsigned NumArgs = Args.size();
     Expr **ArgsExprs = (Expr **)Args.release();
-    return getSema().Owned(SemaRef.BuildCXXConstructExpr(T, Constructor,
-                                                         IsElidable,
-                                                         ArgsExprs,
-                                                         NumArgs));
+    return getSema().BuildCXXConstructExpr(T, Constructor, IsElidable,
+                                           ArgsExprs, NumArgs);
   }
 
   /// \brief Build a new object-construction expression.