mirrored from git://gcc.gnu.org/git/gcc.git
-
Notifications
You must be signed in to change notification settings - Fork 4.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
invoke.texi: Document -Wdiscarded-array-qualifiers.
2014-12-20 Martin Uecker <uecker@eecs.berkeley.edu> * doc/invoke.texi: Document -Wdiscarded-array-qualifiers. * doc/extend.texi: Document new behavior for pointers to arrays with qualifiers. c/ * c-typeck.c: New behavious for pointers to arrays with qualifiers (common-pointer-type): For pointers to arrays take qualifiers from element type. (build_conditional_expr): Add warnings for lost qualifiers. (comp-target-types): Allow pointers to arrays with different qualifiers. (convert-for-assignment): Adapt warnings for discarded qualifiers. Add WARNING_FOR_QUALIFIERS macro and rename WARN_FOR_QUALIFIERS to PEDWARN_FOR_QUALIFIERS. c-family/ * c.opt (Wdiscarded-array-qualifiers): New option. testsuite/ * gcc.dg/Wwrite-strings-1.c: Change dg-warning. * gcc.dg/array-quals-1.c: Use -Wno-discarded-array-qualifiers. * gcc.dg/array-quals-2.c: Change dg-options, dg-warning. * gcc.dg/pointer-array-atomic.c: New test. * gcc.dg/pointer-array-quals-1.c: New test. * gcc.dg/pointer-array-quals-2.c: New test (-pedantic-errors). * gcc.dg/qual-component-1.c: Change dg-options, dg-warnings. From-SVN: r218985
- Loading branch information
Showing
15 changed files
with
568 additions
and
148 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
/* { dg-do compile } */ | ||
/* { dg-options "-std=c11" } */ | ||
/* Origin: Martin Uecker <uecker@eecs.berkeley.edu> */ | ||
void tvoid(void* x); | ||
void transpose0(double* out, _Atomic double* in) { } | ||
void transpose1(double out[2][2], _Atomic double in[2][2]) { } | ||
void transpose2(double out[2][2][2], _Atomic double in[2][2][2]) { } | ||
// return | ||
int (*x2(_Atomic int x[3][3]))[3] { return x; } /* { dg-warning "return from incompatible pointer type" } */ | ||
_Atomic int (*x3(int x[3][3]))[3] { return x; } /* { dg-warning "return from incompatible pointer type" } */ | ||
void test(void) | ||
{ | ||
double x0[2]; | ||
double y0[2]; | ||
_Atomic double z0[4]; | ||
double x1[2][2]; | ||
double y1[2][2]; | ||
double o1[2][3]; | ||
_Atomic double z1[2][2]; | ||
double x2[2][2][2]; | ||
double y2[2][2][2]; | ||
double o2[2][2][3]; | ||
_Atomic double z2[2][2][2]; | ||
tvoid(z0); | ||
tvoid(z1); | ||
tvoid(z2); | ||
// passing as arguments | ||
transpose0(y0, x0); /* { dg-warning "passing argument 2 of 'transpose0' from incompatible pointer type" } */ | ||
transpose1(y1, o1); /* { dg-warning "passing argument 2 of 'transpose1' from incompatible pointer type" } */ | ||
transpose1(y1, x1); /* { dg-warning "passing argument 2 of 'transpose1' from incompatible pointer type" } */ | ||
transpose2(y2, o2); /* { dg-warning "passing argument 2 of 'transpose2' from incompatible pointer type" } */ | ||
transpose2(y2, x2); /* { dg-warning "passing argument 2 of 'transpose2' from incompatible pointer type" } */ | ||
// initialization | ||
_Atomic double (*x0p) = x0; /* { dg-warning "initialization from incompatible pointer type" } */ | ||
_Atomic double (*x1p)[2] = x1; /* { dg-warning "initialization from incompatible pointer type" } */ | ||
_Atomic double (*x2p)[2][2] = x2; /* { dg-warning "initialization from incompatible pointer type" } */ | ||
// assignment | ||
x0p = x0; /* { dg-warning "assignment from incompatible pointer type" } */ | ||
x1p = x1; /* { dg-warning "assignment from incompatible pointer type" } */ | ||
x2p = x2; /* { dg-warning "assignment from incompatible pointer type" } */ | ||
// subtraction | ||
&(x0[1]) - &(z0[0]); /* { dg-error "invalid operands to binary" } */ | ||
&(x1[1]) - &(z1[0]); /* { dg-error "invalid operands to binary" } */ | ||
&(x2[1]) - &(z2[0]); /* { dg-error "invalid operands to binary" } */ | ||
// comparison | ||
x0 == z0; /* { dg-warning "comparison of distinct pointer types lacks a cast" } */ | ||
x1 == z1; /* { dg-warning "comparison of distinct pointer types lacks a cast" } */ | ||
x2 == z2; /* { dg-warning "comparison of distinct pointer types lacks a cast" } */ | ||
x0 > z0; /* { dg-warning "comparison of distinct pointer types lacks a cast" } */ | ||
x1 > z1; /* { dg-warning "comparison of distinct pointer types lacks a cast" } */ | ||
x2 > z2; /* { dg-warning "comparison of distinct pointer types lacks a cast" } */ | ||
x0 < z0; /* { dg-warning "comparison of distinct pointer types lacks a cast" } */ | ||
x1 < z1; /* { dg-warning "comparison of distinct pointer types lacks a cast" } */ | ||
x2 < z2; /* { dg-warning "comparison of distinct pointer types lacks a cast" } */ | ||
// conditional expressions | ||
(void)(1 ? x0 : z0); /* { dg-warning "pointer type mismatch in conditional expression" } */ | ||
(void)(1 ? x1 : z1); /* { dg-warning "pointer type mismatch in conditional expression" } */ | ||
(void)(1 ? x2 : z2); /* { dg-warning "pointer type mismatch in conditional expression" } */ | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
/* { dg-do compile } */ | ||
/* Origin: Martin Uecker <uecker@eecs.berkeley.edu> */ | ||
/* { dg-options "-Wdiscarded-array-qualifiers" } */ | ||
void tvoid(void* x); | ||
void transpose0(double* out, const double* in) { } | ||
void transpose1(double out[2][2], const double in[2][2]) { } | ||
void transpose2(double out[2][2][2], const double in[2][2][2]) { } | ||
// return | ||
int (*y2(const int x[3][3]))[3] { return x; } /* { dg-warning "return discards 'const' qualifier from pointer target type" } */ | ||
const int (*y3(int x[3][3]))[3] { return x; } | ||
void test(void) | ||
{ | ||
double x0[2]; | ||
double y0[2]; | ||
const double z0[4]; | ||
double x1[2][2]; | ||
double y1[2][2]; | ||
double o1[2][3]; | ||
const double z1[2][2]; | ||
double x2[2][2][2]; | ||
double y2[2][2][2]; | ||
double o2[2][2][3]; | ||
const double z2[2][2][2]; | ||
// void pointers | ||
tvoid(x0); | ||
tvoid(x1); | ||
tvoid(x2); | ||
tvoid(z0); /* { dg-warning "passing argument 1 of 'tvoid' discards 'const' qualifier from pointer target type" } */ | ||
tvoid(z1); /* { dg-warning "passing argument 1 of 'tvoid' discards 'const' qualifier from pointer target type" } */ | ||
tvoid(z2); /* { dg-warning "passing argument 1 of 'tvoid' discards 'const' qualifier from pointer target type" } */ | ||
void* p; | ||
const void* pc; | ||
p = x0; | ||
p = x1; | ||
p = x2; | ||
p = z0; /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
p = z1; /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
p = z2; /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
pc = x0; | ||
pc = x1; | ||
pc = x2; | ||
pc = z0; | ||
pc = z1; | ||
pc = z2; | ||
transpose0(pc, p); /* { dg-warning "passing argument 1 of 'transpose0' discards 'const' qualifier from pointer target type" } */ | ||
transpose1(pc, p); /* { dg-warning "passing argument 1 of 'transpose1' discards 'const' qualifier from pointer target type" } */ | ||
transpose2(pc, p); /* { dg-warning "passing argument 1 of 'transpose2' discards 'const' qualifier from pointer target type" } */ | ||
transpose0(p, pc); | ||
transpose1(p, pc); | ||
transpose2(p, pc); | ||
// passing as arguments | ||
transpose0(y0, x0); | ||
transpose1(y1, x1); | ||
transpose2(y2, x2); | ||
// initialization | ||
const double (*u0p) = x0; | ||
const double (*u1p)[2] = x1; | ||
const double (*u2p)[2][2] = x2; | ||
double (*v0p) = z0; /* { dg-warning "initialization discards 'const' qualifier from pointer target type" } */ | ||
double (*v1p)[2] = z1; /* { dg-warning "initialization discards 'const' qualifier from pointer target type" } */ | ||
double (*v2p)[2][2] = z2; /* { dg-warning "initialization discards 'const' qualifier from pointer target type" } */ | ||
// subtraction | ||
&(x0[1]) - &(z0[0]); | ||
&(x1[1]) - &(z1[0]); | ||
&(x2[1]) - &(z2[0]); | ||
// comparison | ||
x0 == z0; | ||
x1 == z1; | ||
x2 == z2; | ||
x0 < z0; | ||
x1 < z1; | ||
x2 < z2; | ||
x0 > z0; | ||
x1 > z1; | ||
x2 > z2; | ||
// assignment | ||
u0p = x0; | ||
u1p = x1; | ||
u2p = x2; | ||
v0p = z0; /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
v1p = z1; /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
v2p = z2; /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
// conditional expressions | ||
(void)(1 ? x0 : z0); | ||
(void)(1 ? x1 : z1); | ||
(void)(1 ? x2 : z2); | ||
(void)(1 ? x0 : x1); /* { dg-warning "pointer type mismatch in conditional expression" } */ | ||
(void)(1 ? x1 : x2); /* { dg-warning "pointer type mismatch in conditional expression" } */ | ||
(void)(1 ? x2 : x0); /* { dg-warning "pointer type mismatch in conditional expression" } */ | ||
v0p = (1 ? z0 : v0p); /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
v1p = (1 ? z1 : v1p); /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
v2p = (1 ? z2 : v2p); /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
v0p = (1 ? x0 : u0p); /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
v1p = (1 ? x1 : u1p); /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
v2p = (1 ? x2 : u2p); /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
(1 ? x0 : z0)[0] = 1; /* { dg-error "assignment of read-only location" } */ | ||
(1 ? x1 : z1)[0][0] = 1; /* { dg-error "assignment of read-only location" } */ | ||
(1 ? x2 : z2)[0][0][0] = 1; /* { dg-error "assignment of read-only location" } */ | ||
v0p = (1 ? p : z0); /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
v1p = (1 ? p : z1); /* { dg-warning "pointer to array loses qualifier in conditional expression" } */ | ||
v2p = (1 ? p : z2); /* { dg-warning "pointer to array loses qualifier in conditional expression" } */ | ||
v0p = (1 ? pc : x0); /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
v1p = (1 ? pc : x1); /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
v2p = (1 ? pc : x2); /* { dg-warning "assignment discards 'const' qualifier from pointer target type" } */ | ||
} | ||
|
Oops, something went wrong.