xref: /aosp_15_r20/external/clang/test/Sema/pragma-ms_struct.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -fms-extensions -verify -triple x86_64-apple-darwin9 %s
2*67e74705SXin Li 
3*67e74705SXin Li #pragma ms_struct on
4*67e74705SXin Li 
5*67e74705SXin Li #pragma ms_struct off
6*67e74705SXin Li 
7*67e74705SXin Li #pragma ms_struct reset
8*67e74705SXin Li 
9*67e74705SXin Li #pragma ms_struct // expected-warning {{incorrect use of '#pragma ms_struct on|off' - ignored}}
10*67e74705SXin Li 
11*67e74705SXin Li #pragma ms_struct on top of spaghetti  // expected-warning {{extra tokens at end of '#pragma ms_struct' - ignored}}
12*67e74705SXin Li 
13*67e74705SXin Li struct foo
14*67e74705SXin Li {
15*67e74705SXin Li   int a;
16*67e74705SXin Li   int b;
17*67e74705SXin Li   char c;
18*67e74705SXin Li };
19*67e74705SXin Li 
20*67e74705SXin Li 
21*67e74705SXin Li struct {
22*67e74705SXin Li                    unsigned long bf_1 : 12;
23*67e74705SXin Li                    unsigned long : 0;
24*67e74705SXin Li                    unsigned long bf_2 : 12;
25*67e74705SXin Li } __attribute__((__ms_struct__)) t1;
26*67e74705SXin Li 
27*67e74705SXin Li struct S {
28*67e74705SXin Li 		   double __attribute__((ms_struct)) d;	// expected-warning {{'ms_struct' attribute only applies to struct or union}}
29*67e74705SXin Li                    unsigned long bf_1 : 12;
30*67e74705SXin Li                    unsigned long : 0;
31*67e74705SXin Li                    unsigned long bf_2 : 12;
32*67e74705SXin Li } __attribute__((ms_struct)) t2;
33*67e74705SXin Li 
34*67e74705SXin Li enum
35*67e74705SXin Li {
36*67e74705SXin Li   A = 0,
37*67e74705SXin Li   B,
38*67e74705SXin Li   C
39*67e74705SXin Li } __attribute__((ms_struct)) e1; // expected-warning {{'ms_struct' attribute only applies to struct or union}}
40*67e74705SXin Li 
41*67e74705SXin Li // rdar://10513599
42*67e74705SXin Li #pragma ms_struct on
43*67e74705SXin Li 
44*67e74705SXin Li typedef struct
45*67e74705SXin Li {
46*67e74705SXin Li void *pv;
47*67e74705SXin Li int l;
48*67e74705SXin Li } Foo;
49*67e74705SXin Li 
50*67e74705SXin Li typedef struct
51*67e74705SXin Li {
52*67e74705SXin Li void *pv1;
53*67e74705SXin Li Foo foo;
54*67e74705SXin Li unsigned short fInited : 1;
55*67e74705SXin Li void *pv2;
56*67e74705SXin Li } PackOddity;
57*67e74705SXin Li 
58*67e74705SXin Li #pragma ms_struct off
59*67e74705SXin Li 
60*67e74705SXin Li static int arr[sizeof(PackOddity) == 40 ? 1 : -1];
61*67e74705SXin Li 
62*67e74705SXin Li struct __declspec(ms_struct) bad { // expected-warning {{__declspec attribute 'ms_struct' is not supported}}
63*67e74705SXin Li };
64