Skip to content

Commit afe4369

Browse files
committed
Add #+feature force-type-assert which overrides -no-type-assert on a per-file basis
1 parent a69c3ed commit afe4369

File tree

2 files changed

+47
-20
lines changed

2 files changed

+47
-20
lines changed

src/build_settings.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,12 +360,15 @@ enum OptInFeatureFlags : u64 {
360360
OptInFeatureFlag_IntegerDivisionByZero_Self = 1u<<4,
361361
OptInFeatureFlag_IntegerDivisionByZero_AllBits = 1u<<5,
362362

363-
364363
OptInFeatureFlag_IntegerDivisionByZero_ALL = OptInFeatureFlag_IntegerDivisionByZero_Trap|
365364
OptInFeatureFlag_IntegerDivisionByZero_Zero|
366365
OptInFeatureFlag_IntegerDivisionByZero_Self|
367366
OptInFeatureFlag_IntegerDivisionByZero_AllBits,
368367

368+
OptInFeatureFlag_ForceTypeAssert = 1u<<6,
369+
370+
371+
369372
};
370373

371374
u64 get_feature_flag_from_name(String const &name) {
@@ -384,6 +387,9 @@ u64 get_feature_flag_from_name(String const &name) {
384387
if (name == "integer-division-by-zero:all-bits") {
385388
return OptInFeatureFlag_IntegerDivisionByZero_AllBits;
386389
}
390+
if (name == "force-type-assert") {
391+
return OptInFeatureFlag_ForceTypeAssert;
392+
}
387393

388394

389395
if (name == "global-context") {

src/llvm_backend_expr.cpp

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)