Skip to content

feat(hugr-passes)!: add NodeTemplate::LinkedHugr, deprecate ::Call#2749

Merged
acl-cqc merged 17 commits intomainfrom
acl/replace_types_linking
Dec 19, 2025
Merged

feat(hugr-passes)!: add NodeTemplate::LinkedHugr, deprecate ::Call#2749
acl-cqc merged 17 commits intomainfrom
acl/replace_types_linking

Conversation

@acl-cqc
Copy link
Copy Markdown
Contributor

@acl-cqc acl-cqc commented Dec 10, 2025

Follows #2760.
closes #2723

OpType::Call is fundamentally broken, because ReplaceTypes can often end up building hidden/nested hugrs (typically as temporaries, to be inserted into the Hugr being transformed), which won't contain the target of the Call. The "right way" to do this is via linking, and so, voila.

To test, update array linearization handlers to use linking, thus solving #2086 by linking what were duplicate Value::Functions together. (The copy code isn't really used in production ATM, but the discard case still is.)

This leaves unaddressed #2766, at present the ReplaceTypes will leave the functions as "Public"; my plan is to either (1) just leave it for now and maybe fully solve #2766 later; or else (2) implement in ReplaceBoolPass in tket2.

BREAKING CHANGE: NodeTemplate is now non-exhaustive and has a new variant LinkedHugr; NodeTemplate::SingleOp raises an error if the new op has static inports.

@codecov
Copy link
Copy Markdown

codecov bot commented Dec 12, 2025

Codecov Report

❌ Patch coverage is 48.34437% with 78 lines in your changes missing coverage. Please review.
✅ Project coverage is 83.44%. Comparing base (b3cdc4e) to head (bf04d4a).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
hugr-passes/src/replace_types/handlers.rs 28.40% 61 Missing and 2 partials ⚠️
hugr-passes/src/replace_types.rs 73.68% 11 Missing and 4 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2749      +/-   ##
==========================================
- Coverage   83.69%   83.44%   -0.25%     
==========================================
  Files         265      263       -2     
  Lines       52893    52732     -161     
  Branches    47651    47490     -161     
==========================================
- Hits        44270    44004     -266     
- Misses       6242     6341      +99     
- Partials     2381     2387       +6     
Flag Coverage Δ
python 88.84% <ø> (ø)
rust 82.85% <48.34%> (-0.28%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@acl-cqc acl-cqc changed the base branch from main to ts/delete-varray December 16, 2025 12:29
@acl-cqc acl-cqc force-pushed the acl/replace_types_linking branch from e368a02 to e30ae03 Compare December 17, 2025 15:24
@acl-cqc acl-cqc changed the title feat(hugr-passes): add NodeTemplate::LinkedHugr, deprecate ::Call feat!(hugr-passes): add NodeTemplate::LinkedHugr, deprecate ::Call Dec 17, 2025
@acl-cqc acl-cqc changed the title feat!(hugr-passes): add NodeTemplate::LinkedHugr, deprecate ::Call feat(hugr-passes)!: add NodeTemplate::LinkedHugr, deprecate ::Call Dec 17, 2025
@acl-cqc acl-cqc changed the base branch from ts/delete-varray to main December 17, 2025 15:38
@acl-cqc acl-cqc marked this pull request as ready for review December 17, 2025 15:43
@acl-cqc acl-cqc requested a review from a team as a code owner December 17, 2025 15:43
@acl-cqc acl-cqc requested a review from mark-koch December 17, 2025 15:43
let new_optype = match self {
NodeTemplate::SingleOp(op_type) => op_type,
let (new_optype, static_source, static_inport) = match self {
NodeTemplate::SingleOp(op_type) => (op_type, None, None), // perhaps assert op_type has no static input?
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds like a useful assert 👍

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've made it an error, as even that is a breaking change

hugr.set_parent(ch, n);
}
root_opty
(root_opty, None, None) // perhaps assert root_opty has no static input?
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't we only allow CFG, Conditional, DFG and TailLoop entrypoints for CompoundOp? Maybe that would be a better assert and those can't have static inputs anyways?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, good plan - made anything else an error (it is a user error in providing a bad replacement so they should be able to recover). I am not considering that a breaking change because it is merely enforcing what we had already written in the docs!!

/// Defines a sub-Hugr to insert, whose entrypoint becomes (or replaces) the desired Node.
/// Other children of the Hugr reachable from the entrypoint will also be inserted
/// according to the specified linking policy.
LinkedHugr(Box<Hugr>, NameLinkingPolicy),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm wondering if this also makes CompoundOp obsolete, looks like LinkedHugr is a strict generalisation? Should we also deprecate it?

Copy link
Copy Markdown
Contributor Author

@acl-cqc acl-cqc Dec 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

::CompoundOp uses insert_hugr, which takes the entrypoint-subtree and discards/disconnects the rest. We can't quite get that policy using insert_link_hugr (as per ::LinkedHugr) because there is no policy ATM that disconnects edges. So...hmmm....I do see what you mean. Deprecation might be a bit strong for ppl who want that behaviour - really we want to recommend moving, without implying ::CompoundOp is going to die. I suppose we could "deprecate with no plan to remove" and wait and see if there's demand for NameLinkingPolicy's that reproduce that behaviour.... or just document this advice on ::CompoundOp?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've doc'd for CompoundOp that LinkedHugr is recommended, but gone no further (yet)

Comment on lines +902 to +905
// However, by (bad) luck the target Node of the call identifies,
// in the nested Hugr, the Lin->() function being built, which makes
// a legal Hugr (the unit outport can have zero edges).
// Of course this would loop forever at runtime!
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fun :D

@hugrbot
Copy link
Copy Markdown
Collaborator

hugrbot commented Dec 18, 2025

This PR contains breaking changes to the public Rust API.

cargo-semver-checks summary
    Building hugr v0.24.3 (current)
     Built [  39.836s] (current)
   Parsing hugr v0.24.3 (current)
    Parsed [   0.004s] (current)
  Building hugr v0.24.3 (baseline)
     Built [  27.665s] (baseline)
   Parsing hugr v0.24.3 (baseline)
    Parsed [   0.004s] (baseline)
  Checking hugr v0.24.3 -> v0.24.3 (assume minor change)
   Checked [   0.011s] 159 checks: 159 pass, 41 skip
   Summary no semver update required
  Finished [  69.885s] hugr
  Building hugr-cli v0.24.3 (current)
     Built [  26.510s] (current)
   Parsing hugr-cli v0.24.3 (current)
    Parsed [   0.009s] (current)
  Building hugr-cli v0.24.3 (baseline)
     Built [  26.433s] (baseline)
   Parsing hugr-cli v0.24.3 (baseline)
    Parsed [   0.010s] (baseline)
  Checking hugr-cli v0.24.3 -> v0.24.3 (assume minor change)
   Checked [   0.014s] 159 checks: 159 pass, 41 skip
   Summary no semver update required
  Finished [  54.660s] hugr-cli
  Building hugr-core v0.24.3 (current)
     Built [  18.805s] (current)
   Parsing hugr-core v0.24.3 (current)
    Parsed [   0.078s] (current)
  Building hugr-core v0.24.3 (baseline)
     Built [  16.895s] (baseline)
   Parsing hugr-core v0.24.3 (baseline)
    Parsed [   0.074s] (baseline)
  Checking hugr-core v0.24.3 -> v0.24.3 (assume minor change)
   Checked [   0.162s] 159 checks: 159 pass, 41 skip
   Summary no semver update required
  Finished [  37.980s] hugr-core
  Building hugr-llvm v0.24.3 (current)
     Built [  17.771s] (current)
   Parsing hugr-llvm v0.24.3 (current)
    Parsed [   0.015s] (current)
  Building hugr-llvm v0.24.3 (baseline)
     Built [  20.817s] (baseline)
   Parsing hugr-llvm v0.24.3 (baseline)
    Parsed [   0.011s] (baseline)
  Checking hugr-llvm v0.24.3 -> v0.24.3 (assume minor change)
   Checked [   0.031s] 159 checks: 159 pass, 41 skip
   Summary no semver update required
  Finished [  40.249s] hugr-llvm
  Building hugr-model v0.24.3 (current)
     Built [  10.367s] (current)
   Parsing hugr-model v0.24.3 (current)
    Parsed [   0.015s] (current)
  Building hugr-model v0.24.3 (baseline)
     Built [  10.091s] (baseline)
   Parsing hugr-model v0.24.3 (baseline)
    Parsed [   0.015s] (baseline)
  Checking hugr-model v0.24.3 -> v0.24.3 (assume minor change)
   Checked [   0.026s] 159 checks: 159 pass, 41 skip
   Summary no semver update required
  Finished [  21.597s] hugr-model
  Building hugr-passes v0.24.3 (current)
     Built [  15.588s] (current)
   Parsing hugr-passes v0.24.3 (current)
    Parsed [   0.024s] (current)
  Building hugr-passes v0.24.3 (baseline)
     Built [  20.465s] (baseline)
   Parsing hugr-passes v0.24.3 (baseline)
    Parsed [   0.023s] (baseline)
  Checking hugr-passes v0.24.3 -> v0.24.3 (assume minor change)
   Checked [   0.028s] 159 checks: 158 pass, 1 fail, 0 warn, 41 skip

--- failure enum_marked_non_exhaustive: enum marked #[non_exhaustive] ---

Description:
A public enum has been marked #[non_exhaustive]. Pattern-matching on it outside of its crate must now include a wildcard pattern like `_`, or it will fail to compile.
      ref: https://doc.rust-lang.org/cargo/reference/semver.html#attr-adding-non-exhaustive
     impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/enum_marked_non_exhaustive.ron

Failed in:
enum NodeTemplate in /home/runner/work/hugr/hugr/PR_BRANCH/hugr-passes/src/replace_types.rs:40

   Summary semver requires new major version: 1 major and 0 minor checks failed
  Finished [  37.752s] hugr-passes
  Building hugr-persistent v0.3.4 (current)
     Built [  12.446s] (current)
   Parsing hugr-persistent v0.3.4 (current)
    Parsed [   0.007s] (current)
  Building hugr-persistent v0.3.4 (baseline)
     Built [  16.961s] (baseline)
   Parsing hugr-persistent v0.3.4 (baseline)
    Parsed [   0.007s] (baseline)
  Checking hugr-persistent v0.3.4 -> v0.3.4 (assume minor change)
   Checked [   0.011s] 159 checks: 159 pass, 41 skip
   Summary no semver update required
  Finished [  31.043s] hugr-persistent

@acl-cqc acl-cqc enabled auto-merge December 19, 2025 13:14
@acl-cqc acl-cqc added this pull request to the merge queue Dec 19, 2025
Merged via the queue into main with commit f490583 Dec 19, 2025
30 of 31 checks passed
@acl-cqc acl-cqc deleted the acl/replace_types_linking branch December 19, 2025 13:20
@hugrbot hugrbot mentioned this pull request Dec 19, 2025
github-merge-queue bot pushed a commit that referenced this pull request Dec 22, 2025
This release includes various breaking refactors and improvements:
- A lot of work has been done towards linking Hugrs. Now module-rooted
Hugrs can
  be linked together using configurable policies.
- `ValueArray` has been removed.
- A type-safe API for accessing metadata on nodes has been added.
- Envelopes now have an extensive API for progressively describing a
package,
  and failing gracefully on errors.
- The MSRV has been bumped to Rust 1.89, and the public pyo3 dependency
has been
  updated to 0.27.
- Multiple deprecated definitions have been removed.

----

## 🤖 New release

* `hugr-model`: 0.24.3 -> 0.25.0 (✓ API compatible changes)
* `hugr-core`: 0.24.3 -> 0.25.0 (⚠ API breaking changes)
* `hugr-llvm`: 0.24.3 -> 0.25.0 (✓ API compatible changes)
* `hugr-passes`: 0.24.3 -> 0.25.0 (⚠ API breaking changes)
* `hugr-persistent`: 0.3.4 -> 0.4.0 (✓ API compatible changes)
* `hugr`: 0.24.3 -> 0.25.0 (✓ API compatible changes)
* `hugr-cli`: 0.24.3 -> 0.25.0 (⚠ API breaking changes)

### ⚠ `hugr-core` breaking changes

```text
--- failure enum_marked_non_exhaustive: enum marked #[non_exhaustive] ---

Description:
A public enum has been marked #[non_exhaustive]. Pattern-matching on it outside of its crate must now include a wildcard pattern like `_`, or it will fail to compile.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#attr-adding-non-exhaustive
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/enum_marked_non_exhaustive.ron

Failed in:
  enum ReadError in /tmp/.tmpmZ0VmH/hugr/hugr-core/src/envelope.rs:108

--- failure enum_missing: pub enum removed or renamed ---

Description:
A publicly-visible enum cannot be imported by its prior path. A `pub use` may have been removed, or the enum itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/enum_missing.ron

Failed in:
  enum hugr_core::envelope::EnvelopeError, previously in file /tmp/.tmpLNcYQE/hugr-core/src/envelope.rs:262

--- failure function_missing: pub fn removed or renamed ---

Description:
A publicly-visible function cannot be imported by its prior path. A `pub use` may have been removed, or the function itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/function_missing.ron

Failed in:
  function hugr_core::std_extensions::collections::value_array::value_array_type, previously in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/value_array.rs:159
  function hugr_core::envelope::format_generator, previously in file /tmp/.tmpLNcYQE/hugr-core/src/envelope.rs:93
  function hugr_core::std_extensions::collections::value_array::value_array_type_def, previously in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/value_array.rs:150
  function hugr_core::hugr::serialize::serde_deserialize_hugr, previously in file /tmp/.tmpLNcYQE/hugr-core/src/hugr/serialize.rs:180
  function hugr_core::envelope::get_generator, previously in file /tmp/.tmpLNcYQE/hugr-core/src/envelope.rs:80
  function hugr_core::std_extensions::collections::value_array::value_array_type_parametric, previously in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/value_array.rs:166
  function hugr_core::std_extensions::collections::array::op_builder::build_all_value_array_ops, previously in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/array/op_builder.rs:390

--- failure inherent_method_missing: pub method removed or renamed ---

Description:
A publicly-visible method or associated fn is no longer available under its prior name. It may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/inherent_method_missing.ron

Failed in:
  MermaidFormatter::from_render_config, previously in file /tmp/.tmpLNcYQE/hugr-core/src/hugr/views/render.rs:50

--- failure module_missing: pub module removed or renamed ---

Description:
A publicly-visible module cannot be imported by its prior path. A `pub use` may have been removed, or the module may have been renamed, removed, or made non-public.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/module_missing.ron

Failed in:
  mod hugr_core::std_extensions::collections::value_array, previously in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/value_array.rs:1

--- failure pub_module_level_const_missing: pub module-level const is missing ---

Description:
A public const is missing or renamed
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/pub_module_level_const_missing.ron

Failed in:
  USED_EXTENSIONS_KEY in file /tmp/.tmpLNcYQE/hugr-core/src/envelope.rs:72
  VALUE_ARRAY_TYPENAME in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/value_array.rs:27
  VERSION in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/value_array.rs:33
  GENERATOR_KEY in file /tmp/.tmpLNcYQE/hugr-core/src/envelope.rs:70
  EXTENSION_ID in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/value_array.rs:31
  VALUE_ARRAY_VALUENAME in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/value_array.rs:29

--- failure pub_static_missing: pub static is missing ---

Description:
A public static is missing, renamed, or made private.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/pub_static_missing.ron

Failed in:
  EXTENSION in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/value_array.rs:99

--- failure struct_missing: pub struct removed or renamed ---

Description:
A publicly-visible struct cannot be imported by its prior path. A `pub use` may have been removed, or the struct itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/struct_missing.ron

Failed in:
  struct hugr_core::envelope::WithGenerator, previously in file /tmp/.tmpLNcYQE/hugr-core/src/envelope.rs:127
  struct hugr_core::hugr::views::render::RenderConfig, previously in file /tmp/.tmpLNcYQE/hugr-core/src/hugr/views/render.rs:21
  struct hugr_core::std_extensions::collections::value_array::ValueArray, previously in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/value_array.rs:39

--- failure trait_method_default_impl_removed: pub trait default method impl removed ---

Description:
A method's default impl in an unsealed trait has been removed, breaking trait implementations that relied on that default
        ref: https://doc.rust-lang.org/book/ch10-02-traits.html#default-implementations
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/trait_method_default_impl_removed.ron

Failed in:
  trait method hugr_core::hugr::patch::PatchVerification::invalidated_nodes in file /tmp/.tmpmZ0VmH/hugr/hugr-core/src/hugr/patch.rs:45

--- failure trait_method_missing: pub trait method removed or renamed ---

Description:
A trait method is no longer callable, and may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#major-any-change-to-trait-item-signatures
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/trait_method_missing.ron

Failed in:
  method invalidation_set of trait PatchVerification, previously in file /tmp/.tmpLNcYQE/hugr-core/src/hugr/patch.rs:44
  method mermaid_string_with_config of trait HugrView, previously in file /tmp/.tmpLNcYQE/hugr-core/src/hugr/views.rs:404
  method mermaid_string_with_config of trait HugrView, previously in file /tmp/.tmpLNcYQE/hugr-core/src/hugr/views.rs:404
  method mermaid_string_with_config of trait HugrView, previously in file /tmp/.tmpLNcYQE/hugr-core/src/hugr/views.rs:404
  method get_metadata_mut of trait HugrMut, previously in file /tmp/.tmpLNcYQE/hugr-core/src/hugr/hugrmut.rs:63

--- failure trait_method_parameter_count_changed: pub trait method parameter count changed ---

Description:
A trait method now takes a different number of parameters.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#major-any-change-to-trait-item-signatures
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/trait_method_parameter_count_changed.ron

Failed in:
  Container::set_metadata now takes 2 instead of 3 parameters, in file /tmp/.tmpmZ0VmH/hugr/hugr-core/src/builder/build_traits.rs:114
  Container::set_child_metadata now takes 3 instead of 4 parameters, in file /tmp/.tmpmZ0VmH/hugr/hugr-core/src/builder/build_traits.rs:123
  HugrView::get_metadata now takes 2 instead of 3 parameters, in file /tmp/.tmpmZ0VmH/hugr/hugr-core/src/hugr/views.rs:107
  HugrView::get_metadata now takes 2 instead of 3 parameters, in file /tmp/.tmpmZ0VmH/hugr/hugr-core/src/hugr/views.rs:107
  HugrView::get_metadata now takes 2 instead of 3 parameters, in file /tmp/.tmpmZ0VmH/hugr/hugr-core/src/hugr/views.rs:107
  HugrMut::set_metadata now takes 3 instead of 4 parameters, in file /tmp/.tmpmZ0VmH/hugr/hugr-core/src/hugr/hugrmut.rs:79
  HugrMut::remove_metadata now takes 2 instead of 3 parameters, in file /tmp/.tmpmZ0VmH/hugr/hugr-core/src/hugr/hugrmut.rs:106

--- failure trait_method_requires_different_generic_type_params: trait method now requires a different number of generic type parameters ---

Description:
A trait method now requires a different number of generic type parameters than it used to. Calls or implementations of this trait method using the previous number of generic types will be broken.
        ref: https://doc.rust-lang.org/reference/items/generics.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/trait_method_requires_different_generic_type_params.ron

Failed in:
  Container::set_metadata (0 -> 1 generic types) in /tmp/.tmpmZ0VmH/hugr/hugr-core/src/builder/build_traits.rs:114
  Container::set_child_metadata (0 -> 1 generic types) in /tmp/.tmpmZ0VmH/hugr/hugr-core/src/builder/build_traits.rs:123
  HugrView::get_metadata (0 -> 1 generic types) in /tmp/.tmpmZ0VmH/hugr/hugr-core/src/hugr/views.rs:107
  HugrView::get_metadata (0 -> 1 generic types) in /tmp/.tmpmZ0VmH/hugr/hugr-core/src/hugr/views.rs:107
  HugrView::get_metadata (0 -> 1 generic types) in /tmp/.tmpmZ0VmH/hugr/hugr-core/src/hugr/views.rs:107
  HugrMut::set_metadata (0 -> 1 generic types) in /tmp/.tmpmZ0VmH/hugr/hugr-core/src/hugr/hugrmut.rs:79
  HugrMut::remove_metadata (0 -> 1 generic types) in /tmp/.tmpmZ0VmH/hugr/hugr-core/src/hugr/hugrmut.rs:106

--- failure trait_missing: pub trait removed or renamed ---

Description:
A publicly-visible trait cannot be imported by its prior path. A `pub use` may have been removed, or the trait itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/trait_missing.ron

Failed in:
  trait hugr_core::std_extensions::collections::value_array::VArrayOpBuilder, previously in file /tmp/.tmpLNcYQE/hugr-core/src/std_extensions/collections/value_array.rs:174
  trait hugr_core::hugr::views::RootCheckable, previously in file /tmp/.tmpLNcYQE/hugr-core/src/hugr/views/root_checked.rs:73
```

### ⚠ `hugr-passes` breaking changes

```text
--- failure enum_marked_non_exhaustive: enum marked #[non_exhaustive] ---

Description:
A public enum has been marked #[non_exhaustive]. Pattern-matching on it outside of its crate must now include a wildcard pattern like `_`, or it will fail to compile.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#attr-adding-non-exhaustive
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/enum_marked_non_exhaustive.ron

Failed in:
  enum NodeTemplate in /tmp/.tmpmZ0VmH/hugr/hugr-passes/src/replace_types.rs:40

--- failure enum_missing: pub enum removed or renamed ---

Description:
A publicly-visible enum cannot be imported by its prior path. A `pub use` may have been removed, or the enum itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/enum_missing.ron

Failed in:
  enum hugr_passes::call_graph::CallGraphNode, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/call_graph.rs:17
  enum hugr_passes::call_graph::CallGraphEdge, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/call_graph.rs:9

--- failure enum_struct_variant_field_added: pub enum struct variant field added ---

Description:
An enum's exhaustive struct variant has a new field, which has to be included when constructing or matching on this variant.
        ref: https://doc.rust-lang.org/reference/attributes/type_system.html#the-non_exhaustive-attribute
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/enum_struct_variant_field_added.ron

Failed in:
  field entry_nodes_moved of variant NormalizeCFGResult::CFGPreserved in /tmp/.tmpmZ0VmH/hugr/hugr-passes/src/normalize_cfgs.rs:89

--- failure enum_struct_variant_field_missing: pub enum struct variant's field removed or renamed ---

Description:
A publicly-visible enum has a struct variant whose field is no longer available under its prior name. It may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/enum_struct_variant_field_missing.ron

Failed in:
  field entry_dfg of variant NormalizeCFGResult::CFGPreserved, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/normalize_cfgs.rs:88

--- failure function_missing: pub fn removed or renamed ---

Description:
A publicly-visible function cannot be imported by its prior path. A `pub use` may have been removed, or the function itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/function_missing.ron

Failed in:
  function hugr_passes::replace_types::handlers::linearize_value_array, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/replace_types/handlers.rs:298
  function hugr_passes::merge_bbs::merge_basic_blocks, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/lib.rs:40
  function hugr_passes::replace_types::handlers::value_array_const, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/replace_types/handlers.rs:97

--- failure module_missing: pub module removed or renamed ---

Description:
A publicly-visible module cannot be imported by its prior path. A `pub use` may have been removed, or the module may have been renamed, removed, or made non-public.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/module_missing.ron

Failed in:
  mod hugr_passes::merge_bbs, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/lib.rs:26
  mod hugr_passes::call_graph, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/call_graph.rs:1
  mod hugr_passes::linearize_array, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/linearize_array.rs:1

--- failure struct_missing: pub struct removed or renamed ---

Description:
A publicly-visible struct cannot be imported by its prior path. A `pub use` may have been removed, or the struct itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/struct_missing.ron

Failed in:
  struct hugr_passes::call_graph::CallGraph, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/call_graph.rs:42
  struct hugr_passes::linearize_array::LinearizeArrayPass, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/linearize_array.rs:35
  struct hugr_passes::LinearizeArrayPass, previously in file /tmp/.tmpLNcYQE/hugr-passes/src/linearize_array.rs:35
```

### ⚠ `hugr-cli` breaking changes

```text
--- failure enum_variant_missing: pub enum variant removed or renamed ---

Description:
A publicly-visible enum has at least one variant that is no longer available under its prior name. It may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/enum_variant_missing.ron

Failed in:
  variant CliError::Envelope, previously in file /tmp/.tmpLNcYQE/hugr-cli/src/lib.rs:88

--- failure inherent_method_missing: pub method removed or renamed ---

Description:
A publicly-visible method or associated fn is no longer available under its prior name. It may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/inherent_method_missing.ron

Failed in:
  HugrInputArgs::get_envelope, previously in file /tmp/.tmpLNcYQE/hugr-cli/src/hugr_io.rs:63
  HugrInputArgs::get_hugr, previously in file /tmp/.tmpLNcYQE/hugr-cli/src/hugr_io.rs:88

--- failure struct_pub_field_missing: pub struct's pub field removed or renamed ---

Description:
A publicly-visible struct has at least one public field that is no longer available under its prior name. It may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.45.0/src/lints/struct_pub_field_missing.ron

Failed in:
  field hugr_json of struct HugrInputArgs, previously in file /tmp/.tmpLNcYQE/hugr-cli/src/hugr_io.rs:40
```

<details><summary><i><b>Changelog</b></i></summary><p>

## `hugr-model`

<blockquote>

##
[0.25.0](hugr-model-v0.24.3...hugr-model-v0.25.0)
- 2025-12-22

### Bug Fixes

- *(model)* avoid non abi-compatible pyo3 calls
([#2679](#2679))

### New Features

- [**breaking**] Upgrade pyo3 dependency to 0.27
([#2736](#2736))

### Refactor

- Direct import of model representation to Python
([#2683](#2683))
</blockquote>

## `hugr-core`

<blockquote>

##
[0.25.0](hugr-core-v0.24.3...hugr-core-v0.25.0)
- 2025-12-22

### Bug Fixes

- *(hugr-core)* [**breaking**] Return error instead of panicking in
`MakeRegisteredOp::to_extension_op()`
([#2701](#2701))
- register packaged extensions before model_ast import
([#2702](#2702))
- ModuleGraph misses static edges to non-container entrypoints
([#2745](#2745))

### New Features

- return description output to python on error
([#2681](#2681))
- add hugr-core StaticGraph, deprecate hugr-passes CallGraph
([#2698](#2698))
- [**breaking**] Remove `RootCheckable`
([#2704](#2704))
- Add method to link Hugr modules (linking pt3)
([#2529](#2529))
- `insert_link_hugr` adds entrypoint subtree and links, with
reachability ([#2555](#2555))
- [**breaking**] Upgrade pyo3 dependency to 0.27
([#2736](#2736))
- [**breaking**] Bump MSRV to Rust 1.89
([#2747](#2747))
- [**breaking**] Allow disconnecting specific edges in a hugr
([#2737](#2737))
- Optype iterators over value ports
([#2738](#2738))
- [**breaking**] Type-safe access for node metadata
([#2755](#2755))
- [**breaking**] GeneratorDesc metadata definition
([#2759](#2759))

### Refactor

- [**breaking**] move envelope reading to dedicated module with
dedicated errors ([#2689](#2689))
- Direct import of model representation to Python
([#2683](#2683))
- *(linking.rs)* [**breaking**] (tiny) avoid type_complexity
([#2721](#2721))
- [**breaking**] Remove multiple deprecated definitions
([#2751](#2751))
- [**breaking**] Delete ValueArray
([#2760](#2760))
- Deprecate Value::Function and inline_constant_functions
([#2770](#2770))
</blockquote>

## `hugr-llvm`

<blockquote>

##
[0.25.0](hugr-llvm-v0.24.3...hugr-llvm-v0.25.0)
- 2025-12-22

### New Features

- *(llvm)* [**breaking**] upgrade to inkwell 0.7
([#2695](#2695))

### Refactor

- Deprecate Value::Function and inline_constant_functions
([#2770](#2770))
</blockquote>

## `hugr-passes`

<blockquote>

##
[0.25.0](hugr-passes-v0.24.3...hugr-passes-v0.25.0)
- 2025-12-22

### New Features

- *(hugr-passes)* [**breaking**] normalize_cfgs inlines entry DFG
([#2649](#2649))
- add hugr-core StaticGraph, deprecate hugr-passes CallGraph
([#2698](#2698))
- ReplaceTypes: recurse on replacements, much deprecation
([#2442](#2442))
- [**breaking**] Remove `RootCheckable`
([#2704](#2704))
- [**breaking**] Bump MSRV to Rust 1.89
([#2747](#2747))
- Add a pass to remove redundant order edges
([#2739](#2739))
- *(hugr-passes)* [**breaking**] add NodeTemplate::LinkedHugr, deprecate
::Call ([#2749](#2749))

### Refactor

- [**breaking**] Remove multiple deprecated definitions
([#2751](#2751))
- [**breaking**] Delete ValueArray
([#2760](#2760))
- Deprecate Value::Function and inline_constant_functions
([#2770](#2770))

### Testing

- Make Hugr valid in replace_types::op_to_call
([#2732](#2732))
</blockquote>

## `hugr-persistent`

<blockquote>

##
[0.4.0](hugr-persistent-v0.3.4...hugr-persistent-v0.4.0)
- 2025-12-22

### New Features

- [**breaking**] Remove `RootCheckable`
([#2704](#2704))
- [**breaking**] Bump MSRV to Rust 1.89
([#2747](#2747))
- [**breaking**] Type-safe access for node metadata
([#2755](#2755))

### Refactor

- [**breaking**] Remove multiple deprecated definitions
([#2751](#2751))
</blockquote>

## `hugr`

<blockquote>

##
[0.25.0](hugr-v0.24.3...hugr-v0.25.0)
- 2025-12-22

### Bug Fixes

- *(hugr-core)* [**breaking**] Return error instead of panicking in
`MakeRegisteredOp::to_extension_op()`
([#2701](#2701))
- register packaged extensions before model_ast import
([#2702](#2702))
- ModuleGraph misses static edges to non-container entrypoints
([#2745](#2745))

### Documentation

- Improve instructions for patch release
([#2720](#2720))

### New Features

- *(hugr-passes)* [**breaking**] normalize_cfgs inlines entry DFG
([#2649](#2649))
- ReplaceTypes: recurse on replacements, much deprecation
([#2442](#2442))
- Add a pass to remove redundant order edges
([#2739](#2739))
- *(hugr-passes)* [**breaking**] add NodeTemplate::LinkedHugr, deprecate
::Call ([#2749](#2749))
- return description output to python on error
([#2681](#2681))
- add hugr-core StaticGraph, deprecate hugr-passes CallGraph
([#2698](#2698))
- [**breaking**] Remove `RootCheckable`
([#2704](#2704))
- Add method to link Hugr modules (linking pt3)
([#2529](#2529))
- `insert_link_hugr` adds entrypoint subtree and links, with
reachability ([#2555](#2555))
- [**breaking**] Upgrade pyo3 dependency to 0.27
([#2736](#2736))
- [**breaking**] Bump MSRV to Rust 1.89
([#2747](#2747))
- [**breaking**] Allow disconnecting specific edges in a hugr
([#2737](#2737))
- Optype iterators over value ports
([#2738](#2738))
- [**breaking**] GeneratorDesc metadata definition
([#2759](#2759))
- [**breaking**] Type-safe access for node metadata
([#2755](#2755))

### Refactor

- [**breaking**] move envelope reading to dedicated module with
dedicated errors ([#2689](#2689))
- Direct import of model representation to Python
([#2683](#2683))
- *(linking.rs)* [**breaking**] (tiny) avoid type_complexity
([#2721](#2721))
- [**breaking**] Remove multiple deprecated definitions
([#2751](#2751))
- [**breaking**] Delete ValueArray
([#2760](#2760))
- Deprecate Value::Function and inline_constant_functions
([#2770](#2770))

### Testing

- Make Hugr valid in replace_types::op_to_call
([#2732](#2732))
</blockquote>

## `hugr-cli`

<blockquote>

##
[0.25.0](hugr-cli-v0.24.3...hugr-cli-v0.25.0)
- 2025-12-22

### New Features

- *(cli, python)* programmatic interface to cli with python bindings
([#2677](#2677))
- return description output to python on error
([#2681](#2681))
- [**breaking**] Type-safe access for node metadata
([#2755](#2755))
- [**breaking**] GeneratorDesc metadata definition
([#2759](#2759))

### Refactor

- [**breaking**] move envelope reading to dedicated module with
dedicated errors ([#2689](#2689))
- *(cli)* [**breaking**] remove deprecated hugr_json handling
([#2690](#2690))
- [**breaking**] Remove multiple deprecated definitions
([#2751](#2751))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).

---------

Co-authored-by: Agustín Borgna <[email protected]>
@hugrbot hugrbot mentioned this pull request Dec 23, 2025
github-merge-queue bot pushed a commit that referenced this pull request Dec 29, 2025
#2749 suffered from poor test coverage, and although I thought I had run
the guppy test suite using a modified `selene-hugr-qis-compiler` I
failed to reveal the first bug here (and the rest were not covered by
the guppy test suite of the time).

* Avoid generating polymorphic `__unwrap` and `__mk_none` helper
functions; ReplaceTypes generally runs after monomorphization so this
avoids needing to rerun the latter.
* `copy_scan_func_name` did not depend on the size of the array, yet the
generated helper function took and returned an array (of options, plus
an index) - this means linking raises a conflicting-signature error if
you are linearizing copies of two different-size arrays of the same
element type
* add test of the latter
github-merge-queue bot pushed a commit that referenced this pull request Dec 29, 2025
## 🤖 New release

* `hugr-model`: 0.25.0 -> 0.25.1 (✓ API compatible changes)
* `hugr-core`: 0.25.0 -> 0.25.1 (✓ API compatible changes)
* `hugr-llvm`: 0.25.0 -> 0.25.1 (✓ API compatible changes)
* `hugr-passes`: 0.25.0 -> 0.25.1 (✓ API compatible changes)
* `hugr-persistent`: 0.4.0 -> 0.4.1 (✓ API compatible changes)
* `hugr`: 0.25.0 -> 0.25.1 (✓ API compatible changes)
* `hugr-cli`: 0.25.0 -> 0.25.1

<details><summary><i><b>Changelog</b></i></summary><p>

## `hugr-model`

<blockquote>

##
[0.25.0](hugr-model-v0.24.3...hugr-model-v0.25.0)
- 2025-12-22

### Bug Fixes

- *(model)* avoid non abi-compatible pyo3 calls
([#2679](#2679))

### New Features

- [**breaking**] Upgrade pyo3 dependency to 0.27
([#2736](#2736))

### Refactor

- Direct import of model representation to Python
([#2683](#2683))
</blockquote>

## `hugr-core`

<blockquote>

##
[0.25.0](hugr-core-v0.24.3...hugr-core-v0.25.0)
- 2025-12-22

### Bug Fixes

- *(hugr-core)* [**breaking**] Return error instead of panicking in
`MakeRegisteredOp::to_extension_op()`
([#2701](#2701))
- register packaged extensions before model_ast import
([#2702](#2702))
- ModuleGraph misses static edges to non-container entrypoints
([#2745](#2745))

### New Features

- return description output to python on error
([#2681](#2681))
- add hugr-core StaticGraph, deprecate hugr-passes CallGraph
([#2698](#2698))
- [**breaking**] Remove `RootCheckable`
([#2704](#2704))
- Add method to link Hugr modules (linking pt3)
([#2529](#2529))
- `insert_link_hugr` adds entrypoint subtree and links, with
reachability ([#2555](#2555))
- [**breaking**] Upgrade pyo3 dependency to 0.27
([#2736](#2736))
- [**breaking**] Bump MSRV to Rust 1.89
([#2747](#2747))
- [**breaking**] Allow disconnecting specific edges in a hugr
([#2737](#2737))
- Optype iterators over value ports
([#2738](#2738))
- [**breaking**] Type-safe access for node metadata
([#2755](#2755))
- [**breaking**] GeneratorDesc metadata definition
([#2759](#2759))

### Refactor

- [**breaking**] move envelope reading to dedicated module with
dedicated errors ([#2689](#2689))
- Direct import of model representation to Python
([#2683](#2683))
- *(linking.rs)* [**breaking**] (tiny) avoid type_complexity
([#2721](#2721))
- [**breaking**] Remove multiple deprecated definitions
([#2751](#2751))
- [**breaking**] Delete ValueArray
([#2760](#2760))
- Deprecate Value::Function and inline_constant_functions
([#2770](#2770))
</blockquote>

## `hugr-llvm`

<blockquote>

##
[0.25.0](hugr-llvm-v0.24.3...hugr-llvm-v0.25.0)
- 2025-12-22

### New Features

- *(llvm)* [**breaking**] upgrade to inkwell 0.7
([#2695](#2695))

### Refactor

- Deprecate Value::Function and inline_constant_functions
([#2770](#2770))
</blockquote>

## `hugr-passes`

<blockquote>

##
[0.25.1](hugr-passes-v0.25.0...hugr-passes-v0.25.1)
- 2025-12-29

### Bug Fixes

- two problems in array linearization from #2749
([#2779](#2779))
</blockquote>

## `hugr-persistent`

<blockquote>

##
[0.4.0](hugr-persistent-v0.3.4...hugr-persistent-v0.4.0)
- 2025-12-22

### New Features

- [**breaking**] Remove `RootCheckable`
([#2704](#2704))
- [**breaking**] Bump MSRV to Rust 1.89
([#2747](#2747))
- [**breaking**] Type-safe access for node metadata
([#2755](#2755))

### Refactor

- [**breaking**] Remove multiple deprecated definitions
([#2751](#2751))
</blockquote>

## `hugr`

<blockquote>

##
[0.25.1](hugr-v0.25.0...hugr-v0.25.1)
- 2025-12-29

### Bug Fixes

- two problems in array linearization from #2749
([#2779](#2779))
</blockquote>

## `hugr-cli`

<blockquote>

##
[0.25.0](hugr-cli-v0.24.3...hugr-cli-v0.25.0)
- 2025-12-22

### New Features

- *(cli, python)* programmatic interface to cli with python bindings
([#2677](#2677))
- return description output to python on error
([#2681](#2681))
- [**breaking**] Type-safe access for node metadata
([#2755](#2755))
- [**breaking**] GeneratorDesc metadata definition
([#2759](#2759))

### Refactor

- [**breaking**] move envelope reading to dedicated module with
dedicated errors ([#2689](#2689))
- *(cli)* [**breaking**] remove deprecated hugr_json handling
([#2690](#2690))
- [**breaking**] Remove multiple deprecated definitions
([#2751](#2751))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).
@hugrbot hugrbot mentioned this pull request Dec 30, 2025
github-merge-queue bot pushed a commit to Quantinuum/guppylang that referenced this pull request Dec 30, 2025
This odd `guppy.comptime` + `result` combo seems to invoke the
BorrowArray *copying* handler in a way that I haven't managed to
otherwise.

The two calls with different-length arrays caused linking problems
following https:://github.com/Quantinuum/hugr/pull/2749, fixed in
https:://github.com/Quantinuum/hugr/pull/2779.

Note, all testing was based on guppylang 0.21.6, I realize there has
been a 0.21.7 since but the testing was quite a faff so I will not
repeat it unless you think there is reason guppy compilation may have
changed....
github-merge-queue bot pushed a commit that referenced this pull request Dec 30, 2025
## 🤖 New release

* `hugr-model`: 0.25.1 -> 0.25.2
* `hugr-core`: 0.25.1 -> 0.25.2 (✓ API compatible changes)
* `hugr-llvm`: 0.25.1 -> 0.25.2
* `hugr-passes`: 0.25.1 -> 0.25.2
* `hugr`: 0.25.1 -> 0.25.2 (✓ API compatible changes)
* `hugr-cli`: 0.25.1 -> 0.25.2
* `hugr-persistent`: 0.4.1 -> 0.4.2

<details><summary><i><b>Changelog</b></i></summary><p>

## `hugr-model`

<blockquote>

##
[0.25.0](hugr-model-v0.24.3...hugr-model-v0.25.0)
- 2025-12-22

### Bug Fixes

- *(model)* avoid non abi-compatible pyo3 calls
([#2679](#2679))

### New Features

- [**breaking**] Upgrade pyo3 dependency to 0.27
([#2736](#2736))

### Refactor

- Direct import of model representation to Python
([#2683](#2683))
</blockquote>

## `hugr-core`

<blockquote>

##
[0.25.2](hugr-core-v0.25.1...hugr-core-v0.25.2)
- 2025-12-30

### Bug Fixes

- *(determinism)* use BTreeMap in ModuleGraph
([#2783](#2783))

### New Features

- Re-export hugr_core::hugr::linking from hugr::
([#2781](#2781))
</blockquote>

## `hugr-llvm`

<blockquote>

##
[0.25.0](hugr-llvm-v0.24.3...hugr-llvm-v0.25.0)
- 2025-12-22

### New Features

- *(llvm)* [**breaking**] upgrade to inkwell 0.7
([#2695](#2695))

### Refactor

- Deprecate Value::Function and inline_constant_functions
([#2770](#2770))
</blockquote>

## `hugr-passes`

<blockquote>

##
[0.25.1](hugr-passes-v0.25.0...hugr-passes-v0.25.1)
- 2025-12-29

### Bug Fixes

- two problems in array linearization from #2749
([#2779](#2779))
</blockquote>

## `hugr`

<blockquote>

##
[0.25.2](hugr-v0.25.1...hugr-v0.25.2)
- 2025-12-30

### Bug Fixes

- *(determinism)* use BTreeMap in ModuleGraph
([#2783](#2783))

### New Features

- Re-export hugr_core::hugr::linking from hugr::
([#2781](#2781))
</blockquote>

## `hugr-cli`

<blockquote>

##
[0.25.0](hugr-cli-v0.24.3...hugr-cli-v0.25.0)
- 2025-12-22

### New Features

- *(cli, python)* programmatic interface to cli with python bindings
([#2677](#2677))
- return description output to python on error
([#2681](#2681))
- [**breaking**] Type-safe access for node metadata
([#2755](#2755))
- [**breaking**] GeneratorDesc metadata definition
([#2759](#2759))

### Refactor

- [**breaking**] move envelope reading to dedicated module with
dedicated errors ([#2689](#2689))
- *(cli)* [**breaking**] remove deprecated hugr_json handling
([#2690](#2690))
- [**breaking**] Remove multiple deprecated definitions
([#2751](#2751))
</blockquote>

## `hugr-persistent`

<blockquote>

##
[0.4.0](hugr-persistent-v0.3.4...hugr-persistent-v0.4.0)
- 2025-12-22

### New Features

- [**breaking**] Remove `RootCheckable`
([#2704](#2704))
- [**breaking**] Bump MSRV to Rust 1.89
([#2747](#2747))
- [**breaking**] Type-safe access for node metadata
([#2755](#2755))

### Refactor

- [**breaking**] Remove multiple deprecated definitions
([#2751](#2751))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/release-plz/release-plz/).
@hugrbot hugrbot mentioned this pull request Jan 6, 2026
github-merge-queue bot pushed a commit to Quantinuum/tket2 that referenced this pull request Jan 6, 2026
So following #1325 I was finally able to (/finally succeeded) in
evaluating the effect of Quantinuum/hugr#2749 on
guppy tests. (There was some question on that PR as to whether we needed
to add new facility, see #2766; here is the data.)

Three tests were affected (indeed the same ones as were broken and then
fixed by Quantinuum/hugr#2779 but that is a
separate issue). The sizes of the LLVM output as follows:

| | Original (hugr 0.24.3) | Hugr
0.25+[fix](Quantinuum/hugr#2779) | Hugr
0.25+[fix](Quantinuum/hugr#2779) + this PR |
|----|----|----|----|
| [new test](Quantinuum/guppylang#1411) | 9568 |
11856 | 9888 |
| basic_type | 10224 | 11616 | 10400 |
| notebook2 | 15680 | 17184 | 15936 |
| notebook5 (Hugr 1) | 10832 | 12304 | 11072 |
| notebook5 (Hugr 2) | 10480 | 11840 | 10656 |

Inspection of the hugrs in the middle row revealed the helper functions
from Quantinuum/hugr#2749 were indeed present in
the LLVM output as `define` (not `define private`). Hence, this PR,
following which LLVM is able to remove the `define`s. (I have not looked
into the remaining +2-3% increase. (The numbers include many other
changes between hugr-0.24.3 and hugr-0.25.0.)
github-merge-queue bot pushed a commit that referenced this pull request Jan 9, 2026
…2800)

Yet another problem from #2749.

LinkedHugr did not respect the "recursive replacement" option (on for
all non-deprecated, set_replace_xxx, methods), where the replacement is
processed by the same ReplaceTypes. Only the entrypoint-subtree of the
inserted/linked-in hugr was recursively processed; other functions
(outside the entrypoint, but pulled in with it) were not.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

(hugr-passes) Add NodeTemplate::LinkedHugr

4 participants