compiler issue with after the recent changes in the compiler

Remi Forax forax at univ-mlv.fr
Wed May 6 20:56:34 UTC 2020


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
  }

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