### Eclipse Workspace Patch 1.0
#P org.eclipse.jdt.core.tests
Index: Eclipse Java Tests Compiler/org/eclipse/jdt/tests/compiler/regression/InitializationTest.java
===================================================================
RCS file: /home/cvs/numbat/org.eclipse.jdt.core.tests/Eclipse Java Tests Compiler/org/eclipse/jdt/tests/compiler/regression/InitializationTest.java,v
retrieving revision 1.118
diff -u -r1.118 InitializationTest.java
--- Eclipse Java Tests Compiler/org/eclipse/jdt/tests/compiler/regression/InitializationTest.java 3 Nov 2008 10:15:34 -0000 1.118
+++ Eclipse Java Tests Compiler/org/eclipse/jdt/tests/compiler/regression/InitializationTest.java 18 Nov 2008 20:11:13 -0000
@@ -1557,18 +1557,17 @@
" X x = new X(x.i); // should notice illegal forward reference.\n"+
"} \n"
},
- "----------\n" +
- "1. ERROR in X.java (at line 5)\n" +
- " X z = z.i; \n" +
- " ^^^\n" +
- "Cannot reference a field before it is defined\n" +
- "----------\n" +
- "2. ERROR in X.java (at line 6)\n" +
- " X x = new X(x.i); // should notice illegal forward reference.\n" +
- " ^^^\n" +
- "Cannot reference a field before it is defined\n" +
- "----------\n"
- );
+ "----------\n" +
+ "1. ERROR in X.java (at line 5)\n" +
+ " X z = z.i; \n" +
+ " ^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 6)\n" +
+ " X x = new X(x.i); // should notice illegal forward reference.\n" +
+ " ^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n");
}
/**
* 1EUFH3W: IVJCOM:WINNT - final variable with static/instance
@@ -1586,16 +1585,16 @@
" } \n"+
"}\n"
},
- "----------\n" +
- "1. ERROR in B.java (at line 2)\n" +
- " static B b = a.b; \n" +
- " ^^^\n" +
- "Cannot reference a field before it is defined\n" +
- "----------\n" +
- "2. WARNING in B.java (at line 2)\n" +
- " static B b = a.b; \n" +
- " ^\n" +
- "The static field B.b should be accessed in a static way\n" +
+ "----------\n" +
+ "1. ERROR in B.java (at line 2)\n" +
+ " static B b = a.b; \n" +
+ " ^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "2. WARNING in B.java (at line 2)\n" +
+ " static B b = a.b; \n" +
+ " ^\n" +
+ "The static field B.b should be accessed in a static way\n" +
"----------\n");
}
/**
#P org.eclipse.jdt.core
Index: buildnotes_jdt-core.html
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/buildnotes_jdt-core.html,v
retrieving revision 1.6755
diff -u -r1.6755 buildnotes_jdt-core.html
--- buildnotes_jdt-core.html 18 Nov 2008 10:10:46 -0000 1.6755
+++ buildnotes_jdt-core.html 18 Nov 2008 20:11:18 -0000
@@ -39,11 +39,24 @@
+
+
+Eclipse Platform Build Notes
+Java Development Tooling Core
+Eclipse SDK 3.5M4 - %date% - 3.5 MILESTONE 4
+
Project org.eclipse.jdt.core v_926
+(cvs).
+What's new in this drop
+
+Problem Reports Fixed
+255452
+[1.5][compiler] Eclipse allows forward reference in enum constructor
+
Eclipse Platform Build Notes
Java Development Tooling Core
-Eclipse SDK 3.5M4 - November 18, 2008 - 3.5 MILESTONE 4
+Eclipse SDK 3.5M4 - November 18, 2008
Project org.eclipse.jdt.core v_925
(cvs).
What's new in this drop
Index: batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties,v
retrieving revision 1.780
diff -u -r1.780 messages.properties
--- batch/org/eclipse/jdt/internal/compiler/batch/messages.properties 12 Nov 2008 00:43:25 -0000 1.780
+++ batch/org/eclipse/jdt/internal/compiler/batch/messages.properties 18 Nov 2008 20:11:20 -0000
@@ -15,7 +15,7 @@
#Format: compiler.name = word1 word2 word3
compiler.name = Eclipse Java Compiler
#Format: compiler.version = 0.XXX[, other words (don't forget the comma if adding other words)]
-compiler.version = 0.925, 3.5.0 milestone-4
+compiler.version = 0.926, 3.5.0 milestone-4
compiler.copyright = Copyright IBM Corp 2000, 2008. All rights reserved.
### progress
Index: compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java,v
retrieving revision 1.113
diff -u -r1.113 SingleNameReference.java
--- compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java 2 Oct 2008 00:46:27 -0000 1.113
+++ compiler/org/eclipse/jdt/internal/compiler/ast/SingleNameReference.java 18 Nov 2008 20:11:24 -0000
@@ -209,7 +209,7 @@
&& methodScope.lastVisibleFieldID >= 0
&& fieldBinding.id >= methodScope.lastVisibleFieldID
&& (!fieldBinding.isStatic() || methodScope.isStatic)) {
- scope.problemReporter().forwardReference(this, 0, methodScope.enclosingSourceType());
+ scope.problemReporter().forwardReference(this, 0, fieldBinding);
this.bits |= ASTNode.IgnoreNoEffectAssignCheck;
}
return fieldBinding.type;
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.136
diff -u -r1.136 QualifiedNameReference.java
--- compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java 5 Nov 2008 00:36:27 -0000 1.136
+++ compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedNameReference.java 18 Nov 2008 20:11:23 -0000
@@ -209,25 +209,6 @@
return flowInfo;
}
-/**
- * Check and/or redirect the field access to the delegate receiver if any
- */
-public TypeBinding checkFieldAccess(BlockScope scope) {
- FieldBinding fieldBinding = (FieldBinding) this.binding;
- MethodScope methodScope = scope.methodScope();
- // check for forward references
- if (this.indexOfFirstFieldBinding == 1
- && methodScope.enclosingSourceType() == fieldBinding.original().declaringClass
- && methodScope.lastVisibleFieldID >= 0
- && fieldBinding.id >= methodScope.lastVisibleFieldID
- && (!fieldBinding.isStatic() || methodScope.isStatic)) {
- scope.problemReporter().forwardReference(this, 0, methodScope.enclosingSourceType());
- }
- this.bits &= ~ASTNode.RestrictiveFlagMASK; // clear bits
- this.bits |= Binding.FIELD;
- return getOtherFieldBindings(scope);
-}
-
public void checkNPE(BlockScope scope, FlowContext flowContext, FlowInfo flowInfo, boolean checkString) {
// cannot override localVariableBinding because this would project o.m onto o when
// analysing assignments
@@ -682,27 +663,7 @@
public TypeBinding getOtherFieldBindings(BlockScope scope) {
// At this point restrictiveFlag may ONLY have two potential value : FIELD LOCAL (i.e cast <<(VariableBinding) binding>> is valid)
int length = this.tokens.length;
- FieldBinding field;
- if ((this.bits & Binding.FIELD) != 0) {
- field = (FieldBinding) this.binding;
- if (!field.isStatic()) {
- //must check for the static status....
- if (this.indexOfFirstFieldBinding > 1 //accessing to a field using a type as "receiver" is allowed only with static field
- || scope.methodScope().isStatic) { // the field is the first token of the qualified reference....
- scope.problemReporter().staticFieldAccessToNonStaticVariable(this, field);
- return null;
- }
- } else if (this.indexOfFirstFieldBinding > 1
- && field.declaringClass != this.actualReceiverType
- && field.declaringClass.canBeSeenBy(scope)) {
- scope.problemReporter().indirectAccessToStaticField(this, field);
- }
- // only last field is actually a write access if any
- if (isFieldUseDeprecated(field, scope, (this.bits & ASTNode.IsStrictlyAssigned) != 0 && this.indexOfFirstFieldBinding == length))
- scope.problemReporter().deprecatedField(field, this);
- } else {
- field = null;
- }
+ FieldBinding field = ((this.bits & Binding.FIELD) != 0) ? (FieldBinding) this.binding : null;
TypeBinding type = ((VariableBinding) this.binding).type;
int index = this.indexOfFirstFieldBinding;
if (index == length) { // restrictiveFlag == FIELD
@@ -754,11 +715,18 @@
}
if (field.isStatic()) {
- // check if accessing enum static field in initializer
- ReferenceBinding declaringClass = field.declaringClass;
+ ReferenceBinding declaringClass = field.original().declaringClass;
if (declaringClass.isEnum()) {
MethodScope methodScope = scope.methodScope();
SourceTypeBinding sourceType = methodScope.enclosingSourceType();
+ if ((this.bits & ASTNode.IsStrictlyAssigned) == 0
+ && sourceType == declaringClass
+ && methodScope.lastVisibleFieldID >= 0
+ && field.id >= methodScope.lastVisibleFieldID
+ && (!field.isStatic() || methodScope.isStatic)) {
+ scope.problemReporter().forwardReference(this, index, field);
+ }
+ // check if accessing enum static field in initializer
if ((sourceType == declaringClass || sourceType.superclass == declaringClass) // enum constant body
&& field.constant() == Constant.NotAConstant
&& !methodScope.isStatic
@@ -931,18 +899,18 @@
case Binding.VARIABLE : //============only variable===========
case Binding.TYPE | Binding.VARIABLE :
if (this.binding instanceof LocalVariableBinding) {
- LocalVariableBinding local = (LocalVariableBinding) this.binding;
- if (!local.isFinal() && ((this.bits & ASTNode.DepthMASK) != 0))
- scope.problemReporter().cannotReferToNonFinalOuterLocal((LocalVariableBinding) this.binding, this);
this.bits &= ~ASTNode.RestrictiveFlagMASK; // clear bits
this.bits |= Binding.LOCAL;
+ LocalVariableBinding local = (LocalVariableBinding) this.binding;
+ if (!local.isFinal() && ((this.bits & ASTNode.DepthMASK) != 0)) {
+ scope.problemReporter().cannotReferToNonFinalOuterLocal((LocalVariableBinding) this.binding, this);
+ }
if (local.type != null && (local.type.tagBits & TagBits.HasMissingType) != 0) {
// only complain if field reference (for local, its type got flagged already)
return null;
}
this.resolvedType = getOtherFieldBindings(scope);
- if (this.resolvedType != null
- && (this.resolvedType.tagBits & TagBits.HasMissingType) != 0) {
+ if (this.resolvedType != null && (this.resolvedType.tagBits & TagBits.HasMissingType) != 0) {
FieldBinding lastField = this.otherBindings[this.otherBindings.length - 1];
scope.problemReporter().invalidField(this, new ProblemFieldBinding(lastField.declaringClass, lastField.name, ProblemReasons.NotFound), this.tokens.length, this.resolvedType.leafComponentType());
return null;
@@ -950,21 +918,27 @@
return this.resolvedType;
}
if (this.binding instanceof FieldBinding) {
+ this.bits &= ~ASTNode.RestrictiveFlagMASK; // clear bits
+ this.bits |= Binding.FIELD;
FieldBinding fieldBinding = (FieldBinding) this.binding;
MethodScope methodScope = scope.methodScope();
+ ReferenceBinding declaringClass = fieldBinding.original().declaringClass;
+ SourceTypeBinding sourceType = methodScope.enclosingSourceType();
// check for forward references
- if (this.indexOfFirstFieldBinding == 1
- && methodScope.enclosingSourceType() == fieldBinding.original().declaringClass
+ if ((this.indexOfFirstFieldBinding == 1 || declaringClass.isEnum())
+ && sourceType == declaringClass
&& methodScope.lastVisibleFieldID >= 0
&& fieldBinding.id >= methodScope.lastVisibleFieldID
&& (!fieldBinding.isStatic() || methodScope.isStatic)) {
- scope.problemReporter().forwardReference(this, 0, methodScope.enclosingSourceType());
+ scope.problemReporter().forwardReference(this, this.indexOfFirstFieldBinding-1, fieldBinding);
+ }
+ if (isFieldUseDeprecated(fieldBinding, scope, (this.bits & ASTNode.IsStrictlyAssigned) != 0 && this.indexOfFirstFieldBinding == this.tokens.length)) {
+ scope.problemReporter().deprecatedField(fieldBinding, this);
}
if (fieldBinding.isStatic()) {
- ReferenceBinding declaringClass = fieldBinding.declaringClass;
+ // only last field is actually a write access if any
// check if accessing enum static field in initializer
if (declaringClass.isEnum()) {
- SourceTypeBinding sourceType = methodScope.enclosingSourceType();
if ((sourceType == declaringClass || sourceType.superclass == declaringClass) // enum constant body
&& fieldBinding.constant() == Constant.NotAConstant
&& !methodScope.isStatic
@@ -972,18 +946,23 @@
scope.problemReporter().enumStaticFieldUsedDuringInitialization(fieldBinding, this);
}
}
- } else if (this.indexOfFirstFieldBinding == 1 && scope.compilerOptions().getSeverity(CompilerOptions.UnqualifiedFieldAccess) != ProblemSeverities.Ignore) {
- scope.problemReporter().unqualifiedFieldAccess(this, fieldBinding);
+ if (this.indexOfFirstFieldBinding > 1
+ && fieldBinding.declaringClass != this.actualReceiverType
+ && fieldBinding.declaringClass.canBeSeenBy(scope)) {
+ scope.problemReporter().indirectAccessToStaticField(this, fieldBinding);
+ }
+ } else {
+ if (this.indexOfFirstFieldBinding == 1 && scope.compilerOptions().getSeverity(CompilerOptions.UnqualifiedFieldAccess) != ProblemSeverities.Ignore) {
+ scope.problemReporter().unqualifiedFieldAccess(this, fieldBinding);
+ }
+ //must check for the static status....
+ if (this.indexOfFirstFieldBinding > 1 //accessing to a field using a type as "receiver" is allowed only with static field
+ || scope.methodScope().isStatic) { // the field is the first token of the qualified reference....
+ scope.problemReporter().staticFieldAccessToNonStaticVariable(this, fieldBinding);
+ return null;
+ }
}
- this.bits &= ~ASTNode.RestrictiveFlagMASK; // clear bits
- this.bits |= Binding.FIELD;
-
-// // check for deprecated receiver type
-// // deprecation check for receiver type if not first token
-// if (indexOfFirstFieldBinding > 1) {
-// if (isTypeUseDeprecated(this.actualReceiverType, scope))
-// scope.problemReporter().deprecatedType(this.actualReceiverType, this);
-// }
+
this.resolvedType = getOtherFieldBindings(scope);
if (this.resolvedType != null
&& (this.resolvedType.tagBits & TagBits.HasMissingType) != 0) {
Index: compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java,v
retrieving revision 1.380
diff -u -r1.380 ProblemReporter.java
--- compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java 10 Oct 2008 17:24:31 -0000 1.380
+++ compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java 18 Nov 2008 20:11:42 -0000
@@ -1778,13 +1778,13 @@
location.sourceStart,
location.sourceEnd);
}
-public void forwardReference(Reference reference, int indexInQualification, TypeBinding type) {
+public void forwardReference(Reference reference, int indexInQualification, FieldBinding field) {
this.handle(
IProblem.ReferenceToForwardField,
NoArgument,
NoArgument,
- reference.sourceStart,
- reference.sourceEnd);
+ nodeSourceStart(field, reference, indexInQualification),
+ nodeSourceEnd(field, reference, indexInQualification));
}
public void forwardTypeVariableReference(ASTNode location, TypeVariableBinding type) {
this.handle(
Index: eval/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/eval/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.java,v
retrieving revision 1.58
diff -u -r1.58 CodeSnippetQualifiedNameReference.java
--- eval/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.java 25 Sep 2008 23:10:29 -0000 1.58
+++ eval/org/eclipse/jdt/internal/eval/CodeSnippetQualifiedNameReference.java 18 Nov 2008 20:11:43 -0000
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.jdt.internal.eval;
+import org.eclipse.jdt.internal.compiler.ast.ASTNode;
import org.eclipse.jdt.internal.compiler.ast.Assignment;
import org.eclipse.jdt.internal.compiler.ast.CompoundAssignment;
import org.eclipse.jdt.internal.compiler.ast.Expression;
@@ -25,6 +26,7 @@
import org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
import org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.eclipse.jdt.internal.compiler.lookup.MethodScope;
import org.eclipse.jdt.internal.compiler.lookup.ProblemBinding;
import org.eclipse.jdt.internal.compiler.lookup.ProblemFieldBinding;
import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons;
@@ -47,6 +49,27 @@
super(sources, positions, sourceStart, sourceEnd);
this.evaluationContext = evaluationContext;
}
+
+/**
+ * Check and/or redirect the field access to the delegate receiver if any
+ */
+public TypeBinding checkFieldAccess(BlockScope scope) {
+ FieldBinding fieldBinding = (FieldBinding) this.binding;
+ MethodScope methodScope = scope.methodScope();
+ TypeBinding declaringClass = fieldBinding.original().declaringClass;
+ // check for forward references
+ if ((this.indexOfFirstFieldBinding == 1 || declaringClass.isEnum())
+ && methodScope.enclosingSourceType() == declaringClass
+ && methodScope.lastVisibleFieldID >= 0
+ && fieldBinding.id >= methodScope.lastVisibleFieldID
+ && (!fieldBinding.isStatic() || methodScope.isStatic)) {
+ scope.problemReporter().forwardReference(this, this.indexOfFirstFieldBinding-1, fieldBinding);
+ }
+ this.bits &= ~ASTNode.RestrictiveFlagMASK; // clear bits
+ this.bits |= Binding.FIELD;
+ return getOtherFieldBindings(scope);
+}
+
public void generateCode(BlockScope currentScope, CodeStream codeStream, boolean valueRequired) {
int pc = codeStream.position;
if ((this.bits & Binding.VARIABLE) == 0) { // nothing to do if type ref
#P org.eclipse.jdt.core.tests.compiler
Index: src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java,v
retrieving revision 1.135
diff -u -r1.135 EnumTest.java
--- src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java 23 Oct 2008 17:22:28 -0000 1.135
+++ src/org/eclipse/jdt/core/tests/compiler/regression/EnumTest.java 18 Nov 2008 20:12:00 -0000
@@ -5939,4 +5939,156 @@
false,
false);
}
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=255452
+public void test168() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java", // =================
+ "enum BadEnum {\n" +
+ " CRAZY(CRAZY), // <-- illegal forward reference reported by all compilers\n" +
+ " IMPOSSIBLE(BadEnum.IMPOSSIBLE); // <-- illegal forward reference (javac 1.6 only)\n" +
+ " private BadEnum(BadEnum self) {\n" +
+ " }\n" +
+ "}\n" +
+ "public class X {\n" +
+ " X x1 = new X(x1);//1 - WRONG\n" +
+ " static X X2 = new X(X.X2);//2 - OK\n" +
+ " X x3 = new X(this.x3);//3 - OK\n" +
+ " X(X x) {}\n" +
+ " X(int i) {}\n" +
+ " static int VALUE() { return 13; }\n" +
+ " int value() { return 14; }\n" +
+ "}\n" +
+ "class Y extends X {\n" +
+ " X x1 = new X(x1);//6 - WRONG\n" +
+ " static X X2 = new X(Y.X2);//7 - OK\n" +
+ " X x3 = new X(this.x3);//8 - OK\n" +
+ " Y(Y y) { super(y); }\n" +
+ "}\n", // =================
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 2)\n" +
+ " CRAZY(CRAZY), // <-- illegal forward reference reported by all compilers\n" +
+ " ^^^^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 3)\n" +
+ " IMPOSSIBLE(BadEnum.IMPOSSIBLE); // <-- illegal forward reference (javac 1.6 only)\n" +
+ " ^^^^^^^^^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "3. ERROR in X.java (at line 8)\n" +
+ " X x1 = new X(x1);//1 - WRONG\n" +
+ " ^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "4. WARNING in X.java (at line 17)\n" +
+ " X x1 = new X(x1);//6 - WRONG\n" +
+ " ^^\n" +
+ "The field Y.x1 is hiding a field from type X\n" +
+ "----------\n" +
+ "5. ERROR in X.java (at line 17)\n" +
+ " X x1 = new X(x1);//6 - WRONG\n" +
+ " ^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "6. WARNING in X.java (at line 18)\n" +
+ " static X X2 = new X(Y.X2);//7 - OK\n" +
+ " ^^\n" +
+ "The field Y.X2 is hiding a field from type X\n" +
+ "----------\n" +
+ "7. WARNING in X.java (at line 19)\n" +
+ " X x3 = new X(this.x3);//8 - OK\n" +
+ " ^^\n" +
+ "The field Y.x3 is hiding a field from type X\n" +
+ "----------\n");
}
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=255452 - variation
+public void test169() {
+ this.runNegativeTest(
+ new String[] {
+ "X.java", // =================
+ "enum BadEnum {\n" +
+ " NOWAY(BadEnum.NOWAY.CONST),\n" +
+ " INVALID(INVALID.CONST),\n" +
+ " WRONG(WRONG.VALUE()),\n" +
+ " ILLEGAL(ILLEGAL.value());\n" +
+ " final static int CONST = 12;\n" +
+ " private BadEnum(int i) {\n" +
+ " }\n" +
+ " static int VALUE() { return 13; }\n" +
+ " int value() { return 14; }\n" +
+ "}\n" +
+ "public class X {\n" +
+ " final static int CONST = 12;\n" +
+ " X x4 = new X(x4.CONST);//4 - WRONG\n" +
+ " X x5 = new X(x5.value());//5 - WRONG\n" +
+ " X(int i) {}\n" +
+ " static int VALUE() { return 13; }\n" +
+ " int value() { return 14; }\n" +
+ "}\n", // =================
+ },
+ "----------\n" +
+ "1. ERROR in X.java (at line 2)\n" +
+ " NOWAY(BadEnum.NOWAY.CONST),\n" +
+ " ^^^^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "2. ERROR in X.java (at line 2)\n" +
+ " NOWAY(BadEnum.NOWAY.CONST),\n" +
+ " ^^^^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "3. WARNING in X.java (at line 2)\n" +
+ " NOWAY(BadEnum.NOWAY.CONST),\n" +
+ " ^^^^^\n" +
+ "The static field BadEnum.CONST should be accessed in a static way\n" +
+ "----------\n" +
+ "4. ERROR in X.java (at line 3)\n" +
+ " INVALID(INVALID.CONST),\n" +
+ " ^^^^^^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "5. ERROR in X.java (at line 3)\n" +
+ " INVALID(INVALID.CONST),\n" +
+ " ^^^^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "6. WARNING in X.java (at line 3)\n" +
+ " INVALID(INVALID.CONST),\n" +
+ " ^^^^^\n" +
+ "The static field BadEnum.CONST should be accessed in a static way\n" +
+ "----------\n" +
+ "7. ERROR in X.java (at line 4)\n" +
+ " WRONG(WRONG.VALUE()),\n" +
+ " ^^^^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "8. WARNING in X.java (at line 4)\n" +
+ " WRONG(WRONG.VALUE()),\n" +
+ " ^^^^^^^^^^^^^\n" +
+ "The static method VALUE() from the type BadEnum should be accessed in a static way\n" +
+ "----------\n" +
+ "9. ERROR in X.java (at line 5)\n" +
+ " ILLEGAL(ILLEGAL.value());\n" +
+ " ^^^^^^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "10. ERROR in X.java (at line 14)\n" +
+ " X x4 = new X(x4.CONST);//4 - WRONG\n" +
+ " ^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "11. WARNING in X.java (at line 14)\n" +
+ " X x4 = new X(x4.CONST);//4 - WRONG\n" +
+ " ^^^^^\n" +
+ "The static field X.CONST should be accessed in a static way\n" +
+ "----------\n" +
+ "12. ERROR in X.java (at line 15)\n" +
+ " X x5 = new X(x5.value());//5 - WRONG\n" +
+ " ^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n");
+}
+}
+
Index: src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
===================================================================
RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java,v
retrieving revision 1.766
diff -u -r1.766 GenericTypeTest.java
--- src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java 17 Nov 2008 15:57:12 -0000 1.766
+++ src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java 18 Nov 2008 20:13:56 -0000
@@ -36438,41 +36438,41 @@
" E e2 = e2.e;\n" +
"}", // =================
},
- "----------\n" +
- "1. ERROR in Y.java (at line 2)\n" +
- " Z z1 = z1;\n" +
- " ^^\n" +
- "Cannot reference a field before it is defined\n" +
- "----------\n" +
- "2. ERROR in Y.java (at line 3)\n" +
- " Z[] z2 = z2;\n" +
- " ^^\n" +
- "Cannot reference a field before it is defined\n" +
- "----------\n" +
- "3. ERROR in Y.java (at line 6)\n" +
- " E e0 = es[0];\n" +
- " ^^\n" +
- "Cannot reference a field before it is defined\n" +
- "----------\n" +
- "4. ERROR in Y.java (at line 7)\n" +
- " E e = e;\n" +
- " ^\n" +
- "Cannot reference a field before it is defined\n" +
- "----------\n" +
- "5. ERROR in Y.java (at line 8)\n" +
- " E[] es = es;\n" +
- " ^^\n" +
- "Cannot reference a field before it is defined\n" +
- "----------\n" +
- "6. ERROR in Y.java (at line 9)\n" +
- " E e2 = e2.e;\n" +
- " ^^^^\n" +
- "Cannot reference a field before it is defined\n" +
- "----------\n" +
- "7. ERROR in Y.java (at line 9)\n" +
- " E e2 = e2.e;\n" +
- " ^^^^\n" +
- "e2.e cannot be resolved or is not a field\n" +
+ "----------\n" +
+ "1. ERROR in Y.java (at line 2)\n" +
+ " Z z1 = z1;\n" +
+ " ^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "2. ERROR in Y.java (at line 3)\n" +
+ " Z[] z2 = z2;\n" +
+ " ^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "3. ERROR in Y.java (at line 6)\n" +
+ " E e0 = es[0];\n" +
+ " ^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "4. ERROR in Y.java (at line 7)\n" +
+ " E e = e;\n" +
+ " ^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "5. ERROR in Y.java (at line 8)\n" +
+ " E[] es = es;\n" +
+ " ^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "6. ERROR in Y.java (at line 9)\n" +
+ " E e2 = e2.e;\n" +
+ " ^^\n" +
+ "Cannot reference a field before it is defined\n" +
+ "----------\n" +
+ "7. ERROR in Y.java (at line 9)\n" +
+ " E e2 = e2.e;\n" +
+ " ^^^^\n" +
+ "e2.e cannot be resolved or is not a field\n" +
"----------\n");
}
@@ -47643,4 +47643,49 @@
},
"");
}
+public void test1407() {
+ this.runNegativeTest(
+ new String[] {
+ "Foo.java", //-----------------------------------------------------------------------
+ "public class Foo {\n" +
+ " public static I m1(Class c) { return null; }\n" +
+ " public static I m2(Class c) { return null; } \n" +
+ " void bar() {\n" +
+ " Foo l1 = m1((Class)Foo.class); //ok - unchecked conversion from Class to Class - I inferred to be Foo\n" +
+ " Foo l2 = m2((Class)Foo.class); //unchecked call, erased return type and error because Object != Foo \n" +
+ " }\n" +
+ "}\n",//-----------------------------------------------------------------------
+ },
+ "----------\n" +
+ "1. WARNING in Foo.java (at line 5)\n" +
+ " Foo l1 = m1((Class)Foo.class); //ok - unchecked conversion from Class to Class - I inferred to be Foo\n" +
+ " ^^^^^^^^^^^^^^^^\n" +
+ "Type safety: The expression of type Class needs unchecked conversion to conform to Class\n" +
+ "----------\n" +
+ "2. WARNING in Foo.java (at line 5)\n" +
+ " Foo l1 = m1((Class)Foo.class); //ok - unchecked conversion from Class to Class - I inferred to be Foo\n" +
+ " ^^^^^\n" +
+ "Class is a raw type. References to generic type Class should be parameterized\n" +
+ "----------\n" +
+ "3. WARNING in Foo.java (at line 6)\n" +
+ " Foo l2 = m2((Class)Foo.class); //unchecked call, erased return type and error because Object != Foo \n" +
+ " ^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type safety: Unchecked invocation m2(Class) of the generic method m2(Class) of type Foo\n" +
+ "----------\n" +
+ "4. ERROR in Foo.java (at line 6)\n" +
+ " Foo l2 = m2((Class)Foo.class); //unchecked call, erased return type and error because Object != Foo \n" +
+ " ^^^^^^^^^^^^^^^^^^^^\n" +
+ "Type mismatch: cannot convert from Object to Foo\n" +
+ "----------\n" +
+ "5. WARNING in Foo.java (at line 6)\n" +
+ " Foo l2 = m2((Class)Foo.class); //unchecked call, erased return type and error because Object != Foo \n" +
+ " ^^^^^^^^^^^^^^^^\n" +
+ "Type safety: The expression of type Class needs unchecked conversion to conform to Class\n" +
+ "----------\n" +
+ "6. WARNING in Foo.java (at line 6)\n" +
+ " Foo l2 = m2((Class)Foo.class); //unchecked call, erased return type and error because Object != Foo \n" +
+ " ^^^^^\n" +
+ "Class is a raw type. References to generic type Class should be parameterized\n" +
+ "----------\n");
+}
}
\ No newline at end of file