v1.0.0-beta.20
1.0.0-beta.20 (2026-04-13)
⚠ BREAKING CHANGES
- remove u1 type from user-facing Noir (#11753)
- remove unnecessary
state_lenargument from `poseidon2_permu… (#11610) - Remove SignedField entirely (#11710)
- Default constants to u32 (#11838)
- remove deprecated
StructDefinition(#11859) - comptime struct/enum/type (#11698)
- Treat uses of comptime globals identically to
comptime { GLOBAL_NAME }(#11627) - stdlib: remove deprecated type
Vecfrom stdlib (#11282)
Features
- Allow immrefs to go from acir to brillig (#12035) (6c53b58)
- Avoid duplicated calculation of CFG (#12164) (fe15bae)
- brillig: Block param coalescing (#11621) (7d07e18)
- brillig: Function specialization for constant arguments (#11872) (20cd7b2)
- brillig: Live intervals (#11725) (774f73c)
- brillig: LRU-based register spilling (#11556) (39f25c9)
- Clarify type mismatch errors when base names are equal (#12074) (3a0508e)
- cli: Add
--overwrite-returnoption (#11697) (4c95deb) - Comptime struct/enum/type (#11698) (abf4a87)
- Group repeating sequences of call stack frames (#11691) (5fc2c79)
- Implement
EqandOrdfor tuples of up to length 12 (#11681) (5f7b06b) - Improve error location of necessary/unnecessary visibility (#11460) (12ecac9)
- lsp: Show Nargo.toml errors as diagnostics and watch for file changes (#12153) (1a92d6f)
- Only print SSA optimization result if it produced changes (#11587) (4e26919)
- opt: Add simpler mem2reg pass (#11500) (2b09b8b)
- opt: Change stdlib array methods to take immutable references (#11991) (39f39a5)
- Primitive type aliases (#11882) (37725f5)
- Remove u1 type from user-facing Noir (#11753) (f190e78)
- Show function names in backtraces (#11483) (0adcf74)
- Simplify vector_push_back when length is known for complex types (#11717) (95fc5e9)
- ssa_fuzzer: Poseidon + compilation errors logging (#11877) (882d7cc)
- ssa: Collapse redundant nested merges when flattening (#12116) (294a558)
- ssa: Immutable reference type (#12182) (091a2f7)
- ssa: Iterative dominance frontiers for mem2reg_simple (Cytron et. al 1991) (#12091) (2d3e6c6)
- ssa: More aggressive Brillig loop unrolling (#7236) (8e57c6b)
- ssa: Remove redundant block params (#12047) (c033e48)
- ssa: Replace most usage of old mem2reg pass (#11935) (b48edd4)
- stdlib: Add
#[foreign(poseidon2_config_state_size)]and usestatic_assertinposeidon2_permutation(#11716) (4c33f8a) - Warn on unnecessary
muton variables (#11678) (f2116b0)
Bug Fixes
<Type>::trait_methodandType::trait_methodfixes (#11636) (65c3939)- acir: Do not create an input witness when there are no input parameters (#11672) (f8685f7)
- acir: Handle inserting into an empty vector at index 0 in ACIR (#11703) (0e02b0c)
- acir: Just refer to
popin error message when the vector is empty (#11890) (4f7a709) - acir: Prevent mixed constant/witness scalar pairs in MSM opcode (#12039) (a9587c8)
- acir: Unify empty vector handling in pop (#11688) (79e5f95)
- acir: Use
flat_element_typesto set thevalue_typesofAcirDynamicArray(#11719) (64b1b82) - Add killed set to fix regressions in reversed last use pass (#12174) (e63aa50)
- Add type checking for constructor patterns in match expressions (#11887) (c10d1ea)
- All or nothing for ECAdd (#11939) (97dec75)
- Allow AsTraitPath in type expression arithmetic (#11960) (d3f1efe)
- Allow user-defined items to collide with prelude items (#12112) (7878559)
- Apply check on truncating output of unchecked sub only to signed types (#11814) (7104fb7)
- Avoid duplicates when removing then inserting in hashmap (#12084) (ed8c124)
- Avoid nondeterminism when reporting "Type annotation needed" (#12087) (279aafb)
- Avoiding panic from cyclic global (#11537) (34e3758)
- brillig: Differentiate LHS and RHS bit size in SHL and SHR (#11997) (24911f5)
- brillig: Do not ignore the returned semantic length (#11878) (2446095)
- brillig: Handle the 4th case in
SpillManager::ensure_permanent_spill(#12027) (c90e834) - brillig: Mark
ConditionalMov::destinationaswriteinbrillig_check(#11891) (3d8d3aa) - brillig: Prevent premature register deallocation in coalesced pairs (#11652) (824f568)
- brillig: Protect against memory address overflows (#11864) (3a5091b)
- brillig: Reuse transient spill slots when re-spilling an unmarked value (#11862) (f60c8ef)
- brillig: Use
LessThanEqualsinstead ofLessThanincheck_max_stack_depthprocedure (#11895) (a2c2730) - brillig: Use
reserved_lenandreturns_lenin the stack frame bounds assertion incodegen_call(#11918) (44a6dd2) - Check a capture was inserted when computing the capture index (#11868) (f115dcc)
- Check dominators when removing truncate instructions (#12095) (5939e7b)
- Check for overlapping implementations (#11328) (de7e439)
- Check mutability in
*&mut xelaboration optimization (#12079) (8e1bf36) - Check oracle return type on any function expr, not only on calls (#12158) (1de1152)
- Check types before globals when resolving named types (#11919) (679b429)
- cli: Fail when interpret output or results change across SSA passes (#12138) (3964f5f)
- cli: Wrap the DAP server input reader to fix JSON payloads (#12154) (04cba8d)
- Clone generic binding values in comptime (#11765) (c9652be)
- comptime: Follow bindings when interpreting format string (#11853) (363fc8a)
- comptime: Implement
HashandPartialEqforTraitConstraint(#11809) (f1db02c) - Copy lambda env in comptime evaluation (#11731) (d6a4564)
- Correct bit size assumption for bound constraint (#11654) (38bb8a4)
- Correct comptime handling of bindings/generics in call_closure (#11732) (013636e)
- Correct confirmed-moves optimization in ownership pass for cross-loop assignments (#12156) (f83ac7c)
- Correct ECDSA doc comments and add curve order edge case tests (#12016) (b8e8f0d)
- Correct index out of bounds location (#11685) (fffdad0)
- Correct token conversion for Integer::Field in comptime (#11786) (0adc7fb)
- Deduplicate traits (#11907) (79453fd)
- Default constants to u32 (#11838) (53f935e)
- Desugar op-assign during elaboration to avoid double evaluation of lvalues (#12123) (89f0a75)
- Detect unconstrained callees via type for indirect calls (#11657) (2f24b9a)
- Disallow mutating non-mutable references (owernship feature) (#11674) (f179cc0)
- Disallow
impl Traitin invalid type positions (#11944) (1f71261) - Do not nest semi-colon inside Comptime statements (#11640) (26d12a0)
- doc: Double-reexport can lead to empty module (#11665) (85aae28)
- docs: Add v1.0.0-beta.19 versioned docs (#11724) (fa33ce4)
- docs: Resolve #include_code macros in v1.0.0-beta.19 versioned docs (#11812) (da53c8f)
- Don't panic on ABI tuple length mismatch (#12096) (4b1d34b)
- Don't simplify
x | MAXif x is signed (#12100) (49c7691) - Don't skip clone for vector operations in Brillig (#11485) (efc4e62)
- Don't update the bindings when checking functions (#11844) (764aca4)
- elaborator: Replace generics with fresh type variables in
add_prepared_trait_implementation(#11598) (fb7837b) - Eliminate unnecessary clones on array indexing at last use (#12134) (36a8119)
- Error on struct pattern syntax for enum variants (#11930) (974c3d4)
- Error when missing trait items (#11922) (f7a7e6c)
- Fix casting negative fields to Field (#11618) (d45f2b1)
- Fix cycle in lookup_associated_type_in_parent_impls (#12160) (7245cf8)
- Fix LICM hoisting failing constraints out of loops (#11771) (b79712e)
- fmt: Indent block inside index assignment (#12133) (784afa2)
- fmt: Off by one error when wrapping comments (#11847) (c7fe615)
- frontend: Always validate macro calls (#11836) (26af3f7)
- frontend: Avoid spurious errors on turbofish generic count mismatch (#11861) (7861de2)
- frontend: Block private inherent impl methods from leaking across modules (#11839) (b99d3c9)
- frontend: Check that
Type::Forallhas no fewer generics than the function (#11940) (b380733) - frontend: Concrete impl dual turbofish binding (#11848) (efc4f28)
- frontend: Follow bindings in
Type::substituteto avoid infinite loop (#11624) (6868747) - frontend: Handle various overflows (#11947) (dee9c0f)
- frontend: Numeric type alias validation (#11845) (ef7a218)
- frontend: Reject
#[oracle]returning a vector containing astr(#11881) (5ddd28c) - frontend: Resolve turbofish in numeric type aliases (#11840) (a47c381)
- fuzzer: Correct type when assigning ref (#11988) (fa67e0b)
- fuzz: Make the distance metric symmetric (#11995) (a61b8b4)
- Guard against mutations from external crates in
TypeDefinitionmethods (#11632) (a9d8b61) - Handle
&selfin formatter to avoid producing& self(#11996) (87f2fc5) - Immutable references do not require mutability (#11908) (69abd3d)
- Improve error reporting for runtime variables in comptime code (#11986) (5fa6131)
- Improve stdlib docs with doc comments (#11998) (a3f88ea)
- Incorrect cast between signed integers simplification (#12104) (9405c29)
- Keep vector length for zero types (#11601) (1177456)
- Let comptime string value hold Vec<u8> (#11743) (9f2785b)
- Look for associated types on parent traits and impls (#11745) (e3904eb)
- lsp: Autocomplete in type generics (#12080) (4e1fb40)
- lsp: Correct self param when generating trait impl stub (#12098) (a90eb42)
- lsp: Don't zip_eq in inlay hints (#12081) (b37a537)
- lsp: Hover on numeric generic (#12097) (a00155d)
- lsp: When two exprs exist at a location, prefer the type of the expression that came first (#12108) (64115fc)
- mem2reg: Insert
make_arrayelements intoaliased_referencesif array aliases are unknown (#11854) (02b1193) - Missing monomorphization visit of constrain message (#12159) (48fe6a4)
- Missing Type::Vector in array_zero_value (#11683) (803a56b)
- noirc_frontend: Improve error for struct literal in if condition (#11557) (721d7ab)
- Only trigger debugger on things from the debugger crate (#12163) (842974f)
- ownership: Consider the index to be the first and collection to be the last use (#12149) (d538b93)
- Parse
&&xand&&mut xas nested references (#11920) (bff6227) - parser: Handle member access in
Parser::parse_statement_or_expression_or_lvalue(#11822) (d100770) - Perform abi check on struct on declaration, not usage (#11628) (a4c32f0)
- Perserve comptime struct field order (#11804) (cd41829)
- Preserve comptime string bytes (#12068) (16c225b)
- Preserve side-effects predicate for heterogeneous vector_push_back (#11664) (325fd70)
- Prevent crash when resolving method in trait impl with unknown t… (#11656) (7cff3a6)
- Prevent CSE from hoisting instructions into loop headers (#12044) (d5b6fad)
- Prevent cyclic recursion in trait bound resolution (#11901) (3d29746)
- Prevent double register deallocation in coalescing hub pattern (#11706) (733c373)
- Prevent force_unroll blowup for large zero-useful-cost loops (#12155) (18e996a)
- Prevent infinite constant term movement during unification (#11867) (d837fac)
- Prevent infinite recursion by erroring on cyclic type aliases (#11871) (f7b9d20)
- Prevent potential overflow for i128 (#12115) (5f93d49)
- Proper field comparison in comptime (#11748) (28c3b5f)
- Quoted eq/hash consistency (#11733) (c603e3c)
- Remove most comptime mut functions (#11825) (f78444a)
- Remove stale u1 references from error messages (#12165) (46a5eb7)
- Resolve enum variant globals with generics in comptime interpreter (#11924) (21e3f32)
- Resolve imports in batches (#11583) (48245f6)
- Restore current_item after type alias definition (#11912) (da19a54)
- Simplify before simulate (#11645) (c4c43e7)
- Skip empty AssertZero opcodes in ACVM optimizer (#11780) (a48028f)
- Ssa interpreter unchecked sub was checked (#12113) (28d61db)
- ssa_fuzzer: Fix non-deterministic iteration order (#12041) (4bcbec9)
- ssa: Aliasing issues in load/store forwarding (#12125) (f4ead98)
- ssa: Check induction var when fetching const upper bound (#11896) (eb65201)
- ssa: Count params as loop header defined variables when folding (#11630) (8e35c63)
- ssa: Do not fold ArraySet to MakeArray in simplifier (#11659) (ebb5ff1)
- ssa: Fully simplify CFG by exploring new successors and cascading invalidation (#11619) (8aa2809)
- ssa: Make
get_bit_size_from_ssa_typematchssa_type_to_parameterforFunction(#11860) (70dcc2f) - ssa: Prevent false merge collapses when inner IfElse simplifies to its condition (#12189) (5cc82dc)
- ssa: Remove dead Brillig stores to local allocations in DIE (#12020) (69b2a09)
- ssa: Simplify boolean AND with max value and harden simplify_cfg (#11602) (1f771be)
- ssa: Track instruction results when hoisting to loop header (#11634) (9dec202)
- ssa: Try not to hoist into loop headers during constant folding (#11616) (ea8f830)
- ssa: Unrolling blocks with multiple parameters and constant JmpIf (#12071) (63aee18)
- ssa: Verify jmpif condition matches header instruction in get_const_upper_bound (#11615) (8bdc389)
- stdlib: Correct misleading doc comment on UHashMap::linear_probe (#12023) (e62f39e)
- Track aliases during ownership pass to avoid moves (#12118) (9e82927)
- Traverse transitive coalescing chains in has_live_partner (#12062) (69f9bc7)
- Treat uses of comptime globals identically to
comptime { GLOBAL_NAME }(#11627) (947f6a3) - Type alias in closure environment (#11941) (b9e99b9)
- Unwrap expr in comptime is_break/is_continue/has_semicolon (#11805) (17f185d)
- Update rustls-webpki to 0.103.10 (RUSTSEC-2026-0049) (#11942) (66086a0)
- Use 0, 0 for point at infinity (#11925) (33d3de7)
- Use correct types for Prover.toml template (#11693) (71c0384)
- Use repeated array literal in monomorphization zeroed (#12105) (bd62a75)