On Wed, Mar 14, 2018 at 11:59 AM, Marek Polacek <pola...@redhat.com> wrote:
> cxx_constant_value doesn't understand template codes, and neither it
> understands OVERLOADs, so if we pass an OVERLOAD to it, we crash.  Here
> instantiate_non_dependent_expr got an OVERLOAD, but since it calls
> is_nondependent_constant_expression which checks type_unknown_p, it left the
> expression as it was.  We can't use is_nondependent_constant_expression in
> finish_if_stmt_cond because i_n_c_e checks is_constant_expression and that is
> not suitable here; we'd miss diagnostics.  So I did the following; I think we
> should reject the testcase with an error.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
>
> 2018-03-14  Marek Polacek  <pola...@redhat.com>
>
>         PR c++/84854
>         * semantics.c (finish_if_stmt_cond): Give error if the condition
>         is an overloaded function with no contextual type information.
>
>         * g++.dg/cpp1z/constexpr-if15.C: New test.
>
> diff --git gcc/cp/semantics.c gcc/cp/semantics.c
> index fdf37bea770..a056e9445e9 100644
> --- gcc/cp/semantics.c
> +++ gcc/cp/semantics.c
> @@ -735,8 +735,16 @@ finish_if_stmt_cond (tree cond, tree if_stmt)
>        && require_constant_expression (cond)
>        && !value_dependent_expression_p (cond))
>      {
> -      cond = instantiate_non_dependent_expr (cond);
> -      cond = cxx_constant_value (cond, NULL_TREE);
> +      if (type_unknown_p (cond))
> +       {
> +         cxx_incomplete_type_error (cond, TREE_TYPE (cond));
> +         cond = error_mark_node;

I think I'd prefer to skip this block when type_unknown_p, and leave
error handling up to the code shared with regular if.

Jason

Reply via email to