aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-03-17 13:43:01 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-03-17 13:43:01 +0000
commit6931b3b79d8fac15931a16d09150543af2a832d3 (patch)
tree194b9801f920bc05c55e2cf25d1427a0014f9467
parent9bc057c8da4c460ffd067e5202d399fce6c8cbee (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/dwarf2out.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/debug/pr70271.C36
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) { });
+}