[LLVMbugs] [Bug 12917] New: Incorrect mangling of lambdas in default arguments in templates

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Tue May 22 22:22:21 PDT 2012


             Bug #: 12917
           Summary: Incorrect mangling of lambdas in default arguments in
           Product: clang
           Version: unspecified
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: C++11
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: richard-llvm at metafoo.co.uk
                CC: dgregor at apple.com, llvmbugs at cs.uiuc.edu
    Classification: Unclassified

Related to, but different from, PR12057, Clang (correctly) accepts this:

struct S {
  S(T ...t = []{static int n = 0; return ++n;}());
S<int, char> s1, s2;

... but it generates incorrect code. The two instantiated lambdas are given the
same mangled name, and we only produce a single static variable rather than

This ultimately seems to be caused by us copying the mangling information from
the lambda in the template to the instantiation, rather than regenerating it in
the instantiation. This also seems to give us wrong manglings in non-variadic
cases. From test/CodeGenCXX/mangle-lambdas.cpp:

template<typename T>
struct ST {
  void f(T = []{return T() + 1;}()
           + []{return T() + 2;}(),
         T = []{return T(3);}());

// CHECK: define void @_Z7test_ST2STIdE
void test_ST(ST<double> st) {
  // CHECK: call double @_ZZN2ST1fET_S0_Ed0_NKUlvE_clEv
  // CHECK-NEXT: call double @_ZZN2ST1fET_S0_Ed0_NKUlvE0_clEv
  // CHECK-NEXT: fadd double
  // CHECK-NEXT: call double @_ZZN2ST1fET_S0_Ed_NKUlvE_clEv
  // CHECK-NEXT: call void @_ZN2STIdE1fEdd

  // CHECK-NEXT: ret void

These mangled names contain no reference to the value of the template argument:
N2ST1fET_S0_ is a mangling of the member function within the template itself! I
think these should be:


Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list