Rollup merge of #110313 - fee1-dead-contrib:repr_align_method, r=WaffleLapkin

allow `repr(align = x)` on inherent methods

Discussion: https://github.com/rust-lang/rust/issues/82232#issuecomment-905929314
This commit is contained in:
Matthias Krüger 2023-04-17 18:13:34 +02:00 committed by GitHub
commit eb0524615c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 71 additions and 8 deletions

View file

@ -627,9 +627,9 @@ passes_attr_application_struct_enum_union =
attribute should be applied to a struct, enum, or union
.label = not a struct, enum, or union
passes_attr_application_struct_enum_function_union =
attribute should be applied to a struct, enum, function, or union
.label = not a struct, enum, function, or union
passes_attr_application_struct_enum_function_method_union =
attribute should be applied to a struct, enum, function, associated function, or union
.label = not a struct, enum, function, associated function, or union
passes_transparent_incompatible =
transparent {$target} cannot have other repr hints

View file

@ -1728,7 +1728,9 @@ impl CheckAttrVisitor<'_> {
}
}
sym::align => {
if let (Target::Fn, false) = (target, self.tcx.features().fn_align) {
if let (Target::Fn | Target::Method(MethodKind::Inherent), false) =
(target, self.tcx.features().fn_align)
{
feature_err(
&self.tcx.sess.parse_sess,
sym::fn_align,
@ -1739,10 +1741,14 @@ impl CheckAttrVisitor<'_> {
}
match target {
Target::Struct | Target::Union | Target::Enum | Target::Fn => continue,
Target::Struct
| Target::Union
| Target::Enum
| Target::Fn
| Target::Method(_) => continue,
_ => {
self.tcx.sess.emit_err(
errors::AttrApplication::StructEnumFunctionUnion {
errors::AttrApplication::StructEnumFunctionMethodUnion {
hint_span: hint.span(),
span,
},

View file

@ -1355,8 +1355,8 @@ pub enum AttrApplication {
#[label]
span: Span,
},
#[diag(passes_attr_application_struct_enum_function_union, code = "E0517")]
StructEnumFunctionUnion {
#[diag(passes_attr_application_struct_enum_function_method_union, code = "E0517")]
StructEnumFunctionMethodUnion {
#[primary_span]
hint_span: Span,
#[label]

View file

@ -7,3 +7,43 @@
#[no_mangle]
#[repr(align(16))]
pub fn fn_align() {}
pub struct A;
impl A {
// CHECK: align 16
#[no_mangle]
#[repr(align(16))]
pub fn method_align(self) {}
// CHECK: align 16
#[no_mangle]
#[repr(align(16))]
pub fn associated_fn() {}
}
trait T: Sized {
fn trait_fn() {}
// CHECK: align 32
#[repr(align(32))]
fn trait_method(self) {}
}
impl T for A {
// CHECK: align 16
#[no_mangle]
#[repr(align(16))]
fn trait_fn() {}
// CHECK: align 16
#[no_mangle]
#[repr(align(16))]
fn trait_method(self) {}
}
impl T for () {}
pub fn foo() {
().trait_method();
}

View file

@ -0,0 +1,5 @@
#[repr(align(16))]
//~^ ERROR attribute should be applied to a struct, enum, function, associated function, or union
pub type Foo = i32;
fn main() {}

View file

@ -0,0 +1,12 @@
error[E0517]: attribute should be applied to a struct, enum, function, associated function, or union
--> $DIR/invalid-repr.rs:1:8
|
LL | #[repr(align(16))]
| ^^^^^^^^^
LL |
LL | pub type Foo = i32;
| ------------------- not a struct, enum, function, associated function, or union
error: aborting due to previous error
For more information about this error, try `rustc --explain E0517`.