https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95307

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I've tried:
--- gcc/cp/constexpr.c.jj       2020-05-25 10:06:59.886175941 +0200
+++ gcc/cp/constexpr.c  2020-05-26 22:02:23.661355854 +0200
@@ -6196,6 +6196,18 @@ cxx_eval_constant_expression (const cons
        if (VOID_TYPE_P (type))
          return void_node;

+       if (CONVERT_EXPR_CODE_P (TREE_CODE (t))
+           && ARITHMETIC_TYPE_P (type)
+           && INDIRECT_TYPE_P (TREE_TYPE (op)))
+         {
+           if (!ctx->quiet)
+             error ("conversion from pointer type %qT "
+                    "to arithmetic type %qT in a constant expression",
+                    TREE_TYPE (op), type);
+           *non_constant_p = true;
+           return t;
+         }
+
        if (TREE_CODE (op) == PTRMEM_CST && !TYPE_PTRMEM_P (type))
          op = cplus_expand_constant (op);

@@ -6797,19 +6809,6 @@ cxx_eval_outermost_constant_expr (tree t
       non_constant_p = true;
     }

-  /* Technically we should check this for all subexpressions, but that
-     runs into problems with our internal representation of pointer
-     subtraction and the 5.19 rules are still in flux.  */
-  if (CONVERT_EXPR_CODE_P (TREE_CODE (r))
-      && ARITHMETIC_TYPE_P (TREE_TYPE (r))
-      && TREE_CODE (TREE_OPERAND (r, 0)) == ADDR_EXPR)
-    {
-      if (!allow_non_constant)
-       error ("conversion from pointer type %qT "
-              "to arithmetic type %qT in a constant expression",
-              TREE_TYPE (TREE_OPERAND (r, 0)), TREE_TYPE (r));
-      non_constant_p = true;
-    }

   if (!non_constant_p && overflow_p)
     non_constant_p = true;
but will need to look through testsuite regressions and find out which tests
just need adjustments and if there isn't something really broken by that.

Reply via email to