Add test for starting debug local range outside range

Bug: 169346184
Change-Id: I2c9890bb68537bb63a766abb51524ef62d10e0ee
diff --git a/src/test/java/com/android/tools/r8/ir/DebugLocalStartOutsideRangeTest.java b/src/test/java/com/android/tools/r8/ir/DebugLocalStartOutsideRangeTest.java
new file mode 100644
index 0000000..cfd20ab
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/DebugLocalStartOutsideRangeTest.java
@@ -0,0 +1,495 @@
+// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir;
+
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static com.android.tools.r8.ir.DebugLocalStartOutsideRangeTest.PrintHelper$PrintUriAdapter$1Dump.dump;
+import static org.hamcrest.CoreMatchers.containsString;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+@RunWith(Parameterized.class)
+public class DebugLocalStartOutsideRangeTest extends TestBase {
+
+  private final TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
+  }
+
+  public DebugLocalStartOutsideRangeTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testD8() throws CompilationFailedException {
+    testForD8(parameters.getBackend())
+        .addProgramClassFileData(dump())
+        .setMinApi(parameters.getApiLevel())
+        .compileWithExpectedDiagnostics(
+            diagnostics -> {
+              if (parameters.isDexRuntime()) {
+                diagnostics.assertWarningThatMatches(
+                    diagnosticMessage(containsString("Could not find phi type for register")));
+              }
+            });
+  }
+
+  public static class PrintHelper$PrintUriAdapter$1Dump implements Opcodes {
+
+    public static byte[] dump() {
+
+      ClassWriter classWriter = new ClassWriter(0);
+      FieldVisitor fieldVisitor;
+      MethodVisitor methodVisitor;
+
+      classWriter.visit(
+          V1_7,
+          ACC_SUPER,
+          "androidx/print/PrintHelper$PrintUriAdapter$1",
+          "Landroid/os/AsyncTask<Landroid/net/Uri;Ljava/lang/Boolean;Landroid/graphics/Bitmap;>;",
+          "android/os/AsyncTask",
+          null);
+
+      classWriter.visitSource("PrintHelper.java", null);
+
+      classWriter.visitOuterClass(
+          "androidx/print/PrintHelper$PrintUriAdapter",
+          "onLayout",
+          "(Landroid/print/PrintAttributes;Landroid/print/PrintAttributes;Landroid/os/CancellationSignal;Landroid/print/PrintDocumentAdapter$LayoutResultCallback;Landroid/os/Bundle;)V");
+
+      classWriter.visitInnerClass(
+          "androidx/print/PrintHelper$PrintUriAdapter",
+          "androidx/print/PrintHelper",
+          "PrintUriAdapter",
+          ACC_PRIVATE);
+
+      classWriter.visitInnerClass("androidx/print/PrintHelper$PrintUriAdapter$1", null, null, 0);
+
+      classWriter.visitInnerClass(
+          "android/print/PrintAttributes$MediaSize",
+          "android/print/PrintAttributes",
+          "MediaSize",
+          ACC_PUBLIC | ACC_FINAL | ACC_STATIC);
+
+      classWriter.visitInnerClass(
+          "android/print/PrintDocumentInfo$Builder",
+          "android/print/PrintDocumentInfo",
+          "Builder",
+          ACC_PUBLIC | ACC_FINAL | ACC_STATIC);
+
+      {
+        fieldVisitor =
+            classWriter.visitField(
+                ACC_FINAL | ACC_SYNTHETIC,
+                "val$cancellationSignal",
+                "Landroid/os/CancellationSignal;",
+                null,
+                null);
+        fieldVisitor.visitEnd();
+      }
+      {
+        fieldVisitor =
+            classWriter.visitField(
+                ACC_FINAL | ACC_SYNTHETIC,
+                "val$newPrintAttributes",
+                "Landroid/print/PrintAttributes;",
+                null,
+                null);
+        fieldVisitor.visitEnd();
+      }
+      {
+        fieldVisitor =
+            classWriter.visitField(
+                ACC_FINAL | ACC_SYNTHETIC,
+                "val$oldPrintAttributes",
+                "Landroid/print/PrintAttributes;",
+                null,
+                null);
+        fieldVisitor.visitEnd();
+      }
+      {
+        fieldVisitor =
+            classWriter.visitField(
+                ACC_FINAL | ACC_SYNTHETIC,
+                "val$layoutResultCallback",
+                "Landroid/print/PrintDocumentAdapter$LayoutResultCallback;",
+                null,
+                null);
+        fieldVisitor.visitEnd();
+      }
+      {
+        fieldVisitor =
+            classWriter.visitField(
+                ACC_FINAL | ACC_SYNTHETIC,
+                "this$1",
+                "Landroidx/print/PrintHelper$PrintUriAdapter;",
+                null,
+                null);
+        fieldVisitor.visitEnd();
+      }
+      {
+        methodVisitor =
+            classWriter.visitMethod(
+                ACC_PROTECTED, "onPostExecute", "(Landroid/graphics/Bitmap;)V", null, null);
+        methodVisitor.visitCode();
+        Label label0 = new Label();
+        Label label1 = new Label();
+        Label label2 = new Label();
+        methodVisitor.visitTryCatchBlock(label0, label1, label2, null);
+        Label label3 = new Label();
+        methodVisitor.visitTryCatchBlock(label2, label3, label2, null);
+        Label label4 = new Label();
+        methodVisitor.visitLabel(label4);
+        methodVisitor.visitLineNumber(450, label4);
+        methodVisitor.visitVarInsn(ALOAD, 0);
+        methodVisitor.visitVarInsn(ALOAD, 1);
+        methodVisitor.visitMethodInsn(
+            INVOKESPECIAL, "android/os/AsyncTask", "onPostExecute", "(Ljava/lang/Object;)V", false);
+        Label label5 = new Label();
+        methodVisitor.visitLabel(label5);
+        methodVisitor.visitLineNumber(454, label5);
+        methodVisitor.visitVarInsn(ALOAD, 1);
+        Label label6 = new Label();
+        methodVisitor.visitJumpInsn(IFNULL, label6);
+        methodVisitor.visitFieldInsn(
+            GETSTATIC, "androidx/print/PrintHelper", "PRINT_ACTIVITY_RESPECTS_ORIENTATION", "Z");
+        Label label7 = new Label();
+        methodVisitor.visitJumpInsn(IFEQ, label7);
+        methodVisitor.visitVarInsn(ALOAD, 0);
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter$1",
+            "this$1",
+            "Landroidx/print/PrintHelper$PrintUriAdapter;");
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter",
+            "this$0",
+            "Landroidx/print/PrintHelper;");
+        methodVisitor.visitFieldInsn(GETFIELD, "androidx/print/PrintHelper", "mOrientation", "I");
+        methodVisitor.visitJumpInsn(IFNE, label6);
+        methodVisitor.visitLabel(label7);
+        methodVisitor.visitLineNumber(458, label7);
+        methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        methodVisitor.visitVarInsn(ALOAD, 0);
+        methodVisitor.visitInsn(DUP);
+        methodVisitor.visitVarInsn(ASTORE, 3);
+        methodVisitor.visitInsn(MONITORENTER);
+        methodVisitor.visitLabel(label0);
+        methodVisitor.visitLineNumber(459, label0);
+        methodVisitor.visitVarInsn(ALOAD, 0);
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter$1",
+            "this$1",
+            "Landroidx/print/PrintHelper$PrintUriAdapter;");
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter",
+            "mAttributes",
+            "Landroid/print/PrintAttributes;");
+        methodVisitor.visitMethodInsn(
+            INVOKEVIRTUAL,
+            "android/print/PrintAttributes",
+            "getMediaSize",
+            "()Landroid/print/PrintAttributes$MediaSize;",
+            false);
+        methodVisitor.visitVarInsn(ASTORE, 2);
+        Label label8 = new Label();
+        methodVisitor.visitLabel(label8);
+        methodVisitor.visitLineNumber(460, label8);
+        methodVisitor.visitVarInsn(ALOAD, 3);
+        methodVisitor.visitInsn(MONITOREXIT);
+        methodVisitor.visitLabel(label1);
+        Label label9 = new Label();
+        methodVisitor.visitJumpInsn(GOTO, label9);
+        methodVisitor.visitLabel(label2);
+        methodVisitor.visitFrame(
+            Opcodes.F_FULL,
+            4,
+            new Object[] {
+              "androidx/print/PrintHelper$PrintUriAdapter$1",
+              "android/graphics/Bitmap",
+              Opcodes.TOP,
+              "java/lang/Object"
+            },
+            1,
+            new Object[] {"java/lang/Throwable"});
+        methodVisitor.visitVarInsn(ASTORE, 4);
+        methodVisitor.visitVarInsn(ALOAD, 3);
+        methodVisitor.visitInsn(MONITOREXIT);
+        methodVisitor.visitLabel(label3);
+        methodVisitor.visitVarInsn(ALOAD, 4);
+        methodVisitor.visitInsn(ATHROW);
+        methodVisitor.visitLabel(label9);
+        methodVisitor.visitLineNumber(462, label9);
+        methodVisitor.visitFrame(
+            Opcodes.F_FULL,
+            3,
+            new Object[] {
+              "androidx/print/PrintHelper$PrintUriAdapter$1",
+              "android/graphics/Bitmap",
+              "android/print/PrintAttributes$MediaSize"
+            },
+            0,
+            new Object[] {});
+        methodVisitor.visitVarInsn(ALOAD, 2);
+        methodVisitor.visitJumpInsn(IFNULL, label6);
+        Label label10 = new Label();
+        methodVisitor.visitLabel(label10);
+        methodVisitor.visitLineNumber(463, label10);
+        methodVisitor.visitVarInsn(ALOAD, 2);
+        methodVisitor.visitMethodInsn(
+            INVOKEVIRTUAL, "android/print/PrintAttributes$MediaSize", "isPortrait", "()Z", false);
+        methodVisitor.visitVarInsn(ALOAD, 1);
+        methodVisitor.visitMethodInsn(
+            INVOKESTATIC,
+            "androidx/print/PrintHelper",
+            "isPortrait",
+            "(Landroid/graphics/Bitmap;)Z",
+            false);
+        methodVisitor.visitJumpInsn(IF_ICMPEQ, label6);
+        Label label11 = new Label();
+        methodVisitor.visitLabel(label11);
+        methodVisitor.visitLineNumber(464, label11);
+        methodVisitor.visitTypeInsn(NEW, "android/graphics/Matrix");
+        methodVisitor.visitInsn(DUP);
+        methodVisitor.visitMethodInsn(
+            INVOKESPECIAL, "android/graphics/Matrix", "<init>", "()V", false);
+        methodVisitor.visitVarInsn(ASTORE, 3);
+        Label label12 = new Label();
+        methodVisitor.visitLabel(label12);
+        methodVisitor.visitLineNumber(466, label12);
+        methodVisitor.visitVarInsn(ALOAD, 3);
+        methodVisitor.visitLdcInsn(new Float("90.0"));
+        methodVisitor.visitMethodInsn(
+            INVOKEVIRTUAL, "android/graphics/Matrix", "postRotate", "(F)Z", false);
+        methodVisitor.visitInsn(POP);
+        Label label13 = new Label();
+        methodVisitor.visitLabel(label13);
+        methodVisitor.visitLineNumber(467, label13);
+        methodVisitor.visitVarInsn(ALOAD, 1);
+        methodVisitor.visitInsn(ICONST_0);
+        methodVisitor.visitInsn(ICONST_0);
+        methodVisitor.visitVarInsn(ALOAD, 1);
+        Label label14 = new Label();
+        methodVisitor.visitLabel(label14);
+        methodVisitor.visitLineNumber(468, label14);
+        methodVisitor.visitMethodInsn(
+            INVOKEVIRTUAL, "android/graphics/Bitmap", "getWidth", "()I", false);
+        methodVisitor.visitVarInsn(ALOAD, 1);
+        methodVisitor.visitMethodInsn(
+            INVOKEVIRTUAL, "android/graphics/Bitmap", "getHeight", "()I", false);
+        methodVisitor.visitVarInsn(ALOAD, 3);
+        methodVisitor.visitInsn(ICONST_1);
+        Label label15 = new Label();
+        methodVisitor.visitLabel(label15);
+        methodVisitor.visitLineNumber(467, label15);
+        methodVisitor.visitMethodInsn(
+            INVOKESTATIC,
+            "android/graphics/Bitmap",
+            "createBitmap",
+            "(Landroid/graphics/Bitmap;IIIILandroid/graphics/Matrix;Z)Landroid/graphics/Bitmap;",
+            false);
+        methodVisitor.visitVarInsn(ASTORE, 1);
+        methodVisitor.visitLabel(label6);
+        methodVisitor.visitLineNumber(474, label6);
+        methodVisitor.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
+        methodVisitor.visitVarInsn(ALOAD, 0);
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter$1",
+            "this$1",
+            "Landroidx/print/PrintHelper$PrintUriAdapter;");
+        methodVisitor.visitVarInsn(ALOAD, 1);
+        methodVisitor.visitFieldInsn(
+            PUTFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter",
+            "mBitmap",
+            "Landroid/graphics/Bitmap;");
+        Label label16 = new Label();
+        methodVisitor.visitLabel(label16);
+        methodVisitor.visitLineNumber(475, label16);
+        methodVisitor.visitVarInsn(ALOAD, 1);
+        Label label17 = new Label();
+        methodVisitor.visitJumpInsn(IFNULL, label17);
+        Label label18 = new Label();
+        methodVisitor.visitLabel(label18);
+        methodVisitor.visitLineNumber(476, label18);
+        methodVisitor.visitTypeInsn(NEW, "android/print/PrintDocumentInfo$Builder");
+        methodVisitor.visitInsn(DUP);
+        methodVisitor.visitVarInsn(ALOAD, 0);
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter$1",
+            "this$1",
+            "Landroidx/print/PrintHelper$PrintUriAdapter;");
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter",
+            "mJobName",
+            "Ljava/lang/String;");
+        methodVisitor.visitMethodInsn(
+            INVOKESPECIAL,
+            "android/print/PrintDocumentInfo$Builder",
+            "<init>",
+            "(Ljava/lang/String;)V",
+            false);
+        methodVisitor.visitInsn(ICONST_1);
+        Label label19 = new Label();
+        methodVisitor.visitLabel(label19);
+        methodVisitor.visitLineNumber(477, label19);
+        methodVisitor.visitMethodInsn(
+            INVOKEVIRTUAL,
+            "android/print/PrintDocumentInfo$Builder",
+            "setContentType",
+            "(I)Landroid/print/PrintDocumentInfo$Builder;",
+            false);
+        methodVisitor.visitInsn(ICONST_1);
+        Label label20 = new Label();
+        methodVisitor.visitLabel(label20);
+        methodVisitor.visitLineNumber(478, label20);
+        methodVisitor.visitMethodInsn(
+            INVOKEVIRTUAL,
+            "android/print/PrintDocumentInfo$Builder",
+            "setPageCount",
+            "(I)Landroid/print/PrintDocumentInfo$Builder;",
+            false);
+        Label label21 = new Label();
+        methodVisitor.visitLabel(label21);
+        methodVisitor.visitLineNumber(479, label21);
+        methodVisitor.visitMethodInsn(
+            INVOKEVIRTUAL,
+            "android/print/PrintDocumentInfo$Builder",
+            "build",
+            "()Landroid/print/PrintDocumentInfo;",
+            false);
+        methodVisitor.visitVarInsn(ASTORE, 2);
+        Label label22 = new Label();
+        methodVisitor.visitLabel(label22);
+        methodVisitor.visitLineNumber(481, label22);
+        methodVisitor.visitVarInsn(ALOAD, 0);
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter$1",
+            "val$newPrintAttributes",
+            "Landroid/print/PrintAttributes;");
+        methodVisitor.visitVarInsn(ALOAD, 0);
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter$1",
+            "val$oldPrintAttributes",
+            "Landroid/print/PrintAttributes;");
+        methodVisitor.visitMethodInsn(
+            INVOKEVIRTUAL,
+            "android/print/PrintAttributes",
+            "equals",
+            "(Ljava/lang/Object;)Z",
+            false);
+        Label label23 = new Label();
+        methodVisitor.visitJumpInsn(IFNE, label23);
+        methodVisitor.visitInsn(ICONST_1);
+        Label label24 = new Label();
+        methodVisitor.visitJumpInsn(GOTO, label24);
+        methodVisitor.visitLabel(label23);
+        methodVisitor.visitFrame(
+            Opcodes.F_APPEND, 1, new Object[] {"android/print/PrintDocumentInfo"}, 0, null);
+        methodVisitor.visitInsn(ICONST_0);
+        methodVisitor.visitLabel(label24);
+        methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {Opcodes.INTEGER});
+        methodVisitor.visitVarInsn(ISTORE, 3);
+        Label label25 = new Label();
+        methodVisitor.visitLabel(label25);
+        methodVisitor.visitLineNumber(483, label25);
+        methodVisitor.visitVarInsn(ALOAD, 0);
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter$1",
+            "val$layoutResultCallback",
+            "Landroid/print/PrintDocumentAdapter$LayoutResultCallback;");
+        methodVisitor.visitVarInsn(ALOAD, 2);
+        methodVisitor.visitVarInsn(ILOAD, 3);
+        methodVisitor.visitMethodInsn(
+            INVOKEVIRTUAL,
+            "android/print/PrintDocumentAdapter$LayoutResultCallback",
+            "onLayoutFinished",
+            "(Landroid/print/PrintDocumentInfo;Z)V",
+            false);
+        Label label26 = new Label();
+        methodVisitor.visitLabel(label26);
+        methodVisitor.visitLineNumber(485, label26);
+        Label label27 = new Label();
+        methodVisitor.visitJumpInsn(GOTO, label27);
+        methodVisitor.visitLabel(label17);
+        methodVisitor.visitLineNumber(486, label17);
+        methodVisitor.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
+        methodVisitor.visitVarInsn(ALOAD, 0);
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter$1",
+            "val$layoutResultCallback",
+            "Landroid/print/PrintDocumentAdapter$LayoutResultCallback;");
+        methodVisitor.visitInsn(ACONST_NULL);
+        methodVisitor.visitMethodInsn(
+            INVOKEVIRTUAL,
+            "android/print/PrintDocumentAdapter$LayoutResultCallback",
+            "onLayoutFailed",
+            "(Ljava/lang/CharSequence;)V",
+            false);
+        methodVisitor.visitLabel(label27);
+        methodVisitor.visitLineNumber(488, label27);
+        methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+        methodVisitor.visitVarInsn(ALOAD, 0);
+        methodVisitor.visitFieldInsn(
+            GETFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter$1",
+            "this$1",
+            "Landroidx/print/PrintHelper$PrintUriAdapter;");
+        methodVisitor.visitInsn(ACONST_NULL);
+        methodVisitor.visitFieldInsn(
+            PUTFIELD,
+            "androidx/print/PrintHelper$PrintUriAdapter",
+            "mLoadBitmap",
+            "Landroid/os/AsyncTask;");
+        Label label28 = new Label();
+        methodVisitor.visitLabel(label28);
+        methodVisitor.visitLineNumber(489, label28);
+        methodVisitor.visitInsn(RETURN);
+        Label label29 = new Label();
+        methodVisitor.visitLabel(label29);
+        methodVisitor.visitLocalVariable(
+            "rotation", "Landroid/graphics/Matrix;", null, label12, label6, 3);
+        methodVisitor.visitLocalVariable(
+            "mediaSize", "Landroid/print/PrintAttributes$MediaSize;", null, label8, label6, 2);
+        methodVisitor.visitLocalVariable(
+            "info", "Landroid/print/PrintDocumentInfo;", null, label22, label26, 2);
+        methodVisitor.visitLocalVariable("changed", "Z", null, label25, label26, 3);
+        methodVisitor.visitLocalVariable(
+            "this", "Landroidx/print/PrintHelper$PrintUriAdapter$1;", null, label4, label29, 0);
+        methodVisitor.visitLocalVariable(
+            "bitmap", "Landroid/graphics/Bitmap;", null, label4, label29, 1);
+        methodVisitor.visitMaxs(7, 5);
+        methodVisitor.visitEnd();
+      }
+      classWriter.visitEnd();
+
+      return classWriter.toByteArray();
+    }
+  }
+}