xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/bugprone/suspicious-enum-usage.cpp (revision fc19424d1d6d0df20e1734610a8e80a8e5158009)
1*fc19424dSPiotr Zegar // RUN: %check_clang_tidy -std=c++17 %s bugprone-suspicious-enum-usage %t -- -config="{CheckOptions: {bugprone-suspicious-enum-usage.StrictMode: false}}"
289a1d03eSRichard 
389a1d03eSRichard enum Empty {
489a1d03eSRichard };
589a1d03eSRichard 
689a1d03eSRichard enum A {
789a1d03eSRichard   A = 1,
889a1d03eSRichard   B = 2,
989a1d03eSRichard   C = 4,
1089a1d03eSRichard   D = 8,
1189a1d03eSRichard   E = 16,
1289a1d03eSRichard   F = 32,
1389a1d03eSRichard   G = 63
1489a1d03eSRichard };
1589a1d03eSRichard 
1689a1d03eSRichard enum X {
1789a1d03eSRichard   X = 8,
1889a1d03eSRichard   Y = 16,
1989a1d03eSRichard   Z = 4
2089a1d03eSRichard };
2189a1d03eSRichard 
2289a1d03eSRichard enum {
2389a1d03eSRichard   P = 2,
2489a1d03eSRichard   Q = 3,
2589a1d03eSRichard   R = 4,
2689a1d03eSRichard   S = 8,
2789a1d03eSRichard   T = 16
2889a1d03eSRichard };
2989a1d03eSRichard 
3089a1d03eSRichard enum {
3189a1d03eSRichard   H,
3289a1d03eSRichard   I,
3389a1d03eSRichard   J,
3489a1d03eSRichard   K,
3589a1d03eSRichard   L
3689a1d03eSRichard };
3789a1d03eSRichard 
3889a1d03eSRichard enum Days {
3989a1d03eSRichard   Monday,
4089a1d03eSRichard   Tuesday,
4189a1d03eSRichard   Wednesday,
4289a1d03eSRichard   Thursday,
4389a1d03eSRichard   Friday,
4489a1d03eSRichard   Saturday,
4589a1d03eSRichard   Sunday
4689a1d03eSRichard };
4789a1d03eSRichard 
bestDay()4889a1d03eSRichard Days bestDay() {
4989a1d03eSRichard   return Friday;
5089a1d03eSRichard }
5189a1d03eSRichard 
trigger()5289a1d03eSRichard int trigger() {
5389a1d03eSRichard   Empty EmptyVal;
5489a1d03eSRichard   int emptytest = EmptyVal | B;
5589a1d03eSRichard   if (bestDay() | A)
5689a1d03eSRichard     return 1;
5789a1d03eSRichard   // CHECK-NOTES: :[[@LINE-2]]:17: warning: enum values are from different enum types
5889a1d03eSRichard   if (I | Y)
5989a1d03eSRichard     return 1;
6089a1d03eSRichard   // CHECK-NOTES: :[[@LINE-2]]:9: warning: enum values are from different enum types
6189a1d03eSRichard }
6289a1d03eSRichard 
dont_trigger()6389a1d03eSRichard int dont_trigger() {
6489a1d03eSRichard   unsigned p;
6589a1d03eSRichard   p = Q | P;
6689a1d03eSRichard 
6789a1d03eSRichard   if (A + G == E)
6889a1d03eSRichard     return 1;
6989a1d03eSRichard   else if ((Q | R) == T)
7089a1d03eSRichard     return 1;
7189a1d03eSRichard   else
7289a1d03eSRichard     int k = T | Q;
7389a1d03eSRichard 
7489a1d03eSRichard   Empty EmptyVal;
7589a1d03eSRichard   int emptytest = EmptyVal | B;
7689a1d03eSRichard 
7789a1d03eSRichard   int a = 1, b = 5;
7889a1d03eSRichard   int c = a + b;
7989a1d03eSRichard   int d = c | H, e = b * a;
8089a1d03eSRichard   a = B | C;
8189a1d03eSRichard   b = X | Z;
8289a1d03eSRichard 
8389a1d03eSRichard   if (Tuesday != Monday + 1 ||
8489a1d03eSRichard       Friday - Thursday != 1 ||
8589a1d03eSRichard       Sunday + Wednesday == (Sunday | Wednesday))
8689a1d03eSRichard     return 1;
8789a1d03eSRichard   if (H + I + L == 42)
8889a1d03eSRichard     return 1;
8989a1d03eSRichard   return 42;
9089a1d03eSRichard }
9189a1d03eSRichard 
9289a1d03eSRichard namespace PR34400 {
9389a1d03eSRichard enum { E1 = 0 };
9489a1d03eSRichard enum { E2 = -1 };
9589a1d03eSRichard enum { l = E1 | E2 };
9689a1d03eSRichard }
97