https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81932

--- Comment #14 from Xi Ruoyao <ryxi at stu dot xidian.edu.cn> ---
(In reply to Martin Sebor from comment #13)
> (In reply to Xi Ruoyao from comment #11)
> 
> The target demangler is (or can be) different on each target and, as I said,
> different producers use different strings (for example, neither Clang nor
> IBM XLC++ includes the suffix, and Oracle CC on Linux uses the cast
> notation).
> 
> The most natural representation of an integer in C++ (and in C) is a decimal
> literal with no suffix (unless its value doesn't fit in the signed integer
> with the greatest precision).
> 
> So my opinion that you asked for is that insisting on anything else is an
> inferior choice.  If you don't share it please do no feel compelled to
> convince me of yours.

See below:

a.cc:
~~~~~
template <int x> struct a {int foo() {return -x;}};
template struct a<1>;
~~~~~

and b.cc:
~~~~~
template <unsigned x> struct a {int foo();};
int main() {return a<1>().foo();}
~~~~~

This error happens when a library's ABI changes, and someone tries to link old
object code to the new library.  With libiberty's demangle (in GNU ld), we have
error message:

/tmp/ccKFWvhT.o: In function `main':
b.cc:(.text+0x10): undefined reference to `a<1u>::foo()'
collect2: error: ld returned 1 exit status

But what would we get with "natural" expression?

b.cc:(.text+0x10): undefined reference to `a<1>::foo()'

It's hard to know what happened.  We have two different mangled name with the
same demangled name.  It's strange and could be a new example in "How not to
programming in C++".

Reply via email to