Skip to content

Off-by-one error in expression mangling of parameter reference in lambda #120822

Open
@hubert-reinterpretcast

Description

@hubert-reinterpretcast

According to the Itanium C++ ABI, the expression mangling for a function parameter involves a number L where L is 1 when referencing a parameter of the current function declarator within its parameter declaration clause.

In the case where L is one, the parameter reference is represented with a prefix of fL0p (that is with the value of L - 1 after the "L").

Consider the source below.

The value of L should be 1; however, the mangling used for x is _ZZZ1fvENKUlT_DtfL1p_EE_clIiEEDaS_S0_E1x (with fL1p instead of the expected fL0p). Oddly enough, the typeinfo string for the closure type (Z1fvEUlT_DtfL0p_EE_) has fL0p as expected.

GCC has an off-by-one error in the opposite direction: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118144
Online compiler link: https://godbolt.org/z/51E9Yjvxf

SOURCE (<stdin>)

inline auto f() {
  return [](auto p, decltype(p)) {
    static int x = 0;
    return &x;
  };
}
void g() { throw f(); }
auto h() { return f()(0, 0); }

COMPILER INVOCATION

clang++ -std=c++17 -xc++ - -O -S -emit-llvm -o -

ACTUAL COMPILER OUTPUT (partial)

  ret ptr @_ZZZ1fvENKUlT_DtfL1p_EE_clIiEEDaS_S0_E1x

EXPECTED COMPILER OUTPUT (partial)

  ret ptr @_ZZZ1fvENKUlT_DtfL0p_EE_clIiEEDaS_S0_E1x

COMPILER VERSION INFO (clang++ -v)

clang version 20.0.0git (https://github.com/llvm/llvm-project.git 44514316bd5ef656076b6baaf6bccb298d98f0ea)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /opt/wandbox/clang-head/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/13
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/14
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/14
Candidate multilib: .;@m64
Selected multilib: .;@m64

Metadata

Metadata

Assignees

No one assigned

    Labels

    c++14clang:frontendLanguage frontend issues, e.g. anything involving "Sema"diverges-from:gccDoes the clang frontend diverge from gcc on this issuemiscompilation

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions