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

--- Comment #6 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-10 branch has been updated by Marek Polacek
<mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:f0f62557c3de0313673d7c0527277e86231ee95b

commit r10-9684-gf0f62557c3de0313673d7c0527277e86231ee95b
Author: Marek Polacek <pola...@redhat.com>
Date:   Wed Feb 3 17:57:22 2021 -0500

    c++: Fix bogus -Wvolatile warning in C++20 [PR98947]

    Since most of volatile is deprecated in C++20, we are required to warn
    for compound assignments to volatile variables and so on.  But here we
    have

      volatile int x, y, z;
      (b ? x : y) = 1;

    and we shouldn't warn, because simple assignments like x = 24; should
    not provoke the warning when they are a discarded-value expression.

    We warn here because when ?: is used as an lvalue, we transform it in
    cp_build_modify_expr/COND_EXPR from (a ? b : c) = rhs to

      (a ? (b = rhs) : (c = rhs))

    and build_conditional_expr then calls mark_lvalue_use for the new
    artificial assignments, which then evokes the warning.  The calls
    to mark_lvalue_use were added in r160289 to suppress warnings in
    Wunused-var-10.c, but looks like they're no longer needed.

    To warn on

        (b ? (x = 2) : y) = 1;
        (b ? x : (y = 5)) = 1;

    I've tweaked a check in mark_use/MODIFY_EXPR.

    I'd argue this is a regression because GCC 9 doesn't warn.

    gcc/cp/ChangeLog:

            PR c++/98947
            * call.c (build_conditional_expr_1): Don't call mark_lvalue_use
            on arg2/arg3.
            * expr.c (mark_use) <case MODIFY_EXPR>: Don't check read_p when
            issuing the -Wvolatile warning.  Only set TREE_THIS_VOLATILE if
            a warning was emitted.

    gcc/testsuite/ChangeLog:

            PR c++/98947
            * g++.dg/cpp2a/volatile5.C: New test.

    (cherry picked from commit 7a18bc4ae62081021f4fd90d591a588cac931f77)

Reply via email to