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