Avoid merging lambda-instantiated interfaces
Change-Id: I6826b4f77dda8441b68e3bc10e9f63afa3e18741
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 24433cc..eeaa9f3 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -256,6 +256,7 @@
private boolean isMergeCandidate(DexProgramClass clazz, Set<DexType> pinnedTypes) {
if (appInfo.instantiatedTypes.contains(clazz.type)
+ || appInfo.instantiatedLambdas.contains(clazz.type)
|| appInfo.isPinned(clazz.type)
|| pinnedTypes.contains(clazz.type)) {
return false;
diff --git a/src/test/examplesAndroidO/classmerging/LambdaRewritingTest.java b/src/test/examplesAndroidO/classmerging/LambdaRewritingTest.java
index 79e98d1..8357eee 100644
--- a/src/test/examplesAndroidO/classmerging/LambdaRewritingTest.java
+++ b/src/test/examplesAndroidO/classmerging/LambdaRewritingTest.java
@@ -17,11 +17,20 @@
f.accept();
}
+ // Must not be merged into FunctionImpl as it is instantiated by a lambda.
public interface Function {
void accept();
}
+ public static class FunctionImpl implements Function {
+
+ @Override
+ public void accept() {
+ System.out.println("In FunctionImpl.accept()");
+ }
+ }
+
// Will be merged into InterfaceImpl.
public interface Interface {
diff --git a/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
index 7e0aa48..8f98fd3 100644
--- a/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
@@ -121,6 +121,7 @@
new Path[] {
JAVA8_CF_DIR.resolve("LambdaRewritingTest.class"),
JAVA8_CF_DIR.resolve("LambdaRewritingTest$Function.class"),
+ JAVA8_CF_DIR.resolve("LambdaRewritingTest$FunctionImpl.class"),
JAVA8_CF_DIR.resolve("LambdaRewritingTest$Interface.class"),
JAVA8_CF_DIR.resolve("LambdaRewritingTest$InterfaceImpl.class")
};