c++: lvalue_kind tweak

I was wondering how lvalue_kind handles VIEW_CONVERT_EXPR; in cases where
the type actually changes, it should have the same prvalue->xvalue effect as
ARRAY_REF, since we need to materialize a temporary to get an object we can
reinterpret as another type.

Currently this only fires on builtin-shufflevector-3.c, where we use
VIEW_CONVERT_EXPR to reinterpret a vector as an array.

REALPART_EXPR and IMAGPART_EXPR should also be treated like COMPONENT_REF.
PREINCREMENT_EXPR and PREDECREMENT_EXPR should only be applied to glvalues,
but if for some reason they were applied to a prvalue this would be correct.
TRY_CATCH_EXPR around a prvalue is also questionable, but this is the right
handling.

gcc/cp/ChangeLog:

	* tree.cc (lvalue_kind) [VIEW_CONVERT_EXPR]: Change prvalue to
	xvalue.
This commit is contained in:
Jason Merrill 2022-10-03 17:16:38 -04:00
parent 7d935cdd1a
commit 49192c41de

View File

@ -104,7 +104,17 @@ lvalue_kind (const_tree ref)
case REALPART_EXPR:
case IMAGPART_EXPR:
case VIEW_CONVERT_EXPR:
return lvalue_kind (TREE_OPERAND (ref, 0));
op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0));
/* As for ARRAY_REF and COMPONENT_REF, these codes turn a class prvalue
into an xvalue: we need to materialize the temporary before we mess
with it. Except VIEW_CONVERT_EXPR that doesn't actually change the
type, as in location wrapper and REF_PARENTHESIZED_P. */
if (op1_lvalue_kind == clk_class
&& !(TREE_CODE (ref) == VIEW_CONVERT_EXPR
&& (same_type_ignoring_top_level_qualifiers_p
(TREE_TYPE (ref), TREE_TYPE (TREE_OPERAND (ref, 0))))))
return clk_rvalueref;
return op1_lvalue_kind;
case ARRAY_REF:
{