blob: 46f9075a6c63d428c092619f112b426c4e9273ec [file] [log] [blame]
/* PR c++/94098 - checking ICE on attribute access redeclaration
{ dg-do compile }
{ dg-options "-Wall" } */
#define RO(...) __attribute__ ((access (read_only, __VA_ARGS__)))
#define RW(...) __attribute__ ((access (read_write, __VA_ARGS__)))
#define WO(...) __attribute__ ((access (write_only, __VA_ARGS__)))
typedef __INT32_TYPE__ int32_t;
int rdwr1_2_3_4 (void*, void*, void*, void*);
int RW (1) rdwr1_2_3_4 (void*, void*, void*, void*);
int RW (2) rdwr1_2_3_4 (void*, void*, void*, void*);
int RW (3) rdwr1_2_3_4 (void*, void*, void*, void*);
int RW (4) rdwr1_2_3_4 (void*, void*, void*, void*);
extern int32_t x[1];
void call_rdwrp1_2_3_4 (void)
{
rdwr1_2_3_4 (x, x, x, x);
rdwr1_2_3_4 (x, x, x, x + 1); // { dg-warning "\\\[-Wstringop-overflow" }
rdwr1_2_3_4 (x, x, x + 1, x); // { dg-warning "\\\[-Wstringop-overflow" }
rdwr1_2_3_4 (x, x + 1, x, x); // { dg-warning "\\\[-Wstringop-overflow" }
rdwr1_2_3_4 (x + 1, x, x, x); // { dg-warning "\\\[-Wstringop-overflow" }
}
int rdwr4_3_2_1 (void*, void*, void*, void*);
int RW (4) rdwr4_3_2_1 (void*, void*, void*, void*);
int RW (3) rdwr4_3_2_1 (void*, void*, void*, void*);
int RW (2) rdwr4_3_2_1 (void*, void*, void*, void*);
int RW (1) rdwr4_3_2_1 (void*, void*, void*, void*);
void call_rdwr4_3_2_1 (void)
{
rdwr4_3_2_1 (x, x, x, x);
rdwr4_3_2_1 (x, x, x, x + 1); // { dg-warning "\\\[-Wstringop-overflow" }
rdwr4_3_2_1 (x, x, x + 1, x); // { dg-warning "\\\[-Wstringop-overflow" }
rdwr4_3_2_1 (x, x + 1, x, x); // { dg-warning "\\\[-Wstringop-overflow" }
rdwr4_3_2_1 (x + 1, x, x, x); // { dg-warning "\\\[-Wstringop-overflow" }
}
int rdwrall (void*, void*, void*, void*);
int RW (1) rdwrall (void*, void*, void*, void*);
int RW (1) RW (2) rdwrall (void*, void*, void*, void*);
int RW (1) RW (2) RW (3) rdwrall (void*, void*, void*, void*);
int RW (1) RW (2) RW (3) RW (4) rdwrall (void*, void*, void*, void*);
void call_rdwrall (void)
{
rdwrall (x, x, x, x);
rdwrall (x, x, x, x + 1); // { dg-warning "\\\[-Wstringop-overflow" }
rdwrall (x, x, x + 1, x); // { dg-warning "\\\[-Wstringop-overflow" }
rdwrall (x, x + 1, x, x); // { dg-warning "\\\[-Wstringop-overflow" }
rdwrall (x + 1, x, x, x); // { dg-warning "\\\[-Wstringop-overflow" }
}
// Verify the attribute is a part of the function's type.
typedef __typeof__ (rdwrall) F;
void call_fnptr_typeof (F *f)
{
f (x, x, x, x);
f (x, x, x, x + 1); // { dg-warning "\\\[-Wstringop-overflow" }
f (x, x, x + 1, x); // { dg-warning "\\\[-Wstringop-overflow" }
f (x, x + 1, x, x); // { dg-warning "\\\[-Wstringop-overflow" }
f (x + 1, x, x, x); // { dg-warning "\\\[-Wstringop-overflow" }
}
// Verify the attribute is effective on a typedef.
typedef void FWRall (void*, void*, void*, void*);
typedef RW (1) void FWRall (void*, void*, void*, void*);
typedef RW (2) void FWRall (void*, void*, void*, void*);
typedef RW (3) void FWRall (void*, void*, void*, void*);
typedef RW (4) void FWRall (void*, void*, void*, void*);
void call_fnptr (FWRall *f)
{
f (x, x, x, x);
f (x, x, x, x + 1); // { dg-warning "\\\[-Wstringop-overflow" "pr94171" { xfail *-*-* } }
f (x, x, x + 1, x); // { dg-warning "\\\[-Wstringop-overflow" "pr94171" { xfail *-*-* } }
f (x, x + 1, x, x); // { dg-warning "\\\[-Wstringop-overflow" "pr94171" { xfail *-*-* } }
f (x + 1, x, x, x); // { dg-warning "\\\[-Wstringop-overflow" "pr94171" { xfail *-*-* } }
}