Skip to content

Commit

Permalink
Actually do validation for poly trait refs with ? modifier
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Oct 30, 2024
1 parent 759e07f commit e356279
Show file tree
Hide file tree
Showing 11 changed files with 62 additions and 46 deletions.
6 changes: 0 additions & 6 deletions compiler/rustc_hir_analysis/src/hir_ty_lowering/bounds.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,12 +168,6 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
match hir_bound {
hir::GenericBound::Trait(poly_trait_ref) => {
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(
&poly_trait_ref.trait_ref,
poly_trait_ref.span,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
&trait_bound.trait_ref,
trait_bound.span,
hir::BoundConstness::Never,
ty::PredicatePolarity::Positive,
hir::BoundPolarity::Positive,
dummy_self,
&mut bounds,
PredicateFilter::SelfOnly,
Expand Down
11 changes: 10 additions & 1 deletion compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -659,7 +659,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
trait_ref: &hir::TraitRef<'tcx>,
span: Span,
constness: hir::BoundConstness,
polarity: ty::PredicatePolarity,
polarity: hir::BoundPolarity,
self_ty: Ty<'tcx>,
bounds: &mut Bounds<'tcx>,
predicate_filter: PredicateFilter,
Expand All @@ -681,6 +681,15 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
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
&& !self.tcx().is_const_trait(trait_def_id)
{
Expand Down
2 changes: 0 additions & 2 deletions tests/ui/impl-trait/precise-capturing/bound-modifiers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
fn polarity() -> impl Sized + ?use<> {}
//~^ ERROR expected identifier, found keyword `use`
//~| 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<> {}
//~^ ERROR expected identifier, found keyword `use`
Expand Down
32 changes: 9 additions & 23 deletions tests/ui/impl-trait/precise-capturing/bound-modifiers.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@ LL | fn polarity() -> impl Sized + ?use<> {}
| ^^^ expected identifier, found keyword

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<> {}
| ^^^ expected identifier, found keyword

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<> {}
| ^^^ expected identifier, found keyword

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<> {}
| ^^^ expected identifier, found keyword
Expand All @@ -29,25 +29,25 @@ LL | fn polarity() -> impl Sized + ?use<> {}
| ^^^ not found 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<> {}
| ^^^ not found 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<> {}
| ^^^ not found 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<> {}
| ^^^ not found in this scope

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<> {}
| ^^^^^
Expand All @@ -58,7 +58,7 @@ LL | fn asyncness() -> impl Sized + async use<> {}
= help: to use an async block, remove the `||`: `async {`

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<> {}
| ^^^^^
Expand All @@ -67,21 +67,7 @@ LL | fn constness() -> impl Sized + const use<> {}
= 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

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<> {}
| ^^^^^^

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
error: aborting due to 10 previous errors

Some errors have detailed explanations: E0405, E0658.
For more information about an error, try `rustc --explain E0405`.
3 changes: 1 addition & 2 deletions tests/ui/issues/issue-37534.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
struct Foo<T: ?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() {}
13 changes: 2 additions & 11 deletions tests/ui/issues/issue-37534.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,6 @@ warning: relaxing a default bound only does something for `?Sized`; all other tr
LL | struct Foo<T: ?Hash> {}
| ^^^^^

error[E0392]: type parameter `T` is never used
--> $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
error: aborting due to 1 previous error; 1 warning emitted

Some errors have detailed explanations: E0392, E0404.
For more information about an error, try `rustc --explain E0392`.
For more information about this error, try `rustc --explain E0404`.
4 changes: 4 additions & 0 deletions tests/ui/trait-bounds/maybe-bound-generics-deny.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
fn uwu<T: ?Sized<i32>>() {}
//~^ ERROR trait takes 0 generic arguments but 1 generic argument was supplied

fn main() {}
11 changes: 11 additions & 0 deletions tests/ui/trait-bounds/maybe-bound-generics-deny.stderr
Original file line number Diff line number Diff line change
@@ -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 changes: 7 additions & 0 deletions tests/ui/trait-bounds/maybe-bound-has-path-args.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 17 additions & 0 deletions tests/ui/trait-bounds/maybe-bound-has-path-args.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit e356279

Please sign in to comment.