Skip to content

c-variadic: improve implicit &'reg VaList argument diagnostics #160495

Description

@lcnr

cc #160491

see that PR for more detail and the FIXME(#160495) in the code, e.g.

#![crate_type = "lib"]
async unsafe extern "C" fn fn_cannot_be_async(x: isize, _: ...) {}
//~^ ERROR functions cannot be both `async` and C-variadic
//~| ERROR hidden type for `impl Future<Output = ()>` captures lifetime that does not appear in bounds
struct S;
impl S {
async unsafe extern "C" fn method_cannot_be_async(x: isize, _: ...) {}
//~^ ERROR functions cannot be both `async` and C-variadic
//~| ERROR hidden type for `impl Future<Output = ()>` captures lifetime that does not appear in bounds
}

results in

error: functions cannot be both `async` and C-variadic
  --> $DIR/not-async.rs:4:1
   |
LL | async unsafe extern "C" fn fn_cannot_be_async(x: isize, _: ...) {}
   | ^^^^^ `async` because of this                           ^^^^^^ C-variadic because of this

error: functions cannot be both `async` and C-variadic
  --> $DIR/not-async.rs:11:5
   |
LL |     async unsafe extern "C" fn method_cannot_be_async(x: isize, _: ...) {}
   |     ^^^^^ `async` because of this                               ^^^^^^ C-variadic because of this

error[E0700]: hidden type for `impl Future<Output = ()>` captures lifetime that does not appear in bounds
  --> $DIR/not-async.rs:4:65
   |
LL | async unsafe extern "C" fn fn_cannot_be_async(x: isize, _: ...) {}
   | ----------------------------------------------------------------^^
   | |                                                              |
   | |                                                              opaque type defined here
   | hidden type `{async fn body of fn_cannot_be_async()}` captures the anonymous lifetime as defined here

error[E0700]: hidden type for `impl Future<Output = ()>` captures lifetime that does not appear in bounds
  --> $DIR/not-async.rs:11:73
   |
LL |     async unsafe extern "C" fn method_cannot_be_async(x: isize, _: ...) {}
   |     --------------------------------------------------------------------^^
   |     |                                                                  |
   |     |                                                                  opaque type defined here
   |     hidden type `{async fn body of S::method_cannot_be_async()}` captures the anonymous lifetime as defined here

error: aborting due to 4 previous errors

with #160491 but should instead explicitly talk about the fact that we're capturing the &VaList here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    F-c_variadic`#![feature(c_variadic)]`needs-triageThis issue may need triage. Remove it if it has been sufficiently triaged.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions