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