tree.c (variably_modified_type_p): VM arguments don't make the type a VM type.
authorMike Stump <mrs@gcc.gnu.org>
Mon, 19 Jun 2006 21:13:13 +0000 (21:13 +0000)
committerMike Stump <mrs@gcc.gnu.org>
Mon, 19 Jun 2006 21:13:13 +0000 (21:13 +0000)
* tree.c (variably_modified_type_p): VM arguments don't make the
type a VM type.

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

From-SVN: r114787

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

index 81535ec9884ac038ef43f14ad50f84a0748d4d62..c664415734ad9f6800132954dfe9d7eece65c1c8 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 8fda51d5d1c613d0481a3fe5ccecae840863fcbf..c3f298a93c53a4805c81833e4b18db9c00a2c35e 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 c369d604e476face6b8533d497823a274cdf3f36..0d40a517fe97831cc8764c797ebe54b391014029 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: