aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-01-09 18:59:34 +0000
committerChris Lattner <sabre@nondot.org>2008-01-09 18:59:34 +0000
commitc0a356b4fa35bf3f7d6031c229c071eef1a8f7a9 (patch)
treedeeb9f6f269d23293d38d70bb1a46dc3d41c63d2
parent19009e6fe7e0f51d2e49f4c94928a048c11c5281 (diff)
Fix isIntegerConstantExpr to compare against zero for casts to bool instead of
truncating. This allows us to compile: void foo() { static _Bool foo = 4; } into: @foo1 = internal global i8 1 instead of: @foo1 = internal global i8 4 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45779 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--AST/Expr.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/AST/Expr.cpp b/AST/Expr.cpp
index 726e4939cc..159122156f 100644
--- a/AST/Expr.cpp
+++ b/AST/Expr.cpp
@@ -846,7 +846,11 @@ bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx,
// Figure out if this is a truncate, extend or noop cast.
// If the input is signed, do a sign extend, noop, or truncate.
- if (SubExpr->getType()->isSignedIntegerType())
+ if (getType()->isBooleanType()) {
+ // Conversion to bool compares against zero.
+ Result = Result != 0;
+ Result.zextOrTrunc(DestWidth);
+ } else if (SubExpr->getType()->isSignedIntegerType())
Result.sextOrTrunc(DestWidth);
else // If the input is unsigned, do a zero extend, noop, or truncate.
Result.zextOrTrunc(DestWidth);
@@ -865,6 +869,13 @@ bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx,
if (Loc) *Loc = Operand->getLocStart();
return false;
}
+
+ // If the destination is boolean, compare against zero.
+ if (getType()->isBooleanType()) {
+ Result = !FL->getValue().isZero();
+ Result.zextOrTrunc(DestWidth);
+ break;
+ }
// Determine whether we are converting to unsigned or signed.
bool DestSigned = getType()->isSignedIntegerType();