Bug 565786 - [15] record - implicit canonical constructor in a nested
record of interface not public

Change-Id: Ifd39518913261f6fd9e1243c6d2653156947636f
Signed-off-by: Manoj Palat <manpalat@in.ibm.com>
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java
index 12a7d64..f839138 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java
@@ -33,7 +33,7 @@
 	static {
 //		TESTS_NUMBERS = new int [] { 40 };
 //		TESTS_RANGE = new int[] { 1, -1 };
-//		TESTS_NAMES = new String[] { "testBug565388"};
+//		TESTS_NAMES = new String[] { "testBug565786_001"};
 	}
 
 	public static Class<?> testClass() {
@@ -7180,4 +7180,24 @@
 		"----------\n"
 	);
 }
+public void testBug565786_001() throws IOException, ClassFormatException {
+	runConformTest(
+		new String[] {
+			"X.java",
+			"public class X {\n" +
+			"    public static void main(String[] args) {\n"+
+			"        System.out.println(0);\n"+
+			"   }\n"+
+			"}\n"+
+			"interface I {\n"+
+			"    record R() {}\n"+
+			"}",
+		},
+		"0");
+	String expectedOutput =
+			"  // Method descriptor #6 ()V\n" +
+			"  // Stack: 1, Locals: 1\n" +
+			"  public I$R();\n";
+	verifyClassFile(expectedOutput, "I$R.class", ClassFileBytesDisassembler.SYSTEM);
+}
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodScope.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodScope.java
index 6102a9d..2875eae 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodScope.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodScope.java
@@ -120,7 +120,9 @@
 	if ((modifiers & ExtraCompilerModifiers.AccAlternateModifierProblem) != 0)
 		problemReporter().duplicateModifierForMethod(declaringClass, (AbstractMethodDeclaration) this.referenceContext);
 
-	if ((((ConstructorDeclaration) this.referenceContext).bits & ASTNode.IsDefaultConstructor) != 0) {
+	int astNodeBits = ((ConstructorDeclaration) this.referenceContext).bits;
+	if ((astNodeBits & ASTNode.IsDefaultConstructor) != 0
+			||((astNodeBits & ASTNode.IsImplicit) != 0 && (astNodeBits & ASTNode.IsCanonicalConstructor) != 0))  {
 		// certain flags are propagated from declaring class onto constructor
 		final int DECLARING_FLAGS = ClassFileConstants.AccEnum|ClassFileConstants.AccPublic|ClassFileConstants.AccProtected;
 		final int VISIBILITY_FLAGS = ClassFileConstants.AccPrivate|ClassFileConstants.AccPublic|ClassFileConstants.AccProtected;