Izaron created this revision. Izaron added reviewers: aaron.ballman, cor3ntin. Izaron requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Value-dependent ConstantExprs are not meant to be evaluated. There is an assert in Expr::EvaluateAsConstantExpr that ensures this condition. But before this patch the method was called without prior check. Fixes https://github.com/llvm/llvm-project/issues/52768 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D119375 Files: clang/lib/Sema/SemaExpr.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 @@ -613,6 +613,26 @@ } // namespace unevaluated +namespace value_dependent { + +consteval int foo(int x) { + return x; +} + +template <int X> constexpr int bar() { + return foo(X); +} + +template <typename T> constexpr int baz() { + constexpr int t = sizeof(T); + return foo(t); +} + +static_assert(bar<15>() == 15); +static_assert(baz<int>() == sizeof(int)); + +} // namespace value_dependent + namespace PR50779 { struct derp { int b = 0; Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -16728,7 +16728,10 @@ ConstantExpr::getStorageKind(Decl->getReturnType().getTypePtr(), getASTContext()), /*IsImmediateInvocation*/ true); - ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0); + /// Value-dependent constant expression are not meant to be calculated. + /// Each template instantiation will calculate its own value later. + if (!Res->isValueDependent()) + ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0); return Res; }
Index: clang/test/SemaCXX/cxx2a-consteval.cpp =================================================================== --- clang/test/SemaCXX/cxx2a-consteval.cpp +++ clang/test/SemaCXX/cxx2a-consteval.cpp @@ -613,6 +613,26 @@ } // namespace unevaluated +namespace value_dependent { + +consteval int foo(int x) { + return x; +} + +template <int X> constexpr int bar() { + return foo(X); +} + +template <typename T> constexpr int baz() { + constexpr int t = sizeof(T); + return foo(t); +} + +static_assert(bar<15>() == 15); +static_assert(baz<int>() == sizeof(int)); + +} // namespace value_dependent + namespace PR50779 { struct derp { int b = 0; Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -16728,7 +16728,10 @@ ConstantExpr::getStorageKind(Decl->getReturnType().getTypePtr(), getASTContext()), /*IsImmediateInvocation*/ true); - ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0); + /// Value-dependent constant expression are not meant to be calculated. + /// Each template instantiation will calculate its own value later. + if (!Res->isValueDependent()) + ExprEvalContexts.back().ImmediateInvocationCandidates.emplace_back(Res, 0); return Res; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits