/* PR tree-optimization/90879 - fold zero-equality of strcmp between
   a longer string and a smaller array
   { dg-do compile }
   { dg-options "-O2 -Wall -Wno-string-compare -fdump-tree-optimized -ftrack-macro-expansion=0" } */

#include "strlenopt.h"

#define A(expr)                                                 \
  ((expr)                                                       \
   ? (void)0                                                    \
   : (__builtin_printf ("assertion failed on line %i: %s\n",    \
                        __LINE__, #expr),                       \
      __builtin_abort ()))

void clobber (void*, ...);

struct S { char a4[4], c; };

extern char a4[4];
extern char b4[4];

/* Verify that comparison of string literals with arrays with unknown
   content but size that prevents them from comparing equal is folded
   to a constant.  */

void test_array_lit (void)
{
  A (strcmp (a4, "1234")); clobber (a4);
  A (strcmp (a4, "12345")); clobber (a4);
  A (strcmp (a4, "123456")); clobber (a4);
  A (strcmp ("1234", a4)); clobber (a4);
  A (strcmp ("12345", a4)); clobber (a4);
  A (strcmp ("123456", a4)); clobber (a4);
}

void test_memarray_lit (struct S *p)
{
#if 0
  /* Member arrays not handled due to the fix for PR 92765.  */
  A (strcmp (p->a4, "1234"));
  A (strcmp (p->a4, "12345"));
  A (strcmp (p->a4, "123456"));

  A (strcmp ("1234", p->a4));
  A (strcmp ("12345", p->a4));
  A (strcmp ("123456", p->a4));
#endif
}

/* Verify that the equality of empty strings is folded.  */

void test_empty_string (void)
{
  A (0 == strcmp ("", ""));

  *a4 = '\0';
  A (0 == strcmp (a4, ""));
  A (0 == strcmp ("", a4));
  A (0 == strcmp (a4, a4));

  char s[8] = "";
  A (0 == strcmp (a4, s));

  a4[1] = '\0';
  b4[1] = '\0';
  A (0 == strcmp (a4 + 1, b4 + 1));

  a4[2] = '\0';
  b4[2] = '\0';
  A (0 == strcmp (&a4[2], &b4[2]));

#if 0
  /* The following isn't handled yet due to PR 92155.  */
  clobber (a4, b4);

  memset (a4, 0, sizeof a4);
  memset (b4, 0, sizeof b4);
  A (0 == strcmp (a4, b4));
#endif
}

/* Verify that comparison of dynamically created strings with unknown
   arrays is folded.  */

void test_array_copy (void)
{
  char s[8];
  strcpy (s, "1234");
  A (strcmp (a4, s));

  strcpy (s, "12345");
  A (strlen (s) == 5);
  A (strcmp (a4, s)); clobber (a4);

  strcpy (s, "123456");
  A (strcmp (a4, s)); clobber (a4);

  strcpy (s, "1234");
  A (strcmp (s, a4)); clobber (a4);

  strcpy (s, "12345");
  A (strcmp (s, a4)); clobber (a4);

  strcpy (s, "123456");
  A (strcmp (s, a4)); clobber (a4);
}


void test_array_bounded (void)
{
  A (strncmp (a4, "12345", 5)); clobber (a4);
  A (strncmp ("54321", a4, 5)); clobber (a4);

  A (strncmp (a4, "123456", 5)); clobber (a4);
  A (strncmp ("654321", a4, 5)); clobber (a4);
}

void test_array_copy_bounded (void)
{
  char s[8];
  strcpy (s, "12345");
  A (strncmp (a4, s, 5)); clobber (a4);
  strcpy (s, "54321");
  A (strncmp (s, a4, 5)); clobber (a4);

  strcpy (s, "123456");
  A (strncmp (a4, s, 5)); clobber (a4);
  strcpy (s, "654321");
  A (strncmp (s, a4, 5)); clobber (a4);
}

/* { dg-final { scan-tree-dump-not "abort|strcmp|strncmp" "optimized" } } */
