From: mpolacek Date: Mon, 7 Dec 2015 17:52:23 +0000 (+0000) Subject: PR c/68668 X-Git-Tag: upstream/6.1~2433 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1b0629457a0a67a95e206266e5705c1b6f902dbe;p=platform%2Fupstream%2Flinaro-gcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@231374 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 + + 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 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 + + 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 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]; +}