1 /* { dg-do compile } */
2 /* { dg-options "-Wdiscarded-array-qualifiers -pedantic-errors" } */
3 /* Origin: Martin Uecker <uecker@eecs.berkeley.edu> */
4 void tvoid(void* x);
transpose0(double * out,const double * in)5 void transpose0(double* out, const double* in) { }
transpose1(double out[2][2],const double in[2][2])6 void transpose1(double out[2][2], const double in[2][2]) { }
transpose2(double out[2][2][2],const double in[2][2][2])7 void transpose2(double out[2][2][2], const double in[2][2][2]) { }
8 // return
x2(const int x[3][3])9 int (*x2(const int x[3][3]))[3] { return x; } /* { dg-error "pointers to arrays with different qualifiers|return discards" } */
x3(int x[3][3])10 const int (*x3(int x[3][3]))[3] { return x; } /* { dg-error "pointers to arrays with different qualifiers" } */
test(void)11 void test(void)
12 {
13 	double x0[2];
14 	double y0[2];
15 	const double z0[4];
16 	double x1[2][2];
17 	double y1[2][2];
18 	double o1[2][3];
19 	const double z1[2][2];
20 	double x2[2][2][2];
21 	double y2[2][2][2];
22 	double o2[2][2][3];
23 	const double z2[2][2][2];
24 	// void pointers
25 	tvoid(z0); /* { dg-error "passing argument 1 of 'tvoid' discards 'const' qualifier from pointer target type" } */
26 	tvoid(z1); /* { dg-warning "passing argument 1 of 'tvoid' discards 'const' qualifier from pointer target type" } */
27 	tvoid(z2); /* { dg-warning "passing argument 1 of 'tvoid' discards 'const' qualifier from pointer target type" } */
28 	void* p;
29 	const void* pc;
30 	p = x0;
31 	p = x1;
32 	p = x2;
33 	p = z0; /* { dg-error "assignment discards 'const' qualifier from pointer target type" } */
34 	p = z1; /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */
35 	p = z2; /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */
36 	pc = x0;
37 	pc = x1;
38 	pc = x2;
39 	pc = z0;
40 	pc = z1;
41 	pc = z2;
42 	transpose0(pc, p); /* { dg-error "passing argument 1 of 'transpose0' discards 'const' qualifier from pointer target type" } */
43 	transpose1(pc, p); /* { dg-error "passing argument 1 of 'transpose1' discards 'const' qualifier from pointer target type" } */
44 	transpose2(pc, p); /* { dg-error "passing argument 1 of 'transpose2' discards 'const' qualifier from pointer target type" } */
45 	transpose0(p, pc);
46 	transpose1(p, pc); /* { dg-error "passing argument 2 of 'transpose1' discards 'const' qualifier from pointer target type" } */
47 	transpose2(p, pc); /* { dg-error "passing argument 2 of 'transpose2' discards 'const' qualifier from pointer target type" } */
48 	// passing as arguments
49 	transpose0(y0, x0);
50 	transpose1(y1, o1); /* { dg-error "passing argument 2 of 'transpose1' from incompatible pointer type" } */
51 	transpose1(y1, x1); /* { dg-error "pointers to arrays with different qualifiers" } */
52 	transpose2(y2, o2); /* { dg-error "passing argument 2 of 'transpose2' from incompatible pointer type" } */
53 	transpose2(y2, x2); /* { dg-error "pointers to arrays with different qualifiers" } */
54 	// initialization
55 	const double (*x0p) = x0;
56 	const double (*x1p)[2] = x1; /* { dg-error "pointers to arrays with different qualifiers" } */
57 	const double (*x2p)[2][2] = x2; /* { dg-error "pointers to arrays with different qualifiers" } */
58 	double (*v0p) = z0; /* { dg-error "initialization discards 'const' qualifier from pointer target type" } */
59 	double (*v1p)[2] = z1; /* { dg-error "pointers to arrays with different qualifiers|initialization discards" } */
60 	double (*v2p)[2][2] = z2; /* { dg-error "pointers to arrays with different qualifiers|initialization discards" } */
61 	// assignment
62 	x0p = x0;
63 	x1p = x1; /* { dg-error "pointers to arrays with different qualifiers" } */
64 	x2p = x2; /* { dg-error "pointers to arrays with different qualifiers" } */
65 	// subtraction
66 	&(x0[1]) - &(z0[0]);
67 	&(x1[1]) - &(z1[0]); /* { dg-error "pointers to arrays with different qualifiers" } */
68 	&(x2[1]) - &(z2[0]); /* { dg-error "pointers to arrays with different qualifiers" } */
69 	// comparison
70 	x0 == z0;
71 	x1 == z1; /* { dg-error "pointers to arrays with different qualifiers" } */
72 	x2 == z2; /* { dg-error "pointers to arrays with different qualifiers" } */
73 	x0 < z0;
74 	x1 < z1; /* { dg-error "pointers to arrays with different qualifiers" } */
75 	x2 < z2; /* { dg-error "pointers to arrays with different qualifiers" } */
76 	x0 > z0;
77 	x1 > z1; /* { dg-error "pointers to arrays with different qualifiers" } */
78 	x2 > z2; /* { dg-error "pointers to arrays with different qualifiers" } */
79 	// conditional expressions
80 	(void)(1 ? x0 : z0);
81 	(void)(1 ? x1 : z1); /* { dg-error "pointers to arrays with different qualifiers" } */
82 	(void)(1 ? x2 : z2); /* { dg-error "pointers to arrays with different qualifiers" } */
83 	(void)(1 ? x0 : x1); /* { dg-error "pointer type mismatch in conditional expression" } */
84 	(void)(1 ? x1 : x2); /* { dg-error "pointer type mismatch in conditional expression" } */
85 	(void)(1 ? x2 : x0); /* { dg-error "pointer type mismatch in conditional expression" } */
86 	v0p = (1 ? z0 : v0p); /* { dg-error "assignment discards 'const' qualifier from pointer target type" } */
87 	v1p = (1 ? z1 : v1p); /* { dg-error "pointers to arrays with different qualifiers|assignment discards" } */
88 	v2p = (1 ? z2 : v2p); /* { dg-error "pointers to arrays with different qualifiers|assignment discards" } */
89 	v0p = (1 ? x0 : x0p); /* { dg-error "assignment discards 'const' qualifier from pointer target type" } */
90 	v1p = (1 ? x1 : x1p); /* { dg-error "pointers to arrays with different qualifiers|assignment discards" } */
91 	v2p = (1 ? x2 : x2p); /* { dg-error "pointers to arrays with different qualifiers|assignment discards" } */
92 	(1 ? x0 : z0)[0] = 1; /* { dg-error "assignment of read-only location" } */
93 	(1 ? x1 : z1)[0][0] = 1; /* { dg-error "assignment of read-only location|pointers to arrays" } */
94 	(1 ? x2 : z2)[0][0][0] = 1; /* { dg-error "assignment of read-only location|pointers to arrays" } */
95 	v0p = (1 ? p : z0); /* { dg-error "assignment discards 'const' qualifier from pointer target type" } */
96 	v1p = (1 ? p : z1); /* { dg-warning "pointer to array loses qualifier in conditional expression" } */
97 	v2p = (1 ? p : z2); /* { dg-warning "pointer to array loses qualifier in conditional expression" } */
98 	v0p = (1 ? pc : x0); /* { dg-error "assignment discards 'const' qualifier from pointer target type" } */
99 	v1p = (1 ? pc : x1); /* { dg-error "assignment discards 'const' qualifier from pointer target type" } */
100 	v2p = (1 ? pc : x2); /* { dg-error "assignment discards 'const' qualifier from pointer target type" } */
101 }
102 
103