diff options
author | Jason Merrill <jason@redhat.com> | 2016-04-13 10:33:53 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2016-04-13 10:33:53 -0400 |
commit | 9d4099343ab2eec82ddb4faff48b6e04fed5519c (patch) | |
tree | a9a0753642ddcbc20a4440f09087f54ed2af141c /gcc | |
parent | 75ca93ec9a9889766beae43555a4efbe73ddf52b (diff) | |
download | gcc-9d4099343ab2eec82ddb4faff48b6e04fed5519c.zip gcc-9d4099343ab2eec82ddb4faff48b6e04fed5519c.tar.gz gcc-9d4099343ab2eec82ddb4faff48b6e04fed5519c.tar.bz2 |
re PR c++/70615 (ICE on valid code at -O1 and above on x86_64-linux-gnu in add_expr, at tree.c:7870)
PR c++/70615
* cp-gimplify.c (cp_genericize_r): Expand PTRMEM_CST here.
(cp_gimplify_expr): Not here.
From-SVN: r234940
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/ptrmem7.C | 31 |
3 files changed, 44 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5696eea..71538ab 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-04-13 Jason Merrill <jason@redhat.com> + + PR c++/70615 + * cp-gimplify.c (cp_genericize_r): Expand PTRMEM_CST here. + (cp_gimplify_expr): Not here. + 2016-04-12 Patrick Palka <ppalka@gcc.gnu.org> PR c++/70610 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 13f7b7c..30ac660 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -576,11 +576,6 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) switch (code) { - case PTRMEM_CST: - *expr_p = cplus_expand_constant (*expr_p); - ret = GS_OK; - break; - case AGGR_INIT_EXPR: simplify_aggr_init_expr (expr_p); ret = GS_OK; @@ -1388,6 +1383,13 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) || TREE_CODE (stmt) == OMP_SIMD || TREE_CODE (stmt) == OMP_DISTRIBUTE) genericize_omp_for_stmt (stmt_p, walk_subtrees, data); + else if (TREE_CODE (stmt) == PTRMEM_CST) + { + /* By the time we get here we're handing off to the back end, so we don't + need or want to preserve PTRMEM_CST anymore. */ + *stmt_p = cplus_expand_constant (stmt); + *walk_subtrees = 0; + } else if ((flag_sanitize & (SANITIZE_NULL | SANITIZE_ALIGNMENT | SANITIZE_VPTR)) && !wtd->no_sanitize_p) diff --git a/gcc/testsuite/g++.dg/opt/ptrmem7.C b/gcc/testsuite/g++.dg/opt/ptrmem7.C new file mode 100644 index 0000000..7d9e9b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/ptrmem7.C @@ -0,0 +1,31 @@ +// PR c++/70615 +// { dg-options -O } + +struct C +{ + virtual void f () {} +}; + +struct B +{ + virtual ~B () {} +}; + +class D : public B, public C +{ +public: + D () {} +}; + +typedef void (C::*FP) (); +typedef void (D::*D_f) (); + +int +main () +{ + D *d = new D (); + C *c = d; + const FP fptr = (FP) & D::f; + (d->*(D_f) fptr) (); + return 0; +} |