On 3/7/19 2:29 PM, Jakub Jelinek wrote:
Hi!

The last testcase in the patch diagnoses invalid constexpr in the
ptr case, but doesn't for arr.
The array is constexpr, so we do:
       value = fold_non_dependent_expr (value);
       if (DECL_DECLARED_CONSTEXPR_P (decl)
           || (DECL_IN_AGGR_P (decl)
               && DECL_INITIALIZED_IN_CLASS_P (decl)))
         {
           /* Diagnose a non-constant initializer for constexpr variable or
              non-inline in-class-initialized static data member.  */
           if (!require_constant_expression (value))
             value = error_mark_node;
           else if (processing_template_decl)
             /* In a template we might not have done the necessary
                transformations to make value actually constant,
                e.g. extend_ref_init_temps.  */
             value = maybe_constant_init (value, decl, true);
           else
             value = cxx_constant_init (value, decl);
         }
but require_constant_expression returned true even when there are
REINTERPRET_CAST_Ps in the CONSTRUCTOR, and then cxx_constant_init
doesn't reject it, because:
     case CONSTRUCTOR:
       if (TREE_CONSTANT (t) && reduced_constant_expression_p (t))
         {
           /* Don't re-process a constant CONSTRUCTOR, but do fold it to
              VECTOR_CST if applicable.  */
           verify_constructor_flags (t);
           if (TREE_CONSTANT (t))
             return fold (t);
         }
       r = cxx_eval_bare_aggregate (ctx, t, lval,
                                    non_constant_p, overflow_p);
       break;
and reduced_constant_expression_p is true on it, so we never try to evaluate
it.

The following patch changes potential_constant_expression_1 to reject the
REINTERPRET_CAST_P, not really sure if that is the best way though.

That seems right to me.  The patch is OK.

Jason

Reply via email to