Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Add new safety enum for inner extern items #124455

Closed
wants to merge 2 commits into from

Conversation

spastorino
Copy link
Member

This is in preparation for unsafe extern blocks that adds a safe variant for functions inside extern blocks.

r? @compiler-errors

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Apr 27, 2024
@rustbot
Copy link
Collaborator

rustbot commented Apr 27, 2024

changes to the core type system

cc @compiler-errors, @lcnr

Some changes occurred in need_type_info.rs

cc @lcnr

This PR changes Stable MIR

cc @oli-obk, @celinval, @ouz-a

Some changes occurred to MIR optimizations

cc @rust-lang/wg-mir-opt

HIR ty lowering was modified

cc @fmease

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch 2 times, most recently from a01142f to 0a2dee6 Compare April 27, 2024 23:28
@rust-log-analyzer

This comment has been minimized.

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch from 0a2dee6 to 2cb0865 Compare April 27, 2024 23:41
@rustbot
Copy link
Collaborator

rustbot commented Apr 27, 2024

Some changes occurred in compiler/rustc_codegen_cranelift

cc @bjorn3

@rust-log-analyzer

This comment has been minimized.

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch from 2cb0865 to 903fe08 Compare April 28, 2024 01:37
@rustbot rustbot added the A-rustdoc-json Area: Rustdoc JSON backend label Apr 28, 2024
@rustbot
Copy link
Collaborator

rustbot commented Apr 28, 2024

Some changes occurred in src/librustdoc/clean/types.rs

cc @camelid

Some changes occurred in compiler/rustc_codegen_gcc

cc @antoyo, @GuillaumeGomez

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch from 903fe08 to 7eb2f20 Compare April 28, 2024 01:44
@rust-log-analyzer

This comment has been minimized.

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch from 7eb2f20 to 5da6fe9 Compare April 28, 2024 02:31
@rustbot
Copy link
Collaborator

rustbot commented Apr 28, 2024

Some changes occurred in src/tools/clippy

cc @rust-lang/clippy

@rust-log-analyzer

This comment has been minimized.

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch from 5da6fe9 to 10e8413 Compare April 28, 2024 03:48
@rustbot
Copy link
Collaborator

rustbot commented Apr 28, 2024

Some changes occurred in src/tools/rustfmt

cc @rust-lang/rustfmt

@oli-obk
Copy link
Contributor

oli-obk commented Apr 28, 2024

Why aren't we expanding the Unsafe enum instead? Is that too annoying for the places where Safe can't occur?

@spastorino
Copy link
Member Author

Why aren't we expanding the Unsafe enum instead? Is that too annoying for the places where Safe can't occur?

My reasoning was not only this but also so things can be a bit safer as we won't need to handle safe when it basically can't happen.

@spastorino
Copy link
Member Author

I'm having second thoughts about naming this FnSafety maybe just Safety is better as this is going to be applied to fns and statics.

#[derive(HashStable_Generic)]
pub enum FnSafety {
Unsafe(Span),
Default,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe name this Inherited or FromContext. Without an explanation it's not obvious what this is supposed to be

Copy link
Member Author

@spastorino spastorino Apr 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I've used Default as a way of saying no safety explicitly written means is going to take a default value.
Another possible name could be Implicit.
Out of all the values mentioned I slightly prefer Default but I don't mind changing it neither.
Another name we are using is Normal which I also think is not great, but it is another option.
Let's see if somebody else have some thought about this.

@oli-obk
Copy link
Contributor

oli-obk commented Apr 29, 2024

I'm having second thoughts about naming this FnSafety maybe just Safety is better as this is going to be applied to fns and statics.

Yea, just naming it Safety is fine as long as there's an explanation why it's different from Unsafe

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch from 10e8413 to 84138b2 Compare April 29, 2024 13:09
@rust-log-analyzer

This comment has been minimized.

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch from 84138b2 to 16bf3a7 Compare April 29, 2024 13:14
@rust-log-analyzer

This comment has been minimized.

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch 2 times, most recently from fdee834 to bd43f67 Compare April 29, 2024 13:55
@rust-log-analyzer

This comment has been minimized.

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch from bd43f67 to 0256365 Compare April 29, 2024 14:12
@rust-log-analyzer

This comment has been minimized.

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch 2 times, most recently from 3824cb3 to 6b76cac Compare April 29, 2024 17:40
@spastorino spastorino changed the title Add new fn safety enum for functions Add new safety enum for inner extern items Apr 30, 2024
@bors
Copy link
Contributor

bors commented May 2, 2024

☔ The latest upstream changes (presumably #124621) made this pull request unmergeable. Please resolve the merge conflicts.

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch from 6b76cac to e36f233 Compare May 3, 2024 14:11
@rust-log-analyzer

This comment has been minimized.

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch from e36f233 to 478644e Compare May 3, 2024 14:39
@bors
Copy link
Contributor

bors commented May 4, 2024

☔ The latest upstream changes (presumably #123602) made this pull request unmergeable. Please resolve the merge conflicts.

@@ -913,10 +913,16 @@ pub enum Mutability {
Mut,
}

#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum Unsafe {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please add documentation to these two enumerations? It isn't clear to me why we need two different enumerations here.

#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum Safety {
Unsafe,
Normal,
Default,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't we already know if a function / static is safe or unsafe by the time we are translating to StableMIR? If so, wouldn't it be better to keep Unsafe / Safe (Normal)?

I'm assuming that the way this is designed today, the Default value will require users to perform an extra query to know the context where this Fn / Static was declared to know whether it is safe or not.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BTW, this is just a suggestion. I know this is a big change already. If it makes sense, maybe just add a fixme comment for us to improve this later. Thanks

@spastorino
Copy link
Member Author

spastorino commented May 13, 2024

I'm going to wait on a review and decision about this or #125077 or any other alternative before solving the conflicts and @celinval's thoughts as it is a lot of work to keep all these in a mergeable state.

@spastorino spastorino force-pushed the add-new-fnsafety-enum branch from 478644e to 6e798b4 Compare May 16, 2024 20:55
@spastorino
Copy link
Member Author

I think is better if for now we just do #125077

@spastorino spastorino closed this May 17, 2024
bors added a commit to rust-lang-ci/rust that referenced this pull request May 18, 2024
…=jackh726

Rename Unsafe to Safety

Alternative to rust-lang#124455, which is to just have one Safety enum to use everywhere, this opens the posibility of adding `ast::Safety::Safe` that's useful for unsafe extern blocks.

This leaves us today with:

```rust
enum ast::Safety {
    Unsafe(Span),
    Default,
    // Safe (going to be added for unsafe extern blocks)
}

enum hir::Safety {
    Unsafe,
    Safe,
}
```

We would convert from `ast::Safety::Default` into the right Safety level according the context.
bors added a commit to rust-lang-ci/rust that referenced this pull request May 30, 2024
…=jackh726

Rename Unsafe to Safety

Alternative to rust-lang#124455, which is to just have one Safety enum to use everywhere, this opens the posibility of adding `ast::Safety::Safe` that's useful for unsafe extern blocks.

This leaves us today with:

```rust
enum ast::Safety {
    Unsafe(Span),
    Default,
    // Safe (going to be added for unsafe extern blocks)
}

enum hir::Safety {
    Unsafe,
    Safe,
}
```

We would convert from `ast::Safety::Default` into the right Safety level according the context.
tgross35 added a commit to tgross35/rust that referenced this pull request Aug 3, 2024
…-blocks, r=compiler-errors

Stabilize unsafe extern blocks (RFC 3484)

# Stabilization report

## Summary

This is a tracking issue for the RFC 3484: Unsafe Extern Blocks

We are stabilizing `#![feature(unsafe_extern_blocks)]`, as described in [Unsafe Extern Blocks RFC 3484](rust-lang/rfcs#3484). This feature makes explicit that declaring an extern block is unsafe. Starting in Rust 2024, all extern blocks must be marked as unsafe. In all editions, items within unsafe extern blocks may be marked as safe to use.

RFC: rust-lang/rfcs#3484
Tracking issue: rust-lang#123743

## What is stabilized

### Summary of stabilization

We now need extern blocks to be marked as unsafe and items inside can also have safety modifiers (unsafe or safe), by default items with no modifiers are unsafe to offer easy migration without surprising results.

```rust
unsafe extern {
    // sqrt (from libm) may be called with any `f64`
    pub safe fn sqrt(x: f64) -> f64;

    // strlen (from libc) requires a valid pointer,
    // so we mark it as being an unsafe fn
    pub unsafe fn strlen(p: *const c_char) -> usize;

    // this function doesn't say safe or unsafe, so it defaults to unsafe
    pub fn free(p: *mut core::ffi::c_void);

    pub safe static IMPORTANT_BYTES: [u8; 256];

    pub safe static LINES: SyncUnsafeCell<i32>;
}
```

## Tests

The relevant tests are in `tests/ui/rust-2024/unsafe-extern-blocks`.

## History

- rust-lang#124482
- rust-lang#124455
- rust-lang#125077
- rust-lang#125522
- rust-lang#126738
- rust-lang#126749
- rust-lang#126755
- rust-lang#126757
- rust-lang#126758
- rust-lang#126756
- rust-lang#126973
- rust-lang#127535
- rust-lang/rustfmt#6204

## Unresolved questions

I am not aware of any unresolved questions.
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Aug 3, 2024
…-blocks, r=compiler-errors

Stabilize unsafe extern blocks (RFC 3484)

# Stabilization report

## Summary

This is a tracking issue for the RFC 3484: Unsafe Extern Blocks

We are stabilizing `#![feature(unsafe_extern_blocks)]`, as described in [Unsafe Extern Blocks RFC 3484](rust-lang/rfcs#3484). This feature makes explicit that declaring an extern block is unsafe. Starting in Rust 2024, all extern blocks must be marked as unsafe. In all editions, items within unsafe extern blocks may be marked as safe to use.

RFC: rust-lang/rfcs#3484
Tracking issue: rust-lang#123743

## What is stabilized

### Summary of stabilization

We now need extern blocks to be marked as unsafe and items inside can also have safety modifiers (unsafe or safe), by default items with no modifiers are unsafe to offer easy migration without surprising results.

```rust
unsafe extern {
    // sqrt (from libm) may be called with any `f64`
    pub safe fn sqrt(x: f64) -> f64;

    // strlen (from libc) requires a valid pointer,
    // so we mark it as being an unsafe fn
    pub unsafe fn strlen(p: *const c_char) -> usize;

    // this function doesn't say safe or unsafe, so it defaults to unsafe
    pub fn free(p: *mut core::ffi::c_void);

    pub safe static IMPORTANT_BYTES: [u8; 256];

    pub safe static LINES: SyncUnsafeCell<i32>;
}
```

## Tests

The relevant tests are in `tests/ui/rust-2024/unsafe-extern-blocks`.

## History

- rust-lang#124482
- rust-lang#124455
- rust-lang#125077
- rust-lang#125522
- rust-lang#126738
- rust-lang#126749
- rust-lang#126755
- rust-lang#126757
- rust-lang#126758
- rust-lang#126756
- rust-lang#126973
- rust-lang#127535
- rust-lang/rustfmt#6204

## Unresolved questions

I am not aware of any unresolved questions.
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Aug 3, 2024
Rollup merge of rust-lang#127921 - spastorino:stabilize-unsafe-extern-blocks, r=compiler-errors

Stabilize unsafe extern blocks (RFC 3484)

# Stabilization report

## Summary

This is a tracking issue for the RFC 3484: Unsafe Extern Blocks

We are stabilizing `#![feature(unsafe_extern_blocks)]`, as described in [Unsafe Extern Blocks RFC 3484](rust-lang/rfcs#3484). This feature makes explicit that declaring an extern block is unsafe. Starting in Rust 2024, all extern blocks must be marked as unsafe. In all editions, items within unsafe extern blocks may be marked as safe to use.

RFC: rust-lang/rfcs#3484
Tracking issue: rust-lang#123743

## What is stabilized

### Summary of stabilization

We now need extern blocks to be marked as unsafe and items inside can also have safety modifiers (unsafe or safe), by default items with no modifiers are unsafe to offer easy migration without surprising results.

```rust
unsafe extern {
    // sqrt (from libm) may be called with any `f64`
    pub safe fn sqrt(x: f64) -> f64;

    // strlen (from libc) requires a valid pointer,
    // so we mark it as being an unsafe fn
    pub unsafe fn strlen(p: *const c_char) -> usize;

    // this function doesn't say safe or unsafe, so it defaults to unsafe
    pub fn free(p: *mut core::ffi::c_void);

    pub safe static IMPORTANT_BYTES: [u8; 256];

    pub safe static LINES: SyncUnsafeCell<i32>;
}
```

## Tests

The relevant tests are in `tests/ui/rust-2024/unsafe-extern-blocks`.

## History

- rust-lang#124482
- rust-lang#124455
- rust-lang#125077
- rust-lang#125522
- rust-lang#126738
- rust-lang#126749
- rust-lang#126755
- rust-lang#126757
- rust-lang#126758
- rust-lang#126756
- rust-lang#126973
- rust-lang#127535
- rust-lang/rustfmt#6204

## Unresolved questions

I am not aware of any unresolved questions.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-rustdoc-json Area: Rustdoc JSON backend S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants