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 {