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
getValue()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