* tree.c (variably_modified_type_p): VM arguments don't make the
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Jun 2006 21:13:13 +0000 (21:13 +0000)
committermrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Jun 2006 21:13:13 +0000 (21:13 +0000)
type a VM type.

testsuite:
* gcc.dg/vla-8.c: Add.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114787 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vla-8.c [new file with mode: 0644]
gcc/tree.c

index 81535ec..c664415 100644 (file)
@@ -1,3 +1,8 @@
+2006-06-19  Mike Stump  <mrs@apple.com>
+
+       * tree.c (variably_modified_type_p): VM arguments don't make the
+       type a VM type.
+
 2006-06-19  Richard Guenther  <rguenther@suse.de>
 
        * tree-ssa-pre.c (try_combine_conversion): Strip useless
index 8fda51d..c3f298a 100644 (file)
@@ -1,3 +1,7 @@
+2006-06-19  Joseph S. Myers  <joseph@codesourcery.com>
+
+       * gcc.dg/vla-8.c: Add.
+
 2006-06-19  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/27090
diff --git a/gcc/testsuite/gcc.dg/vla-8.c b/gcc/testsuite/gcc.dg/vla-8.c
new file mode 100644 (file)
index 0000000..a5b8113
--- /dev/null
@@ -0,0 +1,6 @@
+/* { dg-do compile  } */
+/* { dg-options "-std=c99 -pedantic-errors" } */
+/* Radar 4336222 */
+
+int a;
+struct s { void (*f)(int (*)[a]); };
index c369d60..0d40a51 100644 (file)
@@ -5602,8 +5602,10 @@ find_var_from_fn (tree *tp, int *walk_subtrees, void *data)
 }
 
 /* Returns true if T is, contains, or refers to a type with variable
-   size.  If FN is nonzero, only return true if a modifier of the type
-   or position of FN is a variable or parameter inside FN.
+   size.  For METHOD_TYPEs and FUNCTION_TYPEs we exclude the
+   arguments, but not the return type.  If FN is nonzero, only return
+   true if a modifier of the type or position of FN is a variable or
+   parameter inside FN.
 
    This concept is more general than that of C99 'variably modified types':
    in C99, a struct type is never variably modified because a VLA may not
@@ -5644,16 +5646,10 @@ variably_modified_type_p (tree type, tree fn)
 
     case FUNCTION_TYPE:
     case METHOD_TYPE:
-      /* If TYPE is a function type, it is variably modified if any of the
-         parameters or the return type are variably modified.  */
+      /* If TYPE is a function type, it is variably modified if the
+        return type is variably modified.  */
       if (variably_modified_type_p (TREE_TYPE (type), fn))
          return true;
-
-      for (t = TYPE_ARG_TYPES (type);
-          t && t != void_list_node;
-          t = TREE_CHAIN (t))
-       if (variably_modified_type_p (TREE_VALUE (t), fn))
-         return true;
       break;
 
     case INTEGER_TYPE: