diff options
-rw-r--r-- | clang/include/clang/AST/Type.h | 3 | ||||
-rw-r--r-- | clang/lib/AST/Type.cpp | 6 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 3 | ||||
-rw-r--r-- | clang/test/SemaCXX/PR38235.cpp | 8 |
4 files changed, 19 insertions, 1 deletions
diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index cbdbc529f73..c692707847a 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -1784,6 +1784,9 @@ public: /// isComplexIntegerType() can be used to test for complex integers. bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum) bool isEnumeralType() const; + + /// Determine whether this type is a scoped enumeration type. + bool isScopedEnumeralType() const; bool isBooleanType() const; bool isCharType() const; bool isWideCharType() const; diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index cd30bc16d05..fad8c0d1c6b 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -481,6 +481,12 @@ bool Type::isComplexIntegerType() const { return getAsComplexIntegerType(); } +bool Type::isScopedEnumeralType() const { + if (const auto *ET = getAs<EnumType>()) + return ET->getDecl()->isScoped(); + return false; +} + const ComplexType *Type::getAsComplexIntegerType() const { if (const auto *Complex = getAs<ComplexType>()) if (Complex->getElementType()->isIntegerType()) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index e91e9d3ac16..55542828f78 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -11165,6 +11165,9 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) { ; // Nothing to check. else if (Init->isIntegerConstantExpr(Context, &Loc)) ; // Ok, it's an ICE! + else if (Init->getType()->isScopedEnumeralType() && + Init->isCXX11ConstantExpr(Context)) + ; // Ok, it is a scoped-enum constant expression. else if (Init->isEvaluatable(Context)) { // If we can constant fold the initializer through heroics, accept it, // but report this as a use of an extension for -pedantic. diff --git a/clang/test/SemaCXX/PR38235.cpp b/clang/test/SemaCXX/PR38235.cpp index 11874c837bc..c3fd38ab04d 100644 --- a/clang/test/SemaCXX/PR38235.cpp +++ b/clang/test/SemaCXX/PR38235.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify -pedantic %s enum class E { Foo, Bar = 97119 }; @@ -12,3 +12,9 @@ void switch_me(E e) { break; } } + +enum class E2; + +struct S { + static const E e = E::Foo; +}; |