You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
4.8 KiB
145 lines
4.8 KiB
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// This is a "No Compile Test" suite.
|
|
// http://dev.chromium.org/developers/testing/no-compile-tests
|
|
|
|
#include "base/memory/weak_ptr.h"
|
|
|
|
namespace base {
|
|
|
|
struct Producer : SupportsWeakPtr<Producer> {};
|
|
struct DerivedProducer : Producer {};
|
|
struct OtherDerivedProducer : Producer {};
|
|
struct MultiplyDerivedProducer : Producer,
|
|
SupportsWeakPtr<MultiplyDerivedProducer> {};
|
|
struct Unrelated {};
|
|
struct DerivedUnrelated : Unrelated {};
|
|
|
|
#if defined(NCTEST_AUTO_DOWNCAST) // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
|
|
|
|
void WontCompile() {
|
|
Producer f;
|
|
WeakPtr<Producer> ptr = f.AsWeakPtr();
|
|
WeakPtr<DerivedProducer> derived_ptr = ptr;
|
|
}
|
|
|
|
#elif defined(NCTEST_STATIC_DOWNCAST) // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
|
|
|
|
void WontCompile() {
|
|
Producer f;
|
|
WeakPtr<Producer> ptr = f.AsWeakPtr();
|
|
WeakPtr<DerivedProducer> derived_ptr =
|
|
static_cast<WeakPtr<DerivedProducer> >(ptr);
|
|
}
|
|
|
|
#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>'"]
|
|
|
|
void WontCompile() {
|
|
Producer f;
|
|
WeakPtr<Producer> ptr = f.AsWeakPtr();
|
|
WeakPtr<DerivedProducer>& derived_ptr = ptr;
|
|
}
|
|
|
|
#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>'"]
|
|
|
|
void WontCompile() {
|
|
Producer f;
|
|
WeakPtr<Producer> ptr = f.AsWeakPtr();
|
|
WeakPtr<DerivedProducer>& derived_ptr =
|
|
static_cast<WeakPtr<DerivedProducer>&>(ptr);
|
|
}
|
|
|
|
#elif defined(NCTEST_STATIC_ASWEAKPTR_DOWNCAST) // [r"no matching function"]
|
|
|
|
void WontCompile() {
|
|
Producer f;
|
|
WeakPtr<DerivedProducer> ptr =
|
|
SupportsWeakPtr<Producer>::StaticAsWeakPtr<DerivedProducer>(&f);
|
|
}
|
|
|
|
#elif defined(NCTEST_UNSAFE_HELPER_DOWNCAST) // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
|
|
|
|
void WontCompile() {
|
|
Producer f;
|
|
WeakPtr<DerivedProducer> ptr = AsWeakPtr(&f);
|
|
}
|
|
|
|
#elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_DOWNCAST) // [r"no matching function"]
|
|
|
|
void WontCompile() {
|
|
Producer f;
|
|
WeakPtr<DerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f);
|
|
}
|
|
|
|
#elif defined(NCTEST_UNSAFE_WRONG_INSANTIATED_HELPER_DOWNCAST) // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
|
|
|
|
void WontCompile() {
|
|
Producer f;
|
|
WeakPtr<DerivedProducer> ptr = AsWeakPtr<Producer>(&f);
|
|
}
|
|
|
|
#elif defined(NCTEST_UNSAFE_HELPER_CAST) // [r"cannot initialize a variable of type 'base::OtherDerivedProducer \*' with an rvalue of type 'base::DerivedProducer \*'"]
|
|
|
|
void WontCompile() {
|
|
DerivedProducer f;
|
|
WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr(&f);
|
|
}
|
|
|
|
#elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_SIDECAST) // [r"fatal error: no matching function for call to 'AsWeakPtr'"]
|
|
|
|
void WontCompile() {
|
|
DerivedProducer f;
|
|
WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<OtherDerivedProducer>(&f);
|
|
}
|
|
|
|
#elif defined(NCTEST_UNSAFE_WRONG_INSTANTIATED_HELPER_SIDECAST) // [r"cannot initialize a variable of type 'base::OtherDerivedProducer \*' with an rvalue of type 'base::DerivedProducer \*'"]
|
|
|
|
void WontCompile() {
|
|
DerivedProducer f;
|
|
WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f);
|
|
}
|
|
|
|
#elif defined(NCTEST_UNRELATED_HELPER) // [r"cannot initialize a variable of type 'base::Unrelated \*' with an rvalue of type 'base::DerivedProducer \*'"]
|
|
|
|
void WontCompile() {
|
|
DerivedProducer f;
|
|
WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
|
|
}
|
|
|
|
#elif defined(NCTEST_UNRELATED_INSTANTIATED_HELPER) // [r"no matching function"]
|
|
|
|
void WontCompile() {
|
|
DerivedProducer f;
|
|
WeakPtr<Unrelated> ptr = AsWeakPtr<Unrelated>(&f);
|
|
}
|
|
|
|
// TODO(hans): Remove .* and update the static_assert expectations once we roll
|
|
// past Clang r313315. https://crbug.com/765692.
|
|
|
|
#elif defined(NCTEST_COMPLETELY_UNRELATED_HELPER) // [r"fatal error: static_assert failed .*\"AsWeakPtr argument must inherit from SupportsWeakPtr\""]
|
|
|
|
void WontCompile() {
|
|
Unrelated f;
|
|
WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
|
|
}
|
|
|
|
#elif defined(NCTEST_DERIVED_COMPLETELY_UNRELATED_HELPER) // [r"fatal error: static_assert failed .*\"AsWeakPtr argument must inherit from SupportsWeakPtr\""]
|
|
|
|
void WontCompile() {
|
|
DerivedUnrelated f;
|
|
WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
|
|
}
|
|
|
|
#elif defined(NCTEST_AMBIGUOUS_ANCESTORS) // [r"fatal error: use of undeclared identifier 'AsWeakPtrImpl'"]
|
|
|
|
void WontCompile() {
|
|
MultiplyDerivedProducer f;
|
|
WeakPtr<MultiplyDerivedProducer> ptr = AsWeakPtr(&f);
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|