Version 1.4.85

Cherry pick: Compute max nameCount in NamingState#incrementAndGet()
CL: https://r8-review.googlesource.com/c/r8/+/36942/

Cherry pick: Reproduce collision bug in field name minifier
CL: https://r8-review.googlesource.com/c/r8/+/36012/

Bug: 127932803
Change-Id: I2592c9adb3154643900951964f83ede531a42c1c
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index b1a56a7..f7bc09f 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "1.4.84";
+  public static final String LABEL = "1.4.85";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/naming/NamingState.java b/src/main/java/com/android/tools/r8/naming/NamingState.java
index d414b3b..8e49563 100644
--- a/src/main/java/com/android/tools/r8/naming/NamingState.java
+++ b/src/main/java/com/android/tools/r8/naming/NamingState.java
@@ -193,6 +193,21 @@
       reservedNames.add(name);
     }
 
+    public int incrementAndGet() {
+      int parentNameCount = 0;
+      InternalState tmp = parentInternalState;
+      while (tmp != null) {
+        if (tmp.nameCount > parentNameCount) {
+          parentNameCount = tmp.nameCount;
+        }
+        tmp = tmp.parentInternalState;
+      }
+      if (parentNameCount > nameCount) {
+        nameCount = parentNameCount;
+      }
+      return nameCount++;
+    }
+
     DexString getAssignedNameFor(DexString original, KeyType proto) {
       DexString result = null;
       if (renamings != null) {
@@ -240,7 +255,7 @@
       if (dictionaryIterator.hasNext()) {
         return dictionaryIterator.next();
       } else {
-        return StringUtils.numberToIdentifier(EMPTY_CHAR_ARRAY, nameCount++, false);
+        return StringUtils.numberToIdentifier(EMPTY_CHAR_ARRAY, incrementAndGet(), false);
       }
     }
 
diff --git a/src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java b/src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
new file mode 100644
index 0000000..7b89f71
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
@@ -0,0 +1,91 @@
+// Copyright (c) 2019, 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.
+
+package com.android.tools.r8.naming;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertNotEquals;
+
+import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.NeverMerge;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FieldSubject;
+import org.junit.Test;
+
+/** Regression test for b/127932803. */
+public class FieldMinificationCollisionTest extends TestBase {
+
+  @Test
+  public void test() throws Exception {
+    String expectedOutput = StringUtils.lines("ABC");
+    CodeInspector inspector =
+        testForR8(Backend.DEX)
+            .addInnerClasses(FieldMinificationCollisionTest.class)
+            .addKeepMainRule(TestClass.class)
+            .addKeepRules(
+                "-keep class " + B.class.getTypeName() + " { public java.lang.String f2; }")
+            .enableClassInliningAnnotations()
+            .enableInliningAnnotations()
+            .enableMergeAnnotations()
+            .run(TestClass.class)
+            .assertSuccessWithOutput(expectedOutput)
+            .inspector();
+
+    FieldSubject f1Subject = inspector.clazz(A.class).uniqueFieldWithName("f1");
+    assertThat(f1Subject, isPresent());
+
+    FieldSubject f3Subject = inspector.clazz(C.class).uniqueFieldWithName("f3");
+    assertThat(f3Subject, isPresent());
+
+    assertNotEquals(f1Subject.getFinalName(), f3Subject.getFinalName());
+  }
+
+  static class TestClass {
+
+    public static void main(String[] args) {
+      new C("A", "B", "C").print();
+    }
+  }
+
+  @NeverMerge
+  static class A {
+
+    public String f1;
+
+    public A(String f1) {
+      this.f1 = f1;
+    }
+  }
+
+  @NeverMerge
+  static class B extends A {
+
+    public String f2;
+
+    public B(String f1, String f2) {
+      super(f1);
+      this.f2 = f2;
+    }
+  }
+
+  @NeverClassInline
+  static class C extends B {
+
+    public String f3;
+
+    public C(String f1, String f2, String f3) {
+      super(f1, f2);
+      this.f3 = f3;
+    }
+
+    @NeverInline
+    public void print() {
+      System.out.println(f1 + f2 + f3);
+    }
+  }
+}