Forward context to Instruction#verifyTypes for better assertion messages
The context argument is still unused, but will be used in a follow up for reporting which method an error was found in.
Change-Id: Ic49d3e4c442da38f5d99ae00e3335bf9f2da4798
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java b/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java
index b2b6111..c2627bc 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/TypeChecker.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.ProgramMethod;
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.FieldInstruction;
@@ -26,7 +27,7 @@
* that it is dead.
*
* <p>Pruning code that does not verify is necessary in order to be able to assert that the types
- * are sound using {@link Instruction#verifyTypes(AppView, VerifyTypesHelper)}.
+ * are sound using {@link Instruction#verifyTypes(AppView, ProgramMethod, VerifyTypesHelper)}.
*/
public class TypeChecker {
diff --git a/src/main/java/com/android/tools/r8/ir/code/Assume.java b/src/main/java/com/android/tools/r8/ir/code/Assume.java
index 174b913..35126b3 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Assume.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Assume.java
@@ -249,8 +249,9 @@
}
@Override
- public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
- assert super.verifyTypes(appView, verifyTypesHelper);
+ public boolean verifyTypes(
+ AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
+ assert super.verifyTypes(appView, context, verifyTypesHelper);
TypeElement inType = src().getType();
assert inType.isReferenceType() : inType;
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
index bef0a26..588a39a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -103,9 +103,10 @@
return true;
}
- public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
+ public boolean verifyTypes(
+ AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
assert instructions.stream()
- .allMatch(instruction -> instruction.verifyTypes(appView, verifyTypesHelper));
+ .allMatch(instruction -> instruction.verifyTypes(appView, context, verifyTypesHelper));
return true;
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
index ed02fe2..f5c8046 100644
--- a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
+++ b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
@@ -216,8 +216,9 @@
}
@Override
- public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
- assert super.verifyTypes(appView, verifyTypesHelper);
+ public boolean verifyTypes(
+ AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
+ assert super.verifyTypes(appView, context, verifyTypesHelper);
TypeElement inType = object().getType();
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
index 00b983b..ddb8bf1 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
@@ -332,8 +332,9 @@
}
@Override
- public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
- assert super.verifyTypes(appView, verifyTypesHelper);
+ public boolean verifyTypes(
+ AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
+ assert super.verifyTypes(appView, context, verifyTypesHelper);
assert !isZero() || getOutType().isPrimitiveType() || getOutType().isNullType();
return true;
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstString.java b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
index 803223f..9c1a421 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstString.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
@@ -178,8 +178,9 @@
}
@Override
- public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
- assert super.verifyTypes(appView, verifyTypesHelper);
+ public boolean verifyTypes(
+ AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
+ assert super.verifyTypes(appView, context, verifyTypesHelper);
TypeElement expectedType = TypeElement.stringClassType(appView, definitelyNotNull());
assert getOutType().equals(expectedType);
return true;
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java b/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
index 9bb5f9a..7304858 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugLocalWrite.java
@@ -8,6 +8,7 @@
import com.android.tools.r8.cf.code.CfStore;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.analysis.VerifyTypesHelper;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.lightir.LirBuilder;
@@ -83,8 +84,9 @@
}
@Override
- public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
- super.verifyTypes(appView, verifyTypesHelper);
+ public boolean verifyTypes(
+ AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
+ super.verifyTypes(appView, context, verifyTypesHelper);
assert verifyTypesHelper.isAssignable(src().getType(), getOutType());
return true;
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
index 7f1e825..54b9ea8 100644
--- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java
+++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -662,7 +662,8 @@
assert validAssumeInstructions(appView);
assert new TypeChecker(appView.withLiveness(), verifyTypesHelper).check(this);
}
- assert blocks.stream().allMatch(block -> block.verifyTypes(appView, verifyTypesHelper));
+ assert blocks.stream()
+ .allMatch(block -> block.verifyTypes(appView, context(), verifyTypesHelper));
return true;
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
index f02c532..c47c0d5 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -1459,7 +1459,8 @@
"Implement type lattice evaluation for: " + getInstructionName());
}
- public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
+ public boolean verifyTypes(
+ AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
return true;
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java
index a0c67d5..9d49a0b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMethodWithReceiver.java
@@ -146,8 +146,9 @@
}
@Override
- public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
- assert super.verifyTypes(appView, verifyTypesHelper);
+ public boolean verifyTypes(
+ AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
+ assert super.verifyTypes(appView, context, verifyTypesHelper);
Value receiver = getReceiver();
TypeElement receiverType = receiver.getType();
diff --git a/src/main/java/com/android/tools/r8/ir/code/Move.java b/src/main/java/com/android/tools/r8/ir/code/Move.java
index 5dc04da..a1c5475 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Move.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Move.java
@@ -131,8 +131,9 @@
}
@Override
- public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
- super.verifyTypes(appView, verifyTypesHelper);
+ public boolean verifyTypes(
+ AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
+ super.verifyTypes(appView, context, verifyTypesHelper);
// DebugLocalWrite defines it's own verification of types but should be allowed to call super.
if (!this.isDebugLocalWrite()) {
assert src().getType().equals(getOutType());
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
index 0fa2583..56de63b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
@@ -227,7 +227,8 @@
}
@Override
- public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
+ public boolean verifyTypes(
+ AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
TypeElement type = getOutType();
assert type.isClassType();
assert type.asClassType().getClassType() == clazz || appView.options().testing.allowTypeErrors;
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java
index d47c812..d42756d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java
@@ -155,7 +155,8 @@
}
@Override
- public boolean verifyTypes(AppView<?> appView, VerifyTypesHelper verifyTypesHelper) {
+ public boolean verifyTypes(
+ AppView<?> appView, ProgramMethod context, VerifyTypesHelper verifyTypesHelper) {
TypeElement type = getOutType();
assert type.isClassType();
assert type.asClassType().getClassType() == clazz || appView.options().testing.allowTypeErrors;