Merge "Primitive type mismatches are now hard failures in the verifier." into dalvik-dev
diff --git a/src/verifier/register_line.cc b/src/verifier/register_line.cc
index d6aca98..1d4366f 100644
--- a/src/verifier/register_line.cc
+++ b/src/verifier/register_line.cc
@@ -98,14 +98,18 @@
   // Verify the src register type against the check type refining the type of the register
   const RegType& src_type = GetRegisterType(vsrc);
   if (!check_type.IsAssignableFrom(src_type)) {
-    verifier_->Fail(VERIFY_ERROR_BAD_CLASS_SOFT) << "register v" << vsrc << " has type " << src_type
-                                                 << " but expected " << check_type;
+    // Hard fail if one of the types is primitive, since they are concretely known.
+    enum VerifyError fail_type = (!check_type.IsNonZeroReferenceTypes() ||
+                                  !src_type.IsNonZeroReferenceTypes()) ?
+                                  VERIFY_ERROR_BAD_CLASS_HARD : VERIFY_ERROR_BAD_CLASS_SOFT;
+    verifier_->Fail(fail_type) << "register v" << vsrc << " has type " << src_type
+                               << " but expected " << check_type;
     return false;
   }
   if (check_type.IsLowHalf()) {
     const RegType& src_type_h = GetRegisterType(vsrc + 1);
     if (!src_type.CheckWidePair(src_type_h)) {
-      verifier_->Fail(VERIFY_ERROR_BAD_CLASS_SOFT) << "wide register v" << vsrc << " has type "
+      verifier_->Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "wide register v" << vsrc << " has type "
                                                    << src_type << "/" << src_type_h;
       return false;
     }