From 7e16da4a7783bfea2e866d7a9f023531726b489d Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 1 Mar 2016 12:26:18 +0000 Subject: [PATCH] transforms.llvm_ir_generator: ignore assignments of None (fixes #309). --- artiq/compiler/transforms/llvm_ir_generator.py | 5 ++++- artiq/test/lit/codegen/assign_none.py | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 artiq/test/lit/codegen/assign_none.py diff --git a/artiq/compiler/transforms/llvm_ir_generator.py b/artiq/compiler/transforms/llvm_ir_generator.py index 0c0d532cd..c59e16689 100644 --- a/artiq/compiler/transforms/llvm_ir_generator.py +++ b/artiq/compiler/transforms/llvm_ir_generator.py @@ -655,8 +655,11 @@ class LLVMIRGenerator: def process_SetLocal(self, insn): env = insn.environment() - llptr = self.llptr_to_var(self.map(env), env.type, insn.var_name) llvalue = self.map(insn.value()) + if isinstance(llvalue.type, ll.VoidType): + # We store NoneType as {} but return it as void. So, bail out here. + return ll.Constant(ll.LiteralStructType([]), []) + llptr = self.llptr_to_var(self.map(env), env.type, insn.var_name) if isinstance(llvalue, ll.Block): llvalue = ll.BlockAddress(self.llfunction, llvalue) if llptr.type.pointee != llvalue.type: diff --git a/artiq/test/lit/codegen/assign_none.py b/artiq/test/lit/codegen/assign_none.py new file mode 100644 index 000000000..000e87ac7 --- /dev/null +++ b/artiq/test/lit/codegen/assign_none.py @@ -0,0 +1,6 @@ +# RUN: %python -m artiq.compiler.testbench.llvmgen %s + +def f(): + pass +def g(): + a = f()