re PR debug/77947 (ICE with -g and -O2 in strip_naming_typedef)
authorRichard Biener <rguenther@suse.de>
Wed, 12 Oct 2016 14:37:53 +0000 (14:37 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 12 Oct 2016 14:37:53 +0000 (14:37 +0000)
2016-10-12  Richard Biener  <rguenther@suse.de>

PR debug/77947
* cgraphunit.c (analyze_functions): Preserve cgraph nodes
function context.

* g++.dg/torture/pr77947.C: New testcase.

From-SVN: r241053

gcc/ChangeLog
gcc/cgraphunit.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr77947.C [new file with mode: 0644]

index e709adb091bbbed6e9f318b343321b2b147779fd..3fb6a77068b80a1d851ad2e934f652b93d1e6577 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-12  Richard Biener  <rguenther@suse.de>
+
+       PR debug/77947
+       * cgraphunit.c (analyze_functions): Preserve cgraph nodes
+       function context.
+
 2016-10-12  Thomas Schwinge  <thomas@codesourcery.com>
 
        * lto-streamer.c: Fix LTO_STREAMER_DEBUG build.
index abcb35dea63b70656908310add499a3a2f111857..4fa518d27c63ded2dcd348d0825951f09f2dea2d 100644 (file)
@@ -1117,15 +1117,22 @@ analyze_functions (bool first_time)
                }
 
              /* If decl is a clone of an abstract function,
-             mark that abstract function so that we don't release its body.
-             The DECL_INITIAL() of that abstract function declaration
-             will be later needed to output debug info.  */
+                mark that abstract function so that we don't release its body.
+                The DECL_INITIAL() of that abstract function declaration
+                will be later needed to output debug info.  */
              if (DECL_ABSTRACT_ORIGIN (decl))
                {
                  cgraph_node *origin_node
                    = cgraph_node::get_create (DECL_ABSTRACT_ORIGIN (decl));
                  origin_node->used_as_abstract_origin = true;
                }
+             /* Preserve a functions function context node.  It will
+                later be needed to output debug info.  */
+             if (tree fn = decl_function_context (decl))
+               {
+                 cgraph_node *origin_node = cgraph_node::get_create (fn);
+                 enqueue_node (origin_node);
+               }
            }
          else
            {
index 4a991d9ec431828bd3bf7dab2fe5cdaac9d90d1a..10a8e35b8bf5de87de5734098922a34391a2c1fe 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-12  Richard Biener  <rguenther@suse.de>
+
+       PR debug/77947
+       * g++.dg/torture/pr77947.C: New testcase.
+
 2016-10-12  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * gnat.dg/debug8.adb: New testcase.
diff --git a/gcc/testsuite/g++.dg/torture/pr77947.C b/gcc/testsuite/g++.dg/torture/pr77947.C
new file mode 100644 (file)
index 0000000..3c8a24a
--- /dev/null
@@ -0,0 +1,29 @@
+// { dg-do compile }
+// { dg-additional-options "-g" }
+
+class A
+{
+public:
+  virtual bool m_fn1 () const = 0;
+};
+class B
+{
+  const A *m_fn2 () const;
+};
+inline const A *
+B::m_fn2 () const
+{
+  class C : A
+  {
+    bool
+    m_fn1 () const
+    {
+    }
+    C () {}
+  };
+}
+void
+fn1 (A &p1)
+{
+  p1.m_fn1 ();
+}