diff --git a/core/compiler/src/compile.rs b/core/compiler/src/compile.rs index de66c38..b60e635 100644 --- a/core/compiler/src/compile.rs +++ b/core/compiler/src/compile.rs @@ -1639,38 +1639,46 @@ impl<'a> AstTransformer for VarIdTyPass<'a> { self.assert_eq_arity(input.span, args.posargs.len(), 1); if args.posargs.len() == 1 { let argty = args.posargs[0].ty(); - if let Ty::Seq(i) = argty { - (None, *i) - } else { - self.errors.push(StaticError { - span: self.span(input.span), - kind: StaticErrorKind::IncorrectTyCategory { - found: argty, - expected: "Seq".to_string(), - }, - }); - (None, Ty::Nil) - } + let vty = match argty { + Ty::Seq(i) => *i, + Ty::Any => Ty::Any, + Ty::Unknown => Ty::Unknown, + _ => { + self.errors.push(StaticError { + span: self.span(input.span), + kind: StaticErrorKind::IncorrectTyCategory { + found: argty, + expected: "Seq".to_string(), + }, + }); + Ty::Unknown + } + }; + (None, vty) } else { - (None, Ty::Nil) + (None, Ty::Unknown) } } "tail" => { self.assert_eq_arity(input.span, args.posargs.len(), 1); if args.posargs.len() == 1 { let argty = args.posargs[0].ty(); - if let Ty::Seq(_) = argty { - (None, argty) - } else { - self.errors.push(StaticError { - span: self.span(input.span), - kind: StaticErrorKind::IncorrectTyCategory { - found: argty, - expected: "Seq".to_string(), - }, - }); - (None, Ty::Nil) - } + let vty = match argty { + Ty::Seq(_) => argty, + Ty::Any => Ty::Any, + Ty::Unknown => Ty::Unknown, + _ => { + self.errors.push(StaticError { + span: self.span(input.span), + kind: StaticErrorKind::IncorrectTyCategory { + found: argty, + expected: "Seq".to_string(), + }, + }); + Ty::Unknown + } + }; + (None, vty) } else { (None, Ty::Nil) } diff --git a/examples/seq_any/lib.ar b/examples/seq_any/lib.ar index 4848a47..0dae7eb 100644 --- a/examples/seq_any/lib.ar +++ b/examples/seq_any/lib.ar @@ -2,9 +2,21 @@ fn prepend(lst: [Any]) -> [Float] { cons(100., lst) } +fn prependany(lst: Any) -> Any { + cons(1400., lst) +} + +fn headany(lst: Any) -> Any { + head(lst) +} + +fn tailany(lst: Any) -> Any { + tail(lst) +} + cell top() { let r = rect("met1", x0=0., y0=0., x1=400.)!; - let lst = prepend(cons(500., cons(300., cons(800., cons(200., cons(1400., [])))))); - let v = head(tail(tail(tail(tail(lst))))); + let lst = prepend(prependany(cons(500., cons(300., cons(800., cons(200., cons(1400., []))))))); + let v = headany(tail(tailany(tail(tailany(tail(lst)))))); eq(r.y1, v); }