aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-01-16 09:07:52 +0000
committergingerBill <bill@gingerbill.org>2020-01-16 09:07:52 +0000
commit527b39ce2b6cd9ef20af7a04c81017af809c2cdb (patch)
tree7727cf5713570740b75ca1454c454a03cb3a4b40 /src/check_expr.cpp
parent5af3c7b0e8ede5c30850d9994c475d298848a8d1 (diff)
parent5db4bd99440c47506a6e22be193efdc235229772 (diff)
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 0ec147f68..c29325ea0 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);
}