1 /* Copyright (C) 2004 Free Software Foundation. 2 3 Test strlen on const variables initialized to string literals. 4 5 Written by Jakub Jelinek, 9/14/2004. */ 6 7 extern void abort (void); 8 extern __SIZE_TYPE__ strlen (const char *); 9 extern char *strcpy (char *, const char *); 10 static const char bar[] = "Hello, World!"; 11 static const char baz[] = "hello, world?"; 12 static const char larger[20] = "short string"; 13 extern int inside_main; 14 15 int l1 = 1; 16 int x = 6; 17 18 void main_test(void)19main_test(void) 20 { 21 inside_main = 1; 22 23 #ifdef __OPTIMIZE__ 24 const char *foo; 25 int i; 26 #endif 27 28 if (strlen (bar) != 13) 29 abort (); 30 31 if (strlen (bar + 3) != 10) 32 abort (); 33 34 if (strlen (&bar[6]) != 7) 35 abort (); 36 37 if (strlen (bar + (x++ & 7)) != 7) 38 abort (); 39 if (x != 7) 40 abort (); 41 42 #ifdef __OPTIMIZE__ 43 foo = bar; 44 for (i = 0; i < 4; ++i) 45 { 46 if (i == l1 - 1) 47 foo = "HELLO, WORLD!"; 48 else if (i == l1) 49 foo = bar; 50 else if (i == l1 + 1) 51 foo = "hello, world!"; 52 else 53 foo = baz; 54 } 55 if (strlen (foo) != 13) 56 abort (); 57 #endif 58 59 if (strlen (larger) != 12) 60 abort (); 61 if (strlen (&larger[10]) != 2) 62 abort (); 63 64 inside_main = 0; 65 /* The following call may or may not be folded depending on 66 the optimization level, and when it isn't folded (such 67 as may be the case with -Og) it may or may not result in 68 a library call, depending on whether or not it's expanded 69 inline (e.g., powerpc64 makes a call while x86_64 expands 70 it inline). */ 71 if (strlen (larger + (x++ & 7)) != 5) 72 abort (); 73 if (x != 8) 74 abort (); 75 inside_main = 1; 76 } 77