diff options
author | Richard Biener <rguenther@suse.de> | 2016-03-17 13:43:01 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-03-17 13:43:01 +0000 |
commit | 6931b3b79d8fac15931a16d09150543af2a832d3 (patch) | |
tree | 194b9801f920bc05c55e2cf25d1427a0014f9467 | |
parent | 9bc057c8da4c460ffd067e5202d399fce6c8cbee (diff) | |
download | gcc-6931b3b79d8fac15931a16d09150543af2a832d3.zip gcc-6931b3b79d8fac15931a16d09150543af2a832d3.tar.gz gcc-6931b3b79d8fac15931a16d09150543af2a832d3.tar.bz2 |
re PR debug/70271 (internal compiler error: in dwarf2out_finish, at dwarf2out.c:27346)
2016-03-17 Richard Biener <rguenther@suse.de>
PR debug/70271
* dwarf2out.c (dwarf2out_early_finish): Process deferred_asm_name
last.
* g++.dg/debug/pr70271.C: New testcase.
From-SVN: r234289
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/debug/pr70271.C | 36 |
4 files changed, 54 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3edfba0..a573275 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-03-17 Richard Biener <rguenther@suse.de> + + PR debug/70271 + * dwarf2out.c (dwarf2out_early_finish): Process deferred_asm_name + last. + 2016-03-17 Jakub Jelinek <jakub@redhat.com> PR target/70245 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 61bf267..0bbff87 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -27686,10 +27686,15 @@ dwarf2out_finish (const char *filename) static void dwarf2out_early_finish (void) { - limbo_die_node *node; + /* The point here is to flush out the limbo list so that it is empty + and we don't need to stream it for LTO. */ + flush_limbo_die_list (); + + gen_scheduled_generic_parms_dies (); + gen_remaining_tmpl_value_param_die_attribute (); /* Add DW_AT_linkage_name for all deferred DIEs. */ - for (node = deferred_asm_name; node; node = node->next) + for (limbo_die_node *node = deferred_asm_name; node; node = node->next) { tree decl = node->created_for; if (DECL_ASSEMBLER_NAME (decl) != DECL_NAME (decl) @@ -27703,13 +27708,6 @@ dwarf2out_early_finish (void) } } deferred_asm_name = NULL; - - /* The point here is to flush out the limbo list so that it is empty - and we don't need to stream it for LTO. */ - flush_limbo_die_list (); - - gen_scheduled_generic_parms_dies (); - gen_remaining_tmpl_value_param_die_attribute (); } /* Reset all state within dwarf2out.c so that we can rerun the compiler diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d305b0f..b0bdc24 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-03-17 Richard Biener <rguenther@suse.de> + + PR debug/70271 + * g++.dg/debug/pr70271.C: New testcase. + 2016-03-17 Ilya Enkovich <enkovich.gnu@gmail.com> * gcc.target/i386/pr70251.c: New test. diff --git a/gcc/testsuite/g++.dg/debug/pr70271.C b/gcc/testsuite/g++.dg/debug/pr70271.C new file mode 100644 index 0000000..3c96d3a --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr70271.C @@ -0,0 +1,36 @@ +// { dg-do compile } + +template <typename Function> +struct function_traits +: public function_traits<decltype(&Function::operator())> +{ }; + +template <typename ClassType, typename ReturnType, typename... Args> +struct function_traits<ReturnType(ClassType::*)(Args...) const> +{ + typedef ReturnType (*pointer)(Args...); + typedef ReturnType return_type; +}; + +template <typename Function> +typename function_traits<Function>::pointer +FunctionPointer (const Function& lambda) +{ + return static_cast<typename function_traits<Function>::pointer>(lambda); +} + +template <typename Function> +typename function_traits<Function>::return_type +GetReturnValue (Function func) +{ + typename function_traits<Function>::return_type *dummy; + return *dummy; +} +template <typename T> class ClassFoo {}; +template <typename T> void FuncBar () { } + +template <> inline void FuncBar<double> () +{ + typedef void (*func_type)(ClassFoo<double> &); + func_type f1 = FunctionPointer ([](ClassFoo<double> & ref) { }); +} |