blob: 732d33e006ddf42eb1b186d18a98856b9bee4492 [file] [log] [blame]
/* PR middle-end/10138 - warn for uninitialized arrays passed as const*
arguments
Verify that passing pointers to uninitialized objects to arguments
to functions declared with attribute access is diagnosed where expected.
{ dg-do compile }
{ dg-options "-O -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__)))
RO (1) void fpri (int*); // { dg-message "in a call to 'fpri' declared with attribute 'access \\\(read_only, 1\\\)' here" }
RO (1) void fpcri (const int*);
RO (1, 2) void fpcri1_2 (const int*, int);
void warn_scalar_fpri (void)
{
int i; // { dg-message "declared here" }
fpri (&i); // { dg-warning "'i' is used uninitialized" }
}
void nowarn_scalar_plus_fpri (void)
{
int i;
/* This gets a -Wstringop-overflow for reading past the end but not
-Wuninitialized because there's nothing to initialize there. */
fpri (&i + 1); // { dg-warning "\\\[-Wstringop-overread" }
}
void nowarn_array_assign_fpcri (void)
{
int a[2];
a[0] = 0;
fpcri (a);
}
void nowarn_array_init_fpcri (void)
{
int a[4] = { 0 };
fpcri (a);
}
void nowarn_array_compound_fpri (void)
{
fpri ((int[2]){ 0 });
}
void nowarn_array_compound_fpcri (void)
{
fpcri ((int[3]){ 1 });
}
void warn_scalar_fpcri (void)
{
int i;
fpcri (&i); // { dg-warning "\\\[-Wuninitialized" }
}
void warn_array_fpcri (void)
{
int a[4];
fpcri (a); // { dg-warning "\\\[-Wuninitialized" }
}
void warn_array_plus_cst_fpcri (void)
{
int a[4];
fpcri (a + 1); // { dg-warning "\\\[-Wuninitialized" }
}
void warn_array_plus_var_fpcri (int i)
{
int a[4];
fpcri (a + i); // { dg-warning "\\\[-Wuninitialized" }
}
void nowarn_struct_assign_fpcri (void)
{
struct { int a, b; } s;
s.a = 0;
fpcri (&s.a);
}
void warn_struct_assign_fpcri (void)
{
struct { int a, b; } s;
s.a = 0;
fpcri (&s.b); // { dg-warning "\\\[-Wuninitialized" }
}
void nowarn_struct_init_fpcri (void)
{
struct { int a, b; } s = { 0 };
fpcri (&s.a);
fpcri (&s.b);
}
void nowarn_struct_compound_fpcri (void)
{
struct S { int a, b; };
fpcri (&(struct S){ }.a);
fpcri (&(struct S){ }.b);
}
void nowarn_scalar_fpcri1_2 (void)
{
int i;
fpcri1_2 (&i, 0);
}
void nowarn_array_assign_fpcri1_2 (void)
{
int a[2];
a[0] = 0;
fpcri1_2 (a, 1);
}
void nowarn_array_assign_fpcri1_2_plus_cst (void)
{
int a[3];
a[1] = 0;
fpcri1_2 (a + 1, 1);
}
void nowarn_array_init_fpcri1_2 (void)
{
int a[4] = { 0 };
fpcri1_2 (a, 2);
}
void warn_array_fpcri1_2_rd1 (void)
{
int a[4];
fpcri1_2 (a, 1); // { dg-warning "\\\[-Wuninitialized" }
}
void warn_array_fpcri1_2_rd2 (void)
{
int a[4];
fpcri1_2 (a, 2); // { dg-warning "\\\[-Wuninitialized" }
}