diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 72ab6794879b4df43edda29751c0a3822cd8b8f6..2d4575aec128ac449fcad284e5558666a5a8ba1d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-09-17  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* tree-sra.c (maybe_lookup_element_for_expr) <COMPONENT_REF>: Return
+	NULL for variable-sized records too.
+	(sra_walk_expr) <COMPONENT_REF>: Stop at variable-sized records too.
+
 2007-09-17  Tom Tromey  <tromey@redhat.com>
 
 	* c-decl.c (pushdecl): Don't set DECL_LANG_SPECIFIC.
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 5d69a49b7eb25858f3b3d2afaa6240f1d20e385e..4a3924b6a64e7b5de63c11816dce86b8ca420237 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -636,10 +636,17 @@ maybe_lookup_element_for_expr (tree expr)
       break;
 
     case COMPONENT_REF:
-      /* Don't look through unions.  */
-      if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) != RECORD_TYPE)
-	return NULL;
-      child = TREE_OPERAND (expr, 1);
+      {
+	tree type = TREE_TYPE (TREE_OPERAND (expr, 0));
+	/* Don't look through unions.  */
+	if (TREE_CODE (type) != RECORD_TYPE)
+	  return NULL;
+	/* Neither through variable-sized records.  */
+	if (TYPE_SIZE (type) == NULL_TREE
+	    || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
+	  return NULL;
+	child = TREE_OPERAND (expr, 1);
+      }
       break;
 
     case REALPART_EXPR:
@@ -789,14 +796,17 @@ sra_walk_expr (tree *expr_p, block_stmt_iterator *bsi, bool is_output,
 	break;
 
       case COMPONENT_REF:
-	/* A reference to a union member constitutes a reference to the
-	   entire union.  */
-	if (TREE_CODE (TREE_TYPE (TREE_OPERAND (inner, 0))) != RECORD_TYPE)
-	  goto use_all;
-	/* ??? See above re non-constant stride.  */
-	if (TREE_OPERAND (inner, 2))
-	  goto use_all;
-	inner = TREE_OPERAND (inner, 0);
+	{
+	  tree type = TREE_TYPE (TREE_OPERAND (inner, 0));
+	  /* Don't look through unions.  */
+	  if (TREE_CODE (type) != RECORD_TYPE)
+	    goto use_all;
+	  /* Neither through variable-sized records.  */
+	  if (TYPE_SIZE (type) == NULL_TREE
+	      || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
+	    goto use_all;
+	  inner = TREE_OPERAND (inner, 0);
+	}
 	break;
 
       case REALPART_EXPR: