From: jakub Date: Mon, 18 Jul 2016 18:43:19 +0000 (+0000) Subject: PR c++/71828 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6fe424c2928bd86f0d55767fd785c65831a82c53;p=thirdparty%2Fgcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@238442 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 899b2aeb6567..87d666e4930b 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 cb8ece0773fe..91d14a55b4ff 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 060fcebbf017..ff3e33573535 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 000000000000..b74cde965ff8 --- /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, "");