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 (+111 lines)
Lines 148-153 Link Here
148
		},
148
		},
149
		"12");
149
		"12");
150
}
150
}
151
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=151787
152
public void test004() {
153
	this.runNegativeTest(
154
		new String[] {
155
			"X.java",
156
			"public class X {\n" + 
157
			"    // correctly passes compilation\n" + 
158
			"    static class Test1 {\n" + 
159
			"        private final Object o;\n" + 
160
			"        \n" + 
161
			"        Test1() {\n" + 
162
			"            o = new Object();\n" + 
163
			"        }\n" + 
164
			"    }\n" + 
165
			"    \n" + 
166
			"    // correctly passes compilation\n" + 
167
			"    static class Test2 {\n" + 
168
			"        private final Object o;\n" + 
169
			"        \n" + 
170
			"        Test2() {\n" + 
171
			"            this.o = new Object();\n" + 
172
			"        }\n" + 
173
			"    }\n" + 
174
			"    \n" + 
175
			"    // correctly fails compilation\n" + 
176
			"    static class Test3 {\n" + 
177
			"        private final Object o;\n" + 
178
			"        \n" + 
179
			"        Test3() {\n" + 
180
			"            System.out.println(o); // illegal; o is not definitely assigned\n" + 
181
			"            o = new Object();\n" + 
182
			"        }\n" + 
183
			"    }\n" + 
184
			"    \n" + 
185
			"    // correctly passes compilation\n" + 
186
			"    static class Test4 {\n" + 
187
			"        private final Object o;\n" + 
188
			"        \n" + 
189
			"        Test4() {\n" + 
190
			"            System.out.println(this.o); // legal\n" + 
191
			"            o = new Object();\n" + 
192
			"        }\n" + 
193
			"    }\n" + 
194
			"    \n" + 
195
			"    // incorrectly passes compilation\n" + 
196
			"    static class Test5 {\n" + 
197
			"        private final Object o;\n" + 
198
			"        \n" + 
199
			"        Test5() {\n" + 
200
			"            Test5 other = this;\n" + 
201
			"            other.o = new Object(); // illegal!  other.o is not assignable\n" + 
202
			"        } // error: this.o is not definitely assigned\n" + 
203
			"    }\n" + 
204
			"    \n" + 
205
			"    // flags wrong statement as error\n" + 
206
			"    static class Test6 {\n" + 
207
			"        private final Object o;\n" + 
208
			"        static Test6 initing;\n" + 
209
			"        \n" + 
210
			"       Test6() {\n" + 
211
			"           initing = this;\n" + 
212
			"           System.out.println(\"greetings\");\n" + 
213
			"           Test6 other = initing;\n" + 
214
			"           other.o = new Object(); // illegal!  other.o is not assignable\n" + 
215
			"           o = new Object(); // legal\n" + 
216
			"       }\n" + 
217
			"    }\n" + 
218
			"}\n", // =================
219
		},
220
		"----------\n" + 
221
		"1. WARNING in X.java (at line 4)\n" + 
222
		"	private final Object o;\n" + 
223
		"	                     ^\n" + 
224
		"The field X.Test1.o is never read locally\n" + 
225
		"----------\n" + 
226
		"2. WARNING in X.java (at line 13)\n" + 
227
		"	private final Object o;\n" + 
228
		"	                     ^\n" + 
229
		"The field X.Test2.o is never read locally\n" + 
230
		"----------\n" + 
231
		"3. ERROR in X.java (at line 25)\n" + 
232
		"	System.out.println(o); // illegal; o is not definitely assigned\n" + 
233
		"	                   ^\n" + 
234
		"The blank final field o may not have been initialized\n" + 
235
		"----------\n" + 
236
		"4. WARNING in X.java (at line 42)\n" + 
237
		"	private final Object o;\n" + 
238
		"	                     ^\n" + 
239
		"The field X.Test5.o is never read locally\n" + 
240
		"----------\n" + 
241
		"5. ERROR in X.java (at line 44)\n" + 
242
		"	Test5() {\n" + 
243
		"	^^^^^^^\n" + 
244
		"The blank final field o may not have been initialized\n" + 
245
		"----------\n" + 
246
		"6. ERROR in X.java (at line 46)\n" + 
247
		"	other.o = new Object(); // illegal!  other.o is not assignable\n" + 
248
		"	      ^\n" + 
249
		"The final field X.Test5.o cannot be assigned\n" + 
250
		"----------\n" + 
251
		"7. WARNING in X.java (at line 52)\n" + 
252
		"	private final Object o;\n" + 
253
		"	                     ^\n" + 
254
		"The field X.Test6.o is never read locally\n" + 
255
		"----------\n" + 
256
		"8. ERROR in X.java (at line 59)\n" + 
257
		"	other.o = new Object(); // illegal!  other.o is not assignable\n" + 
258
		"	      ^\n" + 
259
		"The final field X.Test6.o cannot be assigned\n" + 
260
		"----------\n");
261
}
151
// final multiple assignment
262
// final multiple assignment
152
public void test020() {
263
public void test020() {
153
	this.runNegativeTest(
264
	this.runNegativeTest(
(-)compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java (-7 / +8 lines)
Lines 126-134 Link Here
126
126
127
		if (isCompound) {
127
		if (isCompound) {
128
			if (otherBindingsCount == 0
128
			if (otherBindingsCount == 0
129
				&& lastFieldBinding.isBlankFinal()
129
					&& lastFieldBinding.isBlankFinal()
130
				&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)
130
					&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)
131
				&& (!flowInfo.isDefinitelyAssigned(lastFieldBinding))) {
131
					&& (!flowInfo.isDefinitelyAssigned(lastFieldBinding))) {
132
				currentScope.problemReporter().uninitializedBlankFinalField(
132
				currentScope.problemReporter().uninitializedBlankFinalField(
133
					lastFieldBinding,
133
					lastFieldBinding,
134
					this);
134
					this);
Lines 164-173 Link Here
164
		// the last field access is a write access
164
		// the last field access is a write access
165
		if (lastFieldBinding.isFinal()) {
165
		if (lastFieldBinding.isFinal()) {
166
			// in a context where it can be assigned?
166
			// in a context where it can be assigned?
167
			if (lastFieldBinding.isBlankFinal()
167
			if (otherBindingsCount == 0
168
					&& this.indexOfFirstFieldBinding == 1
169
					&& lastFieldBinding.isBlankFinal()
168
					&& !isCompound
170
					&& !isCompound
169
					&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding) 
171
					&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) {
170
					&& indexOfFirstFieldBinding == 1) {
171
				if (flowInfo.isPotentiallyAssigned(lastFieldBinding)) {
172
				if (flowInfo.isPotentiallyAssigned(lastFieldBinding)) {
172
					currentScope.problemReporter().duplicateInitializationOfBlankFinalField(lastFieldBinding, this);
173
					currentScope.problemReporter().duplicateInitializationOfBlankFinalField(lastFieldBinding, this);
173
				} else {
174
				} else {
Lines 176-182 Link Here
176
				flowInfo.markAsDefinitelyAssigned(lastFieldBinding);
177
				flowInfo.markAsDefinitelyAssigned(lastFieldBinding);
177
			} else {
178
			} else {
178
				currentScope.problemReporter().cannotAssignToFinalField(lastFieldBinding, this);
179
				currentScope.problemReporter().cannotAssignToFinalField(lastFieldBinding, this);
179
				if (currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) { // pretend it got assigned
180
				if (otherBindingsCount == 0 && currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) { // pretend it got assigned
180
					flowInfo.markAsDefinitelyAssigned(lastFieldBinding);
181
					flowInfo.markAsDefinitelyAssigned(lastFieldBinding);
181
				}
182
				}
182
			}
183
			}

Return to bug 151787