------- Comment #13 from rguenth at gcc dot gnu dot org  2010-03-06 14:27 
-------
Err - it's just because the code is broken:

  tree low_bound, up_bound = array_ref_up_bound (ref);

  low_sub = up_sub = TREE_OPERAND (ref, 1);

  if (!up_bound || TREE_NO_WARNING (ref)
      || TREE_CODE (up_bound) != INTEGER_CST
      /* Can not check flexible arrays.  */
      || (TYPE_SIZE (TREE_TYPE (ref)) == NULL_TREE
          && TYPE_DOMAIN (TREE_TYPE (ref)) != NULL_TREE
          && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (ref))) == NULL_TREE)

well - this checks TYPE_SIZE/DOMAIN on the element type ...

and the struct hack check is too strict:

      /* Accesses after the end of arrays of size 0 (gcc
         extension) and 1 are likely intentional ("struct
         hack").  */
      || compare_tree_int (up_bound, 1) <= 0)

Replacing that with a more proper (but still too strict) check like

  /* Accesses after the end of arrays at the end of structures
     are likely intentional ("struct hack").  */
  if (TREE_CODE (TREE_OPERAND (ref, 0)) == COMPONENT_REF
      && !TREE_CHAIN (TREE_OPERAND (TREE_OPERAND (ref, 0), 1)))
    return;

gets you

t.C: In function 'int main()':
t.C:27:45: warning: array subscript is above array bounds

it doesn't print that this is from an inlined constructor though.


-- 

rguenth at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         AssignedTo|unassigned at gcc dot gnu   |rguenth at gcc dot gnu dot
                   |dot org                     |org
           Severity|normal                      |enhancement
             Status|UNCONFIRMED                 |ASSIGNED
     Ever Confirmed|0                           |1
   Last reconfirmed|0000-00-00 00:00:00         |2010-03-06 14:27:49
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43270

Reply via email to