[PATCH] D151342: [Clang] Correctly handle generic lambda used as default template argument.
Corentin Jabot via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed May 24 09:14:30 PDT 2023
cor3ntin created this revision.
Herald added a project: All.
cor3ntin requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Adjust the template pparameter depth when parsing default
template arguments as they may introduce generic lambda whose parameters
are not substituted at the same depth.
Fixes #62611
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D151342
Files:
clang/docs/ReleaseNotes.rst
clang/lib/Parse/ParseTemplate.cpp
clang/test/SemaCXX/cxx2a-template-lambdas.cpp
Index: clang/test/SemaCXX/cxx2a-template-lambdas.cpp
===================================================================
--- clang/test/SemaCXX/cxx2a-template-lambdas.cpp
+++ clang/test/SemaCXX/cxx2a-template-lambdas.cpp
@@ -43,3 +43,30 @@
}
static_assert(outer<int>() == 123);
template int *outer<int *>(); // expected-note {{in instantiation}}
+
+
+namespace GH62611 {
+template <auto A = [](auto x){}>
+struct C {
+ static constexpr auto B = A;
+};
+
+int test() {
+ C<>::B(42);
+}
+
+namespace AutoParam
+{
+template <auto A = [](auto x) { return x;}>
+auto B = A;
+static_assert(B<>(42) == 42);
+}
+
+namespace TypeParam
+{
+template <typename T = decltype([](auto x) {return x;})>
+auto B = T{};
+static_assert(B<>(42) == 42);
+}
+
+}
Index: clang/lib/Parse/ParseTemplate.cpp
===================================================================
--- clang/lib/Parse/ParseTemplate.cpp
+++ clang/lib/Parse/ParseTemplate.cpp
@@ -841,10 +841,17 @@
// we introduce the type parameter into the local scope.
SourceLocation EqualLoc;
ParsedType DefaultArg;
- if (TryConsumeToken(tok::equal, EqualLoc))
+ if (TryConsumeToken(tok::equal, EqualLoc)) {
+ // The default argument may declare template parameters, notably
+ // if it contains a generic lambda, so we need to increase
+ // the template depth as these parameters would not be instantiated
+ // at the current level.
+ TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
+ CurTemplateDepthTracker.addDepth(1);
DefaultArg =
ParseTypeName(/*Range=*/nullptr, DeclaratorContext::TemplateTypeArg)
.get();
+ }
NamedDecl *NewDecl = Actions.ActOnTypeParameter(getCurScope(),
TypenameKeyword, EllipsisLoc,
@@ -1030,6 +1037,14 @@
// end of the template-parameter-list rather than a greater-than
// operator.
GreaterThanIsOperatorScope G(GreaterThanIsOperator, false);
+
+ // The default argument may declare template parameters, notably
+ // if it contains a generic lambda, so we need to increase
+ // the template depth as these parameters would not be instantiated
+ // at the current level.
+ TemplateParameterDepthRAII CurTemplateDepthTracker(
+ TemplateParameterDepth);
+ CurTemplateDepthTracker.addDepth(1);
EnterExpressionEvaluationContext ConstantEvaluated(
Actions, Sema::ExpressionEvaluationContext::ConstantEvaluated);
DefaultArg =
Index: clang/docs/ReleaseNotes.rst
===================================================================
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -485,6 +485,8 @@
(`#114 <https://github.com/llvm/llvm-project/issues/114>`_)
- Fix parsing of `auto(x)`, when it is surrounded by parentheses.
(`#62494 <https://github.com/llvm/llvm-project/issues/62494>`_)
+- Fix handling of generic lambda used as template arguments.
+ (`#62611 <https://github.com/llvm/llvm-project/issues/62611>`_)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D151342.525209.patch
Type: text/x-patch
Size: 3087 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230524/9336691b/attachment-0001.bin>
More information about the cfe-commits
mailing list