mirror of https://github.com/rust-lang/rust.git
Mark all extraneous generic args as errors
This commit is contained in:
parent
2e3842b6d0
commit
adb2ac0165
|
@ -442,6 +442,25 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||||
) -> ty::GenericArg<'tcx> {
|
) -> ty::GenericArg<'tcx> {
|
||||||
let tcx = self.lowerer.tcx();
|
let tcx = self.lowerer.tcx();
|
||||||
|
|
||||||
|
if let Err(incorrect) = self.incorrect_args {
|
||||||
|
if incorrect.invalid_args.contains(&(param.index as usize)) {
|
||||||
|
return match param.kind {
|
||||||
|
GenericParamDefKind::Lifetime => {
|
||||||
|
ty::Region::new_error(tcx, incorrect.reported).into()
|
||||||
|
}
|
||||||
|
GenericParamDefKind::Type { .. } => {
|
||||||
|
Ty::new_error(tcx, incorrect.reported).into()
|
||||||
|
}
|
||||||
|
GenericParamDefKind::Const { .. } => ty::Const::new_error(
|
||||||
|
tcx,
|
||||||
|
incorrect.reported,
|
||||||
|
Ty::new_error(tcx, incorrect.reported),
|
||||||
|
)
|
||||||
|
.into(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let mut handle_ty_args = |has_default, ty: &hir::Ty<'tcx>| {
|
let mut handle_ty_args = |has_default, ty: &hir::Ty<'tcx>| {
|
||||||
if has_default {
|
if has_default {
|
||||||
tcx.check_optional_stability(
|
tcx.check_optional_stability(
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
//@ known-bug: #121134
|
|
||||||
trait Output<'a> {
|
|
||||||
type Type;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Wrapper;
|
|
||||||
|
|
||||||
impl Wrapper {
|
|
||||||
fn do_something_wrapper<O, F>(&mut self, do_something_wrapper: F)
|
|
||||||
where
|
|
||||||
FnOnce:,
|
|
||||||
F: for<'a> FnOnce(<F as Output<i32, _>>::Type),
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let mut wrapper = Wrapper;
|
|
||||||
wrapper.do_something_wrapper::<i32, _>(|value| ());
|
|
||||||
}
|
|
|
@ -14,14 +14,12 @@ impl<T, S> Trait<T> for i32 {
|
||||||
// Should not not trigger suggestion here...
|
// Should not not trigger suggestion here...
|
||||||
impl<T, S> Trait<T, S> for () {}
|
impl<T, S> Trait<T, S> for () {}
|
||||||
//~^ ERROR trait takes 1 generic argument but 2 generic arguments were supplied
|
//~^ ERROR trait takes 1 generic argument but 2 generic arguments were supplied
|
||||||
//~| ERROR `S` is not constrained
|
|
||||||
|
|
||||||
//... but should do so in all of the below cases except the last one
|
//... but should do so in all of the below cases except the last one
|
||||||
fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), i32> {
|
fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), i32> {
|
||||||
//~^ ERROR trait takes 1 generic argument but 2 generic arguments were supplied
|
//~^ ERROR trait takes 1 generic argument but 2 generic arguments were supplied
|
||||||
//~| ERROR trait takes 1 generic argument but 2 generic arguments were supplied
|
//~| ERROR trait takes 1 generic argument but 2 generic arguments were supplied
|
||||||
//~| ERROR trait takes 1 generic argument but 2 generic arguments were supplied
|
//~| ERROR trait takes 1 generic argument but 2 generic arguments were supplied
|
||||||
//~| ERROR type annotations needed
|
|
||||||
3
|
3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,14 +16,8 @@ note: trait defined here, with 1 generic parameter: `T`
|
||||||
LL | pub trait Trait<T> {
|
LL | pub trait Trait<T> {
|
||||||
| ^^^^^ -
|
| ^^^^^ -
|
||||||
|
|
||||||
error[E0207]: the type parameter `S` is not constrained by the impl trait, self type, or predicates
|
|
||||||
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:15:9
|
|
||||||
|
|
|
||||||
LL | impl<T, S> Trait<T, S> for () {}
|
|
||||||
| ^ unconstrained type parameter
|
|
||||||
|
|
||||||
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
||||||
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:20:12
|
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:19:12
|
||||||
|
|
|
|
||||||
LL | fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), i32> {
|
LL | fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), i32> {
|
||||||
| ^^^^^ expected 1 generic argument
|
| ^^^^^ expected 1 generic argument
|
||||||
|
@ -39,7 +33,7 @@ LL | fn func<T: Trait<u32, Assoc = String>>(t: T) -> impl Trait<(), i32> {
|
||||||
| +++++++
|
| +++++++
|
||||||
|
|
||||||
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
||||||
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:20:46
|
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:19:46
|
||||||
|
|
|
|
||||||
LL | fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), i32> {
|
LL | fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), i32> {
|
||||||
| ^^^^^ expected 1 generic argument
|
| ^^^^^ expected 1 generic argument
|
||||||
|
@ -55,7 +49,7 @@ LL | fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), Assoc = i32> {
|
||||||
| +++++++
|
| +++++++
|
||||||
|
|
||||||
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
||||||
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:20:46
|
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:19:46
|
||||||
|
|
|
|
||||||
LL | fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), i32> {
|
LL | fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), i32> {
|
||||||
| ^^^^^ expected 1 generic argument
|
| ^^^^^ expected 1 generic argument
|
||||||
|
@ -71,14 +65,8 @@ help: replace the generic bound with the associated type
|
||||||
LL | fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), Assoc = i32> {
|
LL | fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), Assoc = i32> {
|
||||||
| +++++++
|
| +++++++
|
||||||
|
|
||||||
error[E0282]: type annotations needed
|
|
||||||
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:20:41
|
|
||||||
|
|
|
||||||
LL | fn func<T: Trait<u32, String>>(t: T) -> impl Trait<(), i32> {
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^ cannot infer type
|
|
||||||
|
|
||||||
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
||||||
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:28:18
|
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:26:18
|
||||||
|
|
|
|
||||||
LL | struct Struct<T: Trait<u32, String>> {
|
LL | struct Struct<T: Trait<u32, String>> {
|
||||||
| ^^^^^ expected 1 generic argument
|
| ^^^^^ expected 1 generic argument
|
||||||
|
@ -94,7 +82,7 @@ LL | struct Struct<T: Trait<u32, Assoc = String>> {
|
||||||
| +++++++
|
| +++++++
|
||||||
|
|
||||||
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
||||||
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:33:23
|
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:31:23
|
||||||
|
|
|
|
||||||
LL | trait AnotherTrait<T: Trait<T, i32>> {}
|
LL | trait AnotherTrait<T: Trait<T, i32>> {}
|
||||||
| ^^^^^ expected 1 generic argument
|
| ^^^^^ expected 1 generic argument
|
||||||
|
@ -110,7 +98,7 @@ LL | trait AnotherTrait<T: Trait<T, Assoc = i32>> {}
|
||||||
| +++++++
|
| +++++++
|
||||||
|
|
||||||
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
error[E0107]: trait takes 1 generic argument but 2 generic arguments were supplied
|
||||||
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:36:9
|
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:34:9
|
||||||
|
|
|
|
||||||
LL | impl<T: Trait<u32, String>> Struct<T> {}
|
LL | impl<T: Trait<u32, String>> Struct<T> {}
|
||||||
| ^^^^^ expected 1 generic argument
|
| ^^^^^ expected 1 generic argument
|
||||||
|
@ -126,7 +114,7 @@ LL | impl<T: Trait<u32, Assoc = String>> Struct<T> {}
|
||||||
| +++++++
|
| +++++++
|
||||||
|
|
||||||
error[E0107]: struct takes 1 generic argument but 2 generic arguments were supplied
|
error[E0107]: struct takes 1 generic argument but 2 generic arguments were supplied
|
||||||
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:42:58
|
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:40:58
|
||||||
|
|
|
|
||||||
LL | impl<T: Trait<u32, Assoc=String>, U> YetAnotherTrait for Struct<T, U> {}
|
LL | impl<T: Trait<u32, Assoc=String>, U> YetAnotherTrait for Struct<T, U> {}
|
||||||
| ^^^^^^ - help: remove this generic argument
|
| ^^^^^^ - help: remove this generic argument
|
||||||
|
@ -134,12 +122,12 @@ LL | impl<T: Trait<u32, Assoc=String>, U> YetAnotherTrait for Struct<T, U> {}
|
||||||
| expected 1 generic argument
|
| expected 1 generic argument
|
||||||
|
|
|
|
||||||
note: struct defined here, with 1 generic parameter: `T`
|
note: struct defined here, with 1 generic parameter: `T`
|
||||||
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:28:8
|
--> $DIR/116464-invalid-assoc-type-suggestion-in-trait-impl.rs:26:8
|
||||||
|
|
|
|
||||||
LL | struct Struct<T: Trait<u32, String>> {
|
LL | struct Struct<T: Trait<u32, String>> {
|
||||||
| ^^^^^^ -
|
| ^^^^^^ -
|
||||||
|
|
||||||
error: aborting due to 11 previous errors
|
error: aborting due to 9 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0107, E0207, E0282.
|
Some errors have detailed explanations: E0107, E0207.
|
||||||
For more information about an error, try `rustc --explain E0107`.
|
For more information about an error, try `rustc --explain E0107`.
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
//! This test used to ICE: #121134
|
||||||
|
//! The issue is that we're trying to prove a projection, but there's
|
||||||
|
//! no bound for the projection's trait, and the projection has the wrong
|
||||||
|
//! kind of generic parameter (lifetime vs type).
|
||||||
|
//! When actually calling the function with those broken bounds, trying to
|
||||||
|
//! instantiate the bounds with inference vars would ICE.
|
||||||
|
#![feature(unboxed_closures)]
|
||||||
|
|
||||||
|
trait Output<'a> {
|
||||||
|
type Type;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Wrapper;
|
||||||
|
|
||||||
|
impl Wrapper {
|
||||||
|
fn do_something_wrapper<O, F>(&mut self, _: F)
|
||||||
|
where
|
||||||
|
F: for<'a> FnOnce(<F as Output<i32>>::Type),
|
||||||
|
//~^ ERROR: trait takes 0 generic arguments but 1 generic argument was supplied
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut wrapper = Wrapper;
|
||||||
|
wrapper.do_something_wrapper(|value| ());
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
error[E0107]: trait takes 0 generic arguments but 1 generic argument was supplied
|
||||||
|
--> $DIR/generic_param_mismatch_in_unsatisfied_projection.rs:18:33
|
||||||
|
|
|
||||||
|
LL | F: for<'a> FnOnce(<F as Output<i32>>::Type),
|
||||||
|
| ^^^^^^ expected 0 generic arguments
|
||||||
|
|
|
||||||
|
note: trait defined here, with 0 generic parameters
|
||||||
|
--> $DIR/generic_param_mismatch_in_unsatisfied_projection.rs:9:7
|
||||||
|
|
|
||||||
|
LL | trait Output<'a> {
|
||||||
|
| ^^^^^^
|
||||||
|
help: replace the generic bound with the associated type
|
||||||
|
|
|
||||||
|
LL | F: for<'a> FnOnce(<F as Output<Type = i32>>::Type),
|
||||||
|
| ++++++
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0107`.
|
|
@ -15,7 +15,6 @@ mod assert {
|
||||||
>()
|
>()
|
||||||
where
|
where
|
||||||
Dst: BikeshedIntrinsicFrom< //~ ERROR trait takes at most 2 generic arguments but 5 generic arguments were supplied
|
Dst: BikeshedIntrinsicFrom< //~ ERROR trait takes at most 2 generic arguments but 5 generic arguments were supplied
|
||||||
//~^ ERROR: the constant `ASSUME_ALIGNMENT` is not of type `Assume`
|
|
||||||
Src,
|
Src,
|
||||||
ASSUME_ALIGNMENT, //~ ERROR: mismatched types
|
ASSUME_ALIGNMENT, //~ ERROR: mismatched types
|
||||||
ASSUME_LIFETIMES,
|
ASSUME_LIFETIMES,
|
||||||
|
|
|
@ -9,29 +9,13 @@ LL | | ASSUME_VALIDITY,
|
||||||
LL | | ASSUME_VISIBILITY,
|
LL | | ASSUME_VISIBILITY,
|
||||||
| |_____________________________- help: remove these generic arguments
|
| |_____________________________- help: remove these generic arguments
|
||||||
|
|
||||||
error: the constant `ASSUME_ALIGNMENT` is not of type `Assume`
|
|
||||||
--> $DIR/issue-101739-2.rs:17:14
|
|
||||||
|
|
|
||||||
LL | Dst: BikeshedIntrinsicFrom<
|
|
||||||
| ______________^
|
|
||||||
LL | |
|
|
||||||
LL | | Src,
|
|
||||||
LL | | ASSUME_ALIGNMENT,
|
|
||||||
... |
|
|
||||||
LL | | ASSUME_VISIBILITY,
|
|
||||||
LL | | >,
|
|
||||||
| |_________^ expected `Assume`, found `bool`
|
|
||||||
|
|
|
||||||
note: required by a bound in `BikeshedIntrinsicFrom`
|
|
||||||
--> $SRC_DIR/core/src/mem/transmutability.rs:LL:COL
|
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/issue-101739-2.rs:20:13
|
--> $DIR/issue-101739-2.rs:19:13
|
||||||
|
|
|
|
||||||
LL | ASSUME_ALIGNMENT,
|
LL | ASSUME_ALIGNMENT,
|
||||||
| ^^^^^^^^^^^^^^^^ expected `Assume`, found `bool`
|
| ^^^^^^^^^^^^^^^^ expected `Assume`, found `bool`
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0107, E0308.
|
Some errors have detailed explanations: E0107, E0308.
|
||||||
For more information about an error, try `rustc --explain E0107`.
|
For more information about an error, try `rustc --explain E0107`.
|
||||||
|
|
Loading…
Reference in New Issue