Auto merge of #114201 - Centri3:explicit-repr-rust, r=WaffleLapkin
Allow explicit `#[repr(Rust)]` This is identical to no `repr()` at all. For `Rust, packed` and `Rust, align(x)`, it should be the same as no `Rust` at all (as, afaik, `#[repr(align(16))]` uses the Rust ABI.) The main use case for this is being able to explicitly say "I want to use the Rust ABI" in very very rare circumstances where the first obvious choice would be the C ABI yet is undesirable, which is already possible with functions as `extern "Rust"`. This would be useful for silencing https://github.com/rust-lang/rust-clippy/pull/11253. It's also more consistent with `extern`. The lack of this also tripped me up a bit when I was new to Rust, as I expected this to be possible.
This commit is contained in:
commit
4354192429
7 changed files with 24 additions and 8 deletions
|
@ -937,6 +937,7 @@ pub fn find_deprecation(
|
|||
#[derive(PartialEq, Debug, Encodable, Decodable, Copy, Clone)]
|
||||
pub enum ReprAttr {
|
||||
ReprInt(IntType),
|
||||
ReprRust,
|
||||
ReprC,
|
||||
ReprPacked(u32),
|
||||
ReprSimd,
|
||||
|
@ -985,6 +986,7 @@ pub fn parse_repr_attr(sess: &Session, attr: &Attribute) -> Vec<ReprAttr> {
|
|||
let mut recognised = false;
|
||||
if item.is_word() {
|
||||
let hint = match item.name_or_empty() {
|
||||
sym::Rust => Some(ReprRust),
|
||||
sym::C => Some(ReprC),
|
||||
sym::packed => Some(ReprPacked(1)),
|
||||
sym::simd => Some(ReprSimd),
|
||||
|
|
|
@ -2150,6 +2150,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
for attr in self.get_attrs(did, sym::repr) {
|
||||
for r in attr::parse_repr_attr(&self.sess, attr) {
|
||||
flags.insert(match r {
|
||||
attr::ReprRust => ReprFlags::empty(),
|
||||
attr::ReprC => ReprFlags::IS_C,
|
||||
attr::ReprPacked(pack) => {
|
||||
let pack = Align::from_bytes(pack as u64).unwrap();
|
||||
|
|
|
@ -721,7 +721,7 @@ passes_unrecognized_field =
|
|||
|
||||
passes_unrecognized_repr_hint =
|
||||
unrecognized representation hint
|
||||
.help = valid reprs are `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
.help = valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
|
||||
passes_unused =
|
||||
unused attribute
|
||||
|
|
|
@ -1732,6 +1732,7 @@ impl CheckAttrVisitor<'_> {
|
|||
}
|
||||
|
||||
match hint.name_or_empty() {
|
||||
sym::Rust => {}
|
||||
sym::C => {
|
||||
is_c = true;
|
||||
match target {
|
||||
|
|
12
tests/ui/abi/explicit_repr_rust.rs
Normal file
12
tests/ui/abi/explicit_repr_rust.rs
Normal file
|
@ -0,0 +1,12 @@
|
|||
// check-pass
|
||||
|
||||
#[repr(Rust)]
|
||||
struct A;
|
||||
|
||||
#[repr(Rust, align(16))]
|
||||
struct B;
|
||||
|
||||
#[repr(Rust, packed)]
|
||||
struct C;
|
||||
|
||||
fn main() {}
|
|
@ -32,7 +32,7 @@ error[E0552]: unrecognized representation hint
|
|||
LL | #[repr(nothing)]
|
||||
| ^^^^^^^
|
||||
|
|
||||
= help: valid reprs are `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
= help: valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
|
||||
error[E0552]: unrecognized representation hint
|
||||
--> $DIR/issue-43988.rs:18:12
|
||||
|
@ -40,7 +40,7 @@ error[E0552]: unrecognized representation hint
|
|||
LL | #[repr(something_not_real)]
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: valid reprs are `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
= help: valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
|
||||
error[E0518]: attribute should be applied to function or closure
|
||||
--> $DIR/issue-43988.rs:30:5
|
||||
|
|
|
@ -4,7 +4,7 @@ error[E0552]: unrecognized representation hint
|
|||
LL | #[repr(uwu)]
|
||||
| ^^^
|
||||
|
|
||||
= help: valid reprs are `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
= help: valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
|
||||
error[E0552]: unrecognized representation hint
|
||||
--> $DIR/invalid_repr_list_help.rs:6:8
|
||||
|
@ -12,7 +12,7 @@ error[E0552]: unrecognized representation hint
|
|||
LL | #[repr(uwu = "a")]
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= help: valid reprs are `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
= help: valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
|
||||
error[E0552]: unrecognized representation hint
|
||||
--> $DIR/invalid_repr_list_help.rs:9:8
|
||||
|
@ -20,7 +20,7 @@ error[E0552]: unrecognized representation hint
|
|||
LL | #[repr(uwu(4))]
|
||||
| ^^^^^^
|
||||
|
|
||||
= help: valid reprs are `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
= help: valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
|
||||
error[E0552]: unrecognized representation hint
|
||||
--> $DIR/invalid_repr_list_help.rs:14:8
|
||||
|
@ -28,7 +28,7 @@ error[E0552]: unrecognized representation hint
|
|||
LL | #[repr(uwu, u8)]
|
||||
| ^^^
|
||||
|
|
||||
= help: valid reprs are `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
= help: valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
|
||||
warning: unknown `doc` attribute `owo`
|
||||
--> $DIR/invalid_repr_list_help.rs:20:7
|
||||
|
@ -46,7 +46,7 @@ error[E0552]: unrecognized representation hint
|
|||
LL | #[repr(uwu)]
|
||||
| ^^^
|
||||
|
|
||||
= help: valid reprs are `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
= help: valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||
|
||||
error: aborting due to 5 previous errors; 1 warning emitted
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue