add checking of numeric types around boolean operators
This commit is contained in:
parent
68b9855309
commit
466243fc2b
2 changed files with 28 additions and 5 deletions
|
@ -3,14 +3,19 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
fn f() i32 {
|
fn f() i32 {
|
||||||
//var a = 3;
|
// var a = 3;
|
||||||
|
// return a;
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn f2() i32 {
|
fn f2() i32 {
|
||||||
return 1301;
|
return f() + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//fn f2() bool {
|
||||||
|
// return 1 > 10;
|
||||||
|
//}
|
||||||
|
|
||||||
enum B {
|
enum B {
|
||||||
a
|
a
|
||||||
b
|
b
|
||||||
|
|
|
@ -84,8 +84,6 @@ pub const TypeSolver = struct {
|
||||||
.Struct => SymbolUnderlyingType{ .Struct = val },
|
.Struct => SymbolUnderlyingType{ .Struct = val },
|
||||||
.Enum => SymbolUnderlyingType{ .Enum = val },
|
.Enum => SymbolUnderlyingType{ .Enum = val },
|
||||||
|
|
||||||
// TODO name resolution
|
|
||||||
|
|
||||||
else => blk: {
|
else => blk: {
|
||||||
self.doError(
|
self.doError(
|
||||||
"expected struct or enum for '{}', got {}",
|
"expected struct or enum for '{}', got {}",
|
||||||
|
@ -115,6 +113,21 @@ pub const TypeSolver = struct {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check if the given symbol is of a numeric type.
|
||||||
|
pub fn expectSymUnTypeNumeric(
|
||||||
|
self: *@This(),
|
||||||
|
symbol_type: comp.SymbolUnderlyingType,
|
||||||
|
) !void {
|
||||||
|
switch (symbol_type) {
|
||||||
|
.Integer32, .Integer64, .Double => {},
|
||||||
|
else => {
|
||||||
|
var actual_enum = comp.SymbolUnderlyingTypeEnum(symbol_type);
|
||||||
|
std.debug.warn("Expected numeric, got {}\n", actual_enum);
|
||||||
|
return CompileError.TypeError;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Compare if the given type names are equal.
|
/// Compare if the given type names are equal.
|
||||||
fn compositeIdentifierEqual(
|
fn compositeIdentifierEqual(
|
||||||
self: *@This(),
|
self: *@This(),
|
||||||
|
@ -188,7 +201,12 @@ pub const TypeSolver = struct {
|
||||||
.Add, .Sub, .Mul, .Div, .Mod => left_type,
|
.Add, .Sub, .Mul, .Div, .Mod => left_type,
|
||||||
|
|
||||||
// TODO check left and right as numeric
|
// TODO check left and right as numeric
|
||||||
.Greater, .GreaterEqual, .Less, .LessEqual => SymbolUnderlyingType{ .Bool = {} },
|
.Greater, .GreaterEqual, .Less, .LessEqual => blk: {
|
||||||
|
try self.expectSymUnTypeNumeric(left_type);
|
||||||
|
try self.expectSymUnTypeNumeric(right_type);
|
||||||
|
|
||||||
|
break :blk SymbolUnderlyingType{ .Bool = {} };
|
||||||
|
},
|
||||||
|
|
||||||
// all boolean ops return bools
|
// all boolean ops return bools
|
||||||
.Equal, .And, .Or => SymbolUnderlyingType{ .Bool = {} },
|
.Equal, .And, .Or => SymbolUnderlyingType{ .Bool = {} },
|
||||||
|
|
Loading…
Reference in a new issue