On Fri, 2 Sep 2011, Richard Guenther wrote: > > This patch makes us no longer treat unsigned sizetypes as sign-extending > which has caused trouble in the past (see the tree-ssa-ccp.c workarounds > removed below). > > Most frontend specific changes below deal with the fact that overflow > behavior, as reported from size_binop, changes as unsigned sizetypes > now no longer overflow at SSIZETYPE_MAX but at USIZETYPE_MAX. Diagnostics > expect warnings when overflow at half of the address-space occurs, > and Ada needs to pay special attention to its "negative" offsets, > all host_integerp (..., 1) checks have to be adjusted. > > The patch bootstraps ok on x86_64-unknown-linux-gnu with all languages > enabled and tests with the following FAILs with {,-m32}: > > Running target unix//-m32 > FAIL: g++.dg/tree-ssa/pr19807.C scan-tree-dump-times optimized "\\+ > 0x0f*;" 1 > > still need to figure out how to properly quote that regexp for TCL > scanning for the various (sizetype)-1U printings ... > > Running target unix/{,-m32} > FAIL: gcc.dg/pr42611.c (test for errors, line 17) > FAIL: gcc.dg/pr42611.c (test for excess errors) > > another missed overflow check, looking at it now > > Running target unix/ > FAIL: gnat.dg/array11.adb (test for warnings, line 12) > FAIL: gnat.dg/object_overflow.adb (test for warnings, line 8) > > Running target unix//-m32 > FAIL: gnat.dg/array11.adb (test for warnings, line 12) > FAIL: gnat.dg/frame_overflow.adb (test for errors, line 17) > FAIL: gnat.dg/frame_overflow.adb (test for errors, line 24) > FAIL: gnat.dg/object_overflow.adb (test for warnings, line 8) > > probably similar, I pushed back Ada diagnostic tests for now, > but will look at them after resolving the above remaining FAIL.
gnat.dg/array11.adb and gnat.dg/object_overflow.adb are fixed by the following. Not sure what type to test TYPE_UNSIGNED on though. Possibly needs adjustment in c-comment.c:complete_array_type to use ssize_int (-1) for the array[] = {...} case. Comments? Thanks, Richard. Index: trunk/gcc/stor-layout.c =================================================================== --- trunk.orig/gcc/stor-layout.c 2011-09-02 16:23:33.000000000 +0200 +++ trunk/gcc/stor-layout.c 2011-09-02 16:19:12.000000000 +0200 @@ -1959,16 +1959,14 @@ layout_type (tree type) if (integer_zerop (element_size)) length = size_zero_node; - /* The computation should happen in the original type so + /* The computation should happen in the original signedness so that (possible) negative values are handled appropriately. */ else length = fold_convert (sizetype, - fold_build2 (PLUS_EXPR, TREE_TYPE (lb), - build_int_cst (TREE_TYPE (lb), 1), - fold_build2 (MINUS_EXPR, - TREE_TYPE (lb), - ub, lb))); + size_binop (PLUS_EXPR, + build_int_cst (TREE_TYPE (lb), 1), + size_binop (MINUS_EXPR, ub, lb))); TYPE_SIZE (type) = size_binop (MULT_EXPR, element_size, fold_convert (bitsizetype, Index: trunk/gcc/ada/gcc-interface/utils.c =================================================================== --- trunk.orig/gcc/ada/gcc-interface/utils.c 2011-09-02 16:23:33.000000000 +0200 +++ trunk/gcc/ada/gcc-interface/utils.c 2011-09-02 16:22:20.000000000 +0200 @@ -1248,7 +1248,7 @@ copy_type (tree type) return new_type; } -/* Return a subtype of sizetype with range MIN to MAX and whose +/* Return a subtype of [s]sizetype with range MIN to MAX and whose TYPE_INDEX_TYPE is INDEX. GNAT_NODE is used for the position of the associated TYPE_DECL. */ @@ -1256,7 +1256,8 @@ tree create_index_type (tree min, tree max, tree index, Node_Id gnat_node) { /* First build a type for the desired range. */ - tree type = build_nonshared_range_type (sizetype, min, max); + tree type = build_nonshared_range_type (TYPE_UNSIGNED (index) + ? sizetype : ssizetype, min, max); /* Then set the index type. */ SET_TYPE_INDEX_TYPE (type, index);