Skip to content

Unsized extern statics no longer compile #55239

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
mjbshaw opened this issue Oct 21, 2018 · 2 comments
Closed

Unsized extern statics no longer compile #55239

mjbshaw opened this issue Oct 21, 2018 · 2 comments
Labels
A-FFI Area: Foreign function interface (FFI) C-bug Category: This is a bug. regression-from-stable-to-nightly Performance or correctness regression from stable to nightly. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@mjbshaw
Copy link
Contributor

mjbshaw commented Oct 21, 2018

This is likely due to #55004. Consider the following code:

#![feature(extern_types)]

extern "C" {
    pub type StartFn;
    pub static start: StartFn;
}

This code compiles with rustc 1.31.0-nightly (e7f5d4805 2018-10-18), but fails with rustc 1.31.0-nightly (78ff609d7 2018-10-19). Error message from rustc:

error[E0277]: the size for values of type `StartFn` cannot be known at compilation time
 --> t.rs:5:23
  |
5 |     pub static start: StartFn;
  |                       ^^^^^^^ doesn't have a size known at compile-time
  |
  = help: the trait `std::marker::Sized` is not implemented for `StartFn`
  = note: to learn more, visit <https://doc.rust-lang.org/book/second-edition/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.

I think this code should still be accepted, and I believe #55004 accidentally broke this. One of the purposes of the extern_types feature is to better interact with C code like this:

struct SomeOpaqueType;
extern struct SomeOpaqueType SomeGlobal;

I think Rust should accept unsized extern statics that use an extern type (possibly wrapped in a transparent newtype).

cc @oli-obk

@kennytm kennytm added A-FFI Area: Foreign function interface (FFI) regression-from-stable-to-nightly Performance or correctness regression from stable to nightly. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. C-bug Category: This is a bug. labels Oct 21, 2018
@oli-obk
Copy link
Contributor

oli-obk commented Oct 21, 2018

I don't see how this is a regression from stable as you need a feature gate to replicate the regression.

That said, I do think we should fix this for extern types. Should be doable by using the struct_tail method on the type and checking the final type for is_extern() || is_sized() instead of doing the current check

@mjbshaw
Copy link
Contributor Author

mjbshaw commented Oct 21, 2018

Thanks for the quick feedback and guidance on how to fix! If you don't mind, I'd like to take a stab at fixing this.

mjbshaw added a commit to mjbshaw/rust that referenced this issue Oct 22, 2018
kennytm added a commit to kennytm/rust that referenced this issue Oct 24, 2018
Allow extern statics with an extern type

Fixes rust-lang#55239
pietroalbini added a commit to pietroalbini/rust that referenced this issue Oct 25, 2018
Allow extern statics with an extern type

Fixes rust-lang#55239
Mark-Simulacrum added a commit to Mark-Simulacrum/rust that referenced this issue Oct 27, 2018
Allow extern statics with an extern type

Fixes rust-lang#55239
kennytm added a commit to kennytm/rust that referenced this issue Oct 28, 2018
Allow extern statics with an extern type

Fixes rust-lang#55239
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-FFI Area: Foreign function interface (FFI) C-bug Category: This is a bug. regression-from-stable-to-nightly Performance or correctness regression from stable to nightly. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

3 participants