1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/memory/ref_counted.h" 6 7 #include <utility> 8 9 #include "base/test/gtest_util.h" 10 #include "base/test/opaque_ref_counted.h" 11 #include "testing/gtest/include/gtest/gtest.h" 12 13 namespace { 14 15 class SelfAssign : public base::RefCounted<SelfAssign> { 16 protected: 17 virtual ~SelfAssign() {} 18 19 private: 20 friend class base::RefCounted<SelfAssign>; 21 }; 22 23 class Derived : public SelfAssign { 24 protected: 25 ~Derived() override {} 26 27 private: 28 friend class base::RefCounted<Derived>; 29 }; 30 31 class CheckDerivedMemberAccess : public scoped_refptr<SelfAssign> { 32 public: 33 CheckDerivedMemberAccess() { 34 // This shouldn't compile if we don't have access to the member variable. 35 SelfAssign** pptr = &ptr_; 36 EXPECT_EQ(*pptr, ptr_); 37 } 38 }; 39 40 class ScopedRefPtrToSelf : public base::RefCounted<ScopedRefPtrToSelf> { 41 public: 42 ScopedRefPtrToSelf() : self_ptr_(this) {} 43 44 static bool was_destroyed() { return was_destroyed_; } 45 46 static void reset_was_destroyed() { was_destroyed_ = false; } 47 48 scoped_refptr<ScopedRefPtrToSelf> self_ptr_; 49 50 private: 51 friend class base::RefCounted<ScopedRefPtrToSelf>; 52 ~ScopedRefPtrToSelf() { was_destroyed_ = true; } 53 54 static bool was_destroyed_; 55 }; 56 57 bool ScopedRefPtrToSelf::was_destroyed_ = false; 58 59 class ScopedRefPtrCountBase : public base::RefCounted<ScopedRefPtrCountBase> { 60 public: 61 ScopedRefPtrCountBase() { ++constructor_count_; } 62 63 static int constructor_count() { return constructor_count_; } 64 65 static int destructor_count() { return destructor_count_; } 66 67 static void reset_count() { 68 constructor_count_ = 0; 69 destructor_count_ = 0; 70 } 71 72 protected: 73 virtual ~ScopedRefPtrCountBase() { ++destructor_count_; } 74 75 private: 76 friend class base::RefCounted<ScopedRefPtrCountBase>; 77 78 static int constructor_count_; 79 static int destructor_count_; 80 }; 81 82 int ScopedRefPtrCountBase::constructor_count_ = 0; 83 int ScopedRefPtrCountBase::destructor_count_ = 0; 84 85 class ScopedRefPtrCountDerived : public ScopedRefPtrCountBase { 86 public: 87 ScopedRefPtrCountDerived() { ++constructor_count_; } 88 89 static int constructor_count() { return constructor_count_; } 90 91 static int destructor_count() { return destructor_count_; } 92 93 static void reset_count() { 94 constructor_count_ = 0; 95 destructor_count_ = 0; 96 } 97 98 protected: 99 ~ScopedRefPtrCountDerived() override { ++destructor_count_; } 100 101 private: 102 friend class base::RefCounted<ScopedRefPtrCountDerived>; 103 104 static int constructor_count_; 105 static int destructor_count_; 106 }; 107 108 int ScopedRefPtrCountDerived::constructor_count_ = 0; 109 int ScopedRefPtrCountDerived::destructor_count_ = 0; 110 111 class Other : public base::RefCounted<Other> { 112 private: 113 friend class base::RefCounted<Other>; 114 115 ~Other() {} 116 }; 117 118 scoped_refptr<Other> Overloaded(scoped_refptr<Other> other) { 119 return other; 120 } 121 122 scoped_refptr<SelfAssign> Overloaded(scoped_refptr<SelfAssign> self_assign) { 123 return self_assign; 124 } 125 126 class InitialRefCountIsOne : public base::RefCounted<InitialRefCountIsOne> { 127 public: 128 REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE(); 129 130 InitialRefCountIsOne() {} 131 132 private: 133 friend class base::RefCounted<InitialRefCountIsOne>; 134 ~InitialRefCountIsOne() {} 135 }; 136 137 } // end namespace 138 139 TEST(RefCountedUnitTest, TestSelfAssignment) { 140 SelfAssign* p = new SelfAssign; 141 scoped_refptr<SelfAssign> var(p); 142 var = var; 143 EXPECT_EQ(var.get(), p); 144 } 145 146 TEST(RefCountedUnitTest, ScopedRefPtrMemberAccess) { 147 CheckDerivedMemberAccess check; 148 } 149 150 TEST(RefCountedUnitTest, ScopedRefPtrToSelfPointerAssignment) { 151 ScopedRefPtrToSelf::reset_was_destroyed(); 152 153 ScopedRefPtrToSelf* check = new ScopedRefPtrToSelf(); 154 EXPECT_FALSE(ScopedRefPtrToSelf::was_destroyed()); 155 check->self_ptr_ = nullptr; 156 EXPECT_TRUE(ScopedRefPtrToSelf::was_destroyed()); 157 } 158 159 TEST(RefCountedUnitTest, ScopedRefPtrToSelfMoveAssignment) { 160 ScopedRefPtrToSelf::reset_was_destroyed(); 161 162 ScopedRefPtrToSelf* check = new ScopedRefPtrToSelf(); 163 EXPECT_FALSE(ScopedRefPtrToSelf::was_destroyed()); 164 // Releasing |check->self_ptr_| will delete |check|. 165 // The move assignment operator must assign |check->self_ptr_| first then 166 // release |check->self_ptr_|. 167 check->self_ptr_ = scoped_refptr<ScopedRefPtrToSelf>(); 168 EXPECT_TRUE(ScopedRefPtrToSelf::was_destroyed()); 169 } 170 171 TEST(RefCountedUnitTest, ScopedRefPtrToOpaque) { 172 scoped_refptr<base::OpaqueRefCounted> initial = base::MakeOpaqueRefCounted(); 173 base::TestOpaqueRefCounted(initial); 174 175 scoped_refptr<base::OpaqueRefCounted> assigned; 176 assigned = initial; 177 178 scoped_refptr<base::OpaqueRefCounted> copied(initial); 179 180 scoped_refptr<base::OpaqueRefCounted> moved(std::move(initial)); 181 182 scoped_refptr<base::OpaqueRefCounted> move_assigned; 183 move_assigned = std::move(moved); 184 } 185 186 TEST(RefCountedUnitTest, ScopedRefPtrToOpaqueThreadSafe) { 187 scoped_refptr<base::OpaqueRefCountedThreadSafe> initial = 188 base::MakeOpaqueRefCountedThreadSafe(); 189 base::TestOpaqueRefCountedThreadSafe(initial); 190 191 scoped_refptr<base::OpaqueRefCountedThreadSafe> assigned; 192 assigned = initial; 193 194 scoped_refptr<base::OpaqueRefCountedThreadSafe> copied(initial); 195 196 scoped_refptr<base::OpaqueRefCountedThreadSafe> moved(std::move(initial)); 197 198 scoped_refptr<base::OpaqueRefCountedThreadSafe> move_assigned; 199 move_assigned = std::move(moved); 200 } 201 202 TEST(RefCountedUnitTest, BooleanTesting) { 203 scoped_refptr<SelfAssign> ptr_to_an_instance = new SelfAssign; 204 EXPECT_TRUE(ptr_to_an_instance); 205 EXPECT_FALSE(!ptr_to_an_instance); 206 207 if (ptr_to_an_instance) { 208 } else { 209 ADD_FAILURE() << "Pointer to an instance should result in true."; 210 } 211 212 if (!ptr_to_an_instance) { // check for operator!(). 213 ADD_FAILURE() << "Pointer to an instance should result in !x being false."; 214 } 215 216 scoped_refptr<SelfAssign> null_ptr; 217 EXPECT_FALSE(null_ptr); 218 EXPECT_TRUE(!null_ptr); 219 220 if (null_ptr) { 221 ADD_FAILURE() << "Null pointer should result in false."; 222 } 223 224 if (!null_ptr) { // check for operator!(). 225 } else { 226 ADD_FAILURE() << "Null pointer should result in !x being true."; 227 } 228 } 229 230 TEST(RefCountedUnitTest, Equality) { 231 scoped_refptr<SelfAssign> p1(new SelfAssign); 232 scoped_refptr<SelfAssign> p2(new SelfAssign); 233 234 EXPECT_EQ(p1, p1); 235 EXPECT_EQ(p2, p2); 236 237 EXPECT_NE(p1, p2); 238 EXPECT_NE(p2, p1); 239 } 240 241 TEST(RefCountedUnitTest, NullptrEquality) { 242 scoped_refptr<SelfAssign> ptr_to_an_instance(new SelfAssign); 243 scoped_refptr<SelfAssign> ptr_to_nullptr; 244 245 EXPECT_NE(nullptr, ptr_to_an_instance); 246 EXPECT_NE(ptr_to_an_instance, nullptr); 247 EXPECT_EQ(nullptr, ptr_to_nullptr); 248 EXPECT_EQ(ptr_to_nullptr, nullptr); 249 } 250 251 TEST(RefCountedUnitTest, ConvertibleEquality) { 252 scoped_refptr<Derived> p1(new Derived); 253 scoped_refptr<SelfAssign> p2; 254 255 EXPECT_NE(p1, p2); 256 EXPECT_NE(p2, p1); 257 258 p2 = p1; 259 260 EXPECT_EQ(p1, p2); 261 EXPECT_EQ(p2, p1); 262 } 263 264 TEST(RefCountedUnitTest, MoveAssignment1) { 265 ScopedRefPtrCountBase::reset_count(); 266 267 { 268 ScopedRefPtrCountBase *raw = new ScopedRefPtrCountBase(); 269 scoped_refptr<ScopedRefPtrCountBase> p1(raw); 270 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 271 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 272 273 { 274 scoped_refptr<ScopedRefPtrCountBase> p2; 275 276 p2 = std::move(p1); 277 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 278 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 279 EXPECT_EQ(nullptr, p1.get()); 280 EXPECT_EQ(raw, p2.get()); 281 282 // p2 goes out of scope. 283 } 284 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 285 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 286 287 // p1 goes out of scope. 288 } 289 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 290 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 291 } 292 293 TEST(RefCountedUnitTest, MoveAssignment2) { 294 ScopedRefPtrCountBase::reset_count(); 295 296 { 297 ScopedRefPtrCountBase *raw = new ScopedRefPtrCountBase(); 298 scoped_refptr<ScopedRefPtrCountBase> p1; 299 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 300 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 301 302 { 303 scoped_refptr<ScopedRefPtrCountBase> p2(raw); 304 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 305 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 306 307 p1 = std::move(p2); 308 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 309 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 310 EXPECT_EQ(raw, p1.get()); 311 EXPECT_EQ(nullptr, p2.get()); 312 313 // p2 goes out of scope. 314 } 315 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 316 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 317 318 // p1 goes out of scope. 319 } 320 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 321 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 322 } 323 324 TEST(RefCountedUnitTest, MoveAssignmentSameInstance1) { 325 ScopedRefPtrCountBase::reset_count(); 326 327 { 328 ScopedRefPtrCountBase *raw = new ScopedRefPtrCountBase(); 329 scoped_refptr<ScopedRefPtrCountBase> p1(raw); 330 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 331 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 332 333 { 334 scoped_refptr<ScopedRefPtrCountBase> p2(p1); 335 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 336 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 337 338 p1 = std::move(p2); 339 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 340 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 341 EXPECT_EQ(raw, p1.get()); 342 EXPECT_EQ(nullptr, p2.get()); 343 344 // p2 goes out of scope. 345 } 346 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 347 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 348 349 // p1 goes out of scope. 350 } 351 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 352 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 353 } 354 355 TEST(RefCountedUnitTest, MoveAssignmentSameInstance2) { 356 ScopedRefPtrCountBase::reset_count(); 357 358 { 359 ScopedRefPtrCountBase *raw = new ScopedRefPtrCountBase(); 360 scoped_refptr<ScopedRefPtrCountBase> p1(raw); 361 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 362 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 363 364 { 365 scoped_refptr<ScopedRefPtrCountBase> p2(p1); 366 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 367 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 368 369 p2 = std::move(p1); 370 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 371 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 372 EXPECT_EQ(nullptr, p1.get()); 373 EXPECT_EQ(raw, p2.get()); 374 375 // p2 goes out of scope. 376 } 377 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 378 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 379 380 // p1 goes out of scope. 381 } 382 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 383 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 384 } 385 386 TEST(RefCountedUnitTest, MoveAssignmentDifferentInstances) { 387 ScopedRefPtrCountBase::reset_count(); 388 389 { 390 ScopedRefPtrCountBase *raw1 = new ScopedRefPtrCountBase(); 391 scoped_refptr<ScopedRefPtrCountBase> p1(raw1); 392 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 393 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 394 395 { 396 ScopedRefPtrCountBase *raw2 = new ScopedRefPtrCountBase(); 397 scoped_refptr<ScopedRefPtrCountBase> p2(raw2); 398 EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count()); 399 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 400 401 p1 = std::move(p2); 402 EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count()); 403 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 404 EXPECT_EQ(raw2, p1.get()); 405 EXPECT_EQ(nullptr, p2.get()); 406 407 // p2 goes out of scope. 408 } 409 EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count()); 410 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 411 412 // p1 goes out of scope. 413 } 414 EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count()); 415 EXPECT_EQ(2, ScopedRefPtrCountBase::destructor_count()); 416 } 417 418 TEST(RefCountedUnitTest, MoveAssignmentDerived) { 419 ScopedRefPtrCountBase::reset_count(); 420 ScopedRefPtrCountDerived::reset_count(); 421 422 { 423 ScopedRefPtrCountBase *raw1 = new ScopedRefPtrCountBase(); 424 scoped_refptr<ScopedRefPtrCountBase> p1(raw1); 425 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 426 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 427 EXPECT_EQ(0, ScopedRefPtrCountDerived::constructor_count()); 428 EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count()); 429 430 { 431 ScopedRefPtrCountDerived *raw2 = new ScopedRefPtrCountDerived(); 432 scoped_refptr<ScopedRefPtrCountDerived> p2(raw2); 433 EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count()); 434 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 435 EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count()); 436 EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count()); 437 438 p1 = std::move(p2); 439 EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count()); 440 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 441 EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count()); 442 EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count()); 443 EXPECT_EQ(raw2, p1.get()); 444 EXPECT_EQ(nullptr, p2.get()); 445 446 // p2 goes out of scope. 447 } 448 EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count()); 449 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 450 EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count()); 451 EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count()); 452 453 // p1 goes out of scope. 454 } 455 EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count()); 456 EXPECT_EQ(2, ScopedRefPtrCountBase::destructor_count()); 457 EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count()); 458 EXPECT_EQ(1, ScopedRefPtrCountDerived::destructor_count()); 459 } 460 461 TEST(RefCountedUnitTest, MoveConstructor) { 462 ScopedRefPtrCountBase::reset_count(); 463 464 { 465 ScopedRefPtrCountBase *raw = new ScopedRefPtrCountBase(); 466 scoped_refptr<ScopedRefPtrCountBase> p1(raw); 467 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 468 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 469 470 { 471 scoped_refptr<ScopedRefPtrCountBase> p2(std::move(p1)); 472 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 473 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 474 EXPECT_EQ(nullptr, p1.get()); 475 EXPECT_EQ(raw, p2.get()); 476 477 // p2 goes out of scope. 478 } 479 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 480 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 481 482 // p1 goes out of scope. 483 } 484 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 485 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 486 } 487 488 TEST(RefCountedUnitTest, MoveConstructorDerived) { 489 ScopedRefPtrCountBase::reset_count(); 490 ScopedRefPtrCountDerived::reset_count(); 491 492 { 493 ScopedRefPtrCountDerived *raw1 = new ScopedRefPtrCountDerived(); 494 scoped_refptr<ScopedRefPtrCountDerived> p1(raw1); 495 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 496 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 497 EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count()); 498 EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count()); 499 500 { 501 scoped_refptr<ScopedRefPtrCountBase> p2(std::move(p1)); 502 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 503 EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count()); 504 EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count()); 505 EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count()); 506 EXPECT_EQ(nullptr, p1.get()); 507 EXPECT_EQ(raw1, p2.get()); 508 509 // p2 goes out of scope. 510 } 511 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 512 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 513 EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count()); 514 EXPECT_EQ(1, ScopedRefPtrCountDerived::destructor_count()); 515 516 // p1 goes out of scope. 517 } 518 EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count()); 519 EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count()); 520 EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count()); 521 EXPECT_EQ(1, ScopedRefPtrCountDerived::destructor_count()); 522 } 523 524 TEST(RefCountedUnitTest, TestOverloadResolutionCopy) { 525 scoped_refptr<Derived> derived(new Derived); 526 scoped_refptr<SelfAssign> expected(derived); 527 EXPECT_EQ(expected, Overloaded(derived)); 528 529 scoped_refptr<Other> other(new Other); 530 EXPECT_EQ(other, Overloaded(other)); 531 } 532 533 TEST(RefCountedUnitTest, TestOverloadResolutionMove) { 534 scoped_refptr<Derived> derived(new Derived); 535 scoped_refptr<SelfAssign> expected(derived); 536 EXPECT_EQ(expected, Overloaded(std::move(derived))); 537 538 scoped_refptr<Other> other(new Other); 539 scoped_refptr<Other> other2(other); 540 EXPECT_EQ(other2, Overloaded(std::move(other))); 541 } 542 543 TEST(RefCountedUnitTest, TestInitialRefCountIsOne) { 544 scoped_refptr<InitialRefCountIsOne> obj = 545 base::MakeShared<InitialRefCountIsOne>(); 546 EXPECT_TRUE(obj->HasOneRef()); 547 obj = nullptr; 548 549 scoped_refptr<InitialRefCountIsOne> obj2 = 550 base::AdoptRef(new InitialRefCountIsOne); 551 EXPECT_TRUE(obj2->HasOneRef()); 552 obj2 = nullptr; 553 554 scoped_refptr<Other> obj3 = base::MakeShared<Other>(); 555 EXPECT_TRUE(obj3->HasOneRef()); 556 obj3 = nullptr; 557 } 558 559 TEST(RefCountedDeathTest, TestAdoptRef) { 560 EXPECT_DCHECK_DEATH(make_scoped_refptr(new InitialRefCountIsOne)); 561 562 InitialRefCountIsOne* ptr = nullptr; 563 EXPECT_DCHECK_DEATH(base::AdoptRef(ptr)); 564 565 scoped_refptr<InitialRefCountIsOne> obj = 566 base::MakeShared<InitialRefCountIsOne>(); 567 EXPECT_DCHECK_DEATH(base::AdoptRef(obj.get())); 568 } 569