]> gcc.gnu.org Git - gcc.git/commit
c++: lvalueness of non-dependent assignment expr [PR114994]
authorPatrick Palka <ppalka@redhat.com>
Wed, 15 May 2024 02:55:16 +0000 (22:55 -0400)
committerPatrick Palka <ppalka@redhat.com>
Wed, 15 May 2024 02:55:16 +0000 (22:55 -0400)
commitc6cc6d4741a880109c4e0e64d5a189687fb526f6
tree9498d88c819c00302bf8371a7d341f722090ff81
parent32ff344d57d56fddb66c4976b5651345d40b7157
c++: lvalueness of non-dependent assignment expr [PR114994]

r14-4111-g6e92a6a2a72d3b made us check non-dependent simple assignment
expressions ahead of time and give them a type, as was already done for
compound assignments.  Unlike for compound assignments however, if a
simple assignment resolves to an operator overload we represent it as a
(typed) MODOP_EXPR instead of a CALL_EXPR to the selected overload.
(I reckoned this was at worst a pessimization -- we'll just have to repeat
overload resolution at instantiatiation time.)

But this turns out to break the below testcase ultimately because
MODOP_EXPR (of non-reference type) is always treated as an lvalue
according to lvalue_kind, which is incorrect for the MODOP_EXPR
representing x=42.

We can fix this by representing such class assignment expressions as
CALL_EXPRs as well, but this turns out to require some tweaking of our
-Wparentheses warning logic and may introduce other fallout making it
unsuitable for backporting.

So this patch instead fixes lvalue_kind to consider the type of a
MODOP_EXPR representing a class assignment.

PR c++/114994

gcc/cp/ChangeLog:

* tree.cc (lvalue_kind) <case MODOP_EXPR>: For a class
assignment, consider the result type.

gcc/testsuite/ChangeLog:

* g++.dg/template/non-dependent32.C: New test.

Reviewed-by: Jason Merrill <jason@redhat.com>
gcc/cp/tree.cc
gcc/testsuite/g++.dg/template/non-dependent32.C [new file with mode: 0644]
This page took 0.062146 seconds and 5 git commands to generate.