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/weak_ptr.h" 6 7namespace base { 8 9struct Producer : SupportsWeakPtr<Producer> {}; 10struct DerivedProducer : Producer {}; 11struct OtherDerivedProducer : Producer {}; 12struct MultiplyDerivedProducer : Producer, 13 SupportsWeakPtr<MultiplyDerivedProducer> {}; 14struct Unrelated {}; 15struct DerivedUnrelated : Unrelated {}; 16 17#if defined(NCTEST_AUTO_DOWNCAST) // [r"invalid conversion from"] 18 19void WontCompile() { 20 Producer f; 21 WeakPtr<Producer> ptr = f.AsWeakPtr(); 22 WeakPtr<DerivedProducer> derived_ptr = ptr; 23} 24 25#elif defined(NCTEST_STATIC_DOWNCAST) // [r"invalid conversion from"] 26 27void WontCompile() { 28 Producer f; 29 WeakPtr<Producer> ptr = f.AsWeakPtr(); 30 WeakPtr<DerivedProducer> derived_ptr = 31 static_cast<WeakPtr<DerivedProducer> >(ptr); 32} 33 34#elif defined(NCTEST_AUTO_REF_DOWNCAST) // [r"invalid initialization of reference"] 35 36void WontCompile() { 37 Producer f; 38 WeakPtr<Producer> ptr = f.AsWeakPtr(); 39 WeakPtr<DerivedProducer>& derived_ptr = ptr; 40} 41 42#elif defined(NCTEST_STATIC_REF_DOWNCAST) // [r"invalid static_cast"] 43 44void WontCompile() { 45 Producer f; 46 WeakPtr<Producer> ptr = f.AsWeakPtr(); 47 WeakPtr<DerivedProducer>& derived_ptr = 48 static_cast<WeakPtr<DerivedProducer>&>(ptr); 49} 50 51#elif defined(NCTEST_STATIC_ASWEAKPTR_DOWNCAST) // [r"no matching function"] 52 53void WontCompile() { 54 Producer f; 55 WeakPtr<DerivedProducer> ptr = 56 SupportsWeakPtr<Producer>::StaticAsWeakPtr<DerivedProducer>(&f); 57} 58 59#elif defined(NCTEST_UNSAFE_HELPER_DOWNCAST) // [r"invalid conversion from"] 60 61void WontCompile() { 62 Producer f; 63 WeakPtr<DerivedProducer> ptr = AsWeakPtr(&f); 64} 65 66#elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_DOWNCAST) // [r"no matching function"] 67 68void WontCompile() { 69 Producer f; 70 WeakPtr<DerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f); 71} 72 73#elif defined(NCTEST_UNSAFE_WRONG_INSANTIATED_HELPER_DOWNCAST) // [r"invalid conversion from"] 74 75void WontCompile() { 76 Producer f; 77 WeakPtr<DerivedProducer> ptr = AsWeakPtr<Producer>(&f); 78} 79 80#elif defined(NCTEST_UNSAFE_HELPER_CAST) // [r"cannot convert"] 81 82void WontCompile() { 83 DerivedProducer f; 84 WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr(&f); 85} 86 87#elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_SIDECAST) // [r"no matching function"] 88 89void WontCompile() { 90 DerivedProducer f; 91 WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<OtherDerivedProducer>(&f); 92} 93 94#elif defined(NCTEST_UNSAFE_WRONG_INSTANTIATED_HELPER_SIDECAST) // [r"cannot convert"] 95 96void WontCompile() { 97 DerivedProducer f; 98 WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f); 99} 100 101#elif defined(NCTEST_UNRELATED_HELPER) // [r"cannot convert"] 102 103void WontCompile() { 104 DerivedProducer f; 105 WeakPtr<Unrelated> ptr = AsWeakPtr(&f); 106} 107 108#elif defined(NCTEST_UNRELATED_INSTANTIATED_HELPER) // [r"no matching function"] 109 110void WontCompile() { 111 DerivedProducer f; 112 WeakPtr<Unrelated> ptr = AsWeakPtr<Unrelated>(&f); 113} 114 115#elif defined(NCTEST_COMPLETELY_UNRELATED_HELPER) // [r"size of array is negative"] 116 117void WontCompile() { 118 Unrelated f; 119 WeakPtr<Unrelated> ptr = AsWeakPtr(&f); 120} 121 122#elif defined(NCTEST_DERIVED_COMPLETELY_UNRELATED_HELPER) // [r"size of array is negative"] 123 124void WontCompile() { 125 DerivedUnrelated f; 126 WeakPtr<Unrelated> ptr = AsWeakPtr(&f); 127} 128 129#elif defined(NCTEST_AMBIGUOUS_ANCESTORS) // [r"ambiguous base"] 130 131void WontCompile() { 132 MultiplyDerivedProducer f; 133 WeakPtr<MultiplyDerivedProducer> ptr = AsWeakPtr(&f); 134} 135 136#endif 137 138} 139