diff --git a/guppylang/src/guppylang/std/builtins.py b/guppylang/src/guppylang/std/builtins.py index f3aa05346..8495be6a4 100644 --- a/guppylang/src/guppylang/std/builtins.py +++ b/guppylang/src/guppylang/std/builtins.py @@ -3,7 +3,7 @@ from guppylang.std.array import ArrayIter, FrozenarrayIter, array, frozenarray from guppylang.std.bool import bool from guppylang.std.iter import Range, SizedIter, range -from guppylang.std.lang import comptime, owned, py +from guppylang.std.lang import comptime, control, dagger, owned, power, py from guppylang.std.list import list from guppylang.std.mem import mem_swap from guppylang.std.num import ( @@ -102,6 +102,8 @@ "compile", "complex", "comptime", + "control", + "dagger", "delattr", "dict", "dir", @@ -145,6 +147,7 @@ "owned", "panic", "pow", + "power", "print", "property", "py", diff --git a/guppylang/src/guppylang/std/lang.py b/guppylang/src/guppylang/std/lang.py index 697bd5c11..3878eec86 100644 --- a/guppylang/src/guppylang/std/lang.py +++ b/guppylang/src/guppylang/std/lang.py @@ -1,9 +1,16 @@ """Provides Python objects for builtin language keywords.""" +from collections.abc import Generator from typing import Any, Protocol, TypeVar +from guppylang_internals.error import GuppyComptimeError + T = TypeVar("T") +_MODIFIER_COMPTIME_ERROR = ( + "The `{modifier}` modifier is not supported in comptime functions" +) + class _Comptime: """Dummy class to support `@comptime` annotations and `comptime(...)` expressions""" @@ -42,3 +49,18 @@ class Copy(Protocol): class Drop(Protocol): """Bound to mark generic type parameters as being implicitly droppable.""" + + +def control(*args: Any, **kwargs: Any) -> Generator[None]: + """Dummy function to support `with control(...):` blocks in Guppy code.""" + raise GuppyComptimeError(_MODIFIER_COMPTIME_ERROR.format(modifier="control")) + + +def dagger(*args: Any, **kwargs: Any) -> Generator[None]: + """Dummy function to support `with dagger(...):` blocks in Guppy code.""" + raise GuppyComptimeError(_MODIFIER_COMPTIME_ERROR.format(modifier="dagger")) + + +def power(*args: Any, **kwargs: Any) -> Generator[None]: + """Dummy function to support `with power(...):` blocks in Guppy code.""" + raise GuppyComptimeError(_MODIFIER_COMPTIME_ERROR.format(modifier="power")) diff --git a/tests/error/modifier_errors/captured_var_inout_own.err b/tests/error/modifier_errors/captured_var_inout_own.err index 5712e0e6a..b0524f8d0 100644 --- a/tests/error/modifier_errors/captured_var_inout_own.err +++ b/tests/error/modifier_errors/captured_var_inout_own.err @@ -1,15 +1,15 @@ -Error: Not owned (at $FILE:14:16) +Error: Not owned (at $FILE:16:16) | -12 | a = qubit() -13 | with dagger: -14 | discard(a) +14 | a = qubit() +15 | with dagger: +16 | discard(a) | ^ Function `discard` wants to take ownership of this argument, | but `__modified__()` doesn't own `a` Help: | -11 | def test() -> None: -12 | a = qubit() +13 | def test() -> None: +14 | a = qubit() | - Argument `a` is only borrowed. Consider taking ownership: | `a: qubit @owned` diff --git a/tests/error/modifier_errors/captured_var_inout_own.py b/tests/error/modifier_errors/captured_var_inout_own.py index 211baef94..b183f06c6 100644 --- a/tests/error/modifier_errors/captured_var_inout_own.py +++ b/tests/error/modifier_errors/captured_var_inout_own.py @@ -1,5 +1,7 @@ from guppylang.decorator import guppy from guppylang.std.quantum import qubit, owned +from guppylang.std.builtins import dagger + @guppy.declare(dagger=True) diff --git a/tests/error/modifier_errors/captured_var_inout_reassign.err b/tests/error/modifier_errors/captured_var_inout_reassign.err index 3a8ab0040..bdcf779f8 100644 --- a/tests/error/modifier_errors/captured_var_inout_reassign.err +++ b/tests/error/modifier_errors/captured_var_inout_reassign.err @@ -1,8 +1,8 @@ -Error: Drop violation (at $FILE:11:4) +Error: Drop violation (at $FILE:13:4) | - 9 | @guppy -10 | def test() -> None: -11 | a = qubit() +11 | @guppy +12 | def test() -> None: +13 | a = qubit() | ^ Variable `a` with non-droppable type `qubit` is leaked Help: Make sure that `a` is consumed or returned to avoid the leak diff --git a/tests/error/modifier_errors/captured_var_inout_reassign.py b/tests/error/modifier_errors/captured_var_inout_reassign.py index ce78856fd..ad130b537 100644 --- a/tests/error/modifier_errors/captured_var_inout_reassign.py +++ b/tests/error/modifier_errors/captured_var_inout_reassign.py @@ -1,5 +1,7 @@ from guppylang.decorator import guppy from guppylang.std.quantum import qubit +from guppylang.std.builtins import dagger + @guppy.declare(dagger=True) diff --git a/tests/error/modifier_errors/ctrl_arg_array_many_arg.py b/tests/error/modifier_errors/ctrl_arg_array_many_arg.py index a2f179200..f22c02073 100644 --- a/tests/error/modifier_errors/ctrl_arg_array_many_arg.py +++ b/tests/error/modifier_errors/ctrl_arg_array_many_arg.py @@ -1,6 +1,6 @@ from guppylang.decorator import guppy from guppylang.std.array import array -from guppylang.std.builtins import owned +from guppylang.std.builtins import owned, control from guppylang.std.quantum import qubit diff --git a/tests/error/modifier_errors/ctrl_arg_body_copy.err b/tests/error/modifier_errors/ctrl_arg_body_copy.err index e5f0d25be..319d464ac 100644 --- a/tests/error/modifier_errors/ctrl_arg_body_copy.err +++ b/tests/error/modifier_errors/ctrl_arg_body_copy.err @@ -1,15 +1,15 @@ -Error: Copy violation (at $FILE:12:20) +Error: Copy violation (at $FILE:13:20) | -10 | def test() -> None: -11 | q = qubit() -12 | with control(q, q): +11 | def test() -> None: +12 | q = qubit() +13 | with control(q, q): | ^ Variable `q` with non-copyable type `qubit` cannot be | borrowed ... Note: | -11 | q = qubit() -12 | with control(q, q): +12 | q = qubit() +13 | with control(q, q): | - Variable `q` already borrowed here Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/ctrl_arg_body_copy.py b/tests/error/modifier_errors/ctrl_arg_body_copy.py index 822382867..438d756af 100644 --- a/tests/error/modifier_errors/ctrl_arg_body_copy.py +++ b/tests/error/modifier_errors/ctrl_arg_body_copy.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import control from guppylang.std.quantum import qubit, owned diff --git a/tests/error/modifier_errors/ctrl_arg_copy.err b/tests/error/modifier_errors/ctrl_arg_copy.err index c0fc2bd07..37f01f97c 100644 --- a/tests/error/modifier_errors/ctrl_arg_copy.err +++ b/tests/error/modifier_errors/ctrl_arg_copy.err @@ -1,15 +1,15 @@ -Error: Copy violation (at $FILE:17:12) +Error: Copy violation (at $FILE:18:12) | -15 | q = qubit() -16 | with control(q): -17 | use(q) +16 | q = qubit() +17 | with control(q): +18 | use(q) | ^ Variable `q` with non-copyable type `qubit` cannot be | borrowed ... Note: | -15 | q = qubit() -16 | with control(q): +16 | q = qubit() +17 | with control(q): | - Variable `q` already borrowed here Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/ctrl_arg_copy.py b/tests/error/modifier_errors/ctrl_arg_copy.py index d306be226..205142e1e 100644 --- a/tests/error/modifier_errors/ctrl_arg_copy.py +++ b/tests/error/modifier_errors/ctrl_arg_copy.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import control from guppylang.std.quantum import qubit, owned diff --git a/tests/error/modifier_errors/ctrl_arg_not_assigned.err b/tests/error/modifier_errors/ctrl_arg_not_assigned.err index 93caa595f..f2e25efe5 100644 --- a/tests/error/modifier_errors/ctrl_arg_not_assigned.err +++ b/tests/error/modifier_errors/ctrl_arg_not_assigned.err @@ -1,8 +1,8 @@ -Error: Drop violation (at $FILE:7:17) +Error: Drop violation (at $FILE:8:17) | -5 | @guppy -6 | def test() -> None: -7 | with control(qubit()): +6 | @guppy +7 | def test() -> None: +8 | with control(qubit()): | ^^^^^^^ Expression with non-droppable type `qubit` is leaked Help: Consider assigning this value to a local variable diff --git a/tests/error/modifier_errors/ctrl_arg_not_assigned.py b/tests/error/modifier_errors/ctrl_arg_not_assigned.py index a833146fe..b7cd5b85f 100644 --- a/tests/error/modifier_errors/ctrl_arg_not_assigned.py +++ b/tests/error/modifier_errors/ctrl_arg_not_assigned.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import control from guppylang.std.quantum import qubit diff --git a/tests/error/modifier_errors/ctrl_arg_type.err b/tests/error/modifier_errors/ctrl_arg_type.err index 439e0732f..539809c2a 100644 --- a/tests/error/modifier_errors/ctrl_arg_type.err +++ b/tests/error/modifier_errors/ctrl_arg_type.err @@ -1,8 +1,8 @@ -Error: Type mismatch (at $FILE:7:20) +Error: Type mismatch (at $FILE:9:20) | -5 | def test() -> None: -6 | x = qubit() -7 | with control(x, True): +7 | def test() -> None: +8 | x = qubit() +9 | with control(x, True): | ^^^^ Expected expression of type `qubit`, got `bool` Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/ctrl_arg_type.py b/tests/error/modifier_errors/ctrl_arg_type.py index 31b59604f..277d255c0 100644 --- a/tests/error/modifier_errors/ctrl_arg_type.py +++ b/tests/error/modifier_errors/ctrl_arg_type.py @@ -1,4 +1,6 @@ from guppylang.decorator import guppy +from guppylang.std.quantum import qubit +from guppylang.std.builtins import control @guppy diff --git a/tests/error/modifier_errors/ctrl_arg_type_arr.err b/tests/error/modifier_errors/ctrl_arg_type_arr.err index d8e34d63e..b0fe82b99 100644 --- a/tests/error/modifier_errors/ctrl_arg_type_arr.err +++ b/tests/error/modifier_errors/ctrl_arg_type_arr.err @@ -1,8 +1,8 @@ -Error: Type mismatch (at $FILE:7:17) +Error: Type mismatch (at $FILE:9:17) | -5 | def test() -> None: -6 | x = array(1, 2, 3) -7 | with control(x): +7 | def test() -> None: +8 | x = array(1, 2, 3) +9 | with control(x): | ^ Expected expression of type `array[qubit, ?n]`, got | `array[int, 3]` diff --git a/tests/error/modifier_errors/ctrl_arg_type_arr.py b/tests/error/modifier_errors/ctrl_arg_type_arr.py index 8e02fe80f..9079f97f9 100644 --- a/tests/error/modifier_errors/ctrl_arg_type_arr.py +++ b/tests/error/modifier_errors/ctrl_arg_type_arr.py @@ -1,4 +1,6 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import array +from guppylang.std.builtins import control @guppy diff --git a/tests/error/modifier_errors/ctrl_no_arg.err b/tests/error/modifier_errors/ctrl_no_arg.err index 72741f123..a0c9afec5 100644 --- a/tests/error/modifier_errors/ctrl_no_arg.err +++ b/tests/error/modifier_errors/ctrl_no_arg.err @@ -1,8 +1,8 @@ -Error: Not enough arguments (at $FILE:8:16) +Error: Not enough arguments (at $FILE:9:16) | -6 | @guppy -7 | def test() -> None: -8 | with control(): +7 | @guppy +8 | def test() -> None: +9 | with control(): | ^^ Missing argument (expected 1, got 0) Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/ctrl_no_arg.py b/tests/error/modifier_errors/ctrl_no_arg.py index 091c88148..b58c5ca61 100644 --- a/tests/error/modifier_errors/ctrl_no_arg.py +++ b/tests/error/modifier_errors/ctrl_no_arg.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import control # `control` is overloaded, so the number of arguments need not be fixed to 1. diff --git a/tests/error/modifier_errors/dagger_arg.err b/tests/error/modifier_errors/dagger_arg.err index c34cdefc7..1d2cc40e5 100644 --- a/tests/error/modifier_errors/dagger_arg.err +++ b/tests/error/modifier_errors/dagger_arg.err @@ -1,8 +1,8 @@ -Error: Too many arguments (at $FILE:6:16) +Error: Too many arguments (at $FILE:7:16) | -4 | @guppy -5 | def test() -> None: -6 | with dagger(1): +5 | @guppy +6 | def test() -> None: +7 | with dagger(1): | ^ Unexpected argument (expected 0, got 1) Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/dagger_arg.py b/tests/error/modifier_errors/dagger_arg.py index 9d151c517..b9ba472ed 100644 --- a/tests/error/modifier_errors/dagger_arg.py +++ b/tests/error/modifier_errors/dagger_arg.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import dagger @guppy diff --git a/tests/error/modifier_errors/dagger_assign.err b/tests/error/modifier_errors/dagger_assign.err index 05af0c508..cc6034a5c 100644 --- a/tests/error/modifier_errors/dagger_assign.err +++ b/tests/error/modifier_errors/dagger_assign.err @@ -1,14 +1,14 @@ -Error: Invalid expression in dagger (at $FILE:7:8) +Error: Invalid expression in dagger (at $FILE:8:8) | -5 | def test() -> None: -6 | with dagger: -7 | a = 3 +6 | def test() -> None: +7 | with dagger: +8 | a = 3 | ^^^^^ Assignment found in a dagger context Note: | -5 | def test() -> None: -6 | with dagger: +6 | def test() -> None: +7 | with dagger: | ------ dagger modifier is used here Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/dagger_assign.py b/tests/error/modifier_errors/dagger_assign.py index 5c6918d8b..b64dd0047 100644 --- a/tests/error/modifier_errors/dagger_assign.py +++ b/tests/error/modifier_errors/dagger_assign.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import dagger @guppy diff --git a/tests/error/modifier_errors/dagger_loop.err b/tests/error/modifier_errors/dagger_loop.err index d0e3d99d6..74a923491 100644 --- a/tests/error/modifier_errors/dagger_loop.err +++ b/tests/error/modifier_errors/dagger_loop.err @@ -1,16 +1,16 @@ -Error: Invalid expression in dagger (at $FILE:7:8) +Error: Invalid expression in dagger (at $FILE:8:8) | -5 | def test() -> None: -6 | with dagger: -7 | for _ in range(46): +6 | def test() -> None: +7 | with dagger: +8 | for _ in range(46): | ^^^^^^^^^^^^^^^^^^^ -8 | pass +9 | pass | ^^^^^^^^^^^^^^^^ Loop found in a dagger context Note: | -5 | def test() -> None: -6 | with dagger: +6 | def test() -> None: +7 | with dagger: | ------ dagger modifier is used here Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/dagger_loop.py b/tests/error/modifier_errors/dagger_loop.py index 51d04f439..3e726c1af 100644 --- a/tests/error/modifier_errors/dagger_loop.py +++ b/tests/error/modifier_errors/dagger_loop.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import dagger @guppy diff --git a/tests/error/modifier_errors/flags_nested.err b/tests/error/modifier_errors/flags_nested.err index b36a0dbc9..4d2cc822a 100644 --- a/tests/error/modifier_errors/flags_nested.err +++ b/tests/error/modifier_errors/flags_nested.err @@ -1,8 +1,8 @@ -Error: Unitary constraint violation (at $FILE:15:12) +Error: Unitary constraint violation (at $FILE:16:12) | -13 | with dagger: -14 | with power(2): -15 | foo(q) +14 | with dagger: +15 | with power(2): +16 | foo(q) | ^^^^^^ This function cannot be called in a dagger context Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/flags_nested.py b/tests/error/modifier_errors/flags_nested.py index 919ee0269..f595e8087 100644 --- a/tests/error/modifier_errors/flags_nested.py +++ b/tests/error/modifier_errors/flags_nested.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import dagger, power from guppylang.std.quantum import qubit diff --git a/tests/error/modifier_errors/flags_nested_combined_outer.err b/tests/error/modifier_errors/flags_nested_combined_outer.err index b75cffdcb..9c589c19f 100644 --- a/tests/error/modifier_errors/flags_nested_combined_outer.err +++ b/tests/error/modifier_errors/flags_nested_combined_outer.err @@ -1,8 +1,8 @@ -Error: Unitary constraint violation (at $FILE:15:12) +Error: Unitary constraint violation (at $FILE:16:12) | -13 | with control(ctrl), dagger: -14 | with power(2): -15 | foo(q) +14 | with control(ctrl), dagger: +15 | with power(2): +16 | foo(q) | ^^^^^^ This function cannot be called in a unitary context Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/flags_nested_combined_outer.py b/tests/error/modifier_errors/flags_nested_combined_outer.py index 6bf57a4ed..bf4e90024 100644 --- a/tests/error/modifier_errors/flags_nested_combined_outer.py +++ b/tests/error/modifier_errors/flags_nested_combined_outer.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import control, dagger, power from guppylang.std.quantum import qubit diff --git a/tests/error/modifier_errors/flags_nested_control_dagger.err b/tests/error/modifier_errors/flags_nested_control_dagger.err index 6b300ef35..d55ad0ed9 100644 --- a/tests/error/modifier_errors/flags_nested_control_dagger.err +++ b/tests/error/modifier_errors/flags_nested_control_dagger.err @@ -1,8 +1,8 @@ -Error: Unitary constraint violation (at $FILE:15:12) +Error: Unitary constraint violation (at $FILE:16:12) | -13 | with control(ctrl): -14 | with dagger: -15 | foo(q) +14 | with control(ctrl): +15 | with dagger: +16 | foo(q) | ^^^^^^ This function cannot be called in a dagger context Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/flags_nested_control_dagger.py b/tests/error/modifier_errors/flags_nested_control_dagger.py index 3406fc965..9b24a59bf 100644 --- a/tests/error/modifier_errors/flags_nested_control_dagger.py +++ b/tests/error/modifier_errors/flags_nested_control_dagger.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import control, dagger from guppylang.std.quantum import qubit diff --git a/tests/error/modifier_errors/flags_nested_missing_power.err b/tests/error/modifier_errors/flags_nested_missing_power.err index f2c7e215c..5872a198f 100644 --- a/tests/error/modifier_errors/flags_nested_missing_power.err +++ b/tests/error/modifier_errors/flags_nested_missing_power.err @@ -1,8 +1,8 @@ -Error: Unitary constraint violation (at $FILE:15:12) +Error: Unitary constraint violation (at $FILE:16:12) | -13 | with dagger: -14 | with power(2): -15 | foo(q) +14 | with dagger: +15 | with power(2): +16 | foo(q) | ^^^^^^ This function cannot be called in a power context Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/flags_nested_missing_power.py b/tests/error/modifier_errors/flags_nested_missing_power.py index 73762d383..a7da17131 100644 --- a/tests/error/modifier_errors/flags_nested_missing_power.py +++ b/tests/error/modifier_errors/flags_nested_missing_power.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import dagger, power from guppylang.std.quantum import qubit diff --git a/tests/error/modifier_errors/flags_nested_power_control.err b/tests/error/modifier_errors/flags_nested_power_control.err index 5cc85ad87..ce0d32151 100644 --- a/tests/error/modifier_errors/flags_nested_power_control.err +++ b/tests/error/modifier_errors/flags_nested_power_control.err @@ -1,8 +1,8 @@ -Error: Unitary constraint violation (at $FILE:15:12) +Error: Unitary constraint violation (at $FILE:16:12) | -13 | with power(2): -14 | with control(ctrl): -15 | foo(q) +14 | with power(2): +15 | with control(ctrl): +16 | foo(q) | ^^^^^^ This function cannot be called in a control context Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/flags_nested_power_control.py b/tests/error/modifier_errors/flags_nested_power_control.py index ee61a0ea9..ace251591 100644 --- a/tests/error/modifier_errors/flags_nested_power_control.py +++ b/tests/error/modifier_errors/flags_nested_power_control.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import control, power from guppylang.std.quantum import qubit diff --git a/tests/error/modifier_errors/flags_nested_triple.err b/tests/error/modifier_errors/flags_nested_triple.err index 10547ad1c..8e41aaaed 100644 --- a/tests/error/modifier_errors/flags_nested_triple.err +++ b/tests/error/modifier_errors/flags_nested_triple.err @@ -1,8 +1,8 @@ -Error: Unitary constraint violation (at $FILE:15:16) +Error: Unitary constraint violation (at $FILE:16:16) | -13 | with control(ctrl): -14 | with power(2): -15 | foo(q) +14 | with control(ctrl): +15 | with power(2): +16 | foo(q) | ^^^^^^ This function cannot be called in a unitary context Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/flags_nested_triple.py b/tests/error/modifier_errors/flags_nested_triple.py index 65bd1d91d..e3a65616a 100644 --- a/tests/error/modifier_errors/flags_nested_triple.py +++ b/tests/error/modifier_errors/flags_nested_triple.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import control, dagger, power from guppylang.std.quantum import qubit diff --git a/tests/error/modifier_errors/flags_triple_dagger.err b/tests/error/modifier_errors/flags_triple_dagger.err index f851fb4df..8a1b5ed4d 100644 --- a/tests/error/modifier_errors/flags_triple_dagger.err +++ b/tests/error/modifier_errors/flags_triple_dagger.err @@ -1,8 +1,8 @@ -Error: Unitary constraint violation (at $FILE:12:8) +Error: Unitary constraint violation (at $FILE:13:8) | -10 | def test(q: qubit) -> None: -11 | with dagger, dagger, dagger: -12 | foo(q) +11 | def test(q: qubit) -> None: +12 | with dagger, dagger, dagger: +13 | foo(q) | ^^^^^^ This function cannot be called in a dagger context Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/flags_triple_dagger.py b/tests/error/modifier_errors/flags_triple_dagger.py index c8a6362b7..5c677304d 100644 --- a/tests/error/modifier_errors/flags_triple_dagger.py +++ b/tests/error/modifier_errors/flags_triple_dagger.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import dagger from guppylang.std.quantum import qubit diff --git a/tests/error/modifier_errors/higher_order.err b/tests/error/modifier_errors/higher_order.err index 94f82424b..59b4662d3 100644 --- a/tests/error/modifier_errors/higher_order.err +++ b/tests/error/modifier_errors/higher_order.err @@ -1,8 +1,8 @@ -Error: Unitary constraint violation (at $FILE:10:4) +Error: Unitary constraint violation (at $FILE:11:4) | - 8 | def test_ho(f: Callable[[qubit], None], q: qubit) -> None: - 9 | # There is no way to use specify flags for f -10 | f(q) + 9 | def test_ho(f: Callable[[qubit], None], q: qubit) -> None: +10 | # There is no way to use specify flags for f +11 | f(q) | ^^^^ This function cannot be called in a dagger context Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/higher_order.py b/tests/error/modifier_errors/higher_order.py index 87148ee84..d35e25bcf 100644 --- a/tests/error/modifier_errors/higher_order.py +++ b/tests/error/modifier_errors/higher_order.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import dagger from guppylang.std.quantum import qubit, h, discard from collections.abc import Callable diff --git a/tests/error/modifier_errors/linear_check_in_block.err b/tests/error/modifier_errors/linear_check_in_block.err index ed400434c..096ae6d41 100644 --- a/tests/error/modifier_errors/linear_check_in_block.err +++ b/tests/error/modifier_errors/linear_check_in_block.err @@ -1,15 +1,15 @@ -Error: Copy violation (at $FILE:15:16) +Error: Copy violation (at $FILE:16:16) | -13 | with control(q): -14 | xs = array(1, 2, 3) -15 | foo(xs, xs) +14 | with control(q): +15 | xs = array(1, 2, 3) +16 | foo(xs, xs) | ^^ Variable `xs` with non-copyable type `array[int, 3]` cannot | be borrowed ... Note: | -14 | xs = array(1, 2, 3) -15 | foo(xs, xs) +15 | xs = array(1, 2, 3) +16 | foo(xs, xs) | -- Variable `xs` already borrowed here Help: Consider copying `xs` instead of moving it: `xs.copy()` diff --git a/tests/error/modifier_errors/linear_check_in_block.py b/tests/error/modifier_errors/linear_check_in_block.py index 306e96876..f42709b45 100644 --- a/tests/error/modifier_errors/linear_check_in_block.py +++ b/tests/error/modifier_errors/linear_check_in_block.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import control from guppylang.std.quantum import qubit from guppylang.std.array import array diff --git a/tests/error/modifier_errors/loop_control_found.err b/tests/error/modifier_errors/loop_control_found.err index dd1ede98d..62db0845b 100644 --- a/tests/error/modifier_errors/loop_control_found.err +++ b/tests/error/modifier_errors/loop_control_found.err @@ -1,14 +1,14 @@ -Error: Unexpected loop control (at $FILE:8:12) +Error: Unexpected loop control (at $FILE:9:12) | -6 | for i in range(123): -7 | with dagger: -8 | continue +7 | for i in range(123): +8 | with dagger: +9 | continue | ^^^^^^^^ Continue found in a `With` block Note: | -6 | for i in range(123): -7 | with dagger: +7 | for i in range(123): +8 | with dagger: | ------ modifier is used here Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/loop_control_found.py b/tests/error/modifier_errors/loop_control_found.py index a62f97ebb..cfb9e78fe 100644 --- a/tests/error/modifier_errors/loop_control_found.py +++ b/tests/error/modifier_errors/loop_control_found.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import dagger @guppy diff --git a/tests/error/modifier_errors/optional_as_found.err b/tests/error/modifier_errors/optional_as_found.err index 970779c0c..39c3216f0 100644 --- a/tests/error/modifier_errors/optional_as_found.err +++ b/tests/error/modifier_errors/optional_as_found.err @@ -1,8 +1,8 @@ -Error: Unsupported (at $FILE:6:9) +Error: Unsupported (at $FILE:7:9) | -4 | @guppy -5 | def test() -> None: -6 | with power(1) as x: +5 | @guppy +6 | def test() -> None: +7 | with power(1) as x: | ^^^^^^^^^^^^^ `as` expression is not supported Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/optional_as_found.py b/tests/error/modifier_errors/optional_as_found.py index 0810a0a1b..98889d793 100644 --- a/tests/error/modifier_errors/optional_as_found.py +++ b/tests/error/modifier_errors/optional_as_found.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import power @guppy diff --git a/tests/error/modifier_errors/power_arg_type.err b/tests/error/modifier_errors/power_arg_type.err index 24dafa4d5..092ae66d0 100644 --- a/tests/error/modifier_errors/power_arg_type.err +++ b/tests/error/modifier_errors/power_arg_type.err @@ -1,8 +1,8 @@ -Error: Type mismatch (at $FILE:6:15) +Error: Type mismatch (at $FILE:7:15) | -4 | @guppy -5 | def test() -> None: -6 | with power(0.3): +5 | @guppy +6 | def test() -> None: +7 | with power(0.3): | ^^^ Expected expression of type `nat`, got `float` Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/power_arg_type.py b/tests/error/modifier_errors/power_arg_type.py index d2389206c..2fdb81e73 100644 --- a/tests/error/modifier_errors/power_arg_type.py +++ b/tests/error/modifier_errors/power_arg_type.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import power @guppy diff --git a/tests/error/modifier_errors/power_arg_typecheck_inside.err b/tests/error/modifier_errors/power_arg_typecheck_inside.err index 5e485a26d..da79c3be4 100644 --- a/tests/error/modifier_errors/power_arg_typecheck_inside.err +++ b/tests/error/modifier_errors/power_arg_typecheck_inside.err @@ -1,8 +1,8 @@ -Error: Operator not defined (at $FILE:6:15) +Error: Operator not defined (at $FILE:7:15) | -4 | @guppy -5 | def test() -> None: -6 | with power(12 + False): +5 | @guppy +6 | def test() -> None: +7 | with power(12 + False): | ^^^^^^^^^^ Binary operator `+` not defined for `int` and `bool` Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/power_arg_typecheck_inside.py b/tests/error/modifier_errors/power_arg_typecheck_inside.py index 41e377908..1ba65855d 100644 --- a/tests/error/modifier_errors/power_arg_typecheck_inside.py +++ b/tests/error/modifier_errors/power_arg_typecheck_inside.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import power @guppy diff --git a/tests/error/modifier_errors/power_many_arg.err b/tests/error/modifier_errors/power_many_arg.err index 0f4513e86..55622441d 100644 --- a/tests/error/modifier_errors/power_many_arg.err +++ b/tests/error/modifier_errors/power_many_arg.err @@ -1,8 +1,8 @@ -Error: Too many arguments (at $FILE:6:18) +Error: Too many arguments (at $FILE:7:18) | -4 | @guppy -5 | def test() -> None: -6 | with power(1, 2, 3): +5 | @guppy +6 | def test() -> None: +7 | with power(1, 2, 3): | ^^^^ Unexpected arguments (expected 1, got 3) Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/power_many_arg.py b/tests/error/modifier_errors/power_many_arg.py index 0e9e953fe..115d616d0 100644 --- a/tests/error/modifier_errors/power_many_arg.py +++ b/tests/error/modifier_errors/power_many_arg.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import power @guppy diff --git a/tests/error/modifier_errors/power_no_arg.err b/tests/error/modifier_errors/power_no_arg.err index 05c59a4b3..7ed84569e 100644 --- a/tests/error/modifier_errors/power_no_arg.err +++ b/tests/error/modifier_errors/power_no_arg.err @@ -1,8 +1,8 @@ -Error: Not enough arguments (at $FILE:6:14) +Error: Not enough arguments (at $FILE:7:14) | -4 | @guppy -5 | def test() -> None: -6 | with power(): +5 | @guppy +6 | def test() -> None: +7 | with power(): | ^^ Missing argument (expected 1, got 0) Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/power_no_arg.py b/tests/error/modifier_errors/power_no_arg.py index dbaafec9f..87c23895b 100644 --- a/tests/error/modifier_errors/power_no_arg.py +++ b/tests/error/modifier_errors/power_no_arg.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import power @guppy diff --git a/tests/error/modifier_errors/return_found.err b/tests/error/modifier_errors/return_found.err index cfa3114be..daa017ce5 100644 --- a/tests/error/modifier_errors/return_found.err +++ b/tests/error/modifier_errors/return_found.err @@ -1,14 +1,14 @@ -Error: Unexpected return (at $FILE:7:8) +Error: Unexpected return (at $FILE:8:8) | -5 | def test() -> None: -6 | with dagger: -7 | return +6 | def test() -> None: +7 | with dagger: +8 | return | ^^^^^^ Return found in a `With` block Note: | -5 | def test() -> None: -6 | with dagger: +6 | def test() -> None: +7 | with dagger: | ------ modifier is used here Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/return_found.py b/tests/error/modifier_errors/return_found.py index 6ccc9eb3d..fdeffa727 100644 --- a/tests/error/modifier_errors/return_found.py +++ b/tests/error/modifier_errors/return_found.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import dagger @guppy diff --git a/tests/error/modifier_errors/type_check_in_block.err b/tests/error/modifier_errors/type_check_in_block.err index 23aa24027..a8fb7a94a 100644 --- a/tests/error/modifier_errors/type_check_in_block.err +++ b/tests/error/modifier_errors/type_check_in_block.err @@ -1,8 +1,8 @@ -Error: Operator not defined (at $FILE:7:8) +Error: Operator not defined (at $FILE:8:8) | -5 | def test() -> None: -6 | with dagger: -7 | 1 + True +6 | def test() -> None: +7 | with dagger: +8 | 1 + True | ^^^^^^^^ Binary operator `+` not defined for `int` and `bool` Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/type_check_in_block.py b/tests/error/modifier_errors/type_check_in_block.py index c25b862ed..ef9e9b0f4 100644 --- a/tests/error/modifier_errors/type_check_in_block.py +++ b/tests/error/modifier_errors/type_check_in_block.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import dagger @guppy diff --git a/tests/error/modifier_errors/variable_leak.err b/tests/error/modifier_errors/variable_leak.err index 1be21c71b..d97893cd5 100644 --- a/tests/error/modifier_errors/variable_leak.err +++ b/tests/error/modifier_errors/variable_leak.err @@ -1,8 +1,8 @@ -Error: Variable not defined (at $FILE:9:11) - | -7 | with power(1): -8 | x = 1 -9 | return x + 2 - | ^ `x` is not defined +Error: Variable not defined (at $FILE:10:11) + | + 8 | with power(1): + 9 | x = 1 +10 | return x + 2 + | ^ `x` is not defined Guppy compilation failed due to 1 previous error diff --git a/tests/error/modifier_errors/variable_leak.py b/tests/error/modifier_errors/variable_leak.py index 92827349f..87e1e170f 100644 --- a/tests/error/modifier_errors/variable_leak.py +++ b/tests/error/modifier_errors/variable_leak.py @@ -1,4 +1,5 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import power # TODO: The error message is confusing. diff --git a/tests/error/tracing_errors/control_in_comptime.err b/tests/error/tracing_errors/control_in_comptime.err new file mode 100644 index 000000000..6e4db05c7 --- /dev/null +++ b/tests/error/tracing_errors/control_in_comptime.err @@ -0,0 +1,6 @@ +Traceback (most recent call last): + File "$FILE", line 16, in + foo.compile() + File "$FILE", line 10, in foo + with control(q2): +guppylang_internals.error.GuppyComptimeError: The `control` modifier is not supported in comptime functions diff --git a/tests/error/tracing_errors/control_in_comptime.py b/tests/error/tracing_errors/control_in_comptime.py new file mode 100644 index 000000000..9cbaa0cf3 --- /dev/null +++ b/tests/error/tracing_errors/control_in_comptime.py @@ -0,0 +1,16 @@ +from guppylang import guppy +from guppylang.std.quantum import qubit, h, measure +from guppylang.std.lang import control + + +@guppy.comptime +def foo() -> None: + q1 = qubit() + q2 = qubit() + with control(q2): + h(q1) + measure(q1) + measure(q2) + + +foo.compile() diff --git a/tests/error/tracing_errors/dagger_in_comptime.err b/tests/error/tracing_errors/dagger_in_comptime.err new file mode 100644 index 000000000..4d23e6a65 --- /dev/null +++ b/tests/error/tracing_errors/dagger_in_comptime.err @@ -0,0 +1,6 @@ +Traceback (most recent call last): + File "$FILE", line 14, in + foo.compile() + File "$FILE", line 9, in foo + with dagger(): +guppylang_internals.error.GuppyComptimeError: The `dagger` modifier is not supported in comptime functions diff --git a/tests/error/tracing_errors/dagger_in_comptime.py b/tests/error/tracing_errors/dagger_in_comptime.py new file mode 100644 index 000000000..9bfa99cf9 --- /dev/null +++ b/tests/error/tracing_errors/dagger_in_comptime.py @@ -0,0 +1,14 @@ +from guppylang import guppy +from guppylang.std.quantum import qubit, h, measure +from guppylang.std.lang import dagger + + +@guppy.comptime +def foo() -> None: + q1 = qubit() + with dagger(): + h(q1) + measure(q1) + + +foo.compile() diff --git a/tests/error/tracing_errors/power_in_comptime.err b/tests/error/tracing_errors/power_in_comptime.err new file mode 100644 index 000000000..424f21c88 --- /dev/null +++ b/tests/error/tracing_errors/power_in_comptime.err @@ -0,0 +1,6 @@ +Traceback (most recent call last): + File "$FILE", line 14, in + foo.compile() + File "$FILE", line 9, in foo + with power(2): +guppylang_internals.error.GuppyComptimeError: The `power` modifier is not supported in comptime functions diff --git a/tests/error/tracing_errors/power_in_comptime.py b/tests/error/tracing_errors/power_in_comptime.py new file mode 100644 index 000000000..e28c8bdec --- /dev/null +++ b/tests/error/tracing_errors/power_in_comptime.py @@ -0,0 +1,14 @@ +from guppylang import guppy +from guppylang.std.quantum import qubit, h, measure +from guppylang.std.lang import power + + +@guppy.comptime +def foo() -> None: + q1 = qubit() + with power(2): + h(q1) + measure(q1) + + +foo.compile() diff --git a/tests/integration/test_modifier.py b/tests/integration/test_modifier.py index c1209c9f1..16b07d453 100644 --- a/tests/integration/test_modifier.py +++ b/tests/integration/test_modifier.py @@ -1,15 +1,9 @@ from guppylang.decorator import guppy from guppylang.std.quantum import qubit from guppylang.std.num import nat -from guppylang.std.builtins import owned +from guppylang.std.builtins import owned, control, dagger, power from guppylang.std.array import array -# Dummy variables to suppress Undefined name -# TODO: `ruff` fails when without these, which need to be fixed -dagger = object() -control = object() -power = object() - def test_dagger_simple(validate): @guppy