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 // This is a "No Compile Test" suite. 6 // http://dev.chromium.org/developers/testing/no-compile-tests 7 8 #include "base/memory/weak_ptr.h" 9 10 namespace base { 11 12 struct Producer : SupportsWeakPtr<Producer> {}; 13 struct DerivedProducer : Producer {}; 14 struct OtherDerivedProducer : Producer {}; 15 struct MultiplyDerivedProducer : Producer, 16 SupportsWeakPtr<MultiplyDerivedProducer> {}; 17 struct Unrelated {}; 18 struct DerivedUnrelated : Unrelated {}; 19 20 #if defined(NCTEST_AUTO_DOWNCAST) // [r"fatal error: cannot initialize a member subobject of type 'base::DerivedProducer \*' with an lvalue of type 'base::Producer \*const'"] 21 22 void WontCompile() { 23 Producer f; 24 WeakPtr<Producer> ptr = f.AsWeakPtr(); 25 WeakPtr<DerivedProducer> derived_ptr = ptr; 26 } 27 28 #elif defined(NCTEST_STATIC_DOWNCAST) // [r"fatal error: cannot initialize a member subobject of type 'base::DerivedProducer \*' with an lvalue of type 'base::Producer \*const'"] 29 30 void WontCompile() { 31 Producer f; 32 WeakPtr<Producer> ptr = f.AsWeakPtr(); 33 WeakPtr<DerivedProducer> derived_ptr = 34 static_cast<WeakPtr<DerivedProducer> >(ptr); 35 } 36 37 #elif defined(NCTEST_AUTO_REF_DOWNCAST) // [r"fatal error: non-const lvalue reference to type 'WeakPtr<base::DerivedProducer>' cannot bind to a value of unrelated type 'WeakPtr<base::Producer>'"] 38 39 void WontCompile() { 40 Producer f; 41 WeakPtr<Producer> ptr = f.AsWeakPtr(); 42 WeakPtr<DerivedProducer>& derived_ptr = ptr; 43 } 44 45 #elif defined(NCTEST_STATIC_REF_DOWNCAST) // [r"fatal error: non-const lvalue reference to type 'WeakPtr<base::DerivedProducer>' cannot bind to a value of unrelated type 'WeakPtr<base::Producer>'"] 46 47 void WontCompile() { 48 Producer f; 49 WeakPtr<Producer> ptr = f.AsWeakPtr(); 50 WeakPtr<DerivedProducer>& derived_ptr = 51 static_cast<WeakPtr<DerivedProducer>&>(ptr); 52 } 53 54 #elif defined(NCTEST_STATIC_ASWEAKPTR_DOWNCAST) // [r"no matching function"] 55 56 void WontCompile() { 57 Producer f; 58 WeakPtr<DerivedProducer> ptr = 59 SupportsWeakPtr<Producer>::StaticAsWeakPtr<DerivedProducer>(&f); 60 } 61 62 #elif defined(NCTEST_UNSAFE_HELPER_DOWNCAST) // [r"fatal error: cannot initialize a member subobject of type 'base::DerivedProducer \*' with an lvalue of type 'base::Producer \*'"] 63 64 void WontCompile() { 65 Producer f; 66 WeakPtr<DerivedProducer> ptr = AsWeakPtr(&f); 67 } 68 69 #elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_DOWNCAST) // [r"no matching function"] 70 71 void WontCompile() { 72 Producer f; 73 WeakPtr<DerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f); 74 } 75 76 #elif defined(NCTEST_UNSAFE_WRONG_INSANTIATED_HELPER_DOWNCAST) // [r"fatal error: cannot initialize a member subobject of type 'base::DerivedProducer \*' with an lvalue of type 'base::Producer \*'"] 77 78 void WontCompile() { 79 Producer f; 80 WeakPtr<DerivedProducer> ptr = AsWeakPtr<Producer>(&f); 81 } 82 83 #elif defined(NCTEST_UNSAFE_HELPER_CAST) // [r"fatal error: cannot initialize a member subobject of type 'base::OtherDerivedProducer \*' with an lvalue of type 'base::DerivedProducer \*'"] 84 85 void WontCompile() { 86 DerivedProducer f; 87 WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr(&f); 88 } 89 90 #elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_SIDECAST) // [r"fatal error: no matching function for call to 'AsWeakPtr'"] 91 92 void WontCompile() { 93 DerivedProducer f; 94 WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<OtherDerivedProducer>(&f); 95 } 96 97 #elif defined(NCTEST_UNSAFE_WRONG_INSTANTIATED_HELPER_SIDECAST) // [r"fatal error: cannot initialize a member subobject of type 'base::OtherDerivedProducer \*' with an lvalue of type 'base::DerivedProducer \*'"] 98 99 void WontCompile() { 100 DerivedProducer f; 101 WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f); 102 } 103 104 #elif defined(NCTEST_UNRELATED_HELPER) // [r"fatal error: cannot initialize a member subobject of type 'base::Unrelated \*' with an lvalue of type 'base::DerivedProducer \*'"] 105 106 void WontCompile() { 107 DerivedProducer f; 108 WeakPtr<Unrelated> ptr = AsWeakPtr(&f); 109 } 110 111 #elif defined(NCTEST_UNRELATED_INSTANTIATED_HELPER) // [r"no matching function"] 112 113 void WontCompile() { 114 DerivedProducer f; 115 WeakPtr<Unrelated> ptr = AsWeakPtr<Unrelated>(&f); 116 } 117 118 #elif defined(NCTEST_COMPLETELY_UNRELATED_HELPER) // [r"fatal error: static_assert failed \"AsWeakPtr argument must inherit from SupportsWeakPtr\""] 119 120 void WontCompile() { 121 Unrelated f; 122 WeakPtr<Unrelated> ptr = AsWeakPtr(&f); 123 } 124 125 #elif defined(NCTEST_DERIVED_COMPLETELY_UNRELATED_HELPER) // [r"fatal error: static_assert failed \"AsWeakPtr argument must inherit from SupportsWeakPtr\""] 126 127 void WontCompile() { 128 DerivedUnrelated f; 129 WeakPtr<Unrelated> ptr = AsWeakPtr(&f); 130 } 131 132 #elif defined(NCTEST_AMBIGUOUS_ANCESTORS) // [r"fatal error: use of undeclared identifier 'AsWeakPtrImpl'"] 133 134 void WontCompile() { 135 MultiplyDerivedProducer f; 136 WeakPtr<MultiplyDerivedProducer> ptr = AsWeakPtr(&f); 137 } 138 139 #endif 140 141 } 142