Module Name:    src
Committed By:   rillig
Date:           Mon Jun 28 08:52:56 UTC 2021

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

Log Message:
lint: rename pqinf_t to qual_ptr and clean up code

The 'inf' from the type name meant 'information' and was redundant. Each
object of that type represents a single pointer level, which made the
documentation about 'pointers' a bit confusing.

The members of struct qual_ptr are now in the canonical reading order,
which is 'const volatile pointer'.

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.242 -r1.243 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.189 -r1.190 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.112 -r1.113 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.107 -r1.108 src/usr.bin/xlint/lint1/lint1.h

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.242 src/usr.bin/xlint/lint1/cgram.y:1.243
--- src/usr.bin/xlint/lint1/cgram.y:1.242	Mon Jun 28 07:55:05 2021
+++ src/usr.bin/xlint/lint1/cgram.y	Mon Jun 28 08:52:55 2021
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: cgram.y,v 1.242 2021/06/28 07:55:05 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.243 2021/06/28 08:52:55 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: cgram.y,v 1.242 2021/06/28 07:55:05 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.243 2021/06/28 08:52:55 rillig Exp $");
 #endif
 
 #include <limits.h>
@@ -137,7 +137,7 @@ anonymize(sym_t *s)
 	tnode_t	*y_tnode;
 	range_t	y_range;
 	strg_t	*y_string;
-	pqinf_t	*y_pqinf;
+	qual_ptr *y_qual_ptr;
 	bool	y_seen_statement;
 	struct generic_association_types *y_types;
 };
@@ -306,16 +306,16 @@ anonymize(sym_t *s)
 %type	<y_sym>		enumeration_constant
 %type	<y_sym>		notype_direct_decl
 %type	<y_sym>		type_direct_decl
-%type	<y_pqinf>	pointer
-%type	<y_pqinf>	asterisk
+%type	<y_qual_ptr>	pointer
+%type	<y_qual_ptr>	asterisk
 %type	<y_sym>		param_decl
 %type	<y_sym>		param_list
 %type	<y_sym>		abstract_decl_param_list
 %type	<y_sym>		direct_param_decl
 %type	<y_sym>		notype_param_decl
 %type	<y_sym>		direct_notype_param_decl
-%type	<y_pqinf>	type_qualifier_list
-%type	<y_pqinf>	type_qualifier
+%type	<y_qual_ptr>	type_qualifier_list
+%type	<y_qual_ptr>	type_qualifier
 %type	<y_sym>		identifier_list
 %type	<y_sym>		abstract_decl
 %type	<y_sym>		direct_abstract_decl
@@ -1203,16 +1203,14 @@ direct_notype_param_decl:
 pointer:
 	  asterisk
 	| asterisk type_qualifier_list {
-		/* TODO: rename pqinf_t to be more expressive */
-		/* TODO: then rename the merge function */
-		$$ = merge_pointers_and_qualifiers($1, $2);
+		$$ = merge_qualified_pointer($1, $2);
 	  }
 	| asterisk pointer {
-		$$ = merge_pointers_and_qualifiers($1, $2);
+		$$ = merge_qualified_pointer($1, $2);
 	  }
 	| asterisk type_qualifier_list pointer {
-		$$ = merge_pointers_and_qualifiers($1, $2);
-		$$ = merge_pointers_and_qualifiers($$, $3);
+		$$ = merge_qualified_pointer($1, $2);
+		$$ = merge_qualified_pointer($$, $3);
 	  }
 	;
 
@@ -1227,7 +1225,7 @@ asterisk:
 type_qualifier_list:
 	  type_qualifier
 	| type_qualifier_list type_qualifier {
-		$$ = merge_pointers_and_qualifiers($1, $2);
+		$$ = merge_qualified_pointer($1, $2);
 	  }
 	;
 

Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.189 src/usr.bin/xlint/lint1/decl.c:1.190
--- src/usr.bin/xlint/lint1/decl.c:1.189	Sun Jun 27 08:20:50 2021
+++ src/usr.bin/xlint/lint1/decl.c	Mon Jun 28 08:52:55 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.189 2021/06/27 08:20:50 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.190 2021/06/28 08:52:55 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: decl.c,v 1.189 2021/06/27 08:20:50 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.190 2021/06/28 08:52:55 rillig Exp $");
 #endif
 
 #include <sys/param.h>
@@ -1286,40 +1286,41 @@ bitfield(sym_t *dsym, int len)
 }
 
 /*
- * Collect information about a sequence of asterisks and qualifiers in a
- * list of type pqinf_t.
- * Qualifiers always refer to the left asterisk.
- * The rightmost asterisk will be at the top of the list.
+ * A sequence of asterisks and qualifiers, from right to left.  For example,
+ * 'const ***volatile **const volatile' results in [cvp, p, vp, p, p].  The
+ * leftmost 'const' is not included in this list, it is stored in dcs->d_const
+ * instead.
  */
-pqinf_t *
-merge_pointers_and_qualifiers(pqinf_t *p1, pqinf_t *p2)
+qual_ptr *
+merge_qualified_pointer(qual_ptr *p1, qual_ptr *p2)
 {
-	pqinf_t	*p;
+	qual_ptr *tail;
 
 	if (p2->p_pointer) {
-		/* left '*' at the end of the list */
-		for (p = p2; p->p_next != NULL; p = p->p_next)
+		/* append p1 to p2, keeping p2 */
+		for (tail = p2; tail->p_next != NULL; tail = tail->p_next)
 			continue;
-		p->p_next = p1;
+		tail->p_next = p1;
 		return p2;
-	} else {
-		if (p2->p_const) {
-			if (p1->p_const) {
-				/* duplicate '%s' */
-				warning(10, "const");
-			}
-			p1->p_const = true;
-		}
-		if (p2->p_volatile) {
-			if (p1->p_volatile) {
-				/* duplicate '%s' */
-				warning(10, "volatile");
-			}
-			p1->p_volatile = true;
+	}
+
+	/* merge p2 into p1, keeping p1 */
+	if (p2->p_const) {
+		if (p1->p_const) {
+			/* duplicate '%s' */
+			warning(10, "const");
 		}
-		free(p2);
-		return p1;
+		p1->p_const = true;
 	}
+	if (p2->p_volatile) {
+		if (p1->p_volatile) {
+			/* duplicate '%s' */
+			warning(10, "volatile");
+		}
+		p1->p_volatile = true;
+	}
+	free(p2);
+	return p1;
 }
 
 /*
@@ -1331,10 +1332,10 @@ merge_pointers_and_qualifiers(pqinf_t *p
  * declarator. The new type extension is inserted between both.
  */
 sym_t *
-add_pointer(sym_t *decl, pqinf_t *pi)
+add_pointer(sym_t *decl, qual_ptr *p)
 {
-	type_t	**tpp, *tp;
-	pqinf_t	*npi;
+	type_t **tpp, *tp;
+	qual_ptr *next;
 
 	tpp = &decl->s_type;
 	while (*tpp != NULL && *tpp != dcs->d_type)
@@ -1342,15 +1343,15 @@ add_pointer(sym_t *decl, pqinf_t *pi)
 	if (*tpp == NULL)
 		return decl;
 
-	while (pi != NULL) {
+	while (p != NULL) {
 		*tpp = tp = getblk(sizeof(*tp));
 		tp->t_tspec = PTR;
-		tp->t_const = pi->p_const;
-		tp->t_volatile = pi->p_volatile;
+		tp->t_const = p->p_const;
+		tp->t_volatile = p->p_volatile;
 		*(tpp = &tp->t_subt) = dcs->d_type;
-		npi = pi->p_next;
-		free(pi);
-		pi = npi;
+		next = p->p_next;
+		free(p);
+		p = next;
 	}
 	return decl;
 }

Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.112 src/usr.bin/xlint/lint1/externs1.h:1.113
--- src/usr.bin/xlint/lint1/externs1.h:1.112	Sun Jun 27 20:47:13 2021
+++ src/usr.bin/xlint/lint1/externs1.h	Mon Jun 28 08:52:55 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: externs1.h,v 1.112 2021/06/27 20:47:13 rillig Exp $	*/
+/*	$NetBSD: externs1.h,v 1.113 2021/06/28 08:52:55 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -163,8 +163,8 @@ extern	sym_t	*lnklst(sym_t *, sym_t *);
 extern	void	check_type(sym_t *);
 extern	sym_t	*declarator_1_struct_union(sym_t *);
 extern	sym_t	*bitfield(sym_t *, int);
-extern	pqinf_t	*merge_pointers_and_qualifiers(pqinf_t *, pqinf_t *);
-extern	sym_t	*add_pointer(sym_t *, pqinf_t *);
+extern	qual_ptr *merge_qualified_pointer(qual_ptr *, qual_ptr *);
+extern	sym_t	*add_pointer(sym_t *, qual_ptr *);
 extern	sym_t	*add_array(sym_t *, bool, int);
 extern	sym_t	*add_function(sym_t *, sym_t *);
 extern	void	check_function_definition(sym_t *, bool);

Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.107 src/usr.bin/xlint/lint1/lint1.h:1.108
--- src/usr.bin/xlint/lint1/lint1.h:1.107	Sun Jun 27 20:47:13 2021
+++ src/usr.bin/xlint/lint1/lint1.h	Mon Jun 28 08:52:55 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.107 2021/06/27 20:47:13 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.108 2021/06/28 08:52:55 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -374,16 +374,13 @@ typedef	struct dinfo {
 	struct	dinfo *d_next;	/* next level */
 } dinfo_t;
 
-/*
- * Used to collect information about pointers and qualifiers in
- * declarators.
- */
-typedef	struct pqinf {
-	bool	p_pointer: 1;
+/* One level of pointer indirection in declarators, including qualifiers. */
+typedef	struct qual_ptr {
 	bool	p_const: 1;
 	bool	p_volatile: 1;
-	struct	pqinf *p_next;
-} pqinf_t;
+	bool	p_pointer: 1;
+	struct	qual_ptr *p_next;
+} qual_ptr;
 
 /*
  * The values of the 'case' labels, linked via cl_next in reverse order of

Reply via email to