mirror of
https://github.com/intel/llvm.git
synced 2026-01-21 04:14:03 +08:00
[clang][Interp] Visit Logical-not operand as bool
Differential Revision: https://reviews.llvm.org/D157200
This commit is contained in:
@@ -2378,10 +2378,18 @@ bool ByteCodeExprGen<Emitter>::VisitUnaryOperator(const UnaryOperator *E) {
|
||||
return this->emitStore(*T, E);
|
||||
}
|
||||
case UO_LNot: // !x
|
||||
if (!this->visit(SubExpr))
|
||||
if (DiscardResult)
|
||||
return this->discard(SubExpr);
|
||||
|
||||
if (!this->visitBool(SubExpr))
|
||||
return false;
|
||||
// The Inv doesn't change anything, so skip it if we don't need the result.
|
||||
return DiscardResult ? this->emitPop(*T, E) : this->emitInvBool(E);
|
||||
|
||||
if (!this->emitInvBool(E))
|
||||
return false;
|
||||
|
||||
if (PrimType ET = classifyPrim(E->getType()); ET != PT_Bool)
|
||||
return this->emitCast(PT_Bool, ET, E);
|
||||
return true;
|
||||
case UO_Minus: // -x
|
||||
if (!this->visit(SubExpr))
|
||||
return false;
|
||||
|
||||
@@ -12,6 +12,9 @@ _Static_assert(1.0 == 1.0, ""); // pedantic-ref-warning {{not an integer constan
|
||||
_Static_assert(1 && 1.0, ""); // pedantic-ref-warning {{not an integer constant expression}} \
|
||||
// pedantic-expected-warning {{not an integer constant expression}}
|
||||
_Static_assert( (5 > 4) + (3 > 2) == 2, "");
|
||||
_Static_assert(!!1.0, ""); // pedantic-ref-warning {{not an integer constant expression}} \
|
||||
// pedantic-expected-warning {{not an integer constant expression}}
|
||||
_Static_assert(!!1, "");
|
||||
|
||||
/// FIXME: Should also be rejected in the new interpreter
|
||||
int a = (1 == 1 ? 5 : 3);
|
||||
|
||||
Reference in New Issue
Block a user