parser: move restrictions re. self to ast_validation.
This commit is contained in:
parent
cdd41ea5fc
commit
8674efdb7c
9 changed files with 426 additions and 56 deletions
64
src/test/ui/parser/self-param-semantic-fail.rs
Normal file
64
src/test/ui/parser/self-param-semantic-fail.rs
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
// This test ensures that `self` is semantically rejected
|
||||
// in contexts with `FnDecl` but outside of associated `fn`s.
|
||||
// FIXME(Centril): For now closures are an exception.
|
||||
|
||||
fn main() {}
|
||||
|
||||
fn free() {
|
||||
fn f1(self) {}
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f2(mut self) {}
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f3(&self) {}
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f4(&mut self) {}
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f5<'a>(&'a self) {}
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f6<'a>(&'a mut self) {}
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f7(self: u8) {}
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f8(mut self: u8) {}
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
}
|
||||
|
||||
extern {
|
||||
fn f1(self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f2(mut self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
//~| ERROR patterns aren't allowed in
|
||||
fn f3(&self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f4(&mut self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f5<'a>(&'a self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f6<'a>(&'a mut self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f7(self: u8);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
fn f8(mut self: u8);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
//~| ERROR patterns aren't allowed in
|
||||
}
|
||||
|
||||
type X1 = fn(self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
type X2 = fn(mut self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
//~| ERROR patterns aren't allowed in
|
||||
type X3 = fn(&self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
type X4 = fn(&mut self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
type X5 = for<'a> fn(&'a self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
type X6 = for<'a> fn(&'a mut self);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
type X7 = fn(self: u8);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
type X8 = fn(mut self: u8);
|
||||
//~^ ERROR `self` parameter only allowed in associated `fn`s
|
||||
//~| ERROR patterns aren't allowed in
|
||||
220
src/test/ui/parser/self-param-semantic-fail.stderr
Normal file
220
src/test/ui/parser/self-param-semantic-fail.stderr
Normal file
|
|
@ -0,0 +1,220 @@
|
|||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:8:11
|
||||
|
|
||||
LL | fn f1(self) {}
|
||||
| ^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:10:11
|
||||
|
|
||||
LL | fn f2(mut self) {}
|
||||
| ^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:12:11
|
||||
|
|
||||
LL | fn f3(&self) {}
|
||||
| ^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:14:11
|
||||
|
|
||||
LL | fn f4(&mut self) {}
|
||||
| ^^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:16:15
|
||||
|
|
||||
LL | fn f5<'a>(&'a self) {}
|
||||
| ^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:18:15
|
||||
|
|
||||
LL | fn f6<'a>(&'a mut self) {}
|
||||
| ^^^^^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:20:11
|
||||
|
|
||||
LL | fn f7(self: u8) {}
|
||||
| ^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:22:11
|
||||
|
|
||||
LL | fn f8(mut self: u8) {}
|
||||
| ^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:27:11
|
||||
|
|
||||
LL | fn f1(self);
|
||||
| ^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:29:11
|
||||
|
|
||||
LL | fn f2(mut self);
|
||||
| ^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error[E0130]: patterns aren't allowed in foreign function declarations
|
||||
--> $DIR/self-param-semantic-fail.rs:29:11
|
||||
|
|
||||
LL | fn f2(mut self);
|
||||
| ^^^^^^^^ pattern not allowed in foreign function
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:32:11
|
||||
|
|
||||
LL | fn f3(&self);
|
||||
| ^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:34:11
|
||||
|
|
||||
LL | fn f4(&mut self);
|
||||
| ^^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:36:15
|
||||
|
|
||||
LL | fn f5<'a>(&'a self);
|
||||
| ^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:38:15
|
||||
|
|
||||
LL | fn f6<'a>(&'a mut self);
|
||||
| ^^^^^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:40:11
|
||||
|
|
||||
LL | fn f7(self: u8);
|
||||
| ^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:42:11
|
||||
|
|
||||
LL | fn f8(mut self: u8);
|
||||
| ^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error[E0130]: patterns aren't allowed in foreign function declarations
|
||||
--> $DIR/self-param-semantic-fail.rs:42:11
|
||||
|
|
||||
LL | fn f8(mut self: u8);
|
||||
| ^^^^^^^^ pattern not allowed in foreign function
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:47:14
|
||||
|
|
||||
LL | type X1 = fn(self);
|
||||
| ^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:49:14
|
||||
|
|
||||
LL | type X2 = fn(mut self);
|
||||
| ^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error[E0561]: patterns aren't allowed in function pointer types
|
||||
--> $DIR/self-param-semantic-fail.rs:49:14
|
||||
|
|
||||
LL | type X2 = fn(mut self);
|
||||
| ^^^^^^^^
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:52:14
|
||||
|
|
||||
LL | type X3 = fn(&self);
|
||||
| ^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:54:14
|
||||
|
|
||||
LL | type X4 = fn(&mut self);
|
||||
| ^^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:56:22
|
||||
|
|
||||
LL | type X5 = for<'a> fn(&'a self);
|
||||
| ^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:58:22
|
||||
|
|
||||
LL | type X6 = for<'a> fn(&'a mut self);
|
||||
| ^^^^^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:60:14
|
||||
|
|
||||
LL | type X7 = fn(self: u8);
|
||||
| ^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error: `self` parameter only allowed in associated `fn`s
|
||||
--> $DIR/self-param-semantic-fail.rs:62:14
|
||||
|
|
||||
LL | type X8 = fn(mut self: u8);
|
||||
| ^^^^^^^^ not semantically valid as function parameter
|
||||
|
|
||||
= note: associated `fn`s are those in `impl` or `trait` definitions
|
||||
|
||||
error[E0561]: patterns aren't allowed in function pointer types
|
||||
--> $DIR/self-param-semantic-fail.rs:62:14
|
||||
|
|
||||
LL | type X8 = fn(mut self: u8);
|
||||
| ^^^^^^^^
|
||||
|
||||
error: aborting due to 28 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0130, E0561.
|
||||
For more information about an error, try `rustc --explain E0130`.
|
||||
66
src/test/ui/parser/self-param-syntactic-pass.rs
Normal file
66
src/test/ui/parser/self-param-syntactic-pass.rs
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
// This test ensures that `self` is syntactically accepted in all places an `FnDecl` is parsed.
|
||||
// FIXME(Centril): For now closures are an exception.
|
||||
|
||||
// check-pass
|
||||
|
||||
fn main() {}
|
||||
|
||||
#[cfg(FALSE)]
|
||||
fn free() {
|
||||
fn f(self) {}
|
||||
fn f(mut self) {}
|
||||
fn f(&self) {}
|
||||
fn f(&mut self) {}
|
||||
fn f(&'a self) {}
|
||||
fn f(&'a mut self) {}
|
||||
fn f(self: u8) {}
|
||||
fn f(mut self: u8) {}
|
||||
}
|
||||
|
||||
#[cfg(FALSE)]
|
||||
extern {
|
||||
fn f(self);
|
||||
fn f(mut self);
|
||||
fn f(&self);
|
||||
fn f(&mut self);
|
||||
fn f(&'a self);
|
||||
fn f(&'a mut self);
|
||||
fn f(self: u8);
|
||||
fn f(mut self: u8);
|
||||
}
|
||||
|
||||
#[cfg(FALSE)]
|
||||
trait X {
|
||||
fn f(self) {}
|
||||
fn f(mut self) {}
|
||||
fn f(&self) {}
|
||||
fn f(&mut self) {}
|
||||
fn f(&'a self) {}
|
||||
fn f(&'a mut self) {}
|
||||
fn f(self: u8) {}
|
||||
fn f(mut self: u8) {}
|
||||
}
|
||||
|
||||
#[cfg(FALSE)]
|
||||
impl X for Y {
|
||||
fn f(self) {}
|
||||
fn f(mut self) {}
|
||||
fn f(&self) {}
|
||||
fn f(&mut self) {}
|
||||
fn f(&'a self) {}
|
||||
fn f(&'a mut self) {}
|
||||
fn f(self: u8) {}
|
||||
fn f(mut self: u8) {}
|
||||
}
|
||||
|
||||
#[cfg(FALSE)]
|
||||
impl X for Y {
|
||||
type X = fn(self);
|
||||
type X = fn(mut self);
|
||||
type X = fn(&self);
|
||||
type X = fn(&mut self);
|
||||
type X = fn(&'a self);
|
||||
type X = fn(&'a mut self);
|
||||
type X = fn(self: u8);
|
||||
type X = fn(mut self: u8);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue