diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-08-27 03:53:50 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-08-27 03:53:50 +0000 |
| commit | 55243168df9004e1299f2ab08d64e815cdf52c44 (patch) | |
| tree | e78bdac80aef9f0c0047f266e5c0e6c899252f16 /clang/lib/Sema/SemaExprCXX.cpp | |
| parent | 5eef6ad6a999465af9f307dac98b633bacd8809d (diff) | |
| download | bcm5719-llvm-55243168df9004e1299f2ab08d64e815cdf52c44.tar.gz bcm5719-llvm-55243168df9004e1299f2ab08d64e815cdf52c44.zip | |
In ActOnCXXTypeConstructExpr, check that the type is complete and non-abstract before creating any expressions. This assures that any templates are instantiated if necessary.
llvm-svn: 80200
Diffstat (limited to 'clang/lib/Sema/SemaExprCXX.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 22d01ec0c80..a4c3b0dd594 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -203,7 +203,20 @@ Sema::ActOnCXXTypeConstructExpr(SourceRange TypeRange, TypeTy *TypeRep, RParenLoc)); } - + if (Ty->isArrayType()) + return ExprError(Diag(TyBeginLoc, + diag::err_value_init_for_array_type) << FullRange); + if (!Ty->isVoidType() && + RequireCompleteType(TyBeginLoc, Ty, + PDiag(diag::err_invalid_incomplete_type_use) + << FullRange)) + return ExprError(); + + if (RequireNonAbstractType(TyBeginLoc, Ty, + diag::err_allocation_of_abstract_type)) + return ExprError(); + + // C++ [expr.type.conv]p1: // If the expression list is a single expression, the type conversion // expression is equivalent (in definedness, and if defined in meaning) to the @@ -267,19 +280,6 @@ Sema::ActOnCXXTypeConstructExpr(SourceRange TypeRange, TypeTy *TypeRep, // complete object type or the (possibly cv-qualified) void type, creates an // rvalue of the specified type, which is value-initialized. // - if (Ty->isArrayType()) - return ExprError(Diag(TyBeginLoc, - diag::err_value_init_for_array_type) << FullRange); - if (!Ty->isDependentType() && !Ty->isVoidType() && - RequireCompleteType(TyBeginLoc, Ty, - PDiag(diag::err_invalid_incomplete_type_use) - << FullRange)) - return ExprError(); - - if (RequireNonAbstractType(TyBeginLoc, Ty, - diag::err_allocation_of_abstract_type)) - return ExprError(); - exprs.release(); return Owned(new (Context) CXXZeroInitValueExpr(Ty, TyBeginLoc, RParenLoc)); } |

