(`#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
^^^^^^^^^^^^^^^^^^^^^^^^^
// 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;
DefaultArg =
ParseTypeName(/*Range=*/nullptr, DeclaratorContext::TemplateTypeArg)
.get();
+ }
NamedDecl *NewDecl = Actions.ActOnTypeParameter(getCurScope(),
TypenameKeyword, EllipsisLoc,
// 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;
EnterExpressionEvaluationContext ConstantEvaluated(
Actions, Sema::ExpressionEvaluationContext::ConstantEvaluated);
DefaultArg =
}
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);
+}
+
+}