view gcc/testsuite/gcc.dg/strlenopt-61.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
line wrap: on
line source

/* PR tree-optimization/89688 - -Wstringop-overflow confused by const
   2D array of char
   { dg-do compile }
   { dg-options "-Wall -fdump-tree-gimple -fdump-tree-optimized" } */

typedef __SIZE_TYPE__ size_t;

size_t strlen (const char*);
#define CAT(x, y) x ## y
#define CONCAT(x, y) CAT (x, y)
#define FAILNAME(name) CONCAT (call_ ## name ##_on_line_, __LINE__)

#define FAIL(name) do {                         \
    extern __attribute__ ((noreturn)) void FAILNAME (name) (void);	\
    FAILNAME (name)();                          \
  } while (0)

#define A(ref, len)					\
  if (strlen (ref) != len) FAIL (failure); else (void)0

const char a3_4[3][4] = { { 1 }, { 1, 2 }, { 1, 2, 3 } };

void test_a4_4 (void)
{
  A (a3_4[0], 1);
  A (a3_4[1], 2);
  A (a3_4[2], 3);

  A (&a3_4[0][0], 1);
  A (&a3_4[0][1], 0);
  A (&a3_4[0][2], 0);
  A (&a3_4[0][3], 0);

  A (&a3_4[1][0], 2);
  A (&a3_4[1][1], 1);
  A (&a3_4[1][2], 0);
  A (&a3_4[1][3], 0);

  A (&a3_4[2][0], 3);
  A (&a3_4[2][1], 2);
  A (&a3_4[2][2], 1);
  A (&a3_4[2][3], 0);
}


const char a3_4_5[3][4][5] =
  {
   { { 1 }, { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 } },
   { { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 } },
   { { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }, { 1, 2 } },
  };

void test_a3_4_5 (void)
{
  A (a3_4_5[0][0], 1);
  A (a3_4_5[0][1], 2);
  A (a3_4_5[0][2], 3);
  A (a3_4_5[0][3], 4);

  A (a3_4_5[1][0], 2);
  A (a3_4_5[1][1], 3);
  A (a3_4_5[1][2], 4);
  A (a3_4_5[1][3], 1);

  A (a3_4_5[2][0], 3);
  A (a3_4_5[2][1], 4);
  A (a3_4_5[2][2], 1);
  A (a3_4_5[2][3], 2);
}


struct S
{
  char a3[3];
  char a4_5[4][5];
};

const struct S sa4[4] =
  {
   { .a3 = { 0 },
     .a4_5 =
     {
      { 1 }, { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }
     }
   },
   { .a3 = { 1 },
     .a4_5 =
     {
      { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }
     }
   },
   { .a3 = { 1, 2 },
     .a4_5 =
     {
      { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }, { 1, 2 }
     }
   },
   { .a3 = { 1 },
     .a4_5 =
     {
      { 1, 2, 3, 4 }, "1", { 1, 2 }, "123"
     }
   }
  };

void test_sa4 (void)
{
  A (sa4[0].a3, 0);
  A (sa4[0].a4_5[0], 1);
  A (sa4[0].a4_5[1], 2);
  A (sa4[0].a4_5[2], 3);
  A (sa4[0].a4_5[3], 4);

  A (sa4[1].a3, 1);
  A (sa4[1].a4_5[0], 2);
  A (sa4[1].a4_5[1], 3);
  A (sa4[1].a4_5[2], 4);
  A (sa4[1].a4_5[3], 1);

  A (sa4[2].a3, 2);
  A (sa4[2].a4_5[0], 3);
  A (sa4[2].a4_5[1], 4);
  A (sa4[2].a4_5[2], 1);
  A (sa4[2].a4_5[3], 2);

  A (sa4[3].a3, 1);
  A (sa4[3].a4_5[0], 4);
  A (sa4[3].a4_5[1], 1);
  A (sa4[3].a4_5[2], 2);
  A (sa4[3].a4_5[3], 3);
}


struct T
{
  struct S sa2[2];
  char a4[4];
};

const struct T ta2[2] =
  {
   [0] =
   {
    .sa2 =
    {
     [0] =
     { .a3 = { 0 },
       .a4_5 =
       {
	{ 1 }, { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }
       }
     },
     [1] =
     { .a3 = { 1 },
       .a4_5 =
       {
	{ 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }
       }
     },
    },
    .a4 = "12"
   },

   [1] =
   {
    .sa2 =
    {
     [0] =
     { .a3 = { 1, 2 },
       .a4_5 =
       {
	{ 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }, { 1, 2 }
       }
     },
     { .a3 = { 1 },
       .a4_5 =
       {
	{ 1, 2, 3, 4 }, "1", { 1, 2 }, "123"
       }
     }
    },
    .a4 = "123"
   }
  };

void test_ta2 (void)
{
  A (ta2[0].sa2[0].a3, 0);
  A (ta2[0].sa2[0].a4_5[0], 1);
  A (ta2[0].sa2[0].a4_5[1], 2);
  A (ta2[0].sa2[0].a4_5[2], 3);
  A (ta2[0].sa2[0].a4_5[3], 4);

  A (ta2[0].sa2[1].a3, 1);
  A (ta2[0].sa2[1].a4_5[0], 2);
  A (ta2[0].sa2[1].a4_5[1], 3);
  A (ta2[0].sa2[1].a4_5[2], 4);
  A (ta2[0].sa2[1].a4_5[3], 1);

  A (ta2[0].a4, 2);

  A (ta2[1].sa2[0].a3, 2);
  A (ta2[1].sa2[0].a4_5[0], 3);
  A (ta2[1].sa2[0].a4_5[1], 4);
  A (ta2[1].sa2[0].a4_5[2], 1);
  A (ta2[1].sa2[0].a4_5[3], 2);

  A (ta2[1].sa2[1].a3, 1);
  A (ta2[1].sa2[1].a4_5[0], 4);
  A (ta2[1].sa2[1].a4_5[1], 1);
  A (ta2[1].sa2[1].a4_5[2], 2);
  A (ta2[1].sa2[1].a4_5[3], 3);

  A (ta2[1].a4, 3);
}

/* { dg-final { scan-tree-dump-not "failure" "optimized" } }
   { dg-final { scan-tree-dump-not "strlen1" "gimple" } } */