Bug 80466 - template<> using loses template argument in debuginfo
Summary: template<> using loses template argument in debuginfo
Status: UNCONFIRMED
Alias: None
Product: gcc
Classification: Unclassified
Component: debug (show other bugs)
Version: 7.0.1
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-04-19 18:59 UTC by Ben Longbons
Modified: 2018-04-17 11:55 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ben Longbons 2017-04-19 18:59:35 UTC
// BAD: g++-6 -std=c++0x -g    using-template.cpp   -o using-template -gdwarf-4
// BAD: g++-6 -std=c++0x -g    using-template.cpp   -o using-template -gdwarf-5
// BAD: g++-7 -std=c++0x -g    using-template.cpp   -o using-template -gdwarf-4
// ?BAD?: g++-7 -std=c++0x -g    using-template.cpp   -o using-template -gdwarf-5
// (My `readelf` and `dwarfdump` both barf on the last, but `strings -n 3` looks like there's no change)

// An example speaks louder than words for this sort of thing:


template<class T>
class qux
{
};

template<class T>
using foo = qux<T>;

qux<int> works_int;
foo<int> fails_int;

qux<void> works_void;
foo<void> fails_void;

int main()
{
}

/*
readelf -wi using-template

Contents of the .debug_info section:

  Compilation Unit @ offset 0x0:
   Length:        0xdc (32-bit)
   Version:       4
   Abbrev Offset: 0x0
   Pointer Size:  8
 <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <c>   DW_AT_producer    : (indirect string, offset: 0x38): GNU C++11 7.0.1 20170407 (experimental) [trunk revision 246759] -mtune=generic -march=x86-64 -g -gdwarf-4 -std=c++11
    <10>   DW_AT_language    : 4	(C++)
    <11>   DW_AT_name        : (indirect string, offset: 0x0): using-template.cpp
    <15>   DW_AT_comp_dir    : (indirect string, offset: 0x26): /tmp/dl
    <19>   DW_AT_low_pc      : 0x61a
    <21>   DW_AT_high_pc     : 0xb
    <29>   DW_AT_stmt_list   : 0x0
 <1><2d>: Abbrev Number: 2 (DW_TAG_class_type)
    <2e>   DW_AT_name        : (indirect string, offset: 0x13): qux<int>
    <32>   DW_AT_byte_size   : 1
    <33>   DW_AT_decl_file   : 1
    <34>   DW_AT_decl_line   : 2
    <35>   DW_AT_sibling     : <0x41>
 <2><39>: Abbrev Number: 3 (DW_TAG_template_type_param)
    <3a>   DW_AT_name        : T
    <3c>   DW_AT_type        : <0xd8>
 <2><40>: Abbrev Number: 0
 <1><41>: Abbrev Number: 4 (DW_TAG_variable)
    <42>   DW_AT_name        : (indirect string, offset: 0x1c): works_int
    <46>   DW_AT_decl_file   : 1
    <47>   DW_AT_decl_line   : 9
    <48>   DW_AT_type        : <0x2d>
    <4c>   DW_AT_external    : 1
    <4c>   DW_AT_location    : 9 byte block: 3 29 10 20 0 0 0 0 0 	(DW_OP_addr: 201029)
 <1><56>: Abbrev Number: 5 (DW_TAG_typedef)
    <57>   DW_AT_name        : foo
    <5b>   DW_AT_decl_file   : 1
    <5c>   DW_AT_decl_line   : 7
    <5d>   DW_AT_type        : <0x2d>
 <1><61>: Abbrev Number: 4 (DW_TAG_variable)
    <62>   DW_AT_name        : (indirect string, offset: 0xb2): fails_int
    <66>   DW_AT_decl_file   : 1
    <67>   DW_AT_decl_line   : 10
    <68>   DW_AT_type        : <0x56>
    <6c>   DW_AT_external    : 1
    <6c>   DW_AT_location    : 9 byte block: 3 2a 10 20 0 0 0 0 0 	(DW_OP_addr: 20102a)
 <1><76>: Abbrev Number: 2 (DW_TAG_class_type)
    <77>   DW_AT_name        : (indirect string, offset: 0x2e): qux<void>
    <7b>   DW_AT_byte_size   : 1
    <7c>   DW_AT_decl_file   : 1
    <7d>   DW_AT_decl_line   : 2
    <7e>   DW_AT_sibling     : <0x86>
 <2><82>: Abbrev Number: 6 (DW_TAG_template_type_param)
    <83>   DW_AT_name        : T
 <2><85>: Abbrev Number: 0
 <1><86>: Abbrev Number: 4 (DW_TAG_variable)
    <87>   DW_AT_name        : (indirect string, offset: 0xbc): works_void
    <8b>   DW_AT_decl_file   : 1
    <8c>   DW_AT_decl_line   : 12
    <8d>   DW_AT_type        : <0x76>
    <91>   DW_AT_external    : 1
    <91>   DW_AT_location    : 9 byte block: 3 2b 10 20 0 0 0 0 0 	(DW_OP_addr: 20102b)
 <1><9b>: Abbrev Number: 5 (DW_TAG_typedef)
    <9c>   DW_AT_name        : foo
    <a0>   DW_AT_decl_file   : 1
    <a1>   DW_AT_decl_line   : 7
    <a2>   DW_AT_type        : <0x76>
 <1><a6>: Abbrev Number: 4 (DW_TAG_variable)
    <a7>   DW_AT_name        : (indirect string, offset: 0xc7): fails_void
    <ab>   DW_AT_decl_file   : 1
    <ac>   DW_AT_decl_line   : 13
    <ad>   DW_AT_type        : <0x9b>
    <b1>   DW_AT_external    : 1
    <b1>   DW_AT_location    : 9 byte block: 3 2c 10 20 0 0 0 0 0 	(DW_OP_addr: 20102c)
 <1><bb>: Abbrev Number: 7 (DW_TAG_subprogram)
    <bc>   DW_AT_external    : 1
    <bc>   DW_AT_name        : (indirect string, offset: 0xad): main
    <c0>   DW_AT_decl_file   : 1
    <c1>   DW_AT_decl_line   : 15
    <c2>   DW_AT_type        : <0xd8>
    <c6>   DW_AT_low_pc      : 0x61a
    <ce>   DW_AT_high_pc     : 0xb
    <d6>   DW_AT_frame_base  : 1 byte block: 9c 	(DW_OP_call_frame_cfa)
    <d8>   DW_AT_GNU_all_call_sites: 1
 <1><d8>: Abbrev Number: 8 (DW_TAG_base_type)
    <d9>   DW_AT_byte_size   : 4
    <da>   DW_AT_encoding    : 5	(signed)
    <db>   DW_AT_name        : int
 <1><df>: Abbrev Number: 0
*/

// In particular, note the identical DW_AT_name of each DW_TAG_typedef.