summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-04-07 21:01:40 +0200
committerJakub Jelinek <jakub@redhat.com>2020-04-07 21:01:40 +0200
commitb5039b7259e64a92f5c077fe4d023556d6b12550 (patch)
tree52e8861018a51a8fb2cf4b46f96e200352524fe7
parentd1371dbe12214895cda0b13bfc6ff0ed9cbce15d (diff)
downloadgcc-b5039b7259e64a92f5c077fe4d023556d6b12550.tar.gz
debug: Improve debug info of c++14 deduced return type [PR94459]
On the following testcase, in gdb ptype S<long>::m1 prints long as return type, but all the other methods show void instead. PR53756 added code to add_type_attribute if the return type is auto/decltype(auto), but we actually should look through references, pointers and qualifiers. Haven't included there DW_TAG_atomic_type, because I think at least ATM one can't use that in C++. Not sure about DW_TAG_array_type or what else could be deduced. > http://eel.is/c++draft/dcl.spec.auto#3 says it has to appear as a > decl-specifier. > > http://eel.is/c++draft/temp.deduct.type#8 lists the forms where a template > argument can be deduced. > > Looks like you are missing arrays, pointers to members, and function return > types. 2020-04-04 Hannes Domani <ssbssa@yahoo.de> Jakub Jelinek <jakub@redhat.com> PR debug/94459 * dwarf2out.c (gen_subprogram_die): Look through references, pointers, arrays, pointer-to-members, function types and qualifiers when checking if in-class DIE had an 'auto' or 'decltype(auto)' return type to emit type again on definition. * g++.dg/debug/pr94459.C: New test. Co-Authored-By: Hannes Domani <ssbssa@yahoo.de>
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/dwarf2out.c15
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/debug/pr94459.C58
4 files changed, 86 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 022d71e9e73..4f3708cb39b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,15 @@
2020-04-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
+ 2020-04-04 Hannes Domani <ssbssa@yahoo.de>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/94459
+ * dwarf2out.c (gen_subprogram_die): Look through references, pointers,
+ arrays, pointer-to-members, function types and qualifiers when
+ checking if in-class DIE had an 'auto' or 'decltype(auto)' return type
+ to emit type again on definition.
+
2020-04-03 Jakub Jelinek <jakub@redhat.com>
PR target/94460
@@ -9,8 +18,6 @@
second half of first lane from first lane of second operand and
first half of second lane from second lane of first operand.
-2020-04-07 Jakub Jelinek <jakub@redhat.com>
-
2020-04-01 Jakub Jelinek <jakub@redhat.com>
PR middle-end/94423
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 30c4c7007ee..9ea109b3b61 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -23011,11 +23011,22 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
!= (unsigned) s.column))
add_AT_unsigned (subr_die, DW_AT_decl_column, s.column);
- /* If the prototype had an 'auto' or 'decltype(auto)' return type,
- emit the real type on the definition die. */
+ /* If the prototype had an 'auto' or 'decltype(auto)' in
+ the return type, emit the real type on the definition die. */
if (is_cxx () && debug_info_level > DINFO_LEVEL_TERSE)
{
dw_die_ref die = get_AT_ref (old_die, DW_AT_type);
+ while (die
+ && (die->die_tag == DW_TAG_reference_type
+ || die->die_tag == DW_TAG_rvalue_reference_type
+ || die->die_tag == DW_TAG_pointer_type
+ || die->die_tag == DW_TAG_const_type
+ || die->die_tag == DW_TAG_volatile_type
+ || die->die_tag == DW_TAG_restrict_type
+ || die->die_tag == DW_TAG_array_type
+ || die->die_tag == DW_TAG_ptr_to_member_type
+ || die->die_tag == DW_TAG_subroutine_type))
+ die = get_AT_ref (die, DW_AT_type);
if (die == auto_die || die == decltype_auto_die)
add_type_attribute (subr_die, TREE_TYPE (TREE_TYPE (decl)),
TYPE_UNQUALIFIED, false, context_die);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 306380907ee..5561d7f2ee8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,6 +1,12 @@
2020-04-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
+ 2020-04-04 Hannes Domani <ssbssa@yahoo.de>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/94459
+ * g++.dg/debug/pr94459.C: New test.
+
2020-04-04 Jakub Jelinek <jakub@redhat.com>
PR c++/94477
diff --git a/gcc/testsuite/g++.dg/debug/pr94459.C b/gcc/testsuite/g++.dg/debug/pr94459.C
new file mode 100644
index 00000000000..ebc0cf45cc6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr94459.C
@@ -0,0 +1,58 @@
+// PR debug/94459
+// { dg-do compile { target c++14 } }
+// { dg-options "-g -dA" }
+
+template <typename T>
+struct S
+{
+ T v;
+ T w[2];
+ S () : v (0), w { 0, 0 } {}
+ static auto baz () { return (T) 0; }
+ auto m1 () { return v; }
+ auto &m2 () { return v; }
+ auto &&m3 () { return (T&&)v; }
+ const auto m4 () { return v; }
+ const auto &m5 () { return v; }
+ const auto &&m6 () { return (T&&)v; }
+ volatile auto m7 () { return v; }
+ volatile auto &m8 () { return v; }
+ volatile auto &&m9 () { return (T&&)v; }
+ volatile const auto m10 () { return v; }
+ volatile const auto &m11 () { return v; }
+ volatile const auto &&m12 () { return (T&&)v; }
+ const volatile auto m13 () { return v; }
+ const volatile auto &m14 () { return v; }
+ const volatile auto &&m15 () { return (T&&)v; }
+#ifndef __STRICT_ANSI__
+ __restrict const volatile auto &&m16 () { return (T&&)v; }
+ const __restrict auto &m17 () { return v; }
+#endif
+ auto *m18 () { return &v; }
+ auto (S::* (m19 ())) () { return &S::m1; }
+ auto (S::* (m20 ())) { return &S::v; }
+ auto (*m21 ()) () { return S::baz; }
+};
+
+S<long> s, u, v;
+
+long
+foo ()
+{
+ auto x = s.m19 ();
+ auto y = s.m20 ();
+ auto z = s.m21 ();
+ return s.m1 () + s.m2 () + s.m3 () + s.m4 () + s.m5 ()
+ + s.m6 () + s.m7 () + s.m8 () + s.m9 () + s.m10 ()
+ + s.m11 () + s.m12 () + s.m13 () + s.m14 () + s.m15 ()
+#ifndef __STRICT_ANSI__
+ + u.m16 () + v.m17 ()
+#endif
+ + *s.m18 () + (s.*x) () + s.*y + z ();
+}
+
+int
+main ()
+{
+ return foo ();
+}