1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/scoped_generic.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <memory>
8*6777b538SAndroid Build Coastguard Worker #include <unordered_map>
9*6777b538SAndroid Build Coastguard Worker #include <unordered_set>
10*6777b538SAndroid Build Coastguard Worker #include <utility>
11*6777b538SAndroid Build Coastguard Worker #include <vector>
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker #include "base/containers/contains.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
15*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
16*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker namespace base {
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Worker namespace {
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker struct IntTraits {
IntTraitsbase::__anon9485d7d80111::IntTraits23*6777b538SAndroid Build Coastguard Worker IntTraits(std::vector<int>* freed) : freed_ints(freed) {}
24*6777b538SAndroid Build Coastguard Worker
InvalidValuebase::__anon9485d7d80111::IntTraits25*6777b538SAndroid Build Coastguard Worker static int InvalidValue() {
26*6777b538SAndroid Build Coastguard Worker return -1;
27*6777b538SAndroid Build Coastguard Worker }
Freebase::__anon9485d7d80111::IntTraits28*6777b538SAndroid Build Coastguard Worker void Free(int value) {
29*6777b538SAndroid Build Coastguard Worker freed_ints->push_back(value);
30*6777b538SAndroid Build Coastguard Worker }
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker raw_ptr<std::vector<int>> freed_ints;
33*6777b538SAndroid Build Coastguard Worker };
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker using ScopedInt = ScopedGeneric<int, IntTraits>;
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker } // namespace
38*6777b538SAndroid Build Coastguard Worker
TEST(ScopedGenericTest,ScopedGeneric)39*6777b538SAndroid Build Coastguard Worker TEST(ScopedGenericTest, ScopedGeneric) {
40*6777b538SAndroid Build Coastguard Worker std::vector<int> values_freed;
41*6777b538SAndroid Build Coastguard Worker IntTraits traits(&values_freed);
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard Worker // Invalid case, delete should not be called.
44*6777b538SAndroid Build Coastguard Worker {
45*6777b538SAndroid Build Coastguard Worker ScopedInt a(IntTraits::InvalidValue(), traits);
46*6777b538SAndroid Build Coastguard Worker }
47*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(values_freed.empty());
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker // Simple deleting case.
50*6777b538SAndroid Build Coastguard Worker static const int kFirst = 0;
51*6777b538SAndroid Build Coastguard Worker {
52*6777b538SAndroid Build Coastguard Worker ScopedInt a(kFirst, traits);
53*6777b538SAndroid Build Coastguard Worker }
54*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1u, values_freed.size());
55*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(kFirst, values_freed[0]);
56*6777b538SAndroid Build Coastguard Worker values_freed.clear();
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker // Release should return the right value and leave the object empty.
59*6777b538SAndroid Build Coastguard Worker {
60*6777b538SAndroid Build Coastguard Worker ScopedInt a(kFirst, traits);
61*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kFirst, a.release());
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker ScopedInt b(IntTraits::InvalidValue(), traits);
64*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(IntTraits::InvalidValue(), b.release());
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(values_freed.empty());
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker // Reset should free the old value, then the new one should go away when
69*6777b538SAndroid Build Coastguard Worker // it goes out of scope.
70*6777b538SAndroid Build Coastguard Worker static const int kSecond = 1;
71*6777b538SAndroid Build Coastguard Worker {
72*6777b538SAndroid Build Coastguard Worker ScopedInt b(kFirst, traits);
73*6777b538SAndroid Build Coastguard Worker b.reset(kSecond);
74*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1u, values_freed.size());
75*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(kFirst, values_freed[0]);
76*6777b538SAndroid Build Coastguard Worker }
77*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2u, values_freed.size());
78*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(kSecond, values_freed[1]);
79*6777b538SAndroid Build Coastguard Worker values_freed.clear();
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard Worker // Move constructor.
82*6777b538SAndroid Build Coastguard Worker {
83*6777b538SAndroid Build Coastguard Worker ScopedInt a(kFirst, traits);
84*6777b538SAndroid Build Coastguard Worker ScopedInt b(std::move(a));
85*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(values_freed.empty()); // Nothing should be freed.
86*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(IntTraits::InvalidValue(), a.get());
87*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(kFirst, b.get());
88*6777b538SAndroid Build Coastguard Worker }
89*6777b538SAndroid Build Coastguard Worker
90*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1u, values_freed.size());
91*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(kFirst, values_freed[0]);
92*6777b538SAndroid Build Coastguard Worker values_freed.clear();
93*6777b538SAndroid Build Coastguard Worker
94*6777b538SAndroid Build Coastguard Worker // Move assign.
95*6777b538SAndroid Build Coastguard Worker {
96*6777b538SAndroid Build Coastguard Worker ScopedInt a(kFirst, traits);
97*6777b538SAndroid Build Coastguard Worker ScopedInt b(kSecond, traits);
98*6777b538SAndroid Build Coastguard Worker b = std::move(a);
99*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(1u, values_freed.size());
100*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kSecond, values_freed[0]);
101*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(IntTraits::InvalidValue(), a.get());
102*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(kFirst, b.get());
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(2u, values_freed.size());
106*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kFirst, values_freed[1]);
107*6777b538SAndroid Build Coastguard Worker values_freed.clear();
108*6777b538SAndroid Build Coastguard Worker }
109*6777b538SAndroid Build Coastguard Worker
TEST(ScopedGenericTest,Operators)110*6777b538SAndroid Build Coastguard Worker TEST(ScopedGenericTest, Operators) {
111*6777b538SAndroid Build Coastguard Worker std::vector<int> values_freed;
112*6777b538SAndroid Build Coastguard Worker IntTraits traits(&values_freed);
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker static const int kFirst = 0;
115*6777b538SAndroid Build Coastguard Worker static const int kSecond = 1;
116*6777b538SAndroid Build Coastguard Worker {
117*6777b538SAndroid Build Coastguard Worker ScopedInt a(kFirst, traits);
118*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(a == kFirst);
119*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(a != kFirst);
120*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(a == kSecond);
121*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(a != kSecond);
122*6777b538SAndroid Build Coastguard Worker
123*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(kFirst == a);
124*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(kFirst != a);
125*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(kSecond == a);
126*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(kSecond != a);
127*6777b538SAndroid Build Coastguard Worker }
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard Worker // is_valid().
130*6777b538SAndroid Build Coastguard Worker {
131*6777b538SAndroid Build Coastguard Worker ScopedInt a(kFirst, traits);
132*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(a.is_valid());
133*6777b538SAndroid Build Coastguard Worker a.reset();
134*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(a.is_valid());
135*6777b538SAndroid Build Coastguard Worker }
136*6777b538SAndroid Build Coastguard Worker }
137*6777b538SAndroid Build Coastguard Worker
TEST(ScopedGenericTest,Receive)138*6777b538SAndroid Build Coastguard Worker TEST(ScopedGenericTest, Receive) {
139*6777b538SAndroid Build Coastguard Worker std::vector<int> values_freed;
140*6777b538SAndroid Build Coastguard Worker IntTraits traits(&values_freed);
141*6777b538SAndroid Build Coastguard Worker auto a = std::make_unique<ScopedInt>(123, traits);
142*6777b538SAndroid Build Coastguard Worker
143*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123, a->get());
144*6777b538SAndroid Build Coastguard Worker
145*6777b538SAndroid Build Coastguard Worker {
146*6777b538SAndroid Build Coastguard Worker ScopedInt::Receiver r(*a);
147*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123, a->get());
148*6777b538SAndroid Build Coastguard Worker *r.get() = 456;
149*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123, a->get());
150*6777b538SAndroid Build Coastguard Worker }
151*6777b538SAndroid Build Coastguard Worker
152*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(456, a->get());
153*6777b538SAndroid Build Coastguard Worker
154*6777b538SAndroid Build Coastguard Worker {
155*6777b538SAndroid Build Coastguard Worker ScopedInt::Receiver r(*a);
156*6777b538SAndroid Build Coastguard Worker EXPECT_DEATH_IF_SUPPORTED(a.reset(), "");
157*6777b538SAndroid Build Coastguard Worker EXPECT_DEATH_IF_SUPPORTED(ScopedInt::Receiver(*a).get(), "");
158*6777b538SAndroid Build Coastguard Worker }
159*6777b538SAndroid Build Coastguard Worker }
160*6777b538SAndroid Build Coastguard Worker
161*6777b538SAndroid Build Coastguard Worker namespace {
162*6777b538SAndroid Build Coastguard Worker
163*6777b538SAndroid Build Coastguard Worker struct TrackedIntTraits : public ScopedGenericOwnershipTracking {
164*6777b538SAndroid Build Coastguard Worker using OwnerMap =
165*6777b538SAndroid Build Coastguard Worker std::unordered_map<int, const ScopedGeneric<int, TrackedIntTraits>*>;
TrackedIntTraitsbase::__anon9485d7d80211::TrackedIntTraits166*6777b538SAndroid Build Coastguard Worker TrackedIntTraits(std::unordered_set<int>* freed, OwnerMap* owners)
167*6777b538SAndroid Build Coastguard Worker : freed(freed), owners(owners) {}
168*6777b538SAndroid Build Coastguard Worker
InvalidValuebase::__anon9485d7d80211::TrackedIntTraits169*6777b538SAndroid Build Coastguard Worker static int InvalidValue() { return -1; }
170*6777b538SAndroid Build Coastguard Worker
Freebase::__anon9485d7d80211::TrackedIntTraits171*6777b538SAndroid Build Coastguard Worker void Free(int value) {
172*6777b538SAndroid Build Coastguard Worker auto it = owners->find(value);
173*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(owners->end(), it);
174*6777b538SAndroid Build Coastguard Worker
175*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0U, freed->count(value));
176*6777b538SAndroid Build Coastguard Worker freed->insert(value);
177*6777b538SAndroid Build Coastguard Worker }
178*6777b538SAndroid Build Coastguard Worker
Acquirebase::__anon9485d7d80211::TrackedIntTraits179*6777b538SAndroid Build Coastguard Worker void Acquire(const ScopedGeneric<int, TrackedIntTraits>& owner, int value) {
180*6777b538SAndroid Build Coastguard Worker auto it = owners->find(value);
181*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(owners->end(), it);
182*6777b538SAndroid Build Coastguard Worker (*owners)[value] = &owner;
183*6777b538SAndroid Build Coastguard Worker }
184*6777b538SAndroid Build Coastguard Worker
Releasebase::__anon9485d7d80211::TrackedIntTraits185*6777b538SAndroid Build Coastguard Worker void Release(const ScopedGeneric<int, TrackedIntTraits>& owner, int value) {
186*6777b538SAndroid Build Coastguard Worker auto it = owners->find(value);
187*6777b538SAndroid Build Coastguard Worker ASSERT_NE(owners->end(), it);
188*6777b538SAndroid Build Coastguard Worker owners->erase(it);
189*6777b538SAndroid Build Coastguard Worker }
190*6777b538SAndroid Build Coastguard Worker
191*6777b538SAndroid Build Coastguard Worker raw_ptr<std::unordered_set<int>> freed;
192*6777b538SAndroid Build Coastguard Worker raw_ptr<OwnerMap> owners;
193*6777b538SAndroid Build Coastguard Worker };
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Worker using ScopedTrackedInt = ScopedGeneric<int, TrackedIntTraits>;
196*6777b538SAndroid Build Coastguard Worker
197*6777b538SAndroid Build Coastguard Worker } // namespace
198*6777b538SAndroid Build Coastguard Worker
TEST(ScopedGenericTest,OwnershipTracking)199*6777b538SAndroid Build Coastguard Worker TEST(ScopedGenericTest, OwnershipTracking) {
200*6777b538SAndroid Build Coastguard Worker TrackedIntTraits::OwnerMap owners;
201*6777b538SAndroid Build Coastguard Worker std::unordered_set<int> freed;
202*6777b538SAndroid Build Coastguard Worker TrackedIntTraits traits(&freed, &owners);
203*6777b538SAndroid Build Coastguard Worker
204*6777b538SAndroid Build Coastguard Worker #define ASSERT_OWNED(value, owner) \
205*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(base::Contains(owners, value)); \
206*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(&owner, owners[value]); \
207*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(base::Contains(freed, value))
208*6777b538SAndroid Build Coastguard Worker
209*6777b538SAndroid Build Coastguard Worker #define ASSERT_UNOWNED(value) \
210*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(base::Contains(owners, value)); \
211*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(base::Contains(freed, value))
212*6777b538SAndroid Build Coastguard Worker
213*6777b538SAndroid Build Coastguard Worker #define ASSERT_FREED(value) \
214*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(base::Contains(owners, value)); \
215*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(base::Contains(freed, value))
216*6777b538SAndroid Build Coastguard Worker
217*6777b538SAndroid Build Coastguard Worker // Constructor.
218*6777b538SAndroid Build Coastguard Worker {
219*6777b538SAndroid Build Coastguard Worker {
220*6777b538SAndroid Build Coastguard Worker ScopedTrackedInt a(0, traits);
221*6777b538SAndroid Build Coastguard Worker ASSERT_OWNED(0, a);
222*6777b538SAndroid Build Coastguard Worker }
223*6777b538SAndroid Build Coastguard Worker ASSERT_FREED(0);
224*6777b538SAndroid Build Coastguard Worker }
225*6777b538SAndroid Build Coastguard Worker
226*6777b538SAndroid Build Coastguard Worker owners.clear();
227*6777b538SAndroid Build Coastguard Worker freed.clear();
228*6777b538SAndroid Build Coastguard Worker
229*6777b538SAndroid Build Coastguard Worker // Reset.
230*6777b538SAndroid Build Coastguard Worker {
231*6777b538SAndroid Build Coastguard Worker ScopedTrackedInt a(0, traits);
232*6777b538SAndroid Build Coastguard Worker ASSERT_OWNED(0, a);
233*6777b538SAndroid Build Coastguard Worker a.reset(1);
234*6777b538SAndroid Build Coastguard Worker ASSERT_FREED(0);
235*6777b538SAndroid Build Coastguard Worker ASSERT_OWNED(1, a);
236*6777b538SAndroid Build Coastguard Worker a.reset();
237*6777b538SAndroid Build Coastguard Worker ASSERT_FREED(0);
238*6777b538SAndroid Build Coastguard Worker ASSERT_FREED(1);
239*6777b538SAndroid Build Coastguard Worker }
240*6777b538SAndroid Build Coastguard Worker
241*6777b538SAndroid Build Coastguard Worker owners.clear();
242*6777b538SAndroid Build Coastguard Worker freed.clear();
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard Worker // Release.
245*6777b538SAndroid Build Coastguard Worker {
246*6777b538SAndroid Build Coastguard Worker {
247*6777b538SAndroid Build Coastguard Worker ScopedTrackedInt a(0, traits);
248*6777b538SAndroid Build Coastguard Worker ASSERT_OWNED(0, a);
249*6777b538SAndroid Build Coastguard Worker int released = a.release();
250*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, released);
251*6777b538SAndroid Build Coastguard Worker ASSERT_UNOWNED(0);
252*6777b538SAndroid Build Coastguard Worker }
253*6777b538SAndroid Build Coastguard Worker ASSERT_UNOWNED(0);
254*6777b538SAndroid Build Coastguard Worker }
255*6777b538SAndroid Build Coastguard Worker
256*6777b538SAndroid Build Coastguard Worker owners.clear();
257*6777b538SAndroid Build Coastguard Worker freed.clear();
258*6777b538SAndroid Build Coastguard Worker
259*6777b538SAndroid Build Coastguard Worker // Move constructor.
260*6777b538SAndroid Build Coastguard Worker {
261*6777b538SAndroid Build Coastguard Worker ScopedTrackedInt a(0, traits);
262*6777b538SAndroid Build Coastguard Worker ASSERT_OWNED(0, a);
263*6777b538SAndroid Build Coastguard Worker {
264*6777b538SAndroid Build Coastguard Worker ScopedTrackedInt b(std::move(a));
265*6777b538SAndroid Build Coastguard Worker ASSERT_OWNED(0, b);
266*6777b538SAndroid Build Coastguard Worker }
267*6777b538SAndroid Build Coastguard Worker ASSERT_FREED(0);
268*6777b538SAndroid Build Coastguard Worker }
269*6777b538SAndroid Build Coastguard Worker
270*6777b538SAndroid Build Coastguard Worker owners.clear();
271*6777b538SAndroid Build Coastguard Worker freed.clear();
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard Worker // Move assignment.
274*6777b538SAndroid Build Coastguard Worker {
275*6777b538SAndroid Build Coastguard Worker {
276*6777b538SAndroid Build Coastguard Worker ScopedTrackedInt a(0, traits);
277*6777b538SAndroid Build Coastguard Worker ScopedTrackedInt b(1, traits);
278*6777b538SAndroid Build Coastguard Worker ASSERT_OWNED(0, a);
279*6777b538SAndroid Build Coastguard Worker ASSERT_OWNED(1, b);
280*6777b538SAndroid Build Coastguard Worker a = std::move(b);
281*6777b538SAndroid Build Coastguard Worker ASSERT_OWNED(1, a);
282*6777b538SAndroid Build Coastguard Worker ASSERT_FREED(0);
283*6777b538SAndroid Build Coastguard Worker }
284*6777b538SAndroid Build Coastguard Worker ASSERT_FREED(1);
285*6777b538SAndroid Build Coastguard Worker }
286*6777b538SAndroid Build Coastguard Worker
287*6777b538SAndroid Build Coastguard Worker owners.clear();
288*6777b538SAndroid Build Coastguard Worker freed.clear();
289*6777b538SAndroid Build Coastguard Worker
290*6777b538SAndroid Build Coastguard Worker #undef ASSERT_OWNED
291*6777b538SAndroid Build Coastguard Worker #undef ASSERT_UNOWNED
292*6777b538SAndroid Build Coastguard Worker #undef ASSERT_FREED
293*6777b538SAndroid Build Coastguard Worker }
294*6777b538SAndroid Build Coastguard Worker
295*6777b538SAndroid Build Coastguard Worker // Cheesy manual "no compile" test for manually validating changes.
296*6777b538SAndroid Build Coastguard Worker #if 0
297*6777b538SAndroid Build Coastguard Worker TEST(ScopedGenericTest, NoCompile) {
298*6777b538SAndroid Build Coastguard Worker // Assignment shouldn't work.
299*6777b538SAndroid Build Coastguard Worker /*{
300*6777b538SAndroid Build Coastguard Worker ScopedInt a(kFirst, traits);
301*6777b538SAndroid Build Coastguard Worker ScopedInt b(a);
302*6777b538SAndroid Build Coastguard Worker }*/
303*6777b538SAndroid Build Coastguard Worker
304*6777b538SAndroid Build Coastguard Worker // Comparison shouldn't work.
305*6777b538SAndroid Build Coastguard Worker /*{
306*6777b538SAndroid Build Coastguard Worker ScopedInt a(kFirst, traits);
307*6777b538SAndroid Build Coastguard Worker ScopedInt b(kFirst, traits);
308*6777b538SAndroid Build Coastguard Worker if (a == b) {
309*6777b538SAndroid Build Coastguard Worker }
310*6777b538SAndroid Build Coastguard Worker }*/
311*6777b538SAndroid Build Coastguard Worker
312*6777b538SAndroid Build Coastguard Worker // Implicit conversion to bool shouldn't work.
313*6777b538SAndroid Build Coastguard Worker /*{
314*6777b538SAndroid Build Coastguard Worker ScopedInt a(kFirst, traits);
315*6777b538SAndroid Build Coastguard Worker bool result = a;
316*6777b538SAndroid Build Coastguard Worker }*/
317*6777b538SAndroid Build Coastguard Worker }
318*6777b538SAndroid Build Coastguard Worker #endif
319*6777b538SAndroid Build Coastguard Worker
320*6777b538SAndroid Build Coastguard Worker } // namespace base
321