From: Sebastian Huber Date: Fri, 27 Jun 2014 06:52:18 +0000 (+0000) Subject: c-parser.c (c_parser_declaration_or_fndef): Discard all type qualifiers in __auto_typ... X-Git-Tag: releases/gcc-5.1.0~6620 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9698b078c86c21aa6a2a2fb4e5bc198f6f1df24c;p=thirdparty%2Fgcc.git c-parser.c (c_parser_declaration_or_fndef): Discard all type qualifiers in __auto_type for atomic types. * 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 --- diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index d1837c266343..fa7caacc422a 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,10 @@ +2014-06-27 Sebastian Huber + + * 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 PR c/61162 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 5842320c540f..797d1bc526c0 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -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 , 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 - ones.) */ + /* For use in macros such as those in , remove all + qualifiers from atomic types. (const can be an issue for more macros + using typeof than just the 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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 17f05c7a48ba..a15e7c626efc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2014-06-27 Sebastian Huber + + * gcc.dg/typeof-2.c: New testcase. + 2014-06-27 Marek Polacek * 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 index 000000000000..e9169003a9b8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/typeof-2.c @@ -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; +}