Module Name:    src
Committed By:   rillig
Date:           Fri Apr  9 19:52:59 UTC 2021

Modified Files:
        src/usr.bin/xlint/lint1: tree.c

Log Message:
lint: clean up the check for pointer conversions

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.272 -r1.273 src/usr.bin/xlint/lint1/tree.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.272 src/usr.bin/xlint/lint1/tree.c:1.273
--- src/usr.bin/xlint/lint1/tree.c:1.272	Thu Apr  8 19:20:54 2021
+++ src/usr.bin/xlint/lint1/tree.c	Fri Apr  9 19:52:59 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.272 2021/04/08 19:20:54 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.273 2021/04/09 19:52:59 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.272 2021/04/08 19:20:54 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.273 2021/04/09 19:52:59 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -74,7 +74,7 @@ static	void	check_integer_conversion(op_
 					 tnode_t *);
 static	void	check_pointer_integer_conversion(op_t, tspec_t, type_t *,
 						 tnode_t *);
-static	void	check_pointer_conversion(op_t, tnode_t *, type_t *);
+static	void	check_pointer_conversion(tnode_t *, type_t *);
 static	tnode_t	*build_struct_access(op_t, tnode_t *, tnode_t *);
 static	tnode_t	*build_prepost_incdec(op_t, tnode_t *);
 static	tnode_t	*build_real_imag(op_t, tnode_t *);
@@ -1849,8 +1849,8 @@ convert(op_t op, int arg, type_t *tp, tn
 		/* a null pointer may be assigned to any pointer. */
 	} else if (is_integer(nt) && nt != BOOL && ot == PTR) {
 		check_pointer_integer_conversion(op, nt, tp, tn);
-	} else if (nt == PTR && ot == PTR) {
-		check_pointer_conversion(op, tn, tp);
+	} else if (nt == PTR && ot == PTR && op == CVT) {
+		check_pointer_conversion(tn, tp);
 	}
 
 	ntn = expr_zalloc_tnode();
@@ -2023,8 +2023,8 @@ check_pointer_integer_conversion(op_t op
 }
 
 static bool
-should_warn_about_pointer_cast(const type_t *ntp, tspec_t nst,
-			       const tnode_t *otn, tspec_t ost)
+should_warn_about_pointer_cast(const type_t *nstp, tspec_t nst,
+			       const type_t *ostp, tspec_t ost)
 {
 	/*
 	 * Casting a pointer to 'struct S' to a pointer to another struct that
@@ -2032,14 +2032,12 @@ should_warn_about_pointer_cast(const typ
 	 * counter'.
 	 */
 	if (nst == STRUCT && ost == STRUCT &&
-	    ntp->t_subt->t_str->sou_first_member != NULL &&
-	    ntp->t_subt->t_str->sou_first_member->s_type ==
-	    otn->tn_type->t_subt)
+	    nstp->t_str->sou_first_member != NULL &&
+	    nstp->t_str->sou_first_member->s_type == ostp)
 		return false;
 
-	if (nst == STRUCT || nst == UNION)
-		if (ntp->t_subt->t_str != otn->tn_type->t_subt->t_str)
-			return true;
+	if ((nst == STRUCT || nst == UNION) && nstp->t_str != ostp->t_str)
+		return true;
 
 	if (nst == CHAR || nst == UCHAR)
 		return false;	/* for the sake of traditional C code */
@@ -2051,20 +2049,17 @@ should_warn_about_pointer_cast(const typ
  * Warn about questionable pointer conversions.
  */
 static void
-check_pointer_conversion(op_t op, tnode_t *tn, type_t *tp)
+check_pointer_conversion(tnode_t *tn, type_t *ntp)
 {
+	const type_t *nstp, *otp, *ostp;
 	tspec_t nst, ost;
 	const char *nts, *ots;
 
-	/*
-	 * We got already an error (pointers of different types
-	 * without a cast) or we will not get a warning.
-	 */
-	if (op != CVT)
-		return;
-
-	nst = tp->t_subt->t_tspec;
-	ost = tn->tn_type->t_subt->t_tspec;
+	nstp = ntp->t_subt;
+	otp = tn->tn_type;
+	ostp = otp->t_subt;
+	nst = nstp->t_tspec;
+	ost = ostp->t_tspec;
 
 	if (nst == VOID || ost == VOID) {
 		if (sflag && (nst == FUNC || ost == FUNC)) {
@@ -2079,19 +2074,18 @@ check_pointer_conversion(op_t op, tnode_
 		return;
 	} else if (nst == FUNC || ost == FUNC) {
 		/* converting '%s' to '%s' is questionable */
-		warning(229, type_name(tn->tn_type), type_name(tp));
+		warning(229, type_name(otp), type_name(ntp));
 		return;
 	}
 
-	if (hflag && alignment_in_bits(tp->t_subt) >
-		     alignment_in_bits(tn->tn_type->t_subt)) {
+	if (hflag && alignment_in_bits(nstp) > alignment_in_bits(ostp)) {
 		/* converting '%s' to '%s' may cause alignment problem */
-		warning(135, type_name(tn->tn_type), type_name(tp));
+		warning(135, type_name(otp), type_name(ntp));
 	}
 
-	if (cflag && should_warn_about_pointer_cast(tp, nst, tn, ost)) {
+	if (cflag && should_warn_about_pointer_cast(nstp, nst, ostp, ost)) {
 		/* pointer cast from '%s' to '%s' may be troublesome */
-		warning(247, type_name(tn->tn_type), type_name(tp));
+		warning(247, type_name(otp), type_name(ntp));
 	}
 }
 

Reply via email to