Open
Description
Example 1:
template <typename T>
concept C = true;
template <typename T>
struct Foo {
template <typename F>
explicit Foo(F f)
requires requires {
requires C<F>;
}
{}
};
void k() {
// mangled name for the Foo<double>::Foo constructor: _ZN3FooIdEC2IiEET_QrqQ1CITL0__EE
Foo<double> f(1);
}
The mangled name _ZN3FooIdEC2IiEET_QrqQ1CITL0__EE
is demangled incorrectly (note that TL0
):
$ ./bin/llvm-cxxfilt _ZN3FooIdEC2IiEET_QrqQ1CITL0__EE
Foo<double>::Foo<int>(int) requires requires { requires C<TL0_>; }
Example 2:
template <typename T>
concept C = true;
template <typename T, typename U>
concept C2 = true;
template <typename T>
struct Foo {
template <typename F>
explicit Foo(F f)
requires requires {
requires C<Foo>;
requires C<T>;
requires C2<F, F>;
}
{}
};
void k() {
// mangled name is _ZN3FooIdEC2IiEET_QrqQ1CIS_IS2_EEQ1CIS2_EQ2C2ITL0__S5_EE
Foo<double> f(1);
}
The mangled name can not be demangled by llvm-cxxfilt
.