diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 7387754bcc5..7aefc030a9d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -490,6 +490,10 @@ public class JetControlFlowProcessor { if (setResolvedCall == null) { generateArrayAccess(lhs, null); + + List arguments = Arrays.asList(getBoundOrUnreachableValue(lhs), rhsDeferredValue.invoke()); + builder.magic(parentExpression, parentExpression, arguments, defaultTypeMap(arguments), MagicKind.UNRESOLVED_CALL); + return; } @@ -570,6 +574,7 @@ public class JetControlFlowProcessor { } private void generateArrayAccess(JetArrayAccessExpression arrayAccessExpression, @Nullable ResolvedCall resolvedCall) { + if (builder.getBoundValue(arrayAccessExpression) != null) return; mark(arrayAccessExpression); if (!checkAndGenerateCall(arrayAccessExpression, resolvedCall)) { generateArrayAccessWithoutCall(arrayAccessExpression); @@ -1276,11 +1281,7 @@ public class JetControlFlowProcessor { @Override public void visitArrayAccessExpression(@NotNull JetArrayAccessExpression expression) { - mark(expression); - ResolvedCall getMethodResolvedCall = trace.get(BindingContext.INDEXED_LVALUE_GET, expression); - if (!checkAndGenerateCall(expression, getMethodResolvedCall)) { - generateArrayAccess(expression, getMethodResolvedCall); - } + generateArrayAccess(expression, trace.get(BindingContext.INDEXED_LVALUE_GET, expression)); } @Override diff --git a/compiler/testData/cfg/arrays/arrayIncUnresolved.instructions b/compiler/testData/cfg/arrays/arrayIncUnresolved.instructions new file mode 100644 index 00000000000..178b8ade7d5 --- /dev/null +++ b/compiler/testData/cfg/arrays/arrayIncUnresolved.instructions @@ -0,0 +1,38 @@ +== A == +class A +--------------------- +L0: + 1 +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== foo == +fun foo(a: A) { + a[0]++ +} +--------------------- +L0: + 1 + v(a: A) + magic[FAKE_INITIALIZER](a: A) -> + w(a|) + 2 mark({ a[0]++ }) + mark(a[0]) + error(a[0], No resolved call) + r(a) -> + r(0) -> + magic[UNRESOLVED_CALL](a[0]|, ) -> + mark(a[0]++) + call(a[0]++, |) -> + magic[UNRESOLVED_CALL](a[0]++|, ) -> +L1: + 1 NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== diff --git a/compiler/testData/cfg/arrays/arrayIncUnresolved.kt b/compiler/testData/cfg/arrays/arrayIncUnresolved.kt new file mode 100644 index 00000000000..32828e31321 --- /dev/null +++ b/compiler/testData/cfg/arrays/arrayIncUnresolved.kt @@ -0,0 +1,5 @@ +class A + +fun foo(a: A) { + a[0]++ +} \ No newline at end of file diff --git a/compiler/testData/cfg/arrays/arrayIncUnresolved.values b/compiler/testData/cfg/arrays/arrayIncUnresolved.values new file mode 100644 index 00000000000..e384357f5f4 --- /dev/null +++ b/compiler/testData/cfg/arrays/arrayIncUnresolved.values @@ -0,0 +1,16 @@ +== A == +class A +--------------------- +===================== +== foo == +fun foo(a: A) { + a[0]++ +} +--------------------- + : A NEW: magic[FAKE_INITIALIZER](a: A) -> +a : * NEW: r(a) -> +0 : * NEW: r(0) -> +a[0] : * NEW: magic[UNRESOLVED_CALL](a[0]|, ) -> +a[0]++ : * COPY +{ a[0]++ } : * COPY +===================== \ No newline at end of file diff --git a/compiler/testData/cfg/arrays/arraySetPlusAssignUnresolved.instructions b/compiler/testData/cfg/arrays/arraySetPlusAssignUnresolved.instructions new file mode 100644 index 00000000000..3a3bb2b7c3b --- /dev/null +++ b/compiler/testData/cfg/arrays/arraySetPlusAssignUnresolved.instructions @@ -0,0 +1,38 @@ +== A == +class A +--------------------- +L0: + 1 +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== foo == +fun foo(a: A) { + a[0] += 1 +} +--------------------- +L0: + 1 + v(a: A) + magic[FAKE_INITIALIZER](a: A) -> + w(a|) + 2 mark({ a[0] += 1 }) + mark(a[0]) + error(a[0], No resolved call) + r(a) -> + r(0) -> + magic[UNRESOLVED_CALL](a[0]|, ) -> + r(1) -> + magic[UNRESOLVED_CALL](a[0] += 1|, ) -> + mark(a[0] += 1) +L1: + 1 NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== diff --git a/compiler/testData/cfg/arrays/arraySetPlusAssignUnresolved.kt b/compiler/testData/cfg/arrays/arraySetPlusAssignUnresolved.kt new file mode 100644 index 00000000000..aad04c7f340 --- /dev/null +++ b/compiler/testData/cfg/arrays/arraySetPlusAssignUnresolved.kt @@ -0,0 +1,5 @@ +class A + +fun foo(a: A) { + a[0] += 1 +} \ No newline at end of file diff --git a/compiler/testData/cfg/arrays/arraySetPlusAssignUnresolved.values b/compiler/testData/cfg/arrays/arraySetPlusAssignUnresolved.values new file mode 100644 index 00000000000..ddc304d197e --- /dev/null +++ b/compiler/testData/cfg/arrays/arraySetPlusAssignUnresolved.values @@ -0,0 +1,17 @@ +== A == +class A +--------------------- +===================== +== foo == +fun foo(a: A) { + a[0] += 1 +} +--------------------- + : A NEW: magic[FAKE_INITIALIZER](a: A) -> +a : * NEW: r(a) -> +0 : * NEW: r(0) -> +a[0] : * NEW: magic[UNRESOLVED_CALL](a[0]|, ) -> +1 : * NEW: r(1) -> +a[0] += 1 : * NEW: magic[UNRESOLVED_CALL](a[0] += 1|, ) -> +{ a[0] += 1 } : * COPY +===================== \ No newline at end of file diff --git a/compiler/testData/cfg/arrays/arraySetUnresolved.instructions b/compiler/testData/cfg/arrays/arraySetUnresolved.instructions new file mode 100644 index 00000000000..2895db09f26 --- /dev/null +++ b/compiler/testData/cfg/arrays/arraySetUnresolved.instructions @@ -0,0 +1,37 @@ +== A == +class A +--------------------- +L0: + 1 +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== foo == +fun foo(a: A) { + a[1] = 2 +} +--------------------- +L0: + 1 + v(a: A) + magic[FAKE_INITIALIZER](a: A) -> + w(a|) + 2 mark({ a[1] = 2 }) + mark(a[1]) + error(a[1], No resolved call) + r(a) -> + r(1) -> + magic[UNRESOLVED_CALL](a[1]|, ) -> + r(2) -> + magic[UNRESOLVED_CALL](a[1] = 2|, ) -> +L1: + 1 NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== diff --git a/compiler/testData/cfg/arrays/arraySetUnresolved.kt b/compiler/testData/cfg/arrays/arraySetUnresolved.kt new file mode 100644 index 00000000000..0d5ac672bcf --- /dev/null +++ b/compiler/testData/cfg/arrays/arraySetUnresolved.kt @@ -0,0 +1,5 @@ +class A + +fun foo(a: A) { + a[1] = 2 +} \ No newline at end of file diff --git a/compiler/testData/cfg/arrays/arraySetUnresolved.values b/compiler/testData/cfg/arrays/arraySetUnresolved.values new file mode 100644 index 00000000000..7e7c339e343 --- /dev/null +++ b/compiler/testData/cfg/arrays/arraySetUnresolved.values @@ -0,0 +1,17 @@ +== A == +class A +--------------------- +===================== +== foo == +fun foo(a: A) { + a[1] = 2 +} +--------------------- + : A NEW: magic[FAKE_INITIALIZER](a: A) -> +a : * NEW: r(a) -> +1 : * NEW: r(1) -> +a[1] : * NEW: magic[UNRESOLVED_CALL](a[1]|, ) -> +2 : * NEW: r(2) -> +a[1] = 2 : * NEW: magic[UNRESOLVED_CALL](a[1] = 2|, ) -> +{ a[1] = 2 } : * COPY +===================== \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java b/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java index 872107556c4..3bbe3e40dc7 100644 --- a/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java @@ -65,6 +65,12 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest { doTest(fileName); } + @TestMetadata("arrayIncUnresolved.kt") + public void testArrayIncUnresolved() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/cfg/arrays/arrayIncUnresolved.kt"); + doTest(fileName); + } + @TestMetadata("ArrayOfFunctions.kt") public void testArrayOfFunctions() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/cfg/arrays/ArrayOfFunctions.kt"); @@ -83,6 +89,18 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest { doTest(fileName); } + @TestMetadata("arraySetPlusAssignUnresolved.kt") + public void testArraySetPlusAssignUnresolved() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/cfg/arrays/arraySetPlusAssignUnresolved.kt"); + doTest(fileName); + } + + @TestMetadata("arraySetUnresolved.kt") + public void testArraySetUnresolved() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/cfg/arrays/arraySetUnresolved.kt"); + doTest(fileName); + } + } @TestMetadata("compiler/testData/cfg/basic") diff --git a/compiler/tests/org/jetbrains/jet/cfg/PseudoValueTestGenerated.java b/compiler/tests/org/jetbrains/jet/cfg/PseudoValueTestGenerated.java index 05be2f6ba13..4b925556738 100644 --- a/compiler/tests/org/jetbrains/jet/cfg/PseudoValueTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/cfg/PseudoValueTestGenerated.java @@ -68,6 +68,12 @@ public class PseudoValueTestGenerated extends AbstractPseudoValueTest { doTest(fileName); } + @TestMetadata("arrayIncUnresolved.kt") + public void testArrayIncUnresolved() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/cfg/arrays/arrayIncUnresolved.kt"); + doTest(fileName); + } + @TestMetadata("ArrayOfFunctions.kt") public void testArrayOfFunctions() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/cfg/arrays/ArrayOfFunctions.kt"); @@ -86,6 +92,18 @@ public class PseudoValueTestGenerated extends AbstractPseudoValueTest { doTest(fileName); } + @TestMetadata("arraySetPlusAssignUnresolved.kt") + public void testArraySetPlusAssignUnresolved() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/cfg/arrays/arraySetPlusAssignUnresolved.kt"); + doTest(fileName); + } + + @TestMetadata("arraySetUnresolved.kt") + public void testArraySetUnresolved() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/cfg/arrays/arraySetUnresolved.kt"); + doTest(fileName); + } + } @TestMetadata("compiler/testData/cfg/basic")