https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96215
Bug ID: 96215 Summary: Wrong mangling for non-dependent return type involving decltype(g.x) or decltype(p->x) Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: arthur.j.odwyer at gmail dot com Target Milestone: --- // https://godbolt.org/z/z4rjjq struct S { int x; int operator*() const; }; extern const S g; extern const S *p; extern int S::*m; template<class T> decltype(g.x) foo() { return 0; } template<class T> decltype(p->x) bar() { return 0; } template int foo<int>(); template int bar<int>(); Clang mangles these instantiations as _Z3fooIiEiv _Z3barIiEiv GCC mangles them as _Z3fooIiEDtdtL_Z1gE1xEv _Z3barIiEDtptL_Z1pE1xEv Weirdly, GCC doesn't seem to have this issue with any other operators -- decltype(g+1), decltype(g.*m), etc. are all handled as synonyms for `int`. Only dot and arrow are handled as-if-they-were-dependent-even-though-they-aren't.