@@ -900,96 +900,50 @@ fn assemble_candidates_from_impls<'cx, 'gcx, 'tcx>(
900
900
// In either case, we handle this by not adding a
901
901
// candidate for an impl if it contains a `default`
902
902
// type.
903
- let opt_node_item = assoc_ty_def ( selcx,
904
- impl_data. impl_def_id ,
905
- obligation. predicate . item_name ) ;
906
- let new_candidate = if let Some ( node_item) = opt_node_item {
907
- let is_default = if node_item. node . is_from_trait ( ) {
908
- // If true, the impl inherited a `type Foo = Bar`
909
- // given in the trait, which is implicitly default.
910
- // Otherwise, the impl did not specify `type` and
911
- // neither did the trait:
912
- //
913
- // ```rust
914
- // trait Foo { type T; }
915
- // impl Foo for Bar { }
916
- // ```
917
- //
918
- // This is an error, but it will be
919
- // reported in `check_impl_items_against_trait`.
920
- // We accept it here but will flag it as
921
- // an error when we confirm the candidate
922
- // (which will ultimately lead to `normalize_to_error`
923
- // being invoked).
924
- node_item. item . defaultness . has_value ( )
925
- } else {
926
- node_item. item . defaultness . is_default ( ) ||
927
- selcx. tcx ( ) . impl_is_default ( node_item. node . def_id ( ) )
928
- } ;
929
-
930
- // Only reveal a specializable default if we're past type-checking
931
- // and the obligations is monomorphic, otherwise passes such as
932
- // transmute checking and polymorphic MIR optimizations could
933
- // get a result which isn't correct for all monomorphizations.
934
- if !is_default {
903
+ let node_item = assoc_ty_def ( selcx,
904
+ impl_data. impl_def_id ,
905
+ obligation. predicate . item_name ) ;
906
+
907
+ let is_default = if node_item. node . is_from_trait ( ) {
908
+ // If true, the impl inherited a `type Foo = Bar`
909
+ // given in the trait, which is implicitly default.
910
+ // Otherwise, the impl did not specify `type` and
911
+ // neither did the trait:
912
+ //
913
+ // ```rust
914
+ // trait Foo { type T; }
915
+ // impl Foo for Bar { }
916
+ // ```
917
+ //
918
+ // This is an error, but it will be
919
+ // reported in `check_impl_items_against_trait`.
920
+ // We accept it here but will flag it as
921
+ // an error when we confirm the candidate
922
+ // (which will ultimately lead to `normalize_to_error`
923
+ // being invoked).
924
+ node_item. item . defaultness . has_value ( )
925
+ } else {
926
+ node_item. item . defaultness . is_default ( ) ||
927
+ selcx. tcx ( ) . impl_is_default ( node_item. node . def_id ( ) )
928
+ } ;
929
+
930
+ // Only reveal a specializable default if we're past type-checking
931
+ // and the obligations is monomorphic, otherwise passes such as
932
+ // transmute checking and polymorphic MIR optimizations could
933
+ // get a result which isn't correct for all monomorphizations.
934
+ let new_candidate = if !is_default {
935
+ Some ( ProjectionTyCandidate :: Select )
936
+ } else if selcx. projection_mode ( ) == Reveal :: All {
937
+ assert ! ( !poly_trait_ref. needs_infer( ) ) ;
938
+ if !poly_trait_ref. needs_subst ( ) {
935
939
Some ( ProjectionTyCandidate :: Select )
936
- } else if selcx. projection_mode ( ) == Reveal :: All {
937
- assert ! ( !poly_trait_ref. needs_infer( ) ) ;
938
- if !poly_trait_ref. needs_subst ( ) {
939
- Some ( ProjectionTyCandidate :: Select )
940
- } else {
941
- None
942
- }
943
940
} else {
944
941
None
945
942
}
946
943
} else {
947
- // This is saying that neither the trait nor
948
- // the impl contain a definition for this
949
- // associated type. Normally this situation
950
- // could only arise through a compiler bug --
951
- // if the user wrote a bad item name, it
952
- // should have failed in astconv. **However**,
953
- // at coherence-checking time, we only look at
954
- // the topmost impl (we don't even consider
955
- // the trait itself) for the definition -- and
956
- // so in that case it may be that the trait
957
- // *DOES* have a declaration, but we don't see
958
- // it, and we end up in this branch.
959
- //
960
- // This is kind of tricky to handle actually.
961
- // For now, we just unconditionally ICE,
962
- // because otherwise, examples like the
963
- // following will succeed:
964
- //
965
- // ```
966
- // trait Assoc {
967
- // type Output;
968
- // }
969
- //
970
- // impl<T> Assoc for T {
971
- // default type Output = bool;
972
- // }
973
- //
974
- // impl Assoc for u8 {}
975
- // impl Assoc for u16 {}
976
- //
977
- // trait Foo {}
978
- // impl Foo for <u8 as Assoc>::Output {}
979
- // impl Foo for <u16 as Assoc>::Output {}
980
- // return None;
981
- // }
982
- // ```
983
- //
984
- // The essential problem here is that the
985
- // projection fails, leaving two unnormalized
986
- // types, which appear not to unify -- so the
987
- // overlap check succeeds, when it should
988
- // fail.
989
- span_bug ! ( obligation. cause. span,
990
- "Tried to project an inherited associated type during \
991
- coherence checking, which is currently not supported.") ;
944
+ None
992
945
} ;
946
+
993
947
candidate_set. vec . extend ( new_candidate) ;
994
948
}
995
949
super :: VtableParam ( ..) => {
@@ -1274,35 +1228,25 @@ fn confirm_impl_candidate<'cx, 'gcx, 'tcx>(
1274
1228
let VtableImplData { substs, nested, impl_def_id } = impl_vtable;
1275
1229
1276
1230
let tcx = selcx. tcx ( ) ;
1277
- let trait_ref = obligation. predicate . trait_ref ;
1278
1231
let assoc_ty = assoc_ty_def ( selcx, impl_def_id, obligation. predicate . item_name ) ;
1279
1232
1280
- match assoc_ty {
1281
- Some ( node_item) => {
1282
- let ty = if !node_item. item . defaultness . has_value ( ) {
1283
- // This means that the impl is missing a definition for the
1284
- // associated type. This error will be reported by the type
1285
- // checker method `check_impl_items_against_trait`, so here we
1286
- // just return TyError.
1287
- debug ! ( "confirm_impl_candidate: no associated type {:?} for {:?}" ,
1288
- node_item. item. name,
1289
- obligation. predicate. trait_ref) ;
1290
- tcx. types . err
1291
- } else {
1292
- tcx. type_of ( node_item. item . def_id )
1293
- } ;
1294
- let substs = translate_substs ( selcx. infcx ( ) , impl_def_id, substs, node_item. node ) ;
1295
- Progress {
1296
- ty : ty. subst ( tcx, substs) ,
1297
- obligations : nested,
1298
- cacheable : true
1299
- }
1300
- }
1301
- None => {
1302
- span_bug ! ( obligation. cause. span,
1303
- "No associated type for {:?}" ,
1304
- trait_ref) ;
1305
- }
1233
+ let ty = if !assoc_ty. item . defaultness . has_value ( ) {
1234
+ // This means that the impl is missing a definition for the
1235
+ // associated type. This error will be reported by the type
1236
+ // checker method `check_impl_items_against_trait`, so here we
1237
+ // just return TyError.
1238
+ debug ! ( "confirm_impl_candidate: no associated type {:?} for {:?}" ,
1239
+ assoc_ty. item. name,
1240
+ obligation. predicate. trait_ref) ;
1241
+ tcx. types . err
1242
+ } else {
1243
+ tcx. type_of ( assoc_ty. item . def_id )
1244
+ } ;
1245
+ let substs = translate_substs ( selcx. infcx ( ) , impl_def_id, substs, assoc_ty. node ) ;
1246
+ Progress {
1247
+ ty : ty. subst ( tcx, substs) ,
1248
+ obligations : nested,
1249
+ cacheable : true
1306
1250
}
1307
1251
}
1308
1252
@@ -1315,7 +1259,7 @@ fn assoc_ty_def<'cx, 'gcx, 'tcx>(
1315
1259
selcx : & SelectionContext < ' cx , ' gcx , ' tcx > ,
1316
1260
impl_def_id : DefId ,
1317
1261
assoc_ty_name : ast:: Name )
1318
- -> Option < specialization_graph:: NodeItem < ty:: AssociatedItem > >
1262
+ -> specialization_graph:: NodeItem < ty:: AssociatedItem >
1319
1263
{
1320
1264
let tcx = selcx. tcx ( ) ;
1321
1265
let trait_def_id = tcx. impl_trait_ref ( impl_def_id) . unwrap ( ) . def_id ;
@@ -1330,17 +1274,29 @@ fn assoc_ty_def<'cx, 'gcx, 'tcx>(
1330
1274
let impl_node = specialization_graph:: Node :: Impl ( impl_def_id) ;
1331
1275
for item in impl_node. items ( tcx) {
1332
1276
if item. kind == ty:: AssociatedKind :: Type && item. name == assoc_ty_name {
1333
- return Some ( specialization_graph:: NodeItem {
1277
+ return specialization_graph:: NodeItem {
1334
1278
node : specialization_graph:: Node :: Impl ( impl_def_id) ,
1335
1279
item : item,
1336
- } ) ;
1280
+ } ;
1337
1281
}
1338
1282
}
1339
1283
1340
- trait_def
1284
+ if let Some ( assoc_item ) = trait_def
1341
1285
. ancestors ( tcx, impl_def_id)
1342
1286
. defs ( tcx, assoc_ty_name, ty:: AssociatedKind :: Type )
1343
- . next ( )
1287
+ . next ( ) {
1288
+ assoc_item
1289
+ } else {
1290
+ // This is saying that neither the trait nor
1291
+ // the impl contain a definition for this
1292
+ // associated type. Normally this situation
1293
+ // could only arise through a compiler bug --
1294
+ // if the user wrote a bad item name, it
1295
+ // should have failed in astconv.
1296
+ bug ! ( "No associated type `{}` for {}" ,
1297
+ assoc_ty_name,
1298
+ tcx. item_path_str( impl_def_id) )
1299
+ }
1344
1300
}
1345
1301
1346
1302
// # Cache
0 commit comments