// Copyright 2020 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 #include // for std::ignore #include // for std::remove_pointer_t #include "base/memory/raw_ptr.h" namespace { struct Producer {}; struct DerivedProducer : Producer {}; struct OtherDerivedProducer : Producer {}; struct Unrelated {}; struct DerivedUnrelated : Unrelated {}; struct PmfTest { public: int Func(char, double) const { return 11; } }; #if defined(NCTEST_AUTO_DOWNCAST) // [r"no viable conversion from 'raw_ptr' to 'raw_ptr'"] void WontCompile() { Producer f; raw_ptr ptr = &f; raw_ptr derived_ptr = ptr; } #elif defined(NCTEST_STATIC_DOWNCAST) // [r"no matching conversion for static_cast from 'raw_ptr' to 'raw_ptr'"] void WontCompile() { Producer f; raw_ptr ptr = &f; raw_ptr derived_ptr = static_cast>(ptr); } #elif defined(NCTEST_AUTO_REF_DOWNCAST) // [r"non-const lvalue reference to type 'raw_ptr' cannot bind to a value of unrelated type 'raw_ptr'"] void WontCompile() { Producer f; raw_ptr ptr = &f; raw_ptr& derived_ptr = ptr; } #elif defined(NCTEST_STATIC_REF_DOWNCAST) // [r"non-const lvalue reference to type 'raw_ptr' cannot bind to a value of unrelated type 'raw_ptr'"] void WontCompile() { Producer f; raw_ptr ptr = &f; raw_ptr& derived_ptr = static_cast&>(ptr); } #elif defined(NCTEST_AUTO_DOWNCAST_FROM_RAW) // [r"no viable conversion from 'Producer \*' to 'raw_ptr'"] void WontCompile() { Producer f; raw_ptr ptr = &f; } #elif defined(NCTEST_UNRELATED_FROM_RAW) // [r"no viable conversion from 'DerivedProducer \*' to 'raw_ptr'"] void WontCompile() { DerivedProducer f; raw_ptr ptr = &f; } #elif defined(NCTEST_UNRELATED_STATIC_FROM_WRAPPED) // [r"static_cast from '\(anonymous namespace\)::DerivedProducer \*' to '\(anonymous namespace\)::Unrelated \*', which are not related by inheritance, is not allowed"] void WontCompile() { DerivedProducer f; raw_ptr ptr = &f; std::ignore = static_cast(ptr); } #elif defined(NCTEST_VOID_DEREFERENCE) // [r"indirection requires pointer operand \('raw_ptr' invalid\)"] void WontCompile() { const char foo[] = "42"; raw_ptr ptr = foo; std::ignore = *ptr; } #elif defined(NCTEST_FUNCTION_POINTER) // [r"raw_ptr doesn't work with this kind of pointee type T"] void WontCompile() { raw_ptr raw_ptr_var; std::ignore = raw_ptr_var.get(); } #elif defined(NCTEST_POINTER_TO_MEMBER) // [r"overload resolution selected deleted operator '->\*'"] void WontCompile() { PmfTest object; int (PmfTest::*pmf_func)(char, double) const = &PmfTest::Func; raw_ptr object_ptr = &object; std::ignore = object_ptr->*pmf_func; } #elif defined(NCTEST_DANGLING_GSL) // [r"object backing the pointer will be destroyed at the end of the full-expression"] void WontCompile() { [[maybe_unused]] raw_ptr ptr = std::make_unique(2).get(); } #endif } // namespace