Deny associated type bindings within associated type bindings
This commit is contained in:
parent
57ee5cf5a9
commit
ca2e0bb51a
9 changed files with 82 additions and 5 deletions
|
@ -595,7 +595,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
"create_substs_for_associated_item(span: {:?}, item_def_id: {:?}, item_segment: {:?}",
|
"create_substs_for_associated_item(span: {:?}, item_def_id: {:?}, item_segment: {:?}",
|
||||||
span, item_def_id, item_segment
|
span, item_def_id, item_segment
|
||||||
);
|
);
|
||||||
self.create_substs_for_ast_path(
|
let (args, _) = self.create_substs_for_ast_path(
|
||||||
span,
|
span,
|
||||||
item_def_id,
|
item_def_id,
|
||||||
parent_substs,
|
parent_substs,
|
||||||
|
@ -603,8 +603,14 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||||
item_segment.args(),
|
item_segment.args(),
|
||||||
item_segment.infer_args,
|
item_segment.infer_args,
|
||||||
None,
|
None,
|
||||||
)
|
);
|
||||||
.0
|
|
||||||
|
let assoc_bindings = self.create_assoc_bindings_for_generic_args(item_segment.args());
|
||||||
|
if let Some(b) = assoc_bindings.first() {
|
||||||
|
Self::prohibit_assoc_ty_binding(self.tcx(), b.span);
|
||||||
|
}
|
||||||
|
|
||||||
|
args
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Instantiates the path for the given trait reference, assuming that it's
|
/// Instantiates the path for the given trait reference, assuming that it's
|
||||||
|
|
12
src/test/ui/associated-consts/issue-102335-const.rs
Normal file
12
src/test/ui/associated-consts/issue-102335-const.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#![feature(associated_const_equality)]
|
||||||
|
|
||||||
|
trait T {
|
||||||
|
type A: S<C<X = 0i32> = 34>;
|
||||||
|
//~^ ERROR associated type bindings are not allowed here
|
||||||
|
}
|
||||||
|
|
||||||
|
trait S {
|
||||||
|
const C: i32;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
9
src/test/ui/associated-consts/issue-102335-const.stderr
Normal file
9
src/test/ui/associated-consts/issue-102335-const.stderr
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0229]: associated type bindings are not allowed here
|
||||||
|
--> $DIR/issue-102335-const.rs:4:17
|
||||||
|
|
|
||||||
|
LL | type A: S<C<X = 0i32> = 34>;
|
||||||
|
| ^^^^^^^^ associated type not allowed here
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0229`.
|
12
src/test/ui/associated-type-bounds/issue-102335-ty.rs
Normal file
12
src/test/ui/associated-type-bounds/issue-102335-ty.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
trait T {
|
||||||
|
type A: S<C<i32 = u32> = ()>;
|
||||||
|
//~^ ERROR associated type bindings are not allowed here
|
||||||
|
}
|
||||||
|
|
||||||
|
trait Q {}
|
||||||
|
|
||||||
|
trait S {
|
||||||
|
type C: Q;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0229]: associated type bindings are not allowed here
|
||||||
|
--> $DIR/issue-102335-ty.rs:2:17
|
||||||
|
|
|
||||||
|
LL | type A: S<C<i32 = u32> = ()>;
|
||||||
|
| ^^^^^^^^^ associated type not allowed here
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0229`.
|
12
src/test/ui/generic-associated-types/issue-102335-gat.rs
Normal file
12
src/test/ui/generic-associated-types/issue-102335-gat.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
trait T {
|
||||||
|
type A: S<C<(), i32 = ()> = ()>;
|
||||||
|
//~^ ERROR associated type bindings are not allowed here
|
||||||
|
}
|
||||||
|
|
||||||
|
trait Q {}
|
||||||
|
|
||||||
|
trait S {
|
||||||
|
type C<T>: Q;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0229]: associated type bindings are not allowed here
|
||||||
|
--> $DIR/issue-102335-gat.rs:2:21
|
||||||
|
|
|
||||||
|
LL | type A: S<C<(), i32 = ()> = ()>;
|
||||||
|
| ^^^^^^^^ associated type not allowed here
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0229`.
|
|
@ -2,6 +2,7 @@ use std::ops::Deref;
|
||||||
trait Foo {
|
trait Foo {
|
||||||
type Bar<'a>: Deref<Target = <Self>::Bar<Target = Self>>;
|
type Bar<'a>: Deref<Target = <Self>::Bar<Target = Self>>;
|
||||||
//~^ ERROR this associated type takes 1 lifetime argument but 0 lifetime arguments were supplied
|
//~^ ERROR this associated type takes 1 lifetime argument but 0 lifetime arguments were supplied
|
||||||
|
//~| ERROR associated type bindings are not allowed here
|
||||||
//~| HELP add missing
|
//~| HELP add missing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,13 @@ help: add missing lifetime argument
|
||||||
LL | type Bar<'a>: Deref<Target = <Self>::Bar<'a, Target = Self>>;
|
LL | type Bar<'a>: Deref<Target = <Self>::Bar<'a, Target = Self>>;
|
||||||
| +++
|
| +++
|
||||||
|
|
||||||
error: aborting due to previous error
|
error[E0229]: associated type bindings are not allowed here
|
||||||
|
--> $DIR/issue-85347.rs:3:46
|
||||||
|
|
|
||||||
|
LL | type Bar<'a>: Deref<Target = <Self>::Bar<Target = Self>>;
|
||||||
|
| ^^^^^^^^^^^^^ associated type not allowed here
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0107`.
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0107, E0229.
|
||||||
|
For more information about an error, try `rustc --explain E0107`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue