[C++ PATCH] Disallow reinterpret_cast in potential_constant_expression_1 (PR c++/89599)
Jason Merrill
jason@redhat.com
Fri Mar 8 04:44:00 GMT 2019
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
More information about the Gcc-patches
mailing list