Merge to HEAD at tree-cleanup-merge-20041024 .
[official-gcc.git] / gcc / testsuite / g77.dg / strlen0.f
blob765c8b61190c23862bbca4c9657284ead5322762
1 C Substring range checking test program, to check behavior with respect
2 C to X3J3/90.4 paragraph 5.7.1.
4 C Patches relax substring checking for subscript expressions in order to
5 C simplify coding (elimination of length checks for strings passed as
6 C parameters) and to avoid contradictory behavior of subscripted substring
7 C expressions with respect to unsubscripted string expressions.
9 C Key part of 5.7.1 interpretation comes down to statement that in the
10 C substring expression,
11 C v ( e1 : e2 )
12 C 1 <= e1 <= e2 <= len to be valid, yet the expression
13 C v ( : )
14 C is equivalent to
15 C v(1:len(v))
17 C meaning that any statement that reads
18 C str = v // 'tail'
19 C (where v is a string passed as a parameter) would require coding as
20 C if (len(v) .gt. 0) then
21 C str = v // 'tail'
22 C else
23 C str = 'tail'
24 C endif
25 C to comply with the standard specification. Under the stricter
26 C interpretation, functions strcat and strlat would be incorrect as
27 C written for null values of str1 and/or str2.
29 C This code compiles and runs without error on
30 C SunOS 4.1.3 f77 (-C option)
31 C SUNWspro SPARCcompiler 4.2 f77 (-C option)
32 C (and with proposed patches, gcc-2.9.2 -fbounds-check except for test 6,
33 C which is a genuine, deliberate error - comment out to make further
34 C tests)
36 C { dg-do run }
37 C { dg-options "-fbounds-check" }
39 C G. Helffrich/Tokyo Inst. Technology Jul 24 2001
41 character str*8,strres*16,strfun*16,strcat*16,strlat*16
43 str='Hi there'
45 C Test 1 - (current+patched) two char substring result
46 strres=strfun(str,1,2)
47 write(*,*) 'strres is ',strres
49 C Test 2 - (current+patched) null string result
50 strres=strfun(str,5,4)
51 write(*,*) 'strres is ',strres
53 C Test 3 - (current+patched) null string result
54 strres=strfun(str,8,7)
55 write(*,*) 'strres is ',strres
57 C Test 4 - (current) error; (patched) null string result
58 strres=strfun(str,9,8)
59 write(*,*) 'strres is ',strres
61 C Test 5 - (current) error; (patched) null string result
62 strres=strfun(str,1,0)
63 write(*,*) 'strres is ',strres
65 C Test 6 - (current+patched) error
66 C strres=strfun(str,20,20)
67 C write(*,*) 'strres is ',strres
69 C Test 7 - (current+patched) str result
70 strres=strcat(str,'')
71 write(*,*) 'strres is ',strres
73 C Test 8 - (current) error; (patched) str result
74 strres=strlat('',str)
75 write(*,*) 'strres is ',strres
77 end
79 character*(*) function strfun(str,i,j)
80 character str*(*)
82 strfun = str(i:j)
83 end
85 character*(*) function strcat(str1,str2)
86 character str1*(*), str2*(*)
88 strcat = str1 // str2
89 end
91 character*(*) function strlat(str1,str2)
92 character str1*(*), str2*(*)
94 strlat = str1(1:len(str1)) // str2(1:len(str2))
95 end