From 87713c6a507659921278d32b66f2e344b7c4d124 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 18 Jul 2016 20:43:19 +0200 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/constexpr.c | 13 +++++++++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C | 5 +++++ 4 files changed, 26 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-71828.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 899b2ae..87d666e 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 cb8ece0..91d14a5 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 060fceb..ff3e335 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 0000000..b74cde9 --- /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, ""); -- 2.7.4