Rollup merge of #99890 - compiler-errors:issue-99828, r=lcnr
Do not allow bad projection term to leak into the type checker Fixes #99828
This commit is contained in:
commit
686cb110a7
5 changed files with 55 additions and 10 deletions
|
@ -1234,7 +1234,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
}
|
}
|
||||||
|
|
||||||
match binding.kind {
|
match binding.kind {
|
||||||
ConvertedBindingKind::Equality(term) => {
|
ConvertedBindingKind::Equality(mut term) => {
|
||||||
// "Desugar" a constraint like `T: Iterator<Item = u32>` this to
|
// "Desugar" a constraint like `T: Iterator<Item = u32>` this to
|
||||||
// the "projection predicate" for:
|
// the "projection predicate" for:
|
||||||
//
|
//
|
||||||
|
@ -1245,18 +1245,28 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
(hir::def::DefKind::AssocTy, ty::Term::Ty(_))
|
(hir::def::DefKind::AssocTy, ty::Term::Ty(_))
|
||||||
| (hir::def::DefKind::AssocConst, ty::Term::Const(_)) => (),
|
| (hir::def::DefKind::AssocConst, ty::Term::Const(_)) => (),
|
||||||
(_, _) => {
|
(_, _) => {
|
||||||
let got = if let ty::Term::Ty(_) = term { "type" } else { "const" };
|
let got = if let ty::Term::Ty(_) = term { "type" } else { "constant" };
|
||||||
let expected = def_kind.descr(assoc_item_def_id);
|
let expected = def_kind.descr(assoc_item_def_id);
|
||||||
tcx.sess
|
tcx.sess
|
||||||
.struct_span_err(
|
.struct_span_err(
|
||||||
binding.span,
|
binding.span,
|
||||||
&format!("mismatch in bind of {expected}, got {got}"),
|
&format!("expected {expected} bound, found {got}"),
|
||||||
)
|
)
|
||||||
.span_note(
|
.span_note(
|
||||||
tcx.def_span(assoc_item_def_id),
|
tcx.def_span(assoc_item_def_id),
|
||||||
&format!("{expected} defined here does not match {got}"),
|
&format!("{expected} defined here"),
|
||||||
)
|
)
|
||||||
.emit();
|
.emit();
|
||||||
|
term = match def_kind {
|
||||||
|
hir::def::DefKind::AssocTy => tcx.ty_error().into(),
|
||||||
|
hir::def::DefKind::AssocConst => tcx
|
||||||
|
.const_error(
|
||||||
|
tcx.bound_type_of(assoc_item_def_id)
|
||||||
|
.subst(tcx, projection_ty.skip_binder().substs),
|
||||||
|
)
|
||||||
|
.into(),
|
||||||
|
_ => unreachable!(),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bounds.projection_bounds.push((
|
bounds.projection_bounds.push((
|
||||||
|
|
|
@ -21,9 +21,9 @@ impl FooTy for Bar {
|
||||||
|
|
||||||
|
|
||||||
fn foo<F: Foo<N=usize>>() {}
|
fn foo<F: Foo<N=usize>>() {}
|
||||||
//~^ ERROR mismatch in
|
//~^ ERROR expected associated constant bound, found type
|
||||||
fn foo2<F: FooTy<T=3usize>>() {}
|
fn foo2<F: FooTy<T=3usize>>() {}
|
||||||
//~^ ERROR mismatch in
|
//~^ ERROR expected associated type bound, found constant
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
foo::<Bar>();
|
foo::<Bar>();
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
error: mismatch in bind of associated constant, got type
|
error: expected associated constant bound, found type
|
||||||
--> $DIR/assoc-const-ty-mismatch.rs:23:15
|
--> $DIR/assoc-const-ty-mismatch.rs:23:15
|
||||||
|
|
|
|
||||||
LL | fn foo<F: Foo<N=usize>>() {}
|
LL | fn foo<F: Foo<N=usize>>() {}
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
|
|
|
||||||
note: associated constant defined here does not match type
|
note: associated constant defined here
|
||||||
--> $DIR/assoc-const-ty-mismatch.rs:5:3
|
--> $DIR/assoc-const-ty-mismatch.rs:5:3
|
||||||
|
|
|
|
||||||
LL | const N: usize;
|
LL | const N: usize;
|
||||||
| ^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: mismatch in bind of associated type, got const
|
error: expected associated type bound, found constant
|
||||||
--> $DIR/assoc-const-ty-mismatch.rs:25:18
|
--> $DIR/assoc-const-ty-mismatch.rs:25:18
|
||||||
|
|
|
|
||||||
LL | fn foo2<F: FooTy<T=3usize>>() {}
|
LL | fn foo2<F: FooTy<T=3usize>>() {}
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
|
|
|
|
||||||
note: associated type defined here does not match const
|
note: associated type defined here
|
||||||
--> $DIR/assoc-const-ty-mismatch.rs:9:3
|
--> $DIR/assoc-const-ty-mismatch.rs:9:3
|
||||||
|
|
|
|
||||||
LL | type T;
|
LL | type T;
|
||||||
|
|
11
src/test/ui/associated-type-bounds/issue-99828.rs
Normal file
11
src/test/ui/associated-type-bounds/issue-99828.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
fn get_iter(vec: &[i32]) -> impl Iterator<Item = {}> + '_ {
|
||||||
|
//~^ ERROR expected associated type bound, found constant
|
||||||
|
//~| ERROR associated const equality is incomplete
|
||||||
|
vec.iter()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let vec = Vec::new();
|
||||||
|
let mut iter = get_iter(&vec);
|
||||||
|
iter.next();
|
||||||
|
}
|
24
src/test/ui/associated-type-bounds/issue-99828.stderr
Normal file
24
src/test/ui/associated-type-bounds/issue-99828.stderr
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
error[E0658]: associated const equality is incomplete
|
||||||
|
--> $DIR/issue-99828.rs:1:43
|
||||||
|
|
|
||||||
|
LL | fn get_iter(vec: &[i32]) -> impl Iterator<Item = {}> + '_ {
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #92827 <https://github.com/rust-lang/rust/issues/92827> for more information
|
||||||
|
= help: add `#![feature(associated_const_equality)]` to the crate attributes to enable
|
||||||
|
|
||||||
|
error: expected associated type bound, found constant
|
||||||
|
--> $DIR/issue-99828.rs:1:43
|
||||||
|
|
|
||||||
|
LL | fn get_iter(vec: &[i32]) -> impl Iterator<Item = {}> + '_ {
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
note: associated type defined here
|
||||||
|
--> $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL
|
||||||
|
|
|
||||||
|
LL | type Item;
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0658`.
|
Loading…
Add table
Reference in a new issue