This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG69d42eef4bec: [Clang] Show type in enum out of range diagnostic (authored by dim).
Changed prior to commit: https://reviews.llvm.org/D152788?vs=531013&id=531441#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D152788/new/ https://reviews.llvm.org/D152788 Files: clang/docs/ReleaseNotes.rst clang/include/clang/Basic/DiagnosticASTKinds.td clang/lib/AST/ExprConstant.cpp clang/test/SemaCXX/constant-expression-cxx11.cpp clang/test/SemaCXX/cxx2a-consteval.cpp
Index: clang/test/SemaCXX/cxx2a-consteval.cpp =================================================================== --- clang/test/SemaCXX/cxx2a-consteval.cpp +++ clang/test/SemaCXX/cxx2a-consteval.cpp @@ -900,7 +900,7 @@ namespace GH50055 { enum E {e1=0, e2=1}; consteval int testDefaultArgForParam(E eParam = (E)-1) { -// expected-error@-1 {{integer value -1 is outside the valid range of values [0, 1] for this enumeration type}} +// expected-error@-1 {{integer value -1 is outside the valid range of values [0, 1] for the enumeration type 'E'}} return (int)eParam; } Index: clang/test/SemaCXX/constant-expression-cxx11.cpp =================================================================== --- clang/test/SemaCXX/constant-expression-cxx11.cpp +++ clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -2440,42 +2440,51 @@ void testValueInRangeOfEnumerationValues() { constexpr E1 x1 = static_cast<E1>(-8); constexpr E1 x2 = static_cast<E1>(8); - // expected-error@-1 {{integer value 8 is outside the valid range of values [-8, 7] for this enumeration type}} + // expected-error@-1 {{integer value 8 is outside the valid range of values [-8, 7] for the enumeration type 'E1'}} E1 x2b = static_cast<E1>(8); // ok, not a constant expression context constexpr E2 x3 = static_cast<E2>(-8); - // expected-error@-1 {{integer value -8 is outside the valid range of values [0, 7] for this enumeration type}} + // expected-error@-1 {{integer value -8 is outside the valid range of values [0, 7] for the enumeration type 'E2'}} constexpr E2 x4 = static_cast<E2>(0); constexpr E2 x5 = static_cast<E2>(8); - // expected-error@-1 {{integer value 8 is outside the valid range of values [0, 7] for this enumeration type}} + // expected-error@-1 {{integer value 8 is outside the valid range of values [0, 7] for the enumeration type 'E2'}} constexpr E3 x6 = static_cast<E3>(-2048); constexpr E3 x7 = static_cast<E3>(-8); constexpr E3 x8 = static_cast<E3>(0); constexpr E3 x9 = static_cast<E3>(8); constexpr E3 x10 = static_cast<E3>(2048); - // expected-error@-1 {{integer value 2048 is outside the valid range of values [-2048, 2047] for this enumeration type}} + // expected-error@-1 {{integer value 2048 is outside the valid range of values [-2048, 2047] for the enumeration type 'E3'}} constexpr E4 x11 = static_cast<E4>(0); constexpr E4 x12 = static_cast<E4>(1); constexpr E4 x13 = static_cast<E4>(2); - // expected-error@-1 {{integer value 2 is outside the valid range of values [0, 1] for this enumeration type}} + // expected-error@-1 {{integer value 2 is outside the valid range of values [0, 1] for the enumeration type 'E4'}} constexpr EEmpty x14 = static_cast<EEmpty>(0); constexpr EEmpty x15 = static_cast<EEmpty>(1); constexpr EEmpty x16 = static_cast<EEmpty>(2); - // expected-error@-1 {{integer value 2 is outside the valid range of values [0, 1] for this enumeration type}} + // expected-error@-1 {{integer value 2 is outside the valid range of values [0, 1] for the enumeration type 'EEmpty'}} constexpr EFixed x17 = static_cast<EFixed>(100); constexpr EScoped x18 = static_cast<EScoped>(100); constexpr EMaxInt x19 = static_cast<EMaxInt>(__INT_MAX__-1); constexpr EMaxInt x20 = static_cast<EMaxInt>((long)__INT_MAX__+1); - // expected-error@-1 {{integer value 2147483648 is outside the valid range of values [-2147483648, 2147483647] for this enumeration type}} + // expected-error@-1 {{integer value 2147483648 is outside the valid range of values [-2147483648, 2147483647] for the enumeration type 'EMaxInt'}} const NumberType neg_one = (NumberType) ((NumberType) 0 - (NumberType) 1); // ok, not a constant expression context } +template<class T, unsigned size> struct Bitfield { + static constexpr T max = static_cast<T>((1 << size) - 1); // #enum +}; + +void testValueInRangeOfEnumerationValuesViaTemplate() { + Bitfield<E2, 3> good; + Bitfield<E2, 4> bad; // cxx11-error@#enum {{integer value 15 is outside the valid range of values [0, 7] for the enumeration type 'E2'}} +} + enum SortOrder { AscendingOrder, DescendingOrder @@ -2494,4 +2503,4 @@ GH50055::E2 GlobalInitNotCE1 = (GH50055::E2)-1; // ok, not a constant expression context GH50055::E2 GlobalInitNotCE2 = GH50055::testDefaultArgForParam(); // ok, not a constant expression context constexpr GH50055::E2 GlobalInitCE = (GH50055::E2)-1; -// expected-error@-1 {{integer value -1 is outside the valid range of values [0, 7] for this enumeration type}} +// expected-error@-1 {{integer value -1 is outside the valid range of values [0, 7] for the enumeration type 'E2'}} Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -13708,12 +13708,13 @@ Info.Ctx.getDiagnostics().Report( E->getExprLoc(), diag::warn_constexpr_unscoped_enum_out_of_range) << llvm::toString(Result.getInt(), 10) << Min.getSExtValue() - << Max.getSExtValue(); + << Max.getSExtValue() << ED; else if (!ED->getNumNegativeBits() && ConstexprVar && Max.ult(Result.getInt().getZExtValue())) - Info.Ctx.getDiagnostics().Report(E->getExprLoc(), - diag::warn_constexpr_unscoped_enum_out_of_range) - << llvm::toString(Result.getInt(),10) << Min.getZExtValue() << Max.getZExtValue(); + Info.Ctx.getDiagnostics().Report( + E->getExprLoc(), diag::warn_constexpr_unscoped_enum_out_of_range) + << llvm::toString(Result.getInt(), 10) << Min.getZExtValue() + << Max.getZExtValue() << ED; } } Index: clang/include/clang/Basic/DiagnosticASTKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticASTKinds.td +++ clang/include/clang/Basic/DiagnosticASTKinds.td @@ -395,8 +395,8 @@ "overflow in expression; result is %0 with type %1">, InGroup<DiagGroup<"fixed-point-overflow">>; def warn_constexpr_unscoped_enum_out_of_range : Warning< - "integer value %0 is outside the valid range of values [%1, %2] for this " - "enumeration type">, DefaultError, InGroup<DiagGroup<"enum-constexpr-conversion">>; + "integer value %0 is outside the valid range of values [%1, %2] for the " + "enumeration type %3">, DefaultError, InGroup<DiagGroup<"enum-constexpr-conversion">>; // This is a temporary diagnostic, and shall be removed once our // implementation is complete, and like the preceding constexpr notes belongs Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -344,6 +344,9 @@ (`#42992: <https://github.com/llvm/llvm-project/issues/42992>`_) - Clang now diagnoses unused const-qualified variable template as "unused variable template" rather than "unused variable". +- When diagnosing a constant expression where an enum without a fixed underlying + type is set to a value outside the range of the enum's values, clang will now + print the name of the enum in question. Bug Fixes in This Version -------------------------
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits