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