Skip to content

Commit

Permalink
Add test for bad NLL higher-ranked subtype
Browse files Browse the repository at this point in the history
Fixes #57642
  • Loading branch information
Aaron1011 committed Oct 23, 2020
1 parent 07a63e6 commit 5923218
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
41 changes: 41 additions & 0 deletions src/test/ui/nll/issue-57642-higher-ranked-subtype.rs
@@ -0,0 +1,41 @@
// Regression test for issue #57642
// Tests that we reject a bad higher-ranked subtype
// with `#![feature(nll)]`

#![feature(nll)]

trait X {
type G;
fn make_g() -> Self::G;
}

impl<'a> X for fn(&'a ()) {
type G = &'a ();

fn make_g() -> Self::G {
&()
}
}

trait Y {
type F;
fn make_f() -> Self::F;
}

impl<T> Y for fn(T) {
type F = fn(T);

fn make_f() -> Self::F {
|_| {}
}
}

fn higher_ranked_region_has_lost_its_binder() {
let x = <fn (&())>::make_g(); //~ ERROR no function
}

fn magical() {
let x = <fn (&())>::make_f(); //~ ERROR no function
}

fn main() {}
31 changes: 31 additions & 0 deletions src/test/ui/nll/issue-57642-higher-ranked-subtype.stderr
@@ -0,0 +1,31 @@
error[E0599]: no function or associated item named `make_g` found for fn pointer `for<'r> fn(&'r ())` in the current scope
--> $DIR/issue-57642-higher-ranked-subtype.rs:34:25
|
LL | let x = <fn (&())>::make_g();
| ^^^^^^ function or associated item not found in `for<'r> fn(&'r ())`
|
= note: the method `make_g` exists but the following trait bounds were not satisfied:
`for<'r> fn(&'r ()): X`
= help: items from traits can only be used if the trait is implemented and in scope
note: `X` defines an item `make_g`, perhaps you need to implement it
--> $DIR/issue-57642-higher-ranked-subtype.rs:7:1
|
LL | trait X {
| ^^^^^^^

error[E0599]: no function or associated item named `make_f` found for fn pointer `for<'r> fn(&'r ())` in the current scope
--> $DIR/issue-57642-higher-ranked-subtype.rs:38:25
|
LL | let x = <fn (&())>::make_f();
| ^^^^^^ function or associated item not found in `for<'r> fn(&'r ())`
|
= help: items from traits can only be used if the trait is implemented and in scope
note: `Y` defines an item `make_f`, perhaps you need to implement it
--> $DIR/issue-57642-higher-ranked-subtype.rs:20:1
|
LL | trait Y {
| ^^^^^^^

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0599`.

0 comments on commit 5923218

Please sign in to comment.