[llvm-branch-commits] [clang] PR for llvm/llvm-project#79568 (PR #80120)
Younan Zhang via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jan 31 00:52:04 PST 2024
https://github.com/zyn0217 created https://github.com/llvm/llvm-project/pull/80120
Backporting https://github.com/llvm/llvm-project/pull/79568 to clang 18.
>From 16a8c31d342abed9c02493445c14c1bc7fd1519e Mon Sep 17 00:00:00 2001
From: Younan Zhang <zyn7109 at gmail.com>
Date: Sat, 27 Jan 2024 15:42:52 +0800
Subject: [PATCH] [Concepts] Traverse the instantiation chain for parameter
injection inside a constraint scope (#79568)
We preserve the trailing requires-expression during the lambda
expression transformation. In order to get those referenced parameters
inside a requires-expression properly resolved to the instantiated
decls, we intended to inject these 'original' `ParmVarDecls` to the
current instantiaion scope, at `Sema::SetupConstraintScope`.
The previous approach seems to overlook nested instantiation chains,
leading to the crash within a nested lambda followed by a requires
clause.
This fixes https://github.com/llvm/llvm-project/issues/73418.
---
clang/docs/ReleaseNotes.rst | 4 ++++
clang/lib/Sema/SemaConcept.cpp | 8 ++++++--
clang/test/SemaTemplate/concepts-lambda.cpp | 18 ++++++++++++++++++
3 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 060bc7669b72a..da52d5ac4d3c6 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -1054,6 +1054,10 @@ Bug Fixes to C++ Support
Fixes (`#78830 <https://github.com/llvm/llvm-project/issues/78830>`_)
Fixes (`#60085 <https://github.com/llvm/llvm-project/issues/60085>`_)
+- Fixed a bug where variables referenced by requires-clauses inside
+ nested generic lambdas were not properly injected into the constraint scope.
+ (`#73418 <https://github.com/llvm/llvm-project/issues/73418>`_)
+
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
- Fixed an import failure of recursive friend class template.
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp
index acfc00f412540..88fc846c89e42 100644
--- a/clang/lib/Sema/SemaConcept.cpp
+++ b/clang/lib/Sema/SemaConcept.cpp
@@ -612,8 +612,12 @@ bool Sema::SetupConstraintScope(
// If this is a member function, make sure we get the parameters that
// reference the original primary template.
- if (const auto *FromMemTempl =
- PrimaryTemplate->getInstantiatedFromMemberTemplate()) {
+ // We walk up the instantiated template chain so that nested lambdas get
+ // handled properly.
+ for (FunctionTemplateDecl *FromMemTempl =
+ PrimaryTemplate->getInstantiatedFromMemberTemplate();
+ FromMemTempl;
+ FromMemTempl = FromMemTempl->getInstantiatedFromMemberTemplate()) {
if (addInstantiatedParametersToScope(FD, FromMemTempl->getTemplatedDecl(),
Scope, MLTAL))
return true;
diff --git a/clang/test/SemaTemplate/concepts-lambda.cpp b/clang/test/SemaTemplate/concepts-lambda.cpp
index 7e431529427df..0b7580f91043c 100644
--- a/clang/test/SemaTemplate/concepts-lambda.cpp
+++ b/clang/test/SemaTemplate/concepts-lambda.cpp
@@ -149,3 +149,21 @@ void foo() {
auto caller = make_caller.operator()<&S1::f1>();
}
} // namespace ReturnTypeRequirementInLambda
+
+namespace GH73418 {
+void foo() {
+ int x;
+ [&x](auto) {
+ return [](auto y) {
+ return [](auto obj, auto... params)
+ requires requires {
+ sizeof...(params);
+ [](auto... pack) {
+ return sizeof...(pack);
+ }(params...);
+ }
+ { return false; }(y);
+ }(x);
+ }(x);
+}
+} // namespace GH73418
More information about the llvm-branch-commits
mailing list