compiler issue with after the recent changes in the compiler

Remi Forax forax at univ-mlv.fr
Thu May 7 16:45:15 UTC 2020


Thanks Srikanth,
i've used a version built this morning and now the diamond syntax works,
so most of my tests now works !

Despite the current issues with the compiler, I find the val/ref model far easier to use that the V? model,
the fact that something like List.of(inline) is inferred as List<Inline.ref> + the availability of all the members of an Inline on the its projection, Inline.ref helps a lot.

Rémi 

----- Mail original -----
> De: "Srikanth" <srikanth.adayapalam at oracle.com>
> À: "valhalla-dev" <valhalla-dev at openjdk.java.net>
> Envoyé: Jeudi 7 Mai 2020 01:45:36
> Objet: Re: compiler issue with after the recent changes in the compiler

> On 07/05/20 2:26 am, Remi Forax wrote:
>> Nope,
>> the bug is in wrap(), using E instead of the diamond and javac compiles
>>    public static <E> Array<E> wrap(E[] elements) {
>>      return new Array<>(Objects.requireNonNull(elements));   // crash
>>      return new Array<E>(Objects.requireNonNull(elements));  // compile
>>    }
> 
> Hello Remi,
> 
> Can you try again ? This was an acknowledged problem as of
> https://github.com/openjdk/valhalla/pull/32 which subsequently got
> resolved through https://bugs.openjdk.java.net/browse/JDK-8244458 (which
> itself got subsumed and cumulatively fixed via JDK-8244414)
> 
> I am able to compile the file Array.java you have attached without a
> crash. I'll add it to javac's tests anyways in a future commit.
> 
> Thanks!
> Srikanth
>> Rémi
>>
>> ----- Mail original -----
>>> De: "Remi Forax" <forax at univ-mlv.fr>
>>> À: "Srikanth Adayapalam" <sadayapalam at openjdk.java.net>
>>> Cc: "valhalla-dev" <valhalla-dev at openjdk.java.net>
>>> Envoyé: Mercredi 6 Mai 2020 22:49:21
>>> Objet: compiler issue with after the recent changes in the compiler
>>> Hi Srikanth,
>>> using a version compiled yesterday, javac struggle with my code :)
>>> (i believe the issue is when compiling the method iterator() but i may be wrong)
>>>
>>> Also the "printing javac parameters" at the end looks like a debug knob not
>>> being turn off.
>>>
>>> regards,
>>> Rémi
>>>
>>> $ javac Array.java
>>> java.lang.NullPointerException
>>> 	at
>>> 	jdk.compiler/com.sun.tools.javac.code.Types$13.visitClassType(Types.java:2331)
>>> 	at
>>> 	jdk.compiler/com.sun.tools.javac.code.Types$13.visitClassType(Types.java:2318)
>>> 	at jdk.compiler/com.sun.tools.javac.code.Type$ClassType.accept(Type.java:1065)
>>> 	at
>>> 	jdk.compiler/com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4951)
>>> 	at jdk.compiler/com.sun.tools.javac.code.Types.memberType(Types.java:2315)
>>> 	at
>>> 	jdk.compiler/com.sun.tools.javac.comp.Resolve.rawInstantiate(Resolve.java:589)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Resolve.selectBest(Resolve.java:1597)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Resolve.findDiamond(Resolve.java:2952)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Resolve$13.doLookup(Resolve.java:2898)
>>> 	at
>>> 	jdk.compiler/com.sun.tools.javac.comp.Resolve$BasicLookupHelper.lookup(Resolve.java:3367)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Resolve.lookupMethod(Resolve.java:3617)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Resolve.lookupMethod(Resolve.java:3602)
>>> 	at
>>> 	jdk.compiler/com.sun.tools.javac.comp.Resolve.resolveDiamond(Resolve.java:2894)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.visitNewClass(Attr.java:2728)
>>> 	at
>>> 	jdk.compiler/com.sun.tools.javac.tree.JCTree$JCNewClass.accept(JCTree.java:1827)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:689)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.visitReturn(Attr.java:2316)
>>> 	at
>>> 	jdk.compiler/com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1684)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:689)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStat(Attr.java:763)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStats(Attr.java:781)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.visitBlock(Attr.java:1456)
>>> 	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1044)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:689)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStat(Attr.java:763)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.visitMethodDef(Attr.java:1239)
>>> 	at
>>> 	jdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodDecl.accept(JCTree.java:890)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:689)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attribStat(Attr.java:763)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:5308)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClass(Attr.java:5190)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attribClass(Attr.java:5112)
>>> 	at jdk.compiler/com.sun.tools.javac.comp.Attr.attrib(Attr.java:5057)
>>> 	at
>>> 	jdk.compiler/com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1348)
>>> 	at
>>> 	jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:973)
>>> 	at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:316)
>>> 	at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)
>>> 	at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57)
>>> 	at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)
>>> printing javac parameters to: /tmp/val-bug/javac.20200506_223738.args
>>>
>>>
>>> ---
>>>
>>> import static java.util.stream.IntStream.range;
>>>
>>> import java.util.Arrays;
>>> import java.util.Collection;
>>> import java.util.Comparator;
>>> import java.util.Iterator;
>>> import java.util.List;
>>> import java.util.ListIterator;
>>> import java.util.NoSuchElementException;
>>> import java.util.Objects;
>>> import java.util.Spliterator;
>>> import java.util.Spliterators;
>>> import java.util.function.Consumer;
>>> import java.util.function.Predicate;
>>> import java.util.function.UnaryOperator;
>>>
>>> @__inline__
>>> public final class Array<E> implements List<E> {
>>>   private final E[] elements;
>>>
>>>   private Array(E[] elements) {
>>>     this.elements = elements;
>>>   }
>>>
>>>   public static <E> Array<E> wrap(E[] elements) {
>>>     return new Array<>(Objects.requireNonNull(elements));
>>>   }
>>>
>>>   @SafeVarargs
>>>   public static <E> Array<E> of(E... elements) {
>>>     return wrap(elements);
>>>   }
>>>
>>>   public int length() {
>>>     return elements.length;
>>>   }
>>>   
>>>   @Override
>>>   public boolean equals(Object obj) {
>>>     if (obj instanceof Array) {
>>>       var array = (Array<?>)obj;
>>>       return Arrays.equals(elements, array.elements);
>>>     }
>>>     if (obj instanceof List) {
>>>       return equalsList((List<?>)obj);
>>>     }
>>>     return false;
>>>   }
>>>   private boolean equalsList(List<?> list) {
>>>     var it = list.iterator();
>>>     for(var element: elements) {
>>>       if (!it.hasNext()) {
>>>         return false;
>>>       }
>>>       var other = it.next();
>>>       if (!Objects.equals(element, other)) {
>>>         return false;
>>>       }
>>>     }
>>>     return !it.hasNext();
>>>   }
>>>   
>>>   @Override
>>>   public int hashCode() {
>>>     return Arrays.hashCode(elements);
>>>   }
>>>   
>>>   @Override
>>>   public String toString() {
>>>     return Arrays.toString(elements);
>>>   }
>>>
>>>   @Override
>>>   public int size() {
>>>     return elements.length;
>>>   }
>>>
>>>   @Override
>>>   public boolean isEmpty() {
>>>     return elements.length == 0;
>>>   }
>>>
>>>   @Override
>>>   public E get(int index) {
>>>     return elements[index];
>>>   }
>>>   
>>>   @Override
>>>   public E set(int index, E element) {
>>>     var old = elements[index];
>>>     elements[index] = element;
>>>     return old;
>>>   }
>>>   
>>>   @Override
>>>   public int indexOf(Object o) {
>>>     var length = elements.length;
>>>     return range(0, length).filter(i -> Objects.equals(o, elements[i])).findFirst()
>>>         .orElse(-1);
>>>   }
>>>   
>>>   @Override
>>>   public int lastIndexOf(Object o) {
>>>     for(var i = elements.length; --i >= 0;) {
>>>       if (Objects.equals(o, elements[i])) {
>>>         return i;
>>>       }
>>>     }
>>>     return -1;
>>>   }
>>>
>>>   @Override
>>>   public boolean contains(Object o) {
>>>     return Arrays.stream(elements).anyMatch(Predicate.isEqual(o));
>>>   }
>>>   
>>>   @Override
>>>   public boolean containsAll(Collection<?> collection) {
>>>     return collection.stream().allMatch(this::contains);
>>>   }
>>>
>>>   @Override
>>>   public Iterator<E> iterator() {
>>>     return new Iterator<>() {
>>>       private int index;
>>>       
>>>       @Override
>>>       public boolean hasNext() {
>>>         return index < elements.length;
>>>       }
>>>       @Override
>>>       public E next() {
>>>         if (!hasNext()) {
>>>           throw new NoSuchElementException("no such element");
>>>         }
>>>         return elements[index++];
>>>       }
>>>     };
>>>   }
>>>   
>>>   @Override
>>>   public ListIterator<E> listIterator() {
>>>     return listIterator(0);
>>>   }
>>>   @Override
>>>   public ListIterator<E> listIterator(int index) {
>>>     return Arrays.asList(elements).listIterator(index);
>>>   }
>>>   @Override
>>>   public List<E> subList(int fromIndex, int toIndex) {
>>>     return Arrays.asList(elements).subList(fromIndex, toIndex);
>>>   }
>>>   
>>>   @Override
>>>   public Object[] toArray() {
>>>     return Arrays.copyOf(elements, elements.length, Object[].class);
>>>   }
>>>
>>>   @Override
>>>   @SuppressWarnings("unchecked")
>>>   public <T> T[] toArray(T[] a) {
>>>     var elements = this.elements;
>>>     var length = elements.length;
>>>     if (a.length < length) {
>>>       return (T[])Arrays.copyOf(elements, length, a.getClass());
>>>     }
>>>     System.arraycopy(elements, 0, a, 0, length);
>>>     if (a.length > length) {
>>>       a[length] = null;
>>>     }
>>>     return a;
>>>   }
>>>
>>>   @Override
>>>   public boolean add(E e) {
>>>     throw new UnsupportedOperationException("operation not supported");
>>>   }
>>>   @Override
>>>   public void add(int index, E element) {
>>>     throw new UnsupportedOperationException("operation not supported");
>>>   }
>>>   @Override
>>>   public boolean addAll(Collection<? extends E> c) {
>>>     throw new UnsupportedOperationException("operation not supported");
>>>   }
>>>   @Override
>>>   public boolean addAll(int index, Collection<? extends E> c) {
>>>     throw new UnsupportedOperationException("operation not supported");
>>>   }
>>>   @Override
>>>   public void clear() {
>>>     throw new UnsupportedOperationException("operation not supported");
>>>   }
>>>   @Override
>>>   public E remove(int index) {
>>>     throw new UnsupportedOperationException("operation not supported");
>>>   }
>>>   @Override
>>>   public boolean remove(Object o) {
>>>     throw new UnsupportedOperationException("operation not supported");
>>>   }
>>>   @Override
>>>   public boolean removeAll(Collection<?> c) {
>>>     throw new UnsupportedOperationException("operation not supported");
>>>   }
>>>   @Override
>>>   public boolean retainAll(Collection<?> c) {
>>>     throw new UnsupportedOperationException("operation not supported");
>>>   }
>>>   @Override
>>>   public boolean removeIf(Predicate<? super E> filter) {
>>>     throw new UnsupportedOperationException("operation not supported");
>>>   }
>>>   
>>>   @Override
>>>   public void forEach(Consumer<? super E> action) {
>>>     for(var element: elements) {
>>>       action.accept(element);
>>>     }
>>>   }
>>>   
>>>   @Override
>>>   public void replaceAll(UnaryOperator<E> operator) {
>>>     for(var i = 0; i < elements.length; i++) {
>>>       elements[i] = operator.apply(elements[i]);
>>>     }
>>>   }
>>>   
>>>   @Override
>>>   public void sort(Comparator<? super E> comparator) {
>>>     Arrays.sort(elements, comparator);
>>>   }
>>>   
>>>   @Override
>>>   public Spliterator<E> spliterator() {
>>>     return Spliterators.spliterator(elements, Spliterator.ORDERED);
>>>   }
> >> }


More information about the valhalla-dev mailing list