I've isolated the intermittent failures of a test for a recent
enhancement to -Warray-bounds reported in PR 92622 to the use
of an offset left uninitialized by a failed call to
get_addr_base_and_unit_offset.

The attached patch makes sure the variable is only used if
the call succeeds.  I will commit it tomorrow unless there
are objections/suggestions for changes.

Martin
PR middle-end/92622 - FAIL: gcc.dg/Warray-bounds-22.c on ILP32: missing warnings for VLA on lines 67 and 69

gcc/ChangeLog:

	PR testsuite/92622
	* tree-vrp.c (vrp_prop::check_array_ref): Avoid using a variable
	left uninitialized by get_addr_base_and_unit_offset ofn failure.

Index: gcc/tree-vrp.c
===================================================================
--- gcc/tree-vrp.c	(revision 279008)
+++ gcc/tree-vrp.c	(working copy)
@@ -3516,7 +3516,6 @@ vrp_prop::check_array_ref (location_t location, tr
 	  tree ptrdiff_max = TYPE_MAX_VALUE (ptrdiff_type_node);
 	  tree maxbound = ptrdiff_max;
 	  tree arg = TREE_OPERAND (ref, 0);
-	  poly_int64 off;
 
 	  const bool compref = TREE_CODE (arg) == COMPONENT_REF;
 	  if (compref)
@@ -3535,19 +3534,22 @@ vrp_prop::check_array_ref (location_t location, tr
 		 size wouldn't necessarily be correct if the reference is
 		 to its flexible array member initialized in a different
 		 translation unit.  */
-	      tree base = get_addr_base_and_unit_offset (arg, &off);
-	      if (!compref && base && DECL_P (base))
-		if (tree basesize = DECL_SIZE_UNIT (base))
-		  if (TREE_CODE (basesize) == INTEGER_CST)
-		    {
-		      maxbound = basesize;
-		      decl = base;
-		    }
+	      poly_int64 off;
+	      if (tree base = get_addr_base_and_unit_offset (arg, &off))
+		{
+		  if (!compref && DECL_P (base))
+		    if (tree basesize = DECL_SIZE_UNIT (base))
+		      if (TREE_CODE (basesize) == INTEGER_CST)
+			{
+			  maxbound = basesize;
+			  decl = base;
+			}
 
-	      if (known_gt (off, 0))
-		maxbound = wide_int_to_tree (sizetype,
-					     wi::sub (wi::to_wide (maxbound),
-						      off));
+		  if (known_gt (off, 0))
+		    maxbound = wide_int_to_tree (sizetype,
+						 wi::sub (wi::to_wide (maxbound),
+							  off));
+		}
 	    }
 	  else
 	    maxbound = fold_convert (sizetype, maxbound);

Reply via email to