Version 1.4.26

Merge: Fix tests for -optimizations
CL: https://r8-review.googlesource.com/c/r8/+/33106

Merge: Inform that -optimizations directive is ignored
CL: https://r8-review.googlesource.com/c/r8/+/33102

Bug: 122998650
Change-Id: I6e7f4e1b9e50ce5bf7e2d225152540c4b30630ce
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 6c27fb1..128245f 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.25";
+  public static final String LABEL = "1.4.26";
 
   private Version() {
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 47d3743..652217a 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -218,7 +218,7 @@
       }
       TextPosition optionStart = getPosition();
       expectChar('-');
-      if (parseIgnoredOption() ||
+      if (parseIgnoredOption(optionStart) ||
           parseIgnoredOptionAndWarn(optionStart) ||
           parseUnsupportedOptionAndErr(optionStart)) {
         // Intentionally left empty.
@@ -438,13 +438,13 @@
       return true;
     }
 
-    private boolean parseIgnoredOption() {
+    private boolean parseIgnoredOption(TextPosition optionStart) {
       return Iterables.any(IGNORED_SINGLE_ARG_OPTIONS, this::skipOptionWithSingleArg)
           || Iterables.any(IGNORED_OPTIONAL_SINGLE_ARG_OPTIONS,
                            this::skipOptionWithOptionalSingleArg)
           || Iterables.any(IGNORED_FLAG_OPTIONS, this::skipFlag)
           || Iterables.any(IGNORED_CLASS_DESCRIPTOR_OPTIONS, this::skipOptionWithClassSpec)
-          || parseOptimizationOption();
+          || parseOptimizationOption(optionStart);
     }
 
     private void parseInclude() throws ProguardRuleParserException {
@@ -533,10 +533,11 @@
 
     }
 
-    private boolean parseOptimizationOption() {
+    private boolean parseOptimizationOption(TextPosition optionStart) {
       if (!acceptString("optimizations")) {
         return false;
       }
+      warnIgnoringOptions("optimizations", optionStart);
       do {
         skipWhitespace();
         skipOptimizationName();
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index ff84486..e99462e 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -1053,8 +1053,10 @@
             "-optimizations   !  xxx,  !  yyy",
             "-optimizations !code/simplification/advanced,code/simplification/*")) {
       reset();
-      parser.parse(createConfigurationForTesting(ImmutableList.of(option)));
-      verifyParserEndsCleanly();
+      Path proguardConfig = writeTextToTempFile(option);
+      parser.parse(proguardConfig);
+      assertEquals(1, handler.warnings.size());
+      checkDiagnostics(handler.warnings, proguardConfig, 1, 1, "Ignoring", "-optimizations");
     }
   }
 
@@ -1070,15 +1072,35 @@
       ProguardConfigurationParser parser =
           new ProguardConfigurationParser(new DexItemFactory(), reporter);
       parser.parse(proguardConfig);
-      checkDiagnostics(handler.warnings, proguardConfig, 2, 1,
-          "Ignoring", "-optimizationpasses");
-      Position p = handler.warnings.get(0).getPosition();
-      assertTrue(p instanceof TextRange);
-      TextRange r = (TextRange) p;
-      assertEquals(2, r.getStart().getLine());
-      assertEquals(1, r.getStart().getColumn());
-      assertEquals(2, r.getEnd().getLine());
-      assertEquals(22, r.getEnd().getColumn());
+      assertEquals(3, handler.warnings.size());
+
+      checkDiagnostics(handler.warnings, 0, proguardConfig, 1, 1, "Ignoring", "-optimizations");
+      Position p1 = handler.warnings.get(0).getPosition();
+      assertTrue(p1 instanceof TextRange);
+      TextRange r1 = (TextRange) p1;
+      assertEquals(1, r1.getStart().getLine());
+      assertEquals(1, r1.getStart().getColumn());
+      assertEquals(1, r1.getEnd().getLine());
+      assertEquals(15, r1.getEnd().getColumn());
+
+      checkDiagnostics(
+          handler.warnings, 1, proguardConfig, 2, 1, "Ignoring", "-optimizationpasses");
+      Position p2 = handler.warnings.get(1).getPosition();
+      assertTrue(p2 instanceof TextRange);
+      TextRange r2 = (TextRange) p2;
+      assertEquals(2, r2.getStart().getLine());
+      assertEquals(1, r2.getStart().getColumn());
+      assertEquals(2, r2.getEnd().getLine());
+      assertEquals(22, r2.getEnd().getColumn());
+
+      checkDiagnostics(handler.warnings, 2, proguardConfig, 3, 1, "Ignoring", "-optimizations");
+      Position p3 = handler.warnings.get(2).getPosition();
+      assertTrue(p3 instanceof TextRange);
+      TextRange r3 = (TextRange) p3;
+      assertEquals(3, r3.getStart().getLine());
+      assertEquals(1, r3.getStart().getColumn());
+      assertEquals(3, r3.getEnd().getLine());
+      assertEquals(15, r3.getEnd().getColumn());
     }
   }