diff options
author | Anders Carlsson <andersca@mac.com> | 2008-12-19 20:58:05 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2008-12-19 20:58:05 +0000 |
commit | 6736d1a2bb9e690cf88d2fe9bcb3896a66334833 (patch) | |
tree | 1d411f8c73dffa41c0f66b8b3bf1b3e524edbecf /clang | |
parent | 0869f78555d7799c2e3cb35d2fcffa22cbaff08f (diff) | |
download | bcm5719-llvm-6736d1a2bb9e690cf88d2fe9bcb3896a66334833.tar.gz bcm5719-llvm-6736d1a2bb9e690cf88d2fe9bcb3896a66334833.zip |
Get rid of the old Expr::Evaluate variant.
llvm-svn: 61260
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/AST/Expr.h | 3 | ||||
-rw-r--r-- | clang/lib/AST/Expr.cpp | 8 | ||||
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 21 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 15 |
4 files changed, 17 insertions, 30 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index d3bf1b96d64..2f2ca04947c 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -208,9 +208,6 @@ public: /// in Result. bool Evaluate(EvalResult &Result, ASTContext &Ctx) const; - // FIXME: We should come up with a better API for the isEvaluated case. - bool Evaluate(APValue& Result, ASTContext &Ctx, bool *isEvaluated = 0) const; - /// isEvaluatable - Call Evaluate to see if this expression can be constant /// folded, but discard the result. bool isEvaluatable(ASTContext &Ctx) const; diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index c01c973cf59..8aaea7ac9f3 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -763,9 +763,11 @@ bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, // If this is a call to a builtin function, constant fold it otherwise // reject it. if (CE->isBuiltinCall()) { - APValue ResultAP; - if (CE->Evaluate(ResultAP, Ctx)) { - Result = ResultAP.getInt(); + EvalResult EvalResult; + if (CE->Evaluate(EvalResult, Ctx)) { + assert(!EvalResult.HasSideEffects && + "Foldable builtin call should not have side effects!"); + Result = EvalResult.Val.getInt(); break; // It is a constant, expand it. } } diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 7a83d6c063d..681016793f9 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -1194,19 +1194,6 @@ bool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const { return true; } -bool Expr::Evaluate(APValue &Result, ASTContext &Ctx, bool *isEvaluated) const { - EvalResult EvalResult; - - if (!Evaluate(EvalResult, Ctx)) - return false; - - Result = EvalResult.Val; - if (isEvaluated) - *isEvaluated = !EvalResult.HasSideEffects; - - return true; -} - /// isEvaluatable - Call Evaluate to see if this expression can be constant /// folded, but discard the result. bool Expr::isEvaluatable(ASTContext &Ctx) const { @@ -1215,10 +1202,10 @@ bool Expr::isEvaluatable(ASTContext &Ctx) const { } APSInt Expr::EvaluateAsInt(ASTContext &Ctx) const { - APValue V; - bool Result = Evaluate(V, Ctx); + EvalResult EvalResult; + bool Result = Evaluate(EvalResult, Ctx); assert(Result && "Could not evaluate expression"); - assert(V.isInt() && "Expression did not evaluate to integer"); + assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); - return V.getInt(); + return EvalResult.Val.getInt(); } diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 6c1af5f8787..86af21024b6 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1888,8 +1888,9 @@ bool Sema::CheckArithmeticConstantExpression(const Expr* Init) { // should always be able to do in theory). If so, we only require the // specified arm of the conditional to be a constant. This is a horrible // hack, but is require by real world code that uses __builtin_constant_p. - APValue Val; - if (!Exp->getCond()->Evaluate(Val, Context)) { + Expr::EvalResult EvalResult; + if (!Exp->getCond()->Evaluate(EvalResult, Context) || + EvalResult.HasSideEffects) { // If Evaluate couldn't fold it, CheckArithmeticConstantExpression // won't be able to either. Use it to emit the diagnostic though. bool Res = CheckArithmeticConstantExpression(Exp->getCond()); @@ -1899,7 +1900,7 @@ bool Sema::CheckArithmeticConstantExpression(const Expr* Init) { // Verify that the side following the condition is also a constant. const Expr *TrueSide = Exp->getLHS(), *FalseSide = Exp->getRHS(); - if (Val.getInt() == 0) + if (EvalResult.Val.getInt() == 0) std::swap(TrueSide, FalseSide); if (TrueSide && CheckArithmeticConstantExpression(TrueSide)) @@ -2717,13 +2718,13 @@ static QualType TryToFixInvalidVariablyModifiedType(QualType T, const VariableArrayType* VLATy = dyn_cast<VariableArrayType>(T); if (!VLATy) return QualType(); - APValue Result; + Expr::EvalResult EvalResult; if (!VLATy->getSizeExpr() || - !VLATy->getSizeExpr()->Evaluate(Result, Context)) + !VLATy->getSizeExpr()->Evaluate(EvalResult, Context)) return QualType(); - assert(Result.isInt() && "Size expressions must be integers!"); - llvm::APSInt &Res = Result.getInt(); + assert(EvalResult.Val.isInt() && "Size expressions must be integers!"); + llvm::APSInt &Res = EvalResult.Val.getInt(); if (Res > llvm::APSInt(Res.getBitWidth(), Res.isUnsigned())) return Context.getConstantArrayType(VLATy->getElementType(), Res, ArrayType::Normal, 0); |