PR c/68668
authormpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Dec 2015 17:52:23 +0000 (17:52 +0000)
committermpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Dec 2015 17:52:23 +0000 (17:52 +0000)
* 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

gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr68668.c [new file with mode: 0644]

index 468ef93..0b3351c 100644 (file)
@@ -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.
index 9ad8219..2da84f2 100644 (file)
@@ -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);
index a9abef3..baff32f 100644 (file)
@@ -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 (file)
index 0000000..d013aa9
--- /dev/null
@@ -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];
+}