1*4d495c6eSApple OSS Distributions // 2*4d495c6eSApple OSS Distributions // This tests that the alignment and size of a class are the same whether 3*4d495c6eSApple OSS Distributions // they have a `T*` or a shared pointer data member. 4*4d495c6eSApple OSS Distributions // 5*4d495c6eSApple OSS Distributions 6*4d495c6eSApple OSS Distributions #include <libkern/c++/intrusive_shared_ptr.h> 7*4d495c6eSApple OSS Distributions #include "test_policy.h" 8*4d495c6eSApple OSS Distributions #include <cstddef> 9*4d495c6eSApple OSS Distributions #include <darwintest.h> 10*4d495c6eSApple OSS Distributions 11*4d495c6eSApple OSS Distributions 12*4d495c6eSApple OSS Distributions namespace ns1 { 13*4d495c6eSApple OSS Distributions struct FooShared { 14*4d495c6eSApple OSS Distributions test_shared_ptr<int> ptr; 15*4d495c6eSApple OSS Distributions }; 16*4d495c6eSApple OSS Distributions 17*4d495c6eSApple OSS Distributions struct FooRaw { 18*4d495c6eSApple OSS Distributions int* ptr; 19*4d495c6eSApple OSS Distributions }; 20*4d495c6eSApple OSS Distributions 21*4d495c6eSApple OSS Distributions static_assert(sizeof(FooShared) == sizeof(FooRaw)); 22*4d495c6eSApple OSS Distributions static_assert(alignof(FooShared) == alignof(FooRaw)); 23*4d495c6eSApple OSS Distributions static_assert(offsetof(FooShared, ptr) == offsetof(FooRaw, ptr)); 24*4d495c6eSApple OSS Distributions } 25*4d495c6eSApple OSS Distributions 26*4d495c6eSApple OSS Distributions namespace ns2 { 27*4d495c6eSApple OSS Distributions struct FooShared { 28*4d495c6eSApple OSS Distributions int i; 29*4d495c6eSApple OSS Distributions test_shared_ptr<int> ptr; 30*4d495c6eSApple OSS Distributions }; 31*4d495c6eSApple OSS Distributions 32*4d495c6eSApple OSS Distributions struct FooRaw { 33*4d495c6eSApple OSS Distributions int i; 34*4d495c6eSApple OSS Distributions int* ptr; 35*4d495c6eSApple OSS Distributions }; 36*4d495c6eSApple OSS Distributions 37*4d495c6eSApple OSS Distributions static_assert(sizeof(FooShared) == sizeof(FooRaw)); 38*4d495c6eSApple OSS Distributions static_assert(alignof(FooShared) == alignof(FooRaw)); 39*4d495c6eSApple OSS Distributions static_assert(offsetof(FooShared, ptr) == offsetof(FooRaw, ptr)); 40*4d495c6eSApple OSS Distributions } 41*4d495c6eSApple OSS Distributions 42*4d495c6eSApple OSS Distributions namespace ns3 { 43*4d495c6eSApple OSS Distributions struct FooShared { 44*4d495c6eSApple OSS Distributions char c; 45*4d495c6eSApple OSS Distributions test_shared_ptr<int> ptr; 46*4d495c6eSApple OSS Distributions int i; 47*4d495c6eSApple OSS Distributions }; 48*4d495c6eSApple OSS Distributions 49*4d495c6eSApple OSS Distributions struct FooRaw { 50*4d495c6eSApple OSS Distributions char c; 51*4d495c6eSApple OSS Distributions int* ptr; 52*4d495c6eSApple OSS Distributions int i; 53*4d495c6eSApple OSS Distributions }; 54*4d495c6eSApple OSS Distributions 55*4d495c6eSApple OSS Distributions static_assert(sizeof(FooShared) == sizeof(FooRaw)); 56*4d495c6eSApple OSS Distributions static_assert(alignof(FooShared) == alignof(FooRaw)); 57*4d495c6eSApple OSS Distributions static_assert(offsetof(FooShared, ptr) == offsetof(FooRaw, ptr)); 58*4d495c6eSApple OSS Distributions } 59*4d495c6eSApple OSS Distributions 60*4d495c6eSApple OSS Distributions namespace ns4 { 61*4d495c6eSApple OSS Distributions struct FooShared { 62*4d495c6eSApple OSS Distributions char c; 63*4d495c6eSApple OSS Distributions unsigned int b : 5; 64*4d495c6eSApple OSS Distributions test_shared_ptr<int> ptr; 65*4d495c6eSApple OSS Distributions int i; 66*4d495c6eSApple OSS Distributions }; 67*4d495c6eSApple OSS Distributions 68*4d495c6eSApple OSS Distributions struct FooRaw { 69*4d495c6eSApple OSS Distributions char c; 70*4d495c6eSApple OSS Distributions unsigned int b : 5; 71*4d495c6eSApple OSS Distributions int* ptr; 72*4d495c6eSApple OSS Distributions int i; 73*4d495c6eSApple OSS Distributions }; 74*4d495c6eSApple OSS Distributions 75*4d495c6eSApple OSS Distributions static_assert(sizeof(FooShared) == sizeof(FooRaw)); 76*4d495c6eSApple OSS Distributions static_assert(alignof(FooShared) == alignof(FooRaw)); 77*4d495c6eSApple OSS Distributions static_assert(offsetof(FooShared, ptr) == offsetof(FooRaw, ptr)); 78*4d495c6eSApple OSS Distributions } 79*4d495c6eSApple OSS Distributions 80*4d495c6eSApple OSS Distributions namespace ns5 { 81*4d495c6eSApple OSS Distributions struct __attribute__((packed)) FooShared { 82*4d495c6eSApple OSS Distributions char c; 83*4d495c6eSApple OSS Distributions unsigned int b : 5; 84*4d495c6eSApple OSS Distributions test_shared_ptr<int> ptr; 85*4d495c6eSApple OSS Distributions int i; 86*4d495c6eSApple OSS Distributions }; 87*4d495c6eSApple OSS Distributions 88*4d495c6eSApple OSS Distributions struct __attribute__((packed)) FooRaw { 89*4d495c6eSApple OSS Distributions char c; 90*4d495c6eSApple OSS Distributions unsigned int b : 5; 91*4d495c6eSApple OSS Distributions int* ptr; 92*4d495c6eSApple OSS Distributions int i; 93*4d495c6eSApple OSS Distributions }; 94*4d495c6eSApple OSS Distributions 95*4d495c6eSApple OSS Distributions static_assert(sizeof(FooShared) == sizeof(FooRaw)); 96*4d495c6eSApple OSS Distributions static_assert(alignof(FooShared) == alignof(FooRaw)); 97*4d495c6eSApple OSS Distributions static_assert(offsetof(FooShared, ptr) == offsetof(FooRaw, ptr)); 98*4d495c6eSApple OSS Distributions } 99*4d495c6eSApple OSS Distributions 100*4d495c6eSApple OSS Distributions namespace ns6 { 101*4d495c6eSApple OSS Distributions struct FooShared { 102*4d495c6eSApple OSS Distributions char c; 103*4d495c6eSApple OSS Distributions unsigned int b : 5; 104*4d495c6eSApple OSS Distributions test_shared_ptr<int> ptr; 105*4d495c6eSApple OSS Distributions int i __attribute__((packed)); 106*4d495c6eSApple OSS Distributions }; 107*4d495c6eSApple OSS Distributions 108*4d495c6eSApple OSS Distributions struct FooRaw { 109*4d495c6eSApple OSS Distributions char c; 110*4d495c6eSApple OSS Distributions unsigned int b : 5; 111*4d495c6eSApple OSS Distributions int* ptr; 112*4d495c6eSApple OSS Distributions int i __attribute__((packed)); 113*4d495c6eSApple OSS Distributions }; 114*4d495c6eSApple OSS Distributions 115*4d495c6eSApple OSS Distributions static_assert(sizeof(FooShared) == sizeof(FooRaw)); 116*4d495c6eSApple OSS Distributions static_assert(alignof(FooShared) == alignof(FooRaw)); 117*4d495c6eSApple OSS Distributions static_assert(offsetof(FooShared, ptr) == offsetof(FooRaw, ptr)); 118*4d495c6eSApple OSS Distributions } 119*4d495c6eSApple OSS Distributions 120*4d495c6eSApple OSS Distributions namespace ns7 { 121*4d495c6eSApple OSS Distributions struct FooShared { 122*4d495c6eSApple OSS Distributions char c; 123*4d495c6eSApple OSS Distributions unsigned int b : 5; 124*4d495c6eSApple OSS Distributions test_shared_ptr<int> ptr __attribute__((packed)); 125*4d495c6eSApple OSS Distributions int i; 126*4d495c6eSApple OSS Distributions }; 127*4d495c6eSApple OSS Distributions 128*4d495c6eSApple OSS Distributions struct FooRaw { 129*4d495c6eSApple OSS Distributions char c; 130*4d495c6eSApple OSS Distributions unsigned int b : 5; 131*4d495c6eSApple OSS Distributions int* ptr __attribute__((packed)); 132*4d495c6eSApple OSS Distributions int i; 133*4d495c6eSApple OSS Distributions }; 134*4d495c6eSApple OSS Distributions 135*4d495c6eSApple OSS Distributions static_assert(sizeof(FooShared) == sizeof(FooRaw)); 136*4d495c6eSApple OSS Distributions static_assert(alignof(FooShared) == alignof(FooRaw)); 137*4d495c6eSApple OSS Distributions static_assert(offsetof(FooShared, ptr) == offsetof(FooRaw, ptr)); 138*4d495c6eSApple OSS Distributions } 139*4d495c6eSApple OSS Distributions 140*4d495c6eSApple OSS Distributions T_DECL(abi_size_alignment, "intrusive_shared_ptr.abi.size_alignment", T_META_TAG_VM_PREFERRED) { 141*4d495c6eSApple OSS Distributions T_PASS("intrusive_shared_ptr.abi.size_alignment compile-time tests passed"); 142*4d495c6eSApple OSS Distributions } 143