From cc81464f53a02cb41d7b4f9efae75f815c63ea4d Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Mon, 21 Aug 2023 11:02:08 +0100 Subject: [PATCH] Fix type annotations with mixed tuples The type checker/inferer visits every node in an AST tree, including function return annotations. This means for a function definition like def f() -> TTuple([TInt32, TBool]): ... We attempt to type check the list [TInt32, TBool], which generates the unification constraint builtins.TBool ~ builtins.TInt. This causes an internal error due to compiler weirdness. We can avoid this by just nulling-out the return annotation in the embedding stage. The return type isn't actually used anywhere (it's extracted via the inspect module instead), so this is entirely safe. Arguments aren't affected by this, as we already nulled out the annotation (see visit_arg in embedding.py). Signed-off-by: Jonathan Coates --- artiq/compiler/embedding.py | 2 +- artiq/test/lit/embedding/mixed_tuple.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 artiq/test/lit/embedding/mixed_tuple.py diff --git a/artiq/compiler/embedding.py b/artiq/compiler/embedding.py index fd93e729f..58b4425b7 100644 --- a/artiq/compiler/embedding.py +++ b/artiq/compiler/embedding.py @@ -546,7 +546,7 @@ class StitchingASTTypedRewriter(ASTTypedRewriter): node = asttyped.QuotedFunctionDefT( typing_env=extractor.typing_env, globals_in_scope=extractor.global_, signature_type=types.TVar(), return_type=types.TVar(), - name=node.name, args=node.args, returns=node.returns, + name=node.name, args=node.args, returns=None, body=node.body, decorator_list=node.decorator_list, keyword_loc=node.keyword_loc, name_loc=node.name_loc, arrow_loc=node.arrow_loc, colon_loc=node.colon_loc, at_locs=node.at_locs, diff --git a/artiq/test/lit/embedding/mixed_tuple.py b/artiq/test/lit/embedding/mixed_tuple.py new file mode 100644 index 000000000..aaf947149 --- /dev/null +++ b/artiq/test/lit/embedding/mixed_tuple.py @@ -0,0 +1,16 @@ +# RUN: %python -m artiq.compiler.testbench.embedding %s + +from artiq.language.core import * +from artiq.language.types import * + +@kernel +def consume_tuple(x: TTuple([TInt32, TBool])): + print(x) + +@kernel +def return_tuple() -> TTuple([TInt32, TBool]): + return (123, False) + +@kernel +def entrypoint(): + consume_tuple(return_tuple())