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