re PR debug/79000 (ICE: in gen_member_die, at dwarf2out.c:23995)
authorRichard Biener <rguenther@suse.de>
Mon, 9 Jan 2017 08:22:58 +0000 (08:22 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 9 Jan 2017 08:22:58 +0000 (08:22 +0000)
2017-01-09  Richard Biener  <rguenther@suse.de>

PR debug/79000
* dwarf2out.c (is_cxx): New overload with context.
(is_naming_typedef_decl): Use it.

* g++.dg/lto/pr79000_0.C: New testcase.
* g++.dg/lto/pr79000_1.c: Likewise.

From-SVN: r244217

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/pr79000_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/pr79000_1.c [new file with mode: 0644]

index 87b3f8b258c6b8f4491cd1613ce92d9b0379e683..40ecb03d0dd386a227a07523055e18e10274e773 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-09  Richard Biener  <rguenther@suse.de>
+
+       PR debug/79000
+       * dwarf2out.c (is_cxx): New overload with context.
+       (is_naming_typedef_decl): Use it.
+
 2017-01-08  Sandra Loosemore  <sandra@codesourcery.com>
 
        * invoke.texi (Option Summary): Correct spacing in option lists
index 8abeb7abf657d93544a8d00be8700ef8b3d80181..9da69dfa2c67f64bf41e64ac3296c92b5cb0f413 100644 (file)
@@ -3356,6 +3356,7 @@ static int get_AT_flag (dw_die_ref, enum dwarf_attribute);
 static unsigned get_AT_unsigned (dw_die_ref, enum dwarf_attribute);
 static inline dw_die_ref get_AT_ref (dw_die_ref, enum dwarf_attribute);
 static bool is_cxx (void);
+static bool is_cxx (const_tree);
 static bool is_fortran (void);
 static bool is_ada (void);
 static bool remove_AT (dw_die_ref, enum dwarf_attribute);
@@ -4990,6 +4991,27 @@ is_cxx (void)
          || lang == DW_LANG_C_plus_plus_11 || lang == DW_LANG_C_plus_plus_14);
 }
 
+/* Return TRUE if DECL was created by the C++ frontend.  */
+
+static bool
+is_cxx (const_tree decl)
+{
+  if (in_lto_p)
+    {
+      const_tree context = decl;
+      while (context && TREE_CODE (context) != TRANSLATION_UNIT_DECL)
+       {
+         if (TREE_CODE (context) == BLOCK)
+           context = BLOCK_SUPERCONTEXT (context);
+         else
+           context = get_containing_scope (context);
+       }
+      if (context && TRANSLATION_UNIT_LANGUAGE (context))
+       return strncmp (TRANSLATION_UNIT_LANGUAGE (context), "GNU C++", 7) == 0;
+    }
+  return is_cxx ();
+}
+
 /* Return TRUE if the language is Java.  */
 
 static inline bool
@@ -24762,7 +24784,7 @@ is_naming_typedef_decl (const_tree decl)
       /* It looks like Ada produces TYPE_DECLs that are very similar
          to C++ naming typedefs but that have different
          semantics. Let's be specific to c++ for now.  */
-      || !is_cxx ())
+      || !is_cxx (decl))
     return FALSE;
 
   return (DECL_ORIGINAL_TYPE (decl) == NULL_TREE
index fc3873578f686f1aeeaa60280001af36306d3924..51f3bf339595b5acc1bfceaa9acafdc481bd5f8c 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-09  Richard Biener  <rguenther@suse.de>
+
+       PR debug/79000
+       * g++.dg/lto/pr79000_0.C: New testcase.
+       * g++.dg/lto/pr79000_1.c: Likewise.
+
 2017-01-08  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/77708
diff --git a/gcc/testsuite/g++.dg/lto/pr79000_0.C b/gcc/testsuite/g++.dg/lto/pr79000_0.C
new file mode 100644 (file)
index 0000000..1d5c40e
--- /dev/null
@@ -0,0 +1,7 @@
+// { dg-lto-do link }
+// { dg-lto-options { "-flto -g" } }
+// { dg-extra-ld-options "-r -nostdlib" }
+
+struct a {
+  a();
+} b;
diff --git a/gcc/testsuite/g++.dg/lto/pr79000_1.c b/gcc/testsuite/g++.dg/lto/pr79000_1.c
new file mode 100644 (file)
index 0000000..53389b9
--- /dev/null
@@ -0,0 +1,5 @@
+typedef struct a b;
+typedef struct a { } b;
+struct {
+  b c;
+} d;