shafik created this revision. shafik added reviewers: erichkeane, aaron.ballman, thakis. Herald added a project: All. shafik requested review of this revision.
In D131528 <https://reviews.llvm.org/D131528> using `Info.EvalMode == EvalInfo::EM_ConstantExpression` is not strict enough to restrict the diagnostic to only constant expression contexts. It is sometimes set in cases where we are still determining if we are in a constant expression context. Using `InConstantContext` will tighten the restriction. https://reviews.llvm.org/D131704 Files: clang/lib/AST/ExprConstant.cpp clang/test/SemaCXX/constant-expression-cxx11.cpp Index: clang/test/SemaCXX/constant-expression-cxx11.cpp =================================================================== --- clang/test/SemaCXX/constant-expression-cxx11.cpp +++ clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -2455,4 +2455,18 @@ 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}} } + +enum SortOrder { + AscendingOrder, + DescendingOrder +}; + +class A { + static void f(SortOrder order); +}; + +void A::f(SortOrder order) { + if (order == SortOrder(-1)) // ok, not a constant expression context + return; +} } Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -13533,8 +13533,7 @@ return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); } - if (Info.Ctx.getLangOpts().CPlusPlus && - Info.EvalMode == EvalInfo::EM_ConstantExpression && + if (Info.Ctx.getLangOpts().CPlusPlus && Info.InConstantContext && DestType->isEnumeralType()) { const EnumType *ET = dyn_cast<EnumType>(DestType.getCanonicalType()); const EnumDecl *ED = ET->getDecl();
Index: clang/test/SemaCXX/constant-expression-cxx11.cpp =================================================================== --- clang/test/SemaCXX/constant-expression-cxx11.cpp +++ clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -2455,4 +2455,18 @@ 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}} } + +enum SortOrder { + AscendingOrder, + DescendingOrder +}; + +class A { + static void f(SortOrder order); +}; + +void A::f(SortOrder order) { + if (order == SortOrder(-1)) // ok, not a constant expression context + return; +} } Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -13533,8 +13533,7 @@ return Info.Ctx.getTypeSize(DestType) == Info.Ctx.getTypeSize(SrcType); } - if (Info.Ctx.getLangOpts().CPlusPlus && - Info.EvalMode == EvalInfo::EM_ConstantExpression && + if (Info.Ctx.getLangOpts().CPlusPlus && Info.InConstantContext && DestType->isEnumeralType()) { const EnumType *ET = dyn_cast<EnumType>(DestType.getCanonicalType()); const EnumDecl *ED = ET->getDecl();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits