]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c/44322 (Bogus warning when assigning pointer-to-array with both "const" and...
authorJoseph Myers <joseph@codesourcery.com>
Sat, 5 Jun 2010 12:54:41 +0000 (13:54 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Sat, 5 Jun 2010 12:54:41 +0000 (13:54 +0100)
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.

From-SVN: r160312

gcc/ChangeLog
gcc/c-tree.h
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/c99-restrict-4.c [new file with mode: 0644]

index e492b28845ed5995f35e8948e75f0607ca61bf3d..8dc548d48127c450136c41a36cda0746946b18b5 100644 (file)
@@ -1,3 +1,11 @@
+2010-06-05  Joseph Myers  <joseph@codesourcery.com>
+
+       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  <segher@kernel.crashing.org>
 
        genautomata.c (get_excl_set): Do work per element, not per char.
index 30b5274841ad2bf0b48083145e52d5bb65845266..1921e1932f710f0271d14d60d3728730ca7e8be8 100644 (file)
@@ -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;
index 39965d527b05e894f6db1c0e5ad50630064a67fc..5a291de497f865f64533c75f73cae2ebbda1cc94 100644 (file)
@@ -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;
index accf2e37deeab9d2396d5848f0d7017a339d2e15..041f762256b22968c4a88401eb9d09d7c06dcfe2 100644 (file)
@@ -1,3 +1,8 @@
+2010-06-05  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/44322
+       * gcc.dg/c99-restrict-4.c: New test.
+
 2010-06-04  Magnus Fromreide  <magfr@lysator.liu.se>
 
        * 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 (file)
index 0000000..5852d0a
--- /dev/null
@@ -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;
+}