From de8dea22ca5dc050cc60e846ea91876bf379f5f0 Mon Sep 17 00:00:00 2001 From: mrs Date: Mon, 19 Jun 2006 21:13:13 +0000 Subject: [PATCH] * tree.c (variably_modified_type_p): VM arguments don't make the 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 | 5 +++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/vla-8.c | 6 ++++++ gcc/tree.c | 16 ++++++---------- 4 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/vla-8.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 81535ec9884..c664415734a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2006-06-19 Mike Stump + + * tree.c (variably_modified_type_p): VM arguments don't make the + type a VM type. + 2006-06-19 Richard Guenther * tree-ssa-pre.c (try_combine_conversion): Strip useless diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8fda51d5d1c..c3f298a93c5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2006-06-19 Joseph S. Myers + + * gcc.dg/vla-8.c: Add. + 2006-06-19 Richard Guenther 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 index 00000000000..a5b8113a73d --- /dev/null +++ b/gcc/testsuite/gcc.dg/vla-8.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c99 -pedantic-errors" } */ +/* Radar 4336222 */ + +int a; +struct s { void (*f)(int (*)[a]); }; diff --git a/gcc/tree.c b/gcc/tree.c index c369d604e47..0d40a517fe9 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -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: -- 2.11.4.GIT