Izaron updated this revision to Diff 408220. Izaron added a comment. (Fast test comment 80 character line fix)
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D119651/new/ https://reviews.llvm.org/D119651 Files: clang/lib/Sema/SemaTemplateInstantiateDecl.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,24 @@ } // namespace unevaluated +namespace templated { + +consteval int f(int v) { + return v; +} + +template <typename T> +consteval int g(T a) { + // Previously this call was rejected due to incorrect evaluation context + // type in instantiations. Now we show that this call is OK. + int n = f(a); + return n; +} + +static_assert(g(100) == 100); + +} // namespace templated + namespace PR50779 { struct derp { int b = 0; Index: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -5326,8 +5326,13 @@ Var->setImplicitlyInline(); if (OldVar->getInit()) { - EnterExpressionEvaluationContext Evaluated( - *this, Sema::ExpressionEvaluationContext::PotentiallyEvaluated, Var); + ExpressionEvaluationContext Context = + ExpressionEvaluationContext::PotentiallyEvaluated; + // If current context is constant evaluated, the variable initializer + // context is also constant evaluated + if (isConstantEvaluated()) + Context = ExpressionEvaluationContext::ConstantEvaluated; + EnterExpressionEvaluationContext Evaluated(*this, Context, Var); // Instantiate the initializer. ExprResult Init;
Index: clang/test/SemaCXX/cxx2a-consteval.cpp =================================================================== --- clang/test/SemaCXX/cxx2a-consteval.cpp +++ clang/test/SemaCXX/cxx2a-consteval.cpp @@ -613,6 +613,24 @@ } // namespace unevaluated +namespace templated { + +consteval int f(int v) { + return v; +} + +template <typename T> +consteval int g(T a) { + // Previously this call was rejected due to incorrect evaluation context + // type in instantiations. Now we show that this call is OK. + int n = f(a); + return n; +} + +static_assert(g(100) == 100); + +} // namespace templated + namespace PR50779 { struct derp { int b = 0; Index: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -5326,8 +5326,13 @@ Var->setImplicitlyInline(); if (OldVar->getInit()) { - EnterExpressionEvaluationContext Evaluated( - *this, Sema::ExpressionEvaluationContext::PotentiallyEvaluated, Var); + ExpressionEvaluationContext Context = + ExpressionEvaluationContext::PotentiallyEvaluated; + // If current context is constant evaluated, the variable initializer + // context is also constant evaluated + if (isConstantEvaluated()) + Context = ExpressionEvaluationContext::ConstantEvaluated; + EnterExpressionEvaluationContext Evaluated(*this, Context, Var); // Instantiate the initializer. ExprResult Init;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits