re PR c++/28139 (alias information for EH is wrong)

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
This commit is contained in:
J"orn Rennecke 2006-08-29 14:34:36 +00:00 committed by Joern Rennecke
parent a3b6119721
commit 2de9107ad5
4 changed files with 61 additions and 1 deletions

View 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> 2006-08-28 Jason Merrill <jason@redhat.com>
PR c++/26670 PR c++/26670

View File

@ -458,7 +458,14 @@ expand_start_catch_block (tree decl)
else else
{ {
tree init = do_begin_catch (); 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; DECL_REGISTER (exp) = 1;
cp_finish_decl (exp, init, /*init_const_expr=*/false, cp_finish_decl (exp, init, /*init_const_expr=*/false,
NULL_TREE, LOOKUP_ONLYCONVERTING); NULL_TREE, LOOKUP_ONLYCONVERTING);

View 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> 2006-08-28 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/28860 PR c++/28860

View File

@ -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;
}