From 664beaf2c19148677cc26c0fd6beaf2e56d2b6f3 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 21 Feb 2017 18:48:57 +0100 Subject: [PATCH] re PR c++/79639 (ICE with -O and constexpr) PR c++/79639 * constexpr.c (cxx_eval_store_expression): If *valp is a PTRMEM_CST, call cplus_expand_constant on it first. * g++.dg/cpp1y/constexpr-79639.C: New test. From-SVN: r245635 --- gcc/cp/ChangeLog | 6 +++++ gcc/cp/constexpr.c | 9 ++++--- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/cpp1y/constexpr-79639.C | 27 ++++++++++++++++++++ 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/constexpr-79639.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 385c509fb97..26ead8ac6c6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2017-02-21 Jakub Jelinek + + PR c++/79639 + * constexpr.c (cxx_eval_store_expression): If *valp is a PTRMEM_CST, + call cplus_expand_constant on it first. + 2017-02-19 Jason Merrill PR c++/78139 - destructor needed by new-expression diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index fc7d46cc2eb..14af617f2a8 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -3517,11 +3517,12 @@ cxx_eval_store_expression (const constexpr_ctx *ctx, tree t, wants to modify it. */ if (*valp == NULL_TREE) { - *valp = new_ctx.ctor = build_constructor (type, NULL); - CONSTRUCTOR_NO_IMPLICIT_ZERO (new_ctx.ctor) = no_zero_init; + *valp = build_constructor (type, NULL); + CONSTRUCTOR_NO_IMPLICIT_ZERO (*valp) = no_zero_init; } - else - new_ctx.ctor = *valp; + else if (TREE_CODE (*valp) == PTRMEM_CST) + *valp = cplus_expand_constant (*valp); + new_ctx.ctor = *valp; new_ctx.object = target; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 02e4dec4cec..342f23f3d91 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2017-02-21 Jakub Jelinek + PR c++/79639 + * g++.dg/cpp1y/constexpr-79639.C: New test. + PR target/79633 * gcc.target/i386/mpx/pr79633.c: New test. diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-79639.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-79639.C new file mode 100644 index 00000000000..03e6b8466f2 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-79639.C @@ -0,0 +1,27 @@ +// PR c++/79639 +// { dg-do compile { target c++14 } } + +struct A +{ + void foo () {} + void bar () {} +}; +typedef void (A::*T) (); + +constexpr T +foo (T f) +{ + f = 0; + return f; +} + +constexpr T +bar (T f) +{ + f = &A::bar; + return f; +} + +constexpr T a = foo (&A::foo); +constexpr T b = foo (&A::foo); +static_assert (a == nullptr, ""); -- 2.30.2