Module Name:    src
Committed By:   rillig
Date:           Thu Jan 11 23:06:19 UTC 2024

Modified Files:
        src/usr.bin/xlint/lint1: cgram.y externs1.h tree.c

Log Message:
lint: correctly set system-header flag on cast-expression

When a cast-expression comes partly from a system header, determine at
the ')' whether the whole cast-expression comes from the system header.
Previously, it was based on the operand, which contradicted the
documentation of tn_sys.

Mainly affects strict bool mode (where expressions from system headers
are handled more leniently), as well as query 9 for parenthesized return
expressions.

Discovered upon manual inspection, as calling expr_alloc_tnode should
never be necessary when creating an expression node with operands;
there's build_op for that purpose.


To generate a diff of this commit:
cvs rdiff -u -r1.478 -r1.479 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.210 -r1.211 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.593 -r1.594 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/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.478 src/usr.bin/xlint/lint1/cgram.y:1.479
--- src/usr.bin/xlint/lint1/cgram.y:1.478	Tue Jan  9 23:46:54 2024
+++ src/usr.bin/xlint/lint1/cgram.y	Thu Jan 11 23:06:19 2024
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: cgram.y,v 1.478 2024/01/09 23:46:54 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.479 2024/01/11 23:06:19 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: cgram.y,v 1.478 2024/01/09 23:46:54 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.479 2024/01/11 23:06:19 rillig Exp $");
 #endif
 
 #include <limits.h>
@@ -724,8 +724,8 @@ unary_expression:
 /* K&R 7.2, C90 ???, C99 6.5.4, C11 6.5.4 */
 cast_expression:
 	unary_expression
-|	T_LPAREN type_name T_RPAREN cast_expression {
-		$$ = cast($4, $2);
+|	T_LPAREN type_name T_RPAREN sys cast_expression {
+		$$ = cast($5, $4, $2);
 	}
 ;
 

Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.210 src/usr.bin/xlint/lint1/externs1.h:1.211
--- src/usr.bin/xlint/lint1/externs1.h:1.210	Tue Jan  9 23:46:54 2024
+++ src/usr.bin/xlint/lint1/externs1.h	Thu Jan 11 23:06:19 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: externs1.h,v 1.210 2024/01/09 23:46:54 rillig Exp $	*/
+/*	$NetBSD: externs1.h,v 1.211 2024/01/11 23:06:19 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -291,7 +291,7 @@ void convert_constant(op_t, int, const t
 tnode_t *build_sizeof(const type_t *);
 tnode_t *build_offsetof(const type_t *, designation);
 tnode_t *build_alignof(const type_t *);
-tnode_t *cast(tnode_t *, type_t *);
+tnode_t *cast(tnode_t *, bool, type_t *);
 tnode_t *build_function_argument(tnode_t *, tnode_t *);
 tnode_t *build_function_call(tnode_t *, bool, tnode_t *);
 val_t *integer_constant(tnode_t *, bool);

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.593 src/usr.bin/xlint/lint1/tree.c:1.594
--- src/usr.bin/xlint/lint1/tree.c:1.593	Thu Jan 11 20:25:04 2024
+++ src/usr.bin/xlint/lint1/tree.c	Thu Jan 11 23:06:19 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.593 2024/01/11 20:25:04 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.594 2024/01/11 23:06:19 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: tree.c,v 1.593 2024/01/11 20:25:04 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.594 2024/01/11 23:06:19 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -4017,7 +4017,7 @@ build_alignof(const type_t *tp)
 }
 
 static tnode_t *
-cast_to_union(tnode_t *otn, type_t *ntp)
+cast_to_union(tnode_t *otn, bool sys, type_t *ntp)
 {
 
 	if (!allow_gcc) {
@@ -4030,12 +4030,8 @@ cast_to_union(tnode_t *otn, type_t *ntp)
 	    m != NULL; m = m->s_next) {
 		if (types_compatible(m->s_type, otn->tn_type,
 		    false, false, NULL)) {
-			tnode_t *ntn = expr_alloc_tnode();
-			ntn->tn_op = CVT;
-			ntn->tn_type = ntp;
+			tnode_t *ntn = build_op(CVT, sys, ntp, otn, NULL);
 			ntn->tn_cast = true;
-			ntn->tn_left = otn;
-			ntn->tn_right = NULL;
 			return ntn;
 		}
 	}
@@ -4046,7 +4042,7 @@ cast_to_union(tnode_t *otn, type_t *ntp)
 }
 
 tnode_t *
-cast(tnode_t *tn, type_t *tp)
+cast(tnode_t *tn, bool sys, type_t *tp)
 {
 
 	if (tn == NULL)
@@ -4065,7 +4061,7 @@ cast(tnode_t *tn, type_t *tp)
 		 * scalar type to a scalar type.
 		 */
 	} else if (nt == UNION)
-		return cast_to_union(tn, tp);
+		return cast_to_union(tn, sys, tp);
 	else if (nt == STRUCT || nt == ARRAY || nt == FUNC) {
 		/* Casting to a struct is an undocumented GCC extension. */
 		if (!(allow_gcc && nt == STRUCT))
@@ -4099,6 +4095,7 @@ cast(tnode_t *tn, type_t *tp)
 
 	tn = convert(CVT, 0, tp, tn);
 	tn->tn_cast = true;
+	tn->tn_sys = sys;
 
 	return tn;
 

Reply via email to