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