1 | // RUN: %clang_cc1 %s -triple %itanium_abi_triple -fsyntax-only -verify -Wc++-compat |
2 | |
3 | // Note: Empty C structs are 4 bytes in the Microsoft ABI. |
4 | |
5 | struct emp_1 { // expected-warning {{empty struct has size 0 in C, size 1 in C++}} |
6 | }; |
7 | |
8 | union emp_2 { // expected-warning {{empty union has size 0 in C, size 1 in C++}} |
9 | }; |
10 | |
11 | struct emp_3 { // expected-warning {{struct has size 0 in C, size 1 in C++}} |
12 | int : 0; |
13 | }; |
14 | |
15 | union emp_4 { // expected-warning {{union has size 0 in C, size 1 in C++}} |
16 | int : 0; |
17 | }; |
18 | |
19 | struct emp_5 { // expected-warning {{struct has size 0 in C, size 1 in C++}} |
20 | int : 0; |
21 | int : 0; |
22 | }; |
23 | |
24 | union emp_6 { // expected-warning {{union has size 0 in C, size 1 in C++}} |
25 | int : 0; |
26 | int : 0; |
27 | }; |
28 | |
29 | struct emp_7 { // expected-warning {{struct has size 0 in C, size 1 in C++}} |
30 | struct emp_1 f1; |
31 | }; |
32 | |
33 | union emp_8 { // expected-warning {{union has size 0 in C, size 1 in C++}} |
34 | struct emp_1 f1; |
35 | }; |
36 | |
37 | struct emp_9 { // expected-warning {{struct has size 0 in C, non-zero size in C++}} |
38 | struct emp_1 f1; |
39 | union emp_2 f2; |
40 | }; |
41 | |
42 | // Checks for pointer subtraction (PR15683) |
43 | struct emp_1 *func_1p(struct emp_1 *x) { return x - 5; } |
44 | |
45 | int func_1() { |
46 | struct emp_1 v[1]; |
47 | return v - v; // expected-warning {{subtraction of pointers to type 'struct emp_1' of zero size has undefined behavior}} |
48 | } |
49 | |
50 | int func_2(struct emp_1 *x) { |
51 | return 1 + x - x; // expected-warning {{subtraction of pointers to type 'struct emp_1' of zero size has undefined behavior}} |
52 | } |
53 | |
54 | int func_3(struct emp_1 *x, struct emp_1 *y) { |
55 | return x - y; // expected-warning {{subtraction of pointers to type 'struct emp_1' of zero size has undefined behavior}} |
56 | } |
57 | |
58 | int func_4(struct emp_1 *x, const struct emp_1 *y) { |
59 | return x - y; // expected-warning {{subtraction of pointers to type 'struct emp_1' of zero size has undefined behavior}} |
60 | } |
61 | |
62 | int func_5(volatile struct emp_1 *x, const struct emp_1 *y) { |
63 | return x - y; // expected-warning {{subtraction of pointers to type 'struct emp_1' of zero size has undefined behavior}} |
64 | } |
65 | |
66 | int func_6() { |
67 | union emp_2 v[1]; |
68 | return v - v; // expected-warning {{subtraction of pointers to type 'union emp_2' of zero size has undefined behavior}} |
69 | } |
70 | |
71 | struct A; // expected-note {{forward declaration of 'struct A'}} |
72 | |
73 | int func_7(struct A *x, struct A *y) { |
74 | return x - y; // expected-error {{arithmetic on a pointer to an incomplete type 'struct A'}} |
75 | } |
76 | |
77 | int func_8(struct emp_1 (*x)[10], struct emp_1 (*y)[10]) { |
78 | return x - y; // expected-warning {{subtraction of pointers to type 'struct emp_1 [10]' of zero size has undefined behavior}} |
79 | } |
80 | |
81 | int func_9(struct emp_1 (*x)[], struct emp_1 (*y)[]) { |
82 | return x - y; // expected-error {{arithmetic on a pointer to an incomplete type 'struct emp_1 []'}} |
83 | } |
84 | |
85 | int func_10(int (*x)[0], int (*y)[0]) { |
86 | return x - y; // expected-warning {{subtraction of pointers to type 'int [0]' of zero size has undefined behavior}} |
87 | } |
88 | |