Sitelet https://github.com/obi1kenobi/cargo-semver-checks/releases
Skip to content

Releases: obi1kenobi/cargo-semver-checks

v0.51.0

Choose a tag to compare

@github-actions github-actions released this 03 Oct 22:41
260fad7

In this release

C-ABI variadic functions are new in Rust 1.99, and this is the first time a new language feature has had immediate SemVer linting support in the corresponding cargo-semver-checks release 🎉

  • Six new lints for variadic functions:
    • function_no_longer_variadic
    • function_now_variadic
    • inherent_method_no_longer_variadic
    • inherent_method_now_variadic
    • trait_method_no_longer_variadic
    • trait_method_now_variadic
  • Bugfix in inherent_method_now_doc_hidden when multiple impl blocks for the same type have the same method name
  • Support for symlinks inside git repos used by the --baseline-rev flag
    • Thanks to @heaths for the initial PR that helped set this up.
  • Lots of security hardening, both in this repository and in dependencies that I also manage

semver-animation
✨ This adorable animation was made by @dekirisu ✨

This release requires Rust 1.93+ both to install (MSRV) and at runtime.

All merged PRs

What's Changed

New Contributors

Full Changelog: v0.50.0...v0.51.0

v0.50.0

Choose a tag to compare

@github-actions github-actions released this 01 Aug 17:02
4297e8b

In this release

  • Support for rustdoc JSON v61 for the latest nightly Rust
  • One new lint: auto_trait_impl_added
  • Bugfix in constructible_struct_adds_field to properly account for existing pub but #[doc(hidden)] fields.
  • Support for parsing rustdocflags from .cargo/config.toml and some minor bugfixes

semver-animation
✨ This adorable animation was made by @dekirisu ✨

This release requires Rust 1.93+ both to install (MSRV) and at runtime.

All merged PRs

  • Fix publishing workflow not being triggered because of optional job. by @obi1kenobi in #1679
  • Make Rust 1.93 the MSRV and remove old fixtures. by @obi1kenobi in #1680
  • Update to trustfall_rustdoc v0.40.0, dropping rustdoc JSON v56. by @obi1kenobi in #1682
  • Weekly cargo update of dependencies by @obi1kenobi in #1684
  • Fix lints about constructible structs to account for non-pub-API fields. by @obi1kenobi in #1685
  • Weekly cargo update of dependencies by @obi1kenobi in #1686
  • Add minor lint: auto trait impl added to pub type by @ivelieu in #1683
  • Upgrade trustfall_rustdoc to v0.41.0 adding support for rustdoc v61. by @obi1kenobi in #1687
  • Bump cargo-config2 to pick up rustdocflags parsing and bugfixes. by @obi1kenobi in #1688
  • Bump mozilla-actions/sccache-action from 0.0.10 to 0.0.11 by @dependabot[bot] in #1689
  • Weekly cargo update of dependencies by @obi1kenobi in #1690
  • Release v0.50.0 supporting rustdoc v61 and parsing config rustdocflags. by @obi1kenobi in #1691

New Contributors

Full Changelog: v0.49.0...v0.50.0

v0.49.0

Choose a tag to compare

@github-actions github-actions released this 18 Jul 17:18
7c7bbfa

In this release

  • Unstable --stability-aware mode for detecting breakage in the Rust standard library.
  • False-positive fix: correctly propagate #[doc(hidden)] through glob re-exports when determining public API.
  • Bugfix: honor --package together with --workspace, including explicitly selected publish = false packages.
  • The cargo-semver-checks binary can now be invoked directly, including by full path, as well as via cargo semver-checks.
  • Exit codes now distinguish deny-level SemVer violations (100) from errors that prevented the check from completing (101).
  • Git repositories using SHA-256 object hashes are now supported.

semver-animation
✨ This adorable animation was made by @dekirisu ✨

This release requires Rust 1.92+ both to install (MSRV) and at runtime.

All merged PRs

New Contributors

Full Changelog: v0.48.0...v0.49.0

v0.48.0

Choose a tag to compare

@github-actions github-actions released this 31 May 14:25
c9d2ce6

In this release

  • One new lint: union_field_marked_deprecated
  • False positive fix: do not report supertrait changes if switching between where and trait Name: Super syntaxes
  • Bugfix: avoid erroneous cache hits when changing cfg or target triple flags

semver-animation
✨ This adorable animation was made by @dekirisu ✨

This release requires Rust 1.91+ both to install (MSRV) and at runtime.

All merged PRs

New Contributors

Full Changelog: v0.47.0...v0.48.0

v0.47.0

Choose a tag to compare

@github-actions github-actions released this 08 Mar 16:24
cdb5e05

In this release

  • 7 new lints
  • Spotlight: Google Summer of Code

This release also includes a workaround for a Rust 1.94 rustdoc bug that caused cargo-semver-checks to crash in certain projects. We contributed the fix to rustdoc and are including a workaround here so our users can continue using cargo-semver-checks with Rust 1.94.

semver-animation
✨ This adorable animation was made by @dekirisu ✨

This release requires Rust 1.91+ both to install (MSRV) and at runtime.

Spotlight: Participating in Google Summer of Code

cargo-semver-checks is once again participating in Google Summer of Code, as part of the Rust project!

This is the third year in a row that students from all over the world are eligible to submit proposals for multi-month projects aimed at improving Rust and its tooling such as cargo-semver-checks. An initial list of suggested proposal topics is available here, and student are of course welcome to bring their own ideas as well.

The application period runs from March 16-31, 2026. Good luck to all applicants — we're excited to see you and we can't wait to see what you build!

New lints

7 opt-in lints for additive-only changes were added in this release:

  • inherent_method_added
  • inherent_method_no_longer_unsafe
  • inherent_method_now_const
  • repr_c_added
  • repr_transparent_added
  • struct_no_longer_has_non_pub_fields
  • struct_no_longer_non_exhaustive

All merged PRs

New Contributors

Full Changelog: v0.46.0...v0.47.0

v0.46.0

Choose a tag to compare

@github-actions github-actions released this 23 Jan 06:20
097412d

In this release

  • 45 new lints — our biggest release ever!
  • Spotlight: Exponential growth continued — 2025 Year in Review

semver-animation
✨ This adorable animation was made by @dekirisu ✨

This release requires Rust 1.90+ both to install (MSRV) and at runtime. Future releases will require Rust 1.91+.

This is the last release to support git-based package indexes. Future releases will require the use of a sparse index for linting against package versions published to a registry.

Spotlight: Exponential growth continued — 2025 Year in Review

Please check out our year in review post for a look at what we accomplished in 2025, and what lies ahead.

One of the highlights: in 2025 we more than doubled the number of lints, from 120 on January 1 to 242 lints on December 31!
Exponential growth in the number of lints in cargo-semver-checks, doubling each year: 30 lints at the end of 2022, 57 at the end of 2023, 120 at the end of 2024, and 242 at the end of 2025.

New lints

This release ships with 245 lints in total. We added 35 new SemVer-major deny-by-default lints, 2 major warn-by-default lints, and 8 new allow-by-default lints for additive-only changes.

SemVer-major, deny-by-default

New trait impls

  • copy_impl_added

Type kind changes (enum became struct etc.)

  • enum_changed_kind
  • trait_changed_kind
  • union_changed_kind
  • union_changed_to_incompatible_struct
  • union_with_multiple_pub_fields_changed_to_struct

Cargo feature graph removal

  • feature_no_longer_enables_feature

Exported functions (FFI) signature/ABI/target features

  • exported_function_abi_no_longer_unwind
  • exported_function_abi_now_unwind
  • exported_function_parameter_count_changed
  • exported_function_return_value_added
  • exported_function_now_returns_unit
  • exported_function_target_feature_added
  • exported_function_requires_more_target_features

Method ABI/unwind/symbol changes (inherent + trait)

  • inherent_method_changed_abi
  • inherent_method_no_longer_unwind
  • inherent_method_now_unwind
  • trait_method_changed_abi
  • trait_method_no_longer_unwind
  • trait_method_now_unwind
  • method_export_name_changed

Inherent method receiver changes

  • method_no_longer_has_receiver
  • method_receiver_mut_ref_became_owned
  • method_receiver_ref_became_mut
  • method_receiver_ref_became_owned
  • method_receiver_type_changed

Trait method receiver changes

  • trait_method_no_longer_has_receiver
  • trait_method_receiver_added
  • trait_method_receiver_mut_ref_became_owned
  • trait_method_receiver_mut_ref_became_ref
  • trait_method_receiver_owned_became_mut_ref
  • trait_method_receiver_owned_became_ref
  • trait_method_receiver_ref_became_mut
  • trait_method_receiver_ref_became_owned
  • trait_method_receiver_type_changed

SemVer-major, warn-by-default

Sealed trait method receiver changes

  • pub_api_sealed_trait_method_receiver_added
  • pub_api_sealed_trait_method_receiver_mut_ref_became_ref

Allow-by-default lints for additive-only changes

Public struct additions / exhaustiveness

  • exhaustive_struct_added
  • exhaustive_struct_with_private_fields_added
  • exhaustive_struct_with_doc_hidden_fields_added
  • non_exhaustive_struct_added

Cargo feature graph expansion

  • feature_newly_enables_feature

Associated items added on inherent impls

  • inherent_associated_pub_const_added

#[must_use] removals

  • inherent_method_must_use_removed
  • trait_must_use_removed

All merged PRs

Read more

v0.45.0

Choose a tag to compare

@obi1kenobi obi1kenobi released this 01 Nov 16:36
90a7844

In this release

  • Respect .cargo/config.toml build configuration, RUSTFLAGS, and RUSTDOCFLAGS
  • Spotlight: Ghosts in the Compilation

semver-mk3-optimized
✨ This adorable animation was made by @dekirisu ✨

This release requires Rust 1.89+ both to install (MSRV) and at runtime. Future releases will require Rust 1.90+.

Spotlight: Ghosts in the Compilation

Celebrating Halloween, Ghosts in the Compilation is the debugging story of how the functionality for respecting .cargo/config.toml configuration came to be.

We found a crate where:

  • cargo-semver-checks said the code didn't compile.
  • cargo check said it was fine.

As a result, we learned a fair bit about the edge cases of cargo, rustc, rustdoc, and compilation flags. Check it out here!

All merged PRs

New Contributors

Full Changelog: v0.44.0...v0.45.0

v0.44.0

Choose a tag to compare

@obi1kenobi obi1kenobi released this 21 Sep 01:31

In this release

  • 22 new lints, for a total of 200 🎉
  • Spotlight: The Road to 200 lints

semver-mk3-optimized
✨ This adorable animation was made by @dekirisu ✨

This release requires Rust 1.88+ both to install (MSRV) and at runtime. Future releases will require Rust 1.89+.

Spotlight: The Moore's Law of Lints

We have a kind of "Moore's Law" for lints: every year we run twice as many lints in the same total time.

  • 30 lints at the end of 2022
  • 57 lints at the end of 2023
  • 120 lints at the end of 2024
  • We'd need 240 lints at the end of 2025 to keep up the pace; with ~3.3 months to go, we're at 200 lints.
  • Meanwhile, as of the optimizations shipped 2.5 years ago, running lints on crates.io's largest library required only 8s or less.

This is rare and remarkable, and requires overcoming many complex socio-technical challenges! Here are a few examples from conference talks related to cargo-semver-checks:

We're also fortunate to have two extraordinary students working on cargo-semver-checks this year as part of Google Summer of Code! Their work is key to continuing this positive exponential trend, and we look forward to showcasing their impact more closely later this year.

New lints

The 22 new lints are grouped in several categories.

API or ABI breakage

  • function_const_generic_reordered
  • function_generic_type_reordered
  • function_now_returns_unit
  • inherent_method_const_generic_reordered
  • inherent_method_generic_type_reordered
  • inherent_method_now_returns_unit
  • repr_align_added
  • repr_align_changed
  • repr_align_removed
  • repr_packed_changed
  • trait_const_generic_reordered
  • trait_generic_type_reordered
  • trait_method_const_generic_reordered
  • trait_method_generic_type_reordered
  • trait_method_now_returns_unit
  • trait_method_return_value_added
  • type_const_generic_reordered
  • type_generic_type_reordered

Compatibility risks, such as changes that may require a SemVer major bump to revert, or may otherwise represent unintended API changes without being SemVer-major themselves:

  • pub_api_sealed_trait_method_return_value_added

Additive-only API changes (opt-in only; more work required):

  • function_must_use_removed
  • struct_must_use_removed
  • union_must_use_removed

All merged PRs

New Contributors

  • @nk9 made their first contribution in #1392

Full Changelog: v0.43.0...v0.44.0

v0.43.0

Choose a tag to compare

@github-actions github-actions released this 10 Aug 04:49
09966e1

In this release

  • Spotlight: I'm giving a talk at Rust Forge!
  • Performance improvements
  • 1 new lint, for a total of 178

This release requires Rust 1.87+ both to install (MSRV) and at runtime. Future releases will require Rust 1.88+.

Spotlight: I'm giving a talk at Rust Forge!

Rust Forge is a creative new conference organized by Rust in Action author Tim McNamara. It's scheduled for 27-30 August 2025 in Wellington, New Zealand.

My talk is titled "The Past, Present, and Future of SemVer in Rust" and I'm extremely excited about it! Here's a short description:

At least 1-2 times per week, accidental breaking changes sneak into the new release of some popular Rust package, despite the maintainers' best efforts. Why is this still a problem 10 years after Rust 1.0? What will it take to finally stop such breakage, so we can have fearless cargo update?

It's not too late to grab a ticket! I hope to see you there!

Performance improvements

Supporting an exponentially-growing number of lints requires periodic maintenance in the form of mandatory performance engineering, Without it, things would quickly get out of hand, and large crates and large workspaces would be affected first. To prevent that, this release cycle focused on both internal and external improvements.

Externally-visible improvements include lint execution time improvements, courtesy of a new query profiling tool prototype developed by @CLIDragon. This allowed us to add targeted new indexes that speed up the execution of some lints by as much as 10x! After these optimizations, running the full suite of lints on Rust's largest crates needs only ~2s, down from around ~8s previously.

Internal improvements include a variety of optimizations aimed at reducing the time taken by our CI suite, from an original of ~7min for cargo test down to around ~1min.

If you're wondering why cargo test used to take 7min in the first place: our test suite runs ~250000 lint queries to ensure correctness and keep false-positives out! Even extremely cheap operations done 250k times add up very quickly! After the optimizations, we still run those 250k queries — we didn't sacrifice correctness at all, but merely cut out avoidable overhead.

New lints

We added only one new lint in this release, tracking an additive-only API change: enum_must_use_removed. This lint group remains opt-in-only.

All merged PRs

New Contributors

Full Changelog: v0.42.0...v0.43.0

v0.42.0

Choose a tag to compare

@github-actions github-actions released this 05 Jul 15:03
864bfd7

In this release

  • 13 new lints, for a total of 177
  • Spotlight: #[target_feature] lints
  • Bugfix: false-positive sealed trait lints

This release requires Rust 1.85+ both to install (MSRV) and at runtime. Future releases will require Rust 1.87+.

Spotlight: #[target_feature] lints

Check out this in-depth look at the SemVer and soundness surprises behind this attribute:
Unsoundness and accidental features in the #[target_feature] attribute

New lints

We added new 13 lints across several categories, including 12 lints around #[target_feature] and one lint about an additive-only change. Some of the new lints are error-by-default, while others are warnings meant to flag changes deserving closer review, or even opt-in only and disabled by default while we do more work to improve their user experience.

API breakage:

  • safe_function_requires_more_target_features
  • safe_function_target_feature_added
  • safe_inherent_method_requires_more_target_features
  • safe_inherent_method_target_feature_added
  • trait_method_target_feature_removed
  • unsafe_function_requires_more_target_features
  • unsafe_function_target_feature_added
  • unsafe_inherent_method_requires_more_target_features
  • unsafe_inherent_method_target_feature_added
  • unsafe_trait_method_requires_more_target_features
  • unsafe_trait_method_target_feature_added
  • pub_api_sealed_trait_method_target_feature_removed (warn-by-default)

Additive-only API changes (opt-in only; more work required):

  • exhaustive_enum_added

All merged PRs

Read more