This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: C++ PATCH to implement C++20 P0892R2 - explicit(bool) [v2]


On Thu, Oct 11, 2018 at 11:35:23AM -0400, Jason Merrill wrote:
> > +       /* [dcl.fct.spec]
> > +          "the constant-expression, if supplied, shall be a contextually
> > +          converted constant expression of type bool."  */
> > +       expr = build_explicit_specifier (expr, tf_warning_or_error);
> > +       /* We could evaluate it -- mark the decl as appropriate.  */
> > +       if (expr == boolean_true_node)
> > +         set_and_check_decl_spec_loc (decl_specs, ds_explicit, token);
> > +       else if (explicit_specifier)
> > +         /* The expression was value-dependent.  Remember it so that we can
> > +            substitute it later.  */
> > +         *explicit_specifier = expr;
> 
> What if expr == boolean_false_node?

Then we proceed like no explicit was present and the decl isn't marked as
explicit/nonconverting.  Perhaps I could have made this clearer with

  else if (expr == boolean_true_node)
    /* Don't mark the decl as explicit.  */;

or somesuch.
 
> > +      /* Handle explicit(dependent-expr).  */
> > +      if (DECL_HAS_DEPENDENT_EXPLICIT_SPEC_P (t))
> > +       {
> > +         tree spec = lookup_explicit_specifier (t);
> > +         spec = tsubst_copy_and_build (spec, args, complain, in_decl,
> > +                                       /*function_p=*/false,
> > +                                       /*i_c_e_p=*/true);
> > +         spec = build_explicit_specifier (spec, complain);
> > +         DECL_NONCONVERTING_P (t) = (spec == boolean_true_node);
> > +       }
> 
> What if spec is still dependent, e.g. after partial substitution of a
> member template?

Something like this?

template<typename> struct A {
  template<typename T, int N = 0>
  explicit(N) operator T();
};

void
bar ()
{
  A<int> a;
  int i = a;
}

This also seemed to work: if spec is still dependent, the decl isn't marked as
DECL_NONCONVERTING_P, and we'll try again after deduction (fn_type_unification
in add_template_candidate).

Marek


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]