blob: e4e9b023df6694977d5613b86bb7315e97642c74 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// 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 "partition_alloc/pointers/raw_ref.h"
namespace {
// Using distinct enum types causes distinct `raw_ptr` template instantiations,
// so we get assertion failures below where we expect.
enum TypeA {};
enum TypeB {};
enum TypeC {};
enum TypeD {};
using DanglingRefA = raw_ref<TypeA, base::RawPtrTraits::kMayDangle>;
using DanglingRefB = raw_ref<TypeB, base::RawPtrTraits::kMayDangle>;
using DanglingRefC = raw_ref<TypeC, base::RawPtrTraits::kMayDangle>;
using DanglingRefD = raw_ref<TypeD, base::RawPtrTraits::kMayDangle>;
void CrossKindConversionFromMayDangle() {
// Conversions may add the `kMayDangle` trait, but not remove it.
TypeA a;
TypeB b;
TypeC c;
TypeD d;
DanglingRefA ref_a1(a);
DanglingRefB ref_b1(b);
DanglingRefC ref_c1(c);
DanglingRefD ref_d1(d);
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)'}}
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)'}}
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)'}}
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)'}}
}
void CrossKindConversionFromDummy() {
// Only the `kMayDangle` trait can change in an implicit conversion.
TypeA a;
TypeB b;
TypeC c;
TypeD d;
raw_ref<TypeA, base::RawPtrTraits::kDummyForTest> ref_a1(a);
raw_ref<TypeB, base::RawPtrTraits::kDummyForTest> ref_b1(b);
raw_ref<TypeC, base::RawPtrTraits::kDummyForTest> ref_c1(c);
raw_ref<TypeD, base::RawPtrTraits::kDummyForTest> ref_d1(d);
DanglingRefA ref_a2 = ref_a1; // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeA, 2052>::Traits | RawPtrTraits::kMayDangle)'}}
DanglingRefB ref_b3(ref_b1); // expected-error@*:* {{static assertion failed due to requirement 'Traits == (raw_ptr<(anonymous namespace)::TypeB, 2052>::Traits | RawPtrTraits::kMayDangle)'}}
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)'}}
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)'}}
}
} // namespace