[clang] [clang] Correctly implement CWG 2672 (PR #75001)
https://github.com/zyn0217 closed https://github.com/llvm/llvm-project/pull/75001 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Correctly implement CWG 2672 (PR #75001)
zyn0217 wrote: Thank you folks! https://github.com/llvm/llvm-project/pull/75001 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Correctly implement CWG 2672 (PR #75001)
https://github.com/zyn0217 updated https://github.com/llvm/llvm-project/pull/75001 >From 8681b3c9f5e19b6ae977321d5d4154113273c2a0 Mon Sep 17 00:00:00 2001 From: Younan Zhang Date: Sun, 12 Nov 2023 13:21:03 +0800 Subject: [PATCH 1/2] [clang] Correctly implement CWG 2672 This is a follow-up patch for [D156993](https://reviews.llvm.org/D156993), that marks only the lambda body as non-immediate context. Fixes https://github.com/llvm/llvm-project/issues/71684 --- clang/lib/Sema/SemaTemplateInstantiate.cpp| 11 +--- clang/lib/Sema/TreeTransform.h| 7 + clang/test/CXX/drs/dr26xx.cpp | 2 +- .../expr.prim.lambda/default-arguments.cpp| 6 ++-- .../expr.prim/expr.prim.lambda/p11-1y.cpp | 2 -- .../expr/expr.prim/expr.prim.lambda/p23.cpp | 1 - .../expr/expr.prim/expr.prim.lambda/p4.cpp| 3 +- clang/test/CXX/temp/temp.deduct/p9.cpp| 8 ++ clang/test/SemaCXX/cxx1y-init-captures.cpp| 8 +++--- clang/test/SemaCXX/cxx1z-lambda-star-this.cpp | 4 +-- clang/test/SemaCXX/lambda-expressions.cpp | 4 +-- clang/test/SemaCXX/lambda-pack-expansion.cpp | 1 - clang/test/SemaCXX/vartemplate-lambda.cpp | 1 - .../SemaCXX/warn-unused-lambda-capture.cpp| 28 +-- .../SemaTemplate/instantiate-local-class.cpp | 4 +-- 15 files changed, 37 insertions(+), 53 deletions(-) diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index df6b40999e645c..88bd44f7d6934d 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -35,7 +35,6 @@ #include "clang/Sema/Template.h" #include "clang/Sema/TemplateDeduction.h" #include "clang/Sema/TemplateInstCallback.h" -#include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/TimeProfiler.h" @@ -1142,8 +1141,7 @@ std::optional Sema::isSFINAEContext() const { case CodeSynthesisContext::DeducedTemplateArgumentSubstitution: // We're either substituting explicitly-specified template arguments, // deduced template arguments. SFINAE applies unless we are in a lambda - // expression, see [temp.deduct]p9. - [[fallthrough]]; + // body, see [temp.deduct]p9. case CodeSynthesisContext::ConstraintSubstitution: case CodeSynthesisContext::RequirementInstantiation: case CodeSynthesisContext::RequirementParameterInstantiation: @@ -1444,13 +1442,6 @@ namespace { LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true); Sema::ConstraintEvalRAII RAII(*this); - Sema::CodeSynthesisContext C; - C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution; - C.PointOfInstantiation = E->getBeginLoc(); - SemaRef.pushCodeSynthesisContext(C); - auto PopCtx = - llvm::make_scope_exit([this] { SemaRef.popCodeSynthesisContext(); }); - ExprResult Result = inherited::TransformLambdaExpr(E); if (Result.isInvalid()) return Result; diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 1ad843d0bf4e0c..55e5c3c9dedc56 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13648,10 +13648,17 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { getSema().PushExpressionEvaluationContext( Sema::ExpressionEvaluationContext::PotentiallyEvaluated); + Sema::CodeSynthesisContext C; + C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution; + C.PointOfInstantiation = E->getBody()->getBeginLoc(); + getSema().pushCodeSynthesisContext(C); + // Instantiate the body of the lambda expression. StmtResult Body = Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); + getSema().popCodeSynthesisContext(); + // ActOnLambda* will pop the function scope for us. FuncScopeCleanup.disable(); diff --git a/clang/test/CXX/drs/dr26xx.cpp b/clang/test/CXX/drs/dr26xx.cpp index dd4bb1ff6ae2e1..8a22dbeb98a3d5 100644 --- a/clang/test/CXX/drs/dr26xx.cpp +++ b/clang/test/CXX/drs/dr26xx.cpp @@ -211,7 +211,7 @@ void f(...); template void bar(T) requires requires { - decltype([]() -> T {})::foo(); + []() -> decltype(T::foo()) {}; }; void bar(...); diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp index c5d08ec404a7c3..72265d77700aaf 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp @@ -35,8 +35,7 @@ struct NoDefaultCtor { template void defargs_in_template_unused(T t) { auto l1 = [](const T& value = T()) { }; // expected-error{{no matching constructor for initialization of 'NoDefaultCtor'}} \ - // expected-note {{in instantiation of
[clang] [clang] Correctly implement CWG 2672 (PR #75001)
https://github.com/cor3ntin approved this pull request. https://github.com/llvm/llvm-project/pull/75001 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Correctly implement CWG 2672 (PR #75001)
cor3ntin wrote: @zyn0217 I think the existing release note could mention #71684. LGTM otherwise https://github.com/llvm/llvm-project/pull/75001 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Correctly implement CWG 2672 (PR #75001)
Endilll wrote: DR test changes look good to me, but wait for another reviewer. https://github.com/llvm/llvm-project/pull/75001 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Correctly implement CWG 2672 (PR #75001)
zyn0217 wrote: friendly ping~ https://github.com/llvm/llvm-project/pull/75001 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Correctly implement CWG 2672 (PR #75001)
zyn0217 wrote: Note I'm not adding an extra release note since the previous implementation has done that and hasn't been cherry-picked or released yet. https://github.com/llvm/llvm-project/pull/75001 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [clang] Correctly implement CWG 2672 (PR #75001)
llvmbot wrote: @llvm/pr-subscribers-clang Author: Younan Zhang (zyn0217) Changes This is a follow-up patch for [D156993](https://reviews.llvm.org/D156993), that marks only the lambda body as non-immediate context. Fixes https://github.com/llvm/llvm-project/issues/71684 --- Patch is 20.37 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/75001.diff 15 Files Affected: - (modified) clang/lib/Sema/SemaTemplateInstantiate.cpp (+1-10) - (modified) clang/lib/Sema/TreeTransform.h (+7) - (modified) clang/test/CXX/drs/dr26xx.cpp (+1-1) - (modified) clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp (+2-4) - (modified) clang/test/CXX/expr/expr.prim/expr.prim.lambda/p11-1y.cpp (-2) - (modified) clang/test/CXX/expr/expr.prim/expr.prim.lambda/p23.cpp (-1) - (modified) clang/test/CXX/expr/expr.prim/expr.prim.lambda/p4.cpp (+1-2) - (modified) clang/test/CXX/temp/temp.deduct/p9.cpp (+2-6) - (modified) clang/test/SemaCXX/cxx1y-init-captures.cpp (+4-4) - (modified) clang/test/SemaCXX/cxx1z-lambda-star-this.cpp (+2-2) - (modified) clang/test/SemaCXX/lambda-expressions.cpp (+2-2) - (modified) clang/test/SemaCXX/lambda-pack-expansion.cpp (-1) - (modified) clang/test/SemaCXX/vartemplate-lambda.cpp (-1) - (modified) clang/test/SemaCXX/warn-unused-lambda-capture.cpp (+14-14) - (modified) clang/test/SemaTemplate/instantiate-local-class.cpp (+1-3) ``diff diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index df6b40999e645c..88bd44f7d6934d 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -35,7 +35,6 @@ #include "clang/Sema/Template.h" #include "clang/Sema/TemplateDeduction.h" #include "clang/Sema/TemplateInstCallback.h" -#include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/TimeProfiler.h" @@ -1142,8 +1141,7 @@ std::optional Sema::isSFINAEContext() const { case CodeSynthesisContext::DeducedTemplateArgumentSubstitution: // We're either substituting explicitly-specified template arguments, // deduced template arguments. SFINAE applies unless we are in a lambda - // expression, see [temp.deduct]p9. - [[fallthrough]]; + // body, see [temp.deduct]p9. case CodeSynthesisContext::ConstraintSubstitution: case CodeSynthesisContext::RequirementInstantiation: case CodeSynthesisContext::RequirementParameterInstantiation: @@ -1444,13 +1442,6 @@ namespace { LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true); Sema::ConstraintEvalRAII RAII(*this); - Sema::CodeSynthesisContext C; - C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution; - C.PointOfInstantiation = E->getBeginLoc(); - SemaRef.pushCodeSynthesisContext(C); - auto PopCtx = - llvm::make_scope_exit([this] { SemaRef.popCodeSynthesisContext(); }); - ExprResult Result = inherited::TransformLambdaExpr(E); if (Result.isInvalid()) return Result; diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 1ad843d0bf4e0c..55e5c3c9dedc56 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13648,10 +13648,17 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { getSema().PushExpressionEvaluationContext( Sema::ExpressionEvaluationContext::PotentiallyEvaluated); + Sema::CodeSynthesisContext C; + C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution; + C.PointOfInstantiation = E->getBody()->getBeginLoc(); + getSema().pushCodeSynthesisContext(C); + // Instantiate the body of the lambda expression. StmtResult Body = Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); + getSema().popCodeSynthesisContext(); + // ActOnLambda* will pop the function scope for us. FuncScopeCleanup.disable(); diff --git a/clang/test/CXX/drs/dr26xx.cpp b/clang/test/CXX/drs/dr26xx.cpp index dd4bb1ff6ae2e1..8a22dbeb98a3d5 100644 --- a/clang/test/CXX/drs/dr26xx.cpp +++ b/clang/test/CXX/drs/dr26xx.cpp @@ -211,7 +211,7 @@ void f(...); template void bar(T) requires requires { - decltype([]() -> T {})::foo(); + []() -> decltype(T::foo()) {}; }; void bar(...); diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp index c5d08ec404a7c3..72265d77700aaf 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp @@ -35,8 +35,7 @@ struct NoDefaultCtor { template void defargs_in_template_unused(T t) { auto l1 = [](const T& value = T()) { }; // expected-error{{no matching constructor for initialization of 'NoDefaultCtor'}} \ -
[clang] [clang] Correctly implement CWG 2672 (PR #75001)
https://github.com/zyn0217 created https://github.com/llvm/llvm-project/pull/75001 This is a follow-up patch for [D156993](https://reviews.llvm.org/D156993), that marks only the lambda body as non-immediate context. Fixes https://github.com/llvm/llvm-project/issues/71684 >From 8681b3c9f5e19b6ae977321d5d4154113273c2a0 Mon Sep 17 00:00:00 2001 From: Younan Zhang Date: Sun, 12 Nov 2023 13:21:03 +0800 Subject: [PATCH] [clang] Correctly implement CWG 2672 This is a follow-up patch for [D156993](https://reviews.llvm.org/D156993), that marks only the lambda body as non-immediate context. Fixes https://github.com/llvm/llvm-project/issues/71684 --- clang/lib/Sema/SemaTemplateInstantiate.cpp| 11 +--- clang/lib/Sema/TreeTransform.h| 7 + clang/test/CXX/drs/dr26xx.cpp | 2 +- .../expr.prim.lambda/default-arguments.cpp| 6 ++-- .../expr.prim/expr.prim.lambda/p11-1y.cpp | 2 -- .../expr/expr.prim/expr.prim.lambda/p23.cpp | 1 - .../expr/expr.prim/expr.prim.lambda/p4.cpp| 3 +- clang/test/CXX/temp/temp.deduct/p9.cpp| 8 ++ clang/test/SemaCXX/cxx1y-init-captures.cpp| 8 +++--- clang/test/SemaCXX/cxx1z-lambda-star-this.cpp | 4 +-- clang/test/SemaCXX/lambda-expressions.cpp | 4 +-- clang/test/SemaCXX/lambda-pack-expansion.cpp | 1 - clang/test/SemaCXX/vartemplate-lambda.cpp | 1 - .../SemaCXX/warn-unused-lambda-capture.cpp| 28 +-- .../SemaTemplate/instantiate-local-class.cpp | 4 +-- 15 files changed, 37 insertions(+), 53 deletions(-) diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index df6b40999e645c..88bd44f7d6934d 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -35,7 +35,6 @@ #include "clang/Sema/Template.h" #include "clang/Sema/TemplateDeduction.h" #include "clang/Sema/TemplateInstCallback.h" -#include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/TimeProfiler.h" @@ -1142,8 +1141,7 @@ std::optional Sema::isSFINAEContext() const { case CodeSynthesisContext::DeducedTemplateArgumentSubstitution: // We're either substituting explicitly-specified template arguments, // deduced template arguments. SFINAE applies unless we are in a lambda - // expression, see [temp.deduct]p9. - [[fallthrough]]; + // body, see [temp.deduct]p9. case CodeSynthesisContext::ConstraintSubstitution: case CodeSynthesisContext::RequirementInstantiation: case CodeSynthesisContext::RequirementParameterInstantiation: @@ -1444,13 +1442,6 @@ namespace { LocalInstantiationScope Scope(SemaRef, /*CombineWithOuterScope=*/true); Sema::ConstraintEvalRAII RAII(*this); - Sema::CodeSynthesisContext C; - C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution; - C.PointOfInstantiation = E->getBeginLoc(); - SemaRef.pushCodeSynthesisContext(C); - auto PopCtx = - llvm::make_scope_exit([this] { SemaRef.popCodeSynthesisContext(); }); - ExprResult Result = inherited::TransformLambdaExpr(E); if (Result.isInvalid()) return Result; diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 1ad843d0bf4e0c..55e5c3c9dedc56 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -13648,10 +13648,17 @@ TreeTransform::TransformLambdaExpr(LambdaExpr *E) { getSema().PushExpressionEvaluationContext( Sema::ExpressionEvaluationContext::PotentiallyEvaluated); + Sema::CodeSynthesisContext C; + C.Kind = clang::Sema::CodeSynthesisContext::LambdaExpressionSubstitution; + C.PointOfInstantiation = E->getBody()->getBeginLoc(); + getSema().pushCodeSynthesisContext(C); + // Instantiate the body of the lambda expression. StmtResult Body = Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); + getSema().popCodeSynthesisContext(); + // ActOnLambda* will pop the function scope for us. FuncScopeCleanup.disable(); diff --git a/clang/test/CXX/drs/dr26xx.cpp b/clang/test/CXX/drs/dr26xx.cpp index dd4bb1ff6ae2e1..8a22dbeb98a3d5 100644 --- a/clang/test/CXX/drs/dr26xx.cpp +++ b/clang/test/CXX/drs/dr26xx.cpp @@ -211,7 +211,7 @@ void f(...); template void bar(T) requires requires { - decltype([]() -> T {})::foo(); + []() -> decltype(T::foo()) {}; }; void bar(...); diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp index c5d08ec404a7c3..72265d77700aaf 100644 --- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp +++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/default-arguments.cpp @@ -35,8 +35,7 @@ struct NoDefaultCtor { template void defargs_in_template_unused(T t) { auto l1 = [](const T&