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.