PR11040: CheckICE should not allow an lvalue bitcast as part of an integer constant expression.
llvm-svn: 140812
This commit is contained in:
parent
a9b68f4dd6
commit
76d4e43063
|
@ -3089,11 +3089,17 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) {
|
|||
case Expr::CXXConstCastExprClass:
|
||||
case Expr::ObjCBridgedCastExprClass: {
|
||||
const Expr *SubExpr = cast<CastExpr>(E)->getSubExpr();
|
||||
if (SubExpr->getType()->isIntegralOrEnumerationType())
|
||||
switch (cast<CastExpr>(E)->getCastKind()) {
|
||||
case CK_LValueToRValue:
|
||||
case CK_NoOp:
|
||||
case CK_IntegralToBoolean:
|
||||
case CK_IntegralCast:
|
||||
return CheckICE(SubExpr, Ctx);
|
||||
if (isa<FloatingLiteral>(SubExpr->IgnoreParens()))
|
||||
return NoDiag();
|
||||
return ICEDiag(2, E->getLocStart());
|
||||
default:
|
||||
if (isa<FloatingLiteral>(SubExpr->IgnoreParens()))
|
||||
return NoDiag();
|
||||
return ICEDiag(2, E->getLocStart());
|
||||
}
|
||||
}
|
||||
case Expr::BinaryConditionalOperatorClass: {
|
||||
const BinaryConditionalOperator *Exp = cast<BinaryConditionalOperator>(E);
|
||||
|
|
|
@ -54,4 +54,6 @@ struct A {
|
|||
int foo() { return A::B; }
|
||||
}
|
||||
|
||||
|
||||
// PR11040
|
||||
const int x = 10;
|
||||
int* y = reinterpret_cast<const char&>(x); // expected-error {{cannot initialize}}
|
||||
|
|
Loading…
Reference in New Issue