From ca6af4f857cf2b93e89e99bad1dd2598c0b74f02 Mon Sep 17 00:00:00 2001 From: Richard Henderson <rth@redhat.com> Date: Sat, 18 Dec 2004 20:07:54 -0800 Subject: [PATCH] c-decl.c (finish_struct): Add DECL_EXPR for variable sized structures seen inside functions. * c-decl.c (finish_struct): Add DECL_EXPR for variable sized structures seen inside functions. From-SVN: r92371 --- gcc/ChangeLog | 5 +++++ gcc/c-decl.c | 6 ++++++ gcc/testsuite/gcc.c-torture/execute/20041218-2.c | 15 +++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/20041218-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 51ad04e5266e..f9a9b5628bc2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-12-18 Richard Henderson <rth@redhat.com> + + * c-decl.c (finish_struct): Add DECL_EXPR for variable sized + structures seen inside functions. + 2004-12-18 Richard Henderson <rth@redhat.com> * c-decl.c (grokdeclarator): Save variable array size before diff --git a/gcc/c-decl.c b/gcc/c-decl.c index b76e2746d99a..26caa2c47b34 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -5401,6 +5401,12 @@ finish_struct (tree t, tree fieldlist, tree attributes) /* Finish debugging output for this type. */ rest_of_type_compilation (t, toplevel); + /* If we're inside a function proper, i.e. not file-scope and not still + parsing parameters, then arrange for the size of a variable sized type + to be bound now. */ + if (cur_stmt_list && variably_modified_type_p (t, NULL)) + add_stmt (build_stmt (DECL_EXPR, build_decl (TYPE_DECL, NULL, t))); + return t; } diff --git a/gcc/testsuite/gcc.c-torture/execute/20041218-2.c b/gcc/testsuite/gcc.c-torture/execute/20041218-2.c new file mode 100644 index 000000000000..c4b3627c9d1a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20041218-2.c @@ -0,0 +1,15 @@ +extern void abort (void); + +int test(int n) +{ + struct s { char b[n]; }; + n++; + return sizeof(struct s); +} + +int main() +{ + if (test(123) != 123) + abort (); + return 0; +} -- GitLab