Bug 540631 - [1.8] wrong classification of name in name::new

Change-Id: Iac8813b561829af474ae44a6180452ad02e1154f
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
index e20a313..120b628 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
@@ -5536,7 +5536,7 @@
 		"1. ERROR in X.java (at line 5)\n" + 
 		"	process(missing::new);\n" + 
 		"	        ^^^^^^^\n" + 
-		"missing cannot be resolved\n" + 
+		"missing cannot be resolved to a type\n" + 
 		"----------\n");
 }
 public void testBug471280_comment0() {
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java
index 2ab5c9e..da0ddf9 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java
@@ -1277,8 +1277,8 @@
 				"----------\n" + 
 				"5. ERROR in X.java (at line 15)\n" + 
 				"	i = X.Y::new;\n" + 
-				"	      ^\n" + 
-				"Y cannot be resolved or is not a field\n" + 
+				"	    ^^^\n" + 
+				"X.Y cannot be resolved to a type\n" + 
 				"----------\n" + 
 				"6. ERROR in X.java (at line 27)\n" + 
 				"	new X().new Y().f();\n" + 
@@ -7065,7 +7065,35 @@
 			"}\n"
 		};
 	runner.runConformTest();
-	
+}
+public void testBug540631() {
+	Runner runner = new Runner();
+	runner.testFiles = new String[] {
+			"EclipseCompileBug.java",
+			"public enum EclipseCompileBug {\n" + 
+			"	/*\n" + 
+			"	 * Next line fails with these errors in Eclipse, works with javac:\n" + 
+			"	 * <li>Test cannot be resolved to a type\n" + 
+			"	 * <li>Cannot reference a field before it is defined\n" + 
+			"	 */\n" + 
+			"	Test(Test::new);\n" + 
+			"\n" + 
+			"	@FunctionalInterface\n" + 
+			"    public interface IConstructor<T extends Object> {\n" + 
+			"        T apply();\n" + 
+			"    }\n" + 
+			"\n" + 
+			"    private final IConstructor<?> constructor;\n" + 
+			"	private EclipseCompileBug (IConstructor<?> newObj) {\n" + 
+			"		constructor = newObj;\n" + 
+			"	}\n" + 
+			"	\n" + 
+			"	public static class Test {\n" + 
+			"		\n" + 
+			"	}\n" + 
+			"}\n"
+		};
+	runner.runConformTest();
 }
 public static Class testClass() {
 	return LambdaExpressionsTest.class;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
index e7849ee..885fc4c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
@@ -58,6 +58,7 @@
 import org.eclipse.jdt.internal.compiler.lookup.ClassScope;
 import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
 import org.eclipse.jdt.internal.compiler.lookup.MethodScope;
+import org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
 import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
 import org.eclipse.jdt.internal.compiler.parser.diagnose.DiagnoseParser;
 import org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
@@ -8724,6 +8725,9 @@
 	} else {
 		referenceExpression.initialize(this.compilationUnit.compilationResult, getUnspecifiedReference(), typeArguments, selector, sourceEnd);
 	}
+	if (CharOperation.equals(selector, TypeConstants.INIT) && referenceExpression.lhs instanceof NameReference) {
+		referenceExpression.lhs.bits &= ~Binding.VARIABLE;
+	}
 	consumeReferenceExpression(referenceExpression);
 }
 protected void consumeReferenceExpressionPrimaryForm() {