aboutsummaryrefslogtreecommitdiff
path: root/src/check_type.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2019-03-31 22:35:05 +0100
committergingerBill <bill@gingerbill.org>2019-03-31 22:35:05 +0100
commitecd2eacd7589fd3eea5082f9b28ac548c39fd8ff (patch)
treeef6885601e2fff50357a5b2791880401d7b106ef /src/check_type.cpp
parent2614830c6931e6601f800d3010d269991dcae15e (diff)
Remove dead keywords; Fix `min` and `max` for enum types
Diffstat (limited to 'src/check_type.cpp')
-rw-r--r--src/check_type.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/check_type.cpp b/src/check_type.cpp
index 22cd409ee..445b93fb8 100644
--- a/src/check_type.cpp
+++ b/src/check_type.cpp
@@ -759,6 +759,8 @@ void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *named_type, Ast
ExactValue iota = exact_value_i64(-1);
ExactValue min_value = exact_value_i64(0);
ExactValue max_value = exact_value_i64(0);
+ bool min_value_set = false;
+ bool max_value_set = false;
scope_reserve(ctx->scope, et->fields.count);
@@ -810,11 +812,21 @@ void check_enum_type(CheckerContext *ctx, Type *enum_type, Type *named_type, Ast
continue;
}
- if (compare_exact_values(Token_Gt, min_value, iota)) {
+ if (min_value_set) {
+ if (compare_exact_values(Token_Gt, min_value, iota)) {
+ min_value = iota;
+ }
+ } else {
min_value = iota;
+ min_value_set = true;
}
- if (compare_exact_values(Token_Lt, max_value, iota)) {
+ if (max_value_set) {
+ if (compare_exact_values(Token_Lt, max_value, iota)) {
+ max_value = iota;
+ }
+ } else {
max_value = iota;
+ max_value_set = true;
}
Entity *e = alloc_entity_constant(ctx->scope, ident->Ident.token, constant_type, iota);