re PR c++/28139 (alias information for EH is wrong)
authorJ"orn Rennecke <joern.rennecke@st.com>
Tue, 29 Aug 2006 14:34:36 +0000 (14:34 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Tue, 29 Aug 2006 14:34:36 +0000 (15:34 +0100)
cp:
PR c++/28139
* except.c (expand_start_catch_block): Use correct types for bitwise
copy.
testsuite:
PR c++/28139
* g++.dg/eh/alias1.C: New test.

From-SVN: r116561

gcc/cp/ChangeLog
gcc/cp/except.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/eh/alias1.C [new file with mode: 0644]

index 84c02edf5f0541ae5adf6b3c570c6c85e924965d..3774c14d33df42f40556ffdf697046d982fc5704 100644 (file)
@@ -1,3 +1,9 @@
+2006-08-29  J"orn Rennecke  <joern.rennecke@st.com>
+
+       PR c++/28139
+       * except.c (expand_start_catch_block): Use correct types for bitwise
+       copy.
+
 2006-08-28  Jason Merrill  <jason@redhat.com>
 
        PR c++/26670
index 71b433f1560357d096d57cdc5642fcd68ddfecc6..ad493aa389ca782971319e2e8f2e1066c16c1091 100644 (file)
@@ -458,7 +458,14 @@ expand_start_catch_block (tree decl)
   else
     {
       tree init = do_begin_catch ();
-      exp = create_temporary_var (ptr_type_node);
+      tree init_type = type;
+
+      /* Pointers are passed by values, everything else by reference.  */
+      if (!TYPE_PTR_P (type))
+       init_type = build_pointer_type (type);
+      if (init_type != TREE_TYPE (init))
+       init = build1 (NOP_EXPR, init_type, init);
+      exp = create_temporary_var (init_type);
       DECL_REGISTER (exp) = 1;
       cp_finish_decl (exp, init, /*init_const_expr=*/false,
                      NULL_TREE, LOOKUP_ONLYCONVERTING);
index 6e2043195bcb4c6bd28033985b1ce584bdd53347..21eba05b7d453c8ddc1edac3a49d8c616d7a9892 100644 (file)
@@ -1,3 +1,8 @@
+2006-08-29  J"orn Rennecke  <joern.rennecke@st.com>
+
+       PR c++/28139
+       * g++.dg/eh/alias1.C: New test.
+
 2006-08-28  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
 
        PR c++/28860
diff --git a/gcc/testsuite/g++.dg/eh/alias1.C b/gcc/testsuite/g++.dg/eh/alias1.C
new file mode 100644 (file)
index 0000000..f9c6cb7
--- /dev/null
@@ -0,0 +1,42 @@
+// { dg-do run }
+// { dg-options "-O3" }
+/* PR c++/28139: disjoint alias sets for the store from
+   expand_start_catch_block than for loading P result in P being loaded
+   before it is initialized for sh-elf.  */
+
+extern "C" {
+void exit (int) __attribute__ ((noreturn));
+}
+
+int i_glob = 42;
+int *p0 = &i_glob;
+typedef int **ipp;
+
+void
+g (int i)
+{
+  if (!i_glob)
+    exit ((int)(long long) &i);
+}
+
+static void
+h ()
+{
+  throw &p0;
+}
+
+int
+main()
+{
+  g (42);
+  try
+    {
+     h ();
+    }
+  catch (const ipp &p)
+    {
+      if (**p != 42)
+       exit (1);
+    }
+  return 0;
+}