Module Name:    src
Committed By:   rillig
Date:           Sat Jul 15 15:51:22 UTC 2023

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

Log Message:
lint: clean up duplicate code for finding struct/union members


To generate a diff of this commit:
cvs rdiff -u -r1.197 -r1.198 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.247 -r1.248 src/usr.bin/xlint/lint1/init.c
cvs rdiff -u -r1.572 -r1.573 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/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.197 src/usr.bin/xlint/lint1/externs1.h:1.198
--- src/usr.bin/xlint/lint1/externs1.h:1.197	Sat Jul 15 13:51:36 2023
+++ src/usr.bin/xlint/lint1/externs1.h	Sat Jul 15 15:51:22 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: externs1.h,v 1.197 2023/07/15 13:51:36 rillig Exp $	*/
+/*	$NetBSD: externs1.h,v 1.198 2023/07/15 15:51:22 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -294,7 +294,7 @@ void	check_expr_misc(const tnode_t *, bo
 bool	constant_addr(const tnode_t *, const sym_t **, ptrdiff_t *);
 strg_t	*cat_strings(strg_t *, strg_t *);
 unsigned int type_size_in_bits(const type_t *);
-sym_t	*find_member(const type_t *, const char *);
+sym_t	*find_member(const struct_or_union *, const char *);
 
 void begin_statement_expr(void);
 void do_statement_expr(tnode_t *);

Index: src/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.247 src/usr.bin/xlint/lint1/init.c:1.248
--- src/usr.bin/xlint/lint1/init.c:1.247	Sat Jul 15 13:35:24 2023
+++ src/usr.bin/xlint/lint1/init.c	Sat Jul 15 15:51:22 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: init.c,v 1.247 2023/07/15 13:35:24 rillig Exp $	*/
+/*	$NetBSD: init.c,v 1.248 2023/07/15 15:51:22 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: init.c,v 1.247 2023/07/15 13:35:24 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.248 2023/07/15 15:51:22 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -837,20 +837,17 @@ initialization_add_designator_member(ini
 	const type_t *tp = brace_level_sub_type(bl);
 	if (is_struct_or_union(tp->t_tspec))
 		goto proceed;
-	else if (tp->t_tspec == ARRAY) {
+	else if (tp->t_tspec == ARRAY)
 		/* syntax error '%s' */
 		error(249, "designator '.member' is only for struct/union");
-		in->in_err = true;
-		return;
-	} else {
+	else
 		/* syntax error '%s' */
 		error(249, "scalar type cannot use designator");
-		in->in_err = true;
-		return;
-	}
+	in->in_err = true;
+	return;
 
 proceed:;
-	const sym_t *member = find_member(tp, name);
+	const sym_t *member = find_member(tp->t_sou, name);
 	if (member == NULL) {
 		/* type '%s' does not have member '%s' */
 		error(101, type_name(tp), name);

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.572 src/usr.bin/xlint/lint1/tree.c:1.573
--- src/usr.bin/xlint/lint1/tree.c:1.572	Sat Jul 15 15:38:03 2023
+++ src/usr.bin/xlint/lint1/tree.c	Sat Jul 15 15:51:22 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.572 2023/07/15 15:38:03 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.573 2023/07/15 15:51:22 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.572 2023/07/15 15:38:03 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.573 2023/07/15 15:51:22 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -1871,20 +1871,22 @@ all_members_compatible(const sym_t *msym
 }
 
 sym_t *
-find_member(const type_t *tp, const char *name)
+find_member(const struct_or_union *sou, const char *name)
 {
-	for (sym_t *mem = tp->t_sou->sou_first_member;
+	for (sym_t *mem = sou->sou_first_member;
 	     mem != NULL; mem = mem->s_next) {
 		lint_assert(is_member(mem));
-		lint_assert(mem->u.s_member.sm_containing_type == tp->t_sou);
+		lint_assert(mem->u.s_member.sm_containing_type == sou);
 		if (strcmp(mem->s_name, name) == 0)
 			return mem;
 	}
-	for (sym_t *mem = tp->t_sou->sou_first_member;
+
+	for (sym_t *mem = sou->sou_first_member;
 	     mem != NULL; mem = mem->s_next) {
-		if (is_struct_or_union(mem->s_type->t_tspec) &&
-		    mem->s_name == unnamed) {
-			sym_t *nested_mem = find_member(mem->s_type, name);
+		if (is_struct_or_union(mem->s_type->t_tspec)
+		    && mem->s_name == unnamed) {
+			sym_t *nested_mem =
+			    find_member(mem->s_type->t_sou, name);
 			if (nested_mem != NULL)
 				return nested_mem;
 		}
@@ -1934,21 +1936,8 @@ struct_or_union_member(tnode_t *tn, op_t
 		tp = tn->tn_type->t_subt;
 	struct_or_union *sou = tp != NULL ? tp->t_sou : NULL;
 
-	/*
-	 * If this struct/union has a member with the name of msym, return it.
-	 */
 	if (sou != NULL) {
-		for (sym_t *sym = msym;
-		     sym != NULL; sym = sym->s_symtab_next) {
-			if (is_member(sym) &&
-			    sym->u.s_member.sm_containing_type == sou &&
-			    strcmp(sym->s_name, msym->s_name) == 0)
-				return sym;
-		}
-	}
-
-	if (tp != NULL) {
-		sym_t *nested_mem = find_member(tp, msym->s_name);
+		sym_t *nested_mem = find_member(sou, msym->s_name);
 		if (nested_mem != NULL)
 			return nested_mem;
 	}

Reply via email to