forked from OSchip/llvm-project
Prevent Scoped Enums from being Integral constant expressions:
Discovered because of: https://bugs.llvm.org/show_bug.cgi?id=38235 It seems to me that a scoped enum should NOT be an integral constant expression without a cast, so this seems like a sensical change. Attributes that check for an integer parameter simply use this function to ensure that they have an integer, so it was previously allowing a scoped enum. Also added a test based on Richard's feedback to ensure that case labels still work. Differential Revision: https://reviews.llvm.org/D49599 llvm-svn: 337585
This commit is contained in:
parent
f435a7eada
commit
1ddd4bf87f
|
@ -11142,7 +11142,7 @@ static bool EvaluateCPlusPlus11IntegralConstantExpr(const ASTContext &Ctx,
|
|||
const Expr *E,
|
||||
llvm::APSInt *Value,
|
||||
SourceLocation *Loc) {
|
||||
if (!E->getType()->isIntegralOrEnumerationType()) {
|
||||
if (!E->getType()->isIntegralOrUnscopedEnumerationType()) {
|
||||
if (Loc) *Loc = E->getExprLoc();
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
enum class E { Foo, Bar = 97119 };
|
||||
|
||||
void f() __attribute__((constructor(E::Foo))); // expected-error{{'constructor' attribute requires an integer constant}}
|
||||
void f2() __attribute__((constructor(E::Bar)));// expected-error{{'constructor' attribute requires an integer constant}}
|
||||
|
||||
void switch_me(E e) {
|
||||
switch (e) {
|
||||
case E::Foo:
|
||||
case E::Bar:
|
||||
break;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue