2021-10-21 11:11:36 +00:00
#![ warn(clippy::trailing_empty_array) ]
// Do lint:
struct RarelyUseful {
2023-07-28 19:35:48 +00:00
//~^ ERROR: trailing zero-sized array in a struct which is not marked with a `repr` attrib
2021-10-21 11:11:36 +00:00
field : i32 ,
last : [ usize ; 0 ] ,
}
struct OnlyField {
2023-07-28 19:35:48 +00:00
//~^ ERROR: trailing zero-sized array in a struct which is not marked with a `repr` attrib
2021-10-21 11:11:36 +00:00
first_and_last : [ usize ; 0 ] ,
}
struct GenericArrayType < T > {
2023-07-28 19:35:48 +00:00
//~^ ERROR: trailing zero-sized array in a struct which is not marked with a `repr` attrib
2021-10-21 11:11:36 +00:00
field : i32 ,
last : [ T ; 0 ] ,
}
#[ must_use ]
struct OnlyAnotherAttribute {
2023-07-28 19:35:48 +00:00
//~^ ERROR: trailing zero-sized array in a struct which is not marked with a `repr` attrib
2021-10-21 11:11:36 +00:00
field : i32 ,
last : [ usize ; 0 ] ,
}
#[ derive(Debug) ]
struct OnlyADeriveAttribute {
2023-07-28 19:35:48 +00:00
//~^ ERROR: trailing zero-sized array in a struct which is not marked with a `repr` attrib
2021-10-21 11:11:36 +00:00
field : i32 ,
last : [ usize ; 0 ] ,
}
const ZERO : usize = 0 ;
struct ZeroSizedWithConst {
2023-07-28 19:35:48 +00:00
//~^ ERROR: trailing zero-sized array in a struct which is not marked with a `repr` attrib
2021-10-21 11:11:36 +00:00
field : i32 ,
last : [ usize ; ZERO ] ,
}
#[ allow(clippy::eq_op) ]
const fn compute_zero ( ) -> usize {
( 4 + 6 ) - ( 2 * 5 )
}
struct ZeroSizedWithConstFunction {
2023-07-28 19:35:48 +00:00
//~^ ERROR: trailing zero-sized array in a struct which is not marked with a `repr` attrib
2021-10-21 11:11:36 +00:00
field : i32 ,
last : [ usize ; compute_zero ( ) ] ,
}
const fn compute_zero_from_arg ( x : usize ) -> usize {
x - 1
}
struct ZeroSizedWithConstFunction2 {
2023-07-28 19:35:48 +00:00
//~^ ERROR: trailing zero-sized array in a struct which is not marked with a `repr` attrib
2021-10-21 11:11:36 +00:00
field : i32 ,
last : [ usize ; compute_zero_from_arg ( 1 ) ] ,
}
struct ZeroSizedArrayWrapper ( [ usize ; 0 ] ) ;
2023-07-28 19:35:48 +00:00
//~^ ERROR: trailing zero-sized array in a struct which is not marked with a `repr` attrib
2021-10-21 11:11:36 +00:00
struct TupleStruct ( i32 , [ usize ; 0 ] ) ;
2023-07-28 19:35:48 +00:00
//~^ ERROR: trailing zero-sized array in a struct which is not marked with a `repr` attrib
2021-10-21 11:11:36 +00:00
struct LotsOfFields {
2023-07-28 19:35:48 +00:00
//~^ ERROR: trailing zero-sized array in a struct which is not marked with a `repr` attrib
2021-10-21 11:11:36 +00:00
f1 : u32 ,
f2 : u32 ,
f3 : u32 ,
f4 : u32 ,
f5 : u32 ,
f6 : u32 ,
f7 : u32 ,
f8 : u32 ,
f9 : u32 ,
f10 : u32 ,
f11 : u32 ,
f12 : u32 ,
f13 : u32 ,
f14 : u32 ,
f15 : u32 ,
f16 : u32 ,
last : [ usize ; 0 ] ,
}
// Don't lint
#[ repr(C) ]
struct GoodReason {
field : i32 ,
last : [ usize ; 0 ] ,
}
#[ repr(C) ]
struct OnlyFieldWithReprC {
first_and_last : [ usize ; 0 ] ,
}
struct NonZeroSizedArray {
field : i32 ,
last : [ usize ; 1 ] ,
}
struct NotLastField {
f1 : u32 ,
zero_sized : [ usize ; 0 ] ,
last : i32 ,
}
const ONE : usize = 1 ;
struct NonZeroSizedWithConst {
field : i32 ,
last : [ usize ; ONE ] ,
}
#[ derive(Debug) ]
#[ repr(C) ]
struct AlsoADeriveAttribute {
field : i32 ,
last : [ usize ; 0 ] ,
}
#[ must_use ]
#[ repr(C) ]
struct AlsoAnotherAttribute {
field : i32 ,
last : [ usize ; 0 ] ,
}
#[ repr(packed) ]
struct ReprPacked {
field : i32 ,
last : [ usize ; 0 ] ,
}
#[ repr(C, packed) ]
struct ReprCPacked {
field : i32 ,
last : [ usize ; 0 ] ,
}
#[ repr(align(64)) ]
struct ReprAlign {
field : i32 ,
last : [ usize ; 0 ] ,
}
#[ repr(C, align(64)) ]
struct ReprCAlign {
field : i32 ,
last : [ usize ; 0 ] ,
}
// NOTE: because of https://doc.rust-lang.org/stable/reference/type-layout.html#primitive-representation-of-enums-with-fields and I'm not sure when in the compilation pipeline that would happen
#[ repr(C) ]
2023-04-13 21:59:01 +00:00
enum DontLintAnonymousStructsFromDesugaring {
2021-10-21 11:11:36 +00:00
A ( u32 ) ,
B ( f32 , [ u64 ; 0 ] ) ,
C { x : u32 , y : [ u64 ; 0 ] } ,
}
#[ repr(C) ]
struct TupleStructReprC ( i32 , [ usize ; 0 ] ) ;
type NamedTuple = ( i32 , [ usize ; 0 ] ) ;
struct ConstParamZeroDefault < const N : usize = 0 > {
field : i32 ,
last : [ usize ; N ] ,
}
struct ConstParamNoDefault < const N : usize > {
field : i32 ,
last : [ usize ; N ] ,
}
struct ConstParamNonZeroDefault < const N : usize = 1 > {
field : i32 ,
last : [ usize ; N ] ,
}
struct TwoGenericParams < T , const N : usize > {
field : i32 ,
last : [ T ; N ] ,
}
type A = ConstParamZeroDefault ;
type B = ConstParamZeroDefault < 0 > ;
type C = ConstParamNoDefault < 0 > ;
type D = ConstParamNonZeroDefault < 0 > ;
fn main ( ) { }