| // RUN: %check_clang_tidy %s altera-struct-pack-align %t -- -header-filter=.* |
| |
| // Struct needs both alignment and packing |
| struct error { |
| char a; |
| double b; |
| char c; |
| }; |
| // CHECK-MESSAGES: :[[@LINE-5]]:8: warning: accessing fields in struct 'error' is inefficient due to padding; only needs 10 bytes but is using 24 bytes [altera-struct-pack-align] |
| // CHECK-MESSAGES: :[[@LINE-6]]:8: note: use "__attribute__((packed))" to reduce the amount of padding applied to struct 'error' |
| // CHECK-MESSAGES: :[[@LINE-7]]:8: warning: accessing fields in struct 'error' is inefficient due to poor alignment; currently aligned to 8 bytes, but recommended alignment is 16 bytes [altera-struct-pack-align] |
| // CHECK-MESSAGES: :[[@LINE-8]]:8: note: use "__attribute__((aligned(16)))" to align struct 'error' to 16 bytes |
| // CHECK-FIXES: __attribute__((packed)) |
| // CHECK-FIXES: __attribute__((aligned(16))); |
| |
| // Struct is explicitly packed, but needs alignment |
| struct error_packed { |
| char a; |
| double b; |
| char c; |
| } __attribute__((packed)); |
| // CHECK-MESSAGES: :[[@LINE-5]]:8: warning: accessing fields in struct 'error_packed' is inefficient due to poor alignment; currently aligned to 1 bytes, but recommended alignment is 16 bytes [altera-struct-pack-align] |
| // CHECK-MESSAGES: :[[@LINE-6]]:8: note: use "__attribute__((aligned(16)))" to align struct 'error_packed' to 16 bytes |
| // CHECK-FIXES: __attribute__((aligned(16))) |
| |
| // Struct is properly packed, but needs alignment |
| struct align_only { |
| char a; |
| char b; |
| char c; |
| char d; |
| int e; |
| double f; |
| }; |
| // CHECK-MESSAGES: :[[@LINE-8]]:8: warning: accessing fields in struct 'align_only' is inefficient due to poor alignment; currently aligned to 8 bytes, but recommended alignment is 16 bytes [altera-struct-pack-align] |
| // CHECK-MESSAGES: :[[@LINE-9]]:8: note: use "__attribute__((aligned(16)))" to align struct 'align_only' to 16 bytes |
| // CHECK-FIXES: __attribute__((aligned(16))); |
| |
| // Struct is perfectly packed but wrongly aligned |
| struct bad_align { |
| char a; |
| double b; |
| char c; |
| } __attribute__((packed)) __attribute__((aligned(8))); |
| // CHECK-MESSAGES: :[[@LINE-5]]:8: warning: accessing fields in struct 'bad_align' is inefficient due to poor alignment; currently aligned to 8 bytes, but recommended alignment is 16 bytes [altera-struct-pack-align] |
| // CHECK-MESSAGES: :[[@LINE-6]]:8: note: use "__attribute__((aligned(16)))" to align struct 'bad_align' to 16 bytes |
| // CHECK-FIXES: __attribute__((aligned(16))); |
| |
| struct bad_align2 { |
| char a; |
| double b; |
| char c; |
| } __attribute__((packed)) __attribute__((aligned(32))); |
| // CHECK-MESSAGES: :[[@LINE-5]]:8: warning: accessing fields in struct 'bad_align2' is inefficient due to poor alignment; currently aligned to 32 bytes, but recommended alignment is 16 bytes [altera-struct-pack-align] |
| // CHECK-MESSAGES: :[[@LINE-6]]:8: note: use "__attribute__((aligned(16)))" to align struct 'bad_align2' to 16 bytes |
| // CHECK-FIXES: __attribute__((aligned(16))); |
| |
| struct bad_align3 { |
| char a; |
| double b; |
| char c; |
| } __attribute__((packed)) __attribute__((aligned(4))); |
| // CHECK-MESSAGES: :[[@LINE-5]]:8: warning: accessing fields in struct 'bad_align3' is inefficient due to poor alignment; currently aligned to 4 bytes, but recommended alignment is 16 bytes [altera-struct-pack-align] |
| // CHECK-MESSAGES: :[[@LINE-6]]:8: note: use "__attribute__((aligned(16)))" to align struct 'bad_align3' to 16 bytes |
| // CHECK-FIXES: __attribute__((aligned(16))); |
| |
| // Struct is both perfectly packed and aligned |
| struct success { |
| char a; |
| double b; |
| char c; |
| } __attribute__((packed)) __attribute__((aligned(16))); |
| //Should take 10 bytes and be aligned to 16 bytes |
| |
| // Struct is properly packed, and explicitly aligned |
| struct success2 { |
| int a; |
| int b; |
| int c; |
| } __attribute__((aligned(16))); |
| |
| // If struct is properly aligned, packing not needed |
| struct success3 { |
| char a; |
| double b; |
| char c; |
| } __attribute__((aligned(16))); |
| |
| // If struct is templated, warnings should not be triggered |
| template <typename A, typename B> |
| struct success4 { |
| A a; |
| B b; |
| int c; |
| }; |
| |
| // Warnings should not trigger on struct instantiations |
| void no_trigger_on_instantiation() { |
| struct bad_align3 instantiated { 'a', 0.001, 'b' }; |
| } |
| |