1// Copyright 2023 The Chromium Authors 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 "partition_alloc/pointers/raw_ref.h" 9 10namespace { 11 12// Using distinct enum types causes distinct `raw_ptr` template instantiations, 13// so we get assertion failures below where we expect. 14enum TypeA {}; 15enum TypeB {}; 16enum TypeC {}; 17enum TypeD {}; 18 19using DanglingRefA = raw_ref<TypeA, base::RawPtrTraits::kMayDangle>; 20using DanglingRefB = raw_ref<TypeB, base::RawPtrTraits::kMayDangle>; 21using DanglingRefC = raw_ref<TypeC, base::RawPtrTraits::kMayDangle>; 22using DanglingRefD = raw_ref<TypeD, base::RawPtrTraits::kMayDangle>; 23 24void CrossKindConversionFromMayDangle() { 25 // Conversions may add the `kMayDangle` trait, but not remove it. 26 TypeA a; 27 TypeB b; 28 TypeC c; 29 TypeD d; 30 DanglingRefA ref_a1(a); 31 DanglingRefB ref_b1(b); 32 DanglingRefC ref_c1(c); 33 DanglingRefD ref_d1(d); 34 raw_ref<TypeA> ref_a2 = ref_a1; // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeA, 5>::Traits | RawPtrTraits::kMayDangle)'}} 35 raw_ref<TypeB> ref_b2(ref_b1); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeB, 5>::Traits | RawPtrTraits::kMayDangle)'}} 36 raw_ref<TypeC> ref_c2 = std::move(ref_c1); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeC, 5>::Traits | RawPtrTraits::kMayDangle)'}} 37 raw_ref<TypeD> ref_d2(std::move(ref_d1)); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeD, 5>::Traits | RawPtrTraits::kMayDangle)'}} 38} 39 40void CrossKindConversionFromDummy() { 41 // Only the `kMayDangle` trait can change in an implicit conversion. 42 TypeA a; 43 TypeB b; 44 TypeC c; 45 TypeD d; 46 raw_ref<TypeA, base::RawPtrTraits::kDummyForTest> ref_a1(a); 47 raw_ref<TypeB, base::RawPtrTraits::kDummyForTest> ref_b1(b); 48 raw_ref<TypeC, base::RawPtrTraits::kDummyForTest> ref_c1(c); 49 raw_ref<TypeD, base::RawPtrTraits::kDummyForTest> ref_d1(d); 50 DanglingRefA ref_a2 = ref_a1; // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeA, 2052>::Traits | RawPtrTraits::kMayDangle)'}} 51 DanglingRefB ref_b3(ref_b1); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeB, 2052>::Traits | RawPtrTraits::kMayDangle)'}} 52 DanglingRefC ref_c2 = std::move(ref_c1); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeC, 2052>::Traits | RawPtrTraits::kMayDangle)'}} 53 DanglingRefD ref_d2(std::move(ref_d1)); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeD, 2052>::Traits | RawPtrTraits::kMayDangle)'}} 54} 55 56} // namespace 57