diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java index aed6690bbaf..b4581a9200a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java @@ -58,6 +58,9 @@ public interface JetControlFlowBuilder { void returnNoValue(@NotNull JetElement returnExpression, @NotNull JetElement subroutine); void write(@NotNull JetElement assignment, @NotNull JetElement lValue); + + void declare(@NotNull JetParameter parameter); + void declare(@NotNull JetProperty property); // Other void unsupported(JetElement element); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java index 609b6f0fd3f..d42a0cbd726 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilderAdapter.java @@ -177,4 +177,16 @@ public class JetControlFlowBuilderAdapter implements JetControlFlowBuilder { assert builder != null; builder.write(assignment, lValue); } + + @Override + public void declare(@NotNull JetParameter parameter) { + assert builder != null; + builder.declare(parameter); + } + + @Override + public void declare(@NotNull JetProperty property) { + assert builder != null; + builder.declare(property); + } } 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 e569ff1327d..bb1624eda0d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -388,6 +388,7 @@ public class JetControlFlowProcessor { } JetParameter catchParameter = catchClause.getCatchParameter(); if (catchParameter != null) { + builder.declare(catchParameter); builder.write(catchParameter, catchParameter); } JetExpression catchBody = catchClause.getCatchBody(); @@ -458,6 +459,7 @@ public class JetControlFlowProcessor { } JetParameter loopParameter = expression.getLoopParameter(); if (loopParameter != null) { + builder.declare(loopParameter); builder.write(loopParameter, loopParameter); } // TODO : primitive cases @@ -669,6 +671,7 @@ public class JetControlFlowProcessor { @Override public void visitProperty(JetProperty property) { + builder.declare(property); JetExpression initializer = property.getInitializer(); if (initializer != null) { value(initializer, false); @@ -676,14 +679,6 @@ public class JetControlFlowProcessor { } } - @Override - public void visitPropertyAccessor(JetPropertyAccessor accessor) { - JetExpression bodyExpression = accessor.getBodyExpression(); - if (bodyExpression != null) { - processLocalDeclaration(accessor, bodyExpression); - } - } - @Override public void visitTupleExpression(JetTupleExpression expression) { for (JetExpression entry : expression.getEntries()) { @@ -838,11 +833,6 @@ public class JetControlFlowProcessor { value(declaration, inCondition); } } - for (JetProperty property : properties) { - for (JetPropertyAccessor accessor : property.getAccessors()) { - value(accessor, inCondition); - } - } } @Override @@ -855,11 +845,4 @@ public class JetControlFlowProcessor { builder.unsupported(element); } } - - private final CFPVisitor FOR_LOCAL_CLASSES = new CFPVisitor(false) { - @Override - public void visitNamedFunction(JetNamedFunction function) { - // Nothing - } - }; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java index 680f3b6a4f4..0af3af13785 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java @@ -440,31 +440,23 @@ public class JetFlowInformationProvider { } private Collection collectDeclaredVariables(JetElement element) { + final Pseudocode pseudocode = pseudocodeMap.get(element); + assert pseudocode != null; + final Set declaredVariables = Sets.newHashSet(); - element.accept(new JetTreeVisitor() { + JetControlFlowGraphTraverser.create(pseudocode, false).traverseAndAnalyzeInstructionGraph(new JetControlFlowGraphTraverser.InstructionDataAnalyzeStrategy() { @Override - public Void visitProperty(JetProperty property, Void data) { - DeclarationDescriptor descriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, property); - if (descriptor != null) { - assert descriptor instanceof VariableDescriptor; - declaredVariables.add((VariableDescriptor) descriptor); - } - return super.visitProperty(property, data); - } - - @Override - public Void visitForExpression(JetForExpression expression, Void data) { - JetParameter loopParameter = expression.getLoopParameter(); - if (loopParameter != null) { - DeclarationDescriptor descriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, loopParameter); + public void execute(Instruction instruction, @Nullable Void enterData, @Nullable Void exitData) { + if (instruction instanceof VariableDeclarationInstruction) { + JetDeclaration variableDeclarationElement = ((VariableDeclarationInstruction) instruction).getVariableDeclarationElement(); + DeclarationDescriptor descriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, variableDeclarationElement); if (descriptor != null) { assert descriptor instanceof VariableDescriptor; declaredVariables.add((VariableDescriptor) descriptor); } } - return super.visitForExpression(expression, data); } - }, null); + }); return declaredVariables; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java index bbe46cf75af..0832d705cb5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionVisitor.java @@ -12,6 +12,10 @@ public class InstructionVisitor { visitInstructionWithNext(instruction); } + public void visitVariableDeclarationInstruction(VariableDeclarationInstruction instruction) { + visitInstructionWithNext(instruction); + } + public void visitUnconditionalJump(UnconditionalJumpInstruction instruction) { visitJump(instruction); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java index ea1730d948d..0d6ac71d32c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/JetControlFlowInstructionsGenerator.java @@ -216,6 +216,16 @@ public class JetControlFlowInstructionsGenerator extends JetControlFlowBuilderAd add(new WriteValueInstruction(assignment, lValue)); } + @Override + public void declare(@NotNull JetParameter parameter) { + add(new VariableDeclarationInstruction(parameter)); + } + + @Override + public void declare(@NotNull JetProperty property) { + add(new VariableDeclarationInstruction(property)); + } + @Override public void read(@NotNull JetExpression expression) { add(new ReadValueInstruction(expression)); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalDeclarationInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalDeclarationInstruction.java index 67a4e220fcd..f626484beec 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalDeclarationInstruction.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/LocalDeclarationInstruction.java @@ -8,7 +8,7 @@ import java.util.ArrayList; import java.util.Collection; /** -* @author abreslav +* @author svtk */ public class LocalDeclarationInstruction extends InstructionWithNext { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/VariableDeclarationInstruction.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/VariableDeclarationInstruction.java new file mode 100644 index 00000000000..5f2f51c8548 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/VariableDeclarationInstruction.java @@ -0,0 +1,33 @@ +package org.jetbrains.jet.lang.cfg.pseudocode; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetDeclaration; +import org.jetbrains.jet.lang.psi.JetParameter; +import org.jetbrains.jet.lang.psi.JetProperty; + +/** + * @author svtk + */ +public class VariableDeclarationInstruction extends InstructionWithNext { + protected VariableDeclarationInstruction(@NotNull JetParameter element) { + super(element); + } + + protected VariableDeclarationInstruction(@NotNull JetProperty element) { + super(element); + } + + public JetDeclaration getVariableDeclarationElement() { + return (JetDeclaration) element; + } + + @Override + public void accept(InstructionVisitor visitor) { + visitor.visitVariableDeclarationInstruction(this); + } + + @Override + public String toString() { + return "v(" + element.getText() + ")"; + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java index 6055cc166ff..c8fbeafee31 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ControlFlowAnalyzer.java @@ -67,7 +67,7 @@ public class ControlFlowAnalyzer { ? propertyDescriptor.getGetter() : propertyDescriptor.getSetter(); assert accessorDescriptor != null; - flowInformationProvider.checkDefiniteReturn(accessor, accessorDescriptor.getReturnType()); + checkFunction(accessor, accessorDescriptor.getReturnType()); } } } diff --git a/compiler/testData/cfg/AnonymousInitializers.instructions b/compiler/testData/cfg/AnonymousInitializers.instructions index 6aa7daaa126..d7025fa1f2a 100644 --- a/compiler/testData/cfg/AnonymousInitializers.instructions +++ b/compiler/testData/cfg/AnonymousInitializers.instructions @@ -1,16 +1,3 @@ -== get_j == -get() = 20 ---------------------- -l3: - NEXT:[r(20)] PREV:[] - r(20) NEXT:[] PREV:[] -l4: - NEXT:[] PREV:[r(20)] -error: - NEXT:[] PREV:[] -sink: - NEXT:[] PREV:[] -===================== == AnonymousInitializers == class AnonymousInitializers() { val k = 34 @@ -29,26 +16,31 @@ class AnonymousInitializers() { } --------------------- l0: - NEXT:[r(34)] PREV:[] - r(34) NEXT:[w(k)] PREV:[] - w(k) NEXT:[r(12)] PREV:[r(34)] - r(12) NEXT:[w($i)] PREV:[w(k)] - w($i) NEXT:[r(13)] PREV:[r(12)] - r(13) NEXT:[w($i)] PREV:[w($i)] - w($i) NEXT:[jmp?(l2)] PREV:[r(13)] - jmp?(l2) NEXT:[, d(get() = 20)] PREV:[w($i)] - d(get() = 20) NEXT:[] PREV:[jmp?(l2)] + NEXT:[v(val k = 34)] PREV:[] + v(val k = 34) NEXT:[r(34)] PREV:[] + r(34) NEXT:[w(k)] PREV:[v(val k = 34)] + w(k) NEXT:[v(val i: Int)] PREV:[r(34)] + v(val i: Int) NEXT:[r(12)] PREV:[w(k)] + r(12) NEXT:[w($i)] PREV:[v(val i: Int)] + w($i) NEXT:[v(val j: Int get() = 20) ] PREV:[r(12)] + v(val j: Int + get() = 20) NEXT:[r(13)] PREV:[w($i)] + r(13) NEXT:[w($i)] PREV:[v(val j: Int get() = 20) ] + w($i) NEXT:[] PREV:[r(13)] l1: -l2: - NEXT:[] PREV:[jmp?(l2)] + NEXT:[] PREV:[w($i)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[d(get() = 20), ] -l3: + NEXT:[] PREV:[] +===================== +== get_j == +get() = 20 +--------------------- +l0: NEXT:[r(20)] PREV:[] r(20) NEXT:[] PREV:[] -l4: +l1: NEXT:[] PREV:[r(20)] error: NEXT:[] PREV:[] diff --git a/compiler/testData/cfg/ArrayAccess.instructions b/compiler/testData/cfg/ArrayAccess.instructions index d6fbbcd6b6d..6bdc275b8e8 100644 --- a/compiler/testData/cfg/ArrayAccess.instructions +++ b/compiler/testData/cfg/ArrayAccess.instructions @@ -10,31 +10,32 @@ fun foo() { } --------------------- l0: - NEXT:[r(Array)] PREV:[] - r(Array) NEXT:[r(Array)] PREV:[] - r(Array) NEXT:[w(a)] PREV:[r(Array)] - w(a) NEXT:[r(3)] PREV:[r(Array)] - r(3) NEXT:[r(4)] PREV:[w(a)] - r(4) NEXT:[r(10)] PREV:[r(3)] - r(10) NEXT:[r(a)] PREV:[r(4)] - r(a) NEXT:[r(=)] PREV:[r(10)] - r(=) NEXT:[w(a[10])] PREV:[r(a)] - w(a[10]) NEXT:[r(2)] PREV:[r(=)] - r(2) NEXT:[r(10)] PREV:[w(a[10])] - r(10) NEXT:[r(a)] PREV:[r(2)] - r(a) NEXT:[r(a[10])] PREV:[r(10)] - r(a[10]) NEXT:[r(100)] PREV:[r(a)] - r(100) NEXT:[r(10)] PREV:[r(a[10])] - r(10) NEXT:[r(a)] PREV:[r(100)] - r(a) NEXT:[r(a[10])] PREV:[r(10)] - r(a[10]) NEXT:[r(1)] PREV:[r(a)] - r(1) NEXT:[r(+=)] PREV:[r(a[10])] - r(+=) NEXT:[w(a[10])] PREV:[r(1)] - w(a[10]) NEXT:[] PREV:[r(+=)] + NEXT:[v(val a = Array)] PREV:[] + v(val a = Array) NEXT:[r(Array)] PREV:[] + r(Array) NEXT:[r(Array)] PREV:[v(val a = Array)] + r(Array) NEXT:[w(a)] PREV:[r(Array)] + w(a) NEXT:[r(3)] PREV:[r(Array)] + r(3) NEXT:[r(4)] PREV:[w(a)] + r(4) NEXT:[r(10)] PREV:[r(3)] + r(10) NEXT:[r(a)] PREV:[r(4)] + r(a) NEXT:[r(=)] PREV:[r(10)] + r(=) NEXT:[w(a[10])] PREV:[r(a)] + w(a[10]) NEXT:[r(2)] PREV:[r(=)] + r(2) NEXT:[r(10)] PREV:[w(a[10])] + r(10) NEXT:[r(a)] PREV:[r(2)] + r(a) NEXT:[r(a[10])] PREV:[r(10)] + r(a[10]) NEXT:[r(100)] PREV:[r(a)] + r(100) NEXT:[r(10)] PREV:[r(a[10])] + r(10) NEXT:[r(a)] PREV:[r(100)] + r(a) NEXT:[r(a[10])] PREV:[r(10)] + r(a[10]) NEXT:[r(1)] PREV:[r(a)] + r(1) NEXT:[r(+=)] PREV:[r(a[10])] + r(+=) NEXT:[w(a[10])] PREV:[r(1)] + w(a[10]) NEXT:[] PREV:[r(+=)] l1: - NEXT:[] PREV:[w(a[10])] + NEXT:[] PREV:[w(a[10])] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== diff --git a/compiler/testData/cfg/Assignments.instructions b/compiler/testData/cfg/Assignments.instructions index 974d10e915b..ec20a1a74fa 100644 --- a/compiler/testData/cfg/Assignments.instructions +++ b/compiler/testData/cfg/Assignments.instructions @@ -4,13 +4,14 @@ class Test { } --------------------- l0: - NEXT:[] PREV:[] + NEXT:[v(var x : Int;)] PREV:[] + v(var x : Int;) NEXT:[] PREV:[] l1: - NEXT:[] PREV:[] + NEXT:[] PREV:[v(var x : Int;)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == assignments == fun assignments() : Unit { @@ -28,46 +29,50 @@ fun assignments() : Unit { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[w(x)] PREV:[] - w(x) NEXT:[r(2)] PREV:[r(1)] - r(2) NEXT:[w(x)] PREV:[w(x)] - w(x) NEXT:[r(x)] PREV:[r(2)] - r(x) NEXT:[r(2)] PREV:[w(x)] - r(2) NEXT:[r(+=)] PREV:[r(x)] - r(+=) NEXT:[w(x)] PREV:[r(2)] - w(x) NEXT:[r(true)] PREV:[r(+=)] - r(true) NEXT:[jf(l2)] PREV:[w(x)] - jf(l2) NEXT:[r(2), r(1)] PREV:[r(true)] - r(1) NEXT:[jmp(l3)] PREV:[jf(l2)] - jmp(l3) NEXT:[w(x)] PREV:[r(1)] + NEXT:[v(var x = 1)] PREV:[] + v(var x = 1) NEXT:[r(1)] PREV:[] + r(1) NEXT:[w(x)] PREV:[v(var x = 1)] + w(x) NEXT:[r(2)] PREV:[r(1)] + r(2) NEXT:[w(x)] PREV:[w(x)] + w(x) NEXT:[r(x)] PREV:[r(2)] + r(x) NEXT:[r(2)] PREV:[w(x)] + r(2) NEXT:[r(+=)] PREV:[r(x)] + r(+=) NEXT:[w(x)] PREV:[r(2)] + w(x) NEXT:[r(true)] PREV:[r(+=)] + r(true) NEXT:[jf(l2)] PREV:[w(x)] + jf(l2) NEXT:[r(2), r(1)] PREV:[r(true)] + r(1) NEXT:[jmp(l3)] PREV:[jf(l2)] + jmp(l3) NEXT:[w(x)] PREV:[r(1)] l2: - r(2) NEXT:[w(x)] PREV:[jf(l2)] + r(2) NEXT:[w(x)] PREV:[jf(l2)] l3: - w(x) NEXT:[r(true)] PREV:[jmp(l3), r(2)] - r(true) NEXT:[jf(l4)] PREV:[w(x)] - jf(l4) NEXT:[r(true && false), r(false)] PREV:[r(true)] - r(false) NEXT:[r(true && false)] PREV:[jf(l4)] + w(x) NEXT:[v(val y = true && false)] PREV:[jmp(l3), r(2)] + v(val y = true && false) NEXT:[r(true)] PREV:[w(x)] + r(true) NEXT:[jf(l4)] PREV:[v(val y = true && false)] + jf(l4) NEXT:[r(true && false), r(false)] PREV:[r(true)] + r(false) NEXT:[r(true && false)] PREV:[jf(l4)] l4: - r(true && false) NEXT:[w(y)] PREV:[jf(l4), r(false)] - w(y) NEXT:[r(false)] PREV:[r(true && false)] - r(false) NEXT:[jf(l5)] PREV:[w(y)] - jf(l5) NEXT:[r(false && true), r(true)] PREV:[r(false)] - r(true) NEXT:[r(false && true)] PREV:[jf(l5)] + r(true && false) NEXT:[w(y)] PREV:[jf(l4), r(false)] + w(y) NEXT:[v(val z = false && true)] PREV:[r(true && false)] + v(val z = false && true) NEXT:[r(false)] PREV:[w(y)] + r(false) NEXT:[jf(l5)] PREV:[v(val z = false && true)] + jf(l5) NEXT:[r(false && true), r(true)] PREV:[r(false)] + r(true) NEXT:[r(false && true)] PREV:[jf(l5)] l5: - r(false && true) NEXT:[w(z)] PREV:[jf(l5), r(true)] - w(z) NEXT:[r(Test)] PREV:[r(false && true)] - r(Test) NEXT:[r(Test())] PREV:[w(z)] - r(Test()) NEXT:[w(t)] PREV:[r(Test)] - w(t) NEXT:[r(1)] PREV:[r(Test())] - r(1) NEXT:[r(t)] PREV:[w(t)] - r(t) NEXT:[r(=)] PREV:[r(1)] - r(=) NEXT:[w(t.x)] PREV:[r(t)] - w(t.x) NEXT:[] PREV:[r(=)] + r(false && true) NEXT:[w(z)] PREV:[jf(l5), r(true)] + w(z) NEXT:[v(val t = Test())] PREV:[r(false && true)] + v(val t = Test()) NEXT:[r(Test)] PREV:[w(z)] + r(Test) NEXT:[r(Test())] PREV:[v(val t = Test())] + r(Test()) NEXT:[w(t)] PREV:[r(Test)] + w(t) NEXT:[r(1)] PREV:[r(Test())] + r(1) NEXT:[r(t)] PREV:[w(t)] + r(t) NEXT:[r(=)] PREV:[r(1)] + r(=) NEXT:[w(t.x)] PREV:[r(t)] + w(t.x) NEXT:[] PREV:[r(=)] l1: - NEXT:[] PREV:[w(t.x)] + NEXT:[] PREV:[w(t.x)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== diff --git a/compiler/testData/cfg/Finally.instructions b/compiler/testData/cfg/Finally.instructions index 09dddc96174..b8c3f5fdf29 100644 --- a/compiler/testData/cfg/Finally.instructions +++ b/compiler/testData/cfg/Finally.instructions @@ -392,8 +392,9 @@ l0: r(1) NEXT:[r(a)] PREV:[] r(a) NEXT:[r(..)] PREV:[r(1)] r(..) NEXT:[r(1..a)] PREV:[r(a)] - r(1..a) NEXT:[w(i)] PREV:[r(..)] - w(i) NEXT:[jmp?(l2)] PREV:[r(1..a)] + r(1..a) NEXT:[v(i)] PREV:[r(..)] + v(i) NEXT:[w(i)] PREV:[r(1..a)] + w(i) NEXT:[jmp?(l2)] PREV:[v(i)] l3: jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)] l4: @@ -442,8 +443,9 @@ l0: r(1) NEXT:[r(a)] PREV:[] r(a) NEXT:[r(..)] PREV:[r(1)] r(..) NEXT:[r(1..a)] PREV:[r(a)] - r(1..a) NEXT:[w(i)] PREV:[r(..)] - w(i) NEXT:[jmp?(l2)] PREV:[r(1..a)] + r(1..a) NEXT:[v(i)] PREV:[r(..)] + v(i) NEXT:[w(i)] PREV:[r(1..a)] + w(i) NEXT:[jmp?(l2)] PREV:[v(i)] l3: jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)] l4: @@ -491,8 +493,9 @@ l0: r(1) NEXT:[r(a)] PREV:[] r(a) NEXT:[r(..)] PREV:[r(1)] r(..) NEXT:[r(1..a)] PREV:[r(a)] - r(1..a) NEXT:[w(i)] PREV:[r(..)] - w(i) NEXT:[jmp?(l2)] PREV:[r(1..a)] + r(1..a) NEXT:[v(i)] PREV:[r(..)] + v(i) NEXT:[w(i)] PREV:[r(1..a)] + w(i) NEXT:[jmp?(l2)] PREV:[v(i)] l3: jmp?(l2) NEXT:[read (Unit), r(1)] PREV:[w(i)] l4: @@ -588,33 +591,34 @@ fun t13() : Int { } --------------------- l0: - NEXT:[jmp?(l2)] PREV:[] - jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] - r(1) NEXT:[r(3)] PREV:[jmp?(l2)] - r(3) NEXT:[r(doSmth)] PREV:[r(1)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] - ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] + NEXT:[jmp?(l2)] PREV:[] + jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] + r(1) NEXT:[r(3)] PREV:[jmp?(l2)] + r(3) NEXT:[r(doSmth)] PREV:[r(1)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] + ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] l3: -R jmp(l4) NEXT:[r(3)] PREV:[] +R jmp(l4) NEXT:[r(3)] PREV:[] l2: - jmp?() NEXT:[w(e)] PREV:[jmp?(l2)] - w(e) NEXT:[r(2)] PREV:[jmp?()] - r(2) NEXT:[r(doSmth)] PREV:[w(e)] - r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] - r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)] + jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] + v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] + w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] + r(2) NEXT:[r(doSmth)] PREV:[w(e)] + r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] + r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)] l5: - jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(2))] + jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(2))] l4: - r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[] PREV:[r(doSmth)] + r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[] PREV:[r(doSmth)] l1: - NEXT:[] PREV:[ret(*) l1, r(doSmth(3))] + NEXT:[] PREV:[ret(*) l1, r(doSmth(3))] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t14 == fun t14() : Int { @@ -627,27 +631,28 @@ fun t14() : Int { } --------------------- l0: - NEXT:[jmp?(l2)] PREV:[] - jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] - r(1) NEXT:[ret(*) l1] PREV:[jmp?(l2)] - ret(*) l1 NEXT:[] PREV:[r(1)] + NEXT:[jmp?(l2)] PREV:[] + jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] + r(1) NEXT:[ret(*) l1] PREV:[jmp?(l2)] + ret(*) l1 NEXT:[] PREV:[r(1)] l3: -R jmp(l4) NEXT:[] PREV:[] +R jmp(l4) NEXT:[] PREV:[] l2: - jmp?() NEXT:[w(e)] PREV:[jmp?(l2)] - w(e) NEXT:[r(2)] PREV:[jmp?()] - r(2) NEXT:[r(doSmth)] PREV:[w(e)] - r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] - r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)] + jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] + v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] + w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] + r(2) NEXT:[r(doSmth)] PREV:[w(e)] + r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] + r(doSmth(2)) NEXT:[jmp(l4)] PREV:[r(doSmth)] l5: - jmp(l4) NEXT:[] PREV:[r(doSmth(2))] + jmp(l4) NEXT:[] PREV:[r(doSmth(2))] l1: l4: - NEXT:[] PREV:[ret(*) l1, jmp(l4)] + NEXT:[] PREV:[ret(*) l1, jmp(l4)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t15 == fun t15() : Int { @@ -663,35 +668,36 @@ fun t15() : Int { } --------------------- l0: - NEXT:[jmp?(l2)] PREV:[] - jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] - r(1) NEXT:[r(3)] PREV:[jmp?(l2)] - r(3) NEXT:[r(doSmth)] PREV:[r(1)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] - ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] + NEXT:[jmp?(l2)] PREV:[] + jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] + r(1) NEXT:[r(3)] PREV:[jmp?(l2)] + r(3) NEXT:[r(doSmth)] PREV:[r(1)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] + ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] l3: -R jmp(l4) NEXT:[r(3)] PREV:[] +R jmp(l4) NEXT:[r(3)] PREV:[] l2: - jmp?() NEXT:[w(e)] PREV:[jmp?(l2)] - w(e) NEXT:[r(2)] PREV:[jmp?()] - r(2) NEXT:[r(3)] PREV:[w(e)] - r(3) NEXT:[r(doSmth)] PREV:[r(2)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] - ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] + jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] + v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] + w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] + r(2) NEXT:[r(3)] PREV:[w(e)] + r(3) NEXT:[r(doSmth)] PREV:[r(2)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] + ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] l5: -R jmp(l4) NEXT:[r(3)] PREV:[] +R jmp(l4) NEXT:[r(3)] PREV:[] l4: -R r(3) NEXT:[r(doSmth)] PREV:[] -R r(doSmth) NEXT:[r(doSmth(3))] PREV:[] -R r(doSmth(3)) NEXT:[] PREV:[] +R r(3) NEXT:[r(doSmth)] PREV:[] +R r(doSmth) NEXT:[r(doSmth(3))] PREV:[] +R r(doSmth(3)) NEXT:[] PREV:[] l1: - NEXT:[] PREV:[ret(*) l1, ret(*) l1] + NEXT:[] PREV:[ret(*) l1, ret(*) l1] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t16 == fun t16() : Int { @@ -707,33 +713,34 @@ fun t16() : Int { } --------------------- l0: - NEXT:[jmp?(l2)] PREV:[] - jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] - r(1) NEXT:[r(doSmth)] PREV:[jmp?(l2)] - r(doSmth) NEXT:[r(doSmth(1))] PREV:[r(1)] - r(doSmth(1)) NEXT:[jmp(l4)] PREV:[r(doSmth)] + NEXT:[jmp?(l2)] PREV:[] + jmp?(l2) NEXT:[jmp?(), r(1)] PREV:[] + r(1) NEXT:[r(doSmth)] PREV:[jmp?(l2)] + r(doSmth) NEXT:[r(doSmth(1))] PREV:[r(1)] + r(doSmth(1)) NEXT:[jmp(l4)] PREV:[r(doSmth)] l3: - jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(1))] + jmp(l4) NEXT:[r(3)] PREV:[r(doSmth(1))] l2: - jmp?() NEXT:[w(e)] PREV:[jmp?(l2)] - w(e) NEXT:[r(2)] PREV:[jmp?()] - r(2) NEXT:[r(3)] PREV:[w(e)] - r(3) NEXT:[r(doSmth)] PREV:[r(2)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] - ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] + jmp?() NEXT:[v(e: UnsupportedOperationException)] PREV:[jmp?(l2)] + v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?()] + w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] + r(2) NEXT:[r(3)] PREV:[w(e)] + r(3) NEXT:[r(doSmth)] PREV:[r(2)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[ret(*) l1] PREV:[r(doSmth)] + ret(*) l1 NEXT:[] PREV:[r(doSmth(3))] l5: -R jmp(l4) NEXT:[r(3)] PREV:[] +R jmp(l4) NEXT:[r(3)] PREV:[] l4: - r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] - r(doSmth(3)) NEXT:[] PREV:[r(doSmth)] + r(3) NEXT:[r(doSmth)] PREV:[jmp(l4)] + r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] + r(doSmth(3)) NEXT:[] PREV:[r(doSmth)] l1: - NEXT:[] PREV:[ret(*) l1, r(doSmth(3))] + NEXT:[] PREV:[ret(*) l1, r(doSmth(3))] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == doSmth == fun doSmth(i: Int) { diff --git a/compiler/testData/cfg/For.instructions b/compiler/testData/cfg/For.instructions index 8343194883d..7b782c13b55 100644 --- a/compiler/testData/cfg/For.instructions +++ b/compiler/testData/cfg/For.instructions @@ -10,8 +10,9 @@ l0: r(1) NEXT:[r(2)] PREV:[] r(2) NEXT:[r(..)] PREV:[r(1)] r(..) NEXT:[r(1..2)] PREV:[r(2)] - r(1..2) NEXT:[w(i)] PREV:[r(..)] - w(i) NEXT:[jmp?(l2)] PREV:[r(1..2)] + r(1..2) NEXT:[v(i)] PREV:[r(..)] + v(i) NEXT:[w(i)] PREV:[r(1..2)] + w(i) NEXT:[jmp?(l2)] PREV:[v(i)] l3: jmp?(l2) NEXT:[read (Unit), r(i)] PREV:[w(i)] l4: diff --git a/compiler/testData/cfg/If.instructions b/compiler/testData/cfg/If.instructions index e1d4dc25f3d..b188c60a1a4 100644 --- a/compiler/testData/cfg/If.instructions +++ b/compiler/testData/cfg/If.instructions @@ -17,36 +17,38 @@ fun t1(b: Boolean) { } --------------------- l0: - NEXT:[r(b)] PREV:[] - r(b) NEXT:[jf(l2)] PREV:[] - jf(l2) NEXT:[read (Unit), r("s")] PREV:[r(b)] - r("s") NEXT:[w(u)] PREV:[jf(l2)] - w(u) NEXT:[jmp(l3)] PREV:[r("s")] - jmp(l3) NEXT:[r(u)] PREV:[w(u)] + NEXT:[v(var u: String)] PREV:[] + v(var u: String) NEXT:[r(b)] PREV:[] + r(b) NEXT:[jf(l2)] PREV:[v(var u: String)] + jf(l2) NEXT:[read (Unit), r("s")] PREV:[r(b)] + r("s") NEXT:[w(u)] PREV:[jf(l2)] + w(u) NEXT:[jmp(l3)] PREV:[r("s")] + jmp(l3) NEXT:[r(u)] PREV:[w(u)] l2: - read (Unit) NEXT:[r(u)] PREV:[jf(l2)] + read (Unit) NEXT:[r(u)] PREV:[jf(l2)] l3: - r(u) NEXT:[r(doSmth)] PREV:[jmp(l3), read (Unit)] - r(doSmth) NEXT:[r(doSmth(u))] PREV:[r(u)] - r(doSmth(u)) NEXT:[r(b)] PREV:[r(doSmth)] - r(b) NEXT:[jf(l4)] PREV:[r(doSmth(u))] - jf(l4) NEXT:[r("t"), r("s")] PREV:[r(b)] - r("s") NEXT:[w(r)] PREV:[jf(l4)] - w(r) NEXT:[jmp(l5)] PREV:[r("s")] - jmp(l5) NEXT:[r(r)] PREV:[w(r)] + r(u) NEXT:[r(doSmth)] PREV:[jmp(l3), read (Unit)] + r(doSmth) NEXT:[r(doSmth(u))] PREV:[r(u)] + r(doSmth(u)) NEXT:[v(var r: String)] PREV:[r(doSmth)] + v(var r: String) NEXT:[r(b)] PREV:[r(doSmth(u))] + r(b) NEXT:[jf(l4)] PREV:[v(var r: String)] + jf(l4) NEXT:[r("t"), r("s")] PREV:[r(b)] + r("s") NEXT:[w(r)] PREV:[jf(l4)] + w(r) NEXT:[jmp(l5)] PREV:[r("s")] + jmp(l5) NEXT:[r(r)] PREV:[w(r)] l4: - r("t") NEXT:[w(r)] PREV:[jf(l4)] - w(r) NEXT:[r(r)] PREV:[r("t")] + r("t") NEXT:[w(r)] PREV:[jf(l4)] + w(r) NEXT:[r(r)] PREV:[r("t")] l5: - r(r) NEXT:[r(doSmth)] PREV:[jmp(l5), w(r)] - r(doSmth) NEXT:[r(doSmth(r))] PREV:[r(r)] - r(doSmth(r)) NEXT:[] PREV:[r(doSmth)] + r(r) NEXT:[r(doSmth)] PREV:[jmp(l5), w(r)] + r(doSmth) NEXT:[r(doSmth(r))] PREV:[r(r)] + r(doSmth(r)) NEXT:[] PREV:[r(doSmth)] l1: - NEXT:[] PREV:[r(doSmth(r))] + NEXT:[] PREV:[r(doSmth(r))] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == t2 == fun t2(b: Boolean) { @@ -61,8 +63,9 @@ fun t2(b: Boolean) { } --------------------- l0: - NEXT:[r(3)] PREV:[] - r(3) NEXT:[w(i)] PREV:[] + NEXT:[v(val i = 3)] PREV:[] + v(val i = 3) NEXT:[r(3)] PREV:[] + r(3) NEXT:[w(i)] PREV:[v(val i = 3)] w(i) NEXT:[r(b)] PREV:[r(3)] r(b) NEXT:[jf(l2)] PREV:[w(i)] jf(l2) NEXT:[read (Unit), ret l1] PREV:[r(b)] diff --git a/compiler/testData/cfg/LocalDeclarations.instructions b/compiler/testData/cfg/LocalDeclarations.instructions index 8f7b54c2a39..94fabadf512 100644 --- a/compiler/testData/cfg/LocalDeclarations.instructions +++ b/compiler/testData/cfg/LocalDeclarations.instructions @@ -18,15 +18,16 @@ class C() { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[w(a)] PREV:[] - w(a) NEXT:[] PREV:[r(1)] + NEXT:[v(val a: Int = 1)] PREV:[] + v(val a: Int = 1) NEXT:[r(1)] PREV:[] + r(1) NEXT:[w(a)] PREV:[v(val a: Int = 1)] + w(a) NEXT:[] PREV:[r(1)] l1: - NEXT:[] PREV:[w(a)] + NEXT:[] PREV:[w(a)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == null == object { @@ -44,15 +45,16 @@ object { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[w($x)] PREV:[] - w($x) NEXT:[] PREV:[r(1)] + NEXT:[v(val x : Int)] PREV:[] + v(val x : Int) NEXT:[r(1)] PREV:[] + r(1) NEXT:[w($x)] PREV:[v(val x : Int)] + w($x) NEXT:[] PREV:[r(1)] l1: - NEXT:[] PREV:[w($x)] + NEXT:[] PREV:[w($x)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == O == object O { @@ -63,15 +65,16 @@ object O { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[w($x)] PREV:[] - w($x) NEXT:[] PREV:[r(1)] + NEXT:[v(val x : Int)] PREV:[] + v(val x : Int) NEXT:[r(1)] PREV:[] + r(1) NEXT:[w($x)] PREV:[v(val x : Int)] + w($x) NEXT:[] PREV:[r(1)] l1: - NEXT:[] PREV:[w($x)] + NEXT:[] PREV:[w($x)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == doSmth == fun doSmth(i: Int) {} @@ -97,8 +100,15 @@ fun test1() { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[w($x)] PREV:[] + NEXT:[v(val a = object { val x : I..)] PREV:[] + v(val a = object { + val x : Int + { + $x = 1 + } + }) NEXT:[v(val x : Int)] PREV:[] + v(val x : Int) NEXT:[r(1)] PREV:[v(val a = object { val x : I..)] + r(1) NEXT:[w($x)] PREV:[v(val x : Int)] w($x) NEXT:[r(object { val x : Int { $x ..)] PREV:[r(1)] r(object { val x : Int @@ -123,21 +133,26 @@ fun test2() { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[w(b)] PREV:[] - w(b) NEXT:[r(b)] PREV:[r(1)] - r(b) NEXT:[w(x)] PREV:[w(b)] - w(x) NEXT:[r(object { val x = b }) ] PREV:[r(b)] - r(object { - val x = b - }) NEXT:[w(a)] PREV:[w(x)] - w(a) NEXT:[] PREV:[r(object { val x = b }) ] + NEXT:[v(val b = 1)] PREV:[] + v(val b = 1) NEXT:[r(1)] PREV:[] + r(1) NEXT:[w(b)] PREV:[v(val b = 1)] + w(b) NEXT:[v(val a = object { val x = b..)] PREV:[r(1)] + v(val a = object { + val x = b + }) NEXT:[v(val x = b)] PREV:[w(b)] + v(val x = b) NEXT:[r(b)] PREV:[v(val a = object { val x = b..)] + r(b) NEXT:[w(x)] PREV:[v(val x = b)] + w(x) NEXT:[r(object { val x = b }) ] PREV:[r(b)] + r(object { + val x = b + }) NEXT:[w(a)] PREV:[w(x)] + w(a) NEXT:[] PREV:[r(object { val x = b }) ] l1: - NEXT:[] PREV:[w(a)] + NEXT:[] PREV:[w(a)] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== == inner_bar == fun inner_bar() { @@ -166,8 +181,15 @@ fun test3() { } --------------------- l0: - NEXT:[jmp?(l2)] PREV:[] - jmp?(l2) NEXT:[r(object { val y : Int fun i..), d(fun inner_bar() { y = 10 }) ] PREV:[] + NEXT:[v(val a = object { val y : I..)] PREV:[] + v(val a = object { + val y : Int + fun inner_bar() { + y = 10 + } + }) NEXT:[v(val y : Int)] PREV:[] + v(val y : Int) NEXT:[jmp?(l2)] PREV:[v(val a = object { val y : I..)] + jmp?(l2) NEXT:[r(object { val y : Int fun i..), d(fun inner_bar() { y = 10 }) ] PREV:[v(val y : Int)] d(fun inner_bar() { y = 10 }) NEXT:[] PREV:[jmp?(l2)] @@ -227,8 +249,20 @@ fun test4() { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[w($x)] PREV:[] + NEXT:[v(val a = object { val x : I..)] PREV:[] + v(val a = object { + val x : Int + val y : Int + { + $x = 1 + } + fun ggg() { + y = 10 + } + }) NEXT:[v(val x : Int)] PREV:[] + v(val x : Int) NEXT:[v(val y : Int)] PREV:[v(val a = object { val x : I..)] + v(val y : Int) NEXT:[r(1)] PREV:[v(val x : Int)] + r(1) NEXT:[w($x)] PREV:[v(val y : Int)] w($x) NEXT:[jmp?(l2)] PREV:[r(1)] jmp?(l2) NEXT:[r(object { val x : Int val y..), d(fun ggg() { y = 10 }) ] PREV:[w($x)] d(fun ggg() { @@ -312,8 +346,21 @@ fun test5() { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[w(x)] PREV:[] + NEXT:[v(val a = object { var x = 1..)] PREV:[] + v(val a = object { + var x = 1 + { + $x = 2 + } + fun foo() { + x = 3 + } + fun bar() { + x = 4 + } + }) NEXT:[v(var x = 1)] PREV:[] + v(var x = 1) NEXT:[r(1)] PREV:[v(val a = object { var x = 1..)] + r(1) NEXT:[w(x)] PREV:[v(var x = 1)] w(x) NEXT:[r(2)] PREV:[r(1)] r(2) NEXT:[w($x)] PREV:[w(x)] w($x) NEXT:[jmp?(l2)] PREV:[r(2)] @@ -374,16 +421,17 @@ fun foo() { } --------------------- l0: - NEXT:[r(1)] PREV:[] - r(1) NEXT:[w(b)] PREV:[] - w(b) NEXT:[r(b)] PREV:[r(1)] - r(b) NEXT:[r(doSmth)] PREV:[w(b)] - r(doSmth) NEXT:[r(doSmth(b))] PREV:[r(b)] - r(doSmth(b)) NEXT:[] PREV:[r(doSmth)] + NEXT:[v(val b : Int = 1)] PREV:[] + v(val b : Int = 1) NEXT:[r(1)] PREV:[] + r(1) NEXT:[w(b)] PREV:[v(val b : Int = 1)] + w(b) NEXT:[r(b)] PREV:[r(1)] + r(b) NEXT:[r(doSmth)] PREV:[w(b)] + r(doSmth) NEXT:[r(doSmth(b))] PREV:[r(b)] + r(doSmth(b)) NEXT:[] PREV:[r(doSmth)] l1: - NEXT:[] PREV:[r(doSmth(b))] + NEXT:[] PREV:[r(doSmth(b))] error: - NEXT:[] PREV:[] + NEXT:[] PREV:[] sink: - NEXT:[] PREV:[] + NEXT:[] PREV:[] ===================== diff --git a/compiler/testData/checkerWithErrorTypes/quick/regressions/kt575.jet b/compiler/testData/checkerWithErrorTypes/quick/regressions/kt575.jet new file mode 100644 index 00000000000..aaa84ac3c9f --- /dev/null +++ b/compiler/testData/checkerWithErrorTypes/quick/regressions/kt575.jet @@ -0,0 +1,32 @@ +// KT-575 Cannot ++ a class object member + +namespace kt575 + +class Creature() { + class object { + var numCreated : Int = 0 + private set + } + + object A { + var bbb : Int + + { + $bbb = 1 + } + } + + class C() { + var ccc : Int + + { + $ccc = 2 + } + } + + { + Creature.numCreated++ // Error + A.bbb++ + C().ccc++ + } +} \ No newline at end of file