Promote types in #c_varargs according to C rules

This commit is contained in:
Laytan Laats
2024-02-21 22:05:11 +01:00
parent 41549b502b
commit f6f3a760bc
2 changed files with 48 additions and 2 deletions

View File

@@ -548,6 +548,14 @@ gb_global Type *t_f16 = &basic_types[Basic_f16];
gb_global Type *t_f32 = &basic_types[Basic_f32];
gb_global Type *t_f64 = &basic_types[Basic_f64];
gb_global Type *t_f16be = &basic_types[Basic_f16be];
gb_global Type *t_f32be = &basic_types[Basic_f32be];
gb_global Type *t_f64be = &basic_types[Basic_f64be];
gb_global Type *t_f16le = &basic_types[Basic_f16le];
gb_global Type *t_f32le = &basic_types[Basic_f32le];
gb_global Type *t_f64le = &basic_types[Basic_f64le];
gb_global Type *t_complex32 = &basic_types[Basic_complex32];
gb_global Type *t_complex64 = &basic_types[Basic_complex64];
gb_global Type *t_complex128 = &basic_types[Basic_complex128];
@@ -2795,6 +2803,44 @@ gb_internal Type *default_type(Type *type) {
return type;
}
// See https://en.cppreference.com/w/c/language/conversion#Default_argument_promotions
gb_internal Type *c_vararg_promote_type(Type *type) {
GB_ASSERT(type != nullptr);
Type *core = core_type(type);
if (core->kind == Type_Basic) {
switch (core->Basic.kind) {
case Basic_f32:
case Basic_UntypedFloat:
return t_f64;
case Basic_f32le:
return t_f64le;
case Basic_f32be:
return t_f64be;
case Basic_UntypedBool:
case Basic_bool:
case Basic_b8:
case Basic_b16:
case Basic_i8:
case Basic_i16:
case Basic_u8:
case Basic_u16:
return t_i32;
case Basic_i16le:
case Basic_u16le:
return t_i32le;
case Basic_i16be:
case Basic_u16be:
return t_i32be;
}
}
return type;
}
gb_internal bool union_variant_index_types_equal(Type *v, Type *vt) {
if (are_types_identical(v, vt)) {
return true;