diff options
| author | Michael Goulet <michael@errs.io> | 2024-04-15 10:45:37 -0400 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2024-05-21 15:56:10 -0400 |
| commit | 994b58fee7e66c25d4b13a8a95feaff650088301 (patch) | |
| tree | a9ad15524a5cdba84485e410f37425cfcd7b507b | |
| parent | 506512391b1a75ae450d36c9420978402a91abcc (diff) | |
| download | rust-994b58fee7e66c25d4b13a8a95feaff650088301.tar.gz rust-994b58fee7e66c25d4b13a8a95feaff650088301.zip | |
Okay actually check only alias TYPES
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/wf.rs | 12 | ||||
| -rw-r--r-- | tests/ui/higher-ranked/well-formed-aliases.rs | 8 | ||||
| -rw-r--r-- | tests/ui/higher-ranked/well-formed-aliases.stderr | 12 |
3 files changed, 23 insertions, 9 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/wf.rs b/compiler/rustc_trait_selection/src/traits/wf.rs index f4189ff0902..57efd2996e4 100644 --- a/compiler/rustc_trait_selection/src/traits/wf.rs +++ b/compiler/rustc_trait_selection/src/traits/wf.rs @@ -437,12 +437,6 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { /// Pushes the obligations required for an alias (except inherent) to be WF /// into `self.out`. - fn compute_alias_ty(&mut self, data: ty::AliasTy<'tcx>) { - self.compute_alias_term(data.into()); - } - - /// Pushes the obligations required for an alias (except inherent) to be WF - /// into `self.out`. fn compute_alias_term(&mut self, data: ty::AliasTerm<'tcx>) { // A projection is well-formed if // @@ -498,7 +492,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> { self.out.extend(obligations); } - self.compute_projection_args(data.args); + data.args.visit_with(self); } fn compute_projection_args(&mut self, args: GenericArgsRef<'tcx>) { @@ -702,8 +696,8 @@ impl<'a, 'tcx> TypeVisitor<TyCtxt<'tcx>> for WfPredicates<'a, 'tcx> { } ty::Alias(ty::Projection | ty::Opaque | ty::Weak, data) => { - self.compute_alias_ty(data); - return; // Subtree handled by compute_projection. + let obligations = self.nominal_obligations(data.def_id, data.args); + self.out.extend(obligations); } ty::Alias(ty::Inherent, data) => { self.compute_inherent_projection(data); diff --git a/tests/ui/higher-ranked/well-formed-aliases.rs b/tests/ui/higher-ranked/well-formed-aliases.rs new file mode 100644 index 00000000000..60e013a54bc --- /dev/null +++ b/tests/ui/higher-ranked/well-formed-aliases.rs @@ -0,0 +1,8 @@ +trait Trait { + type Gat<U: ?Sized>; +} + +fn test<T>(f: for<'a> fn(<&'a T as Trait>::Gat<&'a [str]>)) where for<'a> &'a T: Trait {} +//~^ ERROR the size for values of type `str` cannot be known at compilation time + +fn main() {} diff --git a/tests/ui/higher-ranked/well-formed-aliases.stderr b/tests/ui/higher-ranked/well-formed-aliases.stderr new file mode 100644 index 00000000000..4a6f4e961d9 --- /dev/null +++ b/tests/ui/higher-ranked/well-formed-aliases.stderr @@ -0,0 +1,12 @@ +error[E0277]: the size for values of type `str` cannot be known at compilation time + --> $DIR/well-formed-aliases.rs:5:52 + | +LL | fn test<T>(f: for<'a> fn(<&'a T as Trait>::Gat<&'a [str]>)) where for<'a> &'a T: Trait {} + | ^^^^^ doesn't have a size known at compile-time + | + = help: the trait `Sized` is not implemented for `str` + = note: slice and array elements must have `Sized` type + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0277`. |
