diff --git a/src/main/scala/typechecker/Subtyping.scala b/src/main/scala/typechecker/Subtyping.scala index 6da1c8c7..58bd0da0 100644 --- a/src/main/scala/typechecker/Subtyping.scala +++ b/src/main/scala/typechecker/Subtyping.scala @@ -45,6 +45,8 @@ object Subtyping { case (TStaticInt(v1), TStaticInt(v2)) => v1 == v2 case (_: TIndex, _: TIndex) => true case (_: TFloat, _: TFloat) => true + case (TAlias(r1), t) => r1.toString == t.toString + case (t, TAlias(r1)) => t.toString == r1.toString case _ => t1 == t2 } diff --git a/src/test/scala/TypeCheckerSpec.scala b/src/test/scala/TypeCheckerSpec.scala index 9f2a90ad..4ee9827e 100644 --- a/src/test/scala/TypeCheckerSpec.scala +++ b/src/test/scala/TypeCheckerSpec.scala @@ -971,6 +971,16 @@ class TypeCheckerSpec extends FunSpec { """) } + it("allow record as return value") { + typeCheck(""" + record point { x: bit<32> } + def f(p: point): point = { + let np: point = { x=p.x + 1 }; + return np; + } + """) + } + it("disallow ill-typed return values") { assertThrows[UnexpectedSubtype] { typeCheck(""" @@ -1502,6 +1512,13 @@ class TypeCheckerSpec extends FunSpec { let x = k.p.x + 1; """) } + it("should not throw error on casting") { + typeCheck(""" + record point { x: ubit<32> } + let a: point = {x=10}; + let b: point = (a as point); + """) + } } describe("Record Literals") {