]> git.lizzy.rs Git - rust.git/blob - tests/ui/parser/fn-header-semantic-fail.rs
Rollup merge of #106441 - mllken:abstract-socket-noref, r=joshtriplett
[rust.git] / tests / ui / parser / fn-header-semantic-fail.rs
1 // Ensures that all `fn` forms can have all the function qualifiers syntactically.
2
3 // edition:2018
4
5 #![feature(const_extern_fn)]
6
7 fn main() {
8     async fn ff1() {} // OK.
9     unsafe fn ff2() {} // OK.
10     const fn ff3() {} // OK.
11     extern "C" fn ff4() {} // OK.
12     const async unsafe extern "C" fn ff5() {}
13     //~^ ERROR functions cannot be both `const` and `async`
14     //~| ERROR cycle detected
15
16     trait X {
17         async fn ft1(); //~ ERROR functions in traits cannot be declared `async`
18         unsafe fn ft2(); // OK.
19         const fn ft3(); //~ ERROR functions in traits cannot be declared const
20         extern "C" fn ft4(); // OK.
21         const async unsafe extern "C" fn ft5();
22         //~^ ERROR functions in traits cannot be declared `async`
23         //~| ERROR functions in traits cannot be declared const
24         //~| ERROR functions cannot be both `const` and `async`
25     }
26
27     struct Y;
28     impl X for Y {
29         async fn ft1() {} //~ ERROR functions in traits cannot be declared `async`
30         unsafe fn ft2() {} // OK.
31         const fn ft3() {} //~ ERROR functions in traits cannot be declared const
32         extern "C" fn ft4() {}
33         const async unsafe extern "C" fn ft5() {}
34         //~^ ERROR functions in traits cannot be declared `async`
35         //~| ERROR functions in traits cannot be declared const
36         //~| ERROR functions cannot be both `const` and `async`
37         //~| ERROR cycle detected
38     }
39
40     impl Y {
41         async fn fi1() {} // OK.
42         unsafe fn fi2() {} // OK.
43         const fn fi3() {} // OK.
44         extern "C" fn fi4() {} // OK.
45         const async unsafe extern "C" fn fi5() {}
46         //~^ ERROR functions cannot be both `const` and `async`
47         //~| ERROR cycle detected
48     }
49
50     extern "C" {
51         async fn fe1(); //~ ERROR functions in `extern` blocks cannot have qualifiers
52         unsafe fn fe2(); //~ ERROR functions in `extern` blocks cannot have qualifiers
53         const fn fe3(); //~ ERROR functions in `extern` blocks cannot have qualifiers
54         extern "C" fn fe4(); //~ ERROR functions in `extern` blocks cannot have qualifiers
55         const async unsafe extern "C" fn fe5(); //~ ERROR functions in `extern` blocks
56         //~^ ERROR functions cannot be both `const` and `async`
57     }
58 }