re PR debug/85176 (ICE in force_decl_die, at dwarf2out.c:25910)
authorRichard Biener <rguenther@suse.de>
Wed, 4 Apr 2018 14:11:39 +0000 (14:11 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 4 Apr 2018 14:11:39 +0000 (14:11 +0000)
2018-04-04  Richard Biener  <rguenther@suse.de>

PR lto/85176
* dwarf2out.c (dwarf2out_register_external_die): Peel namespaces
from contexts for DINFO_LEVEL_TERSE and below.

* g++.dg/lto/pr85176_0.C: New testcase.

From-SVN: r259080

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

index bd0c1b121563780dffcc218082a6d814f86fb804..c24c3dc090f1a74d3f38c2ce95231374b680f157 100644 (file)
@@ -1,3 +1,9 @@
+2018-04-04  Richard Biener  <rguenther@suse.de>
+
+       PR lto/85176
+       * dwarf2out.c (dwarf2out_register_external_die): Peel namespaces
+       from contexts for DINFO_LEVEL_TERSE and below.
+
 2018-04-04  Kito Cheng  <kito.cheng@gmail.com>
 
        * config/nds32/nds32-doubleword.md (move_<mode>): Require
index 049be713391b23be5c73e2a437481deea2c0ad3f..793305484df0351f183ea5df02ab9bb3df46b615 100644 (file)
@@ -5903,8 +5903,13 @@ dwarf2out_register_external_die (tree decl, const char *sym,
     }
   else
     ctx = DECL_CONTEXT (decl);
+  /* Peel types in the context stack.  */
   while (ctx && TYPE_P (ctx))
     ctx = TYPE_CONTEXT (ctx);
+  /* Likewise namespaces in case we do not want to emit DIEs for them.  */
+  if (debug_info_level <= DINFO_LEVEL_TERSE)
+    while (ctx && TREE_CODE (ctx) == NAMESPACE_DECL)
+      ctx = DECL_CONTEXT (ctx);
   if (ctx)
     {
       if (TREE_CODE (ctx) == BLOCK)
index af3e374c5100f63b27fa4c77c7d2b21bd18341a0..e9c9475830dc487c6a54e01650d15851ea7885ab 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-04  Richard Biener  <rguenther@suse.de>
+
+       PR lto/85176
+       * g++.dg/lto/pr85176_0.C: New testcase.
+
 2018-04-04  Richard Biener  <rguenther@suse.de>
 
        PR testsuite/85191
diff --git a/gcc/testsuite/g++.dg/lto/pr85176_0.C b/gcc/testsuite/g++.dg/lto/pr85176_0.C
new file mode 100644 (file)
index 0000000..73767ce
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-lto-do link }
+// { dg-lto-options { { -flto -g1 } } }
+// { dg-extra-ld-options "-r -nostdlib" }
+namespace a {
+    template <typename b, typename = b> class c;
+    template <typename b, typename d> void e(c<b, d> &);
+    void operator<<(c<char> &f, const char *) { e(f); }
+    extern c<char> cout;
+}
+int main() { a::cout << ""; }