Skip to content

Commit 386a7c7

Browse files
committed
Auto merge of rust-lang#133242 - lcnr:questionable-uwu, r=compiler-errors,BoxyUwU
finish `Reveal` removal After rust-lang#133212 changed the `TypingMode` to be the only source of truth, this entirely rips out `Reveal`. cc rust-lang#132279 r? `@compiler-errors`
2 parents 826b673 + 776731d commit 386a7c7

File tree

82 files changed

+346
-531
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+346
-531
lines changed

Diff for: compiler/rustc_codegen_cranelift/src/abi/mod.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ pub(crate) fn get_function_sig<'tcx>(
8080
clif_sig_from_fn_abi(
8181
tcx,
8282
default_call_conv,
83-
&RevealAllLayoutCx(tcx).fn_abi_of_instance(inst, ty::List::empty()),
83+
&FullyMonomorphizedLayoutCx(tcx).fn_abi_of_instance(inst, ty::List::empty()),
8484
)
8585
}
8686

@@ -438,9 +438,9 @@ pub(crate) fn codegen_terminator_call<'tcx>(
438438
extra_args.iter().map(|op_arg| fx.monomorphize(op_arg.node.ty(fx.mir, fx.tcx))),
439439
);
440440
let fn_abi = if let Some(instance) = instance {
441-
RevealAllLayoutCx(fx.tcx).fn_abi_of_instance(instance, extra_args)
441+
FullyMonomorphizedLayoutCx(fx.tcx).fn_abi_of_instance(instance, extra_args)
442442
} else {
443-
RevealAllLayoutCx(fx.tcx).fn_abi_of_fn_ptr(fn_sig, extra_args)
443+
FullyMonomorphizedLayoutCx(fx.tcx).fn_abi_of_fn_ptr(fn_sig, extra_args)
444444
};
445445

446446
let is_cold = if fn_sig.abi() == ExternAbi::RustCold {
@@ -721,8 +721,8 @@ pub(crate) fn codegen_drop<'tcx>(
721721
def: ty::InstanceKind::Virtual(drop_instance.def_id(), 0),
722722
args: drop_instance.args,
723723
};
724-
let fn_abi =
725-
RevealAllLayoutCx(fx.tcx).fn_abi_of_instance(virtual_drop, ty::List::empty());
724+
let fn_abi = FullyMonomorphizedLayoutCx(fx.tcx)
725+
.fn_abi_of_instance(virtual_drop, ty::List::empty());
726726

727727
let sig = clif_sig_from_fn_abi(fx.tcx, fx.target_config.default_call_conv, &fn_abi);
728728
let sig = fx.bcx.import_signature(sig);
@@ -764,8 +764,8 @@ pub(crate) fn codegen_drop<'tcx>(
764764
def: ty::InstanceKind::Virtual(drop_instance.def_id(), 0),
765765
args: drop_instance.args,
766766
};
767-
let fn_abi =
768-
RevealAllLayoutCx(fx.tcx).fn_abi_of_instance(virtual_drop, ty::List::empty());
767+
let fn_abi = FullyMonomorphizedLayoutCx(fx.tcx)
768+
.fn_abi_of_instance(virtual_drop, ty::List::empty());
769769

770770
let sig = clif_sig_from_fn_abi(fx.tcx, fx.target_config.default_call_conv, &fn_abi);
771771
let sig = fx.bcx.import_signature(sig);
@@ -774,8 +774,8 @@ pub(crate) fn codegen_drop<'tcx>(
774774
_ => {
775775
assert!(!matches!(drop_instance.def, InstanceKind::Virtual(_, _)));
776776

777-
let fn_abi =
778-
RevealAllLayoutCx(fx.tcx).fn_abi_of_instance(drop_instance, ty::List::empty());
777+
let fn_abi = FullyMonomorphizedLayoutCx(fx.tcx)
778+
.fn_abi_of_instance(drop_instance, ty::List::empty());
779779

780780
let arg_value = drop_place.place_ref(
781781
fx,

Diff for: compiler/rustc_codegen_cranelift/src/base.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ pub(crate) fn codegen_fn<'tcx>(
103103
let block_map: IndexVec<BasicBlock, Block> =
104104
(0..mir.basic_blocks.len()).map(|_| bcx.create_block()).collect();
105105

106-
let fn_abi = RevealAllLayoutCx(tcx).fn_abi_of_instance(instance, ty::List::empty());
106+
let fn_abi = FullyMonomorphizedLayoutCx(tcx).fn_abi_of_instance(instance, ty::List::empty());
107107

108108
// Make FunctionCx
109109
let target_config = module.target_config();

Diff for: compiler/rustc_codegen_cranelift/src/common.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ pub(crate) struct FunctionCx<'m, 'clif, 'tcx: 'm> {
311311
impl<'tcx> LayoutOfHelpers<'tcx> for FunctionCx<'_, '_, 'tcx> {
312312
#[inline]
313313
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
314-
RevealAllLayoutCx(self.tcx).handle_layout_err(err, span, ty)
314+
FullyMonomorphizedLayoutCx(self.tcx).handle_layout_err(err, span, ty)
315315
}
316316
}
317317

@@ -323,7 +323,7 @@ impl<'tcx> FnAbiOfHelpers<'tcx> for FunctionCx<'_, '_, 'tcx> {
323323
span: Span,
324324
fn_abi_request: FnAbiRequest<'tcx>,
325325
) -> ! {
326-
RevealAllLayoutCx(self.tcx).handle_fn_abi_err(err, span, fn_abi_request)
326+
FullyMonomorphizedLayoutCx(self.tcx).handle_fn_abi_err(err, span, fn_abi_request)
327327
}
328328
}
329329

@@ -443,9 +443,9 @@ impl<'tcx> FunctionCx<'_, '_, 'tcx> {
443443
}
444444
}
445445

446-
pub(crate) struct RevealAllLayoutCx<'tcx>(pub(crate) TyCtxt<'tcx>);
446+
pub(crate) struct FullyMonomorphizedLayoutCx<'tcx>(pub(crate) TyCtxt<'tcx>);
447447

448-
impl<'tcx> LayoutOfHelpers<'tcx> for RevealAllLayoutCx<'tcx> {
448+
impl<'tcx> LayoutOfHelpers<'tcx> for FullyMonomorphizedLayoutCx<'tcx> {
449449
#[inline]
450450
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
451451
if let LayoutError::SizeOverflow(_) | LayoutError::ReferencesError(_) = err {
@@ -459,7 +459,7 @@ impl<'tcx> LayoutOfHelpers<'tcx> for RevealAllLayoutCx<'tcx> {
459459
}
460460
}
461461

462-
impl<'tcx> FnAbiOfHelpers<'tcx> for RevealAllLayoutCx<'tcx> {
462+
impl<'tcx> FnAbiOfHelpers<'tcx> for FullyMonomorphizedLayoutCx<'tcx> {
463463
#[inline]
464464
fn handle_fn_abi_err(
465465
&self,
@@ -485,25 +485,25 @@ impl<'tcx> FnAbiOfHelpers<'tcx> for RevealAllLayoutCx<'tcx> {
485485
}
486486
}
487487

488-
impl<'tcx> layout::HasTyCtxt<'tcx> for RevealAllLayoutCx<'tcx> {
488+
impl<'tcx> layout::HasTyCtxt<'tcx> for FullyMonomorphizedLayoutCx<'tcx> {
489489
fn tcx<'b>(&'b self) -> TyCtxt<'tcx> {
490490
self.0
491491
}
492492
}
493493

494-
impl<'tcx> rustc_abi::HasDataLayout for RevealAllLayoutCx<'tcx> {
494+
impl<'tcx> rustc_abi::HasDataLayout for FullyMonomorphizedLayoutCx<'tcx> {
495495
fn data_layout(&self) -> &rustc_abi::TargetDataLayout {
496496
&self.0.data_layout
497497
}
498498
}
499499

500-
impl<'tcx> layout::HasTypingEnv<'tcx> for RevealAllLayoutCx<'tcx> {
500+
impl<'tcx> layout::HasTypingEnv<'tcx> for FullyMonomorphizedLayoutCx<'tcx> {
501501
fn typing_env(&self) -> ty::TypingEnv<'tcx> {
502502
ty::TypingEnv::fully_monomorphized()
503503
}
504504
}
505505

506-
impl<'tcx> HasTargetSpec for RevealAllLayoutCx<'tcx> {
506+
impl<'tcx> HasTargetSpec for FullyMonomorphizedLayoutCx<'tcx> {
507507
fn target_spec(&self) -> &Target {
508508
&self.0.sess.target
509509
}

Diff for: compiler/rustc_codegen_cranelift/src/debuginfo/types.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use rustc_data_structures::fx::FxHashMap;
66
use rustc_middle::ty::layout::LayoutOf;
77
use rustc_middle::ty::{self, Ty, TyCtxt};
88

9-
use crate::{DebugContext, RevealAllLayoutCx, has_ptr_meta};
9+
use crate::{DebugContext, FullyMonomorphizedLayoutCx, has_ptr_meta};
1010

1111
#[derive(Default)]
1212
pub(crate) struct TypeDebugContext<'tcx> {
@@ -85,7 +85,7 @@ impl DebugContext {
8585
type_entry.set(gimli::DW_AT_encoding, AttributeValue::Encoding(encoding));
8686
type_entry.set(
8787
gimli::DW_AT_byte_size,
88-
AttributeValue::Udata(RevealAllLayoutCx(tcx).layout_of(ty).size.bytes()),
88+
AttributeValue::Udata(FullyMonomorphizedLayoutCx(tcx).layout_of(ty).size.bytes()),
8989
);
9090

9191
type_id
@@ -159,7 +159,7 @@ impl DebugContext {
159159
return_if_type_created_in_meantime!(type_dbg, tuple_type);
160160

161161
let name = type_names::compute_debuginfo_type_name(tcx, tuple_type, false);
162-
let layout = RevealAllLayoutCx(tcx).layout_of(tuple_type);
162+
let layout = FullyMonomorphizedLayoutCx(tcx).layout_of(tuple_type);
163163

164164
let tuple_type_id =
165165
self.dwarf.unit.add(self.dwarf.unit.root(), gimli::DW_TAG_structure_type);
@@ -178,7 +178,9 @@ impl DebugContext {
178178
member_entry.set(gimli::DW_AT_type, AttributeValue::UnitRef(dw_ty));
179179
member_entry.set(
180180
gimli::DW_AT_alignment,
181-
AttributeValue::Udata(RevealAllLayoutCx(tcx).layout_of(ty).align.pref.bytes()),
181+
AttributeValue::Udata(
182+
FullyMonomorphizedLayoutCx(tcx).layout_of(ty).align.pref.bytes(),
183+
),
182184
);
183185
member_entry.set(
184186
gimli::DW_AT_data_member_location,
@@ -198,7 +200,11 @@ impl DebugContext {
198200
self.debug_type(
199201
tcx,
200202
type_dbg,
201-
Ty::new_array(tcx, tcx.types.u8, RevealAllLayoutCx(tcx).layout_of(ty).size.bytes()),
203+
Ty::new_array(
204+
tcx,
205+
tcx.types.u8,
206+
FullyMonomorphizedLayoutCx(tcx).layout_of(ty).size.bytes(),
207+
),
202208
)
203209
}
204210
}

Diff for: compiler/rustc_codegen_cranelift/src/global_asm.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub(crate) fn codegen_global_asm_item(tcx: TyCtxt<'_>, global_asm: &mut String,
4242
tcx,
4343
op_sp,
4444
const_value,
45-
RevealAllLayoutCx(tcx).layout_of(ty),
45+
FullyMonomorphizedLayoutCx(tcx).layout_of(ty),
4646
);
4747
global_asm.push_str(&string);
4848
}

Diff for: compiler/rustc_codegen_cranelift/src/inline_asm.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ pub(crate) fn codegen_naked_asm<'tcx>(
238238
tcx,
239239
span,
240240
const_value,
241-
RevealAllLayoutCx(tcx).layout_of(cv.ty()),
241+
FullyMonomorphizedLayoutCx(tcx).layout_of(cv.ty()),
242242
);
243243
CInlineAsmOperand::Const { value }
244244
}

Diff for: compiler/rustc_hir_analysis/src/check/compare_impl_item.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use rustc_trait_selection::infer::InferCtxtExt;
2626
use rustc_trait_selection::regions::InferCtxtRegionExt;
2727
use rustc_trait_selection::traits::outlives_bounds::InferCtxtExt as _;
2828
use rustc_trait_selection::traits::{
29-
self, FulfillmentError, ObligationCause, ObligationCauseCode, ObligationCtxt, Reveal,
29+
self, FulfillmentError, ObligationCause, ObligationCauseCode, ObligationCtxt,
3030
};
3131
use tracing::{debug, instrument};
3232

@@ -223,7 +223,7 @@ fn compare_method_predicate_entailment<'tcx>(
223223
}
224224

225225
let normalize_cause = traits::ObligationCause::misc(impl_m_span, impl_m_def_id);
226-
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds), Reveal::UserFacing);
226+
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds));
227227
let param_env = traits::normalize_param_env_or_error(tcx, param_env, normalize_cause);
228228
debug!(caller_bounds=?param_env.caller_bounds());
229229

@@ -508,7 +508,7 @@ pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
508508
.into_iter()
509509
.chain(tcx.predicates_of(trait_m.def_id).instantiate_own(tcx, trait_to_impl_args))
510510
.map(|(clause, _)| clause);
511-
let param_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(hybrid_preds), Reveal::UserFacing);
511+
let param_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(hybrid_preds));
512512
let param_env = traits::normalize_param_env_or_error(
513513
tcx,
514514
param_env,
@@ -1793,7 +1793,7 @@ fn compare_const_predicate_entailment<'tcx>(
17931793
.map(|(predicate, _)| predicate),
17941794
);
17951795

1796-
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds), Reveal::UserFacing);
1796+
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds));
17971797
let param_env = traits::normalize_param_env_or_error(
17981798
tcx,
17991799
param_env,
@@ -1946,7 +1946,7 @@ fn compare_type_predicate_entailment<'tcx>(
19461946
);
19471947
}
19481948

1949-
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds), Reveal::UserFacing);
1949+
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds));
19501950
let param_env = traits::normalize_param_env_or_error(tcx, param_env, normalize_cause);
19511951
debug!(caller_bounds=?param_env.caller_bounds());
19521952

@@ -2306,7 +2306,7 @@ fn param_env_with_gat_bounds<'tcx>(
23062306
};
23072307
}
23082308

2309-
ty::ParamEnv::new(tcx.mk_clauses(&predicates), Reveal::UserFacing)
2309+
ty::ParamEnv::new(tcx.mk_clauses(&predicates))
23102310
}
23112311

23122312
/// Manually check here that `async fn foo()` wasn't matched against `fn foo()`,

Diff for: compiler/rustc_hir_analysis/src/check/compare_impl_item/refine.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use rustc_infer::infer::TyCtxtInferExt;
66
use rustc_infer::infer::outlives::env::OutlivesEnvironment;
77
use rustc_lint_defs::builtin::{REFINING_IMPL_TRAIT_INTERNAL, REFINING_IMPL_TRAIT_REACHABLE};
88
use rustc_middle::span_bug;
9-
use rustc_middle::traits::{ObligationCause, Reveal};
9+
use rustc_middle::traits::ObligationCause;
1010
use rustc_middle::ty::{
1111
self, Ty, TyCtxt, TypeFoldable, TypeFolder, TypeSuperVisitable, TypeVisitable,
1212
TypeVisitableExt, TypeVisitor, TypingMode,
@@ -134,7 +134,7 @@ pub(super) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
134134
.into_iter()
135135
.chain(tcx.predicates_of(trait_m.def_id).instantiate_own(tcx, trait_m_to_impl_m_args))
136136
.map(|(clause, _)| clause);
137-
let param_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(hybrid_preds), Reveal::UserFacing);
137+
let param_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(hybrid_preds));
138138
let param_env = normalize_param_env_or_error(tcx, param_env, ObligationCause::dummy());
139139

140140
let ref infcx = tcx.infer_ctxt().build(TypingMode::non_body_analysis());

Diff for: compiler/rustc_hir_analysis/src/check/wfcheck.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -604,7 +604,7 @@ fn augment_param_env<'tcx>(
604604
);
605605
// FIXME(compiler-errors): Perhaps there is a case where we need to normalize this
606606
// i.e. traits::normalize_param_env_or_error
607-
ty::ParamEnv::new(bounds, param_env.reveal())
607+
ty::ParamEnv::new(bounds)
608608
}
609609

610610
/// We use the following trait as an example throughout this function.

Diff for: compiler/rustc_infer/src/infer/canonical/canonicalizer.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ impl<'tcx> InferCtxt<'tcx> {
7272
query_state,
7373
)
7474
.unchecked_map(|(param_env, value)| param_env.and(value));
75-
CanonicalQueryInput { canonical, typing_mode: self.typing_mode(param_env) }
75+
CanonicalQueryInput { canonical, typing_mode: self.typing_mode() }
7676
}
7777

7878
/// Canonicalizes a query *response* `V`. When we canonicalize a

Diff for: compiler/rustc_infer/src/infer/context.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,8 @@ impl<'tcx> rustc_type_ir::InferCtxtLike for InferCtxt<'tcx> {
2020
self.next_trait_solver
2121
}
2222

23-
fn typing_mode(
24-
&self,
25-
param_env_for_debug_assertion: ty::ParamEnv<'tcx>,
26-
) -> ty::TypingMode<'tcx> {
27-
self.typing_mode(param_env_for_debug_assertion)
23+
fn typing_mode(&self) -> ty::TypingMode<'tcx> {
24+
self.typing_mode()
2825
}
2926

3027
fn universe(&self) -> ty::UniverseIndex {

Diff for: compiler/rustc_infer/src/infer/mod.rs

+8-23
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ use rustc_middle::ty::{
4343
};
4444
use rustc_span::Span;
4545
use rustc_span::symbol::Symbol;
46-
use rustc_type_ir::solve::Reveal;
4746
use snapshot::undo_log::InferCtxtUndoLogs;
4847
use tracing::{debug, instrument};
4948
use type_variable::TypeVariableOrigin;
@@ -265,11 +264,12 @@ pub struct InferCtxt<'tcx> {
265264
lexical_region_resolutions: RefCell<Option<LexicalRegionResolutions<'tcx>>>,
266265

267266
/// Caches the results of trait selection. This cache is used
268-
/// for things that have to do with the parameters in scope.
269-
pub selection_cache: select::SelectionCache<'tcx>,
267+
/// for things that depends on inference variables or placeholders.
268+
pub selection_cache: select::SelectionCache<'tcx, ty::ParamEnv<'tcx>>,
270269

271-
/// Caches the results of trait evaluation.
272-
pub evaluation_cache: select::EvaluationCache<'tcx>,
270+
/// Caches the results of trait evaluation. This cache is used
271+
/// for things that depends on inference variables or placeholders.
272+
pub evaluation_cache: select::EvaluationCache<'tcx, ty::ParamEnv<'tcx>>,
273273

274274
/// The set of predicates on which errors have been reported, to
275275
/// avoid reporting the same error twice.
@@ -624,22 +624,7 @@ impl<'tcx> InferCtxt<'tcx> {
624624
}
625625

626626
#[inline(always)]
627-
pub fn typing_mode(
628-
&self,
629-
param_env_for_debug_assertion: ty::ParamEnv<'tcx>,
630-
) -> TypingMode<'tcx> {
631-
if cfg!(debug_assertions) {
632-
match (param_env_for_debug_assertion.reveal(), self.typing_mode) {
633-
(Reveal::All, TypingMode::PostAnalysis)
634-
| (Reveal::UserFacing, TypingMode::Coherence | TypingMode::Analysis { .. }) => {}
635-
(r, t) => unreachable!("TypingMode x Reveal mismatch: {r:?} {t:?}"),
636-
}
637-
}
638-
self.typing_mode
639-
}
640-
641-
#[inline(always)]
642-
pub fn typing_mode_unchecked(&self) -> TypingMode<'tcx> {
627+
pub fn typing_mode(&self) -> TypingMode<'tcx> {
643628
self.typing_mode
644629
}
645630

@@ -1005,7 +990,7 @@ impl<'tcx> InferCtxt<'tcx> {
1005990

1006991
#[inline(always)]
1007992
pub fn can_define_opaque_ty(&self, id: impl Into<DefId>) -> bool {
1008-
match self.typing_mode_unchecked() {
993+
match self.typing_mode() {
1009994
TypingMode::Analysis { defining_opaque_types } => {
1010995
id.into().as_local().is_some_and(|def_id| defining_opaque_types.contains(&def_id))
1011996
}
@@ -1290,7 +1275,7 @@ impl<'tcx> InferCtxt<'tcx> {
12901275
/// which contains the necessary information to use the trait system without
12911276
/// using canonicalization or carrying this inference context around.
12921277
pub fn typing_env(&self, param_env: ty::ParamEnv<'tcx>) -> ty::TypingEnv<'tcx> {
1293-
let typing_mode = match self.typing_mode(param_env) {
1278+
let typing_mode = match self.typing_mode() {
12941279
ty::TypingMode::Coherence => ty::TypingMode::Coherence,
12951280
// FIXME(#132279): This erases the `defining_opaque_types` as it isn't possible
12961281
// to handle them without proper canonicalization. This means we may cause cycle

Diff for: compiler/rustc_infer/src/infer/opaque_types/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ impl<'tcx> InferCtxt<'tcx> {
101101
let process = |a: Ty<'tcx>, b: Ty<'tcx>| match *a.kind() {
102102
ty::Alias(ty::Opaque, ty::AliasTy { def_id, args, .. }) if def_id.is_local() => {
103103
let def_id = def_id.expect_local();
104-
if let ty::TypingMode::Coherence = self.typing_mode(param_env) {
104+
if let ty::TypingMode::Coherence = self.typing_mode() {
105105
// See comment on `insert_hidden_type` for why this is sufficient in coherence
106106
return Some(self.register_hidden_type(
107107
OpaqueTypeKey { def_id, args },
@@ -522,7 +522,7 @@ impl<'tcx> InferCtxt<'tcx> {
522522
// value being folded. In simple cases like `-> impl Foo`,
523523
// these are the same span, but not in cases like `-> (impl
524524
// Foo, impl Bar)`.
525-
match self.typing_mode(param_env) {
525+
match self.typing_mode() {
526526
ty::TypingMode::Coherence => {
527527
// During intercrate we do not define opaque types but instead always
528528
// force ambiguity unless the hidden type is known to not implement

0 commit comments

Comments
 (0)