Filter out lambdas with unexpected annotations.
Bug: 124105982, 118182891
Change-Id: I5df64173b254370c7730ec7d50ceb7490b0b9c64
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
index 66ae73a..8dedd18 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
@@ -154,7 +154,8 @@
cls ->
cls.hasKotlinInfo()
&& cls.getKotlinInfo().isSyntheticClass()
- && cls.getKotlinInfo().asSyntheticClass().isLambda())
+ && cls.getKotlinInfo().asSyntheticClass().isLambda()
+ && KotlinLambdaGroupIdFactory.hasValidAnnotations(kotlin, cls))
.sorted((a, b) -> a.type.slowCompareTo(b.type)) // Ensure stable ordering.
.forEachOrdered(
lambda -> {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java
index 4b8290e..1c649d5 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/kotlin/KotlinLambdaGroupIdFactory.java
@@ -87,6 +87,21 @@
return null;
}
+ public static boolean hasValidAnnotations(Kotlin kotlin, DexClass lambda) {
+ if (!lambda.annotations.isEmpty()) {
+ for (DexAnnotation annotation : lambda.annotations.annotations) {
+ if (DexAnnotation.isSignatureAnnotation(annotation, kotlin.factory)) {
+ continue;
+ }
+ if (annotation.annotation.type == kotlin.metadata.kotlinMetadataType) {
+ continue;
+ }
+ return false;
+ }
+ }
+ return true;
+ }
+
String validateAnnotations(Kotlin kotlin, DexClass lambda) throws LambdaStructureError {
String signature = null;
if (!lambda.annotations.isEmpty()) {
@@ -103,10 +118,12 @@
continue;
}
+ assert !hasValidAnnotations(kotlin, lambda);
throw new LambdaStructureError(
"unexpected annotation: " + annotation.annotation.type.toSourceString());
}
}
+ assert hasValidAnnotations(kotlin, lambda);
return signature;
}