diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2008-11-16 19:28:31 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2008-11-16 19:28:31 +0000 |
commit | ca7c2eaca35edac066ab7cec15f7ecebbb3731d8 (patch) | |
tree | 4cd76883fb39424f3f93116fd1994bf6a166b33a /lib/AST/ExprConstant.cpp | |
parent | 3068d117951a8df54bae9db039b56201ab10962b (diff) |
make IntExprEvaluator fold the ?: operator
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59421 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ExprConstant.cpp')
-rw-r--r-- | lib/AST/ExprConstant.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 4a67956749..bedc78c0c0 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -397,6 +397,7 @@ public: bool VisitCallExpr(const CallExpr *E); bool VisitBinaryOperator(const BinaryOperator *E); bool VisitUnaryOperator(const UnaryOperator *E); + bool VisitConditionalOperator(const ConditionalOperator *E); bool VisitCastExpr(CastExpr* E) { return HandleCast(E->getLocStart(), E->getSubExpr(), E->getType()); @@ -725,6 +726,14 @@ bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { return true; } +bool IntExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E) { + llvm::APSInt Cond(32); + if (!EvaluateInteger(E->getCond(), Cond, Info)) + return false; + + return Visit(Cond != 0 ? E->getTrueExpr() : E->getFalseExpr()); +} + /// VisitSizeAlignOfExpr - Evaluate a sizeof or alignof with a result as the /// expression's type. bool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) { |