From: jsm28 Date: Sat, 5 Jun 2010 12:54:41 +0000 (+0000) Subject: PR c/44322 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=51e2543339c12c813f716f8fc959337b2e6ebf10;p=thirdparty%2Fgcc.git PR c/44322 * c-typeck.c (build_unary_op): Merge qualifiers into pointer target type for ADDR_EXPR; require no changes to qualifiers except for function types. * c-tree.h (c_build_type_variant): Remove. testsuite: * gcc.dg/c99-restrict-4.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160312 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e492b28845ed..8dc548d48127 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-06-05 Joseph Myers + + PR c/44322 + * c-typeck.c (build_unary_op): Merge qualifiers into pointer + target type for ADDR_EXPR; require no changes to qualifiers except + for function types. + * c-tree.h (c_build_type_variant): Remove. + 2010-06-05 Segher Boessenkool genautomata.c (get_excl_set): Do work per element, not per char. diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 30b5274841ad..1921e1932f71 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -490,11 +490,6 @@ extern bool c_warn_unused_global_decl (const_tree); extern void c_initialize_diagnostics (diagnostic_context *); extern bool c_vla_unspec_p (tree x, tree fn); -#define c_build_type_variant(TYPE, CONST_P, VOLATILE_P) \ - c_build_qualified_type ((TYPE), \ - ((CONST_P) ? TYPE_QUAL_CONST : 0) | \ - ((VOLATILE_P) ? TYPE_QUAL_VOLATILE : 0)) - /* in c-typeck.c */ extern bool in_late_binary_op; extern int in_alignof; diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 39965d527b05..5a291de497f8 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -3744,14 +3744,24 @@ build_unary_op (location_t location, argtype = TREE_TYPE (arg); /* If the lvalue is const or volatile, merge that into the type - to which the address will point. Note that you can't get a - restricted pointer by taking the address of something, so we - only have to deal with `const' and `volatile' here. */ + to which the address will point. This should only be needed + for function types. */ if ((DECL_P (arg) || REFERENCE_CLASS_P (arg)) && (TREE_READONLY (arg) || TREE_THIS_VOLATILE (arg))) - argtype = c_build_type_variant (argtype, - TREE_READONLY (arg), - TREE_THIS_VOLATILE (arg)); + { + int orig_quals = TYPE_QUALS (strip_array_types (argtype)); + int quals = orig_quals; + + if (TREE_READONLY (arg)) + quals |= TYPE_QUAL_CONST; + if (TREE_THIS_VOLATILE (arg)) + quals |= TYPE_QUAL_VOLATILE; + + gcc_assert (quals == orig_quals + || TREE_CODE (argtype) == FUNCTION_TYPE); + + argtype = c_build_qualified_type (argtype, quals); + } if (!c_mark_addressable (arg)) return error_mark_node; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index accf2e37deea..041f762256b2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-06-05 Joseph Myers + + PR c/44322 + * gcc.dg/c99-restrict-4.c: New test. + 2010-06-04 Magnus Fromreide * g++.dg/cpp0x/nullptr01.C: Test nullptr_t variable. diff --git a/gcc/testsuite/gcc.dg/c99-restrict-4.c b/gcc/testsuite/gcc.dg/c99-restrict-4.c new file mode 100644 index 000000000000..5852d0a11277 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c99-restrict-4.c @@ -0,0 +1,17 @@ +/* Qualifiers lost when taking the address of a const restrict object. + PR 44322. */ +/* { dg-do compile } */ +/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */ +void * restrict const a[2]; +void * restrict const (*p2)[2]; + +void foo(void) { + p2 = &a; +} + +void * restrict volatile b[2]; +void * restrict volatile (*q2)[2]; + +void bar(void) { + q2 = &b; +}