From 184e983f341bd8f1f16404b02dd9dc742a65b685 Mon Sep 17 00:00:00 2001 From: nicolaassolini-qntm Date: Wed, 17 Jun 2026 15:16:27 +0100 Subject: [PATCH] only power modifier is experimental --- .../src/guppylang_internals/cfg/builder.py | 4 ++-- .../src/guppylang_internals/experimental.py | 11 ++++------ .../src/guppylang_internals/tys/parsing.py | 3 --- .../{modifier.err => power_modifier.err} | 12 +++++----- .../{modifier.py => power_modifier.py} | 3 ++- .../experimental_errors/unitary_callable.err | 12 ---------- .../experimental_errors/unitary_callable.py | 22 ------------------- 7 files changed, 13 insertions(+), 54 deletions(-) rename tests/error/experimental_errors/{modifier.err => power_modifier.err} (57%) rename tests/error/experimental_errors/{modifier.py => power_modifier.py} (63%) delete mode 100644 tests/error/experimental_errors/unitary_callable.err delete mode 100644 tests/error/experimental_errors/unitary_callable.py diff --git a/guppylang-internals/src/guppylang_internals/cfg/builder.py b/guppylang-internals/src/guppylang_internals/cfg/builder.py index 902e075ba..a167d9281 100644 --- a/guppylang-internals/src/guppylang_internals/cfg/builder.py +++ b/guppylang-internals/src/guppylang_internals/cfg/builder.py @@ -29,7 +29,7 @@ from guppylang_internals.error import GuppyError, InternalGuppyError from guppylang_internals.experimental import ( check_lists_enabled, - check_modifiers_enabled, + check_power_modifier_enabled, ) from guppylang_internals.nodes import ( ComptimeExpr, @@ -348,7 +348,6 @@ def visit_FunctionDef( return bb def visit_With(self, node: ast.With, bb: BB, jumps: Jumps) -> BB | None: - check_modifiers_enabled(node) self._validate_modified_block(node) # Build context expressions and extract modifiers before constructing the inner @@ -404,6 +403,7 @@ def _handle_withitem(self, node: ast.withitem) -> Modifier: raise GuppyError(WrongNumberOfArgsError(span, 1, len(e.args))) modifier = Control(e, e.args) case ast.Call(func=ast.Name(id="power")): + check_power_modifier_enabled(e.func) if len(e.args) == 0: span = Span(to_span(e.func).end, to_span(e).end) raise GuppyError(WrongNumberOfArgsError(span, 1, len(e.args))) diff --git a/guppylang-internals/src/guppylang_internals/experimental.py b/guppylang-internals/src/guppylang_internals/experimental.py index 5a9f2cafe..dc1244eec 100644 --- a/guppylang-internals/src/guppylang_internals/experimental.py +++ b/guppylang-internals/src/guppylang_internals/experimental.py @@ -76,11 +76,8 @@ def check_capturing_closures_enabled(loc: AstNode | None = None) -> None: raise GuppyError(UnsupportedError(loc, "Capturing closures")) -def check_modifiers_enabled(loc: AstNode | None = None) -> None: +def check_power_modifier_enabled(loc: AstNode | None = None) -> None: if not EXPERIMENTAL_FEATURES_ENABLED: - raise GuppyError(ExperimentalFeatureError(loc, "Modifiers")) - - -def check_unitary_callable_enabled(thing: str, loc: AstNode | None = None) -> None: - if not EXPERIMENTAL_FEATURES_ENABLED: - raise GuppyError(ExperimentalFeatureError(loc, thing, singular_things=True)) + raise GuppyError( + ExperimentalFeatureError(loc, "`power` modifier", singular_things=True) + ) diff --git a/guppylang-internals/src/guppylang_internals/tys/parsing.py b/guppylang-internals/src/guppylang_internals/tys/parsing.py index 20e817e39..b08dd64dd 100644 --- a/guppylang-internals/src/guppylang_internals/tys/parsing.py +++ b/guppylang-internals/src/guppylang_internals/tys/parsing.py @@ -19,7 +19,6 @@ from guppylang_internals.diagnostic import Error from guppylang_internals.engine import ENGINE from guppylang_internals.error import GuppyError -from guppylang_internals.experimental import check_unitary_callable_enabled from guppylang_internals.tys.arg import Argument, ConstArg, TypeArg from guppylang_internals.tys.builtin import ( CallableTypeDef, @@ -205,8 +204,6 @@ def _arg_from_instantiated_defn( match defn: # Special cases for the `Callable` type case CallableTypeDef(flags=flags): - if flags != UnitaryFlags.NoFlags: - check_unitary_callable_enabled(flags.callable_name(), node) return TypeArg(_parse_callable_type(arg_nodes, node, ctx, flags=flags)) # Special case for the `Self` type case SelfTypeDef(): diff --git a/tests/error/experimental_errors/modifier.err b/tests/error/experimental_errors/power_modifier.err similarity index 57% rename from tests/error/experimental_errors/modifier.err rename to tests/error/experimental_errors/power_modifier.err index ee5e7ccc2..9601a4fcf 100644 --- a/tests/error/experimental_errors/modifier.err +++ b/tests/error/experimental_errors/power_modifier.err @@ -1,11 +1,9 @@ -Error: Experimental feature (at $FILE:6:4) +Error: Experimental feature (at $FILE:7:9) | -4 | @guppy -5 | def main() -> None: -6 | with dagger: - | ^^^^^^^^^^^^ -7 | pass - | ^^^^^^^^^^^^ Modifiers are an experimental feature +5 | @guppy +6 | def main() -> None: +7 | with power(2): + | ^^^^^ `power` modifier is an experimental feature Help: Experimental features are currently disabled. You can enable them by calling `guppylang.enable_experimental_features()`, however note that these diff --git a/tests/error/experimental_errors/modifier.py b/tests/error/experimental_errors/power_modifier.py similarity index 63% rename from tests/error/experimental_errors/modifier.py rename to tests/error/experimental_errors/power_modifier.py index d795d61c0..7d109d83c 100644 --- a/tests/error/experimental_errors/modifier.py +++ b/tests/error/experimental_errors/power_modifier.py @@ -1,9 +1,10 @@ from guppylang.decorator import guppy +from guppylang.std.builtins import power @guppy def main() -> None: - with dagger: + with power(2): pass diff --git a/tests/error/experimental_errors/unitary_callable.err b/tests/error/experimental_errors/unitary_callable.err deleted file mode 100644 index 0fc9f8fa0..000000000 --- a/tests/error/experimental_errors/unitary_callable.err +++ /dev/null @@ -1,12 +0,0 @@ -Error: Experimental feature (at $FILE:12:21) - | -10 | -11 | @guppy -12 | def apply_control(f: Controllable[[qubit], None], q: qubit) -> Unitary[[qubit], None]: - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Controllable is an experimental feature - -Help: Experimental features are currently disabled. You can enable them by -calling `guppylang.enable_experimental_features()`, however note that these -features are unstable and might break in the future. - -Guppy compilation failed due to 1 previous error diff --git a/tests/error/experimental_errors/unitary_callable.py b/tests/error/experimental_errors/unitary_callable.py deleted file mode 100644 index bf95ae2a7..000000000 --- a/tests/error/experimental_errors/unitary_callable.py +++ /dev/null @@ -1,22 +0,0 @@ -from guppylang import guppy, qubit -from guppylang.std.builtins import Controllable, Daggerable, Unitary -from guppylang.std.quantum import h - - -@guppy(unitary=True) -def unitary(q: qubit) -> None: - pass - - -@guppy -def apply_control(f: Controllable[[qubit], None], q: qubit) -> Unitary[[qubit], None]: - f(q) - return unitary - - -@guppy -def test(q: qubit) -> None: - apply_control(h, q) - - -test.compile_function()