From: Jason Merrill Date: Thu, 30 Jan 2014 14:18:15 +0000 (-0500) Subject: re PR c++/59645 (ICE with covariant return and volatile) X-Git-Tag: releases/gcc-4.9.0~1223 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fc044323f492ebb6913398604104f293df99dbe3;p=thirdparty%2Fgcc.git re PR c++/59645 (ICE with covariant return and volatile) PR c++/59645 * cgraphunit.c (expand_thunk): Copy volatile arg to a temporary. From-SVN: r207301 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b908dc08340d..e259b5730ed1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-01-30 Jason Merrill + + PR c++/59645 + * cgraphunit.c (expand_thunk): Copy volatile arg to a temporary. + 2014-01-30 Richard Biener PR tree-optimization/59951 diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index d22265a9a3f7..06283fc3f640 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -1592,7 +1592,17 @@ expand_thunk (struct cgraph_node *node, bool output_asm_thunks) if (nargs) for (i = 1, arg = DECL_CHAIN (a); i < nargs; i++, arg = DECL_CHAIN (arg)) - vargs.quick_push (arg); + { + tree tmp = arg; + if (!is_gimple_val (arg)) + { + tmp = create_tmp_reg (TYPE_MAIN_VARIANT + (TREE_TYPE (arg)), "arg"); + gimple stmt = gimple_build_assign (tmp, arg); + gsi_insert_after (&bsi, stmt, GSI_NEW_STMT); + } + vargs.quick_push (tmp); + } call = gimple_build_call_vec (build_fold_addr_expr_loc (0, alias), vargs); node->callees->call_stmt = call; gimple_call_set_from_thunk (call, true); diff --git a/gcc/testsuite/g++.dg/inherit/covariant21.C b/gcc/testsuite/g++.dg/inherit/covariant21.C new file mode 100644 index 000000000000..42cdf8700811 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/covariant21.C @@ -0,0 +1,17 @@ +// PR c++/59645 + +struct A { virtual ~A(); }; +struct B { virtual ~B(); }; +struct C : A, B {}; + +struct X +{ + virtual B* foo(volatile int); +}; + +struct Y : X +{ + virtual C* foo(volatile int); +}; + +C* Y::foo(volatile int) { return 0; }