[llvm-branch-commits] [clang] release/23.x: [Clang] Ensure correct template parameter depth for abbreviated templates (#209693) (PR #209712)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jul 15 02:51:51 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: llvmbot
<details>
<summary>Changes</summary>
Backport 3485d8591992
Requested by: @<!-- -->zyn0217
---
Full diff: https://github.com/llvm/llvm-project/pull/209712.diff
2 Files Affected:
- (modified) clang/lib/Parse/ParseDeclCXX.cpp (+6)
- (modified) clang/test/SemaCXX/constexpr-late-instantiation.cpp (+32-2)
``````````diff
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index 893989bd2398f..d7a9c72eb2da8 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -2534,6 +2534,12 @@ bool Parser::ParseCXXMemberDeclaratorBeforeInitializer(
if (BitfieldSize.isInvalid())
SkipUntil(tok::comma, StopAtSemi | StopBeforeMatch);
} else if (Tok.is(tok::kw_requires)) {
+ TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
+ // With abbreviated function templates - we need to explicitly add depth to
+ // account for the implicit template parameter list induced by the template.
+ if (DeclaratorInfo.getTemplateParameterLists().empty() &&
+ DeclaratorInfo.getInventedTemplateParameterList())
+ ++CurTemplateDepthTracker;
ParseTrailingRequiresClauseWithScope(DeclaratorInfo);
} else {
ParseOptionalCXX11VirtSpecifierSeq(
diff --git a/clang/test/SemaCXX/constexpr-late-instantiation.cpp b/clang/test/SemaCXX/constexpr-late-instantiation.cpp
index 9aec0c90e61dc..94f5ab4a73616 100644
--- a/clang/test/SemaCXX/constexpr-late-instantiation.cpp
+++ b/clang/test/SemaCXX/constexpr-late-instantiation.cpp
@@ -1,5 +1,10 @@
-// RUN: %clang_cc1 %s -fsyntax-only -verify
-// RUN: %clang_cc1 %s -fexperimental-new-constant-interpreter -fsyntax-only -verify
+// RUN: %clang_cc1 %s -std=c++14 -fsyntax-only -verify
+// RUN: %clang_cc1 %s -std=c++20 -fsyntax-only -verify
+// RUN: %clang_cc1 %s -std=c++2c -fsyntax-only -verify
+
+// RUN: %clang_cc1 %s -std=c++14 -fsyntax-only -fexperimental-new-constant-interpreter -verify
+// RUN: %clang_cc1 %s -std=c++20 -fsyntax-only -fexperimental-new-constant-interpreter -verify
+// RUN: %clang_cc1 %s -std=c++2c -fsyntax-only -fexperimental-new-constant-interpreter -verify
template <typename T>
constexpr T foo(T a); // expected-note {{declared here}}
@@ -14,3 +19,28 @@ template <typename T>
constexpr T foo(T a) {
return a;
}
+
+#if __cplusplus > 202002L
+
+namespace GH115118 {
+
+struct foo {
+ // expected-note at -1 2{{while}}
+ foo(const foo&) = default;
+ foo(auto)
+ requires([]<int = 0>() -> bool { return true; }())
+ // expected-error at -1 {{non-constant expression}}
+ // expected-note at -2 {{undefined function}} \
+ // expected-note at -2 {{declared}}
+ {}
+};
+
+// FIXME: This will be fixed by https://github.com/llvm/llvm-project/pull/205557
+struct bar {
+ // expected-note at -1 {{while}}
+ foo x; // check that the lambda gets instantiated.
+};
+
+} // namespace GH115118
+
+#endif
``````````
</details>
https://github.com/llvm/llvm-project/pull/209712
More information about the llvm-branch-commits
mailing list