From cd6311ef6edcaf65e88a0427f3368a7e8224b1df Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Wed, 12 Jan 2000 17:35:41 +0000 Subject: [PATCH] c-typeck.c (build_c_cast): Issue -Wcast-qual warnings if the qualifiers don't match at any level of... * 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 | 3 +++ gcc/c-typeck.c | 22 +++++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ac8d0b4..4ce5ffe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 * i386/sysv5.h (CPP_SPEC, LIBSPEC): Add -pthreadT. diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 0529d2a..e0e4df4 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -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"); -- 2.7.4