Lambda and parameterized ref of an inline type doesn't work well

forax at univ-mlv.fr forax at univ-mlv.fr
Sat May 9 11:33:25 UTC 2020


----- Mail original -----
> De: "Srikanth" <srikanth.adayapalam at oracle.com>
> À: "Remi Forax" <forax at univ-mlv.fr>
> Cc: "valhalla-dev" <valhalla-dev at openjdk.java.net>
> Envoyé: Samedi 9 Mai 2020 02:52:26
> Objet: Re: Lambda and parameterized ref of an inline type doesn't work well

> On 08/05/20 8:36 pm, Remi Forax wrote:
>> [move to valhalla-dev]
>>
>> Hi Srikanth,
>> This seems to fix the lambda bug but not the one with the enhanced for loop.
> 
> "not the one with enhanced for loop" - I'll take a look, but was this
> reported earlier ?
> Your wording seems to indicate so, but I seem to have missed the report
> and am hearing it only now.

I've mention it in the comment section of JDK-8244559, for me it comes from the same piece code but it's maybe another error.

> 
> In any case, I expect to have a fix soon. Thanks so much for testing and
> the defect reports!

No, thank you for your impressive work.

> 
> Srikanth

Rémi

[1] https://bugs.openjdk.java.net/browse/JDK-8244559

> 
>> Here, the inline type is itself a generics so it should work as usual.
>>
>>    @__inline__ static class Foo<V> implements Iterable<V> {
>>      int x = 3;
>>      
>>      public Iterator<V> iterator() {
>>        return null;
>>      }
>>    }
>>
>>
>>    public static void main(String[] args) {
>>      Foo<String> foo = new Foo<String>();
>>      for(var s: foo) {
>>      }
>>    }
>>
>>
>> $javac Hello.java
>> Hello.java:15: error: for-each not applicable to expression type
>>      for(var s: foo) {
>>                 ^
>>    required: array or java.lang.Iterable
>>    found:    Foo<String>
>> 1 error
>>
>> regards,
>> Rémi
>>
>> ----- Mail original -----
>>> De: "Srikanth" <srikanth.adayapalam at oracle.com>
>>> À: "amber-dev" <amber-dev at openjdk.java.net>
>>> Envoyé: Vendredi 8 Mai 2020 15:00:46
>>> Objet: Re: Lambda and parameterized ref of an inline type doesn't work well
>>> Hello Remi,
>>>
>>> Thanks for the report - this should be fixed by the commit
>>> https://github.com/openjdk/valhalla/commit/e586cdbe made for
>>> https://bugs.openjdk.java.net/browse/JDK-8244559
>>>
>>> With this all three problems reported are solved and should work now.
>>>
>>> (The inline + record synthesized methods is open)
>>>
>>> Srikanth
>>>
>>> On 07/05/20 4:07 am, Remi Forax wrote:
>>>>     @__inline__ static class Foo<V> {
>>>>       int x;
>>>>       Foo(int x) { this.x = x; }
>>>>     }
>>>>
>>>>     static void m(Foo foo) {
>>>>       System.out.println("inline");
>>>>     }
>>>>     static void m(Foo.ref foo) {
>>>>       System.out.println("ref");
>>>>     }
>>>>
>>>>     public static void main(String[] args) {
>>>>       List<Foo.ref<Integer>> list = List.of(new Foo<Integer>(3));
>>>>       list.stream().forEach(e -> m(e));
>>>>     }
>>>>
>>>> I don't even understand the error message when playing with parameterized ref of
>>>> an inline type.
>>>>
>>>> error: cannot select a static class from a parameterized type
>>>> Hello.java:19: error: incompatible types: incompatible parameter types in lambda
>>>> expression
>>>>       list.stream().forEach(e -> m(e));
>>>>                             ^
>>>>
>>>> regards,
> >>> Rémi


More information about the valhalla-dev mailing list