C++ PATCH for c++/89836 - bool constant expression and explicit conversions
Jason Merrill
jason@redhat.com
Thu Mar 28 18:08:00 GMT 2019
On 3/27/19 3:08 PM, Marek Polacek wrote:
> I noticed that this test doesn't compile because build_converted_constant_expr
> failed to consider explicit conversion functions. That's wrong: while Core
> Issue 1981 specifies that explicit conversion functions are not considered for
> contextual conversions, they are considered in contextual conversions to bool,
> as defined in Core 2039.
>
> Fixed by adding a new wrapper that uses LOOKUP_NORMAL instead of
> LOOKUP_IMPLICIT.
>
> Besides [dcl.fct.spec], these: [except.spec], [dcl.dcl]/6 (static_assert),
> [stmt.if] (constexpr if) all talk about "a contextually converted constant
> expression of type bool", so it would seem to make sense to use
> build_converted_constant_bool_expr for them also. E.g. use that instead of
> perform_implicit_conversion_flags in build_noexcept_spec. But that doesn't
> work for this test:
>
> int e();
> int fn() noexcept(e);
>
> because build_converted_constant_expr would issue a conversion error. We're
> converting "e" to "bool". We have a ck_lvalue conversion from "int f()" to
> "int (*f)()" and then a ck_std conversion from "int (*f)()" to bool. Those
> should work fine but we issue an error for the ck_std conversion.
Converting a pointer to bool is a "boolean conversion", which is not
allowed under the rules for a converted constant expression
([expr.const]p7). So we should reject that testcase.
> Also build_converted_constant_expr doesn't have the processing_template_decl
> handling that perform_implicit_conversion_flags does, which (I believe) lead me
> to changing check_narrowing to use maybe_constant_value instead of
> fold_non_dependent_expr.
As I was saying elsewhere, I think that change was probably a mistake,
and that we should have fixed that bug by changing the caller instead.
> Anyway, this patch should be safe.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
OK.
Jason
More information about the Gcc-patches
mailing list