aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-10-12 14:37:53 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-10-12 14:37:53 +0000
commit0bfd099c35ab5e03bb51dcd237ba5fb82b500b86 (patch)
tree3df218c47dcb17cac62dbd5519e6d2e34b1c7b59 /gcc
parent05f1a54316f9516defe5ab54e0be66b1821596a1 (diff)
downloadgcc-0bfd099c35ab5e03bb51dcd237ba5fb82b500b86.zip
gcc-0bfd099c35ab5e03bb51dcd237ba5fb82b500b86.tar.gz
gcc-0bfd099c35ab5e03bb51dcd237ba5fb82b500b86.tar.bz2
re PR debug/77947 (ICE with -g and -O2 in strip_naming_typedef)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cgraphunit.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr77947.C29
4 files changed, 50 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e709adb..3fb6a77 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index abcb35d..4fa518d 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -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
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4a991d9..10a8e35 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..3c8a24a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr77947.C
@@ -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 ();
+}