Add a new ChooseExpr::isConditionTrue method to unify
some code.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43322 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/AST/Expr.cpp b/AST/Expr.cpp
index d6960d3..0c631df 100644
--- a/AST/Expr.cpp
+++ b/AST/Expr.cpp
@@ -894,6 +894,14 @@
RBracloc = RBrac;
}
+
+bool ChooseExpr::isConditionTrue(ASTContext &C) const {
+ llvm::APSInt CondVal(32);
+ bool IsConst = getCond()->isIntegerConstantExpr(CondVal, C);
+ assert(IsConst && "Condition of choose expr must be i-c-e"); IsConst=IsConst;
+ return CondVal != 0;
+}
+
//===----------------------------------------------------------------------===//
// Child Iterators for iterating over subexpressions/substatements
//===----------------------------------------------------------------------===//
diff --git a/CodeGen/CGExprComplex.cpp b/CodeGen/CGExprComplex.cpp
index f27519c..aa66bb6 100644
--- a/CodeGen/CGExprComplex.cpp
+++ b/CodeGen/CGExprComplex.cpp
@@ -499,12 +499,8 @@
}
ComplexPairTy ComplexExprEmitter::VisitChooseExpr(ChooseExpr *E) {
- llvm::APSInt CondVal(32);
- bool IsConst = E->getCond()->isIntegerConstantExpr(CondVal, CGF.getContext());
- assert(IsConst && "Condition of choose expr must be i-c-e"); IsConst=IsConst;
-
// Emit the LHS or RHS as appropriate.
- return Visit(CondVal != 0 ? E->getLHS() : E->getRHS());
+ return Visit(E->isConditionTrue(CGF.getContext()) ? E->getLHS() :E->getRHS());
}
//===----------------------------------------------------------------------===//
diff --git a/CodeGen/CGExprScalar.cpp b/CodeGen/CGExprScalar.cpp
index 4b45980..0d86ccc 100644
--- a/CodeGen/CGExprScalar.cpp
+++ b/CodeGen/CGExprScalar.cpp
@@ -903,12 +903,8 @@
}
Value *ScalarExprEmitter::VisitChooseExpr(ChooseExpr *E) {
- llvm::APSInt CondVal(32);
- bool IsConst = E->getCond()->isIntegerConstantExpr(CondVal, CGF.getContext());
- assert(IsConst && "Condition of choose expr must be i-c-e"); IsConst=IsConst;
-
// Emit the LHS or RHS as appropriate.
- return Visit(CondVal != 0 ? E->getLHS() : E->getRHS());
+ return Visit(E->isConditionTrue(CGF.getContext()) ? E->getLHS() : E->getRHS());
}
Value *ScalarExprEmitter::VisitVAArgExpr(VAArgExpr *VE)
diff --git a/clang.xcodeproj/project.pbxproj b/clang.xcodeproj/project.pbxproj
index b086e54..f2f7945 100644
--- a/clang.xcodeproj/project.pbxproj
+++ b/clang.xcodeproj/project.pbxproj
@@ -750,7 +750,6 @@
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */;
- compatibilityVersion = "Xcode 2.4";
hasScannedForEncodings = 1;
mainGroup = 08FB7794FE84155DC02AAC07 /* clang */;
projectDirPath = "";
diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h
index b43d8a4..819996b 100644
--- a/include/clang/AST/Expr.h
+++ b/include/clang/AST/Expr.h
@@ -961,6 +961,10 @@
SubExprs[RHS] = rhs;
}
+ /// isConditionTrue - Return true if the condition is true. This is always
+ /// statically knowable for a well-formed choosexpr.
+ bool isConditionTrue(ASTContext &C) const;
+
Expr *getCond() const { return SubExprs[COND]; }
Expr *getLHS() const { return SubExprs[LHS]; }
Expr *getRHS() const { return SubExprs[RHS]; }