summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/vla-4.c
diff options
context:
space:
mode:
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>2006-05-18 18:22:12 +0000
committermrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>2006-05-18 18:22:12 +0000
commit32d33ab2b6aa8f79eaa31808de566d58d1a85b55 (patch)
tree3393aa88e335ad0c151ee642c9e17e8807ed52e9 /gcc/testsuite/gcc.dg/vla-4.c
parent64089cc9f030d8ef7972adb5d117e0b23f47d62b (diff)
downloadgcc-32d33ab2b6aa8f79eaa31808de566d58d1a85b55.tar.gz
Fix up vla, vm and [*] sematics.
PR c/18740 PR c/7948 PR c/25802 * c-tree.h (struct c_arg_info): Add had_vla_unspec. (c_vla_unspec_p): Add. (c_vla_type_p): Add. * c-decl.c (struct c_scope): Add had_vla_unspec. (build_array_declarator): Add support for [*]. (grokdeclarator): Likewise. (grokparms): Likewise. (get_parm_info): Likewise. * c-objc-common.c (c_vla_unspec_p): Likewise. * c-objc-common.h (LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P): Likewise. * c-parser.c (c_parser_typeof_specifier): Evaluate arguments to typeof when argument is a variably modified type not inside sizeof or alignof. (c_parser_direct_declarator_inner): Propagate errors. (c_parser_sizeof_expression): Add support for [*]. * c-typeck.c (c_vla_type_p): Add. (composite_type): Add support for vla compositing. (comptypes_internal): Add support for vla compatibility. (c_expr_sizeof_expr): Evaluate vla arguments. * tree.c (variably_modified_type_p): Update comment for [*]. testsuite: * gcc.dg/c90-arraydecl-1.c: Update for vla, vm [*] fixups. * gcc.dg/vla-4.c: Add. * gcc.dg/vla-5.c: Add. * gcc.dg/vla-6.c: Add. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@113888 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/gcc.dg/vla-4.c')
-rw-r--r--gcc/testsuite/gcc.dg/vla-4.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/vla-4.c b/gcc/testsuite/gcc.dg/vla-4.c
new file mode 100644
index 00000000000..7ffbfb31b8e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vla-4.c
@@ -0,0 +1,48 @@
+/* { dg-do run } */
+/* { dg-options "-std=c99 -pedantic-errors" } */
+/* PR c/18740 */
+
+static int i;
+
+int foo(int n)
+{
+ int (*t)[n];
+ i = 0;
+ int j = 0;
+ char b[1][n+3]; /* Variable length array. */
+ int d[3][n]; /* Variable length array. */
+ sizeof (b[i++ + sizeof(j++)]); /* Outer sizeof is evaluated for vla, but not the inner one. */
+ if (i != 1 || j != 0)
+ return 1;
+ __typeof__(b[i++]) c1; /* typeof is evauluated when given a vm */
+ if (i != 2)
+ return 1;
+ __typeof__(t + (i++,0)) c2; /* typeof is evauluated when given a vm */
+ if (i != 3)
+ return 1;
+ __typeof__(i + (i++,0)) c3; /* typeof is not evauluated when not given a vm */
+ if (i != 3)
+ return 1;
+ sizeof (d[i++]); /* sizeof is evaluated for vla. */
+ if (i != 4)
+ return 1;
+ __alignof__(__typeof__(t + (i++,0))); /* typeof is not evauluated when given a vm inside alignof*/
+ if (i != 4)
+ return 1;
+ sizeof(__typeof__(t + (i++,0))); /* typeof is not evauluated when given a vm inside sizeof*/
+ if (i != 4)
+ return 1;
+ return 0;
+}
+
+int foo6(int a, int b[a][a], int (*c)[sizeof(*b)]) {
+ return sizeof (*c);
+}
+
+int main() {
+ int b[10][10];
+ int (*c)[sizeof(int)*10];
+ if (foo6(10, b, c) != 10*sizeof(int)*sizeof(int))
+ return 1;
+ return foo(10);
+}