diff options
author | Anders Carlsson <andersca@mac.com> | 2009-08-25 05:18:00 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-08-25 05:18:00 +0000 |
commit | c1eb79b7c9fa063f7b6f6261d2dd6af9a70c915c (patch) | |
tree | 54b05bbec49854867ab471ee272ec21fbf20e9ac /clang/lib/Sema/SemaDeclCXX.cpp | |
parent | 6eb55575da14af825a2b66ff2c7e452799102e09 (diff) | |
download | bcm5719-llvm-c1eb79b7c9fa063f7b6f6261d2dd6af9a70c915c.tar.gz bcm5719-llvm-c1eb79b7c9fa063f7b6f6261d2dd6af9a70c915c.zip |
InitializeVarWithConstructor now returns true on failure.
llvm-svn: 79976
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 17e88b3512e..f4b5a57ed53 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -2467,18 +2467,21 @@ Sema::BuildCXXConstructExpr(QualType DeclInitType, return Owned(Temp); } -void Sema::InitializeVarWithConstructor(VarDecl *VD, +bool Sema::InitializeVarWithConstructor(VarDecl *VD, CXXConstructorDecl *Constructor, QualType DeclInitType, Expr **Exprs, unsigned NumExprs) { OwningExprResult TempResult = BuildCXXConstructExpr(DeclInitType, Constructor, Exprs, NumExprs); - assert(!TempResult.isInvalid() && "FIXME: Error handling"); + if (TempResult.isInvalid()) + return true; Expr *Temp = TempResult.takeAs<Expr>(); MarkDeclarationReferenced(VD->getLocation(), Constructor); Temp = MaybeCreateCXXExprWithTemporaries(Temp, /*DestroyTemps=*/true); VD->setInit(Context, Temp); + + return false; } void Sema::FinalizeVarWithDestructor(VarDecl *VD, QualType DeclInitType) @@ -2555,8 +2558,9 @@ void Sema::AddCXXDirectInitializerToDecl(DeclPtrTy Dcl, RealDecl->setInvalidDecl(); else { VDecl->setCXXDirectInitializer(true); - InitializeVarWithConstructor(VDecl, Constructor, DeclInitType, - (Expr**)Exprs.release(), NumExprs); + if (InitializeVarWithConstructor(VDecl, Constructor, DeclInitType, + (Expr**)Exprs.release(), NumExprs)) + RealDecl->setInvalidDecl(); FinalizeVarWithDestructor(VDecl, DeclInitType); } return; |