Merge: Subtyping test with perfect hashing in the Nit vm
[nit.git] / c_src / array.sep.1.c
index 25048d6..3b47bf6 100644 (file)
@@ -54,6 +54,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var2 /* : Int */;
 long var_i /* var i: Int */;
@@ -63,14 +64,15 @@ short int var4 /* : Bool */;
 short int var6 /* : Bool */;
 int cltype7;
 int idtype8;
-short int var9 /* : Bool */;
-val* var10 /* : nullable Object */;
-short int var11 /* : Bool */;
+const char* var_class_name9;
+short int var10 /* : Bool */;
+val* var11 /* : nullable Object */;
 short int var12 /* : Bool */;
-long var13 /* : Int */;
+short int var13 /* : Bool */;
 long var14 /* : Int */;
-long var16 /* : Int */;
-short int var17 /* : Bool */;
+long var15 /* : Int */;
+long var17 /* : Int */;
+short int var18 /* : Bool */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa Collection#0 */
 /* <p0:nullable Object> isa Collection#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__Collection_FT0];
@@ -87,8 +89,10 @@ var1 = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 28);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Collection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 28);
+show_backtrace(1);
 }
 var_item = p0;
 var2 = 0;
@@ -101,40 +105,42 @@ for(;;) {
 /* <var_l:Int> isa OTHER */
 var6 = 1; /* easy <var_l:Int> isa OTHER*/
 if (!var6) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
+var_class_name9 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name9);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
 }
-var9 = var_i < var_l;
-var4 = var9;
+var10 = var_i < var_l;
+var4 = var10;
 goto RET_LABEL5;
 RET_LABEL5:(void)0;
 }
 if (!var4) break;
-var10 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
-if (var10 == NULL) {
-var11 = (var_item == NULL);
+var11 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
+if (var11 == NULL) {
+var12 = (var_item == NULL);
 } else {
-var11 = ((short int (*)(val*, val*))(var10->class->vft[COLOR_kernel__Object___61d_61d]))(var10, var_item) /* == on <var10:nullable Object>*/;
+var12 = ((short int (*)(val*, val*))(var11->class->vft[COLOR_kernel__Object___61d_61d]))(var11, var_item) /* == on <var11:nullable Object>*/;
 }
-if (var11){
-var12 = 1;
-var = var12;
+if (var12){
+var13 = 1;
+var = var13;
 goto RET_LABEL;
 } else {
 }
-var13 = 1;
-{ /* Inline kernel#Int#+ (var_i,var13) */
-var16 = var_i + var13;
-var14 = var16;
-goto RET_LABEL15;
-RET_LABEL15:(void)0;
+var14 = 1;
+{ /* Inline kernel#Int#+ (var_i,var14) */
+var17 = var_i + var14;
+var15 = var17;
+goto RET_LABEL16;
+RET_LABEL16:(void)0;
 }
-var_i = var14;
+var_i = var15;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
-var17 = 0;
-var = var17;
+var18 = 0;
+var = var18;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -156,6 +162,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var2 /* : Int */;
 long var_i /* var i: Int */;
@@ -165,14 +172,15 @@ short int var4 /* : Bool */;
 short int var6 /* : Bool */;
 int cltype7;
 int idtype8;
-short int var9 /* : Bool */;
-val* var10 /* : nullable Object */;
-short int var11 /* : Bool */;
+const char* var_class_name9;
+short int var10 /* : Bool */;
+val* var11 /* : nullable Object */;
 short int var12 /* : Bool */;
-long var13 /* : Int */;
+short int var13 /* : Bool */;
 long var14 /* : Int */;
-long var16 /* : Int */;
-short int var17 /* : Bool */;
+long var15 /* : Int */;
+long var17 /* : Int */;
+short int var18 /* : Bool */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa Collection#0 */
 /* <p0:nullable Object> isa Collection#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__Collection_FT0];
@@ -189,8 +197,10 @@ var1 = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 39);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Collection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 39);
+show_backtrace(1);
 }
 var_item = p0;
 var2 = 0;
@@ -203,40 +213,42 @@ for(;;) {
 /* <var_l:Int> isa OTHER */
 var6 = 1; /* easy <var_l:Int> isa OTHER*/
 if (!var6) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
+var_class_name9 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name9);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
 }
-var9 = var_i < var_l;
-var4 = var9;
+var10 = var_i < var_l;
+var4 = var10;
 goto RET_LABEL5;
 RET_LABEL5:(void)0;
 }
 if (!var4) break;
-var10 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
-if (var10 == NULL) {
-var11 = (var_item != NULL);
+var11 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
+if (var11 == NULL) {
+var12 = (var_item != NULL);
 } else {
-var11 = ((short int (*)(val*, val*))(var10->class->vft[COLOR_kernel__Object___33d_61d]))(var10, var_item) /* != on <var10:nullable Object>*/;
+var12 = ((short int (*)(val*, val*))(var11->class->vft[COLOR_kernel__Object___33d_61d]))(var11, var_item) /* != on <var11:nullable Object>*/;
 }
-if (var11){
-var12 = 0;
-var = var12;
+if (var12){
+var13 = 0;
+var = var13;
 goto RET_LABEL;
 } else {
 }
-var13 = 1;
-{ /* Inline kernel#Int#+ (var_i,var13) */
-var16 = var_i + var13;
-var14 = var16;
-goto RET_LABEL15;
-RET_LABEL15:(void)0;
+var14 = 1;
+{ /* Inline kernel#Int#+ (var_i,var14) */
+var17 = var_i + var14;
+var15 = var17;
+goto RET_LABEL16;
+RET_LABEL16:(void)0;
 }
-var_i = var14;
+var_i = var15;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
-var17 = 1;
-var = var17;
+var18 = 1;
+var = var18;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -258,6 +270,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var2 /* : Int */;
 long var_res /* var res: Int */;
@@ -269,15 +282,16 @@ short int var5 /* : Bool */;
 short int var7 /* : Bool */;
 int cltype8;
 int idtype9;
-short int var10 /* : Bool */;
-val* var11 /* : nullable Object */;
-short int var12 /* : Bool */;
-long var13 /* : Int */;
+const char* var_class_name10;
+short int var11 /* : Bool */;
+val* var12 /* : nullable Object */;
+short int var13 /* : Bool */;
 long var14 /* : Int */;
-long var16 /* : Int */;
+long var15 /* : Int */;
 long var17 /* : Int */;
 long var18 /* : Int */;
-long var20 /* : Int */;
+long var19 /* : Int */;
+long var21 /* : Int */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa Collection#0 */
 /* <p0:nullable Object> isa Collection#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__Collection_FT0];
@@ -294,8 +308,10 @@ var1 = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 50);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Collection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 50);
+show_backtrace(1);
 }
 var_item = p0;
 var2 = 0;
@@ -310,40 +326,42 @@ for(;;) {
 /* <var_l:Int> isa OTHER */
 var7 = 1; /* easy <var_l:Int> isa OTHER*/
 if (!var7) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
+var_class_name10 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name10);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
 }
-var10 = var_i < var_l;
-var5 = var10;
+var11 = var_i < var_l;
+var5 = var11;
 goto RET_LABEL6;
 RET_LABEL6:(void)0;
 }
 if (!var5) break;
-var11 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
-if (var11 == NULL) {
-var12 = (var_item == NULL);
+var12 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
+if (var12 == NULL) {
+var13 = (var_item == NULL);
 } else {
-var12 = ((short int (*)(val*, val*))(var11->class->vft[COLOR_kernel__Object___61d_61d]))(var11, var_item) /* == on <var11:nullable Object>*/;
+var13 = ((short int (*)(val*, val*))(var12->class->vft[COLOR_kernel__Object___61d_61d]))(var12, var_item) /* == on <var12:nullable Object>*/;
 }
-if (var12){
-var13 = 1;
-{ /* Inline kernel#Int#+ (var_res,var13) */
-var16 = var_res + var13;
-var14 = var16;
-goto RET_LABEL15;
-RET_LABEL15:(void)0;
+if (var13){
+var14 = 1;
+{ /* Inline kernel#Int#+ (var_res,var14) */
+var17 = var_res + var14;
+var15 = var17;
+goto RET_LABEL16;
+RET_LABEL16:(void)0;
 }
-var_res = var14;
+var_res = var15;
 } else {
 }
-var17 = 1;
-{ /* Inline kernel#Int#+ (var_i,var17) */
-var20 = var_i + var17;
-var18 = var20;
-goto RET_LABEL19;
-RET_LABEL19:(void)0;
+var18 = 1;
+{ /* Inline kernel#Int#+ (var_i,var18) */
+var21 = var_i + var18;
+var19 = var21;
+goto RET_LABEL20;
+RET_LABEL20:(void)0;
 }
-var_i = var18;
+var_i = var19;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
@@ -369,6 +387,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var2 /* : Int */;
 long var3 /* : Int */;
@@ -388,8 +407,10 @@ var1 = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 62);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "SequenceRead#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 62);
+show_backtrace(1);
 }
 var_item = p0;
 var2 = 0;
@@ -416,6 +437,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var2 /* : Int */;
 long var3 /* : Int */;
@@ -438,8 +460,10 @@ var1 = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 64);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "AbstractArrayRead#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 64);
+show_backtrace(1);
 }
 var_item = p0;
 var2 = ((long (*)(val*))(self->class->vft[COLOR_abstract_collection__Collection__length]))(self) /* length on <self:AbstractArrayRead[nullable Object]>*/;
@@ -473,6 +497,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var_pos /* var pos: Int */;
 long var_i /* var i: Int */;
@@ -482,15 +507,16 @@ short int var3 /* : Bool */;
 short int var5 /* : Bool */;
 int cltype6;
 int idtype7;
-short int var8 /* : Bool */;
-val* var9 /* : nullable Object */;
-short int var10 /* : Bool */;
-long var11 /* : Int */;
+const char* var_class_name8;
+short int var9 /* : Bool */;
+val* var10 /* : nullable Object */;
+short int var11 /* : Bool */;
 long var12 /* : Int */;
-long var14 /* : Int */;
+long var13 /* : Int */;
 long var15 /* : Int */;
 long var16 /* : Int */;
-long var18 /* : Int */;
+long var17 /* : Int */;
+long var19 /* : Int */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa AbstractArrayRead#0 */
 /* <p0:nullable Object> isa AbstractArrayRead#0 */
 type_struct = self->type->resolution_table->types[COLOR_array__AbstractArrayRead_FT0];
@@ -507,8 +533,10 @@ var1 = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 68);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "AbstractArrayRead#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 68);
+show_backtrace(1);
 }
 var_item = p0;
 var_pos = p1;
@@ -521,45 +549,47 @@ for(;;) {
 /* <var_len:Int> isa OTHER */
 var5 = 1; /* easy <var_len:Int> isa OTHER*/
 if (!var5) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
+var_class_name8 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name8);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
 }
-var8 = var_i < var_len;
-var3 = var8;
+var9 = var_i < var_len;
+var3 = var9;
 goto RET_LABEL4;
 RET_LABEL4:(void)0;
 }
 if (!var3) break;
-var9 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
-if (var9 == NULL) {
-var10 = (var_item == NULL);
+var10 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
+if (var10 == NULL) {
+var11 = (var_item == NULL);
 } else {
-var10 = ((short int (*)(val*, val*))(var9->class->vft[COLOR_kernel__Object___61d_61d]))(var9, var_item) /* == on <var9:nullable Object>*/;
+var11 = ((short int (*)(val*, val*))(var10->class->vft[COLOR_kernel__Object___61d_61d]))(var10, var_item) /* == on <var10:nullable Object>*/;
 }
-if (var10){
+if (var11){
 var = var_i;
 goto RET_LABEL;
 } else {
 }
-var11 = 1;
-{ /* Inline kernel#Int#+ (var_i,var11) */
-var14 = var_i + var11;
-var12 = var14;
-goto RET_LABEL13;
-RET_LABEL13:(void)0;
+var12 = 1;
+{ /* Inline kernel#Int#+ (var_i,var12) */
+var15 = var_i + var12;
+var13 = var15;
+goto RET_LABEL14;
+RET_LABEL14:(void)0;
 }
-var_i = var12;
+var_i = var13;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
-var15 = 1;
-{ /* Inline kernel#Int#unary - (var15) */
-var18 = -var15;
-var16 = var18;
-goto RET_LABEL17;
-RET_LABEL17:(void)0;
+var16 = 1;
+{ /* Inline kernel#Int#unary - (var16) */
+var19 = -var16;
+var17 = var19;
+goto RET_LABEL18;
+RET_LABEL18:(void)0;
 }
-var = var16;
+var = var17;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -581,6 +611,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var_pos /* var pos: Int */;
 long var_i /* var i: Int */;
@@ -589,15 +620,16 @@ short int var3 /* : Bool */;
 short int var5 /* : Bool */;
 int cltype6;
 int idtype7;
-short int var8 /* : Bool */;
-val* var9 /* : nullable Object */;
-short int var10 /* : Bool */;
-long var11 /* : Int */;
+const char* var_class_name8;
+short int var9 /* : Bool */;
+val* var10 /* : nullable Object */;
+short int var11 /* : Bool */;
 long var12 /* : Int */;
-long var14 /* : Int */;
+long var13 /* : Int */;
 long var15 /* : Int */;
 long var16 /* : Int */;
-long var18 /* : Int */;
+long var17 /* : Int */;
+long var19 /* : Int */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa AbstractArrayRead#0 */
 /* <p0:nullable Object> isa AbstractArrayRead#0 */
 type_struct = self->type->resolution_table->types[COLOR_array__AbstractArrayRead_FT0];
@@ -614,8 +646,10 @@ var1 = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 83);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "AbstractArrayRead#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 83);
+show_backtrace(1);
 }
 var_item = p0;
 var_pos = p1;
@@ -627,45 +661,47 @@ var2 = 0;
 /* <var2:Int> isa OTHER */
 var5 = 1; /* easy <var2:Int> isa OTHER*/
 if (!var5) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name8 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name8);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var8 = var_i >= var2;
-var3 = var8;
+var9 = var_i >= var2;
+var3 = var9;
 goto RET_LABEL4;
 RET_LABEL4:(void)0;
 }
 if (!var3) break;
-var9 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
-if (var9 == NULL) {
-var10 = (var_item == NULL);
+var10 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
+if (var10 == NULL) {
+var11 = (var_item == NULL);
 } else {
-var10 = ((short int (*)(val*, val*))(var9->class->vft[COLOR_kernel__Object___61d_61d]))(var9, var_item) /* == on <var9:nullable Object>*/;
+var11 = ((short int (*)(val*, val*))(var10->class->vft[COLOR_kernel__Object___61d_61d]))(var10, var_item) /* == on <var10:nullable Object>*/;
 }
-if (var10){
+if (var11){
 var = var_i;
 goto RET_LABEL;
 } else {
-var11 = 1;
-{ /* Inline kernel#Int#- (var_i,var11) */
-var14 = var_i - var11;
-var12 = var14;
-goto RET_LABEL13;
-RET_LABEL13:(void)0;
+var12 = 1;
+{ /* Inline kernel#Int#- (var_i,var12) */
+var15 = var_i - var12;
+var13 = var15;
+goto RET_LABEL14;
+RET_LABEL14:(void)0;
 }
-var_i = var12;
+var_i = var13;
 }
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
-var15 = 1;
-{ /* Inline kernel#Int#unary - (var15) */
-var18 = -var15;
-var16 = var18;
-goto RET_LABEL17;
-RET_LABEL17:(void)0;
+var16 = 1;
+{ /* Inline kernel#Int#unary - (var16) */
+var19 = -var16;
+var17 = var19;
+goto RET_LABEL18;
+RET_LABEL18:(void)0;
 }
-var = var16;
+var = var17;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -691,6 +727,7 @@ short int var4 /* : Bool */;
 short int var6 /* : Bool */;
 int cltype;
 int idtype;
+const char* var_class_name;
 short int var7 /* : Bool */;
 long var8 /* : Int */;
 long var9 /* : Int */;
@@ -700,7 +737,6 @@ var1 = self->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <se
 var_cmp = var1;
 var2 = NEW_array__Array(self->type->resolution_table->types[COLOR_array__Arrayarray__AbstractArrayRead_FT0]);
 ((void (*)(val*, long))(var2->class->vft[COLOR_array__Array__with_capacity]))(var2, var_cmp) /* with_capacity on <var2:Array[nullable Object]>*/;
-CHECK_NEW_array__Array(var2);
 var_result = var2;
 for(;;) {
 var3 = 0;
@@ -709,8 +745,10 @@ var3 = 0;
 /* <var3:Int> isa OTHER */
 var6 = 1; /* easy <var3:Int> isa OTHER*/
 if (!var6) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 259);
-exit(1);
+var_class_name = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 267);
+show_backtrace(1);
 }
 var7 = var_cmp > var3;
 var4 = var7;
@@ -751,6 +789,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 long var_start /* var start: Int */;
 long var_len /* var len: Int */;
 val* var_dest /* var dest: AbstractArray[nullable Object] */;
@@ -761,15 +800,16 @@ short int var2 /* : Bool */;
 short int var4 /* : Bool */;
 int cltype5;
 int idtype6;
-short int var7 /* : Bool */;
-long var8 /* : Int */;
+const char* var_class_name7;
+short int var8 /* : Bool */;
 long var9 /* : Int */;
-long var11 /* : Int */;
+long var10 /* : Int */;
 long var12 /* : Int */;
-long var14 /* : Int */;
+long var13 /* : Int */;
 long var15 /* : Int */;
-long var17 /* : Int */;
-val* var18 /* : nullable Object */;
+long var16 /* : Int */;
+long var18 /* : Int */;
+val* var19 /* : nullable Object */;
 /* Covariant cast for argument 2 (dest) <p2:AbstractArray[nullable Object]> isa AbstractArray[AbstractArrayRead#0] */
 /* <p2:AbstractArray[nullable Object]> isa AbstractArray[AbstractArrayRead#0] */
 type_struct = self->type->resolution_table->types[COLOR_array__AbstractArrayarray__AbstractArrayRead_FT0];
@@ -781,8 +821,10 @@ var = 0;
 var = p2->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 112);
-exit(1);
+var_class_name = p2 == NULL ? "null" : p2->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "AbstractArray[AbstractArrayRead#0]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 112);
+show_backtrace(1);
 }
 var_start = p0;
 var_len = p1;
@@ -796,37 +838,39 @@ var1 = 0;
 /* <var1:Int> isa OTHER */
 var4 = 1; /* easy <var1:Int> isa OTHER*/
 if (!var4) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 259);
-exit(1);
+var_class_name7 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name7);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 267);
+show_backtrace(1);
 }
-var7 = var_i > var1;
-var2 = var7;
+var8 = var_i > var1;
+var2 = var8;
 goto RET_LABEL3;
 RET_LABEL3:(void)0;
 }
 if (!var2) break;
-var8 = 1;
-{ /* Inline kernel#Int#- (var_i,var8) */
-var11 = var_i - var8;
-var9 = var11;
-goto RET_LABEL10;
-RET_LABEL10:(void)0;
+var9 = 1;
+{ /* Inline kernel#Int#- (var_i,var9) */
+var12 = var_i - var9;
+var10 = var12;
+goto RET_LABEL11;
+RET_LABEL11:(void)0;
 }
-var_i = var9;
+var_i = var10;
 { /* Inline kernel#Int#+ (var_new_start,var_i) */
-var14 = var_new_start + var_i;
-var12 = var14;
-goto RET_LABEL13;
-RET_LABEL13:(void)0;
+var15 = var_new_start + var_i;
+var13 = var15;
+goto RET_LABEL14;
+RET_LABEL14:(void)0;
 }
 { /* Inline kernel#Int#+ (var_start,var_i) */
-var17 = var_start + var_i;
-var15 = var17;
-goto RET_LABEL16;
-RET_LABEL16:(void)0;
+var18 = var_start + var_i;
+var16 = var18;
+goto RET_LABEL17;
+RET_LABEL17:(void)0;
 }
-var18 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var15) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
-((void (*)(val*, long, val*))(var_dest->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(var_dest, var12, var18) /* []= on <var_dest:AbstractArray[nullable Object]>*/;
+var19 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var16) /* [] on <self:AbstractArrayRead[nullable Object]>*/;
+((void (*)(val*, long, val*))(var_dest->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(var_dest, var13, var19) /* []= on <var_dest:AbstractArray[nullable Object]>*/;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
@@ -847,6 +891,7 @@ short int var2 /* : Bool */;
 short int var4 /* : Bool */;
 int cltype;
 int idtype;
+const char* var_class_name;
 short int var5 /* : Bool */;
 val* var6 /* : nullable Object */;
 val* var_e /* var e: nullable Object */;
@@ -865,8 +910,10 @@ for(;;) {
 /* <var_l:Int> isa OTHER */
 var4 = 1; /* easy <var_l:Int> isa OTHER*/
 if (!var4) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
+var_class_name = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
 }
 var5 = var_i < var_l;
 var2 = var5;
@@ -884,8 +931,9 @@ var8 = 1; /* arg is null and recv is not */
 }
 if (var8){
 if (var_e == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Reciever is null", "lib/standard/collection/array.nit", 134);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Receiver is null");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 134);
+show_backtrace(1);
 } else {
 ((void (*)(val*))(var_e->class->vft[COLOR_kernel__Object__output]))(var_e) /* output on <var_e:nullable Object>*/;
 }
@@ -915,7 +963,6 @@ val* var /* : ArrayIterator[nullable Object] */;
 val* var1 /* : ArrayIterator[nullable Object] */;
 var1 = NEW_array__ArrayIterator(self->type->resolution_table->types[COLOR_array__ArrayIteratorarray__AbstractArrayRead_FT0]);
 ((void (*)(val*, val*))(var1->class->vft[COLOR_array__ArrayIterator__init]))(var1, self) /* init on <var1:ArrayIterator[nullable Object]>*/;
-CHECK_NEW_array__ArrayIterator(var1);
 var = var1;
 goto RET_LABEL;
 RET_LABEL:;
@@ -941,8 +988,11 @@ RET_LABEL:;
 }
 /* method array#AbstractArray#enlarge for (self: AbstractArray[nullable Object], Int) */
 void array__AbstractArray__enlarge(val* self, long p0) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Deferred method called", "lib/standard/collection/array.nit", 147);
-exit(1);
+const char* var_class_name;
+var_class_name = self == NULL ? "null" : self->type->name;
+fprintf(stderr, "Runtime error: Abstract method `%s` called on `%s`", "enlarge", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 147);
+show_backtrace(1);
 RET_LABEL:;
 }
 /* method array#AbstractArray#enlarge for (self: Object, Int) */
@@ -957,6 +1007,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa Sequence#0 */
 /* <p0:nullable Object> isa Sequence#0 */
@@ -974,8 +1025,10 @@ var = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 152);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Sequence#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 152);
+show_backtrace(1);
 }
 var_item = p0;
 ((void (*)(val*, val*))(self->class->vft[COLOR_abstract_collection__SimpleCollection__add]))(self, var_item) /* add on <self:AbstractArray[nullable Object]>*/;
@@ -1001,8 +1054,9 @@ long var8 /* : Int */;
 var1 = ((short int (*)(val*))(self->class->vft[COLOR_abstract_collection__Collection__is_empty]))(self) /* is_empty on <self:AbstractArray[nullable Object]>*/;
 var2 = !var1;
 if (!var2) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Assert \'not_empty\' failed", "lib/standard/collection/array.nit", 156);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Assert \'not_empty\' failed");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 156);
+show_backtrace(1);
 }
 var3 = ((val* (*)(val*))(self->class->vft[COLOR_abstract_collection__SequenceRead__last]))(self) /* last on <self:AbstractArray[nullable Object]>*/;
 var_r = var3;
@@ -1045,6 +1099,7 @@ short int var6 /* : Bool */;
 short int var8 /* : Bool */;
 int cltype;
 int idtype;
+const char* var_class_name;
 short int var9 /* : Bool */;
 long var10 /* : Int */;
 long var11 /* : Int */;
@@ -1059,8 +1114,9 @@ long var22 /* : Int */;
 var1 = ((short int (*)(val*))(self->class->vft[COLOR_abstract_collection__Collection__is_empty]))(self) /* is_empty on <self:AbstractArray[nullable Object]>*/;
 var2 = !var1;
 if (!var2) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Assert \'not_empty\' failed", "lib/standard/collection/array.nit", 164);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Assert \'not_empty\' failed");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 164);
+show_backtrace(1);
 }
 var3 = ((val* (*)(val*))(self->class->vft[COLOR_abstract_collection__Collection__first]))(self) /* first on <self:AbstractArray[nullable Object]>*/;
 var_r = var3;
@@ -1074,8 +1130,10 @@ for(;;) {
 /* <var_l:Int> isa OTHER */
 var8 = 1; /* easy <var_l:Int> isa OTHER*/
 if (!var8) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
+var_class_name = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
 }
 var9 = var_i < var_l;
 var6 = var9;
@@ -1132,6 +1190,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var1 /* : Int */;
 long var2 /* : Int */;
@@ -1143,15 +1202,16 @@ short int var7 /* : Bool */;
 short int var9 /* : Bool */;
 int cltype10;
 int idtype11;
-short int var12 /* : Bool */;
-long var13 /* : Int */;
+const char* var_class_name12;
+short int var13 /* : Bool */;
 long var14 /* : Int */;
-long var16 /* : Int */;
-val* var17 /* : nullable Object */;
-long var18 /* : Int */;
+long var15 /* : Int */;
+long var17 /* : Int */;
+val* var18 /* : nullable Object */;
 long var19 /* : Int */;
-long var21 /* : Int */;
+long var20 /* : Int */;
 long var22 /* : Int */;
+long var23 /* : Int */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa Sequence#0 */
 /* <p0:nullable Object> isa Sequence#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__Sequence_FT0];
@@ -1168,8 +1228,10 @@ var = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 176);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Sequence#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 176);
+show_backtrace(1);
 }
 var_item = p0;
 var1 = ((long (*)(val*))(self->class->vft[COLOR_abstract_collection__Collection__length]))(self) /* length on <self:AbstractArray[nullable Object]>*/;
@@ -1188,37 +1250,39 @@ var6 = 0;
 /* <var6:Int> isa OTHER */
 var9 = 1; /* easy <var6:Int> isa OTHER*/
 if (!var9) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 259);
-exit(1);
+var_class_name12 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name12);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 267);
+show_backtrace(1);
 }
-var12 = var_i > var6;
-var7 = var12;
+var13 = var_i > var6;
+var7 = var13;
 goto RET_LABEL8;
 RET_LABEL8:(void)0;
 }
 if (!var7) break;
-var13 = 1;
-{ /* Inline kernel#Int#+ (var_i,var13) */
-var16 = var_i + var13;
-var14 = var16;
-goto RET_LABEL15;
-RET_LABEL15:(void)0;
-}
-var17 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArray[nullable Object]>*/;
-((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var14, var17) /* []= on <self:AbstractArray[nullable Object]>*/;
-var18 = 1;
-{ /* Inline kernel#Int#- (var_i,var18) */
-var21 = var_i - var18;
-var19 = var21;
-goto RET_LABEL20;
-RET_LABEL20:(void)0;
+var14 = 1;
+{ /* Inline kernel#Int#+ (var_i,var14) */
+var17 = var_i + var14;
+var15 = var17;
+goto RET_LABEL16;
+RET_LABEL16:(void)0;
 }
-var_i = var19;
+var18 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:AbstractArray[nullable Object]>*/;
+((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var15, var18) /* []= on <self:AbstractArray[nullable Object]>*/;
+var19 = 1;
+{ /* Inline kernel#Int#- (var_i,var19) */
+var22 = var_i - var19;
+var20 = var22;
+goto RET_LABEL21;
+RET_LABEL21:(void)0;
+}
+var_i = var20;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
-var22 = 0;
-((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var22, var_item) /* []= on <self:AbstractArray[nullable Object]>*/;
+var23 = 0;
+((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var23, var_item) /* []= on <self:AbstractArray[nullable Object]>*/;
 RET_LABEL:;
 }
 /* method array#AbstractArray#unshift for (self: Object, nullable Object) */
@@ -1233,6 +1297,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var_pos /* var pos: Int */;
 long var1 /* : Int */;
@@ -1261,8 +1326,10 @@ var = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 186);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "AbstractArray#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 186);
+show_backtrace(1);
 }
 var_item = p0;
 var_pos = p1;
@@ -1305,6 +1372,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var1 /* : Int */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa SimpleCollection#0 */
@@ -1323,8 +1391,10 @@ var = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 198);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "SimpleCollection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 198);
+show_backtrace(1);
 }
 var_item = p0;
 var1 = ((long (*)(val*))(self->class->vft[COLOR_abstract_collection__Collection__length]))(self) /* length on <self:AbstractArray[nullable Object]>*/;
@@ -1355,6 +1425,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var1 /* : Int */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa RemovableCollection#0 */
@@ -1373,8 +1444,10 @@ var = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 202);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "RemovableCollection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 202);
+show_backtrace(1);
 }
 var_item = p0;
 var1 = ((long (*)(val*, val*))(self->class->vft[COLOR_abstract_collection__SequenceRead__index_of]))(self, var_item) /* index_of on <self:AbstractArray[nullable Object]>*/;
@@ -1393,6 +1466,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var1 /* : Int */;
 long var_i /* var i: Int */;
@@ -1401,8 +1475,9 @@ short int var3 /* : Bool */;
 short int var5 /* : Bool */;
 int cltype6;
 int idtype7;
-short int var8 /* : Bool */;
-long var9 /* : Int */;
+const char* var_class_name8;
+short int var9 /* : Bool */;
+long var10 /* : Int */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa RemovableCollection#0 */
 /* <p0:nullable Object> isa RemovableCollection#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__RemovableCollection_FT0];
@@ -1419,8 +1494,10 @@ var = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 204);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "RemovableCollection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 204);
+show_backtrace(1);
 }
 var_item = p0;
 var1 = ((long (*)(val*, val*))(self->class->vft[COLOR_abstract_collection__SequenceRead__index_of]))(self, var_item) /* index_of on <self:AbstractArray[nullable Object]>*/;
@@ -1432,18 +1509,20 @@ var2 = 0;
 /* <var2:Int> isa OTHER */
 var5 = 1; /* easy <var2:Int> isa OTHER*/
 if (!var5) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name8 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name8);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var8 = var_i >= var2;
-var3 = var8;
+var9 = var_i >= var2;
+var3 = var9;
 goto RET_LABEL4;
 RET_LABEL4:(void)0;
 }
 if (!var3) break;
 ((void (*)(val*, long))(self->class->vft[COLOR_abstract_collection__Sequence__remove_at]))(self, var_i) /* remove_at on <self:AbstractArray[nullable Object]>*/;
-var9 = ((long (*)(val*, val*, long))(self->class->vft[COLOR_array__AbstractArrayRead__index_of_from]))(self, var_item, var_i) /* index_of_from on <self:AbstractArray[nullable Object]>*/;
-var_i = var9;
+var10 = ((long (*)(val*, val*, long))(self->class->vft[COLOR_array__AbstractArrayRead__index_of_from]))(self, var_item, var_i) /* index_of_from on <self:AbstractArray[nullable Object]>*/;
+var_i = var10;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
@@ -1465,32 +1544,35 @@ short int var3 /* : Bool */;
 short int var5 /* : Bool */;
 int cltype;
 int idtype;
+const char* var_class_name;
 short int var6 /* : Bool */;
 short int var_ /* var : Bool */;
 short int var7 /* : Bool */;
 short int var9 /* : Bool */;
 int cltype10;
 int idtype11;
-short int var12 /* : Bool */;
-long var13 /* : Int */;
+const char* var_class_name12;
+short int var13 /* : Bool */;
 long var14 /* : Int */;
-long var16 /* : Int */;
+long var15 /* : Int */;
+long var17 /* : Int */;
 long var_j /* var j: Int */;
-short int var17 /* : Bool */;
-short int var19 /* : Bool */;
-int cltype20;
-int idtype21;
-short int var22 /* : Bool */;
-long var23 /* : Int */;
-long var24 /* : Int */;
+short int var18 /* : Bool */;
+short int var20 /* : Bool */;
+int cltype21;
+int idtype22;
+const char* var_class_name23;
+short int var24 /* : Bool */;
+long var25 /* : Int */;
 long var26 /* : Int */;
-val* var27 /* : nullable Object */;
 long var28 /* : Int */;
-long var29 /* : Int */;
+val* var29 /* : nullable Object */;
+long var30 /* : Int */;
 long var31 /* : Int */;
-long var32 /* : Int */;
 long var33 /* : Int */;
+long var34 /* : Int */;
 long var35 /* : Int */;
+long var37 /* : Int */;
 var_i = p0;
 var = ((long (*)(val*))(self->class->vft[COLOR_abstract_collection__Collection__length]))(self) /* length on <self:AbstractArray[nullable Object]>*/;
 var_l = var;
@@ -1500,8 +1582,10 @@ var2 = 0;
 /* <var2:Int> isa OTHER */
 var5 = 1; /* easy <var2:Int> isa OTHER*/
 if (!var5) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
 var6 = var_i >= var2;
 var3 = var6;
@@ -1515,11 +1599,13 @@ if (var3){
 /* <var_l:Int> isa OTHER */
 var9 = 1; /* easy <var_l:Int> isa OTHER*/
 if (!var9) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
+var_class_name12 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name12);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
 }
-var12 = var_i < var_l;
-var7 = var12;
+var13 = var_i < var_l;
+var7 = var13;
 goto RET_LABEL8;
 RET_LABEL8:(void)0;
 }
@@ -1528,57 +1614,59 @@ var1 = var7;
 var1 = var_;
 }
 if (var1){
-var13 = 1;
-{ /* Inline kernel#Int#+ (var_i,var13) */
-var16 = var_i + var13;
-var14 = var16;
-goto RET_LABEL15;
-RET_LABEL15:(void)0;
+var14 = 1;
+{ /* Inline kernel#Int#+ (var_i,var14) */
+var17 = var_i + var14;
+var15 = var17;
+goto RET_LABEL16;
+RET_LABEL16:(void)0;
 }
-var_j = var14;
+var_j = var15;
 for(;;) {
 { /* Inline kernel#Int#< (var_j,var_l) */
 /* Covariant cast for argument 0 (i) <var_l:Int> isa OTHER */
 /* <var_l:Int> isa OTHER */
-var19 = 1; /* easy <var_l:Int> isa OTHER*/
-if (!var19) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
-}
-var22 = var_j < var_l;
-var17 = var22;
-goto RET_LABEL18;
-RET_LABEL18:(void)0;
+var20 = 1; /* easy <var_l:Int> isa OTHER*/
+if (!var20) {
+var_class_name23 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name23);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
+}
+var24 = var_j < var_l;
+var18 = var24;
+goto RET_LABEL19;
+RET_LABEL19:(void)0;
 }
-if (!var17) break;
-var23 = 1;
-{ /* Inline kernel#Int#- (var_j,var23) */
-var26 = var_j - var23;
-var24 = var26;
-goto RET_LABEL25;
-RET_LABEL25:(void)0;
-}
-var27 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_j) /* [] on <self:AbstractArray[nullable Object]>*/;
-((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var24, var27) /* []= on <self:AbstractArray[nullable Object]>*/;
-var28 = 1;
-{ /* Inline kernel#Int#+ (var_j,var28) */
-var31 = var_j + var28;
-var29 = var31;
-goto RET_LABEL30;
-RET_LABEL30:(void)0;
-}
-var_j = var29;
+if (!var18) break;
+var25 = 1;
+{ /* Inline kernel#Int#- (var_j,var25) */
+var28 = var_j - var25;
+var26 = var28;
+goto RET_LABEL27;
+RET_LABEL27:(void)0;
+}
+var29 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_j) /* [] on <self:AbstractArray[nullable Object]>*/;
+((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var26, var29) /* []= on <self:AbstractArray[nullable Object]>*/;
+var30 = 1;
+{ /* Inline kernel#Int#+ (var_j,var30) */
+var33 = var_j + var30;
+var31 = var33;
+goto RET_LABEL32;
+RET_LABEL32:(void)0;
+}
+var_j = var31;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
-var32 = 1;
-{ /* Inline kernel#Int#- (var_l,var32) */
-var35 = var_l - var32;
-var33 = var35;
-goto RET_LABEL34;
-RET_LABEL34:(void)0;
-}
-self->attrs[COLOR_array__AbstractArrayRead___length].l = var33; /* _length on <self:AbstractArray[nullable Object]> */
+var34 = 1;
+{ /* Inline kernel#Int#- (var_l,var34) */
+var37 = var_l - var34;
+var35 = var37;
+goto RET_LABEL36;
+RET_LABEL36:(void)0;
+}
+self->attrs[COLOR_array__AbstractArrayRead___length].l = var35; /* _length on <self:AbstractArray[nullable Object]> */
 } else {
 }
 RET_LABEL:;
@@ -1619,64 +1707,6 @@ void VIRTUAL_array__AbstractArray__init(val* self) {
 array__AbstractArray__init(self);
 RET_LABEL:;
 }
-/* method array#Array#iterate for (self: Array[nullable Object]) */
-void array__Array__iterate(val* self) {
-long var /* : Int */;
-long var_i /* var i: Int */;
-long var1 /* : Int */;
-long var_l /* var l: Int */;
-val* var2 /* : nullable NativeArray[nullable Object] */;
-val* var_items /* var items: nullable NativeArray[nullable Object] */;
-long var3 /* : Int */;
-short int var4 /* : Bool */;
-short int var6 /* : Bool */;
-int cltype;
-int idtype;
-short int var7 /* : Bool */;
-long var8 /* : Int */;
-long var9 /* : Int */;
-long var11 /* : Int */;
-var = 0;
-var_i = var;
-var1 = self->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <self:Array[nullable Object]> */
-var_l = var1;
-var2 = self->attrs[COLOR_array__Array___items].val; /* _items on <self:Array[nullable Object]> */
-var_items = var2;
-for(;;) {
-var3 = ((long (*)(val*))(self->class->vft[COLOR_abstract_collection__Collection__length]))(self) /* length on <self:Array[nullable Object]>*/;
-{ /* Inline kernel#Int#< (var_i,var3) */
-/* Covariant cast for argument 0 (i) <var3:Int> isa OTHER */
-/* <var3:Int> isa OTHER */
-var6 = 1; /* easy <var3:Int> isa OTHER*/
-if (!var6) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
-}
-var7 = var_i < var3;
-var4 = var7;
-goto RET_LABEL5;
-RET_LABEL5:(void)0;
-}
-if (!var4) break;
-printf("NOT YET IMPLEMENTED AClosureCallExpr:lib/standard/collection/array.nit:260,4--17\n");
-var8 = 1;
-{ /* Inline kernel#Int#+ (var_i,var8) */
-var11 = var_i + var8;
-var9 = var11;
-goto RET_LABEL10;
-RET_LABEL10:(void)0;
-}
-var_i = var9;
-CONTINUE_label: (void)0;
-}
-BREAK_label: (void)0;
-RET_LABEL:;
-}
-/* method array#Array#iterate for (self: Object) */
-void VIRTUAL_array__Array__iterate(val* self) {
-array__Array__iterate(self);
-RET_LABEL:;
-}
 /* method array#Array#[] for (self: Array[nullable Object], Int): nullable Object */
 val* array__Array___91d_93d(val* self, long p0) {
 val* var /* : nullable Object */;
@@ -1687,6 +1717,7 @@ short int var3 /* : Bool */;
 short int var5 /* : Bool */;
 int cltype;
 int idtype;
+const char* var_class_name;
 short int var6 /* : Bool */;
 short int var_ /* var : Bool */;
 long var7 /* : Int */;
@@ -1694,9 +1725,10 @@ short int var8 /* : Bool */;
 short int var10 /* : Bool */;
 int cltype11;
 int idtype12;
-short int var13 /* : Bool */;
-val* var14 /* : nullable NativeArray[nullable Object] */;
-val* var15 /* : nullable Object */;
+const char* var_class_name13;
+short int var14 /* : Bool */;
+val* var15 /* : nullable NativeArray[nullable Object] */;
+val* var16 /* : nullable Object */;
 var_index = p0;
 var2 = 0;
 { /* Inline kernel#Int#>= (var_index,var2) */
@@ -1704,8 +1736,10 @@ var2 = 0;
 /* <var2:Int> isa OTHER */
 var5 = 1; /* easy <var2:Int> isa OTHER*/
 if (!var5) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
 var6 = var_index >= var2;
 var3 = var6;
@@ -1720,11 +1754,13 @@ var7 = self->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <se
 /* <var7:Int> isa OTHER */
 var10 = 1; /* easy <var7:Int> isa OTHER*/
 if (!var10) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
+var_class_name13 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name13);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
 }
-var13 = var_index < var7;
-var8 = var13;
+var14 = var_index < var7;
+var8 = var14;
 goto RET_LABEL9;
 RET_LABEL9:(void)0;
 }
@@ -1733,17 +1769,19 @@ var1 = var8;
 var1 = var_;
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Assert \'index\' failed", "lib/standard/collection/array.nit", 267);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Assert \'index\' failed");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 255);
+show_backtrace(1);
 }
-var14 = self->attrs[COLOR_array__Array___items].val; /* _items on <self:Array[nullable Object]> */
-if (var14 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Reciever is null", "lib/standard/collection/array.nit", 268);
-exit(1);
+var15 = self->attrs[COLOR_array__Array___items].val; /* _items on <self:Array[nullable Object]> */
+if (var15 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Receiver is null");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 256);
+show_backtrace(1);
 } else {
-var15 = ((val* (*)(val*, long))(var14->class->vft[COLOR_array__NativeArray___91d_93d]))(var14, var_index) /* [] on <var14:nullable NativeArray[nullable Object]>*/;
+var16 = ((val* (*)(val*, long))(var15->class->vft[COLOR_array__NativeArray___91d_93d]))(var15, var_index) /* [] on <var15:nullable NativeArray[nullable Object]>*/;
 }
-var = var15;
+var = var16;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -1764,6 +1802,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 long var_index /* var index: Int */;
 val* var_item /* var item: nullable Object */;
 short int var1 /* : Bool */;
@@ -1772,36 +1811,40 @@ short int var3 /* : Bool */;
 short int var5 /* : Bool */;
 int cltype6;
 int idtype7;
-short int var8 /* : Bool */;
+const char* var_class_name8;
+short int var9 /* : Bool */;
 short int var_ /* var : Bool */;
-long var9 /* : Int */;
 long var10 /* : Int */;
 long var11 /* : Int */;
-long var13 /* : Int */;
-short int var14 /* : Bool */;
-short int var16 /* : Bool */;
-int cltype17;
-int idtype18;
-short int var19 /* : Bool */;
-long var20 /* : Int */;
+long var12 /* : Int */;
+long var14 /* : Int */;
+short int var15 /* : Bool */;
+short int var17 /* : Bool */;
+int cltype18;
+int idtype19;
+const char* var_class_name20;
 short int var21 /* : Bool */;
+long var22 /* : Int */;
 short int var23 /* : Bool */;
-int cltype24;
-int idtype25;
-short int var26 /* : Bool */;
-long var27 /* : Int */;
-long var28 /* : Int */;
+short int var25 /* : Bool */;
+int cltype26;
+int idtype27;
+const char* var_class_name28;
+short int var29 /* : Bool */;
 long var30 /* : Int */;
 long var31 /* : Int */;
-short int var32 /* : Bool */;
-short int var34 /* : Bool */;
-int cltype35;
-int idtype36;
+long var33 /* : Int */;
+long var34 /* : Int */;
+short int var35 /* : Bool */;
 short int var37 /* : Bool */;
-long var38 /* : Int */;
-long var39 /* : Int */;
-long var41 /* : Int */;
-val* var42 /* : nullable NativeArray[nullable Object] */;
+int cltype38;
+int idtype39;
+const char* var_class_name40;
+short int var41 /* : Bool */;
+long var42 /* : Int */;
+long var43 /* : Int */;
+long var45 /* : Int */;
+val* var46 /* : nullable NativeArray[nullable Object] */;
 /* Covariant cast for argument 1 (item) <p1:nullable Object> isa Sequence#0 */
 /* <p1:nullable Object> isa Sequence#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__Sequence_FT0];
@@ -1818,8 +1861,10 @@ var = p1->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 271);
-exit(1);
+var_class_name = p1 == NULL ? "null" : p1->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Sequence#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 259);
+show_backtrace(1);
 }
 var_index = p0;
 var_item = p1;
@@ -1829,101 +1874,111 @@ var2 = 0;
 /* <var2:Int> isa OTHER */
 var5 = 1; /* easy <var2:Int> isa OTHER*/
 if (!var5) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name8 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name8);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var8 = var_index >= var2;
-var3 = var8;
+var9 = var_index >= var2;
+var3 = var9;
 goto RET_LABEL4;
 RET_LABEL4:(void)0;
 }
 var_ = var3;
 if (var3){
-var9 = self->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <self:Array[nullable Object]> */
-var10 = 1;
-{ /* Inline kernel#Int#+ (var9,var10) */
-var13 = var9 + var10;
-var11 = var13;
-goto RET_LABEL12;
-RET_LABEL12:(void)0;
+var10 = self->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <self:Array[nullable Object]> */
+var11 = 1;
+{ /* Inline kernel#Int#+ (var10,var11) */
+var14 = var10 + var11;
+var12 = var14;
+goto RET_LABEL13;
+RET_LABEL13:(void)0;
 }
-{ /* Inline kernel#Int#< (var_index,var11) */
-/* Covariant cast for argument 0 (i) <var11:Int> isa OTHER */
-/* <var11:Int> isa OTHER */
-var16 = 1; /* easy <var11:Int> isa OTHER*/
-if (!var16) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
+{ /* Inline kernel#Int#< (var_index,var12) */
+/* Covariant cast for argument 0 (i) <var12:Int> isa OTHER */
+/* <var12:Int> isa OTHER */
+var17 = 1; /* easy <var12:Int> isa OTHER*/
+if (!var17) {
+var_class_name20 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name20);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
 }
-var19 = var_index < var11;
-var14 = var19;
-goto RET_LABEL15;
-RET_LABEL15:(void)0;
+var21 = var_index < var12;
+var15 = var21;
+goto RET_LABEL16;
+RET_LABEL16:(void)0;
 }
-var1 = var14;
+var1 = var15;
 } else {
 var1 = var_;
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Assert \'index\' failed", "lib/standard/collection/array.nit", 273);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Assert \'index\' failed");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 261);
+show_backtrace(1);
 }
-var20 = self->attrs[COLOR_array__Array___capacity].l; /* _capacity on <self:Array[nullable Object]> */
-{ /* Inline kernel#Int#<= (var20,var_index) */
+var22 = self->attrs[COLOR_array__Array___capacity].l; /* _capacity on <self:Array[nullable Object]> */
+{ /* Inline kernel#Int#<= (var22,var_index) */
 /* Covariant cast for argument 0 (i) <var_index:Int> isa OTHER */
 /* <var_index:Int> isa OTHER */
-var23 = 1; /* easy <var_index:Int> isa OTHER*/
-if (!var23) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 256);
-exit(1);
-}
-var26 = var20 <= var_index;
-var21 = var26;
-goto RET_LABEL22;
-RET_LABEL22:(void)0;
-}
-if (var21){
-var27 = 1;
-{ /* Inline kernel#Int#+ (var_index,var27) */
-var30 = var_index + var27;
-var28 = var30;
-goto RET_LABEL29;
-RET_LABEL29:(void)0;
-}
-((void (*)(val*, long))(self->class->vft[COLOR_array__AbstractArray__enlarge]))(self, var28) /* enlarge on <self:Array[nullable Object]>*/;
-} else {
-}
-var31 = self->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <self:Array[nullable Object]> */
-{ /* Inline kernel#Int#<= (var31,var_index) */
+var25 = 1; /* easy <var_index:Int> isa OTHER*/
+if (!var25) {
+var_class_name28 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name28);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 264);
+show_backtrace(1);
+}
+var29 = var22 <= var_index;
+var23 = var29;
+goto RET_LABEL24;
+RET_LABEL24:(void)0;
+}
+if (var23){
+var30 = 1;
+{ /* Inline kernel#Int#+ (var_index,var30) */
+var33 = var_index + var30;
+var31 = var33;
+goto RET_LABEL32;
+RET_LABEL32:(void)0;
+}
+((void (*)(val*, long))(self->class->vft[COLOR_array__AbstractArray__enlarge]))(self, var31) /* enlarge on <self:Array[nullable Object]>*/;
+} else {
+}
+var34 = self->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <self:Array[nullable Object]> */
+{ /* Inline kernel#Int#<= (var34,var_index) */
 /* Covariant cast for argument 0 (i) <var_index:Int> isa OTHER */
 /* <var_index:Int> isa OTHER */
-var34 = 1; /* easy <var_index:Int> isa OTHER*/
-if (!var34) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 256);
-exit(1);
+var37 = 1; /* easy <var_index:Int> isa OTHER*/
+if (!var37) {
+var_class_name40 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name40);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 264);
+show_backtrace(1);
 }
-var37 = var31 <= var_index;
-var32 = var37;
-goto RET_LABEL33;
-RET_LABEL33:(void)0;
+var41 = var34 <= var_index;
+var35 = var41;
+goto RET_LABEL36;
+RET_LABEL36:(void)0;
 }
-if (var32){
-var38 = 1;
-{ /* Inline kernel#Int#+ (var_index,var38) */
-var41 = var_index + var38;
-var39 = var41;
-goto RET_LABEL40;
-RET_LABEL40:(void)0;
+if (var35){
+var42 = 1;
+{ /* Inline kernel#Int#+ (var_index,var42) */
+var45 = var_index + var42;
+var43 = var45;
+goto RET_LABEL44;
+RET_LABEL44:(void)0;
 }
-self->attrs[COLOR_array__AbstractArrayRead___length].l = var39; /* _length on <self:Array[nullable Object]> */
+self->attrs[COLOR_array__AbstractArrayRead___length].l = var43; /* _length on <self:Array[nullable Object]> */
 } else {
 }
-var42 = self->attrs[COLOR_array__Array___items].val; /* _items on <self:Array[nullable Object]> */
-if (var42 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Reciever is null", "lib/standard/collection/array.nit", 280);
-exit(1);
+var46 = self->attrs[COLOR_array__Array___items].val; /* _items on <self:Array[nullable Object]> */
+if (var46 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Receiver is null");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 268);
+show_backtrace(1);
 } else {
-((void (*)(val*, long, val*))(var42->class->vft[COLOR_array__NativeArray___91d_93d_61d]))(var42, var_index, var_item) /* []= on <var42:nullable NativeArray[nullable Object]>*/;
+((void (*)(val*, long, val*))(var46->class->vft[COLOR_array__NativeArray___91d_93d_61d]))(var46, var_index, var_item) /* []= on <var46:nullable NativeArray[nullable Object]>*/;
 }
 RET_LABEL:;
 }
@@ -1939,6 +1994,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var1 /* : Int */;
 long var_l /* var l: Int */;
@@ -1947,14 +2003,15 @@ short int var3 /* : Bool */;
 short int var5 /* : Bool */;
 int cltype6;
 int idtype7;
-short int var8 /* : Bool */;
-long var9 /* : Int */;
+const char* var_class_name8;
+short int var9 /* : Bool */;
 long var10 /* : Int */;
-long var12 /* : Int */;
+long var11 /* : Int */;
 long var13 /* : Int */;
 long var14 /* : Int */;
-long var16 /* : Int */;
-val* var17 /* : nullable NativeArray[nullable Object] */;
+long var15 /* : Int */;
+long var17 /* : Int */;
+val* var18 /* : nullable NativeArray[nullable Object] */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa SimpleCollection#0 */
 /* <p0:nullable Object> isa SimpleCollection#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__SimpleCollection_FT0];
@@ -1971,8 +2028,10 @@ var = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 283);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "SimpleCollection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 271);
+show_backtrace(1);
 }
 var_item = p0;
 var1 = self->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <self:Array[nullable Object]> */
@@ -1983,39 +2042,42 @@ var2 = self->attrs[COLOR_array__Array___capacity].l; /* _capacity on <self:Array
 /* <var_l:Int> isa OTHER */
 var5 = 1; /* easy <var_l:Int> isa OTHER*/
 if (!var5) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 256);
-exit(1);
+var_class_name8 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name8);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 264);
+show_backtrace(1);
 }
-var8 = var2 <= var_l;
-var3 = var8;
+var9 = var2 <= var_l;
+var3 = var9;
 goto RET_LABEL4;
 RET_LABEL4:(void)0;
 }
 if (var3){
-var9 = 1;
-{ /* Inline kernel#Int#+ (var_l,var9) */
-var12 = var_l + var9;
-var10 = var12;
-goto RET_LABEL11;
-RET_LABEL11:(void)0;
+var10 = 1;
+{ /* Inline kernel#Int#+ (var_l,var10) */
+var13 = var_l + var10;
+var11 = var13;
+goto RET_LABEL12;
+RET_LABEL12:(void)0;
 }
-((void (*)(val*, long))(self->class->vft[COLOR_array__AbstractArray__enlarge]))(self, var10) /* enlarge on <self:Array[nullable Object]>*/;
+((void (*)(val*, long))(self->class->vft[COLOR_array__AbstractArray__enlarge]))(self, var11) /* enlarge on <self:Array[nullable Object]>*/;
 } else {
 }
-var13 = 1;
-{ /* Inline kernel#Int#+ (var_l,var13) */
-var16 = var_l + var13;
-var14 = var16;
-goto RET_LABEL15;
-RET_LABEL15:(void)0;
-}
-self->attrs[COLOR_array__AbstractArrayRead___length].l = var14; /* _length on <self:Array[nullable Object]> */
-var17 = self->attrs[COLOR_array__Array___items].val; /* _items on <self:Array[nullable Object]> */
-if (var17 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Reciever is null", "lib/standard/collection/array.nit", 290);
-exit(1);
+var14 = 1;
+{ /* Inline kernel#Int#+ (var_l,var14) */
+var17 = var_l + var14;
+var15 = var17;
+goto RET_LABEL16;
+RET_LABEL16:(void)0;
+}
+self->attrs[COLOR_array__AbstractArrayRead___length].l = var15; /* _length on <self:Array[nullable Object]> */
+var18 = self->attrs[COLOR_array__Array___items].val; /* _items on <self:Array[nullable Object]> */
+if (var18 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Receiver is null");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 278);
+show_backtrace(1);
 } else {
-((void (*)(val*, long, val*))(var17->class->vft[COLOR_array__NativeArray___91d_93d_61d]))(var17, var_l, var_item) /* []= on <var17:nullable NativeArray[nullable Object]>*/;
+((void (*)(val*, long, val*))(var18->class->vft[COLOR_array__NativeArray___91d_93d_61d]))(var18, var_l, var_item) /* []= on <var18:nullable NativeArray[nullable Object]>*/;
 }
 RET_LABEL:;
 }
@@ -2033,29 +2095,32 @@ short int var1 /* : Bool */;
 short int var3 /* : Bool */;
 int cltype;
 int idtype;
+const char* var_class_name;
 short int var4 /* : Bool */;
 short int var5 /* : Bool */;
 short int var7 /* : Bool */;
 int cltype8;
 int idtype9;
-short int var10 /* : Bool */;
-long var11 /* : Int */;
+const char* var_class_name10;
+short int var11 /* : Bool */;
 long var12 /* : Int */;
-long var14 /* : Int */;
+long var13 /* : Int */;
 long var15 /* : Int */;
 long var16 /* : Int */;
-long var18 /* : Int */;
-val* var19 /* : NativeArray[nullable Object] */;
+long var17 /* : Int */;
+long var19 /* : Int */;
+val* var20 /* : NativeArray[nullable Object] */;
 val* var_a /* var a: NativeArray[nullable Object] */;
-long var20 /* : Int */;
 long var21 /* : Int */;
-short int var22 /* : Bool */;
-short int var24 /* : Bool */;
-int cltype25;
-int idtype26;
-short int var27 /* : Bool */;
-val* var28 /* : nullable NativeArray[nullable Object] */;
-long var29 /* : Int */;
+long var22 /* : Int */;
+short int var23 /* : Bool */;
+short int var25 /* : Bool */;
+int cltype26;
+int idtype27;
+const char* var_class_name28;
+short int var29 /* : Bool */;
+val* var30 /* : nullable NativeArray[nullable Object] */;
+long var31 /* : Int */;
 var_cap = p0;
 var = self->attrs[COLOR_array__Array___capacity].l; /* _capacity on <self:Array[nullable Object]> */
 var_c = var;
@@ -2064,8 +2129,10 @@ var_c = var;
 /* <var_c:Int> isa OTHER */
 var3 = 1; /* easy <var_c:Int> isa OTHER*/
 if (!var3) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 256);
-exit(1);
+var_class_name = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 264);
+show_backtrace(1);
 }
 var4 = var_cap <= var_c;
 var1 = var4;
@@ -2082,58 +2149,63 @@ for(;;) {
 /* <var_cap:Int> isa OTHER */
 var7 = 1; /* easy <var_cap:Int> isa OTHER*/
 if (!var7) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 256);
-exit(1);
+var_class_name10 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name10);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 264);
+show_backtrace(1);
 }
-var10 = var_c <= var_cap;
-var5 = var10;
+var11 = var_c <= var_cap;
+var5 = var11;
 goto RET_LABEL6;
 RET_LABEL6:(void)0;
 }
 if (!var5) break;
-var11 = 2;
-{ /* Inline kernel#Int#* (var_c,var11) */
-var14 = var_c * var11;
-var12 = var14;
-goto RET_LABEL13;
-RET_LABEL13:(void)0;
-}
-var15 = 2;
-{ /* Inline kernel#Int#+ (var12,var15) */
-var18 = var12 + var15;
-var16 = var18;
-goto RET_LABEL17;
-RET_LABEL17:(void)0;
+var12 = 2;
+{ /* Inline kernel#Int#* (var_c,var12) */
+var15 = var_c * var12;
+var13 = var15;
+goto RET_LABEL14;
+RET_LABEL14:(void)0;
+}
+var16 = 2;
+{ /* Inline kernel#Int#+ (var13,var16) */
+var19 = var13 + var16;
+var17 = var19;
+goto RET_LABEL18;
+RET_LABEL18:(void)0;
 }
-var_c = var16;
+var_c = var17;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
-var19 = ((val* (*)(val*, long))(self->class->vft[COLOR_array__ArrayCapable__calloc_array]))(self, var_c) /* calloc_array on <self:Array[nullable Object]>*/;
-var_a = var19;
-var20 = self->attrs[COLOR_array__Array___capacity].l; /* _capacity on <self:Array[nullable Object]> */
-var21 = 0;
-{ /* Inline kernel#Int#> (var20,var21) */
-/* Covariant cast for argument 0 (i) <var21:Int> isa OTHER */
-/* <var21:Int> isa OTHER */
-var24 = 1; /* easy <var21:Int> isa OTHER*/
-if (!var24) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 259);
-exit(1);
-}
-var27 = var20 > var21;
-var22 = var27;
-goto RET_LABEL23;
-RET_LABEL23:(void)0;
-}
-if (var22){
-var28 = self->attrs[COLOR_array__Array___items].val; /* _items on <self:Array[nullable Object]> */
-var29 = self->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <self:Array[nullable Object]> */
-if (var28 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Reciever is null", "lib/standard/collection/array.nit", 299);
-exit(1);
+var20 = ((val* (*)(val*, long))(self->class->vft[COLOR_array__ArrayCapable__calloc_array]))(self, var_c) /* calloc_array on <self:Array[nullable Object]>*/;
+var_a = var20;
+var21 = self->attrs[COLOR_array__Array___capacity].l; /* _capacity on <self:Array[nullable Object]> */
+var22 = 0;
+{ /* Inline kernel#Int#> (var21,var22) */
+/* Covariant cast for argument 0 (i) <var22:Int> isa OTHER */
+/* <var22:Int> isa OTHER */
+var25 = 1; /* easy <var22:Int> isa OTHER*/
+if (!var25) {
+var_class_name28 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name28);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 267);
+show_backtrace(1);
+}
+var29 = var21 > var22;
+var23 = var29;
+goto RET_LABEL24;
+RET_LABEL24:(void)0;
+}
+if (var23){
+var30 = self->attrs[COLOR_array__Array___items].val; /* _items on <self:Array[nullable Object]> */
+var31 = self->attrs[COLOR_array__AbstractArrayRead___length].l; /* _length on <self:Array[nullable Object]> */
+if (var30 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Receiver is null");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 287);
+show_backtrace(1);
 } else {
-((void (*)(val*, val*, long))(var28->class->vft[COLOR_array__NativeArray__copy_to]))(var28, var_a, var29) /* copy_to on <var28:nullable NativeArray[nullable Object]>*/;
+((void (*)(val*, val*, long))(var30->class->vft[COLOR_array__NativeArray__copy_to]))(var30, var_a, var31) /* copy_to on <var30:nullable NativeArray[nullable Object]>*/;
 }
 } else {
 }
@@ -2168,6 +2240,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_items /* var items: Collection[nullable Object] */;
 long var1 /* : Int */;
 /* Covariant cast for argument 0 (items) <p0:Collection[nullable Object]> isa Collection[Array#0] */
@@ -2181,8 +2254,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 311);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Collection[Array#0]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 299);
+show_backtrace(1);
 }
 var_items = p0;
 var1 = ((long (*)(val*))(var_items->class->vft[COLOR_abstract_collection__Collection__length]))(var_items) /* length on <var_items:Collection[nullable Object]>*/;
@@ -2224,6 +2299,7 @@ short int var1 /* : Bool */;
 short int var3 /* : Bool */;
 int cltype;
 int idtype;
+const char* var_class_name;
 short int var4 /* : Bool */;
 val* var5 /* : NativeArray[nullable Object] */;
 long var6 /* : Int */;
@@ -2235,8 +2311,10 @@ var = 0;
 /* <var:Int> isa OTHER */
 var3 = 1; /* easy <var:Int> isa OTHER*/
 if (!var3) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
 var4 = var_cap >= var;
 var1 = var4;
@@ -2244,8 +2322,9 @@ goto RET_LABEL2;
 RET_LABEL2:(void)0;
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Assert \'positive\' failed", "lib/standard/collection/array.nit", 328);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Assert \'positive\' failed");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 316);
+show_backtrace(1);
 }
 var5 = ((val* (*)(val*, long))(self->class->vft[COLOR_array__ArrayCapable__calloc_array]))(self, var_cap) /* calloc_array on <self:Array[nullable Object]>*/;
 self->attrs[COLOR_array__Array___items].val = var5; /* _items on <self:Array[nullable Object]> */
@@ -2266,6 +2345,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_value /* var value: nullable Object */;
 long var_count /* var count: Int */;
 long var1 /* : Int */;
@@ -2273,18 +2353,20 @@ short int var2 /* : Bool */;
 short int var4 /* : Bool */;
 int cltype5;
 int idtype6;
-short int var7 /* : Bool */;
-val* var8 /* : NativeArray[nullable Object] */;
-long var9 /* : Int */;
+const char* var_class_name7;
+short int var8 /* : Bool */;
+val* var9 /* : NativeArray[nullable Object] */;
+long var10 /* : Int */;
 long var_i /* var i: Int */;
-short int var10 /* : Bool */;
-short int var12 /* : Bool */;
-int cltype13;
-int idtype14;
-short int var15 /* : Bool */;
-long var16 /* : Int */;
-long var17 /* : Int */;
+short int var11 /* : Bool */;
+short int var13 /* : Bool */;
+int cltype14;
+int idtype15;
+const char* var_class_name16;
+short int var17 /* : Bool */;
+long var18 /* : Int */;
 long var19 /* : Int */;
+long var21 /* : Int */;
 /* Covariant cast for argument 0 (value) <p0:nullable Object> isa Array#0 */
 /* <p0:nullable Object> isa Array#0 */
 type_struct = self->type->resolution_table->types[COLOR_array__Array_FT0];
@@ -2301,8 +2383,10 @@ var = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 334);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Array#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 322);
+show_backtrace(1);
 }
 var_value = p0;
 var_count = p1;
@@ -2313,48 +2397,53 @@ var1 = 0;
 /* <var1:Int> isa OTHER */
 var4 = 1; /* easy <var1:Int> isa OTHER*/
 if (!var4) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name7 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name7);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var7 = var_count >= var1;
-var2 = var7;
+var8 = var_count >= var1;
+var2 = var8;
 goto RET_LABEL3;
 RET_LABEL3:(void)0;
 }
 if (!var2) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Assert \'positive\' failed", "lib/standard/collection/array.nit", 337);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Assert \'positive\' failed");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 325);
+show_backtrace(1);
 }
-var8 = ((val* (*)(val*, long))(self->class->vft[COLOR_array__ArrayCapable__calloc_array]))(self, var_count) /* calloc_array on <self:Array[nullable Object]>*/;
-self->attrs[COLOR_array__Array___items].val = var8; /* _items on <self:Array[nullable Object]> */
+var9 = ((val* (*)(val*, long))(self->class->vft[COLOR_array__ArrayCapable__calloc_array]))(self, var_count) /* calloc_array on <self:Array[nullable Object]>*/;
+self->attrs[COLOR_array__Array___items].val = var9; /* _items on <self:Array[nullable Object]> */
 self->attrs[COLOR_array__Array___capacity].l = var_count; /* _capacity on <self:Array[nullable Object]> */
 self->attrs[COLOR_array__AbstractArrayRead___length].l = var_count; /* _length on <self:Array[nullable Object]> */
-var9 = 0;
-var_i = var9;
+var10 = 0;
+var_i = var10;
 for(;;) {
 { /* Inline kernel#Int#< (var_i,var_count) */
 /* Covariant cast for argument 0 (i) <var_count:Int> isa OTHER */
 /* <var_count:Int> isa OTHER */
-var12 = 1; /* easy <var_count:Int> isa OTHER*/
-if (!var12) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
-}
-var15 = var_i < var_count;
-var10 = var15;
-goto RET_LABEL11;
-RET_LABEL11:(void)0;
+var13 = 1; /* easy <var_count:Int> isa OTHER*/
+if (!var13) {
+var_class_name16 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name16);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
+}
+var17 = var_i < var_count;
+var11 = var17;
+goto RET_LABEL12;
+RET_LABEL12:(void)0;
 }
-if (!var10) break;
+if (!var11) break;
 ((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var_i, var_value) /* []= on <self:Array[nullable Object]>*/;
-var16 = 1;
-{ /* Inline kernel#Int#+ (var_i,var16) */
-var19 = var_i + var16;
-var17 = var19;
-goto RET_LABEL18;
-RET_LABEL18:(void)0;
+var18 = 1;
+{ /* Inline kernel#Int#+ (var_i,var18) */
+var21 = var_i + var18;
+var19 = var21;
+goto RET_LABEL20;
+RET_LABEL20:(void)0;
 }
-var_i = var17;
+var_i = var19;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
@@ -2371,6 +2460,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_nat /* var nat: NativeArray[nullable Object] */;
 long var_size /* var size: Int */;
 long var1 /* : Int */;
@@ -2378,7 +2468,8 @@ short int var2 /* : Bool */;
 short int var4 /* : Bool */;
 int cltype5;
 int idtype6;
-short int var7 /* : Bool */;
+const char* var_class_name7;
+short int var8 /* : Bool */;
 /* Covariant cast for argument 0 (nat) <p0:NativeArray[nullable Object]> isa NativeArray[Array#0] */
 /* <p0:NativeArray[nullable Object]> isa NativeArray[Array#0] */
 type_struct = self->type->resolution_table->types[COLOR_array__NativeArrayarray__Array_FT0];
@@ -2390,8 +2481,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 348);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "NativeArray[Array#0]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 336);
+show_backtrace(1);
 }
 var_nat = p0;
 var_size = p1;
@@ -2402,17 +2495,20 @@ var1 = 0;
 /* <var1:Int> isa OTHER */
 var4 = 1; /* easy <var1:Int> isa OTHER*/
 if (!var4) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name7 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name7);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var7 = var_size >= var1;
-var2 = var7;
+var8 = var_size >= var1;
+var2 = var8;
 goto RET_LABEL3;
 RET_LABEL3:(void)0;
 }
 if (!var2) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Assert \'positive\' failed", "lib/standard/collection/array.nit", 351);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Assert \'positive\' failed");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 339);
+show_backtrace(1);
 }
 self->attrs[COLOR_array__Array___items].val = var_nat; /* _items on <self:Array[nullable Object]> */
 self->attrs[COLOR_array__Array___capacity].l = var_size; /* _capacity on <self:Array[nullable Object]> */
@@ -2430,8 +2526,9 @@ val* var /* : NativeArray[nullable Object] */;
 val* var1 /* : nullable NativeArray[nullable Object] */;
 var1 = self->attrs[COLOR_array__Array___items].val; /* _items on <self:Array[nullable Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 362);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Cast failed");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 350);
+show_backtrace(1);
 }
 var = var1;
 goto RET_LABEL;
@@ -2447,447 +2544,6 @@ var = var1;
 RET_LABEL:;
 return var;
 }
-/* method array#Array#sort for (self: Array[nullable Object]) */
-void array__Array__sort(val* self) {
-long var /* : Int */;
-long var1 /* : Int */;
-long var2 /* : Int */;
-long var3 /* : Int */;
-long var5 /* : Int */;
-var = 0;
-var1 = ((long (*)(val*))(self->class->vft[COLOR_abstract_collection__Collection__length]))(self) /* length on <self:Array[nullable Object]>*/;
-var2 = 1;
-{ /* Inline kernel#Int#- (var1,var2) */
-var5 = var1 - var2;
-var3 = var5;
-goto RET_LABEL4;
-RET_LABEL4:(void)0;
-}
-((void (*)(val*, long, long))(self->class->vft[COLOR_array__Array__sub_sort]))(self, var, var3) /* sub_sort on <self:Array[nullable Object]>*/;
-RET_LABEL:;
-}
-/* method array#Array#sort for (self: Object) */
-void VIRTUAL_array__Array__sort(val* self) {
-array__Array__sort(self);
-RET_LABEL:;
-}
-/* method array#Array#sub_sort for (self: Array[nullable Object], Int, Int) */
-void array__Array__sub_sort(val* self, long p0, long p1) {
-long var_from /* var from: Int */;
-long var_to /* var to: Int */;
-short int var /* : Bool */;
-short int var2 /* : Bool */;
-int cltype;
-int idtype;
-short int var3 /* : Bool */;
-long var4 /* : Int */;
-long var5 /* : Int */;
-long var7 /* : Int */;
-short int var8 /* : Bool */;
-short int var10 /* : Bool */;
-int cltype11;
-int idtype12;
-short int var13 /* : Bool */;
-val* var14 /* : nullable Object */;
-val* var_pivot /* var pivot: nullable Object */;
-long var_i /* var i: Int */;
-long var_j /* var j: Int */;
-short int var15 /* : Bool */;
-short int var17 /* : Bool */;
-int cltype18;
-int idtype19;
-short int var20 /* : Bool */;
-short int var21 /* : Bool */;
-short int var22 /* : Bool */;
-short int var24 /* : Bool */;
-int cltype25;
-int idtype26;
-short int var27 /* : Bool */;
-short int var_ /* var : Bool */;
-long var28 /* : Int */;
-long var29 /* : Int */;
-short int var30 /* : Bool */;
-short int var32 /* : Bool */;
-int cltype33;
-int idtype34;
-short int var35 /* : Bool */;
-long var36 /* : Int */;
-long var37 /* : Int */;
-long var39 /* : Int */;
-short int var40 /* : Bool */;
-short int var41 /* : Bool */;
-short int var43 /* : Bool */;
-int cltype44;
-int idtype45;
-short int var46 /* : Bool */;
-short int var_47 /* var : Bool */;
-long var48 /* : Int */;
-long var49 /* : Int */;
-short int var50 /* : Bool */;
-short int var52 /* : Bool */;
-int cltype53;
-int idtype54;
-short int var55 /* : Bool */;
-long var56 /* : Int */;
-long var57 /* : Int */;
-long var59 /* : Int */;
-short int var61 /* : Bool */;
-short int var63 /* : Bool */;
-int cltype64;
-int idtype65;
-short int var66 /* : Bool */;
-val* var67 /* : nullable Object */;
-val* var_t /* var t: nullable Object */;
-val* var68 /* : nullable Object */;
-long var70 /* : Int */;
-long var71 /* : Int */;
-long var73 /* : Int */;
-val* var74 /* : nullable Object */;
-long var75 /* : Int */;
-long var76 /* : Int */;
-long var78 /* : Int */;
-long var79 /* : Int */;
-long var80 /* : Int */;
-long var82 /* : Int */;
-long var_i83 /* var i: Int */;
-short int var84 /* : Bool */;
-short int var86 /* : Bool */;
-int cltype87;
-int idtype88;
-short int var89 /* : Bool */;
-long var_min /* var min: Int */;
-val* var90 /* : nullable Object */;
-val* var_min_v /* var min_v: nullable Object */;
-long var_j91 /* var j: Int */;
-short int var92 /* : Bool */;
-short int var94 /* : Bool */;
-int cltype95;
-int idtype96;
-short int var97 /* : Bool */;
-long var98 /* : Int */;
-long var99 /* : Int */;
-short int var100 /* : Bool */;
-short int var102 /* : Bool */;
-int cltype103;
-int idtype104;
-short int var105 /* : Bool */;
-val* var106 /* : nullable Object */;
-long var107 /* : Int */;
-long var108 /* : Int */;
-long var110 /* : Int */;
-short int var112 /* : Bool */;
-short int var114 /* : Bool */;
-short int var115 /* : Bool */;
-val* var116 /* : nullable Object */;
-long var117 /* : Int */;
-long var118 /* : Int */;
-long var120 /* : Int */;
-var_from = p0;
-var_to = p1;
-{ /* Inline kernel#Int#>= (var_from,var_to) */
-/* Covariant cast for argument 0 (i) <var_to:Int> isa OTHER */
-/* <var_to:Int> isa OTHER */
-var2 = 1; /* easy <var_to:Int> isa OTHER*/
-if (!var2) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
-}
-var3 = var_from >= var_to;
-var = var3;
-goto RET_LABEL1;
-RET_LABEL1:(void)0;
-}
-if (var){
-goto RET_LABEL;
-} else {
-var4 = 7;
-{ /* Inline kernel#Int#+ (var_from,var4) */
-var7 = var_from + var4;
-var5 = var7;
-goto RET_LABEL6;
-RET_LABEL6:(void)0;
-}
-{ /* Inline kernel#Int#< (var5,var_to) */
-/* Covariant cast for argument 0 (i) <var_to:Int> isa OTHER */
-/* <var_to:Int> isa OTHER */
-var10 = 1; /* easy <var_to:Int> isa OTHER*/
-if (!var10) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
-}
-var13 = var5 < var_to;
-var8 = var13;
-goto RET_LABEL9;
-RET_LABEL9:(void)0;
-}
-if (var8){
-var14 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_from) /* [] on <self:Array[nullable Object]>*/;
-var_pivot = var14;
-var_i = var_from;
-var_j = var_to;
-for(;;) {
-{ /* Inline kernel#Int#> (var_j,var_i) */
-/* Covariant cast for argument 0 (i) <var_i:Int> isa OTHER */
-/* <var_i:Int> isa OTHER */
-var17 = 1; /* easy <var_i:Int> isa OTHER*/
-if (!var17) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 259);
-exit(1);
-}
-var20 = var_j > var_i;
-var15 = var20;
-goto RET_LABEL16;
-RET_LABEL16:(void)0;
-}
-if (!var15) break;
-for(;;) {
-{ /* Inline kernel#Int#<= (var_i,var_to) */
-/* Covariant cast for argument 0 (i) <var_to:Int> isa OTHER */
-/* <var_to:Int> isa OTHER */
-var24 = 1; /* easy <var_to:Int> isa OTHER*/
-if (!var24) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 256);
-exit(1);
-}
-var27 = var_i <= var_to;
-var22 = var27;
-goto RET_LABEL23;
-RET_LABEL23:(void)0;
-}
-var_ = var22;
-if (var22){
-printf("NOT YET IMPLEMENTED AClosureCallExpr:lib/standard/collection/array.nit:385,23--41\n");
-/* var28 = NOT YET AClosureCallExpr */
-var29 = 0;
-{ /* Inline kernel#Int#<= (var28,var29) */
-/* Covariant cast for argument 0 (i) <var29:Int> isa OTHER */
-/* <var29:Int> isa OTHER */
-var32 = 1; /* easy <var29:Int> isa OTHER*/
-if (!var32) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 256);
-exit(1);
-}
-var35 = var28 <= var29;
-var30 = var35;
-goto RET_LABEL31;
-RET_LABEL31:(void)0;
-}
-var21 = var30;
-} else {
-var21 = var_;
-}
-if (!var21) break;
-var36 = 1;
-{ /* Inline kernel#Int#+ (var_i,var36) */
-var39 = var_i + var36;
-var37 = var39;
-goto RET_LABEL38;
-RET_LABEL38:(void)0;
-}
-var_i = var37;
-CONTINUE_label: (void)0;
-}
-BREAK_label: (void)0;
-for(;;) {
-{ /* Inline kernel#Int#> (var_j,var_i) */
-/* Covariant cast for argument 0 (i) <var_i:Int> isa OTHER */
-/* <var_i:Int> isa OTHER */
-var43 = 1; /* easy <var_i:Int> isa OTHER*/
-if (!var43) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 259);
-exit(1);
-}
-var46 = var_j > var_i;
-var41 = var46;
-goto RET_LABEL42;
-RET_LABEL42:(void)0;
-}
-var_47 = var41;
-if (var41){
-printf("NOT YET IMPLEMENTED AClosureCallExpr:lib/standard/collection/array.nit:386,21--39\n");
-/* var48 = NOT YET AClosureCallExpr */
-var49 = 0;
-{ /* Inline kernel#Int#>= (var48,var49) */
-/* Covariant cast for argument 0 (i) <var49:Int> isa OTHER */
-/* <var49:Int> isa OTHER */
-var52 = 1; /* easy <var49:Int> isa OTHER*/
-if (!var52) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
-}
-var55 = var48 >= var49;
-var50 = var55;
-goto RET_LABEL51;
-RET_LABEL51:(void)0;
-}
-var40 = var50;
-} else {
-var40 = var_47;
-}
-if (!var40) break;
-var56 = 1;
-{ /* Inline kernel#Int#- (var_j,var56) */
-var59 = var_j - var56;
-var57 = var59;
-goto RET_LABEL58;
-RET_LABEL58:(void)0;
-}
-var_j = var57;
-CONTINUE_label60: (void)0;
-}
-BREAK_label60: (void)0;
-{ /* Inline kernel#Int#> (var_j,var_i) */
-/* Covariant cast for argument 0 (i) <var_i:Int> isa OTHER */
-/* <var_i:Int> isa OTHER */
-var63 = 1; /* easy <var_i:Int> isa OTHER*/
-if (!var63) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 259);
-exit(1);
-}
-var66 = var_j > var_i;
-var61 = var66;
-goto RET_LABEL62;
-RET_LABEL62:(void)0;
-}
-if (var61){
-var67 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i) /* [] on <self:Array[nullable Object]>*/;
-var_t = var67;
-var68 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_j) /* [] on <self:Array[nullable Object]>*/;
-((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var_i, var68) /* []= on <self:Array[nullable Object]>*/;
-((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var_j, var_t) /* []= on <self:Array[nullable Object]>*/;
-} else {
-}
-CONTINUE_label69: (void)0;
-}
-BREAK_label69: (void)0;
-var70 = 1;
-{ /* Inline kernel#Int#- (var_i,var70) */
-var73 = var_i - var70;
-var71 = var73;
-goto RET_LABEL72;
-RET_LABEL72:(void)0;
-}
-var74 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var71) /* [] on <self:Array[nullable Object]>*/;
-((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var_from, var74) /* []= on <self:Array[nullable Object]>*/;
-var75 = 1;
-{ /* Inline kernel#Int#- (var_i,var75) */
-var78 = var_i - var75;
-var76 = var78;
-goto RET_LABEL77;
-RET_LABEL77:(void)0;
-}
-((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var76, var_pivot) /* []= on <self:Array[nullable Object]>*/;
-var79 = 2;
-{ /* Inline kernel#Int#- (var_i,var79) */
-var82 = var_i - var79;
-var80 = var82;
-goto RET_LABEL81;
-RET_LABEL81:(void)0;
-}
-((void (*)(val*, long, long))(self->class->vft[COLOR_array__Array__sub_sort]))(self, var_from, var80) /* sub_sort on <self:Array[nullable Object]>*/;
-((void (*)(val*, long, long))(self->class->vft[COLOR_array__Array__sub_sort]))(self, var_i, var_to) /* sub_sort on <self:Array[nullable Object]>*/;
-} else {
-var_i83 = var_from;
-for(;;) {
-{ /* Inline kernel#Int#< (var_i83,var_to) */
-/* Covariant cast for argument 0 (i) <var_to:Int> isa OTHER */
-/* <var_to:Int> isa OTHER */
-var86 = 1; /* easy <var_to:Int> isa OTHER*/
-if (!var86) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
-}
-var89 = var_i83 < var_to;
-var84 = var89;
-goto RET_LABEL85;
-RET_LABEL85:(void)0;
-}
-if (!var84) break;
-var_min = var_i83;
-var90 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i83) /* [] on <self:Array[nullable Object]>*/;
-var_min_v = var90;
-var_j91 = var_i83;
-for(;;) {
-{ /* Inline kernel#Int#<= (var_j91,var_to) */
-/* Covariant cast for argument 0 (i) <var_to:Int> isa OTHER */
-/* <var_to:Int> isa OTHER */
-var94 = 1; /* easy <var_to:Int> isa OTHER*/
-if (!var94) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 256);
-exit(1);
-}
-var97 = var_j91 <= var_to;
-var92 = var97;
-goto RET_LABEL93;
-RET_LABEL93:(void)0;
-}
-if (!var92) break;
-printf("NOT YET IMPLEMENTED AClosureCallExpr:lib/standard/collection/array.nit:404,9--27\n");
-/* var98 = NOT YET AClosureCallExpr */
-var99 = 0;
-{ /* Inline kernel#Int#> (var98,var99) */
-/* Covariant cast for argument 0 (i) <var99:Int> isa OTHER */
-/* <var99:Int> isa OTHER */
-var102 = 1; /* easy <var99:Int> isa OTHER*/
-if (!var102) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 259);
-exit(1);
-}
-var105 = var98 > var99;
-var100 = var105;
-goto RET_LABEL101;
-RET_LABEL101:(void)0;
-}
-if (var100){
-var_min = var_j91;
-var106 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_j91) /* [] on <self:Array[nullable Object]>*/;
-var_min_v = var106;
-} else {
-}
-var107 = 1;
-{ /* Inline kernel#Int#+ (var_j91,var107) */
-var110 = var_j91 + var107;
-var108 = var110;
-goto RET_LABEL109;
-RET_LABEL109:(void)0;
-}
-var_j91 = var108;
-CONTINUE_label111: (void)0;
-}
-BREAK_label111: (void)0;
-{ /* Inline kernel#Int#!= (var_min,var_i83) */
-var114 = var_min == var_i83;
-var115 = !var114;
-var112 = var115;
-goto RET_LABEL113;
-RET_LABEL113:(void)0;
-}
-if (var112){
-var116 = ((val* (*)(val*, long))(self->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(self, var_i83) /* [] on <self:Array[nullable Object]>*/;
-((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var_min, var116) /* []= on <self:Array[nullable Object]>*/;
-((void (*)(val*, long, val*))(self->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(self, var_i83, var_min_v) /* []= on <self:Array[nullable Object]>*/;
-} else {
-}
-var117 = 1;
-{ /* Inline kernel#Int#+ (var_i83,var117) */
-var120 = var_i83 + var117;
-var118 = var120;
-goto RET_LABEL119;
-RET_LABEL119:(void)0;
-}
-var_i83 = var118;
-CONTINUE_label121: (void)0;
-}
-BREAK_label121: (void)0;
-}
-}
-RET_LABEL:;
-}
-/* method array#Array#sub_sort for (self: Object, Int, Int) */
-void VIRTUAL_array__Array__sub_sort(val* self, long p0, long p1) {
-array__Array__sub_sort(self, p0, p1);
-RET_LABEL:;
-}
 /* method array#ArrayIterator#item for (self: ArrayIterator[nullable Object]): nullable Object */
 val* array__ArrayIterator__item(val* self) {
 val* var /* : nullable Object */;
@@ -2896,8 +2552,9 @@ long var2 /* : Int */;
 val* var3 /* : nullable Object */;
 var1 = self->attrs[COLOR_array__ArrayIterator___array].val; /* _array on <self:ArrayIterator[nullable Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 424);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 360);
+show_backtrace(1);
 }
 var2 = self->attrs[COLOR_array__ArrayIterator___index].l; /* _index on <self:ArrayIterator[nullable Object]> */
 var3 = ((val* (*)(val*, long))(var1->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var1, var2) /* [] on <var1:AbstractArrayRead[nullable Object]>*/;
@@ -2925,12 +2582,14 @@ short int var4 /* : Bool */;
 short int var6 /* : Bool */;
 int cltype;
 int idtype;
+const char* var_class_name;
 short int var7 /* : Bool */;
 var1 = self->attrs[COLOR_array__ArrayIterator___index].l; /* _index on <self:ArrayIterator[nullable Object]> */
 var2 = self->attrs[COLOR_array__ArrayIterator___array].val; /* _array on <self:ArrayIterator[nullable Object]> */
 if (var2 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 428);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 364);
+show_backtrace(1);
 }
 var3 = ((long (*)(val*))(var2->class->vft[COLOR_abstract_collection__Collection__length]))(var2) /* length on <var2:AbstractArrayRead[nullable Object]>*/;
 { /* Inline kernel#Int#< (var1,var3) */
@@ -2938,8 +2597,10 @@ var3 = ((long (*)(val*))(var2->class->vft[COLOR_abstract_collection__Collection_
 /* <var3:Int> isa OTHER */
 var6 = 1; /* easy <var3:Int> isa OTHER*/
 if (!var6) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
+var_class_name = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
 }
 var7 = var1 < var3;
 var4 = var7;
@@ -2990,6 +2651,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_a /* var a: AbstractArrayRead[nullable Object] */;
 long var1 /* : Int */;
 /* Covariant cast for argument 0 (a) <p0:AbstractArrayRead[nullable Object]> isa AbstractArrayRead[ArrayIterator#0] */
@@ -3003,8 +2665,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 432);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "AbstractArrayRead[ArrayIterator#0]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 368);
+show_backtrace(1);
 }
 var_a = p0;
 self->attrs[COLOR_array__ArrayIterator___array].val = var_a; /* _array on <self:ArrayIterator[nullable Object]> */
@@ -3042,6 +2706,7 @@ short int var1 /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_e /* var e: Object */;
 val* var2 /* : Array[Object] */;
 short int var3 /* : Bool */;
@@ -3056,14 +2721,17 @@ var1 = 0;
 var1 = p0->type->type_table[cltype] == idtype;
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 451);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Collection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 387);
+show_backtrace(1);
 }
 var_e = p0;
 var2 = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var2 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 451);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 387);
+show_backtrace(1);
 }
 var3 = ((short int (*)(val*, val*))(var2->class->vft[COLOR_abstract_collection__Collection__has]))(var2, var_e) /* has on <var2:Array[Object]>*/;
 var = var3;
@@ -3086,6 +2754,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_e /* var e: Object */;
 val* var1 /* : Array[Object] */;
 short int var2 /* : Bool */;
@@ -3102,22 +2771,26 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 453);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "SimpleCollection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 389);
+show_backtrace(1);
 }
 var_e = p0;
 var1 = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 453);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 389);
+show_backtrace(1);
 }
 var2 = ((short int (*)(val*, val*))(var1->class->vft[COLOR_abstract_collection__Collection__has]))(var1, var_e) /* has on <var1:Array[Object]>*/;
 var3 = !var2;
 if (var3){
 var4 = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var4 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 453);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 389);
+show_backtrace(1);
 }
 ((void (*)(val*, val*))(var4->class->vft[COLOR_abstract_collection__SimpleCollection__add]))(var4, var_e) /* add on <var4:Array[Object]>*/;
 } else {
@@ -3136,8 +2809,9 @@ val* var1 /* : Array[Object] */;
 short int var2 /* : Bool */;
 var1 = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 455);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 391);
+show_backtrace(1);
 }
 var2 = ((short int (*)(val*))(var1->class->vft[COLOR_abstract_collection__Collection__is_empty]))(var1) /* is_empty on <var1:Array[Object]>*/;
 var = var2;
@@ -3161,8 +2835,9 @@ val* var1 /* : Array[Object] */;
 long var2 /* : Int */;
 var1 = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 457);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 393);
+show_backtrace(1);
 }
 var2 = ((long (*)(val*))(var1->class->vft[COLOR_abstract_collection__Collection__length]))(var1) /* length on <var1:Array[Object]>*/;
 var = var2;
@@ -3189,13 +2864,15 @@ short int var4 /* : Bool */;
 short int var6 /* : Bool */;
 int cltype;
 int idtype;
+const char* var_class_name;
 short int var7 /* : Bool */;
 val* var8 /* : Array[Object] */;
 val* var9 /* : nullable Object */;
 var1 = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 461);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 397);
+show_backtrace(1);
 }
 var2 = ((long (*)(val*))(var1->class->vft[COLOR_abstract_collection__Collection__length]))(var1) /* length on <var1:Array[Object]>*/;
 var3 = 0;
@@ -3204,8 +2881,10 @@ var3 = 0;
 /* <var3:Int> isa OTHER */
 var6 = 1; /* easy <var3:Int> isa OTHER*/
 if (!var6) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 259);
-exit(1);
+var_class_name = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 267);
+show_backtrace(1);
 }
 var7 = var2 > var3;
 var4 = var7;
@@ -3213,13 +2892,15 @@ goto RET_LABEL5;
 RET_LABEL5:(void)0;
 }
 if (!var4) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Assert failed", "lib/standard/collection/array.nit", 461);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Assert failed");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 397);
+show_backtrace(1);
 }
 var8 = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var8 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 462);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 398);
+show_backtrace(1);
 }
 var9 = ((val* (*)(val*))(var8->class->vft[COLOR_abstract_collection__Collection__first]))(var8) /* first on <var8:Array[Object]>*/;
 var = var9;
@@ -3242,6 +2923,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_item /* var item: Object */;
 val* var1 /* : Array[Object] */;
 long var2 /* : Int */;
@@ -3251,7 +2933,8 @@ short int var4 /* : Bool */;
 short int var6 /* : Bool */;
 int cltype7;
 int idtype8;
-short int var9 /* : Bool */;
+const char* var_class_name9;
+short int var10 /* : Bool */;
 /* Covariant cast for argument 0 (item) <p0:Object> isa RemovableCollection#0 */
 /* <p0:Object> isa RemovableCollection#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__RemovableCollection_FT0];
@@ -3263,14 +2946,17 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 465);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "RemovableCollection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 401);
+show_backtrace(1);
 }
 var_item = p0;
 var1 = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 467);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 403);
+show_backtrace(1);
 }
 var2 = ((long (*)(val*, val*))(var1->class->vft[COLOR_abstract_collection__SequenceRead__index_of]))(var1, var_item) /* index_of on <var1:Array[Object]>*/;
 var_i = var2;
@@ -3280,11 +2966,13 @@ var3 = 0;
 /* <var3:Int> isa OTHER */
 var6 = 1; /* easy <var3:Int> isa OTHER*/
 if (!var6) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name9 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name9);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var9 = var_i >= var3;
-var4 = var9;
+var10 = var_i >= var3;
+var4 = var10;
 goto RET_LABEL5;
 RET_LABEL5:(void)0;
 }
@@ -3305,6 +2993,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_item /* var item: Object */;
 /* Covariant cast for argument 0 (item) <p0:Object> isa RemovableCollection#0 */
 /* <p0:Object> isa RemovableCollection#0 */
@@ -3317,8 +3006,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 471);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "RemovableCollection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 407);
+show_backtrace(1);
 }
 var_item = p0;
 ((void (*)(val*, val*))(self->class->vft[COLOR_abstract_collection__RemovableCollection__remove]))(self, var_item) /* remove on <self:ArraySet[Object]>*/;
@@ -3334,8 +3025,9 @@ void array__ArraySet__clear(val* self) {
 val* var /* : Array[Object] */;
 var = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 473);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 409);
+show_backtrace(1);
 }
 ((void (*)(val*))(var->class->vft[COLOR_abstract_collection__RemovableCollection__clear]))(var) /* clear on <var:Array[Object]>*/;
 RET_LABEL:;
@@ -3354,12 +3046,12 @@ val* var3 /* : Iterator[nullable Object] */;
 var1 = NEW_array__ArraySetIterator(self->type->resolution_table->types[COLOR_array__ArraySetIteratorarray__ArraySet_FT0]);
 var2 = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var2 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 475);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 411);
+show_backtrace(1);
 }
 var3 = ((val* (*)(val*))(var2->class->vft[COLOR_abstract_collection__Collection__iterator]))(var2) /* iterator on <var2:Array[Object]>*/;
 ((void (*)(val*, val*))(var1->class->vft[COLOR_array__ArraySetIterator__init]))(var1, var3) /* init on <var1:ArraySetIterator[Object]>*/;
-CHECK_NEW_array__ArraySetIterator(var1);
 var = var1;
 goto RET_LABEL;
 RET_LABEL:;
@@ -3381,8 +3073,9 @@ val* var /* : Array[Object] */;
 var_cap = p0;
 var = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 478);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 414);
+show_backtrace(1);
 }
 ((void (*)(val*, long))(var->class->vft[COLOR_array__AbstractArray__enlarge]))(var, var_cap) /* enlarge on <var:Array[Object]>*/;
 RET_LABEL:;
@@ -3403,20 +3096,23 @@ val* var4 /* : nullable Object */;
 var_i = p0;
 var = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 482);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 418);
+show_backtrace(1);
 }
 var1 = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 482);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 418);
+show_backtrace(1);
 }
 var2 = ((val* (*)(val*))(var1->class->vft[COLOR_abstract_collection__SequenceRead__last]))(var1) /* last on <var1:Array[Object]>*/;
 ((void (*)(val*, long, val*))(var->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(var, var_i, var2) /* []= on <var:Array[Object]>*/;
 var3 = self->attrs[COLOR_array__ArraySet___array].val; /* _array on <self:ArraySet[Object]> */
 if (var3 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _array", "lib/standard/collection/array.nit", 483);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _array");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 419);
+show_backtrace(1);
 }
 var4 = ((val* (*)(val*))(var3->class->vft[COLOR_abstract_collection__Sequence__pop]))(var3) /* pop on <var3:Array[Object]>*/;
 var4;
@@ -3432,7 +3128,6 @@ void array__ArraySet__init(val* self) {
 val* var /* : Array[Object] */;
 var = NEW_array__Array(self->type->resolution_table->types[COLOR_array__Arrayarray__ArraySet_FT0]);
 ((void (*)(val*))(var->class->vft[COLOR_array__Array__init]))(var) /* init on <var:Array[Object]>*/;
-CHECK_NEW_array__Array(var);
 self->attrs[COLOR_array__ArraySet___array].val = var; /* _array on <self:ArraySet[Object]> */
 RET_LABEL:;
 }
@@ -3448,7 +3143,6 @@ val* var /* : Array[Object] */;
 var_i = p0;
 var = NEW_array__Array(self->type->resolution_table->types[COLOR_array__Arrayarray__ArraySet_FT0]);
 ((void (*)(val*, long))(var->class->vft[COLOR_array__Array__with_capacity]))(var, var_i) /* with_capacity on <var:Array[Object]>*/;
-CHECK_NEW_array__Array(var);
 self->attrs[COLOR_array__ArraySet___array].val = var; /* _array on <self:ArraySet[Object]> */
 RET_LABEL:;
 }
@@ -3464,8 +3158,9 @@ val* var1 /* : ArrayIterator[Object] */;
 short int var2 /* : Bool */;
 var1 = self->attrs[COLOR_array__ArraySetIterator___iter].val; /* _iter on <self:ArraySetIterator[Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _iter", "lib/standard/collection/array.nit", 497);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _iter");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 433);
+show_backtrace(1);
 }
 var2 = ((short int (*)(val*))(var1->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var1) /* is_ok on <var1:ArrayIterator[Object]>*/;
 var = var2;
@@ -3487,8 +3182,9 @@ void array__ArraySetIterator__next(val* self) {
 val* var /* : ArrayIterator[Object] */;
 var = self->attrs[COLOR_array__ArraySetIterator___iter].val; /* _iter on <self:ArraySetIterator[Object]> */
 if (var == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _iter", "lib/standard/collection/array.nit", 499);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _iter");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 435);
+show_backtrace(1);
 }
 ((void (*)(val*))(var->class->vft[COLOR_abstract_collection__Iterator__next]))(var) /* next on <var:ArrayIterator[Object]>*/;
 RET_LABEL:;
@@ -3505,8 +3201,9 @@ val* var1 /* : ArrayIterator[Object] */;
 val* var2 /* : nullable Object */;
 var1 = self->attrs[COLOR_array__ArraySetIterator___iter].val; /* _iter on <self:ArraySetIterator[Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _iter", "lib/standard/collection/array.nit", 501);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _iter");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 437);
+show_backtrace(1);
 }
 var2 = ((val* (*)(val*))(var1->class->vft[COLOR_abstract_collection__Iterator__item]))(var1) /* item on <var1:ArrayIterator[Object]>*/;
 var = var2;
@@ -3529,6 +3226,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_iter /* var iter: ArrayIterator[Object] */;
 /* Covariant cast for argument 0 (iter) <p0:ArrayIterator[Object]> isa ArrayIterator[ArraySetIterator#0] */
 /* <p0:ArrayIterator[Object]> isa ArrayIterator[ArraySetIterator#0] */
@@ -3541,8 +3239,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 503);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "ArrayIterator[ArraySetIterator#0]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 439);
+show_backtrace(1);
 }
 var_iter = p0;
 self->attrs[COLOR_array__ArraySetIterator___iter].val = var_iter; /* _iter on <self:ArraySetIterator[Object]> */
@@ -3560,6 +3260,7 @@ short int var1 /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_key /* var key: Object */;
 long var2 /* : Int */;
 long var_i /* var i: Int */;
@@ -3568,10 +3269,12 @@ short int var4 /* : Bool */;
 short int var6 /* : Bool */;
 int cltype7;
 int idtype8;
-short int var9 /* : Bool */;
-val* var10 /* : Array[Couple[Object, nullable Object]] */;
-val* var11 /* : nullable Object */;
+const char* var_class_name9;
+short int var10 /* : Bool */;
+val* var11 /* : Array[Couple[Object, nullable Object]] */;
 val* var12 /* : nullable Object */;
+val* var13 /* : nullable Object */;
+val* var14 /* : nullable Object */;
 /* Covariant cast for argument 0 (key) <p0:Object> isa MapRead#0 */
 /* <p0:Object> isa MapRead#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__MapRead_FT0];
@@ -3583,8 +3286,10 @@ var1 = 0;
 var1 = p0->type->type_table[cltype] == idtype;
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 513);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "MapRead#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 449);
+show_backtrace(1);
 }
 var_key = p0;
 var2 = ((long (*)(val*, val*))(self->class->vft[COLOR_array__ArrayMap__index]))(self, var_key) /* index on <self:ArrayMap[Object, nullable Object]>*/;
@@ -3595,27 +3300,31 @@ var3 = 0;
 /* <var3:Int> isa OTHER */
 var6 = 1; /* easy <var3:Int> isa OTHER*/
 if (!var6) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name9 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name9);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var9 = var_i >= var3;
-var4 = var9;
+var10 = var_i >= var3;
+var4 = var10;
 goto RET_LABEL5;
 RET_LABEL5:(void)0;
 }
 if (var4){
-var10 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
-if (var10 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 518);
-exit(1);
+var11 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
+if (var11 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 454);
+show_backtrace(1);
 }
-var11 = ((val* (*)(val*, long))(var10->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var10, var_i) /* [] on <var10:Array[Couple[Object, nullable Object]]>*/;
-var12 = ((val* (*)(val*))(var11->class->vft[COLOR_abstract_collection__Couple__second]))(var11) /* second on <var11:nullable Object(Couple[Object, nullable Object])>*/;
-var = var12;
+var12 = ((val* (*)(val*, long))(var11->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var11, var_i) /* [] on <var11:Array[Couple[Object, nullable Object]]>*/;
+var13 = ((val* (*)(val*))(var12->class->vft[COLOR_abstract_collection__Couple__second]))(var12) /* second on <var12:nullable Object(Couple[Object, nullable Object])>*/;
+var = var13;
 goto RET_LABEL;
 } else {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Aborted", "lib/standard/collection/array.nit", 520);
-exit(1);
+var14 = ((val* (*)(val*, val*))(self->class->vft[COLOR_abstract_collection__MapRead__provide_default_value]))(self, var_key) /* provide_default_value on <self:ArrayMap[Object, nullable Object]>*/;
+var = var14;
+goto RET_LABEL;
 }
 RET_LABEL:;
 return var;
@@ -3635,25 +3344,28 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 short int var1 /* : Bool */;
 int cltype2;
 int idtype3;
 const struct type* type_struct4;
 short int is_nullable;
+const char* var_class_name5;
 val* var_key /* var key: Object */;
 val* var_item /* var item: nullable Object */;
-long var5 /* : Int */;
-long var_i /* var i: Int */;
 long var6 /* : Int */;
-short int var7 /* : Bool */;
-short int var9 /* : Bool */;
-int cltype10;
-int idtype11;
-short int var12 /* : Bool */;
-val* var13 /* : Array[Couple[Object, nullable Object]] */;
-val* var14 /* : nullable Object */;
+long var_i /* var i: Int */;
+long var7 /* : Int */;
+short int var8 /* : Bool */;
+short int var10 /* : Bool */;
+int cltype11;
+int idtype12;
+const char* var_class_name13;
+short int var14 /* : Bool */;
 val* var15 /* : Array[Couple[Object, nullable Object]] */;
-val* var16 /* : Couple[Object, nullable Object] */;
+val* var16 /* : nullable Object */;
+val* var17 /* : Array[Couple[Object, nullable Object]] */;
+val* var18 /* : Couple[Object, nullable Object] */;
 /* Covariant cast for argument 0 (key) <p0:Object> isa Map#0 */
 /* <p0:Object> isa Map#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__Map_FT0];
@@ -3665,8 +3377,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 524);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Map#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 460);
+show_backtrace(1);
 }
 /* Covariant cast for argument 1 (item) <p1:nullable Object> isa Map#1 */
 /* <p1:nullable Object> isa Map#1 */
@@ -3684,45 +3398,50 @@ var1 = p1->type->type_table[cltype2] == idtype3;
 }
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 524);
-exit(1);
+var_class_name5 = p1 == NULL ? "null" : p1->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Map#1", var_class_name5);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 460);
+show_backtrace(1);
 }
 var_key = p0;
 var_item = p1;
-var5 = ((long (*)(val*, val*))(self->class->vft[COLOR_array__ArrayMap__index]))(self, var_key) /* index on <self:ArrayMap[Object, nullable Object]>*/;
-var_i = var5;
-var6 = 0;
-{ /* Inline kernel#Int#>= (var_i,var6) */
-/* Covariant cast for argument 0 (i) <var6:Int> isa OTHER */
-/* <var6:Int> isa OTHER */
-var9 = 1; /* easy <var6:Int> isa OTHER*/
-if (!var9) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
-}
-var12 = var_i >= var6;
-var7 = var12;
-goto RET_LABEL8;
-RET_LABEL8:(void)0;
+var6 = ((long (*)(val*, val*))(self->class->vft[COLOR_array__ArrayMap__index]))(self, var_key) /* index on <self:ArrayMap[Object, nullable Object]>*/;
+var_i = var6;
+var7 = 0;
+{ /* Inline kernel#Int#>= (var_i,var7) */
+/* Covariant cast for argument 0 (i) <var7:Int> isa OTHER */
+/* <var7:Int> isa OTHER */
+var10 = 1; /* easy <var7:Int> isa OTHER*/
+if (!var10) {
+var_class_name13 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name13);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-if (var7){
-var13 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
-if (var13 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 529);
-exit(1);
+var14 = var_i >= var7;
+var8 = var14;
+goto RET_LABEL9;
+RET_LABEL9:(void)0;
 }
-var14 = ((val* (*)(val*, long))(var13->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var13, var_i) /* [] on <var13:Array[Couple[Object, nullable Object]]>*/;
-((void (*)(val*, val*))(var14->class->vft[COLOR_abstract_collection__Couple__second_61d]))(var14, var_item) /* second= on <var14:nullable Object(Couple[Object, nullable Object])>*/;
-} else {
+if (var8){
 var15 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
 if (var15 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 531);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 465);
+show_backtrace(1);
+}
+var16 = ((val* (*)(val*, long))(var15->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var15, var_i) /* [] on <var15:Array[Couple[Object, nullable Object]]>*/;
+((void (*)(val*, val*))(var16->class->vft[COLOR_abstract_collection__Couple__second_61d]))(var16, var_item) /* second= on <var16:nullable Object(Couple[Object, nullable Object])>*/;
+} else {
+var17 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
+if (var17 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 467);
+show_backtrace(1);
 }
-var16 = NEW_abstract_collection__Couple(self->type->resolution_table->types[COLOR_abstract_collection__Couplearray__ArrayMap_FT0array__ArrayMap_FT1]);
-((void (*)(val*, val*, val*))(var16->class->vft[COLOR_abstract_collection__Couple__init]))(var16, var_key, var_item) /* init on <var16:Couple[Object, nullable Object]>*/;
-CHECK_NEW_abstract_collection__Couple(var16);
-((void (*)(val*, val*))(var15->class->vft[COLOR_abstract_collection__Sequence__push]))(var15, var16) /* push on <var15:Array[Couple[Object, nullable Object]]>*/;
+var18 = NEW_abstract_collection__Couple(self->type->resolution_table->types[COLOR_abstract_collection__Couplearray__ArrayMap_FT0array__ArrayMap_FT1]);
+((void (*)(val*, val*, val*))(var18->class->vft[COLOR_abstract_collection__Couple__init]))(var18, var_key, var_item) /* init on <var18:Couple[Object, nullable Object]>*/;
+((void (*)(val*, val*))(var17->class->vft[COLOR_abstract_collection__Sequence__push]))(var17, var18) /* push on <var17:Array[Couple[Object, nullable Object]]>*/;
 }
 RET_LABEL:;
 }
@@ -3737,8 +3456,9 @@ val* var /* : ArrayMapKeys[Object, nullable Object] */;
 val* var1 /* : ArrayMapKeys[Object, nullable Object] */;
 var1 = self->attrs[COLOR_array__ArrayMap___64dkeys].val; /* @keys on <self:ArrayMap[Object, nullable Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute @keys", "lib/standard/collection/array.nit", 535);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute @keys");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 471);
+show_backtrace(1);
 }
 var = var1;
 RET_LABEL:;
@@ -3759,6 +3479,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 /* Covariant cast for argument 0 (keys) <p0:ArrayMapKeys[Object, nullable Object]> isa ArrayMapKeys[ArrayMap#0, ArrayMap#1] */
 /* <p0:ArrayMapKeys[Object, nullable Object]> isa ArrayMapKeys[ArrayMap#0, ArrayMap#1] */
 type_struct = self->type->resolution_table->types[COLOR_array__ArrayMapKeysarray__ArrayMap_FT0array__ArrayMap_FT1];
@@ -3770,8 +3491,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 535);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "ArrayMapKeys[ArrayMap#0, ArrayMap#1]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 471);
+show_backtrace(1);
 }
 self->attrs[COLOR_array__ArrayMap___64dkeys].val = p0; /* @keys on <self:ArrayMap[Object, nullable Object]> */
 RET_LABEL:;
@@ -3787,8 +3510,9 @@ val* var /* : ArrayMapValues[Object, nullable Object] */;
 val* var1 /* : ArrayMapValues[Object, nullable Object] */;
 var1 = self->attrs[COLOR_array__ArrayMap___64dvalues].val; /* @values on <self:ArrayMap[Object, nullable Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute @values", "lib/standard/collection/array.nit", 536);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute @values");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 472);
+show_backtrace(1);
 }
 var = var1;
 RET_LABEL:;
@@ -3809,6 +3533,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 /* Covariant cast for argument 0 (values) <p0:ArrayMapValues[Object, nullable Object]> isa ArrayMapValues[ArrayMap#0, ArrayMap#1] */
 /* <p0:ArrayMapValues[Object, nullable Object]> isa ArrayMapValues[ArrayMap#0, ArrayMap#1] */
 type_struct = self->type->resolution_table->types[COLOR_array__ArrayMapValuesarray__ArrayMap_FT0array__ArrayMap_FT1];
@@ -3820,8 +3545,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 536);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "ArrayMapValues[ArrayMap#0, ArrayMap#1]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 472);
+show_backtrace(1);
 }
 self->attrs[COLOR_array__ArrayMap___64dvalues].val = p0; /* @values on <self:ArrayMap[Object, nullable Object]> */
 RET_LABEL:;
@@ -3838,8 +3565,9 @@ val* var1 /* : Array[Couple[Object, nullable Object]] */;
 long var2 /* : Int */;
 var1 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 539);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 475);
+show_backtrace(1);
 }
 var2 = ((long (*)(val*))(var1->class->vft[COLOR_abstract_collection__Collection__length]))(var1) /* length on <var1:Array[Couple[Object, nullable Object]]>*/;
 var = var2;
@@ -3865,12 +3593,12 @@ val* var3 /* : Iterator[nullable Object] */;
 var1 = NEW_abstract_collection__CoupleMapIterator(self->type->resolution_table->types[COLOR_abstract_collection__CoupleMapIteratorarray__ArrayMap_FT0array__ArrayMap_FT1]);
 var2 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
 if (var2 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 541);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 477);
+show_backtrace(1);
 }
 var3 = ((val* (*)(val*))(var2->class->vft[COLOR_abstract_collection__Collection__iterator]))(var2) /* iterator on <var2:Array[Couple[Object, nullable Object]]>*/;
 ((void (*)(val*, val*))(var1->class->vft[COLOR_abstract_collection__CoupleMapIterator__init]))(var1, var3) /* init on <var1:CoupleMapIterator[Object, nullable Object]>*/;
-CHECK_NEW_abstract_collection__CoupleMapIterator(var1);
 var = var1;
 goto RET_LABEL;
 RET_LABEL:;
@@ -3892,8 +3620,9 @@ val* var1 /* : Array[Couple[Object, nullable Object]] */;
 short int var2 /* : Bool */;
 var1 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 543);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 479);
+show_backtrace(1);
 }
 var2 = ((short int (*)(val*))(var1->class->vft[COLOR_abstract_collection__Collection__is_empty]))(var1) /* is_empty on <var1:Array[Couple[Object, nullable Object]]>*/;
 var = var2;
@@ -3915,8 +3644,9 @@ void array__ArrayMap__clear(val* self) {
 val* var /* : Array[Couple[Object, nullable Object]] */;
 var = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
 if (var == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 545);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 481);
+show_backtrace(1);
 }
 ((void (*)(val*))(var->class->vft[COLOR_abstract_collection__RemovableCollection__clear]))(var) /* clear on <var:Array[Couple[Object, nullable Object]]>*/;
 RET_LABEL:;
@@ -3933,8 +3663,9 @@ val* var /* : Array[Couple[Object, nullable Object]] */;
 var_cap = p0;
 var = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
 if (var == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 548);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 484);
+show_backtrace(1);
 }
 ((void (*)(val*, long))(var->class->vft[COLOR_array__AbstractArray__enlarge]))(var, var_cap) /* enlarge on <var:Array[Couple[Object, nullable Object]]>*/;
 RET_LABEL:;
@@ -3951,6 +3682,7 @@ short int var1 /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_key /* var key: Object */;
 long var2 /* : Int */;
 long var_i /* var i: Int */;
@@ -3959,10 +3691,11 @@ short int var4 /* : Bool */;
 short int var6 /* : Bool */;
 int cltype7;
 int idtype8;
-short int var9 /* : Bool */;
-val* var10 /* : Array[Couple[Object, nullable Object]] */;
-val* var11 /* : nullable Object */;
-val* var12 /* : null */;
+const char* var_class_name9;
+short int var10 /* : Bool */;
+val* var11 /* : Array[Couple[Object, nullable Object]] */;
+val* var12 /* : nullable Object */;
+val* var13 /* : null */;
 /* Covariant cast for argument 0 (key) <p0:Object> isa CoupleMap#0 */
 /* <p0:Object> isa CoupleMap#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__CoupleMap_FT0];
@@ -3974,8 +3707,10 @@ var1 = 0;
 var1 = p0->type->type_table[cltype] == idtype;
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 550);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "CoupleMap#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 486);
+show_backtrace(1);
 }
 var_key = p0;
 var2 = ((long (*)(val*, val*))(self->class->vft[COLOR_array__ArrayMap__index]))(self, var_key) /* index on <self:ArrayMap[Object, nullable Object]>*/;
@@ -3986,26 +3721,29 @@ var3 = 0;
 /* <var3:Int> isa OTHER */
 var6 = 1; /* easy <var3:Int> isa OTHER*/
 if (!var6) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name9 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name9);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var9 = var_i >= var3;
-var4 = var9;
+var10 = var_i >= var3;
+var4 = var10;
 goto RET_LABEL5;
 RET_LABEL5:(void)0;
 }
 if (var4){
-var10 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
-if (var10 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 554);
-exit(1);
+var11 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
+if (var11 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 490);
+show_backtrace(1);
 }
-var11 = ((val* (*)(val*, long))(var10->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var10, var_i) /* [] on <var10:Array[Couple[Object, nullable Object]]>*/;
-var = var11;
+var12 = ((val* (*)(val*, long))(var11->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var11, var_i) /* [] on <var11:Array[Couple[Object, nullable Object]]>*/;
+var = var12;
 goto RET_LABEL;
 } else {
-var12 = NULL;
-var = var12;
+var13 = NULL;
+var = var13;
 goto RET_LABEL;
 }
 RET_LABEL:;
@@ -4031,20 +3769,23 @@ val* var4 /* : nullable Object */;
 var_i = p0;
 var = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
 if (var == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 566);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 502);
+show_backtrace(1);
 }
 var1 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 566);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 502);
+show_backtrace(1);
 }
 var2 = ((val* (*)(val*))(var1->class->vft[COLOR_abstract_collection__SequenceRead__last]))(var1) /* last on <var1:Array[Couple[Object, nullable Object]]>*/;
 ((void (*)(val*, long, val*))(var->class->vft[COLOR_abstract_collection__Sequence___91d_93d_61d]))(var, var_i, var2) /* []= on <var:Array[Couple[Object, nullable Object]]>*/;
 var3 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
 if (var3 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 567);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 503);
+show_backtrace(1);
 }
 var4 = ((val* (*)(val*))(var3->class->vft[COLOR_abstract_collection__Sequence__pop]))(var3) /* pop on <var3:Array[Couple[Object, nullable Object]]>*/;
 var4;
@@ -4062,6 +3803,7 @@ short int var1 /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_key /* var key: Object */;
 long var2 /* : Int */;
 long var_l /* var l: Int */;
@@ -4072,31 +3814,33 @@ short int var6 /* : Bool */;
 short int var8 /* : Bool */;
 int cltype9;
 int idtype10;
-short int var11 /* : Bool */;
+const char* var_class_name11;
+short int var12 /* : Bool */;
 short int var_ /* var : Bool */;
-val* var12 /* : Array[Couple[Object, nullable Object]] */;
-val* var13 /* : nullable Object */;
+val* var13 /* : Array[Couple[Object, nullable Object]] */;
 val* var14 /* : nullable Object */;
-short int var15 /* : Bool */;
-long var16 /* : Int */;
+val* var15 /* : nullable Object */;
+short int var16 /* : Bool */;
+long var17 /* : Int */;
 long var_i /* var i: Int */;
-val* var17 /* : Array[Couple[Object, nullable Object]] */;
-long var18 /* : Int */;
-short int var19 /* : Bool */;
-short int var21 /* : Bool */;
-int cltype22;
-int idtype23;
-short int var24 /* : Bool */;
-val* var25 /* : Array[Couple[Object, nullable Object]] */;
-val* var26 /* : nullable Object */;
-val* var27 /* : nullable Object */;
-short int var28 /* : Bool */;
-long var29 /* : Int */;
-long var30 /* : Int */;
+val* var18 /* : Array[Couple[Object, nullable Object]] */;
+long var19 /* : Int */;
+short int var20 /* : Bool */;
+short int var22 /* : Bool */;
+int cltype23;
+int idtype24;
+const char* var_class_name25;
+short int var26 /* : Bool */;
+val* var27 /* : Array[Couple[Object, nullable Object]] */;
+val* var28 /* : nullable Object */;
+val* var29 /* : nullable Object */;
+short int var30 /* : Bool */;
+long var31 /* : Int */;
 long var32 /* : Int */;
-long var33 /* : Int */;
 long var34 /* : Int */;
+long var35 /* : Int */;
 long var36 /* : Int */;
+long var38 /* : Int */;
 /* Covariant cast for argument 0 (key) <p0:Object> isa ArrayMap#0 */
 /* <p0:Object> isa ArrayMap#0 */
 type_struct = self->type->resolution_table->types[COLOR_array__ArrayMap_FT0];
@@ -4108,16 +3852,19 @@ var1 = 0;
 var1 = p0->type->type_table[cltype] == idtype;
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 573);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "ArrayMap#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 509);
+show_backtrace(1);
 }
 var_key = p0;
 var2 = self->attrs[COLOR_array__ArrayMap___last_index].l; /* _last_index on <self:ArrayMap[Object, nullable Object]> */
 var_l = var2;
 var4 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
 if (var4 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 578);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 514);
+show_backtrace(1);
 }
 var5 = ((long (*)(val*))(var4->class->vft[COLOR_abstract_collection__Collection__length]))(var4) /* length on <var4:Array[Couple[Object, nullable Object]]>*/;
 { /* Inline kernel#Int#< (var_l,var5) */
@@ -4125,25 +3872,28 @@ var5 = ((long (*)(val*))(var4->class->vft[COLOR_abstract_collection__Collection_
 /* <var5:Int> isa OTHER */
 var8 = 1; /* easy <var5:Int> isa OTHER*/
 if (!var8) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
+var_class_name11 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name11);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
 }
-var11 = var_l < var5;
-var6 = var11;
+var12 = var_l < var5;
+var6 = var12;
 goto RET_LABEL7;
 RET_LABEL7:(void)0;
 }
 var_ = var6;
 if (var6){
-var12 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
-if (var12 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 578);
-exit(1);
+var13 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
+if (var13 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 514);
+show_backtrace(1);
 }
-var13 = ((val* (*)(val*, long))(var12->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var12, var_l) /* [] on <var12:Array[Couple[Object, nullable Object]]>*/;
-var14 = ((val* (*)(val*))(var13->class->vft[COLOR_abstract_collection__Couple__first]))(var13) /* first on <var13:nullable Object(Couple[Object, nullable Object])>*/;
-var15 = ((short int (*)(val*, val*))(var14->class->vft[COLOR_kernel__Object___61d_61d]))(var14, var_key) /* == on <var14:nullable Object(Object)>*/;
-var3 = var15;
+var14 = ((val* (*)(val*, long))(var13->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var13, var_l) /* [] on <var13:Array[Couple[Object, nullable Object]]>*/;
+var15 = ((val* (*)(val*))(var14->class->vft[COLOR_abstract_collection__Couple__first]))(var14) /* first on <var14:nullable Object(Couple[Object, nullable Object])>*/;
+var16 = ((short int (*)(val*, val*))(var15->class->vft[COLOR_kernel__Object___61d_61d]))(var15, var_key) /* == on <var15:nullable Object(Object)>*/;
+var3 = var16;
 } else {
 var3 = var_;
 }
@@ -4152,62 +3902,66 @@ var = var_l;
 goto RET_LABEL;
 } else {
 }
-var16 = 0;
-var_i = var16;
+var17 = 0;
+var_i = var17;
 for(;;) {
-var17 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
-if (var17 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 581);
-exit(1);
-}
-var18 = ((long (*)(val*))(var17->class->vft[COLOR_abstract_collection__Collection__length]))(var17) /* length on <var17:Array[Couple[Object, nullable Object]]>*/;
-{ /* Inline kernel#Int#< (var_i,var18) */
-/* Covariant cast for argument 0 (i) <var18:Int> isa OTHER */
-/* <var18:Int> isa OTHER */
-var21 = 1; /* easy <var18:Int> isa OTHER*/
-if (!var21) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 257);
-exit(1);
-}
-var24 = var_i < var18;
-var19 = var24;
-goto RET_LABEL20;
-RET_LABEL20:(void)0;
-}
-if (!var19) break;
-var25 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
-if (var25 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 582);
-exit(1);
+var18 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
+if (var18 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 517);
+show_backtrace(1);
+}
+var19 = ((long (*)(val*))(var18->class->vft[COLOR_abstract_collection__Collection__length]))(var18) /* length on <var18:Array[Couple[Object, nullable Object]]>*/;
+{ /* Inline kernel#Int#< (var_i,var19) */
+/* Covariant cast for argument 0 (i) <var19:Int> isa OTHER */
+/* <var19:Int> isa OTHER */
+var22 = 1; /* easy <var19:Int> isa OTHER*/
+if (!var22) {
+var_class_name25 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name25);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 265);
+show_backtrace(1);
+}
+var26 = var_i < var19;
+var20 = var26;
+goto RET_LABEL21;
+RET_LABEL21:(void)0;
 }
-var26 = ((val* (*)(val*, long))(var25->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var25, var_i) /* [] on <var25:Array[Couple[Object, nullable Object]]>*/;
-var27 = ((val* (*)(val*))(var26->class->vft[COLOR_abstract_collection__Couple__first]))(var26) /* first on <var26:nullable Object(Couple[Object, nullable Object])>*/;
-var28 = ((short int (*)(val*, val*))(var27->class->vft[COLOR_kernel__Object___61d_61d]))(var27, var_key) /* == on <var27:nullable Object(Object)>*/;
-if (var28){
+if (!var20) break;
+var27 = self->attrs[COLOR_array__ArrayMap___items].val; /* _items on <self:ArrayMap[Object, nullable Object]> */
+if (var27 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 518);
+show_backtrace(1);
+}
+var28 = ((val* (*)(val*, long))(var27->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var27, var_i) /* [] on <var27:Array[Couple[Object, nullable Object]]>*/;
+var29 = ((val* (*)(val*))(var28->class->vft[COLOR_abstract_collection__Couple__first]))(var28) /* first on <var28:nullable Object(Couple[Object, nullable Object])>*/;
+var30 = ((short int (*)(val*, val*))(var29->class->vft[COLOR_kernel__Object___61d_61d]))(var29, var_key) /* == on <var29:nullable Object(Object)>*/;
+if (var30){
 self->attrs[COLOR_array__ArrayMap___last_index].l = var_i; /* _last_index on <self:ArrayMap[Object, nullable Object]> */
 var = var_i;
 goto RET_LABEL;
 } else {
 }
-var29 = 1;
-{ /* Inline kernel#Int#+ (var_i,var29) */
-var32 = var_i + var29;
-var30 = var32;
-goto RET_LABEL31;
-RET_LABEL31:(void)0;
+var31 = 1;
+{ /* Inline kernel#Int#+ (var_i,var31) */
+var34 = var_i + var31;
+var32 = var34;
+goto RET_LABEL33;
+RET_LABEL33:(void)0;
 }
-var_i = var30;
+var_i = var32;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
-var33 = 1;
-{ /* Inline kernel#Int#unary - (var33) */
-var36 = -var33;
-var34 = var36;
-goto RET_LABEL35;
-RET_LABEL35:(void)0;
-}
-var = var34;
+var35 = 1;
+{ /* Inline kernel#Int#unary - (var35) */
+var38 = -var35;
+var36 = var38;
+goto RET_LABEL37;
+RET_LABEL37:(void)0;
+}
+var = var36;
 goto RET_LABEL;
 RET_LABEL:;
 return var;
@@ -4226,7 +3980,6 @@ void array__ArrayMap__init(val* self) {
 val* var /* : Array[Couple[Object, nullable Object]] */;
 var = NEW_array__Array(self->type->resolution_table->types[COLOR_array__Arrayabstract_collection__Couplearray__ArrayMap_FT0array__ArrayMap_FT1]);
 ((void (*)(val*))(var->class->vft[COLOR_array__Array__init]))(var) /* init on <var:Array[Couple[Object, nullable Object]]>*/;
-CHECK_NEW_array__Array(var);
 self->attrs[COLOR_array__ArrayMap___items].val = var; /* _items on <self:ArrayMap[Object, nullable Object]> */
 RET_LABEL:;
 }
@@ -4241,8 +3994,9 @@ val* var /* : ArrayMap[Object, nullable Object] */;
 val* var1 /* : ArrayMap[Object, nullable Object] */;
 var1 = self->attrs[COLOR_array__ArrayMapKeys___64dmap].val; /* @map on <self:ArrayMapKeys[Object, nullable Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute @map", "lib/standard/collection/array.nit", 600);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute @map");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 536);
+show_backtrace(1);
 }
 var = var1;
 RET_LABEL:;
@@ -4263,6 +4017,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 /* Covariant cast for argument 0 (map) <p0:ArrayMap[Object, nullable Object]> isa ArrayMap[ArrayMapKeys#0, ArrayMapKeys#1] */
 /* <p0:ArrayMap[Object, nullable Object]> isa ArrayMap[ArrayMapKeys#0, ArrayMapKeys#1] */
 type_struct = self->type->resolution_table->types[COLOR_array__ArrayMaparray__ArrayMapKeys_FT0array__ArrayMapKeys_FT1];
@@ -4274,8 +4029,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 600);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "ArrayMap[ArrayMapKeys#0, ArrayMapKeys#1]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 536);
+show_backtrace(1);
 }
 self->attrs[COLOR_array__ArrayMapKeys___64dmap].val = p0; /* @map on <self:ArrayMapKeys[Object, nullable Object]> */
 RET_LABEL:;
@@ -4292,6 +4049,7 @@ short int var1 /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_k /* var k: Object */;
 short int var2 /* : Bool */;
 long var3 /* : Int */;
@@ -4307,8 +4065,10 @@ var1 = 0;
 var1 = p0->type->type_table[cltype] == idtype;
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 602);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Collection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 538);
+show_backtrace(1);
 }
 var_k = p0;
 var2 = ((short int (*)(val*, val*))(self->class->vft[COLOR_abstract_collection__Collection__has]))(self, var_k) /* has on <self:ArrayMapKeys[Object, nullable Object]>*/;
@@ -4343,8 +4103,9 @@ val* var4 /* : nullable Object */;
 var1 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapKeys__map]))(self) /* map on <self:ArrayMapKeys[Object, nullable Object]>*/;
 var2 = var1->attrs[COLOR_array__ArrayMap___items].val; /* _items on <var1:ArrayMap[Object, nullable Object]> */
 if (var2 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 603);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 539);
+show_backtrace(1);
 }
 var3 = ((val* (*)(val*))(var2->class->vft[COLOR_abstract_collection__Collection__first]))(var2) /* first on <var2:Array[Couple[Object, nullable Object]]>*/;
 var4 = ((val* (*)(val*))(var3->class->vft[COLOR_abstract_collection__Couple__first]))(var3) /* first on <var3:nullable Object(Couple[Object, nullable Object])>*/;
@@ -4369,6 +4130,7 @@ short int var1 /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_k /* var k: Object */;
 val* var2 /* : ArrayMap[Object, nullable Object] */;
 long var3 /* : Int */;
@@ -4377,7 +4139,8 @@ short int var5 /* : Bool */;
 short int var7 /* : Bool */;
 int cltype8;
 int idtype9;
-short int var10 /* : Bool */;
+const char* var_class_name10;
+short int var11 /* : Bool */;
 /* Covariant cast for argument 0 (k) <p0:Object> isa Collection#0 */
 /* <p0:Object> isa Collection#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__Collection_FT0];
@@ -4389,8 +4152,10 @@ var1 = 0;
 var1 = p0->type->type_table[cltype] == idtype;
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 604);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Collection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 540);
+show_backtrace(1);
 }
 var_k = p0;
 var2 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapKeys__map]))(self) /* map on <self:ArrayMapKeys[Object, nullable Object]>*/;
@@ -4401,11 +4166,13 @@ var4 = 0;
 /* <var4:Int> isa OTHER */
 var7 = 1; /* easy <var4:Int> isa OTHER*/
 if (!var7) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name10 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name10);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var10 = var3 >= var4;
-var5 = var10;
+var11 = var3 >= var4;
+var5 = var11;
 goto RET_LABEL6;
 RET_LABEL6:(void)0;
 }
@@ -4430,6 +4197,7 @@ short int var1 /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_k /* var k: Object */;
 short int var2 /* : Bool */;
 short int var3 /* : Bool */;
@@ -4452,8 +4220,10 @@ var1 = 0;
 var1 = p0->type->type_table[cltype] == idtype;
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 605);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Collection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 541);
+show_backtrace(1);
 }
 var_k = p0;
 var4 = ((short int (*)(val*, val*))(self->class->vft[COLOR_abstract_collection__Collection__has]))(self, var_k) /* has on <self:ArrayMapKeys[Object, nullable Object]>*/;
@@ -4544,7 +4314,6 @@ var1 = NEW_abstract_collection__MapKeysIterator(self->type->resolution_table->ty
 var2 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapKeys__map]))(self) /* map on <self:ArrayMapKeys[Object, nullable Object]>*/;
 var3 = ((val* (*)(val*))(var2->class->vft[COLOR_abstract_collection__MapRead__iterator]))(var2) /* iterator on <var2:ArrayMap[Object, nullable Object]>*/;
 ((void (*)(val*, val*))(var1->class->vft[COLOR_abstract_collection__MapKeysIterator__init]))(var1, var3) /* init on <var1:MapKeysIterator[Object, nullable Object]>*/;
-CHECK_NEW_abstract_collection__MapKeysIterator(var1);
 var = var1;
 goto RET_LABEL;
 RET_LABEL:;
@@ -4577,6 +4346,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_key /* var key: Object */;
 val* var1 /* : ArrayMap[Object, nullable Object] */;
 long var2 /* : Int */;
@@ -4586,8 +4356,9 @@ short int var4 /* : Bool */;
 short int var6 /* : Bool */;
 int cltype7;
 int idtype8;
-short int var9 /* : Bool */;
-val* var10 /* : ArrayMap[Object, nullable Object] */;
+const char* var_class_name9;
+short int var10 /* : Bool */;
+val* var11 /* : ArrayMap[Object, nullable Object] */;
 /* Covariant cast for argument 0 (key) <p0:Object> isa RemovableCollection#0 */
 /* <p0:Object> isa RemovableCollection#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__RemovableCollection_FT0];
@@ -4599,8 +4370,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 610);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "RemovableCollection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 546);
+show_backtrace(1);
 }
 var_key = p0;
 var1 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapKeys__map]))(self) /* map on <self:ArrayMapKeys[Object, nullable Object]>*/;
@@ -4612,17 +4385,19 @@ var3 = 0;
 /* <var3:Int> isa OTHER */
 var6 = 1; /* easy <var3:Int> isa OTHER*/
 if (!var6) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name9 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name9);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var9 = var_i >= var3;
-var4 = var9;
+var10 = var_i >= var3;
+var4 = var10;
 goto RET_LABEL5;
 RET_LABEL5:(void)0;
 }
 if (var4){
-var10 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapKeys__map]))(self) /* map on <self:ArrayMapKeys[Object, nullable Object]>*/;
-((void (*)(val*, long))(var10->class->vft[COLOR_array__ArrayMap__remove_at_index]))(var10, var_i) /* remove_at_index on <var10:ArrayMap[Object, nullable Object]>*/;
+var11 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapKeys__map]))(self) /* map on <self:ArrayMapKeys[Object, nullable Object]>*/;
+((void (*)(val*, long))(var11->class->vft[COLOR_array__ArrayMap__remove_at_index]))(var11, var_i) /* remove_at_index on <var11:ArrayMap[Object, nullable Object]>*/;
 } else {
 }
 RET_LABEL:;
@@ -4638,6 +4413,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 val* var_key /* var key: Object */;
 /* Covariant cast for argument 0 (key) <p0:Object> isa RemovableCollection#0 */
 /* <p0:Object> isa RemovableCollection#0 */
@@ -4650,8 +4426,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 615);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "RemovableCollection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 551);
+show_backtrace(1);
 }
 var_key = p0;
 ((void (*)(val*, val*))(self->class->vft[COLOR_abstract_collection__RemovableCollection__remove]))(self, var_key) /* remove on <self:ArrayMapKeys[Object, nullable Object]>*/;
@@ -4668,6 +4446,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 /* Covariant cast for argument 0 (map) <p0:ArrayMap[Object, nullable Object]> isa ArrayMap[ArrayMapKeys#0, ArrayMapKeys#1] */
 /* <p0:ArrayMap[Object, nullable Object]> isa ArrayMap[ArrayMapKeys#0, ArrayMapKeys#1] */
 type_struct = self->type->resolution_table->types[COLOR_array__ArrayMaparray__ArrayMapKeys_FT0array__ArrayMapKeys_FT1];
@@ -4679,8 +4458,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 598);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "ArrayMap[ArrayMapKeys#0, ArrayMapKeys#1]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 534);
+show_backtrace(1);
 }
 self->attrs[COLOR_array__ArrayMapKeys___64dmap].val = p0; /* @map on <self:ArrayMapKeys[Object, nullable Object]> */
 RET_LABEL:;
@@ -4696,8 +4477,9 @@ val* var /* : ArrayMap[Object, nullable Object] */;
 val* var1 /* : ArrayMap[Object, nullable Object] */;
 var1 = self->attrs[COLOR_array__ArrayMapValues___64dmap].val; /* @map on <self:ArrayMapValues[Object, nullable Object]> */
 if (var1 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute @map", "lib/standard/collection/array.nit", 620);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute @map");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 556);
+show_backtrace(1);
 }
 var = var1;
 RET_LABEL:;
@@ -4718,6 +4500,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 /* Covariant cast for argument 0 (map) <p0:ArrayMap[Object, nullable Object]> isa ArrayMap[ArrayMapValues#0, ArrayMapValues#1] */
 /* <p0:ArrayMap[Object, nullable Object]> isa ArrayMap[ArrayMapValues#0, ArrayMapValues#1] */
 type_struct = self->type->resolution_table->types[COLOR_array__ArrayMaparray__ArrayMapValues_FT0array__ArrayMapValues_FT1];
@@ -4729,8 +4512,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 620);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "ArrayMap[ArrayMapValues#0, ArrayMapValues#1]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 556);
+show_backtrace(1);
 }
 self->attrs[COLOR_array__ArrayMapValues___64dmap].val = p0; /* @map on <self:ArrayMapValues[Object, nullable Object]> */
 RET_LABEL:;
@@ -4750,8 +4535,9 @@ val* var4 /* : nullable Object */;
 var1 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapValues__map]))(self) /* map on <self:ArrayMapValues[Object, nullable Object]>*/;
 var2 = var1->attrs[COLOR_array__ArrayMap___items].val; /* _items on <var1:ArrayMap[Object, nullable Object]> */
 if (var2 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 622);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 558);
+show_backtrace(1);
 }
 var3 = ((val* (*)(val*))(var2->class->vft[COLOR_abstract_collection__Collection__first]))(var2) /* first on <var2:Array[Couple[Object, nullable Object]]>*/;
 var4 = ((val* (*)(val*))(var3->class->vft[COLOR_abstract_collection__Couple__second]))(var3) /* second on <var3:nullable Object(Couple[Object, nullable Object])>*/;
@@ -4821,7 +4607,6 @@ var1 = NEW_abstract_collection__MapValuesIterator(self->type->resolution_table->
 var2 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapValues__map]))(self) /* map on <self:ArrayMapValues[Object, nullable Object]>*/;
 var3 = ((val* (*)(val*))(var2->class->vft[COLOR_abstract_collection__MapRead__iterator]))(var2) /* iterator on <var2:ArrayMap[Object, nullable Object]>*/;
 ((void (*)(val*, val*))(var1->class->vft[COLOR_abstract_collection__MapValuesIterator__init]))(var1, var3) /* init on <var1:MapValuesIterator[Object, nullable Object]>*/;
-CHECK_NEW_abstract_collection__MapValuesIterator(var1);
 var = var1;
 goto RET_LABEL;
 RET_LABEL:;
@@ -4844,6 +4629,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 val* var2 /* : ArrayMap[Object, nullable Object] */;
 val* var3 /* : Array[Couple[Object, nullable Object]] */;
@@ -4871,15 +4657,18 @@ var1 = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 627);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Collection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 563);
+show_backtrace(1);
 }
 var_item = p0;
 var2 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapValues__map]))(self) /* map on <self:ArrayMapValues[Object, nullable Object]>*/;
 var3 = var2->attrs[COLOR_array__ArrayMap___items].val; /* _items on <var2:ArrayMap[Object, nullable Object]> */
 if (var3 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 630);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 566);
+show_backtrace(1);
 }
 var4 = ((val* (*)(val*))(var3->class->vft[COLOR_abstract_collection__Collection__iterator]))(var3) /* iterator on <var3:Array[Couple[Object, nullable Object]]>*/;
 for(;;) {
@@ -4926,6 +4715,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 val* var2 /* : ArrayMap[Object, nullable Object] */;
 val* var3 /* : Array[Couple[Object, nullable Object]] */;
@@ -4953,15 +4743,18 @@ var1 = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 634);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Collection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 570);
+show_backtrace(1);
 }
 var_item = p0;
 var2 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapValues__map]))(self) /* map on <self:ArrayMapValues[Object, nullable Object]>*/;
 var3 = var2->attrs[COLOR_array__ArrayMap___items].val; /* _items on <var2:ArrayMap[Object, nullable Object]> */
 if (var3 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 637);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 573);
+show_backtrace(1);
 }
 var4 = ((val* (*)(val*))(var3->class->vft[COLOR_abstract_collection__Collection__iterator]))(var3) /* iterator on <var3:Array[Couple[Object, nullable Object]]>*/;
 for(;;) {
@@ -5008,6 +4801,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 long var2 /* : Int */;
 long var_nb /* var nb: Int */;
@@ -5038,8 +4832,10 @@ var1 = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var1) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 641);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "Collection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 577);
+show_backtrace(1);
 }
 var_item = p0;
 var2 = 0;
@@ -5047,8 +4843,9 @@ var_nb = var2;
 var3 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapValues__map]))(self) /* map on <self:ArrayMapValues[Object, nullable Object]>*/;
 var4 = var3->attrs[COLOR_array__ArrayMap___items].val; /* _items on <var3:ArrayMap[Object, nullable Object]> */
 if (var4 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 645);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 581);
+show_backtrace(1);
 }
 var5 = ((val* (*)(val*))(var4->class->vft[COLOR_abstract_collection__Collection__iterator]))(var4) /* iterator on <var4:Array[Couple[Object, nullable Object]]>*/;
 for(;;) {
@@ -5110,6 +4907,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 val* var1 /* : ArrayMap[Object, nullable Object] */;
 val* var_map /* var map: ArrayMap[Object, nullable Object] */;
@@ -5124,14 +4922,15 @@ short int var9 /* : Bool */;
 short int var11 /* : Bool */;
 int cltype12;
 int idtype13;
-short int var14 /* : Bool */;
-val* var15 /* : Array[Couple[Object, nullable Object]] */;
-val* var16 /* : nullable Object */;
+const char* var_class_name14;
+short int var15 /* : Bool */;
+val* var16 /* : Array[Couple[Object, nullable Object]] */;
 val* var17 /* : nullable Object */;
-short int var18 /* : Bool */;
-long var19 /* : Int */;
+val* var18 /* : nullable Object */;
+short int var19 /* : Bool */;
 long var20 /* : Int */;
-long var22 /* : Int */;
+long var21 /* : Int */;
+long var23 /* : Int */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa RemovableCollection#0 */
 /* <p0:nullable Object> isa RemovableCollection#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__RemovableCollection_FT0];
@@ -5148,16 +4947,19 @@ var = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 651);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "RemovableCollection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 587);
+show_backtrace(1);
 }
 var_item = p0;
 var1 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapValues__map]))(self) /* map on <self:ArrayMapValues[Object, nullable Object]>*/;
 var_map = var1;
 var2 = var_map->attrs[COLOR_array__ArrayMap___items].val; /* _items on <var_map:ArrayMap[Object, nullable Object]> */
 if (var2 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 654);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 590);
+show_backtrace(1);
 }
 var3 = ((long (*)(val*))(var2->class->vft[COLOR_abstract_collection__Collection__length]))(var2) /* length on <var2:Array[Couple[Object, nullable Object]]>*/;
 var4 = 1;
@@ -5175,40 +4977,43 @@ var8 = 0;
 /* <var8:Int> isa OTHER */
 var11 = 1; /* easy <var8:Int> isa OTHER*/
 if (!var11) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name14 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name14);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var14 = var_i >= var8;
-var9 = var14;
+var15 = var_i >= var8;
+var9 = var15;
 goto RET_LABEL10;
 RET_LABEL10:(void)0;
 }
 if (!var9) break;
-var15 = var_map->attrs[COLOR_array__ArrayMap___items].val; /* _items on <var_map:ArrayMap[Object, nullable Object]> */
-if (var15 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 656);
-exit(1);
+var16 = var_map->attrs[COLOR_array__ArrayMap___items].val; /* _items on <var_map:ArrayMap[Object, nullable Object]> */
+if (var16 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 592);
+show_backtrace(1);
 }
-var16 = ((val* (*)(val*, long))(var15->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var15, var_i) /* [] on <var15:Array[Couple[Object, nullable Object]]>*/;
-var17 = ((val* (*)(val*))(var16->class->vft[COLOR_abstract_collection__Couple__second]))(var16) /* second on <var16:nullable Object(Couple[Object, nullable Object])>*/;
-if (var17 == NULL) {
-var18 = (var_item == NULL);
+var17 = ((val* (*)(val*, long))(var16->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var16, var_i) /* [] on <var16:Array[Couple[Object, nullable Object]]>*/;
+var18 = ((val* (*)(val*))(var17->class->vft[COLOR_abstract_collection__Couple__second]))(var17) /* second on <var17:nullable Object(Couple[Object, nullable Object])>*/;
+if (var18 == NULL) {
+var19 = (var_item == NULL);
 } else {
-var18 = ((short int (*)(val*, val*))(var17->class->vft[COLOR_kernel__Object___61d_61d]))(var17, var_item) /* == on <var17:nullable Object>*/;
+var19 = ((short int (*)(val*, val*))(var18->class->vft[COLOR_kernel__Object___61d_61d]))(var18, var_item) /* == on <var18:nullable Object>*/;
 }
-if (var18){
+if (var19){
 ((void (*)(val*, long))(var_map->class->vft[COLOR_array__ArrayMap__remove_at_index]))(var_map, var_i) /* remove_at_index on <var_map:ArrayMap[Object, nullable Object]>*/;
 goto RET_LABEL;
 } else {
 }
-var19 = 1;
-{ /* Inline kernel#Int#- (var_i,var19) */
-var22 = var_i - var19;
-var20 = var22;
-goto RET_LABEL21;
-RET_LABEL21:(void)0;
+var20 = 1;
+{ /* Inline kernel#Int#- (var_i,var20) */
+var23 = var_i - var20;
+var21 = var23;
+goto RET_LABEL22;
+RET_LABEL22:(void)0;
 }
-var_i = var20;
+var_i = var21;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
@@ -5226,6 +5031,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 val* var_item /* var item: nullable Object */;
 val* var1 /* : ArrayMap[Object, nullable Object] */;
 val* var_map /* var map: ArrayMap[Object, nullable Object] */;
@@ -5240,14 +5046,15 @@ short int var9 /* : Bool */;
 short int var11 /* : Bool */;
 int cltype12;
 int idtype13;
-short int var14 /* : Bool */;
-val* var15 /* : Array[Couple[Object, nullable Object]] */;
-val* var16 /* : nullable Object */;
+const char* var_class_name14;
+short int var15 /* : Bool */;
+val* var16 /* : Array[Couple[Object, nullable Object]] */;
 val* var17 /* : nullable Object */;
-short int var18 /* : Bool */;
-long var19 /* : Int */;
+val* var18 /* : nullable Object */;
+short int var19 /* : Bool */;
 long var20 /* : Int */;
-long var22 /* : Int */;
+long var21 /* : Int */;
+long var23 /* : Int */;
 /* Covariant cast for argument 0 (item) <p0:nullable Object> isa RemovableCollection#0 */
 /* <p0:nullable Object> isa RemovableCollection#0 */
 type_struct = self->type->resolution_table->types[COLOR_abstract_collection__RemovableCollection_FT0];
@@ -5264,16 +5071,19 @@ var = p0->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 664);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "RemovableCollection#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 600);
+show_backtrace(1);
 }
 var_item = p0;
 var1 = ((val* (*)(val*))(self->class->vft[COLOR_array__ArrayMapValues__map]))(self) /* map on <self:ArrayMapValues[Object, nullable Object]>*/;
 var_map = var1;
 var2 = var_map->attrs[COLOR_array__ArrayMap___items].val; /* _items on <var_map:ArrayMap[Object, nullable Object]> */
 if (var2 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 667);
-exit(1);
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 603);
+show_backtrace(1);
 }
 var3 = ((long (*)(val*))(var2->class->vft[COLOR_abstract_collection__Collection__length]))(var2) /* length on <var2:Array[Couple[Object, nullable Object]]>*/;
 var4 = 1;
@@ -5291,39 +5101,42 @@ var8 = 0;
 /* <var8:Int> isa OTHER */
 var11 = 1; /* easy <var8:Int> isa OTHER*/
 if (!var11) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/kernel.nit", 258);
-exit(1);
+var_class_name14 = type_kernel__Int.name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "OTHER", var_class_name14);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/kernel.nit", 266);
+show_backtrace(1);
 }
-var14 = var_i >= var8;
-var9 = var14;
+var15 = var_i >= var8;
+var9 = var15;
 goto RET_LABEL10;
 RET_LABEL10:(void)0;
 }
 if (!var9) break;
-var15 = var_map->attrs[COLOR_array__ArrayMap___items].val; /* _items on <var_map:ArrayMap[Object, nullable Object]> */
-if (var15 == NULL) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Uninitialized attribute _items", "lib/standard/collection/array.nit", 669);
-exit(1);
+var16 = var_map->attrs[COLOR_array__ArrayMap___items].val; /* _items on <var_map:ArrayMap[Object, nullable Object]> */
+if (var16 == NULL) {
+fprintf(stderr, "Runtime error: %s", "Uninitialized attribute _items");
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 605);
+show_backtrace(1);
 }
-var16 = ((val* (*)(val*, long))(var15->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var15, var_i) /* [] on <var15:Array[Couple[Object, nullable Object]]>*/;
-var17 = ((val* (*)(val*))(var16->class->vft[COLOR_abstract_collection__Couple__second]))(var16) /* second on <var16:nullable Object(Couple[Object, nullable Object])>*/;
-if (var17 == NULL) {
-var18 = (var_item == NULL);
+var17 = ((val* (*)(val*, long))(var16->class->vft[COLOR_abstract_collection__SequenceRead___91d_93d]))(var16, var_i) /* [] on <var16:Array[Couple[Object, nullable Object]]>*/;
+var18 = ((val* (*)(val*))(var17->class->vft[COLOR_abstract_collection__Couple__second]))(var17) /* second on <var17:nullable Object(Couple[Object, nullable Object])>*/;
+if (var18 == NULL) {
+var19 = (var_item == NULL);
 } else {
-var18 = ((short int (*)(val*, val*))(var17->class->vft[COLOR_kernel__Object___61d_61d]))(var17, var_item) /* == on <var17:nullable Object>*/;
+var19 = ((short int (*)(val*, val*))(var18->class->vft[COLOR_kernel__Object___61d_61d]))(var18, var_item) /* == on <var18:nullable Object>*/;
 }
-if (var18){
+if (var19){
 ((void (*)(val*, long))(var_map->class->vft[COLOR_array__ArrayMap__remove_at_index]))(var_map, var_i) /* remove_at_index on <var_map:ArrayMap[Object, nullable Object]>*/;
 } else {
 }
-var19 = 1;
-{ /* Inline kernel#Int#- (var_i,var19) */
-var22 = var_i - var19;
-var20 = var22;
-goto RET_LABEL21;
-RET_LABEL21:(void)0;
+var20 = 1;
+{ /* Inline kernel#Int#- (var_i,var20) */
+var23 = var_i - var20;
+var21 = var23;
+goto RET_LABEL22;
+RET_LABEL22:(void)0;
 }
-var_i = var20;
+var_i = var21;
 CONTINUE_label: (void)0;
 }
 BREAK_label: (void)0;
@@ -5340,6 +5153,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 /* Covariant cast for argument 0 (map) <p0:ArrayMap[Object, nullable Object]> isa ArrayMap[ArrayMapValues#0, ArrayMapValues#1] */
 /* <p0:ArrayMap[Object, nullable Object]> isa ArrayMap[ArrayMapValues#0, ArrayMapValues#1] */
 type_struct = self->type->resolution_table->types[COLOR_array__ArrayMaparray__ArrayMapValues_FT0array__ArrayMapValues_FT1];
@@ -5351,8 +5165,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 618);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "ArrayMap[ArrayMapValues#0, ArrayMapValues#1]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 554);
+show_backtrace(1);
 }
 self->attrs[COLOR_array__ArrayMapValues___64dmap].val = p0; /* @map on <self:ArrayMapValues[Object, nullable Object]> */
 RET_LABEL:;
@@ -5371,7 +5187,6 @@ short int var2 /* : Bool */;
 val* var3 /* : nullable Object */;
 var1 = NEW_array__Array(self->type->resolution_table->types[COLOR_array__Arrayabstract_collection__Iterator_FT0]);
 ((void (*)(val*))(var1->class->vft[COLOR_array__Array__init]))(var1) /* init on <var1:Array[nullable Object]>*/;
-CHECK_NEW_array__Array(var1);
 var_res = var1;
 for(;;) {
 var2 = ((short int (*)(val*))(self->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(self) /* is_ok on <self:Iterator[nullable Object]>*/;
@@ -5474,6 +5289,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 /* Covariant cast for argument 1 (item) <p1:nullable Object> isa NativeArray#0 */
 /* <p1:nullable Object> isa NativeArray#0 */
 type_struct = self->type->resolution_table->types[COLOR_array__NativeArray_FT0];
@@ -5490,8 +5306,10 @@ var = p1->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 712);
-exit(1);
+var_class_name = p1 == NULL ? "null" : p1->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "NativeArray#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 648);
+show_backtrace(1);
 }
 ((struct instance_array__NativeArray*)self)->values[p0]=p1;
 RET_LABEL:;
@@ -5503,6 +5321,7 @@ int cltype;
 int idtype;
 const struct type* type_struct;
 short int is_nullable;
+const char* var_class_name;
 { /* Inline array#NativeArray#[]= (self,p0,p1) */
 /* Covariant cast for argument 1 (item) <p1:nullable Object> isa NativeArray#0 */
 /* <p1:nullable Object> isa NativeArray#0 */
@@ -5520,8 +5339,10 @@ var = p1->type->type_table[cltype] == idtype;
 }
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 712);
-exit(1);
+var_class_name = p1 == NULL ? "null" : p1->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "NativeArray#0", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 648);
+show_backtrace(1);
 }
 ((struct instance_array__NativeArray*)self)->values[p0]=p1;
 RET_LABEL1:(void)0;
@@ -5534,6 +5355,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 /* Covariant cast for argument 0 (dest) <p0:NativeArray[nullable Object]> isa NativeArray[NativeArray#0] */
 /* <p0:NativeArray[nullable Object]> isa NativeArray[NativeArray#0] */
 type_struct = self->type->resolution_table->types[COLOR_array__NativeArrayarray__NativeArray_FT0];
@@ -5545,8 +5367,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 713);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "NativeArray[NativeArray#0]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 649);
+show_backtrace(1);
 }
 memcpy(((struct instance_array__NativeArray*)p0)->values, ((struct instance_array__NativeArray*)self)->values, p1*sizeof(val*));
 RET_LABEL:;
@@ -5557,6 +5381,7 @@ short int var /* : Bool */;
 int cltype;
 int idtype;
 const struct type* type_struct;
+const char* var_class_name;
 { /* Inline array#NativeArray#copy_to (self,p0,p1) */
 /* Covariant cast for argument 0 (dest) <p0:NativeArray[nullable Object]> isa NativeArray[NativeArray#0] */
 /* <p0:NativeArray[nullable Object]> isa NativeArray[NativeArray#0] */
@@ -5569,8 +5394,10 @@ var = 0;
 var = p0->type->type_table[cltype] == idtype;
 }
 if (!var) {
-fprintf(stderr, "Runtime error: %s (%s:%d)\n", "Cast failed", "lib/standard/collection/array.nit", 713);
-exit(1);
+var_class_name = p0 == NULL ? "null" : p0->type->name;
+fprintf(stderr, "Runtime error: Cast failed. Expected `%s`, got `%s`", "NativeArray[NativeArray#0]", var_class_name);
+fprintf(stderr, " (%s:%d)\n", "lib/standard/collection/array.nit", 649);
+show_backtrace(1);
 }
 memcpy(((struct instance_array__NativeArray*)p0)->values, ((struct instance_array__NativeArray*)self)->values, p1*sizeof(val*));
 RET_LABEL1:(void)0;