aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2009-09-11 11:08:38 +0000
committerMichael Matz <matz@gcc.gnu.org>2009-09-11 11:08:38 +0000
commit5c3ec539b72e4e3aa01c760a62af3046f022f8be (patch)
treee8e3d3e8bd49092da5aef118d9211bdba4575e2c
parent0b7e34d7dd48aac05ea218b61c84e3a8561fbd77 (diff)
downloadgcc-5c3ec539b72e4e3aa01c760a62af3046f022f8be.zip
gcc-5c3ec539b72e4e3aa01c760a62af3046f022f8be.tar.gz
gcc-5c3ec539b72e4e3aa01c760a62af3046f022f8be.tar.bz2
re PR c++/41275 (ICE: expand_expr_real_1, at expr.c:8416)
PR middle-end/41275 * tree-inline.c (remap_decls): Don't put DECL_EXTERNAL decls on the local_decls list. testsuite/ * g++.dg/tree-ssa/pr41275.C: New test. From-SVN: r151631
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr41275.C16
-rw-r--r--gcc/tree-inline.c1
4 files changed, 28 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 45188ca..04d61c6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-09-11 Michael Matz <matz@suse.de>
+
+ PR middle-end/41275
+ * tree-inline.c (remap_decls): Don't put DECL_EXTERNAL decls
+ on the local_decls list.
+
2009-09-11 Alexandre Oliva <aoliva@redhat.com>
PR debug/41276
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 61ec4ab..2a0705a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-09-11 Michael Matz <matz@suse.de>
+
+ PR middle-end/41275
+ * g++.dg/tree-ssa/pr41275.C: New test.
+
2009-09-11 Janus Weil <janus@gcc.gnu.org>
PR fortran/41242
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr41275.C b/gcc/testsuite/g++.dg/tree-ssa/pr41275.C
new file mode 100644
index 0000000..d9b3dce
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr41275.C
@@ -0,0 +1,16 @@
+// PR middle-end/41275
+// { dg-do compile }
+// { dg-options "-O2" }
+// this used to ICE
+struct ErrmsgWindow
+{
+ virtual ~ErrmsgWindow()
+ {
+ extern int _switch_mode_errorstr;
+ _switch_mode_errorstr = 42;
+ }
+};
+void ShowErrorMessage(void)
+{
+ ErrmsgWindow w;
+}
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index fbd973b..b5e7346 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -536,6 +536,7 @@ remap_decls (tree decls, VEC(tree,gc) **nonlocalized_list, copy_body_data *id)
if (can_be_nonlocal (old_var, id))
{
if (TREE_CODE (old_var) == VAR_DECL
+ && ! DECL_EXTERNAL (old_var)
&& (var_ann (old_var) || !gimple_in_ssa_p (cfun)))
cfun->local_decls = tree_cons (NULL_TREE, old_var,
cfun->local_decls);