xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/performance/enum-size.cpp (revision 3716b5b4bac6ab41291b6558ad0444cbcca04aa3)
13397dae6SPiotr Zegar // RUN: %check_clang_tidy -std=c++17-or-later %s performance-enum-size %t -- \
21af159e9SPiotr Zegar // RUN:   -config="{CheckOptions: {performance-enum-size.EnumIgnoreList: '::IgnoredEnum;IgnoredSecondEnum'}}"
33397dae6SPiotr Zegar 
43397dae6SPiotr Zegar namespace std
53397dae6SPiotr Zegar {
63397dae6SPiotr Zegar using uint8_t = unsigned char;
73397dae6SPiotr Zegar using int8_t = signed char;
83397dae6SPiotr Zegar using uint16_t = unsigned short;
93397dae6SPiotr Zegar using int16_t = signed short;
103397dae6SPiotr Zegar using uint32_t = unsigned int;
113397dae6SPiotr Zegar using int32_t = signed int;
123397dae6SPiotr Zegar }
133397dae6SPiotr Zegar 
143397dae6SPiotr Zegar enum class Value
153397dae6SPiotr Zegar // 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]
163397dae6SPiotr Zegar {
173397dae6SPiotr Zegar     supported
183397dae6SPiotr Zegar };
193397dae6SPiotr Zegar 
203397dae6SPiotr Zegar 
213397dae6SPiotr Zegar enum class EnumClass : std::int16_t
223397dae6SPiotr Zegar // 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]
233397dae6SPiotr Zegar {
243397dae6SPiotr Zegar     supported
253397dae6SPiotr Zegar };
263397dae6SPiotr Zegar 
273397dae6SPiotr Zegar enum EnumWithType : std::uint16_t
283397dae6SPiotr Zegar // 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]
293397dae6SPiotr Zegar {
303397dae6SPiotr Zegar     supported,
313397dae6SPiotr Zegar     supported2
323397dae6SPiotr Zegar };
333397dae6SPiotr Zegar 
343397dae6SPiotr Zegar enum EnumWithNegative
353397dae6SPiotr Zegar // 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]
363397dae6SPiotr Zegar {
373397dae6SPiotr Zegar     s1 = -128,
383397dae6SPiotr Zegar     s2 = -100,
393397dae6SPiotr Zegar     s3 = 100,
403397dae6SPiotr Zegar     s4 = 127
413397dae6SPiotr Zegar };
423397dae6SPiotr Zegar 
433397dae6SPiotr Zegar enum EnumThatCanBeReducedTo2Bytes
443397dae6SPiotr Zegar // 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]
453397dae6SPiotr Zegar {
463397dae6SPiotr Zegar     a1 = -128,
473397dae6SPiotr Zegar     a2 = 0x6EEE
483397dae6SPiotr Zegar };
493397dae6SPiotr Zegar 
503397dae6SPiotr Zegar enum EnumOnlyNegative
513397dae6SPiotr Zegar // 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]
523397dae6SPiotr Zegar {
533397dae6SPiotr Zegar     b1 = -125,
543397dae6SPiotr Zegar     b2 = -50,
553397dae6SPiotr Zegar     b3 = -10
563397dae6SPiotr Zegar };
573397dae6SPiotr Zegar 
583397dae6SPiotr Zegar enum CorrectU8 : std::uint8_t
593397dae6SPiotr Zegar {
603397dae6SPiotr Zegar     c01 = 10,
613397dae6SPiotr Zegar     c02 = 11
623397dae6SPiotr Zegar };
633397dae6SPiotr Zegar 
643397dae6SPiotr Zegar enum CorrectU16 : std::uint16_t
653397dae6SPiotr Zegar {
663397dae6SPiotr Zegar     c11 = 10,
673397dae6SPiotr Zegar     c12 = 0xFFFF
683397dae6SPiotr Zegar };
693397dae6SPiotr Zegar 
getValue()703397dae6SPiotr Zegar constexpr int getValue()
713397dae6SPiotr Zegar {
723397dae6SPiotr Zegar     return 256;
733397dae6SPiotr Zegar }
743397dae6SPiotr Zegar 
753397dae6SPiotr Zegar 
763397dae6SPiotr Zegar enum CalculatedDueToUnknown1 : unsigned int
773397dae6SPiotr Zegar // 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]
783397dae6SPiotr Zegar {
793397dae6SPiotr Zegar     c21 = 10,
803397dae6SPiotr Zegar     c22 = getValue()
813397dae6SPiotr Zegar };
823397dae6SPiotr Zegar 
833397dae6SPiotr Zegar enum CalculatedDueToUnknown2 : unsigned int
843397dae6SPiotr Zegar // 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]
853397dae6SPiotr Zegar {
863397dae6SPiotr Zegar     c31 = 10,
873397dae6SPiotr Zegar     c32 = c31 + 246
883397dae6SPiotr Zegar };
893397dae6SPiotr Zegar 
903397dae6SPiotr Zegar enum class IgnoredEnum : std::uint32_t
913397dae6SPiotr Zegar {
923397dae6SPiotr Zegar     unused1 = 1,
933397dae6SPiotr Zegar     unused2 = 2
943397dae6SPiotr Zegar };
953397dae6SPiotr Zegar 
963397dae6SPiotr Zegar namespace internal
973397dae6SPiotr Zegar {
983397dae6SPiotr Zegar 
993397dae6SPiotr Zegar enum class IgnoredSecondEnum
1003397dae6SPiotr Zegar {
1013397dae6SPiotr Zegar     unused1 = 1,
1023397dae6SPiotr Zegar     unused2 = 2
1033397dae6SPiotr Zegar };
1043397dae6SPiotr Zegar 
105*3716b5b4SPiotr Zegar enum class EnumClassWithoutValues : int {};
106*3716b5b4SPiotr Zegar enum EnumWithoutValues {};
107*3716b5b4SPiotr Zegar 
1083397dae6SPiotr Zegar }
109