mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 12:00:11 -05:00
The change to build_conditional_expr drops the downgrade from a pedwarn to warning for builtins for C99 and later language dialects. It remains a warning in C89 mode (not a permerror), as the -std=gnu89 -fno-permissive test shows. gcc/ * doc/invoke.texi (Warning Options): Document changes. gcc/c/ PR c/96284 * c-typeck.cc (build_conditional_expr): Upgrade most pointer type mismatches to a permerror. (convert_for_assignment): Use permerror_opt and permerror_init for OPT_Wincompatible_pointer_types warnings. gcc/testsuite/ * gcc.dg/permerror-default.c (incompatible_pointer_types): Expect new permerror. * gcc.dg/permerror-gnu89-nopermissive.c (incompatible_pointer_types): Likewise. * gcc.dg/permerror-pedantic.c (incompatible_pointer_types): Likewise. * gcc.dg/permerror-system.c: Likewise. * gcc.dg/Wincompatible-pointer-types-2.c: Compile with -fpermissive due to expected errors. * gcc.dg/Wincompatible-pointer-types-5.c: New test. Copied from gcc.dg/Wincompatible-pointer-types-2.c. Expect errors. * gcc.dg/anon-struct-11.c: Compile with -fpermissive due to expected errors. * gcc.dg/anon-struct-11a.c: New test. Copied from gcc.dg/anon-struct-11.c. Expect errors. * gcc.dg/anon-struct-13.c: Compile with -fpermissive due to expected errors. * gcc.dg/anon-struct-13a.c: New test. Copied from gcc.dg/anon-struct-13.c. Expect errors. * gcc.dg/builtin-arith-overflow-4.c: Compile with -fpermissive due to expected errors. * gcc.dg/builtin-arith-overflow-4a.c: New test. Copied from gcc.dg/builtin-arith-overflow-4.c. Expect errors. * gcc.dg/c23-qual-4.c: Expect -Wincompatible-pointer-types errors. * gcc.dg/dfp/composite-type.c: Compile with -fpermissive due to expected errors. * gcc.dg/dfp/composite-type-2.c: New test. Copied from gcc.dg/dfp/composite-type.c. Expect errors. * gcc.dg/diag-aka-1.c: Compile with -fpermissive due to expected errors. * gcc.dg/diag-aka-1a.c: New test. Copied from gcc.dg/diag-aka-1a.c. Expect errors. * gcc.dg/enum-compat-1.c: Compile with -fpermissive due to expected errors. * gcc.dg/enum-compat-2.c: New test. Copied from gcc.dg/enum-compat-1.c. Expect errors. * gcc.dg/func-ptr-conv-1.c: Compile with -fpermissive due to expected errors. * gcc.dg/func-ptr-conv-2.c: New test. Copied from gcc.dg/func-ptr-conv-1.c. Expect errors. * gcc.dg/init-bad-7.c: Compile with -fpermissive due to expected errors. * gcc.dg/init-bad-7a.c: New test. Copied from gcc.dg/init-bad-7.c. Expect errors. * gcc.dg/noncompile/incomplete-3.c (foo): Expect -Wincompatible-pointer-types error. * gcc.dg/param-type-mismatch-2.c (test8): Likewise. * gcc.dg/pointer-array-atomic.c: Compile with -fpermissive due to expected errors. * gcc.dg/pointer-array-atomic-2.c: New test. Copied from gcc.dg/pointer-array-atomic.c. Expect errors. * gcc.dg/pointer-array-quals-1.c (test): Expect -Wincompatible-pointer-types errors. * gcc.dg/transparent-union-1.c: Compile with -fpermissive due to expected errors. * gcc.dg/transparent-union-1a.c: New test. Copied from gcc.dg/transparent-union-1.c. Expect errors. * gcc.target/aarch64/acle/memtag_2a.c (test_memtag_warning_return_qualifier): Expect additional errors. * gcc.target/aarch64/sve/acle/general-c/load_2.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_1.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_2.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_3.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_4.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_5.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_1.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_2.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_3.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_4.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/sizeless-1.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/sizeless-2.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/store_1.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/store_2.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/store_scatter_index_1.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/store_scatter_index_restricted_1.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/store_scatter_offset_2.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general-c/store_scatter_offset_restricted_1.c (f1): Likewise. * gcc.target/aarch64/sve/acle/general/attributes_7.c (f1): Likewise. * gcc.target/i386/sse2-bfloat16-scalar-typecheck.c (footest): Expect -Wincompatible-pointer-types errors. * gcc.target/i386/vect-bfloat16-typecheck_1.c (footest): Likewise. * gcc.target/i386/vect-bfloat16-typecheck_2.c (footest): Likewise.
61 lines
3.5 KiB
C
61 lines
3.5 KiB
C
/* { 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-error "returning '_Atomic int \\(\\*\\)\\\[3\\\]' from a function with incompatible return type" } */
|
|
_Atomic int (*x3(int x[3][3]))[3] { return x; } /* { dg-error "returning 'int \\(\\*\\)\\\[3\\\]' from a function with incompatible return 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-error "passing argument 2 of 'transpose0' from incompatible pointer type" } */
|
|
transpose1(y1, o1); /* { dg-error "passing argument 2 of 'transpose1' from incompatible pointer type" } */
|
|
transpose1(y1, x1); /* { dg-error "passing argument 2 of 'transpose1' from incompatible pointer type" } */
|
|
transpose2(y2, o2); /* { dg-error "passing argument 2 of 'transpose2' from incompatible pointer type" } */
|
|
transpose2(y2, x2); /* { dg-error "passing argument 2 of 'transpose2' from incompatible pointer type" } */
|
|
// initialization
|
|
_Atomic double (*x0p) = x0; /* { dg-error "initialization of '_Atomic double \\*' from incompatible pointer type" } */
|
|
_Atomic double (*x1p)[2] = x1; /* { dg-error "initialization of '_Atomic double \\(\\*\\)\\\[2\\\]' from incompatible pointer type" } */
|
|
_Atomic double (*x2p)[2][2] = x2; /* { dg-error "initialization of '_Atomic double \\(\\*\\)\\\[2\\\]\\\[2\\\]' from incompatible pointer type" } */
|
|
// assignment
|
|
x0p = x0; /* { dg-error "assignment to '_Atomic double \\*' from incompatible pointer type" } */
|
|
x1p = x1; /* { dg-error "assignment to '_Atomic double \\(\\*\\)\\\[2\\\]' from incompatible pointer type" } */
|
|
x2p = x2; /* { dg-error "assignment to '_Atomic double \\(\\*\\)\\\[2\\\]\\\[2\\\]' 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-error "pointer type mismatch in conditional expression" } */
|
|
(void)(1 ? x1 : z1); /* { dg-error "pointer type mismatch in conditional expression" } */
|
|
(void)(1 ? x2 : z2); /* { dg-error "pointer type mismatch in conditional expression" } */
|
|
}
|
|
|