llvm/llvm-project

Specific structure name can cause shadowing of globally defined lambda, causing "struct::operator()" to be called instead of "lambda::operator()"

Open

#134,049 opened on Apr 2, 2025

View on GitHub
 (24 comments) (0 reactions) (0 assignees)C++ (10,782 forks)batch import
c++clang:frontendgood first issuelambda

Repository metrics

Stars
 (26,378 stars)
PR merge metrics
 (Avg merge 1d 2h) (1,000 merged PRs in 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: Image

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

Contributor guide