aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-05-07 12:07:35 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-05-07 12:07:35 -0400
commit818a0a26291cf456cfaa955401b1aa8219737d6c (patch)
tree9eac0aacdcc41c718a18c98f3513beffaaeac2d3 /src/analyze.cpp
parent29beb603b752928184f5f5e9f7479412de1e1951 (diff)
downloadzig-818a0a26291cf456cfaa955401b1aa8219737d6c.tar.gz
zig-818a0a26291cf456cfaa955401b1aa8219737d6c.zip
switch expression - add compile errors
* for duplicate integer value * for missing integer values * for missing else prong see #43
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp37
1 files changed, 21 insertions, 16 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index e1d8ca2869..f397f441c8 100644
--- a/src/analyze.cpp
+++ b/src/analyze.cpp
@@ -3851,25 +3851,30 @@ int64_t min_signed_val(TypeTableEntry *type_entry) {
}
}
+void eval_min_max_value_int(CodeGen *g, TypeTableEntry *int_type, BigNum *bignum, bool is_max) {
+ assert(int_type->id == TypeTableEntryIdInt);
+ if (is_max) {
+ if (int_type->data.integral.is_signed) {
+ int64_t val = max_signed_val(int_type);
+ bignum_init_signed(bignum, val);
+ } else {
+ uint64_t val = max_unsigned_val(int_type);
+ bignum_init_unsigned(bignum, val);
+ }
+ } else {
+ if (int_type->data.integral.is_signed) {
+ int64_t val = min_signed_val(int_type);
+ bignum_init_signed(bignum, val);
+ } else {
+ bignum_init_unsigned(bignum, 0);
+ }
+ }
+}
+
void eval_min_max_value(CodeGen *g, TypeTableEntry *type_entry, ConstExprValue *const_val, bool is_max) {
if (type_entry->id == TypeTableEntryIdInt) {
const_val->special = ConstValSpecialStatic;
- if (is_max) {
- if (type_entry->data.integral.is_signed) {
- int64_t val = max_signed_val(type_entry);
- bignum_init_signed(&const_val->data.x_bignum, val);
- } else {
- uint64_t val = max_unsigned_val(type_entry);
- bignum_init_unsigned(&const_val->data.x_bignum, val);
- }
- } else {
- if (type_entry->data.integral.is_signed) {
- int64_t val = min_signed_val(type_entry);
- bignum_init_signed(&const_val->data.x_bignum, val);
- } else {
- bignum_init_unsigned(&const_val->data.x_bignum, 0);
- }
- }
+ eval_min_max_value_int(g, type_entry, &const_val->data.x_bignum, is_max);
} else if (type_entry->id == TypeTableEntryIdFloat) {
zig_panic("TODO analyze_min_max_value float");
} else if (type_entry->id == TypeTableEntryIdBool) {