From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5115 invoked by alias); 22 Jan 2007 20:16:32 -0000 Received: (qmail 5025 invoked by alias); 22 Jan 2007 20:16:17 -0000 Date: Mon, 22 Jan 2007 20:16:00 -0000 Message-ID: <20070122201617.5024.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug fortran/30512] MAXVAL() incorrect for zero-size int arrays, and for -HUGE-1 maximum values. In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "sgk at troutmask dot apl dot washington dot edu" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2007-01/txt/msg01851.txt.bz2 ------- Comment #5 from sgk at troutmask dot apl dot washington dot edu 2007-01-22 20:16 ------- Subject: Re: MAXVAL() incorrect for zero-size int arrays, and for -HUGE-1 maximum values. > >- Comment #3 from fxcoudert at gcc dot gnu dot org 2007-01-22 07:56 ------- > I don't think it's a bug, since "the negative number with the largest > magnitude possible within the representation" is not -huge()-1, but -huge(). > > If I understand the standard correctly, -huge()-1, although being > representible by the hardware you have, is not "within the representation" > of this integer kind, because the range of the representation of an > integer kind is supposed to be symmetric. > > For what it's worth, the Intel and Sun compilers have the behaviour > you expect, but the Portland compiler and g95 both have the same > behaviour as gfortran. > > Steve might have an idea on that, IIRC he's the one who implemented the > -frange-check option. Otherwise, a question to comp.lang.fortran would be a > good thing. > I fixed the range checking from [-huge()-1: 2*huge()] to [-huge()-1: huge()]. The old upper limited would allow people to write integer(1) i i = -128_1 ! This should be -huge(i) - 1_1 end because the 128_1 was not flagged as overflowing a integer(1). Note, -128_1 is a unary minus operating on the 128_1. When I changed the range checking or shortly after, jerryd introduced the -f[no]-range-check option. For the case at hand, the integers do not need to be symmetric, and so minval and maxval should properly handle -huge()-1. As pointed out by Tobias, integer(1) a(2) a = -huge(a) - 1 print *, minval(a), maxval(a) end should print "-128 -128" Now, where the symmetry of the integers becomes a problem is integer(1) i i = - huge() - 1 i = abs(i) ! This is invalid. end The above is prohibited in 13.14: The types and type parameters of intrinsic procedure arguments and function results are determined by these specifications. A program is prohibited from invoking an intrinsic procedure under circumstances where a value to be returned in a subroutine argument or function result is outside the range of values representable by objects of the specified type and type parameters. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30512