c-typeck.c (build_c_cast): Issue -Wcast-qual warnings if the qualifiers don't match...
authorZack Weinberg <zack@wolery.cumb.org>
Wed, 12 Jan 2000 17:35:41 +0000 (17:35 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Wed, 12 Jan 2000 17:35:41 +0000 (17:35 +0000)
* c-typeck.c (build_c_cast): Issue -Wcast-qual warnings if the
qualifiers don't match at any level of pointerness.

From-SVN: r31356

gcc/ChangeLog
gcc/c-typeck.c

index ac8d0b47c502306b75b00a99aa292ccd8bf33633..4ce5ffebe6a5004f81de47dc299faf1c637363a1 100644 (file)
@@ -2,6 +2,9 @@
 
        * cccp.c: Accept and ignore -lang-fortran.
 
+       * c-typeck.c (build_c_cast): Issue -Wcast-qual warnings if the
+       qualifiers don't match at any level of pointerness.
+
 2000-01-12  Robert Lipe  <robertl@sco.com>
 
        * i386/sysv5.h (CPP_SPEC, LIBSPEC): Add -pthreadT.
index 0529d2a5b1845b60041a2dae0e497d450b1b0b3b..e0e4df4949ea6c853a4f1316430a3d7fa17e79d0 100644 (file)
@@ -3701,16 +3701,24 @@ build_c_cast (type, expr)
          && TREE_CODE (type) == POINTER_TYPE
          && TREE_CODE (otype) == POINTER_TYPE)
        {
-         /* Go to the innermost object being pointed to.  */
          tree in_type = type;
          tree in_otype = otype;
+         int warn = 0;
 
-         while (TREE_CODE (in_type) == POINTER_TYPE)
-           in_type = TREE_TYPE (in_type);
-         while (TREE_CODE (in_otype) == POINTER_TYPE)
-           in_otype = TREE_TYPE (in_otype);
-         
-         if (TYPE_QUALS (in_otype) & ~TYPE_QUALS (in_type))
+         /* Check that the qualifiers on IN_TYPE are a superset of
+            the qualifiers of IN_OTYPE.  The outermost level of
+            POINTER_TYPE nodes is uninteresting and we stop as soon
+            as we hit a non-POINTER_TYPE node on either type.  */
+         do
+           {
+             in_otype = TREE_TYPE (in_otype);
+             in_type = TREE_TYPE (in_type);
+             warn |= (TYPE_QUALS (in_otype) & ~TYPE_QUALS (in_type));
+           }
+         while (TREE_CODE (in_type) == POINTER_TYPE
+                && TREE_CODE (in_otype) == POINTER_TYPE);
+
+         if (warn)
            /* There are qualifiers present in IN_OTYPE that are not
               present in IN_TYPE.  */
            pedwarn ("cast discards qualifiers from pointer target type");