From 5b009a96700d1fd628febdf34e3d6af54bf6b4d8 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 30 Nov 2005 15:58:27 -0500 Subject: [PATCH] re PR c++/21123 (ICE in cp_expr_size, at cp/cp-objcp-common.c:101) PR c++/21123 * cp-gimplify.c (cp_genericize_r): Don't dereference invisible reference parms in a thunk. From-SVN: r107738 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/cp-gimplify.c | 5 ++++- gcc/testsuite/g++.dg/inherit/thunk5.C | 22 ++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/inherit/thunk5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5d2cc80c085..dcd0d3fe8bc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-11-30 Jason Merrill + + PR c++/21123 + * cp-gimplify.c (cp_genericize_r): Don't dereference invisible reference + parms in a thunk. + 2005-11-30 Ben Elliston * typeck.c (build_x_unary_op): Correct spelling in error message. diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index a4d59f563fc..aa7174688de 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -596,7 +596,10 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) tree stmt = *stmt_p; struct pointer_set_t *p_set = (struct pointer_set_t*) data; - if (is_invisiref_parm (stmt)) + if (is_invisiref_parm (stmt) + /* Don't dereference parms in a thunk, pass the references through. */ + && !(DECL_THUNK_P (current_function_decl) + && TREE_CODE (stmt) == PARM_DECL)) { *stmt_p = convert_from_reference (stmt); *walk_subtrees = 0; diff --git a/gcc/testsuite/g++.dg/inherit/thunk5.C b/gcc/testsuite/g++.dg/inherit/thunk5.C new file mode 100644 index 00000000000..05dba36383d --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/thunk5.C @@ -0,0 +1,22 @@ +// PR c++/21123 + +struct A +{ + A(const A &a); + const A& operator=(const A& a); +}; + +struct B +{ + virtual A f(A); +}; + +struct C : virtual B +{ + virtual A f(A); +}; + +A C::f(A a) +{ + return a; +}