OSDN Git Service

cp:
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Aug 2006 14:34:36 +0000 (14:34 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Aug 2006 14:34:36 +0000 (14:34 +0000)
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.

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

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

index 84c02ed..3774c14 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 71b433f..ad493aa 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 6e20431..21eba05 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;
+}