diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2017-05-07 12:07:35 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2017-05-07 12:07:35 -0400 |
| commit | 818a0a26291cf456cfaa955401b1aa8219737d6c (patch) | |
| tree | 9eac0aacdcc41c718a18c98f3513beffaaeac2d3 /src/analyze.cpp | |
| parent | 29beb603b752928184f5f5e9f7479412de1e1951 (diff) | |
| download | zig-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.cpp | 37 |
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) { |
