View | Details | Raw Unified | Return to bug 151787 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/jdt/core/tests/compiler/regression/AssignmentTest.java (+79 lines)
Lines 150-155 Link Here
150
		},
150
		},
151
		"12");
151
		"12");
152
}
152
}
153
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=151787
154
public void test004() {
155
	this.runNegativeTest(
156
		new String[] {
157
			"X.java",
158
			"public class X {\n" + 
159
			"    private final Object o;\n" + 
160
			"    X() {\n" + 
161
			"        X other = this;\n" + 
162
			"        other.o = new Object(); // illegal!  other.o is not assignable\n" + 
163
			"    } // error: this.o is not definitely assigned\n" + 
164
			"	\n" + 
165
			"    // incorrectly passes compilation\n" + 
166
			"    static class Test5 {\n" + 
167
			"        private final Object o;\n" + 
168
			"\n" + 
169
			"        Test5() {\n" + 
170
			"            Test5 other = this;\n" + 
171
			"            other.o = new Object(); // illegal!  other.o is not assignable\n" + 
172
			"        } // error: this.o is not definitely assigned\n" + 
173
			"    }\n" + 
174
			"\n" + 
175
			"    // flags wrong statement as error\n" + 
176
			"    static class Test6 {\n" + 
177
			"        private final Object o;\n" + 
178
			"        static Test6 initing;\n" + 
179
			"\n" + 
180
			"        Test6() {\n" + 
181
			"            initing = this;\n" + 
182
			"            System.out.println(\"greetings\");\n" + 
183
			"            Test6 other = initing;\n" + 
184
			"            other.o = new Object(); // illegal!  other.o is not assignable\n" + 
185
			"            o = new Object(); // legal\n" + 
186
			"        }\n" + 
187
			"    }\n" + 
188
			"}\n", // =================
189
		},
190
		"----------\n" + 
191
		"1. WARNING in X.java (at line 2)\n" + 
192
		"	private final Object o;\n" + 
193
		"	                     ^\n" + 
194
		"The field X.o is never read locally\n" + 
195
		"----------\n" + 
196
		"2. ERROR in X.java (at line 3)\n" + 
197
		"	X() {\n" + 
198
		"	^^^\n" + 
199
		"The blank final field o may not have been initialized\n" + 
200
		"----------\n" + 
201
		"3. ERROR in X.java (at line 5)\n" + 
202
		"	other.o = new Object(); // illegal!  other.o is not assignable\n" + 
203
		"	      ^\n" + 
204
		"The final field X.o cannot be assigned\n" + 
205
		"----------\n" + 
206
		"4. WARNING in X.java (at line 10)\n" + 
207
		"	private final Object o;\n" + 
208
		"	                     ^\n" + 
209
		"The field X.Test5.o is never read locally\n" + 
210
		"----------\n" + 
211
		"5. ERROR in X.java (at line 12)\n" + 
212
		"	Test5() {\n" + 
213
		"	^^^^^^^\n" + 
214
		"The blank final field o may not have been initialized\n" + 
215
		"----------\n" + 
216
		"6. ERROR in X.java (at line 14)\n" + 
217
		"	other.o = new Object(); // illegal!  other.o is not assignable\n" + 
218
		"	      ^\n" + 
219
		"The final field X.Test5.o cannot be assigned\n" + 
220
		"----------\n" + 
221
		"7. WARNING in X.java (at line 20)\n" + 
222
		"	private final Object o;\n" + 
223
		"	                     ^\n" + 
224
		"The field X.Test6.o is never read locally\n" + 
225
		"----------\n" + 
226
		"8. ERROR in X.java (at line 27)\n" + 
227
		"	other.o = new Object(); // illegal!  other.o is not assignable\n" + 
228
		"	      ^\n" + 
229
		"The final field X.Test6.o cannot be assigned\n" + 
230
		"----------\n");
231
}
153
// final multiple assignment
232
// final multiple assignment
154
public void test020() {
233
public void test020() {
155
	this.runNegativeTest(
234
	this.runNegativeTest(
(-)compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java (-19 / +12 lines)
Lines 42-53 Link Here
42
		this.sourceEnd = sourceEnd;
42
		this.sourceEnd = sourceEnd;
43
	}
43
	}
44
	
44
	
45
	public FlowInfo analyseAssignment(
45
	public FlowInfo analyseAssignment(BlockScope currentScope, 	FlowContext flowContext, FlowInfo flowInfo, Assignment assignment, boolean isCompound) {
46
		BlockScope currentScope,
47
		FlowContext flowContext,
48
		FlowInfo flowInfo,
49
		Assignment assignment,
50
		boolean isCompound) {
51
46
52
		// determine the rank until which we now we do not need any actual value for the field access
47
		// determine the rank until which we now we do not need any actual value for the field access
53
		int otherBindingsCount = otherBindings == null ? 0 : otherBindings.length;
48
		int otherBindingsCount = otherBindings == null ? 0 : otherBindings.length;
Lines 74-84 Link Here
74
							currentScope.problemReporter().enumStaticFieldUsedDuringInitialization(lastFieldBinding, this);
69
							currentScope.problemReporter().enumStaticFieldUsedDuringInitialization(lastFieldBinding, this);
75
						}
70
						}
76
					}				
71
					}				
77
				}				
72
				}
78
				// check if final blank field
73
				// check if final blank field
79
				if (lastFieldBinding.isBlankFinal()
74
				if (lastFieldBinding.isBlankFinal()
80
				    && this.otherBindings != null // the last field binding is only assigned
75
					    && this.otherBindings != null // the last field binding is only assigned
81
	 				&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) {
76
		 				&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) {
82
					if (!flowInfo.isDefinitelyAssigned(lastFieldBinding)) {
77
					if (!flowInfo.isDefinitelyAssigned(lastFieldBinding)) {
83
						currentScope.problemReporter().uninitializedBlankFinalField(
78
						currentScope.problemReporter().uninitializedBlankFinalField(
84
							lastFieldBinding,
79
							lastFieldBinding,
Lines 126-137 Link Here
126
121
127
		if (isCompound) {
122
		if (isCompound) {
128
			if (otherBindingsCount == 0
123
			if (otherBindingsCount == 0
129
				&& lastFieldBinding.isBlankFinal()
124
					&& lastFieldBinding.isBlankFinal()
130
				&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)
125
					&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)
131
				&& (!flowInfo.isDefinitelyAssigned(lastFieldBinding))) {
126
					&& (!flowInfo.isDefinitelyAssigned(lastFieldBinding))) {
132
				currentScope.problemReporter().uninitializedBlankFinalField(
127
				currentScope.problemReporter().uninitializedBlankFinalField(lastFieldBinding, this);
133
					lastFieldBinding,
134
					this);
135
			}
128
			}
136
			TypeBinding lastReceiverType;
129
			TypeBinding lastReceiverType;
137
			switch (otherBindingsCount) {
130
			switch (otherBindingsCount) {
Lines 164-173 Link Here
164
		// the last field access is a write access
157
		// the last field access is a write access
165
		if (lastFieldBinding.isFinal()) {
158
		if (lastFieldBinding.isFinal()) {
166
			// in a context where it can be assigned?
159
			// in a context where it can be assigned?
167
			if (lastFieldBinding.isBlankFinal()
160
			if (otherBindingsCount == 0
161
					&& lastFieldBinding.isBlankFinal()
168
					&& !isCompound
162
					&& !isCompound
169
					&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding) 
163
					&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) {
170
					&& indexOfFirstFieldBinding == 1) {
171
				if (flowInfo.isPotentiallyAssigned(lastFieldBinding)) {
164
				if (flowInfo.isPotentiallyAssigned(lastFieldBinding)) {
172
					currentScope.problemReporter().duplicateInitializationOfBlankFinalField(lastFieldBinding, this);
165
					currentScope.problemReporter().duplicateInitializationOfBlankFinalField(lastFieldBinding, this);
173
				} else {
166
				} else {
Lines 176-182 Link Here
176
				flowInfo.markAsDefinitelyAssigned(lastFieldBinding);
169
				flowInfo.markAsDefinitelyAssigned(lastFieldBinding);
177
			} else {
170
			} else {
178
				currentScope.problemReporter().cannotAssignToFinalField(lastFieldBinding, this);
171
				currentScope.problemReporter().cannotAssignToFinalField(lastFieldBinding, this);
179
				if (currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) { // pretend it got assigned
172
				if (otherBindingsCount == 0 && currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) { // pretend it got assigned
180
					flowInfo.markAsDefinitelyAssigned(lastFieldBinding);
173
					flowInfo.markAsDefinitelyAssigned(lastFieldBinding);
181
				}
174
				}
182
			}
175
			}

Return to bug 151787