cor3ntin updated this revision to Diff 526034. cor3ntin added a comment. Address Erich's feedback.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D151342/new/ 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; 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; 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 ^^^^^^^^^^^^^^^^^^^^^^^^^
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; 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; 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 ^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits