OSDN Git Service

PR middle-end/41275
authormatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Sep 2009 11:08:38 +0000 (11:08 +0000)
committermatz <matz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Sep 2009 11:08:38 +0000 (11:08 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151631 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr41275.C [new file with mode: 0644]
gcc/tree-inline.c

index 45188ca..04d61c6 100644 (file)
@@ -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
index 61ec4ab..2a0705a 100644 (file)
@@ -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 (file)
index 0000000..d9b3dce
--- /dev/null
@@ -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;
+}
index fbd973b..b5e7346 100644 (file)
@@ -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);