Fix join of interface
Before we would join null and I (in the test) to Object for the frame of the invoke.
Bug: b/337798768
Change-Id: I16df47ac08fb138e8ffe4b6cf98bde3bde5a9338
diff --git a/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java b/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
index fee91ad..a081d34 100644
--- a/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
+++ b/src/main/java/com/android/tools/r8/cf/TypeVerificationHelper.java
@@ -9,6 +9,7 @@
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
import com.android.tools.r8.ir.analysis.type.Nullability;
import com.android.tools.r8.ir.analysis.type.TypeElement;
import com.android.tools.r8.ir.code.Argument;
@@ -189,7 +190,12 @@
}
// All types are reference types so the join is either a class or an array.
if (result.isClassType()) {
- return result.asClassType().getClassType();
+ ClassTypeElement classType = result.asClassType();
+ if (classType.getClassType().isIdenticalTo(appView.dexItemFactory().objectType)
+ && classType.getInterfaces().hasSingleKnownInterface()) {
+ return classType.getInterfaces().getSingleKnownInterface();
+ }
+ return classType.getClassType();
} else if (result.isArrayType()) {
return result.asArrayType().toDexType(appView.dexItemFactory());
}
diff --git a/src/test/java/com/android/tools/r8/regress/Regress337798768.java b/src/test/java/com/android/tools/r8/regress/Regress337798768.java
index 567db5a..02bb4c4 100644
--- a/src/test/java/com/android/tools/r8/regress/Regress337798768.java
+++ b/src/test/java/com/android/tools/r8/regress/Regress337798768.java
@@ -3,7 +3,6 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.regress;
-import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -25,15 +24,16 @@
this.parameters = parameters;
}
- // TODO(b/337798768): should not fail verification
- @Test(expected = CompilationFailedException.class)
+ @Test
public void testR8() throws Exception {
testForR8(parameters.getBackend())
.addInnerClasses(getClass())
.addKeepMainRule(TestClass.class)
.addOptionsModification(o -> o.testing.enableStrictFrameVerification = true)
.addKeepClassAndMembersRules(A.class, B.class, I.class)
- .compile();
+ .compile()
+ .run(parameters.getRuntime(), TestClass.class)
+ .assertSuccessWithOutputLines("foobar");
}
interface I {