This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug debug/49546] New: class DW_AT_name does not match method's linkage name prefix
- From: "jan.kratochvil at redhat dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 27 Jun 2011 17:04:05 +0000
- Subject: [Bug debug/49546] New: class DW_AT_name does not match method's linkage name prefix
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49546
Summary: class DW_AT_name does not match method's linkage name
prefix
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: debug
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: jan.kratochvil@redhat.com
CC: dodji@gcc.gnu.org
Target: x86_64-unknown-linux-gnu
------------------------------------------------------------------------------
struct S {
static void m (int x) {}
};
template<void (*T) (int)>
// or: template<void (T) (int)>
struct K {
void f () { T (0); }
};
int main () {
K<&S::m> k;
// or: K<S::m> k;
k.f ();
}
------------------------------------------------------------------------------
< c> DW_AT_producer : GNU C++ 4.7.0 20110627 (experimental)
<1><54>: Abbrev Number: 6 (DW_TAG_structure_type)
<55> DW_AT_name : K<S::m>
<2><60>: Abbrev Number: 7 (DW_TAG_subprogram)
<66> DW_AT_MIPS_linkage_name: _ZN1KIXadL_ZN1S1mEiEEE1fEv
With the demangler fix PR debug/49408 it now demanges to: K<&S::m>::f()
But therefore K<S::m> does not match K<&S::m>.
DWARF is exactly the for all the four combination of alternative lines.
As both K<&S::m>::f() functions have exactly the same mangled name
_ZN1KIXadL_ZN1S1mEiEEE1fEv , the demangled names should match the source form
and in the example below it is the only allowed form of the source the
function should demangled to K<&S::m>::f().
But it also cannot always match the source form when multiple source notations
compile into exactly the same output.
source referenced in the text above:
------------------------------------------------------------------------------
struct S {
void m (int x) {}
};
template<void (S::*F) (int)>
struct K {
void f () { S s; (s.*F) (5); }
};
int main () {
K<&S::m> k;
k.f ();
}
------------------------------------------------------------------------------
FYI:
_ZN1KIXadL_ZN1S1mEiEEE1fEv
typed name
qualified name
template
name 'K'
template argument list
unary operator
operator &
typed name
qualified name
name 'S'
name 'm'
function type
argument list
builtin type int
name 'f'
function type
argument list