(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
pointer-array-quals-2.c
       1  /* { dg-do compile } */
       2  /* { dg-options "-pedantic-errors" } */
       3  /* Origin: Martin Uecker <uecker@eecs.berkeley.edu> */
       4  void tvoid(void* x);
       5  void transpose0(double* out, const double* in) { }
       6  void transpose1(double out[2][2], const double in[2][2]) { }
       7  void transpose2(double out[2][2][2], const double in[2][2][2]) { }
       8  // return
       9  int (*x2(const int x[3][3]))[3] { return x; } /* { dg-error "pointers to arrays with different qualifiers|return discards" } */
      10  const int (*x3(int x[3][3]))[3] { return x; } /* { dg-error "pointers to arrays with different qualifiers" } */
      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