1*fc19424dSPiotr Zegar // RUN: %check_clang_tidy -std=c++17 %s bugprone-suspicious-enum-usage %t -- -config="{CheckOptions: {bugprone-suspicious-enum-usage.StrictMode: true}}" --
289a1d03eSRichard 
389a1d03eSRichard enum A {
489a1d03eSRichard   A = 1,
589a1d03eSRichard   B = 2,
689a1d03eSRichard   C = 4,
789a1d03eSRichard   D = 8,
889a1d03eSRichard   E = 16,
989a1d03eSRichard   F = 32,
1089a1d03eSRichard   G = 63
1189a1d03eSRichard };
1289a1d03eSRichard 
1389a1d03eSRichard // CHECK-NOTES: :[[@LINE+2]]:1: warning: enum type seems like a bitmask (contains mostly power-of-2 literals) but a literal is not power-of-2
1489a1d03eSRichard // CHECK-NOTES: :76:7: note: used here as a bitmask
1589a1d03eSRichard enum X {
1689a1d03eSRichard   X = 8,
1789a1d03eSRichard   Y = 16,
1889a1d03eSRichard   Z = 4,
1989a1d03eSRichard   ZZ = 3
2089a1d03eSRichard   // CHECK-NOTES: :[[@LINE-1]]:3: warning: enum type seems like a bitmask (contains mostly power-of-2 literals), but this literal is not a power-of-2 [bugprone-suspicious-enum-usage]
2189a1d03eSRichard // CHECK-NOTES: :70:13: note: used here as a bitmask
2289a1d03eSRichard };
2389a1d03eSRichard // CHECK-NOTES: :[[@LINE+2]]:1: warning: enum type seems like a bitmask (contains mostly power-of-2 literals) but some literals are not power-of-2
2489a1d03eSRichard // CHECK-NOTES: :73:8: note: used here as a bitmask
2589a1d03eSRichard enum PP {
2689a1d03eSRichard   P = 2,
2789a1d03eSRichard   Q = 3,
2889a1d03eSRichard   // CHECK-NOTES: :[[@LINE-1]]:3: warning: enum type seems like a bitmask (contains mostly power-of-2 literals), but this literal is not a power-of-2
2989a1d03eSRichard   // CHECK-NOTES: :65:11: note: used here as a bitmask
3089a1d03eSRichard   R = 4,
3189a1d03eSRichard   S = 8,
3289a1d03eSRichard   T = 16,
3389a1d03eSRichard   U = 31
3489a1d03eSRichard };
3589a1d03eSRichard 
3689a1d03eSRichard enum {
3789a1d03eSRichard   H,
3889a1d03eSRichard   I,
3989a1d03eSRichard   J,
4089a1d03eSRichard   K,
4189a1d03eSRichard   L
4289a1d03eSRichard };
4389a1d03eSRichard 
4489a1d03eSRichard enum Days {
4589a1d03eSRichard   Monday,
4689a1d03eSRichard   Tuesday,
4789a1d03eSRichard   Wednesday,
4889a1d03eSRichard   Thursday,
4989a1d03eSRichard   Friday,
5089a1d03eSRichard   Saturday,
5189a1d03eSRichard   Sunday
5289a1d03eSRichard };
5389a1d03eSRichard 
bestDay()5489a1d03eSRichard Days bestDay() {
5589a1d03eSRichard   return Friday;
5689a1d03eSRichard }
5789a1d03eSRichard 
trigger()5889a1d03eSRichard int trigger() {
5989a1d03eSRichard   if (bestDay() | A)
6089a1d03eSRichard     return 1;
6189a1d03eSRichard   // CHECK-NOTES: :[[@LINE-2]]:17: warning: enum values are from different enum types
6289a1d03eSRichard   if (I | Y)
6389a1d03eSRichard     return 1;
6489a1d03eSRichard   // CHECK-NOTES: :[[@LINE-2]]:9: warning: enum values are from different enum types
6589a1d03eSRichard   if (P + Q == R)
6689a1d03eSRichard     return 1;
6789a1d03eSRichard   else if ((S | R) == T)
6889a1d03eSRichard     return 1;
6989a1d03eSRichard   else
7089a1d03eSRichard     int k = ZZ | Z;
7189a1d03eSRichard   unsigned p = R;
7289a1d03eSRichard   PP pp = Q;
7389a1d03eSRichard   p |= pp;
7489a1d03eSRichard 
7589a1d03eSRichard   enum X x = Z;
7689a1d03eSRichard   p = x | Z;
7789a1d03eSRichard   return 0;
7889a1d03eSRichard }
7989a1d03eSRichard 
dont_trigger()8089a1d03eSRichard int dont_trigger() {
8189a1d03eSRichard   int a = 1, b = 5;
8289a1d03eSRichard   int c = a + b;
8389a1d03eSRichard   int d = c | H, e = b * a;
8489a1d03eSRichard   a = B | C;
8589a1d03eSRichard   b = X | Z;
8689a1d03eSRichard 
8789a1d03eSRichard   unsigned bitflag;
8889a1d03eSRichard   enum A aa = B;
8989a1d03eSRichard   bitflag = aa | C;
9089a1d03eSRichard 
9189a1d03eSRichard   if (Tuesday != Monday + 1 ||
9289a1d03eSRichard       Friday - Thursday != 1 ||
9389a1d03eSRichard       Sunday + Wednesday == (Sunday | Wednesday))
9489a1d03eSRichard     return 1;
9589a1d03eSRichard   if (H + I + L == 42)
9689a1d03eSRichard     return 1;
9789a1d03eSRichard   return 42;
9889a1d03eSRichard }
99