diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2014-02-28 16:51:21 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-02-28 16:51:21 +0000 |
commit | c5b001b5f0d4e8355de686a4c84abae96efbbbcd (patch) | |
tree | 629b8fbac986b6c3659ffa145e7f3b152ece0fbc /gcc/dwarf2out.c | |
parent | 5750e120d44393e4bac57bf51ecf97dc223033f1 (diff) | |
download | gcc-c5b001b5f0d4e8355de686a4c84abae96efbbbcd.zip gcc-c5b001b5f0d4e8355de686a4c84abae96efbbbcd.tar.gz gcc-c5b001b5f0d4e8355de686a4c84abae96efbbbcd.tar.bz2 |
re PR c++/60314 ([C++1y] ICE with decltype(auto) when generating debug information)
2014-02-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60314
* dwarf2out.c (is_cxx_auto): Handle decltype(auto).
/testsuite
2014-02-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60314
* g++.dg/cpp1y/auto-fn24.C: New.
From-SVN: r208225
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index e202fa7..1c3ff03 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -250,6 +250,9 @@ static GTY(()) section *cold_text_section; /* The DIE for C++1y 'auto' in a function return type. */ static GTY(()) dw_die_ref auto_die; +/* The DIE for C++1y 'decltype(auto)' in a function return type. */ +static GTY(()) dw_die_ref decltype_auto_die; + /* Forward declarations for functions defined in this file. */ static char *stripattributes (const char *); @@ -10230,7 +10233,8 @@ is_cxx_auto (tree type) tree name = TYPE_NAME (type); if (TREE_CODE (name) == TYPE_DECL) name = DECL_NAME (name); - if (name == get_identifier ("auto")) + if (name == get_identifier ("auto") + || name == get_identifier ("decltype(auto)")) return true; } return false; @@ -18022,10 +18026,11 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) if (get_AT_unsigned (old_die, DW_AT_decl_line) != (unsigned) s.line) add_AT_unsigned (subr_die, DW_AT_decl_line, s.line); - /* If the prototype had an 'auto' return type, emit the real - type on the definition die. */ + /* If the prototype had an 'auto' or 'decltype(auto)' return type, + emit the real type on the definition die. */ if (is_cxx() && debug_info_level > DINFO_LEVEL_TERSE - && get_AT_ref (old_die, DW_AT_type) == auto_die) + && (get_AT_ref (old_die, DW_AT_type) == auto_die + || get_AT_ref (old_die, DW_AT_type) == decltype_auto_die)) add_type_attribute (subr_die, TREE_TYPE (TREE_TYPE (decl)), 0, 0, context_die); } @@ -19852,13 +19857,18 @@ gen_type_die_with_usage (tree type, dw_die_ref context_die, default: if (is_cxx_auto (type)) { - if (!auto_die) + tree name = TYPE_NAME (type); + if (TREE_CODE (name) == TYPE_DECL) + name = DECL_NAME (name); + dw_die_ref *die = (name == get_identifier ("auto") + ? &auto_die : &decltype_auto_die); + if (!*die) { - auto_die = new_die (DW_TAG_unspecified_type, - comp_unit_die (), NULL_TREE); - add_name_attribute (auto_die, "auto"); + *die = new_die (DW_TAG_unspecified_type, + comp_unit_die (), NULL_TREE); + add_name_attribute (*die, IDENTIFIER_POINTER (name)); } - equate_type_number_to_die (type, auto_die); + equate_type_number_to_die (type, *die); break; } gcc_unreachable (); |