Avoid constexpr garbage for implicit conversion to void.
authorJason Merrill <jason@redhat.com>
Fri, 7 Jun 2019 21:08:26 +0000 (17:08 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 7 Jun 2019 21:08:26 +0000 (17:08 -0400)
* constexpr.c (cxx_eval_constant_expression): Call
STRIP_ANY_LOCATION_WRAPPER early.
[CONVERT_EXPR]: Don't build anything for conversion to void.
[ADDR_EXPR]: ggc_free unused ADDR_EXPR.

From-SVN: r272054

gcc/cp/ChangeLog
gcc/cp/constexpr.c

index 1489238..c072040 100644 (file)
@@ -1,3 +1,10 @@
+2019-06-07  Jason Merrill  <jason@redhat.com>
+
+       * constexpr.c (cxx_eval_constant_expression): Call
+       STRIP_ANY_LOCATION_WRAPPER early.
+       [CONVERT_EXPR]: Don't build anything for conversion to void.
+       [ADDR_EXPR]: ggc_free unused ADDR_EXPR.
+
 2019-06-05  Martin Sebor  <msebor@redhat.com>
 
        PR c/90737
index 15bfb6d..10afc41 100644 (file)
@@ -4382,9 +4382,6 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
                              bool *non_constant_p, bool *overflow_p,
                              tree *jump_target /* = NULL */)
 {
-  constexpr_ctx new_ctx;
-  tree r = t;
-
   if (jump_target && *jump_target)
     {
       /* If we are jumping, ignore all statements/expressions except those
@@ -4415,6 +4412,9 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
       *non_constant_p = true;
       return t;
     }
+
+  STRIP_ANY_LOCATION_WRAPPER (t);
+
   if (CONSTANT_CLASS_P (t))
     {
       if (TREE_OVERFLOW (t))
@@ -4439,8 +4439,7 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
     }
 
   /* Avoid excessively long constexpr evaluations.  */
-  if (!location_wrapper_p (t)
-      && ++*ctx->constexpr_ops_count >= constexpr_ops_limit)
+  if (++*ctx->constexpr_ops_count >= constexpr_ops_limit)
     {
       if (!ctx->quiet)
        error_at (cp_expr_loc_or_loc (t, input_location),
@@ -4452,6 +4451,9 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
       return t;
     }
 
+  constexpr_ctx new_ctx;
+  tree r = t;
+
   tree_code tcode = TREE_CODE (t);
   switch (tcode)
     {
@@ -4752,7 +4754,10 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
        /* This function does more aggressive folding than fold itself.  */
        r = build_fold_addr_expr_with_type (op, TREE_TYPE (t));
        if (TREE_CODE (r) == ADDR_EXPR && TREE_OPERAND (r, 0) == oldop)
-         return t;
+         {
+           ggc_free (r);
+           return t;
+         }
        break;
       }
 
@@ -5065,6 +5070,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
          r = op;
        else if (tcode == UNARY_PLUS_EXPR)
          r = fold_convert (TREE_TYPE (t), op);
+       else if (VOID_TYPE_P (type))
+         r = void_node;
        else
          r = fold_build1 (tcode, type, op);