Skip to content

Use trait_object_dummy_self more & heavily fix+update related docs#153497

Open
fmease wants to merge 1 commit intorust-lang:mainfrom
fmease:trait-obj-dummy-self-improvs
Open

Use trait_object_dummy_self more & heavily fix+update related docs#153497
fmease wants to merge 1 commit intorust-lang:mainfrom
fmease:trait-obj-dummy-self-improvs

Conversation

@fmease
Copy link
Copy Markdown
Member

@fmease fmease commented Mar 6, 2026

  1. Use trait_object_dummy_self (Infer(FreshTy(0))) in more places
    • Two places used to construct this dummy self type manually (Ty::new_fresh(tcx, 0))
    • One used to use usize as a dummy self type!
  2. Really flesh out the docs of trait_object_dummy_self
  3. Rewrite severely outdated & wrong (doc) comments from scratch (some date back to 2018)
  4. Uncomment a debug assertion that was accidentally commented out in a refactoring PR back in 2018!

@rustbot rustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Mar 6, 2026

/// Infer predicates for the items in the crate.
///
/// `global_inferred_outlives`: this is initially the empty map that
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

(this parameter no longer exists, it's a local variable now)


/// Object types don't have a self type specified. Therefore, when
/// we convert the principal trait-ref into a normal trait-ref,
/// you must give *some* self type. A common choice is `mk_err()`
Copy link
Copy Markdown
Member Author

@fmease fmease Mar 6, 2026

Choose a reason for hiding this comment

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

A common choice is mk_err()

No longer up to date.

First of all, mk_err() no longer exists, it's Ty::new_error from middle which type IR shouldn't know about.

Second of all, we no longer use {type error} for that since that one carries an ErrorGuaranteed now, so it can no longer be used as a flexible dummy type. It's superseded by, you guessed it, trait_object_dummy_self (cc #70866, #71938).

///
/// Existential trait refs don't contain a self type, it's erased.
/// Therefore, you must specify *some* self type to perform the conversion.
/// A common choice is the trait object type itself or some kind of dummy type.
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

We're not mentioning trait_object_dummy_self from middle by name because type IR shouldn't know about it.

/// For example, the trait object type `Trait<'a, T, N>` can be understood as:
/// ```ignore (illustrative)
/// exists T. T: Trait<'a, 'b, X, Y>
/// exists<X> X: Trait<'a, T, N>
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Using a more Rust-like syntax instead of a Haskell-based one.

pub never: Ty<'tcx>,
pub self_param: Ty<'tcx>,

/// Dummy type used for the `Self` of a `TraitRef` created for converting
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Context: "converting" is old terminology for (HIR ty) lowering before the ASTconvHIR ty lowering renaming.

/// A common choice is the trait object type itself or some kind of dummy type.
pub fn with_self_ty(self, interner: I, self_ty: I::Ty) -> TraitRef<I> {
// otherwise the escaping vars would be captured by the binder
// debug_assert!(!self_ty.has_escaping_bound_vars());
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

This debug assert was accidentally commented out in a refactoring PR from 2018! See PR #53816, path src/librustc/ty/sty.rs.

for (outlives_predicate, &span) in explicit_predicates.as_ref().skip_binder() {
debug!("outlives_predicate = {outlives_predicate:?}");

// Careful: If we are inferring the effects of a `dyn Trait<..>`
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I've "moved" this lengthy explainer to the ty::Dynamic branch (or rather replaced it with a more concise & up to date one) because it is about trait object types specifically and therefore shouldn't belong in this general function!

Comment on lines -288 to -292
// Note that we do this check for self **before** applying `args`. In the
// case that `args` come from a `dyn Trait` type, our caller will have
// included `Self = usize` as the value for `Self`. If we were
// to apply the args, and not filter this predicate, we might then falsely
// conclude that e.g., `X: 'x` was a reasonable inferred requirement.
Copy link
Copy Markdown
Member Author

@fmease fmease Mar 6, 2026

Choose a reason for hiding this comment

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

The provided example ("we might then falsely conclude that e.g., X: 'x was a reasonable inferred requirement") doesn't make any sense whatsoever! That's because this comment wasn't properly updated over time:

Originally, it didn't say Self = usize but Self = dyn Trait<'x, X> which makes a whole lot more sense since back in ancient times, we did use the trait object type itself for the erased self type which was problematic and thus changed to usize (sic!).

So the problem this paragraph is trying to convey is:

  1. Given:
    1. struct Struct<'x, X>(Box<dyn Trait<'x, X>>);
    2. trait Trait<'a, T> where Self: 'a {}
  2. We'd convert existential trait ref Trait<'x, X> to normal trait ref <dyn Trait<'x, X> as Trait<'x, X>> (setting the self type to the trait object type itself)
  3. Extract its args, so [dyn Trait<'x, X>, 'x, X]
  4. Instantiate Self: 'a from the trait with these args to obtain dyn Trait<'x, X>: 'x
  5. We then split the trait object type into outlives-components, namely X: 'x (and 'x: 'x) which would be bad.

Therefore we filter out outlives-bounds mentioning Self before substitution/instantiation.

However, using the trait object type itself is still problematic since it can lead to escaping bound vars (issue #53419), therefore it was replaced with the dummy usize (PR #53441) but the comment wasn't updated (PR #56003 later updated it to Self = usize but didn't update the rest of the paragraph).

// predicates in `check_explicit_predicates` we
// need to ignore checking the explicit_map for
// Self type.
let args = ex_trait_ref.with_self_ty(tcx, tcx.types.usize).skip_binder().args;
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Instead of a dummy usize we now use the "canonical" trait_object_dummy_self which is way less janky.

Comment on lines +262 to +263
if let IgnorePredicatesReferencingSelf::Yes = ignore_preds_refing_self
&& arg.walk().any(|arg| arg == tcx.types.self_param.into())
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Note that this whole "filter out things before substitution/instantiation" topic is completely irrelevant now due to us using trait_object_dummy_self instead of usize. The former is guaranteed to never occur in the outlives-predicates (that's a guarantee by HIR ty lowering / HIR analysis's type collection). The latter, usize, can obviously occur in the predicates.

So theoretically I could just look for fn param ignored_self_ty (set to the dummy Self for branch ty::Dynamic) after instantiation if I so wanted to.

However, I feel like looking for self_param before instantiation plus just having a Boolean-like parameter is a lot cleaner.

@fmease fmease marked this pull request as ready for review March 6, 2026 15:28
@rustbot rustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Mar 6, 2026
@rustbot rustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Mar 6, 2026
@rustbot
Copy link
Copy Markdown
Collaborator

rustbot commented Mar 6, 2026

r? @dingxiangfei2009

rustbot has assigned @dingxiangfei2009.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

Why was this reviewer chosen?

The reviewer was selected based on:

  • Owners of files modified in this PR: compiler, types
  • compiler, types expanded to 69 candidates
  • Random selection from 15 candidates

@fmease fmease force-pushed the trait-obj-dummy-self-improvs branch 3 times, most recently from 03b5e8e to 4e7b116 Compare March 6, 2026 16:10
@rust-bors

This comment has been minimized.

@fmease fmease force-pushed the trait-obj-dummy-self-improvs branch from 4e7b116 to 8507598 Compare April 1, 2026 14:59
@rustbot
Copy link
Copy Markdown
Collaborator

rustbot commented Apr 1, 2026

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.

@rust-log-analyzer
Copy link
Copy Markdown
Collaborator

The job aarch64-gnu-llvm-21-1 failed! Check out the build log: (web) (plain enhanced) (plain)

Click to see the possible cause of the failure (guessed by this bot)
##[endgroup]
Executing "/scripts/stage_2_test_set1.sh"
+ /scripts/stage_2_test_set1.sh
+ '[' 1 == 1 ']'
+ echo 'PR_CI_JOB set; skipping tidy'
+ SKIP_TIDY='--skip tidy'
+ ../x.py --stage 2 test --skip tidy --skip compiler --skip src
PR_CI_JOB set; skipping tidy
##[group]Building bootstrap
    Finished `dev` profile [unoptimized] target(s) in 0.04s
##[endgroup]
---
[RUSTC-TIMING] build_script_build test:false 0.121
   Compiling crc32fast v1.5.0
[RUSTC-TIMING] build_script_build test:false 0.241

thread 'rustc' (16914) panicked at compiler/rustc_type_ir/src/predicate.rs:389:9:
assertion failed: !self_ty.has_escaping_bound_vars()
stack backtrace:
   0: __rustc::rust_begin_unwind
             at /rustc/ad726b5063362ec9897ef3d67452fc5606ee70fa/library/std/src/panicking.rs:689:5
   1: core::panicking::panic_fmt
             at /rustc/ad726b5063362ec9897ef3d67452fc5606ee70fa/library/core/src/panicking.rs:80:14
   2: core::panicking::panic
             at /rustc/ad726b5063362ec9897ef3d67452fc5606ee70fa/library/core/src/panicking.rs:150:5
   3: <rustc_type_ir::predicate::ExistentialTraitRef<rustc_middle::ty::context::TyCtxt>>::with_self_ty
   4: <rustc_trait_selection::traits::wf::WfPredicates as rustc_type_ir::visit::TypeVisitor<rustc_middle::ty::context::TyCtxt>>::visit_ty
   5: <rustc_trait_selection::traits::wf::WfPredicates as rustc_type_ir::visit::TypeVisitor<rustc_middle::ty::context::TyCtxt>>::visit_ty
   6: <rustc_middle::ty::Ty as rustc_type_ir::visit::TypeSuperVisitable<rustc_middle::ty::context::TyCtxt>>::super_visit_with::<rustc_trait_selection::traits::wf::WfPredicates>
   7: <rustc_trait_selection::traits::wf::WfPredicates as rustc_type_ir::visit::TypeVisitor<rustc_middle::ty::context::TyCtxt>>::visit_ty
   8: <rustc_trait_selection::traits::wf::WfPredicates as rustc_type_ir::visit::TypeVisitor<rustc_middle::ty::context::TyCtxt>>::visit_binder::<rustc_type_ir::predicate::ExistentialPredicate<rustc_middle::ty::context::TyCtxt>>
   9: <rustc_middle::ty::Ty as rustc_type_ir::visit::TypeSuperVisitable<rustc_middle::ty::context::TyCtxt>>::super_visit_with::<rustc_trait_selection::traits::wf::WfPredicates>
  10: <rustc_trait_selection::traits::wf::WfPredicates as rustc_type_ir::visit::TypeVisitor<rustc_middle::ty::context::TyCtxt>>::visit_ty
  11: <rustc_trait_selection::traits::wf::WfPredicates as rustc_type_ir::visit::TypeVisitor<rustc_middle::ty::context::TyCtxt>>::visit_ty
  12: <rustc_middle::ty::Ty as rustc_type_ir::visit::TypeSuperVisitable<rustc_middle::ty::context::TyCtxt>>::super_visit_with::<rustc_trait_selection::traits::wf::WfPredicates>
  13: <rustc_trait_selection::traits::wf::WfPredicates as rustc_type_ir::visit::TypeVisitor<rustc_middle::ty::context::TyCtxt>>::visit_ty
  14: <rustc_trait_selection::traits::wf::WfPredicates>::add_wf_preds_for_term
  15: rustc_trait_selection::traits::wf::obligations
  16: <rustc_trait_selection::traits::fulfill::FulfillProcessor as rustc_data_structures::obligation_forest::ObligationProcessor>::process_obligation
  17: <rustc_data_structures::obligation_forest::ObligationForest<rustc_trait_selection::traits::fulfill::PendingPredicateObligation>>::process_obligations::<rustc_trait_selection::traits::fulfill::FulfillProcessor>
  18: <rustc_trait_selection::traits::fulfill::FulfillmentContext<rustc_trait_selection::traits::FulfillmentError> as rustc_infer::traits::engine::TraitEngine<rustc_trait_selection::traits::FulfillmentError>>::try_evaluate_obligations
  19: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_argument_types
  20: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  21: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  22: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation
  23: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_return_or_body_tail
  24: rustc_hir_typeck::check::check_fn
  25: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_closure
  26: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  27: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  28: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation
  29: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  30: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  31: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation
  32: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_argument_types
  33: <rustc_hir_typeck::fn_ctxt::FnCtxt>::confirm_overloaded_call
  34: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  35: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  36: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation
  37: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_argument_types
  38: <rustc_hir_typeck::fn_ctxt::FnCtxt>::confirm_builtin_call
  39: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  40: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  41: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation
  42: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_has_type_or_error::<<rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_unsafe_binder_cast::{closure#2}>
  43: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  44: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  45: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation
  46: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_block
  47: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  48: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  49: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation
  50: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  51: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  52: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation
  53: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_block
  54: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  55: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  56: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation
  57: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_return_or_body_tail
  58: rustc_hir_typeck::check::check_fn
  59: rustc_hir_typeck::typeck_with_inspect
      [... omitted 2 frames ...]
  60: <rustc_middle::query::plumbing::TyCtxtEnsureOk>::typeck::<rustc_span::def_id::LocalDefId>
  61: <rustc_middle::ty::context::TyCtxt>::par_hir_body_owners::<rustc_hir_analysis::check_crate::{closure#1}>::{closure#0}
  62: rustc_data_structures::sync::parallel::par_for_each_in::<&rustc_span::def_id::LocalDefId, &[rustc_span::def_id::LocalDefId], <rustc_middle::ty::context::TyCtxt>::par_hir_body_owners<rustc_hir_analysis::check_crate::{closure#1}>::{closure#0}>
  63: rustc_hir_analysis::check_crate
  64: rustc_interface::passes::analysis
      [... omitted 2 frames ...]
  65: <std::thread::local::LocalKey<core::cell::Cell<*const ()>>>::with::<rustc_middle::ty::context::tls::enter_context<<rustc_middle::ty::context::GlobalCtxt>::enter<rustc_interface::passes::create_and_enter_global_ctxt<core::option::Option<rustc_interface::queries::Linker>, rustc_driver_impl::run_compiler::{closure#0}::{closure#2}>::{closure#2}, core::option::Option<rustc_interface::queries::Linker>>::{closure#1}, core::option::Option<rustc_interface::queries::Linker>>::{closure#0}, core::option::Option<rustc_interface::queries::Linker>>
  66: <rustc_middle::ty::context::TyCtxt>::create_global_ctxt::<core::option::Option<rustc_interface::queries::Linker>, rustc_interface::passes::create_and_enter_global_ctxt<core::option::Option<rustc_interface::queries::Linker>, rustc_driver_impl::run_compiler::{closure#0}::{closure#2}>::{closure#2}>
  67: rustc_interface::passes::create_and_enter_global_ctxt::<core::option::Option<rustc_interface::queries::Linker>, rustc_driver_impl::run_compiler::{closure#0}::{closure#2}>
  68: rustc_span::create_session_globals_then::<(), rustc_interface::util::run_in_thread_with_globals<rustc_interface::util::run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}::{closure#0}>
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

error: the compiler unexpectedly panicked. This is a bug
---
note: please attach the file at `/cargo/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.12.1/rustc-ice-2026-04-01T15_15_07-16912.txt` to your bug report

note: rustc 1.96.0-nightly (6a847688e 2026-04-01) running on aarch64-unknown-linux-gnu

note: compiler flags: --crate-type lib -C opt-level=3 -C embed-bitcode=no -C debug-assertions=on -C symbol-mangling-version=v0 -Z annotate-moves -Z randomize-layout -Z unstable-options -Z macro-backtrace -C split-debuginfo=off -C llvm-args=-import-instr-limit=10 -C link-args=-Wl,-z,origin -C link-args=-Wl,-rpath,$ORIGIN/../lib -Z on-broken-pipe=kill -Z binary-dep-depinfo -Z tls-model=initial-exec -Z force-unstable-if-unmarked

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
#0 [typeck_root] type-checking `format::<impl at /cargo/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.12.1/src/format.rs:50:1: 53:88>::fmt`
#1 [analysis] running analysis passes on crate `itertools`
end of query stack
[RUSTC-TIMING] self_cell test:false 0.087
[RUSTC-TIMING] intl_pluralrules test:false 1.228
   Compiling rustc_baked_icu_data v0.0.0 (/checkout/compiler/rustc_baked_icu_data)
[RUSTC-TIMING] rustc_baked_icu_data test:false 0.199
   Compiling ryu v1.0.20
[RUSTC-TIMING] itertools test:false 1.378
error: could not compile `itertools` (lib)

Caused by:
  process didn't exit successfully: `/checkout/obj/build/bootstrap/debug/rustc /checkout/obj/build/bootstrap/debug/rustc --crate-name itertools --edition=2018 /cargo/registry/src/index.crates.io-1949cf8c6b5b557f/itertools-0.12.1/src/lib.rs --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type lib --emit=dep-info,metadata,link -C opt-level=3 -C embed-bitcode=no -C debug-assertions=on --cfg 'feature="default"' --cfg 'feature="use_alloc"' --cfg 'feature="use_std"' --check-cfg 'cfg(docsrs,test)' --check-cfg 'cfg(feature, values("default", "use_alloc", "use_std"))' -C metadata=7c973608cb96fe07 -C extra-filename=-95a3e58b180ca134 --out-dir /checkout/obj/build/aarch64-unknown-linux-gnu/stage2-rustc/aarch64-unknown-linux-gnu/release/deps --target aarch64-unknown-linux-gnu -L dependency=/checkout/obj/build/aarch64-unknown-linux-gnu/stage2-rustc/aarch64-unknown-linux-gnu/release/deps -L dependency=/checkout/obj/build/aarch64-unknown-linux-gnu/stage2-rustc/release/deps --extern either=/checkout/obj/build/aarch64-unknown-linux-gnu/stage2-rustc/aarch64-unknown-linux-gnu/release/deps/libeither-9a5a1f2bfb7c116b.rmeta --cap-lints allow --cfg=windows_raw_dylib -Csymbol-mangling-version=v0 -Zannotate-moves -Zrandomize-layout -Zunstable-options '--check-cfg=cfg(bootstrap)' -Zmacro-backtrace -Csplit-debuginfo=off -Cllvm-args=-import-instr-limit=10 -Clink-args=-Wl,-z,origin '-Clink-args=-Wl,-rpath,$ORIGIN/../lib' -Zon-broken-pipe=kill -Z binary-dep-depinfo` (exit status: 101)
warning: build failed, waiting for other jobs to finish...
[RUSTC-TIMING] ryu test:false 0.391
[RUSTC-TIMING] fluent_bundle test:false 1.726
[RUSTC-TIMING] rustc_ast test:false 10.221
Bootstrap failed while executing `--stage 2 test --skip tidy --skip compiler --skip src`

@fmease
Copy link
Copy Markdown
Member Author

fmease commented Apr 1, 2026

Are you telling me that this assertion is now triggering after a rebase whereas a month ago CI passed despite having been commented out for 8 years (#153497 (comment))? Are you kidding me? :(

@ reviewer, feel free to ignore the failing assertion when reviewing my code (it's not relevant for the rest of this PR), I'll investigate it some other time because I don't have the energy right now. I also don't mind commenting it out again, adding a FIXME and opening an issue.

@rust-bors
Copy link
Copy Markdown
Contributor

rust-bors bot commented Apr 3, 2026

☔ The latest upstream changes (presumably #154727) made this pull request unmergeable. Please resolve the merge conflicts.

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

Labels

S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants