diff options
author | Jason Merrill <jason@redhat.com> | 2005-11-08 03:32:26 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2005-11-08 03:32:26 -0500 |
commit | 831d8bd74194144ed86d9569a7b0d5447ba4452a (patch) | |
tree | 808a0ca6b00e83bccc17095bf03842c6f8042886 /gcc | |
parent | dfea1f6121293f7ddccc8a599ee4a70cf7a06ab7 (diff) | |
download | gcc-831d8bd74194144ed86d9569a7b0d5447ba4452a.zip gcc-831d8bd74194144ed86d9569a7b0d5447ba4452a.tar.gz gcc-831d8bd74194144ed86d9569a7b0d5447ba4452a.tar.bz2 |
re PR c++/21123 (ICE in cp_expr_size, at cp/cp-objcp-common.c:101)
PR c++/21123
* cp/method.c (use_thunk): Use build_cplus_new instead of
force_target_expr.
* tree.h (CALL_FROM_THUNK_P): Add CALL_EXPR_CHECK.
From-SVN: r106634
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/method.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/inherit/thunk4.C | 23 | ||||
-rw-r--r-- | gcc/tree.h | 2 |
5 files changed, 36 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1e22fd3..bd9a3e0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2005-11-08 Jason Merrill <jason@redhat.com> + + * tree.h (CALL_FROM_THUNK_P): Add CALL_EXPR_CHECK. + 2005-11-08 Uros Bizjak <uros@kss-loka.si> PR target/19340 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3d2f36e..1b2d166 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-11-08 Jason Merrill <jason@redhat.com> + + PR c++/21123 + * method.c (use_thunk): Use build_cplus_new instead of + force_target_expr. + 2005-11-06 Jason Merrill <jason@redhat.com> James A. Morrison <phython@gcc.gnu.org> diff --git a/gcc/cp/method.c b/gcc/cp/method.c index d68423c..67e42ea 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -502,7 +502,8 @@ use_thunk (tree thunk_fndecl, bool emit_p) t = build3 (COND_EXPR, TREE_TYPE (t), cond, t, cp_convert (TREE_TYPE (t), integer_zero_node)); } - t = force_target_expr (TREE_TYPE (t), t); + if (IS_AGGR_TYPE (TREE_TYPE (t))) + t = build_cplus_new (TREE_TYPE (t), t); finish_return_stmt (t); } diff --git a/gcc/testsuite/g++.dg/inherit/thunk4.C b/gcc/testsuite/g++.dg/inherit/thunk4.C new file mode 100644 index 0000000..a6e913e --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk4.C @@ -0,0 +1,23 @@ +// PR c++/21123 + +struct A +{ + A( const A &a); + const A& operator=( const A& a); +}; + +struct B +{ + virtual A f(); +}; + +struct C : virtual B +{ + virtual A f(); + A a; +}; + +A C::f() +{ + return a; +} @@ -1023,7 +1023,7 @@ extern void tree_operand_check_failed (int, enum tree_code, /* In a CALL_EXPR, means that the call is the jump from a thunk to the thunked-to function. */ -#define CALL_FROM_THUNK_P(NODE) ((NODE)->common.protected_flag) +#define CALL_FROM_THUNK_P(NODE) (CALL_EXPR_CHECK (NODE)->common.protected_flag) /* In a type, nonzero means that all objects of the type are guaranteed by the language or front-end to be properly aligned, so we can indicate that a MEM |