diff options
author | Richard Biener <rguenther@suse.de> | 2016-10-12 14:37:53 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-10-12 14:37:53 +0000 |
commit | 0bfd099c35ab5e03bb51dcd237ba5fb82b500b86 (patch) | |
tree | 3df218c47dcb17cac62dbd5519e6d2e34b1c7b59 /gcc | |
parent | 05f1a54316f9516defe5ab54e0be66b1821596a1 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr77947.C | 29 |
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 (); +} |