Add basic checks for well-formedness of fn/fn_mut lang items
This commit is contained in:
parent
a0648eab36
commit
4337089098
6 changed files with 161 additions and 6 deletions
27
src/test/ui/lang-items/fn-fn_mut-call-ill-formed.rs
Normal file
27
src/test/ui/lang-items/fn-fn_mut-call-ill-formed.rs
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
// Make sure that an error is reported if the `call` function of the
|
||||
// `fn`/`fn_mut` lang item is grossly ill-formed.
|
||||
|
||||
#![feature(lang_items)]
|
||||
#![feature(no_core)]
|
||||
#![no_core]
|
||||
|
||||
#[lang = "fn"]
|
||||
trait MyFn<T> {
|
||||
const call: i32 = 42;
|
||||
//~^ ERROR: `call` trait item in `fn`/`fn_mut` lang item must be a function
|
||||
}
|
||||
|
||||
#[lang = "fn_mut"]
|
||||
trait MyFnMut<T> {
|
||||
fn call(i: i32, j: i32) -> i32 { i + j }
|
||||
//~^ ERROR: first argument of `call` in `fn`/`fn_mut` lang item must be a reference
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let a = || 42;
|
||||
a();
|
||||
|
||||
let mut i = 0;
|
||||
let mut b = || { i += 1; };
|
||||
b();
|
||||
}
|
||||
14
src/test/ui/lang-items/fn-fn_mut-call-ill-formed.stderr
Normal file
14
src/test/ui/lang-items/fn-fn_mut-call-ill-formed.stderr
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
error: `call` trait item in `fn`/`fn_mut` lang item must be a function
|
||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:10:5
|
||||
|
|
||||
LL | const call: i32 = 42;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: first argument of `call` in `fn`/`fn_mut` lang item must be a reference
|
||||
--> $DIR/fn-fn_mut-call-ill-formed.rs:16:16
|
||||
|
|
||||
LL | fn call(i: i32, j: i32) -> i32 { i + j }
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
23
src/test/ui/lang-items/issue-83471.rs
Normal file
23
src/test/ui/lang-items/issue-83471.rs
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
// Regression test for the ICE reported in issue #83471.
|
||||
|
||||
#![crate_type="lib"]
|
||||
#![feature(no_core)]
|
||||
#![no_core]
|
||||
|
||||
#[lang = "sized"]
|
||||
//~^ ERROR: language items are subject to change [E0658]
|
||||
trait Sized {}
|
||||
|
||||
#[lang = "fn"]
|
||||
//~^ ERROR: language items are subject to change [E0658]
|
||||
//~| ERROR: `fn` language item must be applied to a trait with 1 generic argument
|
||||
trait Fn {
|
||||
fn call(export_name);
|
||||
//~^ ERROR: expected type
|
||||
//~| WARNING: anonymous parameters are deprecated
|
||||
//~| WARNING: this is accepted in the current edition
|
||||
}
|
||||
fn call_through_fn_trait() {
|
||||
a()
|
||||
//~^ ERROR: cannot find function
|
||||
}
|
||||
51
src/test/ui/lang-items/issue-83471.stderr
Normal file
51
src/test/ui/lang-items/issue-83471.stderr
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
error[E0573]: expected type, found built-in attribute `export_name`
|
||||
--> $DIR/issue-83471.rs:15:13
|
||||
|
|
||||
LL | fn call(export_name);
|
||||
| ^^^^^^^^^^^ not a type
|
||||
|
||||
error[E0425]: cannot find function `a` in this scope
|
||||
--> $DIR/issue-83471.rs:21:5
|
||||
|
|
||||
LL | a()
|
||||
| ^ not found in this scope
|
||||
|
||||
error[E0658]: language items are subject to change
|
||||
--> $DIR/issue-83471.rs:7:1
|
||||
|
|
||||
LL | #[lang = "sized"]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(lang_items)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: language items are subject to change
|
||||
--> $DIR/issue-83471.rs:11:1
|
||||
|
|
||||
LL | #[lang = "fn"]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: add `#![feature(lang_items)]` to the crate attributes to enable
|
||||
|
||||
warning: anonymous parameters are deprecated and will be removed in the next edition.
|
||||
--> $DIR/issue-83471.rs:15:13
|
||||
|
|
||||
LL | fn call(export_name);
|
||||
| ^^^^^^^^^^^ help: try naming the parameter or explicitly ignoring it: `_: export_name`
|
||||
|
|
||||
= note: `#[warn(anonymous_parameters)]` on by default
|
||||
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
|
||||
= note: for more information, see issue #41686 <https://github.com/rust-lang/rust/issues/41686>
|
||||
|
||||
error[E0718]: `fn` language item must be applied to a trait with 1 generic argument
|
||||
--> $DIR/issue-83471.rs:11:1
|
||||
|
|
||||
LL | #[lang = "fn"]
|
||||
| ^^^^^^^^^^^^^^
|
||||
...
|
||||
LL | trait Fn {
|
||||
| - this trait has 0 generic arguments
|
||||
|
||||
error: aborting due to 5 previous errors; 1 warning emitted
|
||||
|
||||
Some errors have detailed explanations: E0425, E0573, E0658, E0718.
|
||||
For more information about an error, try `rustc --explain E0425`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue