llvm/llvm-project
Ver no GitHubSpecific structure name can cause shadowing of globally defined lambda, causing "struct::operator()" to be called instead of "lambda::operator()"
Open
#134.049 aberto em 2 de abr. de 2025
c++clang:frontendgood first issuelambda
Métricas do repositório
- Stars
- (26.378 stars)
- Métricas de merge de PR
- (Mesclagem média 1d 2h) (1.000 fundiu PRs em 30d)
Description
Defining structure with naming convention used by the compiler for lambda expressions ("$_<num>") causes compiler to use structure's "operator()" instead of the one defined for a global lambda(s).
In the following code:
struct $_0
{
int c;
void operator()() const {std::cout << __func__ << " " << c <<" from struct\n";}
};
auto lambda = [](){std::cout << __func__ << " from lambda\n";};
int main()
{
lambda();
}
Call to "lambda()" invokes "$_0::operator()" instead of the expected lambda:
If the "$_0::operator()" makes use of any memory, then calls to lambdas result in memory access operations. "-fsanitize=address" allows for detection of them: godbolt example