xref: /llvm-project/clang/test/Sema/ZOSExtensions.cpp (revision 135fecd4441068667ef23f56098befd0c42f89f2)
1 // RUN: %clang_cc1 -triple s390x-ibm-zos %s -fsyntax-only -fzos-extensions -verify
2 // RUN: %clang_cc1 -triple s390x-ibm-zos %s -fsyntax-only -verify
3 
4 struct A {
5   int a;
6   short b;
7   float q;
8   double z;
9 };
10 
11 union B {
12   int a;
13   short b;
14   float q;
15   double z;
16 };
17 
18 class C {
19   int a;
20   short b;
21   float q;
22   double z;
23 };
24 
25 // ************************
26 // INCORRECT DECLARATION
27 // ************************
28 int * __ptr64 p64; // expected-error {{expected ';' after top level declarator}}
29 int *wrong_var3 __ptr32; // expected-error {{expected ';' after top level declarator}} expected-warning {{declaration does not declare anything}}
30 
31 // **************************
32 // INCORRECT USAGES OF PTR32
33 // **************************
34 struct D {
35   int __ptr32 *a; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
36 };
37 
38 union E {
39   int __ptr32 *b; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
40 };
41 
42 char __ptr32 *a; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
43 signed char __ptr32 *b; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
44 unsigned char __ptr32 *c; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
45 int __ptr32 *d; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
46 signed int __ptr32 *e; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
47 unsigned int __ptr32 *f; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
48 short int __ptr32 *g; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
49 signed short int __ptr32 *h; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
50 unsigned short int __ptr32 *i; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
51 long int __ptr32 *j; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
52 signed long int __ptr32 *k; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
53 unsigned long int __ptr32 *l; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
54 long long int __ptr32 *m; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
55 signed long long int __ptr32 *n; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
56 unsigned long long int __ptr32 *o; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
57 float __ptr32 *p;                  // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
58 double __ptr32 *q;                 // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
59 int __ptr32 **r;                   // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
60 int __ptr32 *__ptr32 *s;           // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
61 int __ptr32 *__ptr32 *__ptr32 t;   // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
62 int __ptr32 *__ptr32 *__ptr32 *__ptr32 u; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
63 int __ptr32 __ptr32 **v_i;                // expected-error {{'__ptr32' attribute only applies to pointer arguments}} expected-error {{'__ptr32' attribute only applies to pointer arguments}}
64 int __ptr32 __ptr32 __ptr32 w_i;          // expected-error {{'__ptr32' attribute only applies to pointer arguments}} expected-error {{'__ptr32' attribute only applies to pointer arguments}} expected-error {{'__ptr32' attribute only applies to pointer arguments}}
65 
66 __ptr32 int wrong_var; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
67 
68 struct A __ptr32 *c1;                  // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
69 struct A __ptr32 **e1;                 // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
70 struct A __ptr32 *__ptr32 *f1;         // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
71 struct A __ptr32 *__ptr32 *__ptr32 g1; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
72 union B __ptr32 *d1; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
73 union B __ptr32 **h1; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
74 union B __ptr32 * __ptr32 *i1; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
75 union B __ptr32 * __ptr32 * __ptr32 j1; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
76 
77 C __ptr32 **k1; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
78 C __ptr32 * __ptr32 *l1; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
79 C __ptr32 * __ptr32 * __ptr32 m1; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
80 
81 struct D n1;
82 union E o1;
83 
84 int incorrect_func() {
85   int __ptr32 = 1; // expected-error {{expected unqualified-id}}
86   return __ptr32; // expected-error {{expected expression}}
87 }
88 
89 typedef int __ptr32; // expected-warning {{typedef requires a name}}
90 int incorrect_func2() {
91   return 1;
92 }
93 
94 typedef int __ptr32 *v; // expected-error {{'__ptr32' attribute only applies to pointer arguments}}
95 int incorrect_func3() {
96   v v1;
97   return 0;
98 }
99 
100 int *__ptr32 a_ptr; //expected-note {{previous definition is here}}
101 int *a_ptr;         // expected-error {{redefinition of 'a_ptr' with a different type: 'int *' vs 'int * __ptr32'}}
102 
103 // *******************************************************
104 // FUNCTION OVERLOADING BETWEEN PTR32 AND REGULAR POINTERS
105 // *******************************************************
106 void func(int * __ptr32 p32) {} // expected-note {{previous definition is here}}
107 void func(int *p64) {}          // expected-error {{redefinition of 'func'}}
108 
109 // Overloads between ptr32 and other non-pointer types are permissible
110 void func1(int *__ptr32 p32) {}
111 void func1(int p64) {}
112 
113 // ******
114 // MISC
115 // ******
116 void func2() {
117   char * __ptr32 v = ((char * __ptr32 *)1028)[0];
118   char *v1 = ((char ** __ptr32 *)1028)[0][1];
119 }
120 
121