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

Collapse All | Expand All

(-)src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java (-19 / +46 lines)
Lines 5704-5763 Link Here
5704
		"	              ^^^^^\n" + 
5704
		"	              ^^^^^\n" + 
5705
		"Cannot reference a field before it is defined\n" + 
5705
		"Cannot reference a field before it is defined\n" + 
5706
		"----------\n" + 
5706
		"----------\n" + 
5707
		"2. ERROR in X.java (at line 2)\n" + 
5707
		"2. WARNING in X.java (at line 2)\n" + 
5708
		"	NOWAY(BadEnum.NOWAY.CONST),\n" + 
5709
		"	                    ^^^^^\n" + 
5710
		"Cannot reference a field before it is defined\n" + 
5711
		"----------\n" + 
5712
		"3. WARNING in X.java (at line 2)\n" + 
5713
		"	NOWAY(BadEnum.NOWAY.CONST),\n" + 
5708
		"	NOWAY(BadEnum.NOWAY.CONST),\n" + 
5714
		"	                    ^^^^^\n" + 
5709
		"	                    ^^^^^\n" + 
5715
		"The static field BadEnum.CONST should be accessed in a static way\n" + 
5710
		"The static field BadEnum.CONST should be accessed in a static way\n" + 
5716
		"----------\n" + 
5711
		"----------\n" + 
5717
		"4. ERROR in X.java (at line 3)\n" + 
5712
		"3. ERROR in X.java (at line 3)\n" + 
5718
		"	INVALID(INVALID.CONST),\n" + 
5713
		"	INVALID(INVALID.CONST),\n" + 
5719
		"	        ^^^^^^^\n" + 
5714
		"	        ^^^^^^^\n" + 
5720
		"Cannot reference a field before it is defined\n" + 
5715
		"Cannot reference a field before it is defined\n" + 
5721
		"----------\n" + 
5716
		"----------\n" + 
5722
		"5. ERROR in X.java (at line 3)\n" + 
5717
		"4. WARNING in X.java (at line 3)\n" + 
5723
		"	INVALID(INVALID.CONST),\n" + 
5724
		"	                ^^^^^\n" + 
5725
		"Cannot reference a field before it is defined\n" + 
5726
		"----------\n" + 
5727
		"6. WARNING in X.java (at line 3)\n" + 
5728
		"	INVALID(INVALID.CONST),\n" + 
5718
		"	INVALID(INVALID.CONST),\n" + 
5729
		"	                ^^^^^\n" + 
5719
		"	                ^^^^^\n" + 
5730
		"The static field BadEnum.CONST should be accessed in a static way\n" + 
5720
		"The static field BadEnum.CONST should be accessed in a static way\n" + 
5731
		"----------\n" + 
5721
		"----------\n" + 
5732
		"7. ERROR in X.java (at line 4)\n" + 
5722
		"5. ERROR in X.java (at line 4)\n" + 
5733
		"	WRONG(WRONG.VALUE()),\n" + 
5723
		"	WRONG(WRONG.VALUE()),\n" + 
5734
		"	      ^^^^^\n" + 
5724
		"	      ^^^^^\n" + 
5735
		"Cannot reference a field before it is defined\n" + 
5725
		"Cannot reference a field before it is defined\n" + 
5736
		"----------\n" + 
5726
		"----------\n" + 
5737
		"8. WARNING in X.java (at line 4)\n" + 
5727
		"6. WARNING in X.java (at line 4)\n" + 
5738
		"	WRONG(WRONG.VALUE()),\n" + 
5728
		"	WRONG(WRONG.VALUE()),\n" + 
5739
		"	      ^^^^^^^^^^^^^\n" + 
5729
		"	      ^^^^^^^^^^^^^\n" + 
5740
		"The static method VALUE() from the type BadEnum should be accessed in a static way\n" + 
5730
		"The static method VALUE() from the type BadEnum should be accessed in a static way\n" + 
5741
		"----------\n" + 
5731
		"----------\n" + 
5742
		"9. ERROR in X.java (at line 5)\n" + 
5732
		"7. ERROR in X.java (at line 5)\n" + 
5743
		"	ILLEGAL(ILLEGAL.value());\n" + 
5733
		"	ILLEGAL(ILLEGAL.value());\n" + 
5744
		"	        ^^^^^^^\n" + 
5734
		"	        ^^^^^^^\n" + 
5745
		"Cannot reference a field before it is defined\n" + 
5735
		"Cannot reference a field before it is defined\n" + 
5746
		"----------\n" + 
5736
		"----------\n" + 
5747
		"10. ERROR in X.java (at line 14)\n" + 
5737
		"8. ERROR in X.java (at line 14)\n" + 
5748
		"	X x4 = new X(x4.CONST);//4 - WRONG\n" + 
5738
		"	X x4 = new X(x4.CONST);//4 - WRONG\n" + 
5749
		"	             ^^\n" + 
5739
		"	             ^^\n" + 
5750
		"Cannot reference a field before it is defined\n" + 
5740
		"Cannot reference a field before it is defined\n" + 
5751
		"----------\n" + 
5741
		"----------\n" + 
5752
		"11. WARNING in X.java (at line 14)\n" + 
5742
		"9. WARNING in X.java (at line 14)\n" + 
5753
		"	X x4 = new X(x4.CONST);//4 - WRONG\n" + 
5743
		"	X x4 = new X(x4.CONST);//4 - WRONG\n" + 
5754
		"	                ^^^^^\n" + 
5744
		"	                ^^^^^\n" + 
5755
		"The static field X.CONST should be accessed in a static way\n" + 
5745
		"The static field X.CONST should be accessed in a static way\n" + 
5756
		"----------\n" + 
5746
		"----------\n" + 
5757
		"12. ERROR in X.java (at line 15)\n" + 
5747
		"10. ERROR in X.java (at line 15)\n" + 
5758
		"	X x5 = new X(x5.value());//5 - WRONG\n" + 
5748
		"	X x5 = new X(x5.value());//5 - WRONG\n" + 
5759
		"	             ^^\n" + 
5749
		"	             ^^\n" + 
5760
		"Cannot reference a field before it is defined\n" + 
5750
		"Cannot reference a field before it is defined\n" + 
5761
		"----------\n");
5751
		"----------\n");
5762
}
5752
}
5753
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=263877
5754
public void test170() {
5755
	this.runNegativeTest(
5756
		new String[] {
5757
			"X.java", // =================
5758
			"enum Days {\n" + 
5759
			"    Monday(\"Mon\", Days.OFFSET + 0),    // should not complain\n" + 
5760
			"    Tuesday(\"Tue\", Days.Wednesday.hashCode()),   // should complain since enum constant\n" + 
5761
			"    Wednesday(\"Wed\", OFFSET + 2);   // should complain since unqualified\n" + 
5762
			"    public static final int OFFSET = 0;  // cannot move this above, else more errors\n" + 
5763
			"    Days(String abbr, int index) {\n" + 
5764
			"    }\n" + 
5765
			"}\n" + 
5766
			"\n" + 
5767
			"class X {\n" + 
5768
			"    public static final int FOO = X.OFFSET + 0;\n" + 
5769
			"    public static final int BAR = OFFSET + 1;\n" + 
5770
			"    public static final int OFFSET = 0;  // cannot move this above, else more errors\n" + 
5771
			"}\n", // =================
5772
		},
5773
		"----------\n" + 
5774
		"1. ERROR in X.java (at line 3)\n" + 
5775
		"	Tuesday(\"Tue\", Days.Wednesday.hashCode()),   // should complain since enum constant\n" + 
5776
		"	                    ^^^^^^^^^\n" + 
5777
		"Cannot reference a field before it is defined\n" + 
5778
		"----------\n" + 
5779
		"2. ERROR in X.java (at line 4)\n" + 
5780
		"	Wednesday(\"Wed\", OFFSET + 2);   // should complain since unqualified\n" + 
5781
		"	                 ^^^^^^\n" + 
5782
		"Cannot reference a field before it is defined\n" + 
5783
		"----------\n" + 
5784
		"3. ERROR in X.java (at line 12)\n" + 
5785
		"	public static final int BAR = OFFSET + 1;\n" + 
5786
		"	                              ^^^^^^\n" + 
5787
		"Cannot reference a field before it is defined\n" + 
5788
		"----------\n");
5789
}
5763
}
5790
}
(-)compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java (-4 / +4 lines)
Lines 780-787 Link Here
780
			}
780
			}
781
781
782
			if (field.isStatic()) {
782
			if (field.isStatic()) {
783
				ReferenceBinding declaringClass = field.original().declaringClass;
783
				if ((field.modifiers & ClassFileConstants.AccEnum) != 0) { // enum constants are checked even when qualified)
784
				if (declaringClass.isEnum()) {
784
					ReferenceBinding declaringClass = field.original().declaringClass;
785
					MethodScope methodScope = scope.methodScope();
785
					MethodScope methodScope = scope.methodScope();
786
					SourceTypeBinding sourceType = methodScope.enclosingSourceType();
786
					SourceTypeBinding sourceType = methodScope.enclosingSourceType();
787
					if ((this.bits & ASTNode.IsStrictlyAssigned) == 0
787
					if ((this.bits & ASTNode.IsStrictlyAssigned) == 0
Lines 1014-1026 Link Here
1014
					MethodScope methodScope = scope.methodScope();
1014
					MethodScope methodScope = scope.methodScope();
1015
					TypeBinding declaringClass = fieldBinding.original().declaringClass;
1015
					TypeBinding declaringClass = fieldBinding.original().declaringClass;
1016
					// check for forward references
1016
					// check for forward references
1017
					if ((this.indexOfFirstFieldBinding == 1 || declaringClass.isEnum())
1017
					if ((this.indexOfFirstFieldBinding == 1 || (fieldBinding.modifiers & ClassFileConstants.AccEnum) != 0) // enum constants are checked even when qualified
1018
							&& methodScope.enclosingSourceType() == declaringClass
1018
							&& methodScope.enclosingSourceType() == declaringClass
1019
							&& methodScope.lastVisibleFieldID >= 0
1019
							&& methodScope.lastVisibleFieldID >= 0
1020
							&& fieldBinding.id >= methodScope.lastVisibleFieldID
1020
							&& fieldBinding.id >= methodScope.lastVisibleFieldID
1021
							&& (!fieldBinding.isStatic() || methodScope.isStatic)) {
1021
							&& (!fieldBinding.isStatic() || methodScope.isStatic)) {
1022
						scope.problemReporter().forwardReference(this, 0, fieldBinding);
1022
						scope.problemReporter().forwardReference(this, 0, fieldBinding);
1023
					}
1023
					}					
1024
					if (fieldBinding.isStatic()) {
1024
					if (fieldBinding.isStatic()) {
1025
						// check if accessing enum static field in initializer					
1025
						// check if accessing enum static field in initializer					
1026
						if (declaringClass.isEnum()) {
1026
						if (declaringClass.isEnum()) {

Return to bug 263877