fixing type variables in loops
This commit is contained in:
parent
b6274f3455
commit
3c35557872
|
@ -615,6 +615,26 @@ main := fn(): uint {
|
||||||
|
|
||||||
### Purely Testing Examples
|
### Purely Testing Examples
|
||||||
|
|
||||||
|
#### generic_type_mishap
|
||||||
|
```hb
|
||||||
|
opaque := fn($Expr: type, ptr: ^?Expr): void {
|
||||||
|
}
|
||||||
|
|
||||||
|
process := fn($Expr: type): void {
|
||||||
|
optional := @as(?Expr, null)
|
||||||
|
timer := 1000
|
||||||
|
loop if timer > 0 {
|
||||||
|
opaque(Expr, &optional)
|
||||||
|
if optional != null return {
|
||||||
|
}
|
||||||
|
timer -= 1
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
main := fn(): void process(uint)
|
||||||
|
```
|
||||||
|
|
||||||
#### storing_into_nullable_struct
|
#### storing_into_nullable_struct
|
||||||
```hb
|
```hb
|
||||||
StructA := struct {b: StructB, c: ^uint, d: uint}
|
StructA := struct {b: StructB, c: ^uint, d: uint}
|
||||||
|
|
|
@ -1032,7 +1032,10 @@ trait TypeParser {
|
||||||
|
|
||||||
let Some((expr @ Expr::BinOp { left, right, .. }, name)) = f.find_decl(id) else {
|
let Some((expr @ Expr::BinOp { left, right, .. }, name)) = f.find_decl(id) else {
|
||||||
return match id {
|
return match id {
|
||||||
Ok(_) => ty::Id::NEVER,
|
Ok(_) => {
|
||||||
|
debug_assert_eq!(from_file, file);
|
||||||
|
self.report(file, pos, "somehow this was not found")
|
||||||
|
}
|
||||||
Err("main") => self.report(
|
Err("main") => self.report(
|
||||||
from_file,
|
from_file,
|
||||||
pos,
|
pos,
|
||||||
|
|
|
@ -2022,6 +2022,12 @@ struct Variable {
|
||||||
|
|
||||||
impl Variable {
|
impl Variable {
|
||||||
fn new(id: Ident, ty: ty::Id, ptr: bool, value: Nid, nodes: &mut Nodes) -> Self {
|
fn new(id: Ident, ty: ty::Id, ptr: bool, value: Nid, nodes: &mut Nodes) -> Self {
|
||||||
|
if value == NEVER {
|
||||||
|
if ty == ty::Id::NEVER {
|
||||||
|
panic!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Self { id, ty, ptr, value: StrongRef::new(value, nodes) }
|
Self { id, ty, ptr, value: StrongRef::new(value, nodes) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3400,7 +3406,7 @@ impl<'a> Codegen<'a> {
|
||||||
});
|
});
|
||||||
|
|
||||||
for var in self.ci.scope.vars.iter_mut().skip(self.ci.inline_var_base) {
|
for var in self.ci.scope.vars.iter_mut().skip(self.ci.inline_var_base) {
|
||||||
if !var.ptr {
|
if !var.ptr && var.value() != NEVER {
|
||||||
var.set_value(VOID, &mut self.ci.nodes);
|
var.set_value(VOID, &mut self.ci.nodes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4331,7 +4337,7 @@ impl<'a> Codegen<'a> {
|
||||||
self.ci.nodes.basic_blocks();
|
self.ci.nodes.basic_blocks();
|
||||||
self.ci.nodes.graphviz(self.ty_display(ty::Id::VOID));
|
self.ci.nodes.graphviz(self.ty_display(ty::Id::VOID));
|
||||||
} else {
|
} else {
|
||||||
self.ci.nodes.graphviz_in_browser(self.ty_display(ty::Id::VOID));
|
//self.ci.nodes.graphviz_in_browser(self.ty_display(ty::Id::VOID));
|
||||||
}
|
}
|
||||||
|
|
||||||
self.errors.borrow().len() == prev_err_len
|
self.errors.borrow().len() == prev_err_len
|
||||||
|
@ -4664,7 +4670,13 @@ impl TypeParser for Codegen<'_> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_local_ty(&mut self, ident: Ident) -> Option<ty::Id> {
|
fn find_local_ty(&mut self, ident: Ident) -> Option<ty::Id> {
|
||||||
self.ci.scope.vars.iter().rfind(|v| (v.id == ident && v.value() == NEVER)).map(|v| v.ty)
|
self.ci
|
||||||
|
.scope
|
||||||
|
.vars
|
||||||
|
.iter()
|
||||||
|
.rfind(|v| (v.id == ident && v.value() == NEVER))
|
||||||
|
.map(|v| v.ty)
|
||||||
|
.inspect(|&ty| debug_assert_ne!(ty, ty::Id::NEVER))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4743,6 +4755,7 @@ mod tests {
|
||||||
fb_driver;
|
fb_driver;
|
||||||
|
|
||||||
// Purely Testing Examples;
|
// Purely Testing Examples;
|
||||||
|
generic_type_mishap;
|
||||||
storing_into_nullable_struct;
|
storing_into_nullable_struct;
|
||||||
scheduling_block_did_dirty;
|
scheduling_block_did_dirty;
|
||||||
null_check_returning_small_global;
|
null_check_returning_small_global;
|
||||||
|
|
35
lang/tests/son_tests_generic_type_mishap.txt
Normal file
35
lang/tests/son_tests_generic_type_mishap.txt
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
main:
|
||||||
|
ADDI64 r254, r254, -8d
|
||||||
|
ST r31, r254, 0a, 8h
|
||||||
|
JAL r31, r0, :process
|
||||||
|
LD r31, r254, 0a, 8h
|
||||||
|
ADDI64 r254, r254, 8d
|
||||||
|
JALA r0, r31, 0a
|
||||||
|
opaque:
|
||||||
|
JALA r0, r31, 0a
|
||||||
|
process:
|
||||||
|
ADDI64 r254, r254, -64d
|
||||||
|
ST r31, r254, 16a, 48h
|
||||||
|
LI64 r32, 0d
|
||||||
|
LI64 r33, 1000d
|
||||||
|
ADDI64 r34, r254, 0d
|
||||||
|
LI8 r35, 0b
|
||||||
|
ST r35, r254, 0a, 1h
|
||||||
|
4: JGTU r33, r32, :0
|
||||||
|
JMP :1
|
||||||
|
0: CP r2, r34
|
||||||
|
JAL r31, r0, :opaque
|
||||||
|
LD r36, r254, 0a, 1h
|
||||||
|
ANDI r36, r36, 255d
|
||||||
|
ANDI r35, r35, 255d
|
||||||
|
JEQ r36, r35, :2
|
||||||
|
JMP :3
|
||||||
|
2: ADDI64 r33, r33, -1d
|
||||||
|
1: JMP :4
|
||||||
|
3: LD r31, r254, 16a, 48h
|
||||||
|
ADDI64 r254, r254, 64d
|
||||||
|
JALA r0, r31, 0a
|
||||||
|
timed out
|
||||||
|
code size: 272
|
||||||
|
ret: 0
|
||||||
|
status: Ok(())
|
Loading…
Reference in a new issue