@@ -44,8 +44,9 @@ use rustc_middle::ty::{
44
44
} ;
45
45
use rustc_middle:: { bug, span_bug} ;
46
46
use rustc_session:: lint:: builtin:: AMBIGUOUS_ASSOCIATED_ITEMS ;
47
+ use rustc_session:: parse:: feature_err;
47
48
use rustc_span:: edit_distance:: find_best_match_for_name;
48
- use rustc_span:: { DUMMY_SP , Ident , Span , Symbol , kw} ;
49
+ use rustc_span:: { DUMMY_SP , Ident , Span , Symbol , kw, sym } ;
49
50
use rustc_trait_selection:: infer:: InferCtxtExt ;
50
51
use rustc_trait_selection:: traits:: wf:: object_region_bounds;
51
52
use rustc_trait_selection:: traits:: { self , ObligationCtxt } ;
@@ -1167,11 +1168,14 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
1167
1168
) ? {
1168
1169
LoweredAssoc :: Term ( def_id, args) => {
1169
1170
let assoc = tcx. associated_item ( def_id) ;
1170
- let ty = if matches ! ( assoc, ty:: AssocItem {
1171
- container: ty:: AssocItemContainer :: Impl ,
1172
- trait_item_def_id: None ,
1173
- ..
1174
- } ) {
1171
+ let ty = if matches ! (
1172
+ assoc,
1173
+ ty:: AssocItem {
1174
+ container: ty:: AssocItemContainer :: Impl ,
1175
+ trait_item_def_id: None ,
1176
+ ..
1177
+ }
1178
+ ) {
1175
1179
Ty :: new_alias ( tcx, ty:: Inherent , ty:: AliasTy :: new_from_args ( tcx, def_id, args) )
1176
1180
} else {
1177
1181
Ty :: new_projection_from_args ( tcx, def_id, args)
@@ -1472,14 +1476,29 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
1472
1476
) -> Result < Option < ( DefId , GenericArgsRef < ' tcx > ) > , ErrorGuaranteed > {
1473
1477
let tcx = self . tcx ( ) ;
1474
1478
1475
- // Don't attempt to look up inherent associated types when the feature is not enabled.
1476
- // Theoretically it'd be fine to do so since we feature-gate their definition site.
1477
- // However, due to current limitations of the implementation (caused by us performing
1478
- // selection during HIR ty lowering instead of in the trait solver), IATs can lead to cycle
1479
- // errors (#108491) which mask the feature-gate error, needlessly confusing users
1480
- // who use IATs by accident (#113265).
1481
- if kind == ty:: AssocKind :: Type && !tcx. features ( ) . inherent_associated_types ( ) {
1482
- return Ok ( None ) ;
1479
+ if !tcx. features ( ) . inherent_associated_types ( ) {
1480
+ match kind {
1481
+ // Don't attempt to look up inherent associated types when the feature is not enabled.
1482
+ // Theoretically it'd be fine to do so since we feature-gate their definition site.
1483
+ // However, due to current limitations of the implementation (caused by us performing
1484
+ // selection during HIR ty lowering instead of in the trait solver), IATs can lead to cycle
1485
+ // errors (#108491) which mask the feature-gate error, needlessly confusing users
1486
+ // who use IATs by accident (#113265).
1487
+ ty:: AssocKind :: Type => return Ok ( None ) ,
1488
+ ty:: AssocKind :: Const => {
1489
+ // We also gate the mgca codepath for type-level uses of inherent consts
1490
+ // with the inherent_associated_types feature gate since it relies on the
1491
+ // same machinery and has similar rough edges.
1492
+ return Err ( feature_err (
1493
+ & tcx. sess ,
1494
+ sym:: inherent_associated_types,
1495
+ span,
1496
+ "inherent associated types are unstable" ,
1497
+ )
1498
+ . emit ( ) ) ;
1499
+ }
1500
+ ty:: AssocKind :: Fn => unreachable ! ( ) ,
1501
+ }
1483
1502
}
1484
1503
1485
1504
let name = segment. ident ;
0 commit comments