// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// The test relies on a 64bit target (test.py sets the triple explicitly).
#include "heap/stubs.h"
namespace blink {
class Object : public GarbageCollected<Object> {
void Trace(Visitor*) const {}
};
namespace {
struct DisallowNewWithPadding {
DISALLOW_NEW();
public:
virtual void Trace(Visitor* v) const {
v->Trace(a);
v->Trace(b);
}
// The plugin should warn that reordering would make sense here.
Member<Object> a;
void* raw;
Member<Object> b;
};
struct DisallowNewWithoutPadding {
DISALLOW_NEW();
public:
virtual void Trace(Visitor* v) const {
v->Trace(a);
v->Trace(b);
}
// The plugin shouldn't warn, e.g. reordering wouldn't eliminate padding.
Member<Object> a;
Member<Object> b;
void* raw;
};
// Don't warn for templates until instantiated.
template <class T>
struct DisallowNewWithPaddingTemplate {
DISALLOW_NEW();
public:
virtual void Trace(Visitor* v) const {
v->Trace(a);
v->Trace(b);
}
Member<Object> a;
void* raw;
Member<Object> b;
};
template struct DisallowNewWithPaddingTemplate<int>;
// A GarbageCollected class shall not be checked.
class GCed : GarbageCollected<GCed> {
void Trace(Visitor* v) const {
v->Trace(a);
v->Trace(b);
}
Member<Object> a;
void* raw;
Member<Object> b;
};
// Explicitly setting the alignment requirement on fields should disable the
// check.
struct DisallowNewWithExplicitAlignment {
DISALLOW_NEW();
void Trace(Visitor* v) const {
v->Trace(a);
v->Trace(b);
}
Member<Object> a;
void* raw;
alignas(32) Member<Object> b;
};
// Disable the check with classes containing bitfields.
struct DisallowNewWithBitfield {
DISALLOW_NEW();
void Trace(Visitor* v) const {
v->Trace(a);
v->Trace(b);
}
Member<Object> a;
void* raw;
int b1 : 1;
int b2 : 2;
Member<Object> b;
};
// Disable the check with classes containing [[no_unique_address]].
struct DisallowNewWithNoUniqueAddress {
DISALLOW_NEW();
class Empty {};
void Trace(Visitor* v) const {
v->Trace(a);
v->Trace(b);
}
Member<Object> a;
void* raw;
[[no_unique_address]] Empty empty;
Member<Object> b;
};
} // namespace
} // namespace blink