Do not rebind field accesses if that would conflict with visibility.

This changes the assumption that field accesses are always dispatched to
an actual definition. Moving forward, your analysis has to make sure that
the field id is dispatched first.

This change also changes the semantics of some fields in AppInfoWithLiveness
to reflect this change.

Bug: 38187737
Change-Id: I221dac4ded6a6708d5bfc01bdd7a51a7b516294a
diff --git a/src/test/examples/memberrebinding/Test.java b/src/test/examples/memberrebinding/Memberrebinding.java
similarity index 97%
rename from src/test/examples/memberrebinding/Test.java
rename to src/test/examples/memberrebinding/Memberrebinding.java
index 62a2440..74c99fd 100644
--- a/src/test/examples/memberrebinding/Test.java
+++ b/src/test/examples/memberrebinding/Memberrebinding.java
@@ -6,7 +6,7 @@
 import memberrebinding.subpackage.PublicClass;
 import memberrebindinglib.AnIndependentInterface;
 
-public class Test {
+public class Memberrebinding {
 
   public static void main(String[] args) {
     ClassAtBottomOfChain bottomInstance = new ClassAtBottomOfChain();
diff --git a/src/test/examples/memberrebinding2/Test.java b/src/test/examples/memberrebinding2/Memberrebinding.java
similarity index 96%
rename from src/test/examples/memberrebinding2/Test.java
rename to src/test/examples/memberrebinding2/Memberrebinding.java
index d4b005e..13cde8c 100644
--- a/src/test/examples/memberrebinding2/Test.java
+++ b/src/test/examples/memberrebinding2/Memberrebinding.java
@@ -5,7 +5,7 @@
 
 import memberrebinding2.subpackage.PublicClass;
 
-public class Test {
+public class Memberrebinding {
 
   public static void main(String[] args) {
     ClassAtBottomOfChain bottomInstance = new ClassAtBottomOfChain();
diff --git a/src/test/examples/memberrebinding2/keep-rules.txt b/src/test/examples/memberrebinding2/keep-rules.txt
new file mode 100644
index 0000000..ae40c43
--- /dev/null
+++ b/src/test/examples/memberrebinding2/keep-rules.txt
@@ -0,0 +1,12 @@
+# Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE file.
+
+# Keep the application entry point. Get rid of everything that is not
+# reachable from there.
+-keep public class memberrebinding2.Memberrebinding {
+  public static void main(...);
+}
+
+# Remove once b/62048823 is fixed.
+-allowaccessmodification
\ No newline at end of file
diff --git a/src/test/examples/memberrebinding3/Test.java b/src/test/examples/memberrebinding3/Memberrebinding.java
similarity index 78%
rename from src/test/examples/memberrebinding3/Test.java
rename to src/test/examples/memberrebinding3/Memberrebinding.java
index d37f263..83d8bbb 100644
--- a/src/test/examples/memberrebinding3/Test.java
+++ b/src/test/examples/memberrebinding3/Memberrebinding.java
@@ -3,16 +3,19 @@
 // BSD-style license that can be found in the LICENSE file.
 package memberrebinding3;
 
-public class Test extends ClassAtBottomOfChain {
+public class Memberrebinding extends ClassAtBottomOfChain {
 
+  @Override
   void bottomMethod() {
 
   }
 
+  @Override
   void middleMethod() {
 
   }
 
+  @Override
   void topMethod() {
 
   }
@@ -24,6 +27,6 @@
   }
 
   public static void main(String[] args) {
-    new Test().test();
+    new Memberrebinding().test();
   }
 }
diff --git a/src/test/examplesAndroidN/memberrebinding4/Test.java b/src/test/examplesAndroidN/memberrebinding4/Memberrebinding.java
similarity index 93%
rename from src/test/examplesAndroidN/memberrebinding4/Test.java
rename to src/test/examplesAndroidN/memberrebinding4/Memberrebinding.java
index 6fc2ad5..a699537 100644
--- a/src/test/examplesAndroidN/memberrebinding4/Test.java
+++ b/src/test/examplesAndroidN/memberrebinding4/Memberrebinding.java
@@ -5,7 +5,7 @@
 
 import memberrebinding4.subpackage.PublicInterface;
 
-public class Test {
+public class Memberrebinding {
 
   static class Inner implements PublicInterface {
 
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
index a264f48..9be6930 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
@@ -103,8 +103,8 @@
         "regress_37875803.Regress",
         "regress_37955340.Regress",
         "regress_62300145.Regress",
-        "memberrebinding2.Test",
-        "memberrebinding3.Test",
+        "memberrebinding2.Memberrebinding",
+        "memberrebinding3.Memberrebinding",
         "minification.Minification",
         "enclosingmethod.Main",
         "interfaceinlining.Main",
@@ -123,7 +123,7 @@
   private static String[] makeTest(
       DexTool tool, CompilerUnderTest compiler, CompilationMode mode, String clazz) {
     String pkg = clazz.substring(0, clazz.lastIndexOf('.'));
-    return new String[] {pkg, tool.name(), compiler.name(), mode.name(), clazz};
+    return new String[]{pkg, tool.name(), compiler.name(), mode.name(), clazz};
   }
 
   @Rule
diff --git a/src/test/java/com/android/tools/r8/dex/ExtraFileTest.java b/src/test/java/com/android/tools/r8/dex/ExtraFileTest.java
index 26067c7..376577c 100644
--- a/src/test/java/com/android/tools/r8/dex/ExtraFileTest.java
+++ b/src/test/java/com/android/tools/r8/dex/ExtraFileTest.java
@@ -25,7 +25,7 @@
   private static final String EXAMPLE_DIR = ToolHelper.EXAMPLES_BUILD_DIR;
   private static final String EXAMPLE_DEX = "memberrebinding/classes.dex";
   private static final String EXAMPLE_LIB = "memberrebindinglib/classes.dex";
-  private static final String EXAMPLE_CLASS = "memberrebinding.Test";
+  private static final String EXAMPLE_CLASS = "memberrebinding.Memberrebinding";
   private static final String EXAMPLE_PACKAGE_MAP = "memberrebinding/package.map";
   private static final String EXAMPLE_PROGUARD_MAP = "memberrebinding/proguard.map";
 
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
index 55bd373..c617c25 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
@@ -105,7 +105,8 @@
   }
 
   private static void inspectOriginalMain(DexInspector inspector) {
-    MethodSubject main = inspector.clazz("memberrebinding.Test").method(DexInspector.MAIN);
+    MethodSubject main = inspector.clazz("memberrebinding.Memberrebinding")
+        .method(DexInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(MemberRebindingTest::coolInvokes);
     assertTrue(iterator.next().holder().is("memberrebinding.ClassAtBottomOfChain"));
@@ -132,7 +133,8 @@
   }
 
   private static void inspectMain(DexInspector inspector) {
-    MethodSubject main = inspector.clazz("memberrebinding.Test").method(DexInspector.MAIN);
+    MethodSubject main = inspector.clazz("memberrebinding.Memberrebinding")
+        .method(DexInspector.MAIN);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(MemberRebindingTest::coolInvokes);
     assertTrue(iterator.next().holder().is("memberrebinding.ClassAtBottomOfChain"));
@@ -162,7 +164,8 @@
   }
 
   private static void inspectOriginalMain2(DexInspector inspector) {
-    MethodSubject main = inspector.clazz("memberrebinding2.Test").method(DexInspector.MAIN);
+    MethodSubject main = inspector.clazz("memberrebinding2.Memberrebinding")
+        .method(DexInspector.MAIN);
     Iterator<FieldAccessInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isFieldAccess);
     // Run through instance put, static put, instance get and instance get.
@@ -177,7 +180,8 @@
   }
 
   private static void inspectMain2(DexInspector inspector) {
-    MethodSubject main = inspector.clazz("memberrebinding2.Test").method(DexInspector.MAIN);
+    MethodSubject main = inspector.clazz("memberrebinding2.Memberrebinding")
+        .method(DexInspector.MAIN);
     Iterator<FieldAccessInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isFieldAccess);
     // Run through instance put, static put, instance get and instance get.
@@ -185,7 +189,7 @@
       assertTrue(iterator.next().holder().is("memberrebinding2.ClassAtBottomOfChain"));
       assertTrue(iterator.next().holder().is("memberrebinding2.ClassInMiddleOfChain"));
       assertTrue(iterator.next().holder().is("memberrebinding2.SuperClassOfAll"));
-      assertTrue(iterator.next().holder().is("memberrebinding2.subpackage.PackagePrivateClass"));
+      assertTrue(iterator.next().holder().is("memberrebinding2.subpackage.PublicClass"));
     }
     assertTrue(iterator.next().holder().is("java.lang.System"));
     assertFalse(iterator.hasNext());
@@ -195,7 +199,7 @@
       new MethodSignature("test", "void", new String[]{});
 
   private static void inspectOriginal3(DexInspector inspector) {
-    MethodSubject main = inspector.clazz("memberrebinding3.Test").method(TEST);
+    MethodSubject main = inspector.clazz("memberrebinding3.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
     assertTrue(iterator.next().holder().is("memberrebinding3.ClassAtBottomOfChain"));
@@ -205,7 +209,7 @@
   }
 
   private static void inspect3(DexInspector inspector) {
-    MethodSubject main = inspector.clazz("memberrebinding3.Test").method(TEST);
+    MethodSubject main = inspector.clazz("memberrebinding3.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
     assertTrue(iterator.next().holder().is("memberrebinding3.ClassAtBottomOfChain"));
@@ -215,19 +219,19 @@
   }
 
   private static void inspectOriginal4(DexInspector inspector) {
-    MethodSubject main = inspector.clazz("memberrebinding4.Test").method(TEST);
+    MethodSubject main = inspector.clazz("memberrebinding4.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
-    assertTrue(iterator.next().holder().is("memberrebinding4.Test$Inner"));
+    assertTrue(iterator.next().holder().is("memberrebinding4.Memberrebinding$Inner"));
     assertTrue(iterator.next().holder().is("memberrebinding4.subpackage.PublicInterface"));
     assertFalse(iterator.hasNext());
   }
 
   private static void inspect4(DexInspector inspector) {
-    MethodSubject main = inspector.clazz("memberrebinding4.Test").method(TEST);
+    MethodSubject main = inspector.clazz("memberrebinding4.Memberrebinding").method(TEST);
     Iterator<InvokeInstructionSubject> iterator =
         main.iterateInstructions(InstructionSubject::isInvoke);
-    assertTrue(iterator.next().holder().is("memberrebinding4.Test$Inner"));
+    assertTrue(iterator.next().holder().is("memberrebinding4.Memberrebinding$Inner"));
     assertTrue(iterator.next().holder().is("memberrebinding4.subpackage.PublicInterface"));
     assertFalse(iterator.hasNext());
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
index 4530e2e..6a8cfb8 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
@@ -542,7 +542,9 @@
             "assumevalues3",
             "assumevalues4",
             "assumevalues5",
-            "annotationremoval");
+            "annotationremoval",
+            "memberrebinding2",
+            "memberrebinding3");
 
     // Keys can be the name of the test or the name of the test followed by a colon and the name
     // of the keep file.