diff options
author | Marek Polacek <polacek@redhat.com> | 2015-12-07 17:52:23 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2015-12-07 17:52:23 +0000 |
commit | 66189108d3785a463d2d1d0341fa6198582d9fd2 (patch) | |
tree | 2f2cc1a708c2ce1bf995969f8634445e436baab6 | |
parent | 71e546870c4afb3c3ff993bd354a98637bcccdc7 (diff) | |
download | gcc-66189108d3785a463d2d1d0341fa6198582d9fd2.zip gcc-66189108d3785a463d2d1d0341fa6198582d9fd2.tar.gz gcc-66189108d3785a463d2d1d0341fa6198582d9fd2.tar.bz2 |
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
-rw-r--r-- | gcc/c/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c/c-decl.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr68668.c | 53 |
4 files changed, 71 insertions, 0 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 468ef93..0b3351c 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2015-12-07 Marek Polacek <polacek@redhat.com> + + 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 <ebotcazou@adacore.com> * c-tree.h (c_build_va_arg): Adjust prototype. diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 9ad8219..2da84f2 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 a9abef3..baff32f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-12-07 Marek Polacek <polacek@redhat.com> + + PR c/68668 + * gcc.dg/pr68668.c: New test. + 2015-12-07 Vladimir Makarov <vmakarov@redhat.com> * 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 0000000..d013aa9 --- /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]; +} |