diff options
author | Richard Sandiford <rsandifo@redhat.com> | 2001-06-19 13:32:57 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2001-06-19 09:32:57 -0400 |
commit | c93586fa83db51294b3c51afb48f4257889813c6 (patch) | |
tree | 48b0614bf523c8f7d3db4688d1f9c30f28e5b134 | |
parent | a0d4ddde2c0436823cea3c68af73127f624b15ca (diff) | |
download | gcc-c93586fa83db51294b3c51afb48f4257889813c6.zip gcc-c93586fa83db51294b3c51afb48f4257889813c6.tar.gz gcc-c93586fa83db51294b3c51afb48f4257889813c6.tar.bz2 |
except.c (initialize_handler_parm): Expect __cxa_begin_catch to return pointers to data members by reference rather...
* except.c (initialize_handler_parm): Expect __cxa_begin_catch to
return pointers to data members by reference rather than by value.
From-SVN: r43456
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/except.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.eh/ptrmem1.C | 15 |
3 files changed, 23 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9964325..ea5de13 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2001-06-19 Richard Sandiford <rsandifo@redhat.com> + + * except.c (initialize_handler_parm): Expect __cxa_begin_catch to + return pointers to data members by reference rather than by value. + 2001-06-18 Jason Merrill <jason_merrill@redhat.com> Implement the Named Return Value optimization. diff --git a/gcc/cp/except.c b/gcc/cp/except.c index 458590a..46ffd6e 100644 --- a/gcc/cp/except.c +++ b/gcc/cp/except.c @@ -348,7 +348,7 @@ initialize_handler_parm (decl, exp) adjusted by value from __cxa_begin_catch. Others are returned by reference. */ init_type = TREE_TYPE (decl); - if (TREE_CODE (init_type) != POINTER_TYPE + if (! TYPE_PTR_P (init_type) && TREE_CODE (init_type) != REFERENCE_TYPE) init_type = build_reference_type (init_type); @@ -357,8 +357,8 @@ initialize_handler_parm (decl, exp) /* Since pointers are passed by value, initialize a reference to pointer catch parm with the address of the temporary. */ - if (TREE_CODE (init_type) == REFERENCE_TYPE - && TREE_CODE (TREE_TYPE (init_type)) == POINTER_TYPE) + if (TREE_CODE (init_type) == REFERENCE_TYPE + && TYPE_PTR_P (TREE_TYPE (init_type))) exp = build_unary_op (ADDR_EXPR, exp, 1); exp = ocp_convert (init_type, exp, CONV_IMPLICIT|CONV_FORCE_TEMP, 0); diff --git a/gcc/testsuite/g++.old-deja/g++.eh/ptrmem1.C b/gcc/testsuite/g++.old-deja/g++.eh/ptrmem1.C new file mode 100644 index 0000000..ba70612 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.eh/ptrmem1.C @@ -0,0 +1,15 @@ +extern "C" void exit (int); +extern "C" void abort (void); +struct A { int i; }; +int main () +{ + try { throw &A::i; } + catch (int A::*p) + { + if (p == &A::i) + exit (0); + else + abort (); + } + abort (); +} |