Turn an assert into an error to handle bad struct members more gracefully.
diff --git a/libacc/acc.cpp b/libacc/acc.cpp
index d354466..b8ff29d 100644
--- a/libacc/acc.cpp
+++ b/libacc/acc.cpp
@@ -1548,21 +1548,27 @@
#endif
}
} else {
- assert (r0Tag == TY_DOUBLE);
- if (destTag == TY_INT) {
+ if (r0Tag == TY_DOUBLE) {
+ if (destTag == TY_INT) {
#ifdef ARM_USE_VFP
- o4(0xEEFD7BC7); // ftosizd s15, d7
- o4(0xEE170A90); // fmrs r0, s15
+ o4(0xEEFD7BC7); // ftosizd s15, d7
+ o4(0xEE170A90); // fmrs r0, s15
#else
- callRuntime((void*) runtime_double_to_int);
+ callRuntime((void*) runtime_double_to_int);
#endif
+ } else {
+ if(destTag == TY_FLOAT) {
+#ifdef ARM_USE_VFP
+ o4(0xEEF77BC7); // fcvtsd s15, d7
+#else
+ callRuntime((void*) runtime_double_to_float);
+#endif
+ } else {
+ incompatibleTypes(pR0Type, pType);
+ }
+ }
} else {
- assert(destTag == TY_FLOAT);
-#ifdef ARM_USE_VFP
- o4(0xEEF77BC7); // fcvtsd s15, d7
-#else
- callRuntime((void*) runtime_double_to_float);
-#endif
+ incompatibleTypes(pR0Type, pType);
}
}
}
@@ -2032,6 +2038,10 @@
return false;
}
+ void incompatibleTypes(Type* pR0Type, Type* pType) {
+ error("Incompatible types old: %d new: %d", pR0Type->tag, pType->tag);
+ }
+
size_t rotateRight(size_t n, size_t rotate) {
return (n >> rotate) | (n << (32 - rotate));
}