Skip to content

Commit 2ed1aca

Browse files
committed
Only check existential types, not the desugared impl Trait
1 parent 3e215a3 commit 2ed1aca

File tree

1 file changed

+58
-50
lines changed

1 file changed

+58
-50
lines changed

src/librustc_typeck/check/wfcheck.rs

Lines changed: 58 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -549,57 +549,65 @@ fn check_existential_types<'a, 'fcx, 'gcx, 'tcx>(
549549
fldop: |ty| {
550550
if let ty::TyAnon(def_id, substs) = ty.sty {
551551
trace!("check_existential_types: anon_ty, {:?}, {:?}", def_id, substs);
552-
let anon_node_id = tcx.hir.as_local_node_id(def_id).unwrap();
553-
if may_define_existential_type(tcx, fn_def_id, anon_node_id) {
554-
let generics = tcx.generics_of(def_id);
555-
trace!("check_existential_types may define. Generics: {:#?}", generics);
556-
for (subst, param) in substs.iter().zip(&generics.params) {
557-
if let ty::subst::UnpackedKind::Type(ty) = subst.unpack() {
558-
match ty.sty {
559-
ty::TyParam(..) => {},
560-
// prevent `fn foo() -> Foo<u32>` from being defining
561-
_ => {
562-
tcx
563-
.sess
564-
.struct_span_err(
565-
span,
566-
"non-defining existential type use in defining scope",
567-
)
568-
.span_note(
569-
tcx.def_span(param.def_id),
570-
&format!(
571-
"used non-generic type {} for generic parameter",
572-
ty,
573-
),
574-
)
575-
.emit();
576-
return tcx.types.err;
577-
},
578-
} // match ty
579-
} // if let Type = subst
580-
} // for (subst, param)
581-
} // if may_define_existential_type
582-
583-
// now register the bounds on the parameters of the existential type
584-
// so the parameters given by the function need to fulfil them
585-
// ```rust
586-
// existential type Foo<T: Bar>: 'static;
587-
// fn foo<U>() -> Foo<U> { .. *}
588-
// ```
589-
// becomes
590-
// ```rust
591-
// existential type Foo<T: Bar>: 'static;
592-
// fn foo<U: Bar>() -> Foo<U> { .. *}
593-
// ```
594-
let predicates = tcx.predicates_of(def_id);
595-
trace!("check_existential_types may define. adding predicates: {:#?}", predicates);
596-
for &pred in predicates.predicates.iter() {
597-
let substituted_pred = pred.subst(fcx.tcx, substs);
598-
// Avoid duplication of predicates that contain no parameters, for example.
599-
if !predicates.predicates.contains(&substituted_pred) {
600-
substituted_predicates.push(substituted_pred);
552+
let generics = tcx.generics_of(def_id);
553+
// only check named existential types
554+
if generics.parent.is_none() {
555+
let anon_node_id = tcx.hir.as_local_node_id(def_id).unwrap();
556+
if may_define_existential_type(tcx, fn_def_id, anon_node_id) {
557+
trace!("check_existential_types may define. Generics: {:#?}", generics);
558+
for (subst, param) in substs.iter().zip(&generics.params) {
559+
if let ty::subst::UnpackedKind::Type(ty) = subst.unpack() {
560+
match ty.sty {
561+
ty::TyParam(..) => {},
562+
// prevent `fn foo() -> Foo<u32>` from being defining
563+
_ => {
564+
tcx
565+
.sess
566+
.struct_span_err(
567+
span,
568+
"non-defining existential type use \
569+
in defining scope",
570+
)
571+
.span_note(
572+
tcx.def_span(param.def_id),
573+
&format!(
574+
"used non-generic type {} for \
575+
generic parameter",
576+
ty,
577+
),
578+
)
579+
.emit();
580+
return tcx.types.err;
581+
},
582+
} // match ty
583+
} // if let Type = subst
584+
} // for (subst, param)
585+
} // if may_define_existential_type
586+
587+
// now register the bounds on the parameters of the existential type
588+
// so the parameters given by the function need to fulfil them
589+
// ```rust
590+
// existential type Foo<T: Bar>: 'static;
591+
// fn foo<U>() -> Foo<U> { .. *}
592+
// ```
593+
// becomes
594+
// ```rust
595+
// existential type Foo<T: Bar>: 'static;
596+
// fn foo<U: Bar>() -> Foo<U> { .. *}
597+
// ```
598+
let predicates = tcx.predicates_of(def_id);
599+
trace!(
600+
"check_existential_types may define. adding predicates: {:#?}",
601+
predicates,
602+
);
603+
for &pred in predicates.predicates.iter() {
604+
let substituted_pred = pred.subst(fcx.tcx, substs);
605+
// Avoid duplication of predicates that contain no parameters, for example.
606+
if !predicates.predicates.contains(&substituted_pred) {
607+
substituted_predicates.push(substituted_pred);
608+
}
601609
}
602-
}
610+
} // if is_named_existential_type
603611
} // if let TyAnon
604612
ty
605613
},

0 commit comments

Comments
 (0)