[clang] Skip re-building lambda expressions in parameters to consteval fns.
authorUtkarsh Saxena <usx@google.com>
Tue, 30 Aug 2022 14:57:07 +0000 (16:57 +0200)
committerUtkarsh Saxena <usx@google.com>
Fri, 2 Sep 2022 10:30:52 +0000 (12:30 +0200)
commite7eec38246560781e0a4020b19c7eb038a8c5655
tree6e9308e0405b903277744e45b5144569560c7239
parent51d4c7ceea61b5d83ba52398b5ca6d58d7551044
[clang] Skip re-building lambda expressions in parameters to consteval fns.

As discussed in this [comment](https://github.com/llvm/llvm-project/issues/56183#issuecomment-1224331699),
we end up building the lambda twice: once while parsing the function calls and then again while handling the immediate invocation.

This happens specially during removing nested immediate invocation.
Eg: When we have another consteval function as the parameter along with this lambda expression. Eg: `foo(bar([]{}))`, `foo(bar(), []{})`

While removing such nested immediate invocations, we should not rebuild this lambda. (IIUC, rebuilding a lambda would always generate a new type which will never match the original type from parsing)

Fixes: https://github.com/llvm/llvm-project/issues/56183
Fixes: https://github.com/llvm/llvm-project/issues/51695
Fixes: https://github.com/llvm/llvm-project/issues/50455
Fixes: https://github.com/llvm/llvm-project/issues/54872
Fixes: https://github.com/llvm/llvm-project/issues/54587

Differential Revision: https://reviews.llvm.org/D132945
clang/docs/ReleaseNotes.rst
clang/lib/Sema/SemaExpr.cpp
clang/test/SemaCXX/cxx2a-consteval.cpp