forked from OSchip/llvm-project
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 llvm-svn: 45779
This commit is contained in:
parent
41a1ef0dfe
commit
119d81a4f4
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue