11592Srgrimes/* Copyright (C) 2000, 2001  Free Software Foundation.
21592Srgrimes
31592Srgrimes   Ensure all expected transformations of builtin strncmp occur and
41592Srgrimes   perform correctly.
51592Srgrimes
61592Srgrimes   Written by Kaveh R. Ghazi, 11/26/2000.  */
71592Srgrimes
81592Srgrimesextern void abort (void);
91592Srgrimestypedef __SIZE_TYPE__ size_t;
101592Srgrimesextern int strncmp (const char *, const char *, size_t);
111592Srgrimes
121592Srgrimesint main ()
131592Srgrimes{
141592Srgrimes  const char *const s1 = "hello world";
151592Srgrimes  const char *s2, *s3;
161592Srgrimes  int n = 6, x;
171592Srgrimes
181592Srgrimes  if (strncmp (s1, "hello world", 12) != 0)
191592Srgrimes    abort();
201592Srgrimes  if (strncmp ("hello world", s1, 12) != 0)
211592Srgrimes    abort();
221592Srgrimes  if (strncmp ("hello", "hello", 6) != 0)
231592Srgrimes    abort();
241592Srgrimes  if (strncmp ("hello", "hello", 2) != 0)
251592Srgrimes    abort();
261592Srgrimes  if (strncmp ("hello", "hello", 100) != 0)
271592Srgrimes    abort();
281592Srgrimes  if (strncmp (s1+10, "d", 100) != 0)
291592Srgrimes    abort();
301592Srgrimes  if (strncmp (10+s1, "d", 100) != 0)
311592Srgrimes    abort();
321592Srgrimes  if (strncmp ("d", s1+10, 1) != 0)
331592Srgrimes    abort();
341592Srgrimes  if (strncmp ("d", 10+s1, 1) != 0)
351592Srgrimes    abort();
361592Srgrimes  if (strncmp ("hello", "aaaaa", 100) <= 0)
371592Srgrimes    abort();
381592Srgrimes  if (strncmp ("aaaaa", "hello", 100) >= 0)
391592Srgrimes    abort();
401592Srgrimes  if (strncmp ("hello", "aaaaa", 1) <= 0)
411592Srgrimes    abort();
421592Srgrimes  if (strncmp ("aaaaa", "hello", 1) >= 0)
431592Srgrimes    abort();
4431329Scharnier
451592Srgrimes  s2 = s1; s3 = s1+4;
4631329Scharnier  if (strncmp (++s2, ++s3, 0) != 0 || s2 != s1+1 || s3 != s1+5)
4731329Scharnier    abort();
4850476Speter  s2 = s1;
491592Srgrimes  if (strncmp (++s2, "", 1) <= 0 || s2 != s1+1)
501592Srgrimes    abort();
511592Srgrimes  if (strncmp ("", ++s2, 1) >= 0 || s2 != s1+2)
521592Srgrimes    abort();
531592Srgrimes  if (strncmp (++s2, "", 100) <= 0 || s2 != s1+3)
541592Srgrimes    abort();
551592Srgrimes  if (strncmp ("", ++s2, 100) >= 0 || s2 != s1+4)
561592Srgrimes    abort();
571592Srgrimes  if (strncmp (++s2+6, "", 100) != 0 || s2 != s1+5)
581592Srgrimes    abort();
591592Srgrimes  if (strncmp ("", ++s2+5, 100) != 0 || s2 != s1+6)
601592Srgrimes    abort();
6192090Smaxim  if (strncmp ("ozz", ++s2, 1) != 0 || s2 != s1+7)
6292272Smaxim    abort();
6392090Smaxim  if (strncmp (++s2, "rzz", 1) != 0 || s2 != s1+8)
6456668Sshin    abort();
651592Srgrimes  s2 = s1; s3 = s1+4;
661592Srgrimes  if (strncmp (++s2, ++s3+2, 1) >= 0 || s2 != s1+1 || s3 != s1+5)
671592Srgrimes    abort();
681592Srgrimes#if defined(__i386__) || defined (__pj__) || defined (__i370__)
691592Srgrimes  /* These tests work on platforms which support cmpstrsi.  */
701592Srgrimes  s2 = s1;
711592Srgrimes  if (strncmp (++s2, "ello", 3) != 0 || s2 != s1+1)
721592Srgrimes    abort();
731592Srgrimes  s2 = s1;
741592Srgrimes  if (strncmp ("ello", ++s2, 3) != 0 || s2 != s1+1)
751592Srgrimes    abort();
7656668Sshin  s2 = s1;
771592Srgrimes  if (strncmp (++s2, "ello", 4) != 0 || s2 != s1+1)
781592Srgrimes    abort();
791592Srgrimes  s2 = s1;
8017435Spst  if (strncmp ("ello", ++s2, 4) != 0 || s2 != s1+1)
811592Srgrimes    abort();
821592Srgrimes  s2 = s1;
831592Srgrimes  if (strncmp (++s2, "ello", 5) <= 0 || s2 != s1+1)
8476096Smarkm    abort();
851592Srgrimes  s2 = s1;
861592Srgrimes  if (strncmp ("ello", ++s2, 5) >= 0 || s2 != s1+1)
871592Srgrimes    abort();
8827650Sdavidn  s2 = s1;
8927650Sdavidn  if (strncmp (++s2, "ello", 6) <= 0 || s2 != s1+1)
901592Srgrimes    abort();
911592Srgrimes  s2 = s1;
921592Srgrimes  if (strncmp ("ello", ++s2, 6) >= 0 || s2 != s1+1)
931592Srgrimes    abort();
9470102Sphk
9570102Sphk  s2 = s1;
9682460Snik  if (strncmp (++s2, "zllo", 3) >= 0 || s2 != s1+1)
9782796Ssheldonh    abort();
98100684Syar  s2 = s1;
991592Srgrimes  if (strncmp ("zllo", ++s2, 3) <= 0 || s2 != s1+1)
1001592Srgrimes    abort();
1011592Srgrimes  s2 = s1;
1021592Srgrimes  if (strncmp (++s2, "zllo", 4) >= 0 || s2 != s1+1)
1031592Srgrimes    abort();
1041592Srgrimes  s2 = s1;
10589935Syar  if (strncmp ("zllo", ++s2, 4) <= 0 || s2 != s1+1)
1061592Srgrimes    abort();
10788935Sdwmalone  s2 = s1;
1081592Srgrimes  if (strncmp (++s2, "zllo", 5) >= 0 || s2 != s1+1)
10956668Sshin    abort();
11056668Sshin  s2 = s1;
1111592Srgrimes  if (strncmp ("zllo", ++s2, 5) <= 0 || s2 != s1+1)
1121592Srgrimes    abort();
1131592Srgrimes  s2 = s1;
11492272Smaxim  if (strncmp (++s2, "zllo", 6) >= 0 || s2 != s1+1)
11592272Smaxim    abort();
11692272Smaxim  s2 = s1;
11792272Smaxim  if (strncmp ("zllo", ++s2, 6) <= 0 || s2 != s1+1)
1181592Srgrimes    abort();
1191592Srgrimes
1201592Srgrimes  s2 = s1;
1211592Srgrimes  if (strncmp (++s2, "allo", 3) <= 0 || s2 != s1+1)
1221592Srgrimes    abort();
1231592Srgrimes  s2 = s1;
12456668Sshin  if (strncmp ("allo", ++s2, 3) >= 0 || s2 != s1+1)
1251592Srgrimes    abort();
1261592Srgrimes  s2 = s1;
1271592Srgrimes  if (strncmp (++s2, "allo", 4) <= 0 || s2 != s1+1)
1281592Srgrimes    abort();
1291592Srgrimes  s2 = s1;
1301592Srgrimes  if (strncmp ("allo", ++s2, 4) >= 0 || s2 != s1+1)
1311592Srgrimes    abort();
1321592Srgrimes  s2 = s1;
1331592Srgrimes  if (strncmp (++s2, "allo", 5) <= 0 || s2 != s1+1)
1341592Srgrimes    abort();
13556668Sshin  s2 = s1;
1361592Srgrimes  if (strncmp ("allo", ++s2, 5) >= 0 || s2 != s1+1)
13775535Sphk    abort();
1381592Srgrimes  s2 = s1;
1391592Srgrimes  if (strncmp (++s2, "allo", 6) <= 0 || s2 != s1+1)
1401592Srgrimes    abort();
1411592Srgrimes  s2 = s1;
14292272Smaxim  if (strncmp ("allo", ++s2, 6) >= 0 || s2 != s1+1)
1431592Srgrimes    abort();
14492272Smaxim
14592272Smaxim  s2 = s1; n = 2; x = 1;
14692272Smaxim  if (strncmp (++s2, s1+(x&3), ++n) != 0 || s2 != s1+1 || n != 3)
14775567Speter    abort();
14856668Sshin  s2 = s1; n = 2; x = 1;
1491592Srgrimes  if (strncmp (s1+(x&3), ++s2, ++n) != 0 || s2 != s1+1 || n != 3)
1501592Srgrimes    abort();
1511592Srgrimes  s2 = s1; n = 3; x = 1;
1521592Srgrimes  if (strncmp (++s2, s1+(x&3), ++n) != 0 || s2 != s1+1 || n != 4)
1531592Srgrimes    abort();
1541592Srgrimes  s2 = s1; n = 3; x = 1;
1551592Srgrimes  if (strncmp (s1+(x&3), ++s2, ++n) != 0 || s2 != s1+1 || n != 4)
1561592Srgrimes    abort();
1571592Srgrimes  s2 = s1; n = 4; x = 1;
15888935Sdwmalone  if (strncmp (++s2, s1+(x&3), ++n) != 0 || s2 != s1+1 || n != 5)
15988935Sdwmalone    abort();
1601592Srgrimes  s2 = s1; n = 4; x = 1;
1611592Srgrimes  if (strncmp (s1+(x&3), ++s2, ++n) != 0 || s2 != s1+1 || n != 5)
1621592Srgrimes    abort();
1631592Srgrimes  s2 = s1; n = 5; x = 1;
1641592Srgrimes  if (strncmp (++s2, s1+(x&3), ++n) != 0 || s2 != s1+1 || n != 6)
1651592Srgrimes    abort();
1661592Srgrimes  s2 = s1; n = 5; x = 1;
1671592Srgrimes  if (strncmp (s1+(x&3), ++s2, ++n) != 0 || s2 != s1+1 || n != 6)
1681592Srgrimes    abort();
1691592Srgrimes
1701592Srgrimes  s2 = s1; n = 2;
1711592Srgrimes  if (strncmp (++s2, "zllo", ++n) >= 0 || s2 != s1+1 || n != 3)
1721592Srgrimes    abort();
1731592Srgrimes  s2 = s1; n = 2; x = 1;
1741592Srgrimes  if (strncmp ("zllo", ++s2, ++n) <= 0 || s2 != s1+1 || n != 3)
1751592Srgrimes    abort();
1761592Srgrimes  s2 = s1; n = 3; x = 1;
17775556Sgreen  if (strncmp (++s2, "zllo", ++n) >= 0 || s2 != s1+1 || n != 4)
17875556Sgreen    abort();
17975556Sgreen  s2 = s1; n = 3; x = 1;
18075556Sgreen  if (strncmp ("zllo", ++s2, ++n) <= 0 || s2 != s1+1 || n != 4)
18117433Spst    abort();
1821592Srgrimes  s2 = s1; n = 4; x = 1;
18356668Sshin  if (strncmp (++s2, "zllo", ++n) >= 0 || s2 != s1+1 || n != 5)
18456668Sshin    abort();
18556668Sshin  s2 = s1; n = 4; x = 1;
18656668Sshin  if (strncmp ("zllo", ++s2, ++n) <= 0 || s2 != s1+1 || n != 5)
18756668Sshin    abort();
18856668Sshin  s2 = s1; n = 5; x = 1;
18956668Sshin  if (strncmp (++s2, "zllo", ++n) >= 0 || s2 != s1+1 || n != 6)
19056668Sshin    abort();
19156668Sshin  s2 = s1; n = 5; x = 1;
19256668Sshin  if (strncmp ("zllo", ++s2, ++n) <= 0 || s2 != s1+1 || n != 6)
19356668Sshin    abort();
19456668Sshin
19556668Sshin  s2 = s1; n = 2;
19656668Sshin  if (strncmp (++s2, "allo", ++n) <= 0 || s2 != s1+1 || n != 3)
19756668Sshin    abort();
19856668Sshin  s2 = s1; n = 2; x = 1;
19956668Sshin  if (strncmp ("allo", ++s2, ++n) >= 0 || s2 != s1+1 || n != 3)
20056668Sshin    abort();
20156668Sshin  s2 = s1; n = 3; x = 1;
20256668Sshin  if (strncmp (++s2, "allo", ++n) <= 0 || s2 != s1+1 || n != 4)
20356668Sshin    abort();
20456668Sshin  s2 = s1; n = 3; x = 1;
20556668Sshin  if (strncmp ("allo", ++s2, ++n) >= 0 || s2 != s1+1 || n != 4)
20656668Sshin    abort();
20756668Sshin  s2 = s1; n = 4; x = 1;
20856668Sshin  if (strncmp (++s2, "allo", ++n) <= 0 || s2 != s1+1 || n != 5)
20956668Sshin    abort();
21056668Sshin  s2 = s1; n = 4; x = 1;
21156668Sshin  if (strncmp ("allo", ++s2, ++n) >= 0 || s2 != s1+1 || n != 5)
21256668Sshin    abort();
21356668Sshin  s2 = s1; n = 5; x = 1;
21456668Sshin  if (strncmp (++s2, "allo", ++n) <= 0 || s2 != s1+1 || n != 6)
21556668Sshin    abort();
21656668Sshin  s2 = s1; n = 5; x = 1;
21756668Sshin  if (strncmp ("allo", ++s2, ++n) >= 0 || s2 != s1+1 || n != 6)
21856668Sshin    abort();
21956668Sshin
22056668Sshin#endif
22156668Sshin
22256668Sshin  /* Test at least one instance of the __builtin_ style.  We do this
22356668Sshin     to ensure that it works and that the prototype is correct.  */
22456668Sshin  if (__builtin_strncmp ("hello", "a", 100) <= 0)
22556668Sshin    abort();
22656668Sshin
22756668Sshin  return 0;
22856668Sshin}
22956668Sshin
23056668Sshin#ifdef __OPTIMIZE__
23156668Sshin/* When optimizing, all the above cases should be transformed into
23256668Sshin   something else.  So any remaining calls to the original function
23356668Sshin   should abort.  */
23456668Sshinstatic int
23556668Sshinstrncmp(const char *s1, const char *s2, size_t n)
23656668Sshin{
23756668Sshin  abort();
23856668Sshin}
23956668Sshin#endif
24056668Sshin