xref: /aosp_15_r20/external/clang/test/SemaCXX/offsetof.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fsyntax-only -verify %s -Winvalid-offsetof -std=c++98
2*67e74705SXin Li 
3*67e74705SXin Li struct NonPOD {
4*67e74705SXin Li   virtual void f();
5*67e74705SXin Li   int m;
6*67e74705SXin Li };
7*67e74705SXin Li 
8*67e74705SXin Li struct P {
9*67e74705SXin Li   NonPOD fieldThatPointsToANonPODType;
10*67e74705SXin Li };
11*67e74705SXin Li 
f()12*67e74705SXin Li void f() {
13*67e74705SXin Li   int i = __builtin_offsetof(P, fieldThatPointsToANonPODType.m); // expected-warning{{offset of on non-POD type 'P'}}
14*67e74705SXin Li }
15*67e74705SXin Li 
16*67e74705SXin Li struct Base { int x; };
17*67e74705SXin Li struct Derived : Base { int y; };
18*67e74705SXin Li int o = __builtin_offsetof(Derived, x); // expected-warning{{offset of on non-POD type}}
19*67e74705SXin Li 
20*67e74705SXin Li const int o2 = sizeof(__builtin_offsetof(Derived, x));
21*67e74705SXin Li 
22*67e74705SXin Li struct HasArray {
23*67e74705SXin Li   int array[17];
24*67e74705SXin Li };
25*67e74705SXin Li 
26*67e74705SXin Li // Constant and non-constant offsetof expressions
test_ice(int i)27*67e74705SXin Li void test_ice(int i) {
28*67e74705SXin Li   int array0[__builtin_offsetof(HasArray, array[5])];
29*67e74705SXin Li   int array1[__builtin_offsetof(HasArray, array[i])];
30*67e74705SXin Li }
31*67e74705SXin Li 
32*67e74705SXin Li // Bitfields
33*67e74705SXin Li struct has_bitfields {
34*67e74705SXin Li   int i : 7;
35*67e74705SXin Li   int j : 12; // expected-note{{bit-field is declared here}}
36*67e74705SXin Li };
37*67e74705SXin Li 
38*67e74705SXin Li int test3 = __builtin_offsetof(struct has_bitfields, j); // expected-error{{cannot compute offset of bit-field 'j'}}
39*67e74705SXin Li 
40*67e74705SXin Li // offsetof referring to members of a base class.
41*67e74705SXin Li struct Base1 {
42*67e74705SXin Li   int x;
43*67e74705SXin Li };
44*67e74705SXin Li 
45*67e74705SXin Li struct Base2 {
46*67e74705SXin Li   int y;
47*67e74705SXin Li };
48*67e74705SXin Li 
49*67e74705SXin Li struct Derived2 : public Base1, public Base2 {
50*67e74705SXin Li   int z;
51*67e74705SXin Li };
52*67e74705SXin Li 
53*67e74705SXin Li int derived1[__builtin_offsetof(Derived2, x) == 0? 1 : -1];
54*67e74705SXin Li int derived2[__builtin_offsetof(Derived2, y)  == 4? 1 : -1];
55*67e74705SXin Li int derived3[__builtin_offsetof(Derived2, z)  == 8? 1 : -1];
56*67e74705SXin Li 
57*67e74705SXin Li // offsetof referring to anonymous struct in base.
58*67e74705SXin Li // PR7769
59*67e74705SXin Li struct foo {
60*67e74705SXin Li     struct {
61*67e74705SXin Li         int x;
62*67e74705SXin Li     };
63*67e74705SXin Li };
64*67e74705SXin Li 
65*67e74705SXin Li struct bar : public foo  {
66*67e74705SXin Li };
67*67e74705SXin Li 
68*67e74705SXin Li int anonstruct[__builtin_offsetof(bar, x) == 0 ? 1 : -1];
69*67e74705SXin Li 
70*67e74705SXin Li struct LtoRCheck {
71*67e74705SXin Li   int a[10];
72*67e74705SXin Li   int f();
73*67e74705SXin Li };
74*67e74705SXin Li int ltor = __builtin_offsetof(struct LtoRCheck, a[LtoRCheck().f]); // \
75*67e74705SXin Li   expected-error {{reference to non-static member function must be called}}
76*67e74705SXin Li 
77*67e74705SXin Li namespace PR17578 {
78*67e74705SXin Li struct Base {
79*67e74705SXin Li   int Field;
80*67e74705SXin Li };
81*67e74705SXin Li struct Derived : virtual Base {
FunPR17578::Derived82*67e74705SXin Li   void Fun() { (void)__builtin_offsetof(Derived, Field); } // expected-warning {{offset of on non-POD type}} \
83*67e74705SXin Li                                                               expected-error {{invalid application of 'offsetof' to a field of a virtual base}}
84*67e74705SXin Li };
85*67e74705SXin Li }
86