@@ -282,8 +282,7 @@ gb_internal lbValue lb_emit_unary_arith(lbProcedure *p, TokenKind op, lbValue x,
282282
283283 return res;
284284}
285-
286- gb_internal IntegerDivisionByZeroKind lb_check_for_integer_division_by_zero_behaviour (lbProcedure *p) {
285+ gb_internal u64 lb_get_file_feature_flags (lbProcedure *p) {
287286 AstFile *file = nullptr ;
288287
289288 if (p->body && p->body ->file ()) {
@@ -295,20 +294,29 @@ gb_internal IntegerDivisionByZeroKind lb_check_for_integer_division_by_zero_beha
295294 }
296295
297296 if (file != nullptr && file->feature_flags_set ) {
298- u64 flags = file->feature_flags ;
299- if (flags & OptInFeatureFlag_IntegerDivisionByZero_Trap) {
300- return IntegerDivisionByZero_Trap;
301- }
302- if (flags & OptInFeatureFlag_IntegerDivisionByZero_Zero) {
303- return IntegerDivisionByZero_Zero;
304- }
305- if (flags & OptInFeatureFlag_IntegerDivisionByZero_Self) {
306- return IntegerDivisionByZero_Self;
307- }
308- if (flags & OptInFeatureFlag_IntegerDivisionByZero_AllBits) {
309- return IntegerDivisionByZero_AllBits;
310- }
297+ return file->feature_flags ;
311298 }
299+ return 0 ;
300+ }
301+
302+
303+
304+ gb_internal IntegerDivisionByZeroKind lb_check_for_integer_division_by_zero_behaviour (lbProcedure *p) {
305+ u64 flags = lb_get_file_feature_flags (p);
306+
307+ if (flags & OptInFeatureFlag_IntegerDivisionByZero_Trap) {
308+ return IntegerDivisionByZero_Trap;
309+ }
310+ if (flags & OptInFeatureFlag_IntegerDivisionByZero_Zero) {
311+ return IntegerDivisionByZero_Zero;
312+ }
313+ if (flags & OptInFeatureFlag_IntegerDivisionByZero_Self) {
314+ return IntegerDivisionByZero_Self;
315+ }
316+ if (flags & OptInFeatureFlag_IntegerDivisionByZero_AllBits) {
317+ return IntegerDivisionByZero_AllBits;
318+ }
319+
312320 return build_context.integer_division_by_zero_behaviour ;
313321}
314322
@@ -3802,6 +3810,17 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
38023810 Type *type = type_of_expr (ue_expr);
38033811 GB_ASSERT (!is_type_tuple (type));
38043812
3813+ bool do_type_check = true ;
3814+ if (build_context.no_type_assert ) {
3815+ u64 feature_flags = lb_get_file_feature_flags (p);
3816+ if ((feature_flags & OptInFeatureFlag_ForceTypeAssert) == 0 ) {
3817+ do_type_check = false ;
3818+ }
3819+
3820+ } else if ((p->state_flags & StateFlag_no_type_assert) != 0 ) {
3821+ do_type_check = false ;
3822+ }
3823+
38053824 lbValue e = lb_build_expr (p, ta->expr );
38063825 Type *t = type_deref (e.type );
38073826 if (is_type_union (t)) {
@@ -3813,7 +3832,7 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
38133832 Type *dst_type = type;
38143833
38153834
3816- if (!build_context. no_type_assert && (p-> state_flags & StateFlag_no_type_assert) == 0 ) {
3835+ if (do_type_check ) {
38173836 lbValue src_tag = {};
38183837 lbValue dst_tag = {};
38193838 if (is_type_union_maybe_pointer (src_type)) {
@@ -3851,7 +3870,7 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
38513870 v = lb_emit_load (p, v);
38523871 }
38533872 lbValue data_ptr = lb_emit_struct_ev (p, v, 0 );
3854- if (!build_context. no_type_assert && (p-> state_flags & StateFlag_no_type_assert) == 0 ) {
3873+ if (do_type_check ) {
38553874 GB_ASSERT (!build_context.no_rtti );
38563875
38573876 lbValue any_id = lb_emit_struct_ev (p, v, 1 );
@@ -5313,7 +5332,8 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) {
53135332 if (cl->elems .count == 0 ) {
53145333 break ;
53155334 }
5316- GB_ASSERT (expr->file ()->feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals );
5335+ u64 feature_flags = lb_get_file_feature_flags (p);
5336+ GB_ASSERT (feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals );
53175337
53185338 lbValue err = lb_dynamic_map_reserve (p, v.addr , 2 *cl->elems .count , pos);
53195339 gb_unused (err);
@@ -5402,7 +5422,8 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) {
54025422 if (cl->elems .count == 0 ) {
54035423 break ;
54045424 }
5405- GB_ASSERT (expr->file ()->feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals );
5425+ u64 feature_flags = lb_get_file_feature_flags (p);
5426+ GB_ASSERT (feature_flags & OptInFeatureFlag_DynamicLiterals || build_context.dynamic_literals );
54065427
54075428 Type *et = bt->DynamicArray .elem ;
54085429 lbValue size = lb_const_int (p->module , t_int, type_size_of (et));
0 commit comments