xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/performance/enum-size.cpp (revision 3716b5b4bac6ab41291b6558ad0444cbcca04aa3)
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