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