[all-commits] [llvm/llvm-project] dd222f: [Clang] Avoid transforming lambdas when rebuilding...
Younan Zhang via All-commits
all-commits at lists.llvm.org
Wed Sep 18 01:35:17 PDT 2024
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: dd222ff25129f4d67473a9af598a78d0adfcfd29
https://github.com/llvm/llvm-project/commit/dd222ff25129f4d67473a9af598a78d0adfcfd29
Author: Younan Zhang <zyn7109 at gmail.com>
Date: 2024-09-18 (Wed, 18 Sep 2024)
Changed paths:
M clang/docs/ReleaseNotes.rst
M clang/lib/Sema/SemaExpr.cpp
M clang/lib/Sema/SemaTemplate.cpp
M clang/lib/Sema/SemaTemplateInstantiate.cpp
M clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
M clang/test/SemaCXX/cxx2a-consteval.cpp
Log Message:
-----------
[Clang] Avoid transforming lambdas when rebuilding immediate expressions (#108693)
When rebuilding immediate invocations inside
`RemoveNestedImmediateInvocation()`, we employed a `TreeTransform` to
exercise the traversal. The transformation has a side effect that, for
template specialization types, their default template arguments are
substituted separately, and if any lambdas are present, they will be
transformed into distinct types than those used to instantiate the
templates right before the `consteval` handling.
This resulted in `B::func()` getting redundantly instantiated for the
case in question. Since we're also in an immediate evaluation context,
the body of `foo()` would also get instantiated, so we end up with a
spurious friend redefinition error.
Like what we have done in `ComplexRemove`, this patch also avoids the
lambda's transformation in TemplateInstantiator if we know we're
rebuilding immediate calls. In addition, this patch also consolidates
the default argument substitution logic in
`CheckTemplateArgumentList()`.
Fixes #107175
To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications
More information about the All-commits
mailing list