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
This commit is contained in:
Zack Weinberg 2000-01-12 17:35:41 +00:00 committed by Zack Weinberg
parent f668c81cda
commit cd6311ef6e
2 changed files with 18 additions and 7 deletions

View 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.

View 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");