PR c++/86485 - -Wmaybe-unused with empty class ?:
authorJason Merrill <jason@redhat.com>
Tue, 7 May 2019 22:37:19 +0000 (18:37 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 7 May 2019 22:37:19 +0000 (18:37 -0400)
* typeck.c (build_static_cast_1): Use cp_build_addr_expr.

For GCC 9 I fixed this bug with a patch to gimplify_cond_expr, but this
function was also doing the wrong thing.

Using build_address does not push the ADDR_EXPR down into the arms of a
COND_EXPR, which we need for proper handling of conversion of an lvalue ?:
to another reference type.

From-SVN: r270985

gcc/cp/ChangeLog
gcc/cp/typeck.c

index bd0914b8ffad89703764272973e2a057ecf27a4b..d90cc099767d3708701f0d4263c57d4cf637472a 100644 (file)
@@ -1,5 +1,8 @@
 2019-05-07  Jason Merrill  <jason@redhat.com>
 
+       PR c++/86485 - -Wmaybe-unused with empty class ?:
+       * typeck.c (build_static_cast_1): Use cp_build_addr_expr.
+
        * pt.c (type_dependent_expression_p): A non-type template parm with
        a placeholder type is type-dependent.
 
index c107a321949bd6eeab484ac7836a89a9323fd7a9..f039a3b3eb0e2d323394f447a2c919b3d274e2fc 100644 (file)
@@ -5916,7 +5916,8 @@ condition_conversion (tree expr)
 }
 
 /* Returns the address of T.  This function will fold away
-   ADDR_EXPR of INDIRECT_REF.  */
+   ADDR_EXPR of INDIRECT_REF.  This is only for low-level usage;
+   most places should use cp_build_addr_expr instead.  */
 
 tree
 build_address (tree t)
@@ -7114,7 +7115,7 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
       base = lookup_base (TREE_TYPE (type), intype,
                          c_cast_p ? ba_unique : ba_check,
                          NULL, complain);
-      expr = build_address (expr);
+      expr = cp_build_addr_expr (expr, complain);
 
       if (sanitize_flags_p (SANITIZE_VPTR))
        {