implicit constructor translation?

Dan Smith daniel.smith at oracle.com
Thu Jun 1 18:30:40 UTC 2023


> On Jun 1, 2023, at 10:59 AM, Brian Goetz <brian.goetz at oracle.com> wrote:
> 
> I think that there should be an explicit (and not synthetic) method_info for the implicit constructor, with the obvious Code attribute (`defaultvalue` / `areturn`.)  
> 
> My rationale is: "the declaration said there's a no-arg constructor, I should be able to call it".  And that intuition is entirely reasonable.  Users should be able to say `new Complex()` and get a default complex value.  (Maybe they can also say `Complex.default`; maybe we won't need that.)  And the same for reflection.  
> 
> Also, in case it is not obvious, the following class is illegal:
> 
>     value class X { 
>         implicit X();
>         X() { ... }
>     }
> 
> because it is trying to declare the same constructor twice.  An implicit constructor is a constructor, just one for which the compiler can deduce specific known semantics.

Agree with all of this. Some of these details were initially unclear a few weeks ago, but I think we've settled on a design in which the implicit constructor is a "real", invokable constructor, in addition to signaling some metadata about the class.

> On 6/1/2023 10:47 AM, Dan Heidinga wrote:
>> Alas representing implicit constructors with a `method_info` is not without costs: primarily specing how the method_info exists and explaining why it doesn't have a code attribute.

There would be nothing special about the <vnew> method. It only exists as a code path for explicit constructor invocations. The "I have a default instance" metadata comes from ImplicitCreation.

(Do we expect reflection to reconstruct ImplicitCreation+no-arg <vnew> --> 'Constructor.isImplicit' or 'ACC_IMPLICIT'? Maybe. Not entirely sure yet what the reflection surface will look like.)



More information about the valhalla-spec-experts mailing list