From ca7c2eaca35edac066ab7cec15f7ecebbb3731d8 Mon Sep 17 00:00:00 2001
From: Nuno Lopes <nunoplopes@sapo.pt>
Date: Sun, 16 Nov 2008 19:28:31 +0000
Subject: [PATCH] make IntExprEvaluator fold the ?: operator

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59421 91177308-0d34-0410-b5e6-96231b3b80d8
---
 lib/AST/ExprConstant.cpp | 9 +++++++++
 1 file changed, 9 insertions(+)

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