diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-12-19 22:01:37 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-12-19 22:01:37 +0000 |
commit | d0b111c3ddfd53869e00f92e782a9373a176cf0e (patch) | |
tree | 2266e06eea4dcd2850d6587882e4404c075fbcba /clang/lib/AST/ExprConstant.cpp | |
parent | 4266a7935191d8111e6bfa0de2ce0eec98678201 (diff) | |
download | bcm5719-llvm-d0b111c3ddfd53869e00f92e782a9373a176cf0e.tar.gz bcm5719-llvm-d0b111c3ddfd53869e00f92e782a9373a176cf0e.zip |
Improve r146813 (for PR11595) to give an appropriate diagnostic.
llvm-svn: 146915
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index ff556c30944..630136ea7f8 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -2059,9 +2059,7 @@ public: return false; BaseTy = E->getBase()->getType()->getAs<PointerType>()->getPointeeType(); } else if (E->getBase()->isRValue()) { - if (!E->getBase()->getType()->isRecordType() || - !E->getBase()->getType()->isLiteralType()) - return false; + assert(E->getBase()->getType()->isRecordType()); if (!EvaluateTemporary(E->getBase(), Result, this->Info)) return false; BaseTy = E->getBase()->getType(); @@ -2242,7 +2240,7 @@ bool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) { bool LValueExprEvaluator::VisitMaterializeTemporaryExpr( const MaterializeTemporaryExpr *E) { if (E->GetTemporaryExpr()->isRValue()) { - if (E->getType()->isRecordType() && E->getType()->isLiteralType()) + if (E->getType()->isRecordType()) return EvaluateTemporary(E->GetTemporaryExpr(), Result, Info); Result.set(E, Info.CurrentCall); @@ -2770,8 +2768,15 @@ public: /// Evaluate an expression of record type as a temporary. static bool EvaluateTemporary(const Expr *E, LValue &Result, EvalInfo &Info) { - assert(E->isRValue() && E->getType()->isRecordType() && - E->getType()->isLiteralType()); + assert(E->isRValue() && E->getType()->isRecordType()); + if (!E->getType()->isLiteralType()) { + if (Info.getLangOpts().CPlusPlus0x) + Info.Diag(E->getExprLoc(), diag::note_constexpr_nonliteral) + << E->getType(); + else + Info.Diag(E->getExprLoc(), diag::note_invalid_subexpr_in_const_expr); + return false; + } return TemporaryExprEvaluator(Info, Result).Visit(E); } |