aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-01-30 09:18:15 -0500
committerJason Merrill <jason@gcc.gnu.org>2014-01-30 09:18:15 -0500
commitfc044323f492ebb6913398604104f293df99dbe3 (patch)
treefa4e766c386e0ae155b7f49aed393f4edd58e4f4
parentfa337f3ae5fb8c4c3631345e65ec8c75cb40ab69 (diff)
downloadgcc-fc044323f492ebb6913398604104f293df99dbe3.zip
gcc-fc044323f492ebb6913398604104f293df99dbe3.tar.gz
gcc-fc044323f492ebb6913398604104f293df99dbe3.tar.bz2
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cgraphunit.c12
-rw-r--r--gcc/testsuite/g++.dg/inherit/covariant21.C17
3 files changed, 33 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b908dc0..e259b57 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-01-30 Jason Merrill <jason@redhat.com>
+
+ PR c++/59645
+ * cgraphunit.c (expand_thunk): Copy volatile arg to a temporary.
+
2014-01-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/59951
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index d22265a..06283fc 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 0000000..42cdf87
--- /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; }