weak_ptr_unittest.nc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. // This is a "No Compile Test" suite.
  5. // http://dev.chromium.org/developers/testing/no-compile-tests
  6. #include "base/memory/weak_ptr.h"
  7. namespace base {
  8. struct Producer : SupportsWeakPtr<Producer> {};
  9. struct DerivedProducer : Producer {};
  10. struct OtherDerivedProducer : Producer {};
  11. struct MultiplyDerivedProducer : Producer,
  12. SupportsWeakPtr<MultiplyDerivedProducer> {};
  13. struct Unrelated {};
  14. struct DerivedUnrelated : Unrelated {};
  15. #if defined(NCTEST_AUTO_DOWNCAST) // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
  16. void WontCompile() {
  17. Producer f;
  18. WeakPtr<Producer> ptr = f.AsWeakPtr();
  19. WeakPtr<DerivedProducer> derived_ptr = ptr;
  20. }
  21. #elif defined(NCTEST_STATIC_DOWNCAST) // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
  22. void WontCompile() {
  23. Producer f;
  24. WeakPtr<Producer> ptr = f.AsWeakPtr();
  25. WeakPtr<DerivedProducer> derived_ptr =
  26. static_cast<WeakPtr<DerivedProducer> >(ptr);
  27. }
  28. #elif defined(NCTEST_AUTO_REF_DOWNCAST) // [r"fatal error: non-const lvalue reference to type 'WeakPtr<DerivedProducer>' cannot bind to a value of unrelated type 'WeakPtr<Producer>'"]
  29. void WontCompile() {
  30. Producer f;
  31. WeakPtr<Producer> ptr = f.AsWeakPtr();
  32. WeakPtr<DerivedProducer>& derived_ptr = ptr;
  33. }
  34. #elif defined(NCTEST_STATIC_REF_DOWNCAST) // [r"fatal error: non-const lvalue reference to type 'WeakPtr<DerivedProducer>' cannot bind to a value of unrelated type 'WeakPtr<Producer>'"]
  35. void WontCompile() {
  36. Producer f;
  37. WeakPtr<Producer> ptr = f.AsWeakPtr();
  38. WeakPtr<DerivedProducer>& derived_ptr =
  39. static_cast<WeakPtr<DerivedProducer>&>(ptr);
  40. }
  41. #elif defined(NCTEST_STATIC_ASWEAKPTR_DOWNCAST) // [r"no matching function"]
  42. void WontCompile() {
  43. Producer f;
  44. WeakPtr<DerivedProducer> ptr =
  45. SupportsWeakPtr<Producer>::StaticAsWeakPtr<DerivedProducer>(&f);
  46. }
  47. #elif defined(NCTEST_UNSAFE_HELPER_DOWNCAST) // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
  48. void WontCompile() {
  49. Producer f;
  50. WeakPtr<DerivedProducer> ptr = AsWeakPtr(&f);
  51. }
  52. #elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_DOWNCAST) // [r"no matching function"]
  53. void WontCompile() {
  54. Producer f;
  55. WeakPtr<DerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f);
  56. }
  57. #elif defined(NCTEST_UNSAFE_WRONG_INSANTIATED_HELPER_DOWNCAST) // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
  58. void WontCompile() {
  59. Producer f;
  60. WeakPtr<DerivedProducer> ptr = AsWeakPtr<Producer>(&f);
  61. }
  62. #elif defined(NCTEST_UNSAFE_HELPER_CAST) // [r"cannot initialize a variable of type 'base::OtherDerivedProducer \*' with an rvalue of type 'base::DerivedProducer \*'"]
  63. void WontCompile() {
  64. DerivedProducer f;
  65. WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr(&f);
  66. }
  67. #elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_SIDECAST) // [r"fatal error: no matching function for call to 'AsWeakPtr'"]
  68. void WontCompile() {
  69. DerivedProducer f;
  70. WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<OtherDerivedProducer>(&f);
  71. }
  72. #elif defined(NCTEST_UNSAFE_WRONG_INSTANTIATED_HELPER_SIDECAST) // [r"cannot initialize a variable of type 'base::OtherDerivedProducer \*' with an rvalue of type 'base::DerivedProducer \*'"]
  73. void WontCompile() {
  74. DerivedProducer f;
  75. WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f);
  76. }
  77. #elif defined(NCTEST_UNRELATED_HELPER) // [r"cannot initialize a variable of type 'base::Unrelated \*' with an rvalue of type 'base::DerivedProducer \*'"]
  78. void WontCompile() {
  79. DerivedProducer f;
  80. WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
  81. }
  82. #elif defined(NCTEST_UNRELATED_INSTANTIATED_HELPER) // [r"no matching function"]
  83. void WontCompile() {
  84. DerivedProducer f;
  85. WeakPtr<Unrelated> ptr = AsWeakPtr<Unrelated>(&f);
  86. }
  87. #elif defined(NCTEST_COMPLETELY_UNRELATED_HELPER) // [r"fatal error: static assertion failed due to requirement 'std::is_base_of<base::internal::SupportsWeakPtrBase, base::Unrelated>::value': AsWeakPtr argument must inherit from SupportsWeakPtr"]
  88. void WontCompile() {
  89. Unrelated f;
  90. WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
  91. }
  92. #elif defined(NCTEST_DERIVED_COMPLETELY_UNRELATED_HELPER) // [r"fatal error: static assertion failed due to requirement 'std::is_base_of<base::internal::SupportsWeakPtrBase, base::DerivedUnrelated>::value': AsWeakPtr argument must inherit from SupportsWeakPtr"]
  93. void WontCompile() {
  94. DerivedUnrelated f;
  95. WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
  96. }
  97. #elif defined(NCTEST_AMBIGUOUS_ANCESTORS) // [r"fatal error: (use of undeclared identifier|no matching function for call to) 'AsWeakPtrImpl'"]
  98. // TODO(crbug.com/1155145): Update expectation after rolling clang.
  99. void WontCompile() {
  100. MultiplyDerivedProducer f;
  101. WeakPtr<MultiplyDerivedProducer> ptr = AsWeakPtr(&f);
  102. }
  103. #endif
  104. }