Skip to content

Make trait refs & assoc ty paths properly induce trait object lifetime defaults#129543

Merged
rust-bors[bot] merged 8 commits into
rust-lang:mainfrom
fmease:obj-lt-def-gat
Jun 10, 2026
Merged

Make trait refs & assoc ty paths properly induce trait object lifetime defaults#129543
rust-bors[bot] merged 8 commits into
rust-lang:mainfrom
fmease:obj-lt-def-gat

Conversation

@fmease

@fmease fmease commented Aug 25, 2024

Copy link
Copy Markdown
Member

View all comments

Trait Object Lifetime Defaults

Primer & Definitions

You could read this section in the Reference but it has several issues (see rust-lang/reference#1407). Here's a small explainer by me that only mentions the parts relevant to this PR:

Basically, given dyn Trait (≠ dyn Trait + '_) we want to deduce its trait object lifetime bound from context without relying on normal region inference as we might not be in a body1. The "context" means the closest – what I call – (eligible) container C<X0, …, Xn> that wraps this trait object type. A container is to be understood as a use site of a "parametrized definition" (more general than type constructors). Currently eligible are ADTs, type aliases, traits and enum variants.

So if we have C<dyn Trait> (e.g., &'r dyn Trait or Struct<'r, dyn Trait>), D<C<dyn Trait>> or C<N<dyn Trait>> (e.g., Struct<'r, (dyn Trait,)>), we use the explicit2 outlives-bounds on the corresponding type parameter of C to determine the trait object lifetime bound. Here, C & D denote (eligible) containers and N denotes a generic type that is not an eligible container. E.g., given struct Struct<'a, T: 'a + ?Sized>(…);, we elaborate Struct<'r, dyn Trait> to Struct<'r, dyn Trait + 'r>.

Finally, we call lifetime bounds used as the default for constituent trait object types of an eligible container C the trait object lifetime defaults (induced by C). These defaults may of course end up getting shadowed in parts of the type by the defaults induced by any inner eligible containers.

Changes Made

These changes are theoretically breaking.

  1. Make resolved associated type paths / projections eligible containers.
    • <Y0 as TraitRef<X0, …, Xn>>::AssocTy<Y1, …, Ym> now induces trait object lifetime defaults for constituents Y0 to Ym (TraitRef is considered a separate container, see also list item (3)).
    • Notably, for the self type Y0 of (resolved) projections we now look at the bounds on the Self type param of the relevant trait (e.g., given trait Outer<'a>: 'a { type Proj; } or trait Outer<'a> where Self: 'a { type Proj; } we elaborate <dyn Inner as Outer<'r>>::Proj to <dyn Inner + 'r as Outer<'r>>::Proj).
    • Example breakages:
      trait Outer<'a> { type Ty<T: ?Sized + 'a>; }
      impl<'a> Outer<'a> for () { type Ty<T: ?Sized + 'a> = &'a T; }
      trait Inner {}
      
      fn f<'r>(x: <() as Outer<'r>>::Ty<dyn Inner>) {
      //                                ~~~~~~~~~
      //                                this branch:  dyn Inner + 'r       (due to bound `'a` on `T`)
      //                                stable/main:  dyn Inner + 'static  (due to item signature fallback)
          let _: <() as Outer<'r>>::Ty<dyn Inner + 'static> = x;
      //         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //         this branch:  error: lifetime may not live long enough // `'r` must outlive `'static`
      //         stable/main:  OK
      }
      trait Outer { type Ty; }
      trait Inner {}
      
      impl<'a> Outer for dyn Inner + 'a { type Ty = &'a (); }
      
      fn f<'r>(x: *mut &'r <dyn Inner as Outer>::Ty) {
      //                    ~~~~~~~~~
      //                    this branch:  dyn Inner + 'static  (due to lack of bounds on `Outer`; the assoc type path shadows the default induced by the type ctor `&`)
      //                    stable/main:  dyn Inner + 'r       (due to bound `'a` on `T` in (pseudo) `builtin type &<'a, T: 'a + ?Sized>;`)
          let _: *mut &'r <dyn Inner + 'r as Outer>::Ty = x;
      //         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //         this branch:  error: lifetime may not live long enough // `'r` must outlive `'static`
      //         stable/main:  OK
      }
  2. In type-relative paths Y0::Name<Y1, …, Ym> consider the trait object lifetime default indeterminate
    • Meaning if we're in an "item context" / "item signature" / "non-body" (& the principal trait isn't bounded by any outlives-bounds which would take precedence over the default) we will reject any implicit trait object lifetime bounds that would take on that default
    • Reason: Limitations of the current implementation which can't be easily overcome
      • RBV (which resolves trait object lifetime defaults by recursing into the local crate "in one sitting") would require the resolution of type-relative paths in order to look up the generics but these paths are only resolved in HIR ty lowering (that can selectively lower local items) which depends on the results of RBV (cyclic dependency!)
      • While one might be able to resolve type-relative paths in RBV in an ad-hoc fashion, it would require a lot of duplication with HIR ty lowering and its impl would be very brittle (RTN does something like that in RBV but we require a more sophisticated resolver)
      • I did attempt that but it got too gnarly and brittle and would've likely been incomplete anyway
      • See also this GH thread
      • See also #t-types/meetings > 2025-09-16 weekly @ 💬
    • This should still be maximally forward compatible and allow us to implement the desired behavior in the future.
    • Example breakage:
      trait Outer { type Ty<'a, T: 'a + ?Sized>; }
      trait Inner {}
      
      fn f<'r, T: Outer>(x: T::Ty<'r, dyn Inner>) {}
      //                              ~~~~~~~~~
      //                              this branch:  error: indeterminate  (reservation)
      //                              stable/main:  dyn Inner + 'static   (due to item signature fallback)
  3. Fixes trait object lifetime defaults inside trait refs TraitRef<X0, …, Xn> (this fell out from the previous changes). They used to be completely broken due to a nasty off-by-one error for not accounting for the implicit Self type param of traits which lead to cases like
    • Outer<'r, dyn Inner> (with trait Outer<'a, T: 'a + ?Sized> {}) getting rejected as indeterminate (it tries to access a lifetime at index 1 instead 0) (playground)
    • Outer<'r, 's, dyn Inner> (with trait Outer<'a, 'b, T: 'a + ?Sized> {}) elaborating dyn Inner to dyn Inner + 's instead of dyn Inner + 'r(!) which subsequently gets rejected of course since 's isn't known to outlive 'r (playground)
    • The same applies to trait alias refs (feature trait_alias)
    • Example breakage:
      trait Outer<'a, 'b, T: 'a + ?Sized> {}
      trait Inner {}
      
      struct F<'r, T>
      where
          T: Outer<'r, 'static, dyn Inner>
      //                        ~~~~~~~~~
      //                        this branch:  dyn Inner + 'r       (correctly mapping `'a` => `'r`)
      //                        stable/main:  dyn Inner + 'static  (incorrectly mapping `'a` => `'static` due to off-by-one)
      {
          g: G<'r, T>,
      //     ~~~~~~~~
      //     this branch:  error: mismatched types
      //                          expected: `Outer<'r, 'static, (dyn Inner + 'static)>`
      //                             found: `Outer<'r, 'static, (dyn Inner + 'r)>`
      //     stable/main:  OK
      }
      
      struct G<'r, T>(&'r (), T)
      where
          T: Outer<'r, 'static, dyn Inner + 'static>;
  4. In associated type binding TraitRef<AssocTy<X0, …, Xn> = Y> consider the trait object lifetime default indeterminate (in X0, …, Xn and Y) if X0, …, Xn contains any lifetime arguments.
    • Meaning if we're in an item context (& the principal trait isn't bounded) we will reject any implicit trait object lifetime bounds that would take on that default
    • This reserves us the right to (1) take into account the item bounds of AssocTy in the future when computing the default for Y (2) take into account the parameter bounds of AssocTy in the future when computing the defaults for X0, …, Xn.
    • This extends a preexisting hack that – given TraitRef<X0, …, Xn, AssocTy<Y0, …, Ym> = Z> – treats the default indeterminate in Y0, …, Ym and Z if X0, …, Xn contains any lifetime arguments.
    • Rephrased, this hack / reservation previously didn't account for GAT args, only trait ref args, which is insufficient
    • See also this GH comment of mine
    • Example breakages:
      trait Outer { type Ty<'a>: ?Sized; }
      trait Inner {}
      
      fn f<'r>(_: impl Outer<Ty<'r> = dyn Inner>) {}
      //                              ~~~~~~~~~
      //                              this branch:  error: indeterminate  (reservation)
      //                              stable/main:  dyn Inner + 'static   (forced)
      trait Outer { type Ty<'a, T: ?Sized + 'a>; }
      trait Inner {}
      
      fn f<'r>(_: impl Outer<Ty<'r, dyn Inner> = ()>) {}
      //                            ~~~~~~~~~
      //                            this branch:  error: indeterminate  (reservation)
      //                            stable/main:  dyn Inner + 'static   (forced)

Motivation

Both trait object lifetime default RFCs (599 and 1156) never explicitly specify what constitutes a — what I call — (eligible) container but it only makes sense to include anything that can be parametrized by generics and can be mentioned in places where we don't perform full region inference … like associated types. So it's only consistent to make this change.

Breakages

These changes are theoretically breaking because they can lead to different trait object lifetime bounds getting deduced compared to main which is obviously user observable. Moreover, we're now explicitly rejecting implicit trait object lifetime bounds inside type-relative paths (excl. the self type) and on the RHS of assoc type bindings if the assoc type has lifetime params.
However, the latest crater run found 0 non-spurious regressions (see here and here).


Fixes #115379.
Fixes #140710.
Fixes #141997.

Footnotes

  1. If we are in a body we do use to normal region inference as a fallback.

  2. Indeed, we don't consider implied bounds (inferred outlives-bounds).

@fmease fmease added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. needs-fcp This change is insta-stable, or significant enough to need a team FCP to proceed. T-types Relevant to the types team, which will review and decide on the PR/issue. labels Aug 25, 2024
@rustbot rustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Aug 25, 2024
@fmease

fmease commented Aug 25, 2024

Copy link
Copy Markdown
Member Author

@bors try

bors added a commit to rust-lang-ci/rust that referenced this pull request Aug 25, 2024
[crater] Properly deduce the object lifetime default in GAT paths

Fixes rust-lang#115379.

r? ghost
@bors

bors commented Aug 25, 2024

Copy link
Copy Markdown
Collaborator

⌛ Trying commit 8bfcd86 with merge 24cd45d...

@fmease fmease removed the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Aug 25, 2024
@bors

bors commented Aug 25, 2024

Copy link
Copy Markdown
Collaborator

☀️ Try build successful - checks-actions
Build commit: 24cd45d (24cd45d7714ba43afd4b8e62fb677b069b21c4a5)

@fmease

fmease commented Aug 25, 2024

Copy link
Copy Markdown
Member Author

@craterbot check

@craterbot

Copy link
Copy Markdown
Collaborator

👌 Experiment pr-129543 created and queued.
🤖 Automatically detected try build 24cd45d
🔍 You can check out the queue and this experiment's details.

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot craterbot added S-waiting-on-crater Status: Waiting on a crater run to be completed. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Aug 25, 2024
@fmease fmease changed the title [crater] Properly deduce the object lifetime default in GAT paths [crater] Properly deduce object lifetime defaults in GAT paths Aug 25, 2024
bors added a commit to rust-lang-ci/rust that referenced this pull request Aug 27, 2024
[CRATER] Crater Rollup

This is a " crater rollup" of:
* rust-lang#126452
* rust-lang#128784
* rust-lang#129392
* rust-lang#129422
* rust-lang#129543

**What is a crater rollup?** It's simply a crater job that is run on all of the containing PRs *together*, and then we can set the crates list for each of these jobs to just the failures after it's done. It should cut out on the bulk of "normal" crates that do nothing and simply just take time to build.

r? `@ghost`
bors added a commit to rust-lang-ci/rust that referenced this pull request Aug 28, 2024
[CRATER] Crater Rollup

This is a " crater rollup" of:
* rust-lang#126452
* rust-lang#128784
* rust-lang#129392
* rust-lang#129422
* rust-lang#129543
* rust-lang#129604

**What is a crater rollup?** It's simply a crater job that is run on all of the containing PRs *together*, and then we can set the crates list for each of these jobs to just the failures after it's done. It should cut out on the bulk of "normal" crates that do nothing and simply just take time to build.

r? `@ghost`
bors added a commit to rust-lang-ci/rust that referenced this pull request Aug 28, 2024
[CRATER] Crater Rollup

This is a " crater rollup" of:
* rust-lang#126452
* rust-lang#128784
* rust-lang#129392
* rust-lang#129422
* rust-lang#129543
* rust-lang#129604

**What is a crater rollup?** It's simply a crater job that is run on all of the containing PRs *together*, and then we can set the crates list for each of these jobs to just the failures after it's done. It should cut out on the bulk of "normal" crates that do nothing and simply just take time to build.

r? `@ghost`
@compiler-errors

Copy link
Copy Markdown
Contributor

@craterbot

Copy link
Copy Markdown
Collaborator

📝 Configuration of the pr-129543 experiment changed.

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@traviscross

Copy link
Copy Markdown
Contributor

@craterbot

Copy link
Copy Markdown
Collaborator

📝 Configuration of the pr-129543 experiment changed.

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot

Copy link
Copy Markdown
Collaborator

🚧 Experiment pr-129543 is now running

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot

Copy link
Copy Markdown
Collaborator

🎉 Experiment pr-129543 is completed!
📊 6 regressed and 0 fixed (98236 total)
📰 Open the full report.

⚠️ If you notice any spurious failure please add them to the blacklist!
ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot craterbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-crater Status: Waiting on a crater run to be completed. labels Sep 1, 2024
@fmease fmease added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Sep 2, 2024
@workingjubilee workingjubilee added the C-crater Category: Issue / PR for tracking crater runs label Feb 14, 2025
@fmease fmease removed the C-crater Category: Issue / PR for tracking crater runs label Apr 17, 2025
@fmease

fmease commented May 11, 2026

Copy link
Copy Markdown
Member Author

ready

@rust-bors

This comment has been minimized.

@rustbot

This comment has been minimized.

Comment thread compiler/rustc_hir_analysis/src/collect/resolve_bound_vars.rs
Comment thread compiler/rustc_hir_analysis/src/collect/resolve_bound_vars.rs Outdated
fmease added 7 commits May 31, 2026 20:30
…ir own args (excl. self ty)

This automatically fixes trait object lifetime defaulting for trait refs
and trait alias refs, too.
These used to be broken because the index calculation for going from
middle generic args back to HIR ones didn't take into account the
implicit self ty param present on traits.

Moreover, in item signatures reject hidden trait object lifetime bounds
inside type-relative paths (excl. the self ty) on grounds of the default
being indeterminate.
* print `Empty` as it's called in code, otherwise it's unnecessarily confusing
* go through the middle::ty Generics instead of the HIR ones, so we can dump the
  default for the implicit `Self` type parameter of traits, too
…ntiated assoc ty bindings

Namely, on the RHS and in the args of the bindings.
@rustbot

rustbot commented May 31, 2026

Copy link
Copy Markdown
Collaborator

This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed.

Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers.

@lcnr

lcnr commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

I don't feel 100% confident in my rereview but remember reviewing this more indepth at the when approving the FCP. Thank you for the good work and this sure is an area of the compiler I don't want to touch myself :x

@bors r+ rollup=never

@rust-bors

rust-bors Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

📌 Commit 102434c has been approved by lcnr

It is now in the queue for this repository.

@rust-bors

This comment has been minimized.

@jhpratt

jhpratt commented Jun 9, 2026

Copy link
Copy Markdown
Member

stalled

@bors yield

@bors try jobs=dist-i686-msvc

@rust-bors

rust-bors Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Auto build was cancelled. Cancelled workflows:

The next pull request likely to be tested is #157679.

@rust-bors

This comment has been minimized.

@rust-bors

This comment has been minimized.

@rust-log-analyzer

Copy link
Copy Markdown
Collaborator

The job x86_64-gnu-miri failed! Check out the build log: (web) (plain enhanced) (plain)

Click to see the possible cause of the failure (guessed by this bot)
tests/pass-dep/libc/libc-socketpair.rs ... ok
tests/pass-dep/libc/libc-strerror_r.rs ... ok
tests/pass-dep/libc/libc-sysconf.rs ... ok

Session terminated, killing shell...::group::Clock drift check
  local time: Tue Jun  9 21:38:39 UTC 2026
##[error]The runner has received a shutdown signal. This can happen when the runner service is stopped, or a manually started runner is canceled.
  network time: Tue, 09 Jun 2026 21:38:40 GMT
##[endgroup]
 ...killed.

@rust-bors

rust-bors Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

💔 Test for 80a97f5 failed: CI. Failed job:

@fmease

fmease commented Jun 9, 2026

Copy link
Copy Markdown
Member Author

spurious @bors retry

@rust-bors

This comment has been minimized.

@rust-bors

rust-bors Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

☀️ Try build successful (CI)
Build commit: 11f024b (11f024b3836e6a77d4c937cd5e99c8e9cb41b391, parent: beae781308e9ddef13074a03faf57ca2fac59a5b)

@rust-bors

rust-bors Bot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

☀️ Test successful - CI
Approved by: lcnr
Duration: 3h 20m 34s
Pushing d56483a to main...

@github-actions

Copy link
Copy Markdown
Contributor
What is this? This is an experimental post-merge analysis report that shows differences in test outcomes between the merged PR and its parent PR.

Comparing beae781 (parent) -> d56483a (this PR)

Test differences

Show 46 test diffs

Stage 1

  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-binding-item-bounds-non-static.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-binding-item-bounds-static.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-binding-item-bounds.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-self-ty-static.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-self-ty.rs#bound: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-self-ty.rs#clause: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-dyn-binding-nonstatic1.rs: pass -> [missing] (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-dyn-binding-nonstatic2.rs: pass -> [missing] (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-dyn-binding-nonstatic3.rs: pass -> [missing] (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-dyn-binding-static.rs: pass -> [missing] (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-gat-binding-item-bounds.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-gat-binding.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-inferred-args.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-inferred.rs: pass -> [missing] (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-inherent-gac.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-inherent-gat.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-resolved-gat.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-trait-alias-ref.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-trait-ref-lifetime-bound-on-assoc-ty.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-trait-ref.rs: [missing] -> pass (J0)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-type-relative-gat.rs: [missing] -> pass (J0)

Stage 2

  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-binding-item-bounds-non-static.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-binding-item-bounds-static.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-binding-item-bounds.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-self-ty-static.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-self-ty.rs#bound: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-assoc-ty-self-ty.rs#clause: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-dyn-binding-nonstatic1.rs: pass -> [missing] (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-dyn-binding-nonstatic2.rs: pass -> [missing] (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-dyn-binding-nonstatic3.rs: pass -> [missing] (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-dyn-binding-static.rs: pass -> [missing] (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-gat-binding-item-bounds.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-gat-binding.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-inferred-args.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-inferred.rs: pass -> [missing] (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-inherent-gac.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-inherent-gat.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-resolved-gat.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-trait-alias-ref.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-trait-ref-lifetime-bound-on-assoc-ty.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-trait-ref.rs: [missing] -> pass (J1)
  • [ui] tests/ui/object-lifetime/object-lifetime-default-type-relative-gat.rs: [missing] -> pass (J1)

Additionally, 4 doctest diffs were found. These are ignored, as they are noisy.

Job group index

Test dashboard

Run

cargo run --manifest-path src/ci/citool/Cargo.toml -- \
    test-dashboard d56483a91d6cf5041351a3208b8d08f98f0c8b56 --output-dir test-dashboard

And then open test-dashboard/index.html in your browser to see an overview of all executed tests.

Job duration changes

  1. dist-x86_64-llvm-mingw: 1h 14m -> 1h 53m (+51.8%)
  2. x86_64-msvc-1: 2h 4m -> 2h 47m (+33.9%)
  3. x86_64-gnu-gcc-core-tests: 12m 51s -> 8m 32s (-33.6%)
  4. x86_64-gnu-distcheck: 2h 20m -> 1h 47m (-23.3%)
  5. dist-armv7-linux: 1h 36m -> 1h 15m (-22.0%)
  6. dist-sparcv9-solaris: 1h 14m -> 1h 30m (+21.7%)
  7. x86_64-gnu-aux: 2h 53m -> 2h 16m (-21.6%)
  8. pr-check-1: 31m 43s -> 24m 57s (-21.3%)
  9. test-various: 2h 10m -> 1h 44m (-19.6%)
  10. aarch64-gnu-llvm-21-1: 1h 5m -> 56m 6s (-14.6%)
How to interpret the job duration changes?

Job durations can vary a lot, based on the actual runner instance
that executed the job, system noise, invalidated caches, etc. The table above is provided
mostly for t-infra members, for simpler debugging of potential CI slow-downs.

@rust-timer

Copy link
Copy Markdown
Collaborator

Finished benchmarking commit (d56483a): comparison URL.

Overall result: no relevant changes - no action needed

@rustbot label: -perf-regression

Instruction count

This perf run didn't have relevant results for this metric.

Max RSS (memory usage)

Results (secondary 3.8%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
3.8% [1.4%, 6.2%] 2
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) - - 0

Cycles

This perf run didn't have relevant results for this metric.

Binary size

Results (primary 0.0%, secondary 0.0%)

A less reliable metric. May be of interest, but not used to determine the overall result above.

mean range count
Regressions ❌
(primary)
0.0% [0.0%, 0.1%] 8
Regressions ❌
(secondary)
0.0% [0.0%, 0.1%] 3
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) 0.0% [0.0%, 0.1%] 8

Bootstrap: 523.273s -> 525.47s (0.42%)
Artifact size: 400.81 MiB -> 400.80 MiB (-0.00%)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributes Area: Attributes (`#[…]`, `#![…]`) disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. merged-by-bors This PR was explicitly merged by bors. T-types Relevant to the types team, which will review and decide on the PR/issue. to-announce Announce this issue on triage meeting

Projects

None yet