blob: f9b4fd92732bd07effef9d6859f214fed2aeb3ef [file] [log] [blame]
/* PR middle-end/84725 - enable attribute nonstring for all narrow character
types
Verify that using attribute nonstring with all three narrow character
types is accepted and using arrays and pointers to characters of all
three types (including their qualified forms) declared with the
attributes doesn't trigger -Wstringop-truncation warnings.
{ dg-do compile }
{ dg-options "-O -Wall -Wstringop-truncation" } */
#if __cplusplus
extern "C"
#endif
char* strncpy (char*, const char*, __SIZE_TYPE__);
#define NONSTR __attribute__ ((nonstring))
#define S "1234"
struct Arrays
{
char NONSTR a[4];
signed char NONSTR b[4];
unsigned char NONSTR c[4];
};
void test_arrays (struct Arrays *p, const char *s)
{
strncpy (p->a, s, sizeof p->a);
strncpy ((char*)p->b, s, sizeof p->b);
strncpy ((char*)p->c, s, sizeof p->c);
}
struct Pointers
{
char NONSTR *p;
signed char NONSTR *q;
unsigned char NONSTR *r;
};
void test_pointers (struct Pointers *p)
{
strncpy (p->p, S, sizeof S - 1);
strncpy ((char*)p->q, S, sizeof S - 1);
strncpy ((char*)p->r, S, sizeof S - 1);
}
struct ConstArrays
{
const char NONSTR a[4];
const signed char NONSTR b[4];
const unsigned char NONSTR c[4];
};
void test_const_arrays (struct ConstArrays *p, const char *s)
{
strncpy ((char*)p->a, s, sizeof p->a);
strncpy ((char*)p->b, s, sizeof p->b);
strncpy ((char*)p->c, s, sizeof p->c);
}
struct ConstPointers
{
const char NONSTR *p;
const signed char NONSTR *q;
const unsigned char NONSTR *r;
};
void test_const_pointers (struct ConstPointers *p)
{
strncpy ((char*)p->p, S, sizeof S - 1);
strncpy ((char*)p->q, S, sizeof S - 1);
strncpy ((char*)p->r, S, sizeof S - 1);
}
struct VolatileArrays
{
volatile char NONSTR a[4];
volatile signed char NONSTR b[4];
volatile unsigned char NONSTR c[4];
};
void test_volatile_arrays (struct VolatileArrays *p, const char *s)
{
strncpy ((char*)p->a, s, sizeof p->a);
strncpy ((char*)p->b, s, sizeof p->b);
strncpy ((char*)p->c, s, sizeof p->c);
}
struct VolatilePointers
{
volatile char NONSTR *p;
volatile signed char NONSTR *q;
volatile unsigned char NONSTR *r;
};
void test_volatile_pointers (struct VolatilePointers *p)
{
strncpy ((char*)p->p, S, sizeof S - 1);
strncpy ((char*)p->q, S, sizeof S - 1);
strncpy ((char*)p->r, S, sizeof S - 1);
}
struct ConstVolatileArrays
{
const volatile char NONSTR a[4];
const volatile signed char NONSTR b[4];
const volatile unsigned char NONSTR c[4];
};
void test_const_volatile_arrays (struct ConstVolatileArrays *p, const char *s)
{
strncpy ((char*)p->a, s, sizeof p->a);
strncpy ((char*)p->b, s, sizeof p->b);
strncpy ((char*)p->c, s, sizeof p->c);
}
struct ConstVolatilePointers
{
const volatile char NONSTR *p;
const volatile signed char NONSTR *q;
const volatile unsigned char NONSTR *r;
};
void test_const_volatile_pointers (struct ConstVolatilePointers *p)
{
strncpy ((char*)p->p, S, sizeof S - 1);
strncpy ((char*)p->q, S, sizeof S - 1);
strncpy ((char*)p->r, S, sizeof S - 1);
}
/* { dg-prune-output "-Wdiscarded-qualifiers" } */