[FIR] Create special hidden override for Java signature clash due to rename
This fixes CharBuffer.get resolving to CharBuffer.charAt #KT-61282 Fixed
This commit is contained in:
committed by
Space Team
parent
528a2d3c62
commit
865b8a4175
@@ -1,6 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_BACKEND_K2: JVM_IR
|
||||
// Ignore reason: KT-61282
|
||||
// FULL_JDK
|
||||
|
||||
import java.nio.CharBuffer
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_BACKEND_K2: JVM_IR
|
||||
// Ignore reason: KT-61282
|
||||
// MODULE: lib
|
||||
// FILE: CharBuffer.java
|
||||
|
||||
@@ -34,6 +32,7 @@ public abstract class CharBuffer implements CharSequence {
|
||||
|
||||
// MODULE: main(lib)
|
||||
// FILE: 1.kt
|
||||
abstract class KCB : CharBuffer()
|
||||
|
||||
fun box(): String {
|
||||
val cb: CharBuffer = CharBuffer.impl()
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_BACKEND_K1: ANY
|
||||
// ^KT-63431 CharBufferXAllInherited.create().get(0) is resolved incorrectly in K1
|
||||
|
||||
// FILE: X.java
|
||||
public interface X {
|
||||
char get(int index);
|
||||
}
|
||||
|
||||
// FILE: CharBuffer.java
|
||||
public abstract class CharBuffer implements CharSequence {
|
||||
public static CharBuffer create() {
|
||||
return new CharBuffer() {
|
||||
@Override public char charAt(int index) { return 'c'; }
|
||||
@Override public char get(int index) { return 'g'; }
|
||||
@Override public CharSequence subSequence(int start, int end) { return null; }
|
||||
@Override public int length() { return 0; }
|
||||
};
|
||||
}
|
||||
public abstract char charAt(int index);
|
||||
public abstract char get(int index);
|
||||
}
|
||||
|
||||
// FILE: CharBufferX.java
|
||||
public abstract class CharBufferX implements CharSequence, X {
|
||||
public static CharBufferX create() {
|
||||
return new CharBufferX() {
|
||||
@Override public char charAt(int index) { return 'c'; }
|
||||
@Override public char get(int index) { return 'g'; }
|
||||
@Override public CharSequence subSequence(int start, int end) { return null; }
|
||||
@Override public int length() { return 0; }
|
||||
};
|
||||
}
|
||||
public abstract char charAt(int index);
|
||||
public abstract char get(int index);
|
||||
}
|
||||
|
||||
// FILE: NonCharSequenceBuffer.java
|
||||
public abstract class NonCharSequenceBuffer implements X {
|
||||
public static NonCharSequenceBuffer create() {
|
||||
return new NonCharSequenceBuffer() {
|
||||
@Override public char charAt(int index) { return 'c'; }
|
||||
@Override public char get(int index) { return 'g'; }
|
||||
};
|
||||
}
|
||||
public abstract char charAt(int index);
|
||||
public abstract char get(int index);
|
||||
}
|
||||
|
||||
// FILE: CharBufferCharAtInherited.java
|
||||
public abstract class CharBufferCharAtInherited implements CharSequence {
|
||||
public static CharBufferCharAtInherited create() {
|
||||
return new CharBufferCharAtInherited() {
|
||||
@Override public char charAt(int index) { return 'c'; }
|
||||
@Override public char get(int index) { return 'g'; }
|
||||
@Override public CharSequence subSequence(int start, int end) { return null; }
|
||||
@Override public int length() { return 0; }
|
||||
};
|
||||
}
|
||||
public abstract char get(int index);
|
||||
}
|
||||
|
||||
// FILE: CharBufferXAllInherited.java
|
||||
public abstract class CharBufferXAllInherited implements CharSequence, X {
|
||||
public static CharBufferXAllInherited create() {
|
||||
return new CharBufferXAllInherited() {
|
||||
@Override public char charAt(int index) { return 'c'; }
|
||||
@Override public char get(int index) { return 'g'; }
|
||||
@Override public CharSequence subSequence(int start, int end) { return null; }
|
||||
@Override public int length() { return 0; }
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: Y.java
|
||||
public abstract class Y {
|
||||
protected abstract char get(int index);
|
||||
}
|
||||
|
||||
// FILE: CharBufferXYAllInherited.java
|
||||
public abstract class CharBufferXYAllInherited extends Y implements CharSequence, X {
|
||||
public static CharBufferXYAllInherited create() {
|
||||
return new CharBufferXYAllInherited() {
|
||||
@Override public char charAt(int index) { return 'c'; }
|
||||
@Override public char get(int index) { return 'g'; }
|
||||
@Override public CharSequence subSequence(int start, int end) { return null; }
|
||||
@Override public int length() { return 0; }
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: CharAt.java
|
||||
public interface CharAt {
|
||||
char charAt(int index);
|
||||
}
|
||||
|
||||
// FILE: CharBufferXYCharAt.java
|
||||
public abstract class CharBufferXYCharAt extends Y implements CharSequence, X, CharAt {
|
||||
public static CharBufferXYCharAt create() {
|
||||
return new CharBufferXYCharAt() {
|
||||
@Override public char charAt(int index) { return 'c'; }
|
||||
@Override public char get(int index) { return 'g'; }
|
||||
@Override public CharSequence subSequence(int start, int end) { return null; }
|
||||
@Override public int length() { return 0; }
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: box.kt
|
||||
|
||||
fun box(): String {
|
||||
if (CharBuffer.create().get(0) != 'g') return "FAIL 1"
|
||||
if ((CharBuffer.create() as CharSequence).get(0) != 'c') return "FAIL 2"
|
||||
|
||||
if (CharBufferX.create().get(0) != 'g') return "FAIL 3"
|
||||
if ((CharBufferX.create() as CharSequence).get(0) != 'c') return "FAIL 4"
|
||||
if ((CharBufferX.create() as X).get(0) != 'g') return "FAIL 5"
|
||||
|
||||
if (NonCharSequenceBuffer.create().charAt(0) != 'c') return "FAIL 6"
|
||||
if (NonCharSequenceBuffer.create().get(0) != 'g') return "FAIL 7"
|
||||
if ((NonCharSequenceBuffer.create() as X).get(0) != 'g') return "FAIL 8"
|
||||
|
||||
if (CharBufferCharAtInherited.create().get(0) != 'g') return "FAIL 9"
|
||||
if ((CharBufferCharAtInherited.create() as CharSequence).get(0) != 'c') return "FAIL 10"
|
||||
|
||||
if (CharBufferXAllInherited.create().get(0) != 'g') return "FAIL 11"
|
||||
if ((CharBufferXAllInherited.create() as CharSequence).get(0) != 'c') return "FAIL 12"
|
||||
if ((CharBufferXAllInherited.create() as X).get(0) != 'g') return "FAIL 13"
|
||||
|
||||
if (CharBufferXYAllInherited.create().get(0) != 'g') return "FAIL 14"
|
||||
if ((CharBufferXYAllInherited.create() as CharSequence).get(0) != 'c') return "FAIL 15"
|
||||
if ((CharBufferXYAllInherited.create() as X).get(0) != 'g') return "FAIL 16"
|
||||
if ((CharBufferXYAllInherited.create() as Y).get(0) != 'g') return "FAIL 17"
|
||||
|
||||
if (CharBufferXYCharAt.create().get(0) != 'g') return "FAIL 18"
|
||||
if ((CharBufferXYCharAt.create() as CharSequence).get(0) != 'c') return "FAIL 19"
|
||||
if ((CharBufferXYCharAt.create() as X).get(0) != 'g') return "FAIL 20"
|
||||
if ((CharBufferXYCharAt.create() as Y).get(0) != 'g') return "FAIL 21"
|
||||
if ((CharBufferXYCharAt.create() as CharAt).charAt(0) != 'c') return "FAIL 22"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
// FIR_IDENTICAL
|
||||
// SCOPE_DUMP: CharBuffer:get;charAt, CharBufferX:get;charAt, NonCharSequenceBuffer:get;charAt, NonCharBuffer:get;charAt, CharBufferXAllInherited:get;charAt, CharBufferXYAllInherited:get;charAt, CharBufferXYCharAt:get;charAt
|
||||
|
||||
// FILE: X.java
|
||||
public interface X {
|
||||
char get(int index);
|
||||
}
|
||||
|
||||
// FILE: CharBuffer.java
|
||||
public abstract class CharBuffer implements CharSequence {
|
||||
// Should override 'kotlin.CharSequence.get'
|
||||
public final char charAt(int index) {
|
||||
return get(position() + checkIndex(index, 1));
|
||||
}
|
||||
|
||||
// The key problem here is that `get` has the same signature as kotlin.CharSequence.get but completely different semantics
|
||||
// Should override nothing
|
||||
public abstract char get(int index);
|
||||
}
|
||||
|
||||
// FILE: CharBufferX.java
|
||||
public abstract class CharBufferX implements CharSequence, X {
|
||||
// Should override 'kotlin.CharSequence.get'
|
||||
public final char charAt(int index) {
|
||||
return get(position() + checkIndex(index, 1));
|
||||
}
|
||||
|
||||
// Should override X.get
|
||||
public abstract char get(int index);
|
||||
}
|
||||
|
||||
// FILE: NonCharSequenceBuffer.java
|
||||
public abstract class NonCharSequenceBuffer implements X {
|
||||
// Should override nothing and be available as 'charAt', not as 'get'
|
||||
public final char charAt(int index) {
|
||||
return get(position() + checkIndex(index, 1));
|
||||
}
|
||||
|
||||
// Should override 'X.get'
|
||||
public abstract char get(int index);
|
||||
}
|
||||
|
||||
// FILE: NonCharBuffer.java
|
||||
public abstract class NonCharBuffer implements CharSequence {
|
||||
// Not overriding charAt explicitly but inherited through kotlin.CharSequence.get
|
||||
|
||||
// Should override nothing
|
||||
public abstract char get(int index);
|
||||
}
|
||||
|
||||
// FILE: CharBufferXAllInherited.java
|
||||
public abstract class CharBufferXAllInherited implements CharSequence, X {
|
||||
}
|
||||
|
||||
// FILE: Y.java
|
||||
public class Y {
|
||||
protected abstract char get(int index);
|
||||
}
|
||||
|
||||
// FILE: CharBufferXYAllInherited.java
|
||||
public abstract class CharBufferXYAllInherited extends Y implements CharSequence, X {
|
||||
}
|
||||
|
||||
// FILE: CharAt.java
|
||||
public interface CharAt {
|
||||
char charAt(int index);
|
||||
}
|
||||
|
||||
// FILE: CharBufferXYCharAt.java
|
||||
public class CharBufferXYCharAt extends Y implements CharSequence, X, CharAt {
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
|
||||
fun test(
|
||||
charBuffer: CharBuffer,
|
||||
charBufferX: CharBufferX,
|
||||
nonCharSequenceBuffer: NonCharSequenceBuffer,
|
||||
nonCharBuffer: NonCharBuffer,
|
||||
charBufferXAllInherited: CharBufferXAllInherited,
|
||||
charBufferXYAllInherited: CharBufferXYAllInherited,
|
||||
charBufferXYCharAt: CharBufferXYCharAt,
|
||||
) {
|
||||
charBuffer.get(0)
|
||||
(charBuffer as CharSequence).get(0)
|
||||
|
||||
charBufferX.get(0)
|
||||
(charBufferX as CharSequence).get(0)
|
||||
|
||||
nonCharSequenceBuffer.get(0)
|
||||
nonCharSequenceBuffer.charAt(0)
|
||||
|
||||
nonCharBuffer.get(0)
|
||||
(nonCharBuffer as CharSequence).get(0)
|
||||
|
||||
charBufferXAllInherited.get(0)
|
||||
(charBufferXAllInherited as CharSequence).get(0)
|
||||
|
||||
charBufferXYAllInherited.get(0)
|
||||
(charBufferXYAllInherited as CharSequence).get(0)
|
||||
|
||||
charBufferXYCharAt.get(0)
|
||||
(charBufferXYCharAt as CharSequence).get(0)
|
||||
(charBufferXYCharAt as CharAt).charAt(0)
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
CharBuffer:
|
||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBuffer [id: 0]
|
||||
[Enhancement]: public final operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBuffer [id: 0]
|
||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
|
||||
|
||||
CharBufferX:
|
||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferX [id: 0]
|
||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /X [id: 1]
|
||||
[Enhancement]: public final operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferX [id: 0]
|
||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
|
||||
|
||||
NonCharSequenceBuffer:
|
||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /NonCharSequenceBuffer [id: 0]
|
||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /X [id: 1]
|
||||
[Enhancement]: public final fun charAt(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /NonCharSequenceBuffer [id: 0]
|
||||
|
||||
NonCharBuffer:
|
||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /NonCharBuffer [id: 0]
|
||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /NonCharBuffer [id: 0]
|
||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
|
||||
|
||||
CharBufferXAllInherited:
|
||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXAllInherited [id: 0]
|
||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
|
||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXAllInherited [id: 0]
|
||||
|
||||
CharBufferXYAllInherited:
|
||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXYAllInherited [id: 0]
|
||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
|
||||
[IntersectionOverride]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXYAllInherited [id: 0]
|
||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /X [id: 1]
|
||||
[Enhancement]: protected/*protected and package*/ abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /Y [id: 2]
|
||||
|
||||
CharBufferXYCharAt:
|
||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXYCharAt [id: 0]
|
||||
[Library]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Use site scope of kotlin/CharSequence [id: 1]
|
||||
[RenamedForOverride]: public abstract fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharAt [id: 2]
|
||||
[IntersectionOverride]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /CharBufferXYCharAt [id: 0]
|
||||
[Enhancement]: public abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /X [id: 1]
|
||||
[Enhancement]: protected/*protected and package*/ abstract operator fun get(index: R|kotlin/Int|): R|kotlin/Char| from Java enhancement scope for /Y [id: 2]
|
||||
Reference in New Issue
Block a user