Merge "Wildcard after back-reference is not referable."
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 a410a65..7a50c5e 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -647,8 +647,10 @@
void verifyAndLinkBackReferences(Iterable<ProguardWildcard> wildcards) {
List<Pattern> patterns = new ArrayList<>();
+ boolean backReferenceStarted = false;
for (ProguardWildcard wildcard : wildcards) {
if (wildcard.isBackReference()) {
+ backReferenceStarted = true;
BackReference backReference = wildcard.asBackReference();
if (patterns.size() < backReference.referenceIndex) {
throw reporter.fatalError(new StringDiagnostic(
@@ -659,7 +661,9 @@
backReference.setReference(patterns.get(backReference.referenceIndex - 1));
} else {
assert wildcard.isPattern();
- patterns.add(wildcard.asPattern());
+ if (!backReferenceStarted) {
+ patterns.add(wildcard.asPattern());
+ }
}
}
}
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 46311bc..ed439c0 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -1701,6 +1701,26 @@
}
@Test
+ public void parse_if_nthWildcard_not_referable_after_backreference() throws Exception {
+ Path proguardConfig = writeTextToTempFile(
+ "-if class **.*User {",
+ " @<1>.*<2> <methods>;", // As back reference starts, * in the middle is not referable.
+ "}",
+ "-keep @interface <1>.<3><2>"
+ );
+ try {
+ ProguardConfigurationParser parser =
+ new ProguardConfigurationParser(new DexItemFactory(), reporter);
+ parser.parse(proguardConfig);
+ fail();
+ } catch (AbortException e) {
+ checkDiagnostics(handler.errors, proguardConfig, 5, 1,
+ "Wildcard", "<3>", "invalid");
+ }
+ verifyFailWithProguard6(proguardConfig, "Invalid reference to wildcard (3,");
+ }
+
+ @Test
public void parse_if_if() throws Exception {
Path proguardConfig = writeTextToTempFile(
"-if class **$$ModuleAdapter",