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