aboutsummaryrefslogtreecommitdiff
path: root/src/checker/expr.c
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-11-28 20:39:43 +0000
committerGinger Bill <bill@gingerbill.org>2016-11-28 20:39:43 +0000
commit598dab5bc4fb2836c8f2a6cad757dcb3760a895f (patch)
tree957f92585cae2e41bee93ce0b9d493b5178a0f54 /src/checker/expr.c
parentcbb70c78731b9d928508a52180a186b178d30a5e (diff)
#rune "" to ''; Remove infix and postfix call notation
Diffstat (limited to 'src/checker/expr.c')
-rw-r--r--src/checker/expr.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/src/checker/expr.c b/src/checker/expr.c
index 6f16da451..de6011a79 100644
--- a/src/checker/expr.c
+++ b/src/checker/expr.c
@@ -713,12 +713,10 @@ void check_enum_type(Checker *c, Type *enum_type, Type *named_type, AstNode *nod
if (o.mode != Addressing_Invalid) {
iota = o.value;
} else {
- Token add_token = {Token_Add};
- iota = exact_binary_operator_value(add_token, iota, make_exact_value_integer(1));
+ iota = exact_binary_operator_value(Token_Add, iota, make_exact_value_integer(1));
}
} else {
- Token add_token = {Token_Add};
- iota = exact_binary_operator_value(add_token, iota, make_exact_value_integer(1));
+ iota = exact_binary_operator_value(Token_Add, iota, make_exact_value_integer(1));
}
@@ -1492,7 +1490,7 @@ void check_unary_expr(Checker *c, Operand *o, Token op, AstNode *node) {
if (is_type_unsigned(type)) {
precision = cast(i32)(8 * type_size_of(c->sizes, c->allocator, type));
}
- o->value = exact_unary_operator_value(op, o->value, precision);
+ o->value = exact_unary_operator_value(op.kind, o->value, precision);
if (is_type_typed(type)) {
if (node != NULL) {
@@ -1558,7 +1556,7 @@ void check_comparison(Checker *c, Operand *x, Operand *y, Token op) {
} else {
if (x->mode == Addressing_Constant &&
y->mode == Addressing_Constant) {
- x->value = make_exact_value_bool(compare_exact_values(op, x->value, y->value));
+ x->value = make_exact_value_bool(compare_exact_values(op.kind, x->value, y->value));
} else {
x->mode = Addressing_Value;
@@ -1645,7 +1643,7 @@ void check_shift(Checker *c, Operand *x, Operand *y, AstNode *node) {
x->type = t_untyped_integer;
}
- x->value = exact_value_shift(be->op, x_val, make_exact_value_integer(amount));
+ x->value = exact_value_shift(be->op.kind, x_val, make_exact_value_integer(amount));
if (is_type_typed(x->type)) {
check_is_expressible(c, x, base_type(x->type));
@@ -2168,7 +2166,7 @@ void check_binary_expr(Checker *c, Operand *x, AstNode *node) {
if (op.kind == Token_Quo && is_type_integer(type)) {
op.kind = Token_QuoEq; // NOTE(bill): Hack to get division of integers
}
- x->value = exact_binary_operator_value(op, a, b);
+ x->value = exact_binary_operator_value(op.kind, a, b);
if (is_type_typed(type)) {
if (node != NULL) {
x->expr = node;
@@ -3166,7 +3164,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
case BuiltinProc_min: {
// min :: proc(a, b: comparable) -> comparable
Type *type = base_type(operand->type);
- if (!is_type_comparable(type) || !is_type_numeric(type)) {
+ if (!is_type_comparable(type) || !(is_type_numeric(type) || is_type_string(type))) {
gbString type_str = type_to_string(operand->type);
error(ast_node_token(call),
"Expected a comparable numeric type to `min`, got `%s`",
@@ -3182,7 +3180,7 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
if (b.mode == Addressing_Invalid) {
return false;
}
- if (!is_type_comparable(b.type) || !is_type_numeric(type)) {
+ if (!is_type_comparable(b.type) || !(is_type_numeric(b.type) || is_type_string(b.type))) {
gbString type_str = type_to_string(b.type);
error(ast_node_token(call),
"Expected a comparable numeric type to `min`, got `%s`",
@@ -3195,10 +3193,9 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
b.mode == Addressing_Constant) {
ExactValue x = a.value;
ExactValue y = b.value;
- Token lt = {Token_Lt};
operand->mode = Addressing_Constant;
- if (compare_exact_values(lt, x, y)) {
+ if (compare_exact_values(Token_Lt, x, y)) {
operand->value = x;
operand->type = a.type;
} else {
@@ -3235,10 +3232,10 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
case BuiltinProc_max: {
// min :: proc(a, b: comparable) -> comparable
Type *type = base_type(operand->type);
- if (!is_type_comparable(type) || !is_type_numeric(type)) {
+ if (!is_type_comparable(type) || !(is_type_numeric(type) || is_type_string(type))) {
gbString type_str = type_to_string(operand->type);
error(ast_node_token(call),
- "Expected a comparable numeric type to `max`, got `%s`",
+ "Expected a comparable numeric or string type to `max`, got `%s`",
type_str);
gb_string_free(type_str);
return false;
@@ -3251,10 +3248,10 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
if (b.mode == Addressing_Invalid) {
return false;
}
- if (!is_type_comparable(b.type) || !is_type_numeric(type)) {
+ if (!is_type_comparable(b.type) || !(is_type_numeric(type) || is_type_string(type))) {
gbString type_str = type_to_string(b.type);
error(ast_node_token(call),
- "Expected a comparable numeric type to `max`, got `%s`",
+ "Expected a comparable numeric or string type to `max`, got `%s`",
type_str);
gb_string_free(type_str);
return false;
@@ -3264,10 +3261,9 @@ bool check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id
b.mode == Addressing_Constant) {
ExactValue x = a.value;
ExactValue y = b.value;
- Token gt = {Token_Gt};
operand->mode = Addressing_Constant;
- if (compare_exact_values(gt, x, y)) {
+ if (compare_exact_values(Token_Gt, x, y)) {
operand->value = x;
operand->type = a.type;
} else {