[gfortran,patch] Improve error messages for bounds-checking and a few other cases

FX Coudert fxcoudert@gmail.com
Sat Jun 3 15:03:00 GMT 2006


As Thomas noted, my first patch segfaulted in one case (where the  
locus is actually not available, at line 3725 of trans-array.c.  
Please find attached a improved patch, which regtests fine both with  
and without -fbounds-check.

OK for mainline?

Sorry for the inconvenience,
FX



-------------- next part --------------
A non-text attachment was scrubbed...
Name: bounds_check.ChangeLog
Type: application/octet-stream
Size: 1422 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20060603/d7896720/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bounds_check.diff
Type: application/octet-stream
Size: 16216 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20060603/d7896720/attachment-0001.obj>
-------------- next part --------------


> Attached patch yields detailed error messages with -fbounds-check.  
> A sample of the error messages is:
>
>> $ cat a1.f90
>>   integer x(1,1)
>>   x(1,2) = 1
>>   end
>> $ gfortran -fbounds-check a1.f90 -w && ./a.out
>> Fortran runtime error: Array reference out of bounds for array  
>> 'x', upper bound of dimension 2 exceeded (in file 'a1.f90', at  
>> line 2)
>>
>> $ cat a1bis.f90
>>   integer x(1,1)
>>   x(1:2,1) = 1
>>   end
>> $ gfortran -fbounds-check a1bis.f90 -w && ./a.out
>> Fortran runtime error: Array bound mismatch, upper bound of  
>> dimension 1 of array 'x' exceeded (in file 'a1bis.f90', at line 2)
>>
>> $ cat a2.f
>>       integer i
>>       assign 800 to i
>>   800 continue
>>       read(*,i)
>>       end
>> $ gfortran -fbounds-check a2.f -w && ./a.out
>> Fortran runtime error: Label assigned to variable 'i' is not a  
>> format label (in file 'a2.f', at line 4)
>>
>> $ cat a3.f
>>       integer i
>>       assign 800 to i
>>       goto i
>>   800 format(A)
>>       end
>> $ gfortran -fbounds-check a3.f -w && ./a.out
>> Fortran runtime error: Assigned label is not a target label (in  
>> file 'a3.f', at line 3)
>>
>> $ cat a4.f
>>       integer i
>>       assign 800 to i
>>       goto i, (200)
>>   800 continue
>>   200 continue
>>       end
>> $ gfortran -fbounds-check a4.f -w && ./a.out
>> Fortran runtime error: Assigned label is not in the list (in file  
>> 'a4.f', at line 3)
>>
>> $ cat a5.f90
>> program alloc_dummy
>>
>>     implicit none
>>     integer, allocatable :: a(:)
>>
>>     allocate(a(5))
>>     print *, whatever(a)
>>
>> contains
>>
>>     function whatever(x)
>>         integer, allocatable :: x(:)
>>         integer :: whatever(size(x)+1)
>>
>>         whatever = x
>>     end function whatever
>> end program alloc_dummy
>> $ gfortran -fbounds-check a5.f90 -w && ./a.out
>> Fortran runtime error: Array bound mismatch, size mismatch for  
>> dimension 1 of array 'whatever' (in file 'a5.f90', at line 15)
>
> I hope you think, like me, that it's better than the current error  
> message: "Fortran runtime error: Array bound mismatch", with no  
> source file, line and variable name :)
>
> Now, to what the patch does:
>   -- _gfortran_runtime_error takes only one argument, so we stop  
> generating calls with three arguments! :)
>   -- instead of passing a string tree to gfc_trans_runtime_check,  
> give it a string (it will build the tree itself) and a locus (from  
> which it will extract the source file and source line number); if  
> the locus is NULL, then gfc_trans_runtime_check will use the  
> fallback method of gfc_source_file and input_line
>   -- modify everywhere to pass locus to gfc_trans_runtime_check,  
> whenever possible
>   -- for every call to gfc_trans_runtime_check, build more precise  
> error messages, including variable name, the dimension involved for  
> out-of-bounds index message, whether it's the lower or upper bound  
> that was exceeded.
>
> There still are some calls to gfc_trans_runtime_check that I don't  
> understand in which cases they are reached:
>   * in trans-intrinsic.c, at line 764
>   * in trans-expr.c, at line 2156
> For these cases, we now generate the same error message than we  
> previously did, added with source file and approximate line location.
>
>
> Bootstrapped and tested on i686-linux. OK for mainline?
>
> Thanks,
> FX


More information about the Gcc-patches mailing list