view gcc/testsuite/c-c++-common/attr-nonstring-5.c @ 19:2b5abeee2509 default tip

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents 84e7813d76e9
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" } */