]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c-parser.c (c_parser_declaration_or_fndef): Discard all type qualifiers in __auto_typ...
authorSebastian Huber <sebastian.huber@embedded-brains.de>
Fri, 27 Jun 2014 06:52:18 +0000 (06:52 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 27 Jun 2014 06:52:18 +0000 (06:52 +0000)
* c-parser.c (c_parser_declaration_or_fndef): Discard all type
qualifiers in __auto_type for atomic types.
(c_parser_typeof_specifier): Discard all type qualifiers in
__typeof__ for atomic types.

* gcc.dg/typeof-2.c: New testcase.

From-SVN: r212062

gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/typeof-2.c [new file with mode: 0644]

index d1837c26634332ec1900e93ad4cd770658ab1b33..fa7caacc422a4f0cf95b8aae4de458a846fcfeb7 100644 (file)
@@ -1,3 +1,10 @@
+2014-06-27  Sebastian Huber  <sebastian.huber@embedded-brains.de>
+
+       * c-parser.c (c_parser_declaration_or_fndef): Discard all type
+       qualifiers in __auto_type for atomic types.
+       (c_parser_typeof_specifier): Discard all type qualifiers in
+       __typeof__ for atomic types.
+
 2014-06-25  Marek Polacek  <polacek@redhat.com>
 
        PR c/61162
index 5842320c540fcdb9b022f5ad7708dd709705af22..797d1bc526c0f5f1b0221f0cf054a9c71012698c 100644 (file)
@@ -1720,14 +1720,10 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok,
                              " initializer");
                  init = convert_lvalue_to_rvalue (init_loc, init, true, true);
                  tree init_type = TREE_TYPE (init.value);
-                 /* As with typeof, remove _Atomic and const
-                    qualifiers from atomic types.  */
+                 /* As with typeof, remove all qualifiers from atomic types.  */
                  if (init_type != error_mark_node && TYPE_ATOMIC (init_type))
                    init_type
-                     = c_build_qualified_type (init_type,
-                                               (TYPE_QUALS (init_type)
-                                                & ~(TYPE_QUAL_ATOMIC
-                                                    | TYPE_QUAL_CONST)));
+                     = c_build_qualified_type (init_type, TYPE_UNQUALIFIED);
                  bool vm_type = variably_modified_type_p (init_type,
                                                           NULL_TREE);
                  if (vm_type)
@@ -3024,16 +3020,11 @@ c_parser_typeof_specifier (c_parser *parser)
       if (was_vm)
        ret.expr = c_fully_fold (expr.value, false, &ret.expr_const_operands);
       pop_maybe_used (was_vm);
-      /* For use in macros such as those in <stdatomic.h>, remove
-        _Atomic and const qualifiers from atomic types.  (Possibly
-        all qualifiers should be removed; const can be an issue for
-        more macros using typeof than just the <stdatomic.h>
-        ones.)  */
+      /* For use in macros such as those in <stdatomic.h>, remove all
+        qualifiers from atomic types.  (const can be an issue for more macros
+        using typeof than just the <stdatomic.h> ones.)  */
       if (ret.spec != error_mark_node && TYPE_ATOMIC (ret.spec))
-       ret.spec = c_build_qualified_type (ret.spec,
-                                          (TYPE_QUALS (ret.spec)
-                                           & ~(TYPE_QUAL_ATOMIC
-                                               | TYPE_QUAL_CONST)));
+       ret.spec = c_build_qualified_type (ret.spec, TYPE_UNQUALIFIED);
     }
   c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
   return ret;
index 17f05c7a48ba2d4f8cdc8df9f8d2bc215d36e066..a15e7c626efc23d727b81d708815bd7813950d74 100644 (file)
@@ -1,3 +1,7 @@
+2014-06-27  Sebastian Huber  <sebastian.huber@embedded-brains.de>
+
+       * gcc.dg/typeof-2.c: New testcase.
+
 2014-06-27  Marek Polacek  <polacek@redhat.com>
 
        * c-c++-common/ubsan/bounds-2.c: Adjust dg-output.
diff --git a/gcc/testsuite/gcc.dg/typeof-2.c b/gcc/testsuite/gcc.dg/typeof-2.c
new file mode 100644 (file)
index 0000000..e916900
--- /dev/null
@@ -0,0 +1,28 @@
+/* Test qualifier discard of typeof for atomic types. */
+/* { dg-do compile } */
+/* { dg-options "-std=c11" } */
+
+extern int i;
+
+extern int * p;
+
+extern int _Atomic const ci;
+extern __typeof (ci) i;
+
+extern int _Atomic volatile vi;
+extern __typeof (vi) i;
+
+extern int * _Atomic restrict ri;
+extern __typeof (ri) p;
+
+void f(void)
+{
+  __auto_type aci = ci;
+  int *paci = &aci;
+
+  __auto_type avi = vi;
+  int *pavi = &avi;
+
+  __auto_type ari = ri;
+  int **pari = &ari;
+}