Skip to content

ICE+errors: associated_const_equality: normalize_erasing_regions.rs: Failed to normalize Alias(Projection, _) #141489

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
sigurd4 opened this issue May 24, 2025 · 4 comments
Labels
C-bug Category: This is a bug. E-needs-mcve Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable Example F-associated_const_equality `#![feature(associated_const_equality)]` F-generic_const_exprs `#![feature(generic_const_exprs)]` I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ P-low Low priority requires-incomplete-features This issue requires the use of incomplete features. requires-nightly This issue requires a nightly compiler in some way. S-has-bisection Status: A bisection has been found for this issue T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@sigurd4
Copy link

sigurd4 commented May 24, 2025

This is a regression that happened after updating the rust nightly toolchain today to version 3e674b0 2025-05-23. Suddenly, the compiler is not able to reason with associated const equality at all, and i get a rust-ICE that fails checking if an associated type is well formed.

Code

real_time_fir_iir_filters as of commit 687912d: sigurd4/real_time_fir_iir_filters@687912d

Meta

rustc --version --verbose:

rustc 1.89.0-nightly (3e674b06b 2025-05-23)
binary: rustc
commit-hash: 3e674b06b5c74adea662bd0b0b06450757994b16
commit-date: 2025-05-23
host: x86_64-unknown-linux-gnu
release: 1.89.0-nightly
LLVM version: 20.1.5

Error output

thread 'rustc' panicked at compiler/rustc_middle/src/ty/normalize_erasing_regions.rs:171:13:
Box<dyn Any>
stack backtrace:
   0:     0x705a98ad9ee5 - std::backtrace::Backtrace::create::hfa425f8c6118c291
   1:     0x705a96f58655 - std::backtrace::Backtrace::force_capture::hc89ba712c3edf9d4
   2:     0x705a95f9b841 - std[dddea0bc0c38a8db]::panicking::update_hook::<alloc[ad07e7cbb7f1de4e]::boxed::Box<rustc_driver_impl[40f87d5870cfacca]::install_ice_hook::{closure#1}>>::{closure#0}
   3:     0x705a96f72583 - std::panicking::rust_panic_with_hook::hedd3f60f85824998
   4:     0x705a95fd6f01 - std[dddea0bc0c38a8db]::panicking::begin_panic::<rustc_errors[ddb65c6d6f619c9c]::ExplicitBug>::{closure#0}
   5:     0x705a95fcaf36 - std[dddea0bc0c38a8db]::sys::backtrace::__rust_end_short_backtrace::<std[dddea0bc0c38a8db]::panicking::begin_panic<rustc_errors[ddb65c6d6f619c9c]::ExplicitBug>::{closure#0}, !>
   6:     0x705a95fcadbb - std[dddea0bc0c38a8db]::panicking::begin_panic::<rustc_errors[ddb65c6d6f619c9c]::ExplicitBug>
   7:     0x705a95fe1551 - <rustc_errors[ddb65c6d6f619c9c]::diagnostic::BugAbort as rustc_errors[ddb65c6d6f619c9c]::diagnostic::EmissionGuarantee>::emit_producing_guarantee
   8:     0x705a9664be9a - rustc_middle[39ac76d544e79577]::util::bug::opt_span_bug_fmt::<rustc_span[c5073483e6fe6d4e]::span_encoding::Span>::{closure#0}
   9:     0x705a9662627a - rustc_middle[39ac76d544e79577]::ty::context::tls::with_opt::<rustc_middle[39ac76d544e79577]::util::bug::opt_span_bug_fmt<rustc_span[c5073483e6fe6d4e]::span_encoding::Span>::{closure#0}, !>::{closure#0}
  10:     0x705a966260eb - rustc_middle[39ac76d544e79577]::ty::context::tls::with_context_opt::<rustc_middle[39ac76d544e79577]::ty::context::tls::with_opt<rustc_middle[39ac76d544e79577]::util::bug::opt_span_bug_fmt<rustc_span[c5073483e6fe6d4e]::span_encoding::Span>::{closure#0}, !>::{closure#0}, !>
  11:     0x705a9388aa70 - rustc_middle[39ac76d544e79577]::util::bug::bug_fmt
  12:     0x705a97e56e5a - <rustc_middle[39ac76d544e79577]::ty::normalize_erasing_regions::NormalizeAfterErasingRegionsFolder as rustc_type_ir[ad99d0ade262f0a7]::fold::TypeFolder<rustc_middle[39ac76d544e79577]::ty::context::TyCtxt>>::fold_ty
  13:     0x705a97ebc030 - rustc_ty_utils[8532ffd2d527787a]::instance::resolve_instance_raw
  14:     0x705a97ebb472 - rustc_query_impl[31296628a992b875]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[31296628a992b875]::query_impl::resolve_instance_raw::dynamic_query::{closure#2}::{closure#0}, rustc_middle[39ac76d544e79577]::query::erase::Erased<[u8; 32usize]>>
  15:     0x705a97ea566a - rustc_query_system[71c12886ffe7ba46]::query::plumbing::try_execute_query::<rustc_query_impl[31296628a992b875]::DynamicConfig<rustc_query_system[71c12886ffe7ba46]::query::caches::DefaultCache<rustc_middle[39ac76d544e79577]::ty::PseudoCanonicalInput<(rustc_span[c5073483e6fe6d4e]::def_id::DefId, &rustc_middle[39ac76d544e79577]::ty::list::RawList<(), rustc_middle[39ac76d544e79577]::ty::generic_args::GenericArg>)>, rustc_middle[39ac76d544e79577]::query::erase::Erased<[u8; 32usize]>>, false, false, false>, rustc_query_impl[31296628a992b875]::plumbing::QueryCtxt, true>
  16:     0x705a97ea4edb - rustc_query_impl[31296628a992b875]::query_impl::resolve_instance_raw::get_query_incr::__rust_end_short_backtrace
  17:     0x705a97681e64 - <rustc_middle[39ac76d544e79577]::ty::instance::Instance>::try_resolve
  18:     0x705a981c0c98 - <rustc_middle[39ac76d544e79577]::ty::context::TyCtxt>::const_eval_resolve_for_typeck
  19:     0x705a981c2301 - rustc_trait_selection[b780273fca010d7d]::traits::try_evaluate_const
  20:     0x705a97716983 - <rustc_trait_selection[b780273fca010d7d]::traits::select::SelectionContext>::evaluate_predicate_recursively
  21:     0x705a977159df - <rustc_trait_selection[b780273fca010d7d]::traits::select::SelectionContext>::evaluate_predicates_recursively::<thin_vec[6b3c3df00a28182b]::ThinVec<rustc_infer[b943a2e86216d821]::traits::Obligation<rustc_middle[39ac76d544e79577]::ty::predicate::Predicate>>>
  22:     0x705a97716020 - <rustc_trait_selection[b780273fca010d7d]::traits::select::SelectionContext>::evaluate_predicate_recursively
  23:     0x705a977159df - <rustc_trait_selection[b780273fca010d7d]::traits::select::SelectionContext>::evaluate_predicates_recursively::<thin_vec[6b3c3df00a28182b]::ThinVec<rustc_infer[b943a2e86216d821]::traits::Obligation<rustc_middle[39ac76d544e79577]::ty::predicate::Predicate>>>
  24:     0x705a97716783 - <rustc_trait_selection[b780273fca010d7d]::traits::select::SelectionContext>::evaluate_predicate_recursively
  25:     0x705a977159df - <rustc_trait_selection[b780273fca010d7d]::traits::select::SelectionContext>::evaluate_predicates_recursively::<thin_vec[6b3c3df00a28182b]::ThinVec<rustc_infer[b943a2e86216d821]::traits::Obligation<rustc_middle[39ac76d544e79577]::ty::predicate::Predicate>>>
  26:     0x705a97716020 - <rustc_trait_selection[b780273fca010d7d]::traits::select::SelectionContext>::evaluate_predicate_recursively
  27:     0x705a977159df - <rustc_trait_selection[b780273fca010d7d]::traits::select::SelectionContext>::evaluate_predicates_recursively::<thin_vec[6b3c3df00a28182b]::ThinVec<rustc_infer[b943a2e86216d821]::traits::Obligation<rustc_middle[39ac76d544e79577]::ty::predicate::Predicate>>>
  28:     0x705a97718a74 - <rustc_trait_selection[b780273fca010d7d]::traits::select::SelectionContext>::evaluate_candidate::{closure#0}::{closure#0}
  29:     0x705a984ea6e1 - <rustc_trait_selection[b780273fca010d7d]::traits::select::SelectionContext>::candidate_from_obligation::{closure#0}::{closure#0}
  30:     0x705a97fc9474 - <rustc_trait_selection[b780273fca010d7d]::traits::fulfill::FulfillProcessor as rustc_data_structures[7330a1b528a7fb9e]::obligation_forest::ObligationProcessor>::process_obligation
  31:     0x705a97606fd5 - <rustc_data_structures[7330a1b528a7fb9e]::obligation_forest::ObligationForest<rustc_trait_selection[b780273fca010d7d]::traits::fulfill::PendingPredicateObligation>>::process_obligations::<rustc_trait_selection[b780273fca010d7d]::traits::fulfill::FulfillProcessor>
  32:     0x705a97ce79ab - <rustc_trait_selection[b780273fca010d7d]::traits::fulfill::FulfillmentContext<rustc_trait_selection[b780273fca010d7d]::traits::FulfillmentError> as rustc_infer[b943a2e86216d821]::traits::engine::TraitEngine<rustc_trait_selection[b780273fca010d7d]::traits::FulfillmentError>>::select_all_or_error
  33:     0x705a97f15102 - rustc_hir_analysis[331e481bef3bedb8]::check::wfcheck::enter_wf_checking_ctxt::<rustc_hir_analysis[331e481bef3bedb8]::check::wfcheck::check_associated_item::{closure#0}>
  34:     0x705a97efad84 - rustc_hir_analysis[331e481bef3bedb8]::check::wfcheck::check_well_formed
  35:     0x705a97ef874b - rustc_query_impl[31296628a992b875]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[31296628a992b875]::query_impl::check_well_formed::dynamic_query::{closure#2}::{closure#0}, rustc_middle[39ac76d544e79577]::query::erase::Erased<[u8; 1usize]>>
  36:     0x705a9797756d - rustc_query_system[71c12886ffe7ba46]::query::plumbing::try_execute_query::<rustc_query_impl[31296628a992b875]::DynamicConfig<rustc_data_structures[7330a1b528a7fb9e]::vec_cache::VecCache<rustc_span[c5073483e6fe6d4e]::def_id::LocalDefId, rustc_middle[39ac76d544e79577]::query::erase::Erased<[u8; 1usize]>, rustc_query_system[71c12886ffe7ba46]::dep_graph::graph::DepNodeIndex>, false, false, false>, rustc_query_impl[31296628a992b875]::plumbing::QueryCtxt, true>
  37:     0x705a97976cfa - rustc_query_impl[31296628a992b875]::query_impl::check_well_formed::get_query_incr::__rust_end_short_backtrace
  38:     0x705a97ef53c2 - rustc_hir_analysis[331e481bef3bedb8]::check::wfcheck::check_mod_type_wf
  39:     0x705a97ef4e5f - rustc_query_impl[31296628a992b875]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[31296628a992b875]::query_impl::check_mod_type_wf::dynamic_query::{closure#2}::{closure#0}, rustc_middle[39ac76d544e79577]::query::erase::Erased<[u8; 1usize]>>
  40:     0x705a986802af - rustc_query_system[71c12886ffe7ba46]::query::plumbing::try_execute_query::<rustc_query_impl[31296628a992b875]::DynamicConfig<rustc_query_system[71c12886ffe7ba46]::query::caches::DefaultCache<rustc_span[c5073483e6fe6d4e]::def_id::LocalModDefId, rustc_middle[39ac76d544e79577]::query::erase::Erased<[u8; 1usize]>>, false, false, false>, rustc_query_impl[31296628a992b875]::plumbing::QueryCtxt, true>
  41:     0x705a98680d83 - rustc_query_impl[31296628a992b875]::query_impl::check_mod_type_wf::get_query_incr::__rust_end_short_backtrace
  42:     0x705a97809877 - rustc_hir_analysis[331e481bef3bedb8]::check_crate
  43:     0x705a9780ad45 - rustc_interface[3a0a2c43e50c5194]::passes::run_required_analyses
  44:     0x705a9852c19e - rustc_interface[3a0a2c43e50c5194]::passes::analysis
  45:     0x705a9852c175 - rustc_query_impl[31296628a992b875]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[31296628a992b875]::query_impl::analysis::dynamic_query::{closure#2}::{closure#0}, rustc_middle[39ac76d544e79577]::query::erase::Erased<[u8; 0usize]>>
  46:     0x705a988cf6c4 - rustc_query_system[71c12886ffe7ba46]::query::plumbing::try_execute_query::<rustc_query_impl[31296628a992b875]::DynamicConfig<rustc_query_system[71c12886ffe7ba46]::query::caches::SingleCache<rustc_middle[39ac76d544e79577]::query::erase::Erased<[u8; 0usize]>>, false, false, false>, rustc_query_impl[31296628a992b875]::plumbing::QueryCtxt, true>
  47:     0x705a988cefe8 - rustc_query_impl[31296628a992b875]::query_impl::analysis::get_query_incr::__rust_end_short_backtrace
  48:     0x705a9872ae87 - rustc_interface[3a0a2c43e50c5194]::passes::create_and_enter_global_ctxt::<core[a1eebbb7364c739]::option::Option<rustc_interface[3a0a2c43e50c5194]::queries::Linker>, rustc_driver_impl[40f87d5870cfacca]::run_compiler::{closure#0}::{closure#2}>::{closure#2}::{closure#0}
  49:     0x705a9871c60f - rustc_interface[3a0a2c43e50c5194]::interface::run_compiler::<(), rustc_driver_impl[40f87d5870cfacca]::run_compiler::{closure#0}>::{closure#1}
  50:     0x705a986c5706 - std[dddea0bc0c38a8db]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[3a0a2c43e50c5194]::util::run_in_thread_with_globals<rustc_interface[3a0a2c43e50c5194]::util::run_in_thread_pool_with_globals<rustc_interface[3a0a2c43e50c5194]::interface::run_compiler<(), rustc_driver_impl[40f87d5870cfacca]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
  51:     0x705a986c53ab - <<std[dddea0bc0c38a8db]::thread::Builder>::spawn_unchecked_<rustc_interface[3a0a2c43e50c5194]::util::run_in_thread_with_globals<rustc_interface[3a0a2c43e50c5194]::util::run_in_thread_pool_with_globals<rustc_interface[3a0a2c43e50c5194]::interface::run_compiler<(), rustc_driver_impl[40f87d5870cfacca]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core[a1eebbb7364c739]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  52:     0x705a986c66fd - std::sys::pal::unix::thread::Thread::new::thread_start::h337190b46df16ff4
  53:     0x705a924a57eb - <unknown>
  54:     0x705a9252918c - <unknown>
  55:                0x0 - <unknown>


rustc version: 1.89.0-nightly (3e674b06b 2025-05-23)
platform: x86_64-unknown-linux-gnu

query stack during panic:
#0 [resolve_instance_raw] resolving instance `<param::val::omega::Omega<f32> as param::base::chebyshev::ChebyshevFilterParamBase<<f32 as param::conf::elliptic::EllipticFilterConf>::Conf>>::TYPE`
#1 [check_well_formed] checking that `param::conf::elliptic::EllipticFilterConf::Conf` is well-formed
#2 [check_mod_type_wf] checking that types are well-formed in module `param::conf::elliptic`
#3 [analysis] running analysis passes on this crate
end of query stack
Backtrace

I can't compile, so i can't see any backtrace for my code.

@sigurd4 sigurd4 added I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. C-bug Category: This is a bug. labels May 24, 2025
@rustbot rustbot added the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label May 24, 2025
@fmease fmease added E-needs-mcve Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable Example F-associated_const_equality `#![feature(associated_const_equality)]` requires-nightly This issue requires a nightly compiler in some way. labels May 24, 2025
@fmease fmease changed the title Regression: Associated constants fail equality requirements + new ICE for is type well formed ICE: associated_const_equality: normalize_erasing_regions.rs: Failed to normalize Alias(Projection, _) May 24, 2025
@fmease fmease removed the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label May 24, 2025
@fmease fmease changed the title ICE: associated_const_equality: normalize_erasing_regions.rs: Failed to normalize Alias(Projection, _) ICE+errors: associated_const_equality: normalize_erasing_regions.rs: Failed to normalize Alias(Projection, _) May 24, 2025
@fmease fmease added the E-needs-bisection Call for participation: This issue needs bisection: https://github.com/rust-lang/cargo-bisect-rustc label May 24, 2025
@moxian

This comment has been minimized.

@rustbot rustbot added S-has-bisection Status: A bisection has been found for this issue and removed E-needs-bisection Call for participation: This issue needs bisection: https://github.com/rust-lang/cargo-bisect-rustc labels May 26, 2025
@moxian
Copy link
Contributor

moxian commented May 26, 2025

Actually, hold on, this is a completely different error.. So we went from compiling to an ICE to a different ICE in a matter of week.

The new errors are all seem to be error[E0308]: method not compatible with trait

example
error[E0308]: method not compatible with trait
   --> src\lib.rs:897:13
    |
897 |   ...   fn get_internals(&self) -> (&Internals<<P as real_time_fir_iir_filters::param::FilterParam>::F>, &real_time_fir_iir_filters::param::Param<P>)
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `$sos*($sos >= 1) as usize - ($sos >= 1) as usize`, found `$sos*($sos >= 1) as usize - ($sos >= 1) as usize`
    |
   ::: src\filters\iir\fourth\wah_filter.rs:4:1
    |
4   | / crate::def_rtf!(
5   | |     {
6   | |         /// # Configuration
7   | |         ///
...   |
68  | | );
    | |_- in this macro invocation
    |
    = note: expected constant `$sos*($sos >= 1) as usize - ($sos >= 1) as usize`
               found constant `$sos*($sos >= 1) as usize - ($sos >= 1) as usize`
    = note: this error originates in the macro `crate::def_rtf` (in Nightly builds, run with -Z macro-backtrace for more info)

Note that the minimization in the above comment is not for the ICE in the OP but rather for a different one. So we still need a new mcve.

@moxian
Copy link
Contributor

moxian commented May 27, 2025

reduced again, this time for the correct ICE..

#![feature(associated_const_equality)]
#![feature(generic_const_exprs)]
#![allow(incomplete_features)]

pub struct Omega<F, const ORDER: usize = 0> {
    pub omega: F,
}

pub trait ChebyshevFilterParamBase<C> {
    const TYPE: bool;
}

pub trait ButterworthFilterParam<C>: ChebyshevFilterParamBase<C, TYPE = false> {
    type Conf
    where
        [(); Self::ORDER]:;
}

impl<F, C, const ORDER: usize> ChebyshevFilterParamBase<C> for Omega<F, ORDER> {
    const TYPE: bool = false;
}

impl<F, C, const ORDER: usize> ButterworthFilterParam<C> for Omega<F, ORDER> {
    type Conf = C;
}

pub trait DynOrderButterworthFilterParam<C> {
    type Conf;
}

impl<P, C> DynOrderButterworthFilterParam<C> for P {
    type Conf = <Self as ButterworthFilterParam<C>>::Conf;
}

pub trait EllipticFilterConfFinal {}

impl<C> EllipticFilterConfFinal for C where Omega<()>: DynOrderButterworthFilterParam<C, Conf = C> {}

pub trait EllipticFilterConf {
    type Conf: EllipticFilterConfFinal;
}

@rustbot label: +F-generic_const_exprs +requires-incomplete-features

Late edit (and I sincerely apologize for the noise): Here's a more faithful reduction, that's error-minimized and successfully builds on older nightlies:

although it's a bit chunkier
#![feature(associated_const_equality)]
#![feature(generic_const_exprs)]

#![allow(incomplete_features)]


pub trait FilterParam {
    const ORDER: usize = 0;
    type F;
}

pub trait ChebyshevFilterParamBase<C>: FilterParam {
    const TYPE: bool;
}

pub trait ButterworthFilterParam<C>: ChebyshevFilterParamBase<C, TYPE = false>
{
    type Conf
    where
        [(); Self::ORDER]: ;
}

pub trait DynOrderButterworthFilterParam<C>
{
    type Conf;
}

impl<P, C> DynOrderButterworthFilterParam<C> for P
where
    P: ButterworthFilterParam<C>,
    [(); Self::ORDER]:  {
    type Conf = <Self as ButterworthFilterParam<C>>::Conf;
}

pub trait Conf: Sized { }

pub trait ButterworthFilterConf<const ORDER: usize>: Conf {
    type Conf: ;
    const OUTPUTS: usize;
}

impl<C, const OUTPUTS: usize> ButterworthFilterConf<0> for C
where
    C: EllipticFilterConf<OUTPUTS = {
        OUTPUTS
    }> {
    type Conf = <Self as EllipticFilterConf>::Conf;
    const OUTPUTS: usize = OUTPUTS;
}

pub trait EllipticFilterConf: Conf {
    type Conf: EllipticFilterConfFinal;
    const OUTPUTS: usize;
}

pub trait EllipticFilterConfFinal: EllipticFilterConf<Conf = Self> { }

impl<CC> EllipticFilterConfFinal for CC
where
    CC: EllipticFilterConf<Conf = CC>,
    Omega<f32>: DynOrderButterworthFilterParam<CC, Conf = CC> { }

pub struct Omega<F = f32, const ORDER: usize = 0> {
    pub omega: F,
}

impl<F> FilterParam for Omega<F, 0> {
    type F = F;
 }

impl<F, C> ChebyshevFilterParamBase<C> for Omega<F, 0> {
    const TYPE: bool = false;
}

impl<F, C> ButterworthFilterParam<C> for Omega<F, 0>
where
    C: ButterworthFilterConf<{
        Self::ORDER
    }> {
    type Conf = C;
}

@rustbot
Copy link
Collaborator

rustbot commented May 27, 2025

Unknown labels: regression-from-nightly-to-nightly

@rustbot rustbot added F-generic_const_exprs `#![feature(generic_const_exprs)]` requires-incomplete-features This issue requires the use of incomplete features. labels May 27, 2025
@fmease fmease added the P-low Low priority label Jun 3, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: This is a bug. E-needs-mcve Call for participation: This issue has a repro, but needs a Minimal Complete and Verifiable Example F-associated_const_equality `#![feature(associated_const_equality)]` F-generic_const_exprs `#![feature(generic_const_exprs)]` I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ P-low Low priority requires-incomplete-features This issue requires the use of incomplete features. requires-nightly This issue requires a nightly compiler in some way. S-has-bisection Status: A bisection has been found for this issue T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

4 participants