Module Name: src
Committed By: rillig
Date: Fri Apr 2 17:01:39 UTC 2021
Modified Files:
src/usr.bin/xlint/lint1: tree.c
Log Message:
lint: clean up merge_qualifiers
No functional change.
To generate a diff of this commit:
cvs rdiff -u -r1.262 -r1.263 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.262 src/usr.bin/xlint/lint1/tree.c:1.263
--- src/usr.bin/xlint/lint1/tree.c:1.262 Fri Apr 2 16:38:08 2021
+++ src/usr.bin/xlint/lint1/tree.c Fri Apr 2 17:01:39 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.262 2021/04/02 16:38:08 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.263 2021/04/02 17:01:39 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.262 2021/04/02 16:38:08 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.263 2021/04/02 17:01:39 rillig Exp $");
#endif
#include <float.h>
@@ -67,7 +67,6 @@ static void warn_incompatible_types(op_t
const type_t *, tspec_t);
static void warn_incompatible_pointers(const mod_t *,
const type_t *, const type_t *);
-static void merge_qualifiers(type_t **, type_t *, type_t *);
static bool has_constant_member(const type_t *);
static void check_prototype_conversion(int, tspec_t, tspec_t, type_t *,
tnode_t *);
@@ -2608,31 +2607,30 @@ warn_incompatible_pointers(const mod_t *
}
}
-/*
- * Make sure type (*tpp)->t_subt has at least the qualifiers
- * of tp1->t_subt and tp2->t_subt.
- */
-static void
-merge_qualifiers(type_t **tpp, type_t *tp1, type_t *tp2)
+/* Return a type based on tp1, with added qualifiers from tp2. */
+static type_t *
+merge_qualifiers(type_t *tp1, const type_t *tp2)
{
+ type_t *ntp, *nstp;
- lint_assert((*tpp)->t_tspec == PTR);
lint_assert(tp1->t_tspec == PTR);
lint_assert(tp2->t_tspec == PTR);
- if ((*tpp)->t_subt->t_const ==
- (tp1->t_subt->t_const | tp2->t_subt->t_const) &&
- (*tpp)->t_subt->t_volatile ==
- (tp1->t_subt->t_volatile | tp2->t_subt->t_volatile)) {
- return;
- }
-
- *tpp = expr_dup_type(*tpp);
- (*tpp)->t_subt = expr_dup_type((*tpp)->t_subt);
- (*tpp)->t_subt->t_const =
- tp1->t_subt->t_const | tp2->t_subt->t_const;
- (*tpp)->t_subt->t_volatile =
- tp1->t_subt->t_volatile | tp2->t_subt->t_volatile;
+ bool c1 = tp1->t_subt->t_const;
+ bool c2 = tp2->t_subt->t_const;
+ bool v1 = tp1->t_subt->t_volatile;
+ bool v2 = tp2->t_subt->t_volatile;
+
+ if (c1 == (c1 | c2) && v2 == (v1 | v2))
+ return tp1;
+
+ nstp = expr_dup_type(tp1->t_subt);
+ nstp->t_const = c1 | c2;
+ nstp->t_volatile = v1 | v2;
+
+ ntp = expr_dup_type(tp1);
+ ntp->t_subt = nstp;
+ return ntp;
}
/*
@@ -2894,24 +2892,17 @@ build_colon(tnode_t *ln, tnode_t *rn)
}
tp = rn->tn_type;
} else if (lt == PTR && ln->tn_type->t_subt->t_tspec == VOID) {
- lint_assert(rt == PTR);
- tp = rn->tn_type;
- merge_qualifiers(&tp, ln->tn_type, rn->tn_type);
+ tp = merge_qualifiers(rn->tn_type, ln->tn_type);
} else if (rt == PTR && rn->tn_type->t_subt->t_tspec == VOID) {
- lint_assert(lt == PTR);
- tp = ln->tn_type;
- merge_qualifiers(&tp, ln->tn_type, rn->tn_type);
+ tp = merge_qualifiers(ln->tn_type, rn->tn_type);
} else {
- lint_assert(lt == PTR);
- lint_assert(rt == PTR);
/*
* XXX For now we simply take the left type. This is
* probably wrong, if one type contains a function prototype
* and the other one, at the same place, only an old style
* declaration.
*/
- tp = ln->tn_type;
- merge_qualifiers(&tp, ln->tn_type, rn->tn_type);
+ tp = merge_qualifiers(ln->tn_type, rn->tn_type);
}
ntn = new_tnode(COLON, tp, ln, rn);