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