xref: /aosp_15_r20/external/cronet/base/scoped_generic_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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