1 | // RUN: %check_clang_tidy -std=c++17-or-later %s performance-enum-size %t -- \ |
2 | // RUN: -config="{CheckOptions: {performance-enum-size.EnumIgnoreList: '::IgnoredEnum;IgnoredSecondEnum'}}" |
3 | |
4 | namespace std |
5 | { |
6 | using uint8_t = unsigned char; |
7 | using int8_t = signed char; |
8 | using uint16_t = unsigned short; |
9 | using int16_t = signed short; |
10 | using uint32_t = unsigned int; |
11 | using int32_t = signed int; |
12 | } |
13 | |
14 | enum class Value |
15 | // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: enum 'Value' uses a larger base type ('int', size: 4 bytes) than necessary for its value set, consider using 'std::uint8_t' (1 byte) as the base type to reduce its size [performance-enum-size] |
16 | { |
17 | supported |
18 | }; |
19 | |
20 | |
21 | enum class EnumClass : std::int16_t |
22 | // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: enum 'EnumClass' uses a larger base type ('std::int16_t' (aka 'short'), size: 2 bytes) than necessary for its value set, consider using 'std::uint8_t' (1 byte) as the base type to reduce its size [performance-enum-size] |
23 | { |
24 | supported |
25 | }; |
26 | |
27 | enum EnumWithType : std::uint16_t |
28 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: enum 'EnumWithType' uses a larger base type ('std::uint16_t' (aka 'unsigned short'), size: 2 bytes) than necessary for its value set, consider using 'std::uint8_t' (1 byte) as the base type to reduce its size [performance-enum-size] |
29 | { |
30 | supported, |
31 | supported2 |
32 | }; |
33 | |
34 | enum EnumWithNegative |
35 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: enum 'EnumWithNegative' uses a larger base type ('int', size: 4 bytes) than necessary for its value set, consider using 'std::int8_t' (1 byte) as the base type to reduce its size [performance-enum-size] |
36 | { |
37 | s1 = -128, |
38 | s2 = -100, |
39 | s3 = 100, |
40 | s4 = 127 |
41 | }; |
42 | |
43 | enum EnumThatCanBeReducedTo2Bytes |
44 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: enum 'EnumThatCanBeReducedTo2Bytes' uses a larger base type ('int', size: 4 bytes) than necessary for its value set, consider using 'std::int16_t' (2 bytes) as the base type to reduce its size [performance-enum-size] |
45 | { |
46 | a1 = -128, |
47 | a2 = 0x6EEE |
48 | }; |
49 | |
50 | enum EnumOnlyNegative |
51 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: enum 'EnumOnlyNegative' uses a larger base type ('int', size: 4 bytes) than necessary for its value set, consider using 'std::int8_t' (1 byte) as the base type to reduce its size [performance-enum-size] |
52 | { |
53 | b1 = -125, |
54 | b2 = -50, |
55 | b3 = -10 |
56 | }; |
57 | |
58 | enum CorrectU8 : std::uint8_t |
59 | { |
60 | c01 = 10, |
61 | c02 = 11 |
62 | }; |
63 | |
64 | enum CorrectU16 : std::uint16_t |
65 | { |
66 | c11 = 10, |
67 | c12 = 0xFFFF |
68 | }; |
69 | |
70 | constexpr int getValue() |
71 | { |
72 | return 256; |
73 | } |
74 | |
75 | |
76 | enum CalculatedDueToUnknown1 : unsigned int |
77 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: enum 'CalculatedDueToUnknown1' uses a larger base type ('unsigned int', size: 4 bytes) than necessary for its value set, consider using 'std::uint16_t' (2 bytes) as the base type to reduce its size [performance-enum-size] |
78 | { |
79 | c21 = 10, |
80 | c22 = getValue() |
81 | }; |
82 | |
83 | enum CalculatedDueToUnknown2 : unsigned int |
84 | // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: enum 'CalculatedDueToUnknown2' uses a larger base type ('unsigned int', size: 4 bytes) than necessary for its value set, consider using 'std::uint16_t' (2 bytes) as the base type to reduce its size [performance-enum-size] |
85 | { |
86 | c31 = 10, |
87 | c32 = c31 + 246 |
88 | }; |
89 | |
90 | enum class IgnoredEnum : std::uint32_t |
91 | { |
92 | unused1 = 1, |
93 | unused2 = 2 |
94 | }; |
95 | |
96 | namespace internal |
97 | { |
98 | |
99 | enum class IgnoredSecondEnum |
100 | { |
101 | unused1 = 1, |
102 | unused2 = 2 |
103 | }; |
104 | |
105 | enum class EnumClassWithoutValues : int {}; |
106 | enum EnumWithoutValues {}; |
107 | |
108 | } |
109 | |