annotate unittests/ADT/BitmaskEnumTest.cpp @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents c2174574ed3a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 //===- llvm/unittest/ADT/BitmaskEnumTest.cpp - BitmaskEnum unit tests -----===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 //
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 120
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 120
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 120
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9 #include "llvm/ADT/BitmaskEnum.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 #include "gtest/gtest.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 using namespace llvm;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 namespace {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15 enum Flags {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16 F0 = 0,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17 F1 = 1,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18 F2 = 2,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19 F3 = 4,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 F4 = 8,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21 LLVM_MARK_AS_BITMASK_ENUM(F4)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24 TEST(BitmaskEnumTest, BitwiseOr) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25 Flags f = F1 | F2;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26 EXPECT_EQ(3, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28 f = f | F3;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 EXPECT_EQ(7, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 TEST(BitmaskEnumTest, BitwiseOrEquals) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 Flags f = F1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34 f |= F3;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 EXPECT_EQ(5, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 // |= should return a reference to the LHS.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38 f = F2;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 (f |= F3) = F1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40 EXPECT_EQ(F1, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 TEST(BitmaskEnumTest, BitwiseAnd) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 Flags f = static_cast<Flags>(3) & F2;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 EXPECT_EQ(F2, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47 f = (f | F3) & (F1 | F2 | F3);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 EXPECT_EQ(6, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 TEST(BitmaskEnumTest, BitwiseAndEquals) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 Flags f = F1 | F2 | F3;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53 f &= F1 | F2;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54 EXPECT_EQ(3, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56 // &= should return a reference to the LHS.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57 (f &= F1) = F3;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
58 EXPECT_EQ(F3, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 TEST(BitmaskEnumTest, BitwiseXor) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62 Flags f = (F1 | F2) ^ (F2 | F3);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 EXPECT_EQ(5, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 f = f ^ F1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66 EXPECT_EQ(4, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
67 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69 TEST(BitmaskEnumTest, BitwiseXorEquals) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
70 Flags f = (F1 | F2);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
71 f ^= (F2 | F4);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
72 EXPECT_EQ(9, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74 // ^= should return a reference to the LHS.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75 (f ^= F4) = F3;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
76 EXPECT_EQ(F3, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
77 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
78
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
79 TEST(BitmaskEnumTest, BitwiseNot) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
80 Flags f = ~F1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
81 EXPECT_EQ(14, f); // Largest value for f is 15.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
82 EXPECT_EQ(15, ~F0);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
83 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
84
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
85 enum class FlagsClass {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
86 F0 = 0,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
87 F1 = 1,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
88 F2 = 2,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
89 F3 = 4,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
90 LLVM_MARK_AS_BITMASK_ENUM(F3)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
91 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 TEST(BitmaskEnumTest, ScopedEnum) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
94 FlagsClass f = (FlagsClass::F1 & ~FlagsClass::F0) | FlagsClass::F2;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 f |= FlagsClass::F3;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
96 EXPECT_EQ(7, static_cast<int>(f));
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
97 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
98
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
99 struct Container {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
100 enum Flags { F0 = 0, F1 = 1, F2 = 2, F3 = 4, LLVM_MARK_AS_BITMASK_ENUM(F3) };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
101
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
102 static Flags getFlags() {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
103 Flags f = F0 | F1;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
104 f |= F2;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
105 return f;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
106 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
107 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
108
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
109 TEST(BitmaskEnumTest, EnumInStruct) { EXPECT_EQ(3, Container::getFlags()); }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
110
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
111 } // namespace
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
112
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
113 namespace foo {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
114 namespace bar {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
115 namespace {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
116 enum FlagsInNamespace {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
117 F0 = 0,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
118 F1 = 1,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
119 F2 = 2,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
120 F3 = 4,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
121 LLVM_MARK_AS_BITMASK_ENUM(F3)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
122 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
123 } // namespace
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
124 } // namespace foo
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
125 } // namespace bar
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
126
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
127 namespace {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
128 TEST(BitmaskEnumTest, EnumInNamespace) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
129 foo::bar::FlagsInNamespace f = ~foo::bar::F0 & (foo::bar::F1 | foo::bar::F2);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
130 f |= foo::bar::F3;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
131 EXPECT_EQ(7, f);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
132 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
133 } // namespace