### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core.tests.compiler Index: src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest.java,v retrieving revision 1.31.4.1 diff -u -r1.31.4.1 AssignmentTest.java --- src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest.java 15 Mar 2007 17:50:54 -0000 1.31.4.1 +++ src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest.java 30 Mar 2007 19:47:19 -0000 @@ -148,6 +148,117 @@ }, "12"); } +//https://bugs.eclipse.org/bugs/show_bug.cgi?id=151787 +public void test004() { + this.runNegativeTest( + new String[] { + "X.java", + "public class X {\n" + + " // correctly passes compilation\n" + + " static class Test1 {\n" + + " private final Object o;\n" + + " \n" + + " Test1() {\n" + + " o = new Object();\n" + + " }\n" + + " }\n" + + " \n" + + " // correctly passes compilation\n" + + " static class Test2 {\n" + + " private final Object o;\n" + + " \n" + + " Test2() {\n" + + " this.o = new Object();\n" + + " }\n" + + " }\n" + + " \n" + + " // correctly fails compilation\n" + + " static class Test3 {\n" + + " private final Object o;\n" + + " \n" + + " Test3() {\n" + + " System.out.println(o); // illegal; o is not definitely assigned\n" + + " o = new Object();\n" + + " }\n" + + " }\n" + + " \n" + + " // correctly passes compilation\n" + + " static class Test4 {\n" + + " private final Object o;\n" + + " \n" + + " Test4() {\n" + + " System.out.println(this.o); // legal\n" + + " o = new Object();\n" + + " }\n" + + " }\n" + + " \n" + + " // incorrectly passes compilation\n" + + " static class Test5 {\n" + + " private final Object o;\n" + + " \n" + + " Test5() {\n" + + " Test5 other = this;\n" + + " other.o = new Object(); // illegal! other.o is not assignable\n" + + " } // error: this.o is not definitely assigned\n" + + " }\n" + + " \n" + + " // flags wrong statement as error\n" + + " static class Test6 {\n" + + " private final Object o;\n" + + " static Test6 initing;\n" + + " \n" + + " Test6() {\n" + + " initing = this;\n" + + " System.out.println(\"greetings\");\n" + + " Test6 other = initing;\n" + + " other.o = new Object(); // illegal! other.o is not assignable\n" + + " o = new Object(); // legal\n" + + " }\n" + + " }\n" + + "}\n", // ================= + }, + "----------\n" + + "1. WARNING in X.java (at line 4)\n" + + " private final Object o;\n" + + " ^\n" + + "The field X.Test1.o is never read locally\n" + + "----------\n" + + "2. WARNING in X.java (at line 13)\n" + + " private final Object o;\n" + + " ^\n" + + "The field X.Test2.o is never read locally\n" + + "----------\n" + + "3. ERROR in X.java (at line 25)\n" + + " System.out.println(o); // illegal; o is not definitely assigned\n" + + " ^\n" + + "The blank final field o may not have been initialized\n" + + "----------\n" + + "4. WARNING in X.java (at line 42)\n" + + " private final Object o;\n" + + " ^\n" + + "The field X.Test5.o is never read locally\n" + + "----------\n" + + "5. ERROR in X.java (at line 44)\n" + + " Test5() {\n" + + " ^^^^^^^\n" + + "The blank final field o may not have been initialized\n" + + "----------\n" + + "6. ERROR in X.java (at line 46)\n" + + " other.o = new Object(); // illegal! other.o is not assignable\n" + + " ^\n" + + "The final field X.Test5.o cannot be assigned\n" + + "----------\n" + + "7. WARNING in X.java (at line 52)\n" + + " private final Object o;\n" + + " ^\n" + + "The field X.Test6.o is never read locally\n" + + "----------\n" + + "8. ERROR in X.java (at line 59)\n" + + " other.o = new Object(); // illegal! other.o is not assignable\n" + + " ^\n" + + "The final field X.Test6.o cannot be assigned\n" + + "----------\n"); +} // final multiple assignment public void test020() { this.runNegativeTest( #P org.eclipse.jdt.core Index: compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java,v retrieving revision 1.106.4.5 diff -u -r1.106.4.5 QualifiedNameReference.java --- compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java 15 Mar 2007 17:50:57 -0000 1.106.4.5 +++ compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java 30 Mar 2007 19:47:24 -0000 @@ -126,9 +126,9 @@ if (isCompound) { if (otherBindingsCount == 0 - && lastFieldBinding.isBlankFinal() - && currentScope.allowBlankFinalFieldAssignment(lastFieldBinding) - && (!flowInfo.isDefinitelyAssigned(lastFieldBinding))) { + && lastFieldBinding.isBlankFinal() + && currentScope.allowBlankFinalFieldAssignment(lastFieldBinding) + && (!flowInfo.isDefinitelyAssigned(lastFieldBinding))) { currentScope.problemReporter().uninitializedBlankFinalField( lastFieldBinding, this); @@ -164,10 +164,11 @@ // the last field access is a write access if (lastFieldBinding.isFinal()) { // in a context where it can be assigned? - if (lastFieldBinding.isBlankFinal() + if (otherBindingsCount == 0 + && this.indexOfFirstFieldBinding == 1 + && lastFieldBinding.isBlankFinal() && !isCompound - && currentScope.allowBlankFinalFieldAssignment(lastFieldBinding) - && indexOfFirstFieldBinding == 1) { + && currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) { if (flowInfo.isPotentiallyAssigned(lastFieldBinding)) { currentScope.problemReporter().duplicateInitializationOfBlankFinalField(lastFieldBinding, this); } else { @@ -176,7 +177,7 @@ flowInfo.markAsDefinitelyAssigned(lastFieldBinding); } else { currentScope.problemReporter().cannotAssignToFinalField(lastFieldBinding, this); - if (currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) { // pretend it got assigned + if (otherBindingsCount == 0 && currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) { // pretend it got assigned flowInfo.markAsDefinitelyAssigned(lastFieldBinding); } }