Rollup merge of #117370 - nicholasbishop:bishop-better-c-variadic-errors, r=oli-obk
C-variadic error improvements A couple improvements for c-variadic errors: 1. Fix the bad-c-variadic error being emitted multiple times. If a function incorrectly contains multiple `...` args, and is also not foreign or `unsafe extern "C"`, only emit the latter error once rather than once per `...`. 2. Explicitly reject `const` C-variadic functions. Trying to use C-variadics in a const function would previously fail with an error like "destructor of `VaListImpl<'_>` cannot be evaluated at compile-time". Add an explicit check for const C-variadics to provide a clearer error: "functions cannot be both `const` and C-variadic". This also addresses one of the concerns in https://github.com/rust-lang/rust/issues/44930: "Ensure that even when this gets stabilized for regular functions, it is still rejected on const fn."
This commit is contained in:
commit
784f04b367
6 changed files with 136 additions and 50 deletions
|
|
@ -50,13 +50,7 @@ error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
|||
--> $DIR/issue-86053-1.rs:11:12
|
||||
|
|
||||
LL | self , ... , self , self , ... ) where F : FnOnce ( & 'a & 'b usize ) {
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/issue-86053-1.rs:11:36
|
||||
|
|
||||
LL | self , ... , self , self , ... ) where F : FnOnce ( & 'a & 'b usize ) {
|
||||
| ^^^
|
||||
| ^^^ ^^^
|
||||
|
||||
error[E0412]: cannot find type `F` in this scope
|
||||
--> $DIR/issue-86053-1.rs:11:48
|
||||
|
|
@ -76,6 +70,6 @@ help: you might be missing a type parameter
|
|||
LL | fn ordering4 < 'a , 'b, F > ( a : , self , self , self ,
|
||||
| +++
|
||||
|
||||
error: aborting due to 11 previous errors
|
||||
error: aborting due to 10 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0412`.
|
||||
|
|
|
|||
|
|
@ -32,6 +32,18 @@ extern "C" fn f3_3(..., x: isize) {}
|
|||
//~^ ERROR only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
//~| ERROR `...` must be the last argument of a C-variadic function
|
||||
|
||||
const unsafe extern "C" fn f4_1(x: isize, ...) {}
|
||||
//~^ ERROR functions cannot be both `const` and C-variadic
|
||||
|
||||
const extern "C" fn f4_2(x: isize, ...) {}
|
||||
//~^ ERROR functions cannot be both `const` and C-variadic
|
||||
//~| ERROR only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
|
||||
const extern "C" fn f4_3(..., x: isize, ...) {}
|
||||
//~^ ERROR functions cannot be both `const` and C-variadic
|
||||
//~| ERROR only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
//~| ERROR `...` must be the last argument of a C-variadic function
|
||||
|
||||
extern "C" {
|
||||
fn e_f1(...);
|
||||
//~^ ERROR C-variadic function must be declared with at least one named argument
|
||||
|
|
@ -49,12 +61,13 @@ impl X {
|
|||
//~| ERROR C-variadic function must be declared with at least one named argument
|
||||
fn i_f3(..., x: isize, ...) {}
|
||||
//~^ ERROR only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
//~| ERROR only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
//~| ERROR `...` must be the last argument of a C-variadic function
|
||||
fn i_f4(..., x: isize, ...) {}
|
||||
//~^ ERROR only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
//~| ERROR only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
//~| ERROR `...` must be the last argument of a C-variadic function
|
||||
const fn i_f5(x: isize, ...) {}
|
||||
//~^ ERROR only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
//~| ERROR functions cannot be both `const` and C-variadic
|
||||
}
|
||||
|
||||
trait T {
|
||||
|
|
|
|||
|
|
@ -76,131 +76,172 @@ error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
|||
LL | extern "C" fn f3_3(..., x: isize) {}
|
||||
| ^^^
|
||||
|
||||
error: functions cannot be both `const` and C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:35:1
|
||||
|
|
||||
LL | const unsafe extern "C" fn f4_1(x: isize, ...) {}
|
||||
| ^^^^^ `const` because of this ^^^ C-variadic because of this
|
||||
|
||||
error: functions cannot be both `const` and C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:38:1
|
||||
|
|
||||
LL | const extern "C" fn f4_2(x: isize, ...) {}
|
||||
| ^^^^^ `const` because of this ^^^ C-variadic because of this
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:38:36
|
||||
|
|
||||
LL | const extern "C" fn f4_2(x: isize, ...) {}
|
||||
| ^^^
|
||||
|
||||
error: `...` must be the last argument of a C-variadic function
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:42:26
|
||||
|
|
||||
LL | const extern "C" fn f4_3(..., x: isize, ...) {}
|
||||
| ^^^
|
||||
|
||||
error: functions cannot be both `const` and C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:42:1
|
||||
|
|
||||
LL | const extern "C" fn f4_3(..., x: isize, ...) {}
|
||||
| ^^^^^ ^^^ ^^^ C-variadic because of this
|
||||
| | |
|
||||
| | C-variadic because of this
|
||||
| `const` because of this
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:42:26
|
||||
|
|
||||
LL | const extern "C" fn f4_3(..., x: isize, ...) {}
|
||||
| ^^^ ^^^
|
||||
|
||||
error: C-variadic function must be declared with at least one named argument
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:36:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:48:13
|
||||
|
|
||||
LL | fn e_f1(...);
|
||||
| ^^^
|
||||
|
||||
error: `...` must be the last argument of a C-variadic function
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:38:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:50:13
|
||||
|
|
||||
LL | fn e_f2(..., x: isize);
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:45:23
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:57:23
|
||||
|
|
||||
LL | fn i_f1(x: isize, ...) {}
|
||||
| ^^^
|
||||
|
||||
error: C-variadic function must be declared with at least one named argument
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:47:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:59:13
|
||||
|
|
||||
LL | fn i_f2(...) {}
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:47:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:59:13
|
||||
|
|
||||
LL | fn i_f2(...) {}
|
||||
| ^^^
|
||||
|
||||
error: `...` must be the last argument of a C-variadic function
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:50:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:62:13
|
||||
|
|
||||
LL | fn i_f3(..., x: isize, ...) {}
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:50:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:62:13
|
||||
|
|
||||
LL | fn i_f3(..., x: isize, ...) {}
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:50:28
|
||||
|
|
||||
LL | fn i_f3(..., x: isize, ...) {}
|
||||
| ^^^
|
||||
| ^^^ ^^^
|
||||
|
||||
error: `...` must be the last argument of a C-variadic function
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:54:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:65:13
|
||||
|
|
||||
LL | fn i_f4(..., x: isize, ...) {}
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:54:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:65:13
|
||||
|
|
||||
LL | fn i_f4(..., x: isize, ...) {}
|
||||
| ^^^
|
||||
| ^^^ ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:54:28
|
||||
error: functions cannot be both `const` and C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:68:5
|
||||
|
|
||||
LL | fn i_f4(..., x: isize, ...) {}
|
||||
| ^^^
|
||||
LL | const fn i_f5(x: isize, ...) {}
|
||||
| ^^^^^ ^^^ C-variadic because of this
|
||||
| |
|
||||
| `const` because of this
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:61:23
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:68:29
|
||||
|
|
||||
LL | const fn i_f5(x: isize, ...) {}
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:74:23
|
||||
|
|
||||
LL | fn t_f1(x: isize, ...) {}
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:63:23
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:76:23
|
||||
|
|
||||
LL | fn t_f2(x: isize, ...);
|
||||
| ^^^
|
||||
|
||||
error: C-variadic function must be declared with at least one named argument
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:65:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:78:13
|
||||
|
|
||||
LL | fn t_f3(...) {}
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:65:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:78:13
|
||||
|
|
||||
LL | fn t_f3(...) {}
|
||||
| ^^^
|
||||
|
||||
error: C-variadic function must be declared with at least one named argument
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:68:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:81:13
|
||||
|
|
||||
LL | fn t_f4(...);
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:68:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:81:13
|
||||
|
|
||||
LL | fn t_f4(...);
|
||||
| ^^^
|
||||
|
||||
error: `...` must be the last argument of a C-variadic function
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:71:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:84:13
|
||||
|
|
||||
LL | fn t_f5(..., x: isize) {}
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:71:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:84:13
|
||||
|
|
||||
LL | fn t_f5(..., x: isize) {}
|
||||
| ^^^
|
||||
|
||||
error: `...` must be the last argument of a C-variadic function
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:74:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:87:13
|
||||
|
|
||||
LL | fn t_f6(..., x: isize);
|
||||
| ^^^
|
||||
|
||||
error: only foreign or `unsafe extern "C"` functions may be C-variadic
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:74:13
|
||||
--> $DIR/variadic-ffi-semantic-restrictions.rs:87:13
|
||||
|
|
||||
LL | fn t_f6(..., x: isize);
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 34 previous errors
|
||||
error: aborting due to 40 previous errors
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue