Module Name:    src
Committed By:   rillig
Date:           Sat Jan 14 10:17:31 UTC 2023

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

Log Message:
lint: split struct_or_union_member into two halves

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.490 -r1.491 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.490 src/usr.bin/xlint/lint1/tree.c:1.491
--- src/usr.bin/xlint/lint1/tree.c:1.490	Fri Jan 13 19:41:50 2023
+++ src/usr.bin/xlint/lint1/tree.c	Sat Jan 14 10:17:31 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.490 2023/01/13 19:41:50 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.491 2023/01/14 10:17:31 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.490 2023/01/13 19:41:50 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.491 2023/01/14 10:17:31 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -556,6 +556,50 @@ build_string(strg_t *strg)
 }
 
 /*
+ * Return whether all struct/union members with the same name have the same
+ * type and offset.
+ */
+static bool
+all_members_compatible(const sym_t *msym)
+{
+	for (const sym_t *csym = msym;
+	     csym != NULL; csym = csym->s_symtab_next) {
+		if (csym->s_scl != MOS && csym->s_scl != MOU)
+			continue;
+		if (strcmp(msym->s_name, csym->s_name) != 0)
+			continue;
+
+		for (const sym_t *sym = csym->s_symtab_next;
+		     sym != NULL; sym = sym->s_symtab_next) {
+
+			if (sym->s_scl != MOS && sym->s_scl != MOU)
+				continue;
+			if (strcmp(csym->s_name, sym->s_name) != 0)
+				continue;
+			if (csym->u.s_member.sm_offset_in_bits !=
+			    sym->u.s_member.sm_offset_in_bits)
+				return false;
+
+			bool w = false;
+			if (!types_compatible(csym->s_type, sym->s_type,
+			    false, false, &w) && !w)
+				return false;
+			if (csym->s_bitfield != sym->s_bitfield)
+				return false;
+			if (csym->s_bitfield) {
+				type_t *tp1 = csym->s_type;
+				type_t *tp2 = sym->s_type;
+				if (tp1->t_flen != tp2->t_flen)
+					return false;
+				if (tp1->t_foffs != tp2->t_foffs)
+					return false;
+			}
+		}
+	}
+	return true;
+}
+
+/*
  * Returns a symbol which has the same name as the msym argument and is a
  * member of the struct or union specified by the tn argument.
  */
@@ -564,8 +608,6 @@ struct_or_union_member(tnode_t *tn, op_t
 {
 	struct_or_union	*str;
 	type_t	*tp;
-	sym_t	*sym, *csym;
-	bool	eq;
 	tspec_t	t;
 
 	/*
@@ -607,7 +649,8 @@ struct_or_union_member(tnode_t *tn, op_t
 	 * If this struct/union has a member with the name of msym, return it.
 	 */
 	if (str != NULL) {
-		for (sym = msym; sym != NULL; sym = sym->s_symtab_next) {
+		for (sym_t *sym = msym;
+		     sym != NULL; sym = sym->s_symtab_next) {
 			if (!is_member(sym))
 				continue;
 			if (sym->u.s_member.sm_sou_type != str)
@@ -618,56 +661,7 @@ struct_or_union_member(tnode_t *tn, op_t
 		}
 	}
 
-	/*
-	 * Set eq to false if there are struct/union members with the same
-	 * name and different types and/or offsets.
-	 */
-	eq = true;
-	for (csym = msym; csym != NULL; csym = csym->s_symtab_next) {
-		if (csym->s_scl != MOS && csym->s_scl != MOU)
-			continue;
-		if (strcmp(msym->s_name, csym->s_name) != 0)
-			continue;
-		for (sym = csym->s_symtab_next; sym != NULL;
-		    sym = sym->s_symtab_next) {
-			bool w;
-
-			if (sym->s_scl != MOS && sym->s_scl != MOU)
-				continue;
-			if (strcmp(csym->s_name, sym->s_name) != 0)
-				continue;
-			if (csym->u.s_member.sm_offset_in_bits !=
-			    sym->u.s_member.sm_offset_in_bits) {
-				eq = false;
-				break;
-			}
-			w = false;
-			eq = types_compatible(csym->s_type, sym->s_type,
-			    false, false, &w) && !w;
-			if (!eq)
-				break;
-			if (csym->s_bitfield != sym->s_bitfield) {
-				eq = false;
-				break;
-			}
-			if (csym->s_bitfield) {
-				type_t	*tp1, *tp2;
-
-				tp1 = csym->s_type;
-				tp2 = sym->s_type;
-				if (tp1->t_flen != tp2->t_flen) {
-					eq = false;
-					break;
-				}
-				if (tp1->t_foffs != tp2->t_foffs) {
-					eq = false;
-					break;
-				}
-			}
-		}
-		if (!eq)
-			break;
-	}
+	bool eq = all_members_compatible(msym);
 
 	/*
 	 * Now handle the case in which the left operand refers really

Reply via email to