diff options
| author | gingerBill <bill@gingerbill.org> | 2020-01-14 17:36:37 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-01-14 17:36:37 +0000 |
| commit | 04f7225ea5419adac67adf466a528de487c3dbd9 (patch) | |
| tree | 07e20d355f9c8c18b07cd22077bca5614bcc826d /src/check_expr.cpp | |
| parent | f0c6f29f829b2ec2dda7e54d2a630f574c28dd72 (diff) | |
Exact value zero value for `T{}` of basic types
Diffstat (limited to 'src/check_expr.cpp')
| -rw-r--r-- | src/check_expr.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp index f23c47a2e..884dc8de3 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8391,6 +8391,33 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type bits |= bit; } o->value = exact_value_u64(bits); + } else if (is_type_constant_type(type) && cl->elems.count == 0) { + ExactValue value = exact_value_compound(node); + Type *bt = core_type(type); + if (bt->kind == Type_Basic) { + if (bt->Basic.flags & BasicFlag_Boolean) { + value = exact_value_bool(false); + } else if (bt->Basic.flags & BasicFlag_Integer) { + value = exact_value_i64(0); + } else if (bt->Basic.flags & BasicFlag_Unsigned) { + value = exact_value_i64(0); + } else if (bt->Basic.flags & BasicFlag_Float) { + value = exact_value_float(0); + } else if (bt->Basic.flags & BasicFlag_Complex) { + value = exact_value_complex(0, 0); + } else if (bt->Basic.flags & BasicFlag_Quaternion) { + value = exact_value_quaternion(0, 0, 0, 0); + } else if (bt->Basic.flags & BasicFlag_Pointer) { + value = exact_value_pointer(0); + } else if (bt->Basic.flags & BasicFlag_String) { + String empty_string = {}; + value = exact_value_string(empty_string); + } else if (bt->Basic.flags & BasicFlag_Rune) { + value = exact_value_i64(0); + } + } + + o->value = value; } else { o->value = exact_value_compound(node); } |