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

Collapse All | Expand All

(-)compiler/org/eclipse/jdt/internal/compiler/lookup/ParameterizedTypeBinding.java (-22 / +33 lines)
Lines 362-390 Link Here
362
	 * LY<TT;>;
362
	 * LY<TT;>;
363
	 */
363
	 */
364
	public char[] genericTypeSignature() {
364
	public char[] genericTypeSignature() {
365
	    if (this.genericTypeSignature == null) {
365
		if (this.genericTypeSignature == null) {
366
		    StringBuffer sig = new StringBuffer(10);
366
			if ((this.modifiers & ExtraCompilerModifiers.AccGenericSignature) == 0) {
367
			if (this.isMemberType() && this.enclosingType().isParameterizedType()) {
367
		    	this.genericTypeSignature = this.type.signature();
368
			    char[] typeSig = this.enclosingType().genericTypeSignature();
369
			    for (int i = 0; i < typeSig.length-1; i++) sig.append(typeSig[i]); // copy all but trailing semicolon
370
			    sig.append('.').append(this.sourceName());
371
			} else {
368
			} else {
372
			    char[] typeSig = this.type.signature();
369
			    StringBuffer sig = new StringBuffer(10);
373
			    for (int i = 0; i < typeSig.length-1; i++) sig.append(typeSig[i]); // copy all but trailing semicolon
370
			    if (this.isMemberType()) {
374
			}	   	    
371
			    	ReferenceBinding enclosing = enclosingType();
375
			if (this.arguments != null) {
372
			    	boolean hasParameterizedEnclosing = enclosing.isParameterizedType();
376
			    sig.append('<');
373
					char[] typeSig = hasParameterizedEnclosing ? enclosing.genericTypeSignature() : enclosing.signature();
377
			    for (int i = 0, length = this.arguments.length; i < length; i++) {
374
					sig.append(typeSig, 0, typeSig.length-1);// copy all but trailing semicolon
378
			        sig.append(this.arguments[i].genericTypeSignature());
375
			    	if (hasParameterizedEnclosing && (enclosing.modifiers & ExtraCompilerModifiers.AccGenericSignature) != 0) {
379
			    }
376
			    		sig.append('.');
380
			    sig.append('>');
377
			    	} else {
381
			}
378
			    		sig.append('$');
382
			sig.append(';');
379
			    	}
383
			int sigLength = sig.length();
380
			    	sig.append(this.sourceName());
384
			this.genericTypeSignature = new char[sigLength];
381
			    } else {
385
			sig.getChars(0, sigLength, this.genericTypeSignature, 0);			
382
			    	char[] typeSig = this.type.signature();
386
	    }
383
					sig.append(typeSig, 0, typeSig.length-1);// copy all but trailing semicolon
387
		return this.genericTypeSignature;	    
384
		    	}
385
				if (this.arguments != null) {
386
				    sig.append('<');
387
				    for (int i = 0, length = this.arguments.length; i < length; i++) {
388
				        sig.append(this.arguments[i].genericTypeSignature());
389
				    }
390
				    sig.append('>');
391
				}
392
				sig.append(';');
393
				int sigLength = sig.length();
394
				this.genericTypeSignature = new char[sigLength];
395
				sig.getChars(0, sigLength, this.genericTypeSignature, 0);						
396
			}
397
		}
398
		return this.genericTypeSignature;
388
	}
399
	}
389
	
400
	
390
	/**
401
	/**
(-)compiler/org/eclipse/jdt/internal/compiler/lookup/RawTypeBinding.java (-12 / +24 lines)
Lines 75-95 Link Here
75
	 * LY<TT;>;
75
	 * LY<TT;>;
76
	 */
76
	 */
77
	public char[] genericTypeSignature() {
77
	public char[] genericTypeSignature() {
78
78
		if (this.genericTypeSignature == null) {
79
	    if (this.genericTypeSignature == null) {
79
			if ((this.modifiers & ExtraCompilerModifiers.AccGenericSignature) == 0) {
80
		    StringBuffer sig = new StringBuffer(10);
80
		    	this.genericTypeSignature = genericType().signature();
81
			if (this.isMemberType() && this.enclosingType().isParameterizedType()) {
81
			} else {
82
			    char[] typeSig = this.enclosingType().genericTypeSignature();
82
			    StringBuffer sig = new StringBuffer(10);
83
			    for (int i = 0; i < typeSig.length-1; i++) sig.append(typeSig[i]); // copy all but trailing semicolon
83
			    if (this.isMemberType()) {
84
			    sig.append('.').append(this.sourceName()).append(';');
84
			    	ReferenceBinding enclosing = enclosingType();
85
			    	boolean hasParameterizedEnclosing = enclosing.isParameterizedType();
86
					char[] typeSig = hasParameterizedEnclosing ? enclosing.genericTypeSignature() : enclosing.signature();
87
					sig.append(typeSig, 0, typeSig.length-1);// copy all but trailing semicolon
88
			    	if (hasParameterizedEnclosing && (enclosing.modifiers & ExtraCompilerModifiers.AccGenericSignature) != 0) {
89
			    		sig.append('.');
90
			    	} else {
91
			    		sig.append('$');
92
			    	}
93
			    	sig.append(this.sourceName());
94
			    } else {
95
			    	char[] typeSig = genericType().signature();
96
					sig.append(typeSig, 0, typeSig.length-1);// copy all but trailing semicolon
97
		    	}
98
				sig.append(';');
85
				int sigLength = sig.length();
99
				int sigLength = sig.length();
86
				this.genericTypeSignature = new char[sigLength];
100
				this.genericTypeSignature = new char[sigLength];
87
				sig.getChars(0, sigLength, this.genericTypeSignature, 0);						    
101
				sig.getChars(0, sigLength, this.genericTypeSignature, 0);						
88
			} else {
89
			     this.genericTypeSignature = genericType().signature(); // erasure
90
			}
102
			}
91
	    }
103
		}
92
	   return this.genericTypeSignature;
104
		return this.genericTypeSignature;
93
	}		
105
	}		
94
	
106
	
95
    public boolean isEquivalentTo(TypeBinding otherType) {
107
    public boolean isEquivalentTo(TypeBinding otherType) {
(-)compiler/org/eclipse/jdt/internal/compiler/lookup/BlockScope.java (+25 lines)
Lines 125-130 Link Here
125
	return methodScope.isInsideInitializer() // inside initializer
125
	return methodScope.isInsideInitializer() // inside initializer
126
			|| ((AbstractMethodDeclaration) methodScope.referenceContext).isInitializationMethod(); // inside constructor or clinit
126
			|| ((AbstractMethodDeclaration) methodScope.referenceContext).isInitializationMethod(); // inside constructor or clinit
127
}
127
}
128
128
String basicToString(int tab) {
129
String basicToString(int tab) {
129
	String newLine = "\n"; //$NON-NLS-1$
130
	String newLine = "\n"; //$NON-NLS-1$
130
	for (int i = tab; --i >= 0;)
131
	for (int i = tab; --i >= 0;)
Lines 822-827 Link Here
822
	return max;
823
	return max;
823
}
824
}
824
825
826
/**
827
 * Returns true if the context requires to check initialization of final blank fields.
828
 * in other words, it is inside an initializer, a constructor or a clinit 
829
 */
830
public final boolean needBlankFinalFieldInitializationCheck(FieldBinding binding) {
831
	boolean isStatic = binding.isStatic();
832
	ReferenceBinding fieldDeclaringClass = binding.declaringClass;
833
	// loop in enclosing context, until reaching the field declaring context
834
	MethodScope methodScope = methodScope();
835
	while (methodScope != null) {
836
		if (methodScope.isStatic != isStatic)
837
			return false;
838
		if (!methodScope.isInsideInitializer() // inside initializer
839
				&& !((AbstractMethodDeclaration) methodScope.referenceContext).isInitializationMethod()) { // inside constructor or clinit
840
			return false; // found some non-initializer context
841
		}
842
		if (fieldDeclaringClass == methodScope.enclosingReceiverType()) {
843
			return true; // found the field context, no need to check any further
844
		}
845
		methodScope = methodScope.enclosingMethodScope();
846
	}
847
	return false;
848
}
849
825
/* Answer the problem reporter to use for raising new problems.
850
/* Answer the problem reporter to use for raising new problems.
826
 *
851
 *
827
 * Note that as a side-effect, this updates the current reference context
852
 * Note that as a side-effect, this updates the current reference context
(-)buildnotes_jdt-core.html (+15 lines)
Lines 44-49 Link Here
44
	</td>
44
	</td>
45
  </tr>
45
  </tr>
46
</table>
46
</table>
47
48
<a name="v_780_R33x"></a>
49
<hr><h1>
50
Eclipse Platform Build Notes<br>
51
Java Development Tooling Core</h1>
52
Eclipse SDK 3.3.2 - %date% - 3.3.2 RELEASE 
53
<br>Project org.eclipse.jdt.core v_780_R33x
54
(<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jdt.core/?only_with_tag=v_780_R33x">cvs</a>).
55
<h2>What's new in this drop</h2>
56
57
<h3>Problem Reports Fixed</h3>
58
<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=203061">203061</a>
59
203061 [compiler] Uninitialized member variables used in nonstatic initializers of peer members don't trigger compilation error 
60
61
47
<a name="v_779_R33x"></a>
62
<a name="v_779_R33x"></a>
48
<hr><h1>
63
<hr><h1>
49
Eclipse Platform Build Notes<br>
64
Eclipse Platform Build Notes<br>
(-)batch/org/eclipse/jdt/internal/compiler/batch/messages.properties (-1 / +1 lines)
Lines 14-20 Link Here
14
#Format: compiler.name = word1 word2 word3
14
#Format: compiler.name = word1 word2 word3
15
compiler.name = Eclipse Java Compiler
15
compiler.name = Eclipse Java Compiler
16
#Format: compiler.version = 0.XXX[, other words (don't forget the comma if adding other words)]
16
#Format: compiler.version = 0.XXX[, other words (don't forget the comma if adding other words)]
17
compiler.version = 0.779_R33x, 3.3.1
17
compiler.version = 0.780_R33x, pre-3.3.2
18
compiler.copyright = Copyright IBM Corp 2000, 2007. All rights reserved.
18
compiler.copyright = Copyright IBM Corp 2000, 2007. All rights reserved.
19
19
20
### progress
20
### progress
(-)compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java (-2 / +2 lines)
Lines 41-47 Link Here
41
				case Binding.FIELD : // reading a field
41
				case Binding.FIELD : // reading a field
42
					FieldBinding fieldBinding;
42
					FieldBinding fieldBinding;
43
					if ((fieldBinding = (FieldBinding) binding).isBlankFinal() 
43
					if ((fieldBinding = (FieldBinding) binding).isBlankFinal() 
44
							&& currentScope.allowBlankFinalFieldAssignment(fieldBinding)) {
44
							&& currentScope.needBlankFinalFieldInitializationCheck(fieldBinding)) {
45
						if (!flowInfo.isDefinitelyAssigned(fieldBinding)) {
45
						if (!flowInfo.isDefinitelyAssigned(fieldBinding)) {
46
							currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
46
							currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
47
						}
47
						}
Lines 152-158 Link Here
152
					}
152
					}
153
				}				
153
				}				
154
				// check if reading a final blank field
154
				// check if reading a final blank field
155
				if (fieldBinding.isBlankFinal() && currentScope.allowBlankFinalFieldAssignment(fieldBinding)) {
155
				if (fieldBinding.isBlankFinal() && currentScope.needBlankFinalFieldInitializationCheck(fieldBinding)) {
156
					if (!flowInfo.isDefinitelyAssigned(fieldBinding)) {
156
					if (!flowInfo.isDefinitelyAssigned(fieldBinding)) {
157
						currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
157
						currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
158
					}
158
					}
(-)compiler/org/eclipse/jdt/internal/compiler/ast/FieldReference.java (-1 / +1 lines)
Lines 46-52 Link Here
46
	if (isCompound) { // check the variable part is initialized if blank final
46
	if (isCompound) { // check the variable part is initialized if blank final
47
		if (binding.isBlankFinal()
47
		if (binding.isBlankFinal()
48
			&& receiver.isThis()
48
			&& receiver.isThis()
49
			&& currentScope.allowBlankFinalFieldAssignment(binding)
49
			&& currentScope.needBlankFinalFieldInitializationCheck(binding)
50
			&& (!flowInfo.isDefinitelyAssigned(binding))) {
50
			&& (!flowInfo.isDefinitelyAssigned(binding))) {
51
			currentScope.problemReporter().uninitializedBlankFinalField(binding, this);
51
			currentScope.problemReporter().uninitializedBlankFinalField(binding, this);
52
			// we could improve error msg here telling "cannot use compound assignment on final blank field"
52
			// we could improve error msg here telling "cannot use compound assignment on final blank field"
(-)compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java (-3 / +3 lines)
Lines 85-91 Link Here
85
			// check if final blank field
85
			// check if final blank field
86
			if (lastFieldBinding.isBlankFinal()
86
			if (lastFieldBinding.isBlankFinal()
87
				    && this.otherBindings != null // the last field binding is only assigned
87
				    && this.otherBindings != null // the last field binding is only assigned
88
	 				&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)) {
88
	 				&& currentScope.needBlankFinalFieldInitializationCheck(lastFieldBinding)) {
89
				if (!flowInfo.isDefinitelyAssigned(lastFieldBinding)) {
89
				if (!flowInfo.isDefinitelyAssigned(lastFieldBinding)) {
90
					currentScope.problemReporter().uninitializedBlankFinalField(
90
					currentScope.problemReporter().uninitializedBlankFinalField(
91
						lastFieldBinding,
91
						lastFieldBinding,
Lines 134-140 Link Here
134
	if (isCompound) {
134
	if (isCompound) {
135
		if (otherBindingsCount == 0
135
		if (otherBindingsCount == 0
136
				&& lastFieldBinding.isBlankFinal()
136
				&& lastFieldBinding.isBlankFinal()
137
				&& currentScope.allowBlankFinalFieldAssignment(lastFieldBinding)
137
				&& currentScope.needBlankFinalFieldInitializationCheck(lastFieldBinding)
138
				&& (!flowInfo.isDefinitelyAssigned(lastFieldBinding))) {
138
				&& (!flowInfo.isDefinitelyAssigned(lastFieldBinding))) {
139
			currentScope.problemReporter().uninitializedBlankFinalField(lastFieldBinding, this);
139
			currentScope.problemReporter().uninitializedBlankFinalField(lastFieldBinding, this);
140
		}
140
		}
Lines 237-243 Link Here
237
				}				
237
				}				
238
				// check if reading a final blank field
238
				// check if reading a final blank field
239
				if (fieldBinding.isBlankFinal()
239
				if (fieldBinding.isBlankFinal()
240
						&& currentScope.allowBlankFinalFieldAssignment(fieldBinding)
240
						&& currentScope.needBlankFinalFieldInitializationCheck(fieldBinding)
241
						&& !flowInfo.isDefinitelyAssigned(fieldBinding)) {
241
						&& !flowInfo.isDefinitelyAssigned(fieldBinding)) {
242
					currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
242
					currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
243
				}
243
				}
(-)eval/org/eclipse/jdt/internal/eval/CodeSnippetSingleNameReference.java (-1 / +1 lines)
Lines 56-62 Link Here
56
			// check if reading a final blank field
56
			// check if reading a final blank field
57
			FieldBinding fieldBinding;
57
			FieldBinding fieldBinding;
58
			if ((fieldBinding = (FieldBinding) this.binding).isBlankFinal() 
58
			if ((fieldBinding = (FieldBinding) this.binding).isBlankFinal() 
59
					&& currentScope.allowBlankFinalFieldAssignment(fieldBinding)) {
59
					&& currentScope.needBlankFinalFieldInitializationCheck(fieldBinding)) {
60
				if (!flowInfo.isDefinitelyAssigned(fieldBinding)) {
60
				if (!flowInfo.isDefinitelyAssigned(fieldBinding)) {
61
					currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
61
					currentScope.problemReporter().uninitializedBlankFinalField(fieldBinding, this);
62
				}
62
				}
(-)Eclipse Java Tests Compiler/org/eclipse/jdt/tests/compiler/regression/InitializationTest.java (+149 lines)
Lines 5473-5478 Link Here
5473
		assertTrue(false);
5473
		assertTrue(false);
5474
	}			
5474
	}			
5475
}
5475
}
5476
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=203061
5477
public void test192() {
5478
	this.runNegativeTest(
5479
		new String[] {
5480
			"X.java",
5481
			"public final class X {\n" + 
5482
			"	private final Object mObj;\n" + 
5483
			"	private final Object mDependent = new Object() {\n" + 
5484
			"		{\n" + 
5485
			"			Object o1 = mObj;\n" + 
5486
			"		}\n" + 
5487
			"		Object o2 = mObj;\n" + 
5488
			"		void foo() {\n" + 
5489
			"			Object o3 = mObj;\n" + 
5490
			"		}\n" + 
5491
			"	};\n" + 
5492
			"	public X() {\n" + 
5493
			"		mObj = \"\";\n" + 
5494
			"	}\n" + 
5495
			"}\n"
5496
		}, 
5497
		"----------\n" + 
5498
		"1. WARNING in X.java (at line 3)\n" + 
5499
		"	private final Object mDependent = new Object() {\n" + 
5500
		"	                     ^^^^^^^^^^\n" + 
5501
		"The field X.mDependent is never read locally\n" + 
5502
		"----------\n" + 
5503
		"2. WARNING in X.java (at line 5)\n" + 
5504
		"	Object o1 = mObj;\n" + 
5505
		"	            ^^^^\n" + 
5506
		"Read access to enclosing field X.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
5507
		"----------\n" + 
5508
		"3. ERROR in X.java (at line 5)\n" + 
5509
		"	Object o1 = mObj;\n" + 
5510
		"	            ^^^^\n" + 
5511
		"The blank final field mObj may not have been initialized\n" + 
5512
		"----------\n" + 
5513
		"4. WARNING in X.java (at line 7)\n" + 
5514
		"	Object o2 = mObj;\n" + 
5515
		"	       ^^\n" + 
5516
		"The field new Object(){}.o2 is never read locally\n" + 
5517
		"----------\n" + 
5518
		"5. WARNING in X.java (at line 7)\n" + 
5519
		"	Object o2 = mObj;\n" + 
5520
		"	            ^^^^\n" + 
5521
		"Read access to enclosing field X.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
5522
		"----------\n" + 
5523
		"6. ERROR in X.java (at line 7)\n" + 
5524
		"	Object o2 = mObj;\n" + 
5525
		"	            ^^^^\n" + 
5526
		"The blank final field mObj may not have been initialized\n" + 
5527
		"----------\n" + 
5528
		"7. WARNING in X.java (at line 8)\n" + 
5529
		"	void foo() {\n" + 
5530
		"	     ^^^^^\n" + 
5531
		"The method foo() from the type new Object(){} is never used locally\n" + 
5532
		"----------\n" + 
5533
		"8. WARNING in X.java (at line 9)\n" + 
5534
		"	Object o3 = mObj;\n" + 
5535
		"	            ^^^^\n" + 
5536
		"Read access to enclosing field X.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
5537
		"----------\n");
5538
}
5539
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=203061 - variation
5540
public void test193() {
5541
	this.runNegativeTest(
5542
		new String[] {
5543
			"X.java",
5544
			"public final class X {\n" + 
5545
			"	private final Object mObj;\n" + 
5546
			"	private final Object mDependent = new Object() {\n" + 
5547
			"		{\n" + 
5548
			"			Object o1 = mObj;\n" + 
5549
			"			mObj = \"1\";\n" + 
5550
			"		}\n" + 
5551
			"		Object o2 = mObj = \"2\";\n" + 
5552
			"		void foo() {\n" + 
5553
			"			Object o3 = mObj;\n" + 
5554
			"			mObj = \"3\";\n" + 
5555
			"		}\n" + 
5556
			"	};\n" + 
5557
			"	public X() {\n" + 
5558
			"		mObj = \"\";\n" + 
5559
			"	}\n" + 
5560
			"}\n"
5561
		}, 
5562
		"----------\n" + 
5563
		"1. WARNING in X.java (at line 3)\n" + 
5564
		"	private final Object mDependent = new Object() {\n" + 
5565
		"	                     ^^^^^^^^^^\n" + 
5566
		"The field X.mDependent is never read locally\n" + 
5567
		"----------\n" + 
5568
		"2. WARNING in X.java (at line 5)\n" + 
5569
		"	Object o1 = mObj;\n" + 
5570
		"	            ^^^^\n" + 
5571
		"Read access to enclosing field X.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
5572
		"----------\n" + 
5573
		"3. ERROR in X.java (at line 5)\n" + 
5574
		"	Object o1 = mObj;\n" + 
5575
		"	            ^^^^\n" + 
5576
		"The blank final field mObj may not have been initialized\n" + 
5577
		"----------\n" + 
5578
		"4. WARNING in X.java (at line 6)\n" + 
5579
		"	mObj = \"1\";\n" + 
5580
		"	^^^^\n" + 
5581
		"Write access to enclosing field X.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
5582
		"----------\n" + 
5583
		"5. ERROR in X.java (at line 6)\n" + 
5584
		"	mObj = \"1\";\n" + 
5585
		"	^^^^\n" + 
5586
		"The final field X.mObj cannot be assigned\n" + 
5587
		"----------\n" + 
5588
		"6. WARNING in X.java (at line 8)\n" + 
5589
		"	Object o2 = mObj = \"2\";\n" + 
5590
		"	       ^^\n" + 
5591
		"The field new Object(){}.o2 is never read locally\n" + 
5592
		"----------\n" + 
5593
		"7. WARNING in X.java (at line 8)\n" + 
5594
		"	Object o2 = mObj = \"2\";\n" + 
5595
		"	            ^^^^\n" + 
5596
		"Write access to enclosing field X.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
5597
		"----------\n" + 
5598
		"8. ERROR in X.java (at line 8)\n" + 
5599
		"	Object o2 = mObj = \"2\";\n" + 
5600
		"	            ^^^^\n" + 
5601
		"The final field X.mObj cannot be assigned\n" + 
5602
		"----------\n" + 
5603
		"9. WARNING in X.java (at line 9)\n" + 
5604
		"	void foo() {\n" + 
5605
		"	     ^^^^^\n" + 
5606
		"The method foo() from the type new Object(){} is never used locally\n" + 
5607
		"----------\n" + 
5608
		"10. WARNING in X.java (at line 10)\n" + 
5609
		"	Object o3 = mObj;\n" + 
5610
		"	            ^^^^\n" + 
5611
		"Read access to enclosing field X.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
5612
		"----------\n" + 
5613
		"11. WARNING in X.java (at line 11)\n" + 
5614
		"	mObj = \"3\";\n" + 
5615
		"	^^^^\n" + 
5616
		"Write access to enclosing field X.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
5617
		"----------\n" + 
5618
		"12. ERROR in X.java (at line 11)\n" + 
5619
		"	mObj = \"3\";\n" + 
5620
		"	^^^^\n" + 
5621
		"The final field X.mObj cannot be assigned\n" + 
5622
		"----------\n");
5623
}
5624
5476
public static Class testClass() {
5625
public static Class testClass() {
5477
	return InitializationTest.class;
5626
	return InitializationTest.class;
5478
}
5627
}
(-)src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java (+468 lines)
Lines 38065-38068 Link Here
38065
		false, // do not flush output
38065
		false, // do not flush output
38066
		null);		
38066
		null);		
38067
}
38067
}
38068
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=189158
38069
public void test1150() {
38070
	this.runConformTest(
38071
		new String[] {
38072
			"X.java",
38073
			"import java.lang.ref.Reference;\n"+
38074
			"public class X<T> {\n" + 
38075
			"	static class Rather {\n" + 
38076
			"		static class Deeply {\n" + 
38077
			"			static class Inside {\n" + 
38078
			"			}\n" + 
38079
			"		}\n" + 
38080
			"	}\n" + 
38081
			"	Reference<X.Rather.Deeply> x;\n" + 
38082
			"	Reference<X.Rather> y;	\n" + 
38083
			"	Reference<X.Rather.Deeply.Inside> z;	\n" + 
38084
			"\n" + 
38085
			"	public static void main(String[] args) throws Exception {\n" + 
38086
			"		System.out.print(X.class.getDeclaredField(\"x\").getGenericType());\n" + 
38087
			"		System.out.print(\"##\");\n" + 
38088
			"		System.out.print(X.class.getDeclaredField(\"y\").getGenericType());\n" + 
38089
			"		System.out.print(\"##\");\n" + 
38090
			"		System.out.print(X.class.getDeclaredField(\"z\").getGenericType());\n" + 
38091
			"		System.out.println();\n" + 
38092
			"	}\n" + 
38093
			"}\n"
38094
		},
38095
		"java.lang.ref.Reference<X$Rather$Deeply>##java.lang.ref.Reference<X$Rather>##java.lang.ref.Reference<X$Rather$Deeply$Inside>"
38096
	);
38097
	String expectedOutput = 
38098
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" + 
38099
		"  // Signature: Ljava/lang/ref/Reference<LX$Rather$Deeply;>;\n" + 
38100
		"  java.lang.ref.Reference x;\n" + 
38101
		"  \n" + 
38102
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" + 
38103
		"  // Signature: Ljava/lang/ref/Reference<LX$Rather;>;\n" + 
38104
		"  java.lang.ref.Reference y;\n" + 
38105
		"  \n" + 
38106
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" + 
38107
		"  // Signature: Ljava/lang/ref/Reference<LX$Rather$Deeply$Inside;>;\n" + 
38108
		"  java.lang.ref.Reference z;\n";
38109
38110
	try {
38111
		File f = new File(OUTPUT_DIR + File.separator + "X.class");
38112
		byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
38113
		ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
38114
		String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
38115
		int index = result.indexOf(expectedOutput);
38116
		if (index == -1 || expectedOutput.length() == 0) {
38117
			System.out.println(Util.displayString(result, 3));
38118
		}
38119
		if (index == -1) {
38120
			assertEquals("Wrong contents", expectedOutput, result);
38121
		}
38122
	} catch (org.eclipse.jdt.core.util.ClassFormatException e) {
38123
		assertTrue(false);
38124
	} catch (IOException e) {
38125
		assertTrue(false);
38126
	}			
38127
	
38128
}
38129
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=189158 - variation
38130
public void test1151() {
38131
	this.runConformTest(
38132
		new String[] {
38133
			"X.java",
38134
			"import java.lang.ref.Reference;\n"+
38135
			"public class X<T> {\n" + 
38136
			"	class Other<U> {\n" + 
38137
			"		class Deeply {\n" + 
38138
			"			class Inside<V> {\n" + 
38139
			"			}			\n" + 
38140
			"		}\n" + 
38141
			"	}\n" + 
38142
			"	Reference<X<String>.Other<Thread>.Deeply> t;\n" + 
38143
			"	Reference<X<String>.Other<Thread>.Deeply.Inside<Number>> u;\n" + 
38144
			"\n" + 
38145
			"	public static void main(String[] args) throws Exception {\n" + 
38146
			"		System.out.print(X.class.getDeclaredField(\"t\").getGenericType());\n" + 
38147
			"		//System.out.print(\"##\");\n" + 
38148
			"		//System.out.print(X.class.getDeclaredField(\"u\").getGenericType());\n" + // TODO disabled due to bug in libs (unable to re-read the generated signature)
38149
			"		System.out.println();\n" + 
38150
			"	}\n" + 
38151
			"}\n"
38152
		},
38153
		//"java.lang.ref.Reference<X<java.lang.String>.Other<java.lang.Thread>.Deeply>##java.lang.ref.Reference<X<java.lang.String>.Other<java.lang.Thread>.Deeply$Inside<java.lang.Number>>"
38154
		"java.lang.ref.Reference<X<java.lang.String>.Other<java.lang.Thread>.Deeply>"
38155
	);
38156
	String expectedOutput = 
38157
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" + 
38158
		"  // Signature: Ljava/lang/ref/Reference<LX<Ljava/lang/String;>.Other<Ljava/lang/Thread;>.Deeply;>;\n" + 
38159
		"  java.lang.ref.Reference t;\n" + 
38160
		"  \n" + 
38161
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" + 
38162
		"  // Signature: Ljava/lang/ref/Reference<LX<Ljava/lang/String;>.Other<Ljava/lang/Thread;>.Deeply.Inside<Ljava/lang/Number;>;>;\n" + 
38163
		"  java.lang.ref.Reference u;\n";
38164
38165
	try {
38166
		File f = new File(OUTPUT_DIR + File.separator + "X.class");
38167
		byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
38168
		ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
38169
		String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
38170
		int index = result.indexOf(expectedOutput);
38171
		if (index == -1 || expectedOutput.length() == 0) {
38172
			System.out.println(Util.displayString(result, 3));
38173
		}
38174
		if (index == -1) {
38175
			assertEquals("Wrong contents", expectedOutput, result);
38176
		}
38177
	} catch (org.eclipse.jdt.core.util.ClassFormatException e) {
38178
		assertTrue(false);
38179
	} catch (IOException e) {
38180
		assertTrue(false);
38181
	}			
38182
}
38183
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=189158 - variation
38184
public void test1152() {
38185
	this.runNegativeTest(
38186
		new String[] {
38187
			"X.java",
38188
			"import java.lang.ref.Reference;\n"+
38189
			"public class X<T> {\n" + 
38190
			"	class Other<U> {\n" + 
38191
			"		class Deeply {\n" + 
38192
			"			class Inside<V> {\n" + 
38193
			"			}			\n" + 
38194
			"		}\n" + 
38195
			"	}\n" + 
38196
			"	Reference<X<String>.Other<Thread>.Deeply.Inside> u;\n" + 
38197
			"\n" + 
38198
			"	public static void main(String[] args) throws Exception {\n" + 
38199
			"		System.out.print(X.class.getDeclaredField(\"u\").getGenericType());\n" + 
38200
			"		System.out.println();\n" + 
38201
			"	}\n" + 
38202
			"}\n"
38203
		},
38204
		"----------\n" + 
38205
		"1. ERROR in X.java (at line 9)\n" + 
38206
		"	Reference<X<String>.Other<Thread>.Deeply.Inside> u;\n" + 
38207
		"	          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
38208
		"The member type X<String>.Other<Thread>.Deeply.Inside must be parameterized, since it is qualified with a parameterized type\n" + 
38209
		"----------\n"	);
38210
}
38211
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=189158 - variation
38212
public void test1153() {
38213
	// check proper decoding of binary signatures, by compiling against generated binary
38214
	this.runConformTest(
38215
		new String[] {
38216
			"p/X.java",
38217
			"package p;\n" +
38218
			"import java.lang.ref.Reference;\n" + 
38219
			"public class X<T> {\n" + 
38220
			"	public static class Rather {\n" + 
38221
			"		public static class Deeply {\n" + 
38222
			"			public static class Inside {\n" + 
38223
			"			}\n" + 
38224
			"		}\n" + 
38225
			"	}\n" + 
38226
			"	public class Other<U> {\n" + 
38227
			"		public class Deeply {\n" + 
38228
			"			public class Inside<V> {\n" + 
38229
			"			}			\n" + 
38230
			"		}\n" + 
38231
			"	}\n" + 
38232
			"	public Reference<X.Rather.Deeply> x;\n" + 
38233
			"	public Reference<X.Rather> y;	\n" + 
38234
			"	public Reference<X.Rather.Deeply.Inside> z;	\n" + 
38235
			"	public Reference<X<String>.Other<Thread>.Deeply> t;\n" + 
38236
			"	public Reference<X<String>.Other<Thread>.Deeply.Inside<Number>> u;\n" + 
38237
			"}\n",
38238
		},
38239
		""
38240
	);
38241
	this.runConformTest(
38242
		new String[] {
38243
			"Y.java",
38244
			"import java.lang.ref.Reference;\n" + 
38245
			"import p.X;\n" +
38246
			"public class Y {\n" + 
38247
			"	Reference<X.Rather.Deeply> x;\n" + 
38248
			"	Reference<X.Rather> y;	\n" + 
38249
			"	Reference<X.Rather.Deeply.Inside> z;	\n" + 
38250
			"	Reference<X<String>.Other<Thread>.Deeply> t;\n" + 
38251
			"	Reference<X<String>.Other<Thread>.Deeply.Inside<Number>> u;\n" + 
38252
			"	Y(X someX) {\n" + 
38253
			"		this.x = someX.x;\n" + 
38254
			"		this. y = someX.y;	\n" + 
38255
			"		this.z = someX.z;	\n" + 
38256
			"		this.t = someX.t;\n" + 
38257
			"		this.u = someX.u;		\n" + 
38258
			"	}\n" + 
38259
			"	public static void main(String[] args) throws Exception {\n" + 
38260
			"		System.out.print(Y.class.getDeclaredField(\"x\").getGenericType());\n" + 
38261
			"		System.out.print(\"##\");\n" + 
38262
			"		System.out.print(Y.class.getDeclaredField(\"y\").getGenericType());\n" + 
38263
			"		System.out.print(\"##\");\n" + 
38264
			"		System.out.print(Y.class.getDeclaredField(\"z\").getGenericType());\n" + 
38265
			"		System.out.print(\"##\");\n" + 
38266
			"		System.out.print(Y.class.getDeclaredField(\"t\").getGenericType());\n" + 
38267
			"		//System.out.print(\"##\");\n" + 
38268
			"		//System.out.print(Y.class.getDeclaredField(\"u\").getGenericType());\n" + // TODO disabled due to bug in libs (unable to re-read the generated signature)
38269
			"		System.out.println();\n" + 
38270
			"	}\n" + 
38271
			"}\n"
38272
		},
38273
		"java.lang.ref.Reference<p.X$Rather$Deeply>##java.lang.ref.Reference<p.X$Rather>##java.lang.ref.Reference<p.X$Rather$Deeply$Inside>##java.lang.ref.Reference<p.X<java.lang.String>.Other<java.lang.Thread>.Deeply>",
38274
		null,
38275
		false, // do not flush output
38276
		null);		
38277
}
38278
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=189158 - variation
38279
public void test1154() {
38280
	this.runConformTest(
38281
		new String[] {
38282
			"X.java",
38283
			"import java.lang.ref.Reference;\n" + 
38284
			"public class X {\n" + 
38285
			"	class Other<U> {\n" + 
38286
			"		class Deeply {\n" + 
38287
			"			class Deeper {\n" + 
38288
			"				class Inside<V> {\n" + 
38289
			"				}			\n" + 
38290
			"			}\n" + 
38291
			"		}\n" + 
38292
			"	}\n" + 
38293
			"	Reference<X.Other<Thread>.Deeply> t;\n" + 
38294
			"	Reference<X.Other<Thread>.Deeply.Deeper.Inside<Number>> u;\n" + 
38295
			"\n" + 
38296
			"	public static void main(String[] args) throws Exception {\n" + 
38297
			"		//System.out.print(X.class.getDeclaredField(\"t\").getGenericType());\n" +  // TODO disabled due to bug in libs (unable to re-read the generated signature)
38298
			"		//System.out.print(\"##\");\n" + 
38299
			"		//System.out.print(X.class.getDeclaredField(\"u\").getGenericType());\n" + // TODO disabled due to bug in libs (unable to re-read the generated signature)
38300
			"		System.out.println();\n" + 
38301
			"	}\n" + 
38302
			"}\n"
38303
		},
38304
		"");
38305
	
38306
	String expectedOutput = 
38307
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" + 
38308
		"  // Signature: Ljava/lang/ref/Reference<LX$Other<Ljava/lang/Thread;>.Deeply;>;\n" + 
38309
		"  java.lang.ref.Reference t;\n" + 
38310
		"  \n" + 
38311
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" + 
38312
		"  // Signature: Ljava/lang/ref/Reference<LX$Other<Ljava/lang/Thread;>.Deeply.Deeper.Inside<Ljava/lang/Number;>;>;\n" + 
38313
		"  java.lang.ref.Reference u;\n";
38314
38315
	try {
38316
		File f = new File(OUTPUT_DIR + File.separator + "X.class");
38317
		byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
38318
		ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
38319
		String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
38320
		int index = result.indexOf(expectedOutput);
38321
		if (index == -1 || expectedOutput.length() == 0) {
38322
			System.out.println(Util.displayString(result, 3));
38323
		}
38324
		if (index == -1) {
38325
			assertEquals("Wrong contents", expectedOutput, result);
38326
		}
38327
	} catch (org.eclipse.jdt.core.util.ClassFormatException e) {
38328
		assertTrue(false);
38329
	} catch (IOException e) {
38330
		assertTrue(false);
38331
	}	
38332
}
38333
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=189158 - variation
38334
public void test1155() {
38335
	this.runConformTest(
38336
		new String[] {
38337
			"X.java",
38338
			"import java.lang.ref.Reference;\n" + 
38339
			"public class X<T> {\n" + 
38340
			"	class Other<U> {\n" + 
38341
			"		class Deeply {\n" + 
38342
			"			class Deeper {\n" + 
38343
			"				class Inside<V> {\n" + 
38344
			"				}			\n" + 
38345
			"			}\n" + 
38346
			"		}\n" + 
38347
			"	}\n" + 
38348
			"	Reference<X<String>.Other<Thread>.Deeply> t;\n" + 
38349
			"	Reference<X<String>.Other<Thread>.Deeply.Deeper.Inside<Number>> u;\n" + 
38350
			"\n" + 
38351
			"	public static void main(String[] args) throws Exception {\n" + 
38352
			"		System.out.print(X.class.getDeclaredField(\"t\").getGenericType());\n" + 
38353
			"		//System.out.print(\"##\");\n" + 
38354
			"		//System.out.print(X.class.getDeclaredField(\"u\").getGenericType());\n" + // TODO disabled due to bug in libs (unable to re-read the generated signature)
38355
			"		System.out.println();\n" + 
38356
			"	}\n" + 
38357
			"}\n"
38358
		},
38359
		"java.lang.ref.Reference<X<java.lang.String>.Other<java.lang.Thread>.Deeply>"	);
38360
	
38361
	String expectedOutput = 
38362
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" + 
38363
		"  // Signature: Ljava/lang/ref/Reference<LX<Ljava/lang/String;>.Other<Ljava/lang/Thread;>.Deeply;>;\n" + 
38364
		"  java.lang.ref.Reference t;\n" + 
38365
		"  \n" + 
38366
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" + 
38367
		"  // Signature: Ljava/lang/ref/Reference<LX<Ljava/lang/String;>.Other<Ljava/lang/Thread;>.Deeply.Deeper.Inside<Ljava/lang/Number;>;>;\n" + 
38368
		"  java.lang.ref.Reference u;\n";
38369
38370
	try {
38371
		File f = new File(OUTPUT_DIR + File.separator + "X.class");
38372
		byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
38373
		ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
38374
		String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
38375
		int index = result.indexOf(expectedOutput);
38376
		if (index == -1 || expectedOutput.length() == 0) {
38377
			System.out.println(Util.displayString(result, 3));
38378
		}
38379
		if (index == -1) {
38380
			assertEquals("Wrong contents", expectedOutput, result);
38381
		}
38382
	} catch (org.eclipse.jdt.core.util.ClassFormatException e) {
38383
		assertTrue(false);
38384
	} catch (IOException e) {
38385
		assertTrue(false);
38386
	}	
38387
}
38388
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=203061 - variation
38389
public void test1163() {
38390
	this.runNegativeTest(
38391
		new String[] {
38392
			"X.java",
38393
			"public final class X<T> {\n" + 
38394
			"	private final Object mObj;\n" + 
38395
			"	private final Object mDependent = new Object() {\n" + 
38396
			"		{\n" + 
38397
			"			Object o1 = mObj;\n" + 
38398
			"		}\n" + 
38399
			"		Object o2 = mObj;\n" + 
38400
			"		void foo() {\n" + 
38401
			"			Object o3 = mObj;\n" + 
38402
			"		}\n" + 
38403
			"	};\n" + 
38404
			"	public X() {\n" + 
38405
			"		mObj = \"\";\n" + 
38406
			"	}\n" + 
38407
			"}\n", // =================
38408
		},
38409
		"----------\n" + 
38410
		"1. WARNING in X.java (at line 3)\n" + 
38411
		"	private final Object mDependent = new Object() {\n" + 
38412
		"	                     ^^^^^^^^^^\n" + 
38413
		"The field X<T>.mDependent is never read locally\n" + 
38414
		"----------\n" + 
38415
		"2. WARNING in X.java (at line 5)\n" + 
38416
		"	Object o1 = mObj;\n" + 
38417
		"	            ^^^^\n" + 
38418
		"Read access to enclosing field X<T>.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
38419
		"----------\n" + 
38420
		"3. ERROR in X.java (at line 5)\n" + 
38421
		"	Object o1 = mObj;\n" + 
38422
		"	            ^^^^\n" + 
38423
		"The blank final field mObj may not have been initialized\n" + 
38424
		"----------\n" + 
38425
		"4. WARNING in X.java (at line 7)\n" + 
38426
		"	Object o2 = mObj;\n" + 
38427
		"	       ^^\n" + 
38428
		"The field new Object(){}.o2 is never read locally\n" + 
38429
		"----------\n" + 
38430
		"5. WARNING in X.java (at line 7)\n" + 
38431
		"	Object o2 = mObj;\n" + 
38432
		"	            ^^^^\n" + 
38433
		"Read access to enclosing field X<T>.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
38434
		"----------\n" + 
38435
		"6. ERROR in X.java (at line 7)\n" + 
38436
		"	Object o2 = mObj;\n" + 
38437
		"	            ^^^^\n" + 
38438
		"The blank final field mObj may not have been initialized\n" + 
38439
		"----------\n" + 
38440
		"7. WARNING in X.java (at line 8)\n" + 
38441
		"	void foo() {\n" + 
38442
		"	     ^^^^^\n" + 
38443
		"The method foo() from the type new Object(){} is never used locally\n" + 
38444
		"----------\n" + 
38445
		"8. WARNING in X.java (at line 9)\n" + 
38446
		"	Object o3 = mObj;\n" + 
38447
		"	            ^^^^\n" + 
38448
		"Read access to enclosing field X<T>.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
38449
		"----------\n");
38450
}
38451
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=203061 - variation
38452
public void test1164() {
38453
	this.runNegativeTest(
38454
		new String[] {
38455
			"X.java",
38456
			"public final class X<T> {\n" + 
38457
			"	private final Object mObj;\n" + 
38458
			"	private final Object mDependent = new Object() {\n" + 
38459
			"		{\n" + 
38460
			"			Object o1 = mObj;\n" + 
38461
			"			mObj = \"1\";\n" + 
38462
			"		}\n" + 
38463
			"		Object o2 = mObj = \"2\";\n" + 
38464
			"		void foo() {\n" + 
38465
			"			Object o3 = mObj;\n" + 
38466
			"			mObj = \"3\";\n" + 
38467
			"		}\n" + 
38468
			"	};\n" + 
38469
			"	public X() {\n" + 
38470
			"		mObj = \"\";\n" + 
38471
			"	}\n" + 
38472
			"}\n"
38473
		}, 
38474
		"----------\n" + 
38475
		"1. WARNING in X.java (at line 3)\n" + 
38476
		"	private final Object mDependent = new Object() {\n" + 
38477
		"	                     ^^^^^^^^^^\n" + 
38478
		"The field X<T>.mDependent is never read locally\n" + 
38479
		"----------\n" + 
38480
		"2. WARNING in X.java (at line 5)\n" + 
38481
		"	Object o1 = mObj;\n" + 
38482
		"	            ^^^^\n" + 
38483
		"Read access to enclosing field X<T>.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
38484
		"----------\n" + 
38485
		"3. ERROR in X.java (at line 5)\n" + 
38486
		"	Object o1 = mObj;\n" + 
38487
		"	            ^^^^\n" + 
38488
		"The blank final field mObj may not have been initialized\n" + 
38489
		"----------\n" + 
38490
		"4. WARNING in X.java (at line 6)\n" + 
38491
		"	mObj = \"1\";\n" + 
38492
		"	^^^^\n" + 
38493
		"Write access to enclosing field X<T>.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
38494
		"----------\n" + 
38495
		"5. ERROR in X.java (at line 6)\n" + 
38496
		"	mObj = \"1\";\n" + 
38497
		"	^^^^\n" + 
38498
		"The final field X<T>.mObj cannot be assigned\n" + 
38499
		"----------\n" + 
38500
		"6. WARNING in X.java (at line 8)\n" + 
38501
		"	Object o2 = mObj = \"2\";\n" + 
38502
		"	       ^^\n" + 
38503
		"The field new Object(){}.o2 is never read locally\n" + 
38504
		"----------\n" + 
38505
		"7. WARNING in X.java (at line 8)\n" + 
38506
		"	Object o2 = mObj = \"2\";\n" + 
38507
		"	            ^^^^\n" + 
38508
		"Write access to enclosing field X<T>.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
38509
		"----------\n" + 
38510
		"8. ERROR in X.java (at line 8)\n" + 
38511
		"	Object o2 = mObj = \"2\";\n" + 
38512
		"	            ^^^^\n" + 
38513
		"The final field X<T>.mObj cannot be assigned\n" + 
38514
		"----------\n" + 
38515
		"9. WARNING in X.java (at line 9)\n" + 
38516
		"	void foo() {\n" + 
38517
		"	     ^^^^^\n" + 
38518
		"The method foo() from the type new Object(){} is never used locally\n" + 
38519
		"----------\n" + 
38520
		"10. WARNING in X.java (at line 10)\n" + 
38521
		"	Object o3 = mObj;\n" + 
38522
		"	            ^^^^\n" + 
38523
		"Read access to enclosing field X<T>.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
38524
		"----------\n" + 
38525
		"11. WARNING in X.java (at line 11)\n" + 
38526
		"	mObj = \"3\";\n" + 
38527
		"	^^^^\n" + 
38528
		"Write access to enclosing field X<T>.mObj is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" + 
38529
		"----------\n" + 
38530
		"12. ERROR in X.java (at line 11)\n" + 
38531
		"	mObj = \"3\";\n" + 
38532
		"	^^^^\n" + 
38533
		"The final field X<T>.mObj cannot be assigned\n" + 
38534
		"----------\n");
38535
}
38068
}
38536
}

Return to bug 203061