C++ constructor bug? (and what are the semantics of a RANGE_EXPR?)

Nathan Sidwell nathan@codesourcery.com
Thu Dec 16 09:19:00 GMT 2004


Steven Bosscher wrote:
> Hi,
> 
> With a patch for the wrong-code bug PR18191 I'm seeing a new failure
> for g++.dg/init/new4.C.  That test case looks like this:
> 
> int *x = new int [2] ();
> 
> which looks like this in the .original tree dump:

> Note especially the last two lines.  There is a RANGE_EXPR with two
> operands, with values 0 and 2.  This comes out of the C++ front end
> and I suspect it's wrong.  From the comment for CONSTRUCTOR:
> 
>     If the TREE_PURPOSE is a RANGE_EXPR, it is a short-hand for many nodes,
>     one for each index in the range.
> 
> But the index "2" is not in the range for the target object of this
> constructor.  Smells like off-by-one in the C++ front end.

yes, it does look like that. The original termination check was
             !tree_int_cst_lt (max_index, index);
which in normal speak is
	    !(max_index < index)
which is
	      index <= max_index
so max_index is the inclusive upper bound, at that point (which is
what it should be in the RANGE_EXPR).

Where is max_index (in build_zero_init) getting its value in this
case?

nathan

-- 
Nathan Sidwell    ::   http://www.codesourcery.com   ::     CodeSourcery LLC
nathan@codesourcery.com    ::     http://www.planetfall.pwp.blueyonder.co.uk



More information about the Gcc mailing list