From: Marek Polacek Date: Mon, 7 Dec 2015 17:52:23 +0000 (+0000) Subject: re PR c/68668 (bogus error: invalid use of array with unspecified bounds) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=66189108d3785a463d2d1d0341fa6198582d9fd2;p=gcc.git re PR c/68668 (bogus error: invalid use of array with unspecified bounds) PR c/68668 * c-decl.c (grokdeclarator): If ORIG_QUAL_INDIRECT is indirect, use TREE_TYPE of ORIG_QUAL_TYPE, otherwise decrement ORIG_QUAL_INDIRECT. * gcc.dg/pr68668.c: New test. From-SVN: r231374 --- diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 468ef9398be..0b3351ce960 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2015-12-07 Marek Polacek + + PR c/68668 + * c-decl.c (grokdeclarator): If ORIG_QUAL_INDIRECT is indirect, use + TREE_TYPE of ORIG_QUAL_TYPE, otherwise decrement ORIG_QUAL_INDIRECT. + 2015-12-04 Eric Botcazou * c-tree.h (c_build_va_arg): Adjust prototype. diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 9ad821925a0..2da84f26463 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -6417,6 +6417,13 @@ grokdeclarator (const struct c_declarator *declarator, { /* Transfer const-ness of array into that of type pointed to. */ type = TREE_TYPE (type); + if (orig_qual_type != NULL_TREE) + { + if (orig_qual_indirect == 0) + orig_qual_type = TREE_TYPE (orig_qual_type); + else + orig_qual_indirect--; + } if (type_quals) type = c_build_qualified_type (type, type_quals, orig_qual_type, orig_qual_indirect); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a9abef30306..baff32f2c7f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-12-07 Marek Polacek + + PR c/68668 + * gcc.dg/pr68668.c: New test. + 2015-12-07 Vladimir Makarov * gcc.target/i386/pr68349.c (strlen): Rename to my_strlen. diff --git a/gcc/testsuite/gcc.dg/pr68668.c b/gcc/testsuite/gcc.dg/pr68668.c new file mode 100644 index 00000000000..d013aa92cef --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr68668.c @@ -0,0 +1,53 @@ +/* PR c/68668 */ +/* { dg-do compile } */ + +typedef const int T[]; +typedef const int U[1]; + +int +fn1 (T p) +{ + return p[0]; +} + +int +fn2 (U p[2]) +{ + return p[0][0]; +} + +int +fn3 (U p[2][3]) +{ + return p[0][0][0]; +} + +int +fn4 (U *p) +{ + return p[0][0]; +} + +int +fn5 (U (*p)[1]) +{ + return (*p)[0][0]; +} + +int +fn6 (U (*p)[1][2]) +{ + return (*p)[0][0][0]; +} + +int +fn7 (U **p) +{ + return p[0][0][0]; +} + +int +fn8 (U (**p)[1]) +{ + return (*p)[0][0][0]; +}