diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index 4a679567498be1a30b096b8140df12d67e22c580..bedc78c0c05d52895e709c53b9ae7a4a5a2d9adb 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) {