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 建立於 2025年4月2日

在 GitHub 查看
 (24 留言) (0 反應) (0 負責人)C++ (10,782 fork)batch import
c++clang:frontendgood first issuelambda

倉庫指標

Star
 (26,378 star)
PR 合併指標
 (平均合併 1天 2小時) (30 天內合併 1,000 個 PR)

描述

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

貢獻者指南