Skip to content

Diagnostic for mismatched pointers type could be improved #65921

Open
@tesuji

Description

@tesuji

The following snippet is build with Rust 1.38.0: https://rust.godbolt.org/z/NGTGo-

snippet
mod unique {
    type HANDLE = *mut ::std::os::raw::c_void;
    type PHANDLE = *mut HANDLE;
    fn foo(token: PHANDLE) {}

    fn bar() {
        let token: HANDLE = ::std::ptr::null_mut();
        foo(token as *mut _);
        foo(&mut token);
        foo(&token);
        foo(token);
    }
}

mod shared {
    type HANDLE = *const ::std::os::raw::c_void;
    type PHANDLE = *const HANDLE;
    fn foo(token: PHANDLE) {}

    fn bar() {
        let token: HANDLE = ::std::ptr::null_mut();
        foo(token as *const _);
        foo(&mut token);
        foo(&token);
        foo(token);
    }
}

mod unique_mut {
    type HANDLE = *mut ::std::os::raw::c_void;
    type PHANDLE = *mut HANDLE;
    fn foo(token: PHANDLE) {}

    fn bar() {
        let mut token: HANDLE = ::std::ptr::null_mut();
        foo(token as *mut _);
        foo(&mut token);
        foo(&token);
        foo(token);
    }
}
The compiler outputs:
rustc's output
error[E0308]: mismatched types
  --> src/lib.rs:10:13
   |
10 |         foo(&token);
   |             ^^^^^^ types differ in mutability
   |
   = note: expected type `*mut *mut std::ffi::c_void`
              found type `&*mut std::ffi::c_void`

error[E0308]: mismatched types
  --> src/lib.rs:11:13
   |
11 |         foo(token);
   |             ^^^^^ expected *-ptr, found enum `std::ffi::c_void`
   |
   = note: expected type `*mut *mut std::ffi::c_void`
              found type `*mut std::ffi::c_void`

error[E0308]: mismatched types
  --> src/lib.rs:25:13
   |
25 |         foo(token);
   |             ^^^^^ expected *-ptr, found enum `std::ffi::c_void`
   |
   = note: expected type `*const *const std::ffi::c_void`
              found type `*const std::ffi::c_void`

error[E0308]: mismatched types
  --> src/lib.rs:38:13
   |
38 |         foo(&token);
   |             ^^^^^^ types differ in mutability
   |
   = note: expected type `*mut *mut std::ffi::c_void`
              found type `&*mut std::ffi::c_void`

error[E0308]: mismatched types
  --> src/lib.rs:39:13
   |
39 |         foo(token);
   |             ^^^^^ expected *-ptr, found enum `std::ffi::c_void`
   |
   = note: expected type `*mut *mut std::ffi::c_void`
              found type `*mut std::ffi::c_void`

error: aborting due to 5 previous errors

I'm a beginner in Rust's FFI. So my questions may seems silly.

  1. In module unique, line 8: we mutually borrow token, but token is never defined
    with let mut syntax. Is this accepted?

  2. Same question but for module shared, line 23.

  3. Can we suggest borrowing with appropriate mutability in foo(token) lines?

    For example:

    error[E0308]: mismatched types
      --> src/lib.rs:10:13
       |
    10 |         foo(&token);
       |             ^^^^^^ types differ in mutability
       |
       = note: expected type `*mut *mut std::ffi::c_void`
                  found type `&*mut std::ffi::c_void`
         try: `&mut token`
    
    error[E0308]: mismatched types
      --> src/lib.rs:11:13
       |
    11 |         foo(token);
       |             ^^^^^ expected *-ptr, found enum `std::ffi::c_void`
       |
       = note: expected type `*mut *mut std::ffi::c_void`
                  found type `*mut std::ffi::c_void`
         try: `&mut token`

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-raw-pointersArea: raw pointers, MaybeUninit, NonNullA-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions