diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.h | 14 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 26 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 6 |
6 files changed, 40 insertions, 24 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index 56d0456d59c..174e8b6cd36 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -454,7 +454,7 @@ bool CXXConstructorDecl::isDefaultConstructor() const { // 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/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 96ea4204f0c..a60c60c4e15 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -1752,16 +1752,16 @@ public: 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/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 0ddf8b0a775..17e88b3512e 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -2407,9 +2407,10 @@ void Sema::DefineImplicitCopyConstructor(SourceLocation CurrentLocation, 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 @@ Expr *Sema::BuildCXXConstructExpr(QualType DeclInitType, /// 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 *Sema::BuildCXXConstructExpr(QualType DeclInitType, 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/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index d89a0909aa1..aefec6a7a68 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -943,7 +943,13 @@ Sema::PerformImplicitConversion(Expr *&From, QualType ToType, // 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/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index ce6a99acd9d..405dd8489e2 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -176,7 +176,13 @@ bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType, 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/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 258993e72e8..8220ec33c2b 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -1380,10 +1380,8 @@ public: 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. |