Add a Expr::isEvaluatable method, eliminate isBuiltinConstantExpr
which is checking for something that can be inconsistent with
what we can constant fold.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57159 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index 45363d6..6cdaacd 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -162,12 +162,6 @@
}
-bool CallExpr::isBuiltinConstantExpr(ASTContext &Ctx) const {
- unsigned BID = isBuiltinCall();
- if (!BID) return false;
- return Ctx.BuiltinInfo.isConstantExpr(BID);
-}
-
/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
/// corresponds to, e.g. "<<=".
const char *BinaryOperator::getOpcodeStr(Opcode Op) {
@@ -519,8 +513,11 @@
return true;
case CallExprClass: {
const CallExpr *CE = cast<CallExpr>(this);
- if (CE->isBuiltinConstantExpr(Ctx))
+
+ // Allow any constant foldable calls to builtins.
+ if (CE->isBuiltinCall() && CE->isEvaluatable(Ctx))
return true;
+
if (Loc) *Loc = getLocStart();
return false;
}
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index 1506f44..af30ceb 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -693,3 +693,10 @@
return false;
}
+
+/// isEvaluatable - Call tryEvaluate to see if this expression can be constant
+/// folded, but discard the result.
+bool Expr::isEvaluatable(ASTContext &Ctx) const {
+ APValue V;
+ return tryEvaluate(V, Ctx);
+}