Hi!

On the following testcase, we have TYPE_READONLY integer type
before handling the mode attribute and transform it into
a signed char type (without TYPE_READONLY), which causes ICE in the FE,
because it isn't const anymore.

Fixed by making sure we have the same quals as before applying the mode
attribute.  Bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2017-02-21  Jakub Jelinek  <ja...@redhat.com>

        PR c++/79641
        * c-attribs.c (handle_mode_attribute): Use build_qualified_type to
        preserve quals.

        * c-c++-common/pr79641.c: New test.

--- gcc/c-family/c-attribs.c.jj 2017-01-01 12:45:46.000000000 +0100
+++ gcc/c-family/c-attribs.c    2017-02-21 12:38:10.105547005 +0100
@@ -1430,7 +1430,7 @@ handle_mode_attribute (tree *node, tree
          return NULL_TREE;
        }
 
-      *node = typefm;
+      *node = build_qualified_type (typefm, TYPE_QUALS (type));
     }
 
   return NULL_TREE;
--- gcc/testsuite/c-c++-common/pr79641.c.jj     2017-02-21 12:43:24.246466684 
+0100
+++ gcc/testsuite/c-c++-common/pr79641.c        2017-02-21 12:43:18.132546096 
+0100
@@ -0,0 +1,4 @@
+/* PR c++/79641 */
+/* { dg-do compile } */
+
+const int __attribute__((__mode__ (__QI__))) i = 0;

        Jakub

Reply via email to