view gcc/testsuite/c-c++-common/attr-nonstring-5.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
line wrap: on
line source

/* 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" } */