[Bug c++/81575] [7/8 Regression] ICE on C++ code: in cp_build_addr_expr_1, at cp/typeck.c:5793
mpolacek at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Mar 15 15:28:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81575
Marek Polacek <mpolacek at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |mpolacek at gcc dot gnu.org
--- Comment #5 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Since r246954 we treat array prvalues like class prvalues. So this
2054 if (!obvalue_p (exp)
2055 && ! (TREE_CODE (exp) == CONSTRUCTOR && TREE_STATIC (exp)))
2056 {
2057 if (complain & tf_error)
2058 error_at (loc, "invalid use of non-lvalue array");
2059 return error_mark_node;
2060 }
in decay_conversion no longer triggers because obvalue_p is now 1.
cp_build_addr_expr_1 says
If STRICT_LVALUE is true, require an lvalue; otherwise, allow xvalues
and class rvalues as well.
so I'm not sure if we should allow array rvalues too. If not then perhaps
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -5760,7 +5760,7 @@ build_nop (tree type, tree expr)
/* Take the address of ARG, whatever that means under C++ semantics.
If STRICT_LVALUE is true, require an lvalue; otherwise, allow xvalues
- and class rvalues as well.
+ and class and array rvalues as well.
Nothing should call this function directly; instead, callers should use
cp_build_addr_expr or cp_build_addr_expr_strict. */
@@ -5842,7 +5842,9 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue,
tsubst_flags_t complain)
&& TREE_CODE (argtype) != METHOD_TYPE)
{
cp_lvalue_kind kind = lvalue_kind (arg);
- if (kind == clk_none)
+ if (kind == clk_none
+ || (kind == clk_class
+ && TREE_CODE (argtype) == ARRAY_TYPE))
{
if (complain & tf_error)
lvalue_error (input_location, lv_addressof);
More information about the Gcc-bugs
mailing list