From: Jakub Jelinek Date: Mon, 18 Jul 2016 18:43:19 +0000 (+0200) Subject: re PR c++/71828 (ICE on valid C++11 code with constexpr __Complex int variable declar... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=87713c6a507659921278d32b66f2e344b7c4d124;p=gcc.git re PR c++/71828 (ICE on valid C++11 code with constexpr __Complex int variable declaration: in operand_equal_p, at fold-const.c:2790) PR c++/71828 * constexpr.c (cxx_eval_constant_expression) : For lval don't use cxx_eval_unary_expression and instead recurse and if needed rebuild the reference. * g++.dg/cpp0x/constexpr-71828.C: New test. From-SVN: r238442 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 899b2aeb656..87d666e4930 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2016-07-18 Jakub Jelinek + PR c++/71828 + * constexpr.c (cxx_eval_constant_expression) : + For lval don't use cxx_eval_unary_expression and instead recurse + and if needed rebuild the reference. + PR c++/71826 * pt.c (tsubst_baselink): Only set BASELINK_OPTYPE for BASELINK_P. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index cb8ece0773f..91d14a55b4f 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -3800,6 +3800,19 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, case REALPART_EXPR: case IMAGPART_EXPR: + if (lval) + { + r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), lval, + non_constant_p, overflow_p); + if (r == error_mark_node) + ; + else if (r == TREE_OPERAND (t, 0)) + r = t; + else + r = fold_build1 (TREE_CODE (t), TREE_TYPE (t), r); + break; + } + /* FALLTHRU */ case CONJ_EXPR: case FIX_TRUNC_EXPR: case FLOAT_EXPR: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 060fcebbf01..ff3e3357353 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2016-07-18 Jakub Jelinek + PR c++/71828 + * g++.dg/cpp0x/constexpr-71828.C: New test. + PR c++/71826 * g++.dg/template/pr71826.C: New test. diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C new file mode 100644 index 00000000000..b74cde965ff --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C @@ -0,0 +1,5 @@ +// PR c++/71828 +// { dg-do compile { target c++11 } } + +constexpr _Complex int a { 1, 2 }; +static_assert (& __imag a != &__real a, "");