diff --git a/artiq/compiler/builtins.py b/artiq/compiler/builtins.py index 54b25e719..49695d771 100644 --- a/artiq/compiler/builtins.py +++ b/artiq/compiler/builtins.py @@ -169,7 +169,9 @@ def fn_list(): return types.TConstructor(TList()) def fn_array(): - return types.TConstructor(TArray()) + # numpy.array() is actually a "magic" macro that is expanded in-place, but + # just as for builtin functions, we do not want to quote it, etc. + return types.TBuiltinFunction("array") def fn_Exception(): return types.TExceptionConstructor(TException("Exception")) diff --git a/artiq/test/coredevice/test_embedding.py b/artiq/test/coredevice/test_embedding.py index cd8d4daab..4c68c3f82 100644 --- a/artiq/test/coredevice/test_embedding.py +++ b/artiq/test/coredevice/test_embedding.py @@ -530,3 +530,42 @@ class NumpyBoolTest(ExperimentCase): def test_numpy_bool(self): """Test NumPy bools decay to ARTIQ compiler builtin bools as expected""" self.create(_NumpyBool).run() + + +class _Alignment(EnvExperiment): + def build(self): + self.setattr_device("core") + + @rpc + def a_tuple(self) -> TList(TTuple([TBool, TFloat, TBool])): + return [(True, 1234.5678, True)] + + @kernel + def run(self): + a, b, c = self.a_tuple()[0] + d, e, f = self.a_tuple()[0] + assert a == d + assert b == e + assert c == f + return 0 + + +class AlignmentTest(ExperimentCase): + def test_tuple(self): + self.create(_Alignment).run() + + +class _NumpyQuoting(EnvExperiment): + def build(self): + self.setattr_device("core") + + @kernel + def run(self): + a = np.array([10, 20]) + b = np.sqrt(4.0) + + +class NumpyQuotingTest(ExperimentCase): + def test_issue_1871(self): + """Ensure numpy.array() does not break NumPy math functions""" + self.create(_NumpyQuoting).run()