https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94385

--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:1cb1986cb596336e688c079b821205ec212a46a3

commit r10-7464-g1cb1986cb596336e688c079b821205ec212a46a3
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Mon Mar 30 22:55:36 2020 +0200

    c++: Fix handling of internal fn calls in statement expressions [PR94385]

    The following testcase ICEs, because the FE when processing the statement
    expression changes the .VEC_CONVERT internal fn CALL_EXPR into .PHI call.
    That is because the internal fn call is recorded in the base.u.ifn
    field, which overlaps base.u.bits.lang_flag_1 which is used for
    STMT_IS_FULL_EXPR_P, so this essentially does ifn |= 2 on little-endian.
    STMT_IS_FULL_EXPR_P bit is used in:
    cp-gimplify.c-  if (STATEMENT_CODE_P (code))
    cp-gimplify.c-    {
    cp-gimplify.c-      saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p
();
    cp-gimplify.c-      current_stmt_tree ()->stmts_are_full_exprs_p
    cp-gimplify.c:        = STMT_IS_FULL_EXPR_P (*expr_p);
    cp-gimplify.c-    }
    and
    pt.c-  if (STATEMENT_CODE_P (TREE_CODE (t)))
    pt.c:    current_stmt_tree ()->stmts_are_full_exprs_p = STMT_IS_FULL_EXPR_P
(t);
    so besides being wrong on some other codes, it actually isn't beneficial at
    all to set it on anything else, so the following patch restricts it to
    trees with STATEMENT_CODE_P TREE_CODE.

    2020-03-30  Jakub Jelinek  <ja...@redhat.com>

            PR c++/94385
            * semantics.c (add_stmt): Only set STMT_IS_FULL_EXPR_P on trees
with
            STATEMENT_CODE_P code.

            * c-c++-common/pr94385.c: New test.

Reply via email to