Actually do validation for poly trait refs with ? modifier
This commit is contained in:
parent
759e07f063
commit
e356279bdf
@ -168,12 +168,6 @@ pub(crate) fn lower_bounds<'hir, I: IntoIterator<Item = &'hir hir::GenericBound<
|
|||||||
match hir_bound {
|
match hir_bound {
|
||||||
hir::GenericBound::Trait(poly_trait_ref) => {
|
hir::GenericBound::Trait(poly_trait_ref) => {
|
||||||
let hir::TraitBoundModifiers { constness, polarity } = poly_trait_ref.modifiers;
|
let hir::TraitBoundModifiers { constness, polarity } = poly_trait_ref.modifiers;
|
||||||
let polarity = match polarity {
|
|
||||||
rustc_ast::BoundPolarity::Positive => ty::PredicatePolarity::Positive,
|
|
||||||
rustc_ast::BoundPolarity::Negative(_) => ty::PredicatePolarity::Negative,
|
|
||||||
rustc_ast::BoundPolarity::Maybe(_) => continue,
|
|
||||||
};
|
|
||||||
|
|
||||||
let _ = self.lower_poly_trait_ref(
|
let _ = self.lower_poly_trait_ref(
|
||||||
&poly_trait_ref.trait_ref,
|
&poly_trait_ref.trait_ref,
|
||||||
poly_trait_ref.span,
|
poly_trait_ref.span,
|
||||||
|
@ -51,7 +51,7 @@ pub(super) fn lower_trait_object_ty(
|
|||||||
&trait_bound.trait_ref,
|
&trait_bound.trait_ref,
|
||||||
trait_bound.span,
|
trait_bound.span,
|
||||||
hir::BoundConstness::Never,
|
hir::BoundConstness::Never,
|
||||||
ty::PredicatePolarity::Positive,
|
hir::BoundPolarity::Positive,
|
||||||
dummy_self,
|
dummy_self,
|
||||||
&mut bounds,
|
&mut bounds,
|
||||||
PredicateFilter::SelfOnly,
|
PredicateFilter::SelfOnly,
|
||||||
|
@ -659,7 +659,7 @@ pub(crate) fn lower_poly_trait_ref(
|
|||||||
trait_ref: &hir::TraitRef<'tcx>,
|
trait_ref: &hir::TraitRef<'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
constness: hir::BoundConstness,
|
constness: hir::BoundConstness,
|
||||||
polarity: ty::PredicatePolarity,
|
polarity: hir::BoundPolarity,
|
||||||
self_ty: Ty<'tcx>,
|
self_ty: Ty<'tcx>,
|
||||||
bounds: &mut Bounds<'tcx>,
|
bounds: &mut Bounds<'tcx>,
|
||||||
predicate_filter: PredicateFilter,
|
predicate_filter: PredicateFilter,
|
||||||
@ -681,6 +681,15 @@ pub(crate) fn lower_poly_trait_ref(
|
|||||||
Some(self_ty),
|
Some(self_ty),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let polarity = match polarity {
|
||||||
|
rustc_ast::BoundPolarity::Positive => ty::PredicatePolarity::Positive,
|
||||||
|
rustc_ast::BoundPolarity::Negative(_) => ty::PredicatePolarity::Negative,
|
||||||
|
rustc_ast::BoundPolarity::Maybe(_) => {
|
||||||
|
// No-op.
|
||||||
|
return arg_count;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if let hir::BoundConstness::Always(span) | hir::BoundConstness::Maybe(span) = constness
|
if let hir::BoundConstness::Always(span) | hir::BoundConstness::Maybe(span) = constness
|
||||||
&& !self.tcx().is_const_trait(trait_def_id)
|
&& !self.tcx().is_const_trait(trait_def_id)
|
||||||
{
|
{
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
fn polarity() -> impl Sized + ?use<> {}
|
fn polarity() -> impl Sized + ?use<> {}
|
||||||
//~^ ERROR expected identifier, found keyword `use`
|
//~^ ERROR expected identifier, found keyword `use`
|
||||||
//~| ERROR cannot find trait `r#use` in this scope
|
//~| ERROR cannot find trait `r#use` in this scope
|
||||||
//~| WARN relaxing a default bound only does something for `?Sized`
|
|
||||||
//~| WARN relaxing a default bound only does something for `?Sized`
|
|
||||||
|
|
||||||
fn asyncness() -> impl Sized + async use<> {}
|
fn asyncness() -> impl Sized + async use<> {}
|
||||||
//~^ ERROR expected identifier, found keyword `use`
|
//~^ ERROR expected identifier, found keyword `use`
|
||||||
|
@ -5,19 +5,19 @@ LL | fn polarity() -> impl Sized + ?use<> {}
|
|||||||
| ^^^ expected identifier, found keyword
|
| ^^^ expected identifier, found keyword
|
||||||
|
|
||||||
error: expected identifier, found keyword `use`
|
error: expected identifier, found keyword `use`
|
||||||
--> $DIR/bound-modifiers.rs:9:38
|
--> $DIR/bound-modifiers.rs:7:38
|
||||||
|
|
|
|
||||||
LL | fn asyncness() -> impl Sized + async use<> {}
|
LL | fn asyncness() -> impl Sized + async use<> {}
|
||||||
| ^^^ expected identifier, found keyword
|
| ^^^ expected identifier, found keyword
|
||||||
|
|
||||||
error: expected identifier, found keyword `use`
|
error: expected identifier, found keyword `use`
|
||||||
--> $DIR/bound-modifiers.rs:14:38
|
--> $DIR/bound-modifiers.rs:12:38
|
||||||
|
|
|
|
||||||
LL | fn constness() -> impl Sized + const use<> {}
|
LL | fn constness() -> impl Sized + const use<> {}
|
||||||
| ^^^ expected identifier, found keyword
|
| ^^^ expected identifier, found keyword
|
||||||
|
|
||||||
error: expected identifier, found keyword `use`
|
error: expected identifier, found keyword `use`
|
||||||
--> $DIR/bound-modifiers.rs:19:37
|
--> $DIR/bound-modifiers.rs:17:37
|
||||||
|
|
|
|
||||||
LL | fn binder() -> impl Sized + for<'a> use<> {}
|
LL | fn binder() -> impl Sized + for<'a> use<> {}
|
||||||
| ^^^ expected identifier, found keyword
|
| ^^^ expected identifier, found keyword
|
||||||
@ -29,25 +29,25 @@ LL | fn polarity() -> impl Sized + ?use<> {}
|
|||||||
| ^^^ not found in this scope
|
| ^^^ not found in this scope
|
||||||
|
|
||||||
error[E0405]: cannot find trait `r#use` in this scope
|
error[E0405]: cannot find trait `r#use` in this scope
|
||||||
--> $DIR/bound-modifiers.rs:9:38
|
--> $DIR/bound-modifiers.rs:7:38
|
||||||
|
|
|
|
||||||
LL | fn asyncness() -> impl Sized + async use<> {}
|
LL | fn asyncness() -> impl Sized + async use<> {}
|
||||||
| ^^^ not found in this scope
|
| ^^^ not found in this scope
|
||||||
|
|
||||||
error[E0405]: cannot find trait `r#use` in this scope
|
error[E0405]: cannot find trait `r#use` in this scope
|
||||||
--> $DIR/bound-modifiers.rs:14:38
|
--> $DIR/bound-modifiers.rs:12:38
|
||||||
|
|
|
|
||||||
LL | fn constness() -> impl Sized + const use<> {}
|
LL | fn constness() -> impl Sized + const use<> {}
|
||||||
| ^^^ not found in this scope
|
| ^^^ not found in this scope
|
||||||
|
|
||||||
error[E0405]: cannot find trait `r#use` in this scope
|
error[E0405]: cannot find trait `r#use` in this scope
|
||||||
--> $DIR/bound-modifiers.rs:19:37
|
--> $DIR/bound-modifiers.rs:17:37
|
||||||
|
|
|
|
||||||
LL | fn binder() -> impl Sized + for<'a> use<> {}
|
LL | fn binder() -> impl Sized + for<'a> use<> {}
|
||||||
| ^^^ not found in this scope
|
| ^^^ not found in this scope
|
||||||
|
|
||||||
error[E0658]: async closures are unstable
|
error[E0658]: async closures are unstable
|
||||||
--> $DIR/bound-modifiers.rs:9:32
|
--> $DIR/bound-modifiers.rs:7:32
|
||||||
|
|
|
|
||||||
LL | fn asyncness() -> impl Sized + async use<> {}
|
LL | fn asyncness() -> impl Sized + async use<> {}
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
@ -58,7 +58,7 @@ LL | fn asyncness() -> impl Sized + async use<> {}
|
|||||||
= help: to use an async block, remove the `||`: `async {`
|
= help: to use an async block, remove the `||`: `async {`
|
||||||
|
|
||||||
error[E0658]: const trait impls are experimental
|
error[E0658]: const trait impls are experimental
|
||||||
--> $DIR/bound-modifiers.rs:14:32
|
--> $DIR/bound-modifiers.rs:12:32
|
||||||
|
|
|
|
||||||
LL | fn constness() -> impl Sized + const use<> {}
|
LL | fn constness() -> impl Sized + const use<> {}
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
@ -67,21 +67,7 @@ LL | fn constness() -> impl Sized + const use<> {}
|
|||||||
= help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
= help: add `#![feature(const_trait_impl)]` to the crate attributes to enable
|
||||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
warning: relaxing a default bound only does something for `?Sized`; all other traits are not bound by default
|
error: aborting due to 10 previous errors
|
||||||
--> $DIR/bound-modifiers.rs:3:31
|
|
||||||
|
|
|
||||||
LL | fn polarity() -> impl Sized + ?use<> {}
|
|
||||||
| ^^^^^^
|
|
||||||
|
|
||||||
warning: relaxing a default bound only does something for `?Sized`; all other traits are not bound by default
|
|
||||||
--> $DIR/bound-modifiers.rs:3:31
|
|
||||||
|
|
|
||||||
LL | fn polarity() -> impl Sized + ?use<> {}
|
|
||||||
| ^^^^^^
|
|
||||||
|
|
|
||||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
|
||||||
|
|
||||||
error: aborting due to 10 previous errors; 2 warnings emitted
|
|
||||||
|
|
||||||
Some errors have detailed explanations: E0405, E0658.
|
Some errors have detailed explanations: E0405, E0658.
|
||||||
For more information about an error, try `rustc --explain E0405`.
|
For more information about an error, try `rustc --explain E0405`.
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
struct Foo<T: ?Hash> {}
|
struct Foo<T: ?Hash> {}
|
||||||
//~^ ERROR expected trait, found derive macro `Hash`
|
//~^ ERROR expected trait, found derive macro `Hash`
|
||||||
//~^^ ERROR parameter `T` is never used
|
//~| WARN relaxing a default bound only does something for `?Sized`
|
||||||
//~^^^ WARN relaxing a default bound only does something for `?Sized`
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -15,15 +15,6 @@ warning: relaxing a default bound only does something for `?Sized`; all other tr
|
|||||||
LL | struct Foo<T: ?Hash> {}
|
LL | struct Foo<T: ?Hash> {}
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
||||||
error[E0392]: type parameter `T` is never used
|
error: aborting due to 1 previous error; 1 warning emitted
|
||||||
--> $DIR/issue-37534.rs:1:12
|
|
||||||
|
|
|
||||||
LL | struct Foo<T: ?Hash> {}
|
|
||||||
| ^ unused type parameter
|
|
||||||
|
|
|
||||||
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors; 1 warning emitted
|
For more information about this error, try `rustc --explain E0404`.
|
||||||
|
|
||||||
Some errors have detailed explanations: E0392, E0404.
|
|
||||||
For more information about an error, try `rustc --explain E0392`.
|
|
||||||
|
4
tests/ui/trait-bounds/maybe-bound-generics-deny.rs
Normal file
4
tests/ui/trait-bounds/maybe-bound-generics-deny.rs
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
fn uwu<T: ?Sized<i32>>() {}
|
||||||
|
//~^ ERROR trait takes 0 generic arguments but 1 generic argument was supplied
|
||||||
|
|
||||||
|
fn main() {}
|
11
tests/ui/trait-bounds/maybe-bound-generics-deny.stderr
Normal file
11
tests/ui/trait-bounds/maybe-bound-generics-deny.stderr
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
error[E0107]: trait takes 0 generic arguments but 1 generic argument was supplied
|
||||||
|
--> $DIR/maybe-bound-generics-deny.rs:1:12
|
||||||
|
|
|
||||||
|
LL | fn uwu<T: ?Sized<i32>>() {}
|
||||||
|
| ^^^^^----- help: remove the unnecessary generics
|
||||||
|
| |
|
||||||
|
| expected 0 generic arguments
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0107`.
|
7
tests/ui/trait-bounds/maybe-bound-has-path-args.rs
Normal file
7
tests/ui/trait-bounds/maybe-bound-has-path-args.rs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
trait Trait {}
|
||||||
|
|
||||||
|
fn test<T: ?self::<i32>::Trait>() {}
|
||||||
|
//~^ ERROR type arguments are not allowed on this type
|
||||||
|
//~| WARN relaxing a default bound only does something for `?Sized`
|
||||||
|
|
||||||
|
fn main() {}
|
17
tests/ui/trait-bounds/maybe-bound-has-path-args.stderr
Normal file
17
tests/ui/trait-bounds/maybe-bound-has-path-args.stderr
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
warning: relaxing a default bound only does something for `?Sized`; all other traits are not bound by default
|
||||||
|
--> $DIR/maybe-bound-has-path-args.rs:3:12
|
||||||
|
|
|
||||||
|
LL | fn test<T: ?self::<i32>::Trait>() {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0109]: type arguments are not allowed on this type
|
||||||
|
--> $DIR/maybe-bound-has-path-args.rs:3:20
|
||||||
|
|
|
||||||
|
LL | fn test<T: ?self::<i32>::Trait>() {}
|
||||||
|
| ---- ^^^ type argument not allowed
|
||||||
|
| |
|
||||||
|
| not allowed on this type
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0109`.
|
Loading…
Reference in New Issue
Block a user