Module Name:    src
Committed By:   rillig
Date:           Sat Jun 24 20:50:54 UTC 2023

Modified Files:
        src/usr.bin/xlint/lint1: ckbool.c debug.c emit1.c func.c lint1.h tree.c

Log Message:
lint: reduce memory allocations

The type val_t has the same size as the tn_s member in the same union.

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/usr.bin/xlint/lint1/ckbool.c
cvs rdiff -u -r1.35 -r1.36 src/usr.bin/xlint/lint1/debug.c
cvs rdiff -u -r1.68 -r1.69 src/usr.bin/xlint/lint1/emit1.c
cvs rdiff -u -r1.156 -r1.157 src/usr.bin/xlint/lint1/func.c
cvs rdiff -u -r1.166 -r1.167 src/usr.bin/xlint/lint1/lint1.h
cvs rdiff -u -r1.530 -r1.531 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/ckbool.c
diff -u src/usr.bin/xlint/lint1/ckbool.c:1.21 src/usr.bin/xlint/lint1/ckbool.c:1.22
--- src/usr.bin/xlint/lint1/ckbool.c:1.21	Mon May 22 12:55:04 2023
+++ src/usr.bin/xlint/lint1/ckbool.c	Sat Jun 24 20:50:54 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: ckbool.c,v 1.21 2023/05/22 12:55:04 rillig Exp $ */
+/* $NetBSD: ckbool.c,v 1.22 2023/06/24 20:50:54 rillig Exp $ */
 
 /*-
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
 #include <sys/cdefs.h>
 
 #if defined(__RCSID)
-__RCSID("$NetBSD: ckbool.c,v 1.21 2023/05/22 12:55:04 rillig Exp $");
+__RCSID("$NetBSD: ckbool.c,v 1.22 2023/06/24 20:50:54 rillig Exp $");
 #endif
 
 #include <string.h>
@@ -79,7 +79,7 @@ is_symmetric_bool_or_other(op_t op)
 static bool
 is_int_constant_zero(const tnode_t *tn, tspec_t t)
 {
-	return t == INT && tn->tn_op == CON && tn->tn_val->v_quad == 0;
+	return t == INT && tn->tn_op == CON && tn->tn_val.v_quad == 0;
 }
 
 static bool

Index: src/usr.bin/xlint/lint1/debug.c
diff -u src/usr.bin/xlint/lint1/debug.c:1.35 src/usr.bin/xlint/lint1/debug.c:1.36
--- src/usr.bin/xlint/lint1/debug.c:1.35	Sat Jun 24 08:11:12 2023
+++ src/usr.bin/xlint/lint1/debug.c	Sat Jun 24 20:50:54 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: debug.c,v 1.35 2023/06/24 08:11:12 rillig Exp $ */
+/* $NetBSD: debug.c,v 1.36 2023/06/24 20:50:54 rillig Exp $ */
 
 /*-
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: debug.c,v 1.35 2023/06/24 08:11:12 rillig Exp $");
+__RCSID("$NetBSD: debug.c,v 1.36 2023/06/24 20:50:54 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -184,21 +184,21 @@ debug_node(const tnode_t *tn) // NOLINT(
 		break;
 	case CON:
 		if (is_floating(tn->tn_type->t_tspec))
-			debug_printf(", value %Lg", tn->tn_val->v_ldbl);
+			debug_printf(", value %Lg", tn->tn_val.v_ldbl);
 		else if (is_uinteger(tn->tn_type->t_tspec))
 			debug_printf(", value %llu",
-			    (unsigned long long)tn->tn_val->v_quad);
+			    (unsigned long long)tn->tn_val.v_quad);
 		else if (is_integer(tn->tn_type->t_tspec))
 			debug_printf(", value %lld",
-			    (long long)tn->tn_val->v_quad);
+			    (long long)tn->tn_val.v_quad);
 		else {
 			lint_assert(tn->tn_type->t_tspec == BOOL);
 			debug_printf(", value %s",
-			    tn->tn_val->v_quad != 0 ? "true" : "false");
+			    tn->tn_val.v_quad != 0 ? "true" : "false");
 		}
-		if (tn->tn_val->v_unsigned_since_c90)
+		if (tn->tn_val.v_unsigned_since_c90)
 			debug_printf(", unsigned_since_c90");
-		if (tn->tn_val->v_char_constant)
+		if (tn->tn_val.v_char_constant)
 			debug_printf(", char_constant");
 		debug_printf("\n");
 		break;

Index: src/usr.bin/xlint/lint1/emit1.c
diff -u src/usr.bin/xlint/lint1/emit1.c:1.68 src/usr.bin/xlint/lint1/emit1.c:1.69
--- src/usr.bin/xlint/lint1/emit1.c:1.68	Fri Jun  9 15:36:31 2023
+++ src/usr.bin/xlint/lint1/emit1.c	Sat Jun 24 20:50:54 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: emit1.c,v 1.68 2023/06/09 15:36:31 rillig Exp $ */
+/* $NetBSD: emit1.c,v 1.69 2023/06/24 20:50:54 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: emit1.c,v 1.68 2023/06/09 15:36:31 rillig Exp $");
+__RCSID("$NetBSD: emit1.c,v 1.69 2023/06/24 20:50:54 rillig Exp $");
 #endif
 
 #include "lint1.h"
@@ -372,7 +372,7 @@ outcall(const tnode_t *tn, bool retval_u
 				 * XXX it would probably be better to
 				 * explicitly test the sign
 				 */
-				if ((q = arg->tn_val->v_quad) == 0) {
+				if ((q = arg->tn_val.v_quad) == 0) {
 					/* zero constant */
 					outchar('z');
 				} else if (!msb(q, t)) {

Index: src/usr.bin/xlint/lint1/func.c
diff -u src/usr.bin/xlint/lint1/func.c:1.156 src/usr.bin/xlint/lint1/func.c:1.157
--- src/usr.bin/xlint/lint1/func.c:1.156	Fri Jun  9 15:36:31 2023
+++ src/usr.bin/xlint/lint1/func.c	Sat Jun 24 20:50:54 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: func.c,v 1.156 2023/06/09 15:36:31 rillig Exp $	*/
+/*	$NetBSD: func.c,v 1.157 2023/06/24 20:50:54 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: func.c,v 1.156 2023/06/09 15:36:31 rillig Exp $");
+__RCSID("$NetBSD: func.c,v 1.157 2023/06/24 20:50:54 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -454,8 +454,8 @@ check_case_label_bitand(const tnode_t *c
 		return;
 
 	lint_assert(case_expr->tn_op == CON);
-	case_value = case_expr->tn_val->v_quad;
-	mask = switch_expr->tn_right->tn_val->v_quad;
+	case_value = case_expr->tn_val.v_quad;
+	mask = switch_expr->tn_right->tn_val.v_quad;
 
 	if ((case_value & ~mask) != 0) {
 		/* statement not reached */

Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.166 src/usr.bin/xlint/lint1/lint1.h:1.167
--- src/usr.bin/xlint/lint1/lint1.h:1.166	Sat Jun 24 08:11:12 2023
+++ src/usr.bin/xlint/lint1/lint1.h	Sat Jun 24 20:50:54 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.166 2023/06/24 08:11:12 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.167 2023/06/24 20:50:54 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -315,7 +315,7 @@ typedef	struct tnode {
 			struct	tnode *_tn_right;	/* right operand */
 		} tn_s;
 		sym_t	*_tn_sym;	/* symbol if op == NAME */
-		val_t	*_tn_val;	/* value if op == CON */
+		val_t	_tn_val;	/* value if op == CON */
 		strg_t	*_tn_string;	/* string if op == STRING */
 	} tn_u;
 } tnode_t;
@@ -528,20 +528,20 @@ static inline bool
 constant_is_nonzero(const tnode_t *tn)
 {
 	lint_assert(tn->tn_op == CON);
-	lint_assert(tn->tn_type->t_tspec == tn->tn_val->v_tspec);
-	return is_nonzero_val(tn->tn_val);
+	lint_assert(tn->tn_type->t_tspec == tn->tn_val.v_tspec);
+	return is_nonzero_val(&tn->tn_val);
 }
 
 static inline bool
 is_zero(const tnode_t *tn)
 {
-	return tn != NULL && tn->tn_op == CON && !is_nonzero_val(tn->tn_val);
+	return tn != NULL && tn->tn_op == CON && !is_nonzero_val(&tn->tn_val);
 }
 
 static inline bool
 is_nonzero(const tnode_t *tn)
 {
-	return tn != NULL && tn->tn_op == CON && is_nonzero_val(tn->tn_val);
+	return tn != NULL && tn->tn_op == CON && is_nonzero_val(&tn->tn_val);
 }
 
 static inline bool

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.530 src/usr.bin/xlint/lint1/tree.c:1.531
--- src/usr.bin/xlint/lint1/tree.c:1.530	Sat Jun 24 17:50:31 2023
+++ src/usr.bin/xlint/lint1/tree.c	Sat Jun 24 20:50:54 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.530 2023/06/24 17:50:31 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.531 2023/06/24 20:50:54 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.530 2023/06/24 17:50:31 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.531 2023/06/24 20:50:54 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -276,7 +276,7 @@ ic_expr(const tnode_t *tn)
 
 	switch (tn->tn_op) {
 	case CON:
-		return ic_con(tn->tn_type, tn->tn_val);
+		return ic_con(tn->tn_type, &tn->tn_val);
 	case CVT:
 		if (!is_integer(tn->tn_left->tn_type->t_tspec))
 			return ic_any(tn->tn_type);
@@ -373,11 +373,10 @@ build_constant(type_t *tp, val_t *v)
 	n = expr_alloc_tnode();
 	n->tn_op = CON;
 	n->tn_type = tp;
-	n->tn_val = expr_zero_alloc(sizeof(*n->tn_val));
-	n->tn_val->v_tspec = tp->t_tspec;
-	n->tn_val->v_unsigned_since_c90 = v->v_unsigned_since_c90;
-	n->tn_val->v_char_constant = v->v_char_constant;
-	n->tn_val->v_u = v->v_u;
+	n->tn_val.v_tspec = tp->t_tspec;
+	n->tn_val.v_unsigned_since_c90 = v->v_unsigned_since_c90;
+	n->tn_val.v_char_constant = v->v_char_constant;
+	n->tn_val.v_u = v->v_u;
 	free(v);
 	return n;
 }
@@ -390,9 +389,10 @@ build_integer_constant(tspec_t t, int64_
 	n = expr_alloc_tnode();
 	n->tn_op = CON;
 	n->tn_type = gettyp(t);
-	n->tn_val = expr_zero_alloc(sizeof(*n->tn_val));
-	n->tn_val->v_tspec = t;
-	n->tn_val->v_quad = q;
+	n->tn_val.v_tspec = t;
+	n->tn_val.v_unsigned_since_c90 = false;
+	n->tn_val.v_char_constant = false;
+	n->tn_val.v_quad = q;
 	return n;
 }
 
@@ -507,14 +507,16 @@ build_name(sym_t *sym, bool is_funcname)
 	n->tn_type = sym->s_type;
 	if (sym->s_scl == BOOL_CONST) {
 		n->tn_op = CON;
-		n->tn_val = expr_zero_alloc(sizeof(*n->tn_val));
-		n->tn_val->v_tspec = BOOL;
-		n->tn_val->v_quad = sym->u.s_bool_constant ? 1 : 0;
+		n->tn_val.v_tspec = BOOL;
+		n->tn_val.v_unsigned_since_c90 = false;
+		n->tn_val.v_char_constant = false;
+		n->tn_val.v_quad = sym->u.s_bool_constant ? 1 : 0;
 	} else if (sym->s_scl == ENUM_CONST) {
 		n->tn_op = CON;
-		n->tn_val = expr_zero_alloc(sizeof(*n->tn_val));
-		n->tn_val->v_tspec = INT;	/* ENUM is in n->tn_type */
-		n->tn_val->v_quad = sym->u.s_enum_constant;
+		n->tn_val.v_tspec = INT;	/* ENUM is in n->tn_type */
+		n->tn_val.v_unsigned_since_c90 = false;
+		n->tn_val.v_char_constant = false;
+		n->tn_val.v_quad = sym->u.s_enum_constant;
 	} else {
 		n->tn_op = NAME;
 		n->tn_sym = sym;
@@ -580,9 +582,9 @@ static bool
 is_out_of_char_range(const tnode_t *tn)
 {
 	return tn->tn_op == CON &&
-	       !tn->tn_val->v_char_constant &&
-	       !(0 <= tn->tn_val->v_quad &&
-		 tn->tn_val->v_quad < 1 << (CHAR_SIZE - 1));
+	       !tn->tn_val.v_char_constant &&
+	       !(0 <= tn->tn_val.v_quad &&
+		 tn->tn_val.v_quad < 1 << (CHAR_SIZE - 1));
 }
 
 static void
@@ -601,16 +603,16 @@ check_integer_comparison(op_t op, tnode_
 
 	if (any_query_enabled && !in_system_header) {
 		if (lt == CHAR && rn->tn_op == CON &&
-		    !rn->tn_val->v_char_constant) {
+		    !rn->tn_val.v_char_constant) {
 			/* comparison '%s' of 'char' with plain integer %d */
 			query_message(14,
-			    op_name(op), (int)rn->tn_val->v_quad);
+			    op_name(op), (int)rn->tn_val.v_quad);
 		}
 		if (rt == CHAR && ln->tn_op == CON &&
-		    !ln->tn_val->v_char_constant) {
+		    !ln->tn_val.v_char_constant) {
 			/* comparison '%s' of 'char' with plain integer %d */
 			query_message(14,
-			    op_name(op), (int)ln->tn_val->v_quad);
+			    op_name(op), (int)ln->tn_val.v_quad);
 		}
 	}
 
@@ -618,7 +620,7 @@ check_integer_comparison(op_t op, tnode_
 		if (lt == CHAR && is_out_of_char_range(rn)) {
 			char buf[128];
 			(void)snprintf(buf, sizeof(buf), "%s %d",
-			    op_name(op), (int)rn->tn_val->v_quad);
+			    op_name(op), (int)rn->tn_val.v_quad);
 			/* nonportable character comparison '%s' */
 			warning(230, buf);
 			return;
@@ -626,7 +628,7 @@ check_integer_comparison(op_t op, tnode_
 		if (rt == CHAR && is_out_of_char_range(ln)) {
 			char buf[128];
 			(void)snprintf(buf, sizeof(buf), "%d %s ?",
-			    (int)ln->tn_val->v_quad, op_name(op));
+			    (int)ln->tn_val.v_quad, op_name(op));
 			/* nonportable character comparison '%s' */
 			warning(230, buf);
 			return;
@@ -634,8 +636,8 @@ check_integer_comparison(op_t op, tnode_
 	}
 
 	if (is_uinteger(lt) && !is_uinteger(rt) &&
-	    rn->tn_op == CON && rn->tn_val->v_quad <= 0) {
-		if (rn->tn_val->v_quad < 0) {
+	    rn->tn_op == CON && rn->tn_val.v_quad <= 0) {
+		if (rn->tn_val.v_quad < 0) {
 			/* operator '%s' compares '%s' with '%s' */
 			warning(162, op_name(op),
 			    type_name(ln->tn_type), "negative constant");
@@ -646,8 +648,8 @@ check_integer_comparison(op_t op, tnode_
 		return;
 	}
 	if (is_uinteger(rt) && !is_uinteger(lt) &&
-	    ln->tn_op == CON && ln->tn_val->v_quad <= 0) {
-		if (ln->tn_val->v_quad < 0) {
+	    ln->tn_op == CON && ln->tn_val.v_quad <= 0) {
+		if (ln->tn_val.v_quad < 0) {
 			/* operator '%s' compares '%s' with '%s' */
 			warning(162, op_name(op),
 			    "negative constant", type_name(rn->tn_type));
@@ -812,9 +814,9 @@ fold(tnode_t *tn)
 
 	t = tn->tn_left->tn_type->t_tspec;
 	utyp = !is_integer(t) || is_uinteger(t);
-	ul = sl = tn->tn_left->tn_val->v_quad;
+	ul = sl = tn->tn_left->tn_val.v_quad;
 	if (is_binary(tn))
-		ur = sr = tn->tn_right->tn_val->v_quad;
+		ur = sr = tn->tn_right->tn_val.v_quad;
 
 	mask = (int64_t)value_bits(size_in_bits(t));
 	ovfl = false;
@@ -1193,7 +1195,7 @@ is_null_pointer(const tnode_t *tn)
 
 	return ((t == PTR && tn->tn_type->t_subt->t_tspec == VOID) ||
 		is_integer(t))
-	       && (tn->tn_op == CON && tn->tn_val->v_quad == 0);
+	       && (tn->tn_op == CON && tn->tn_val.v_quad == 0);
 }
 
 /* Return a type based on tp1, with added qualifiers from tp2. */
@@ -1602,9 +1604,9 @@ fold_float(tnode_t *tn)
 	lint_assert(t == tn->tn_left->tn_type->t_tspec);
 	lint_assert(!is_binary(tn) || t == tn->tn_right->tn_type->t_tspec);
 
-	lv = tn->tn_left->tn_val->v_ldbl;
+	lv = tn->tn_left->tn_val.v_ldbl;
 	if (is_binary(tn))
-		rv = tn->tn_right->tn_val->v_ldbl;
+		rv = tn->tn_right->tn_val.v_ldbl;
 
 	switch (tn->tn_op) {
 	case UPLUS:
@@ -1729,16 +1731,16 @@ build_binary(tnode_t *ln, op_t op, bool 
 	 * ANSI C, print a warning.
 	 */
 	if (mp->m_warn_if_left_unsigned_in_c90 &&
-	    ln->tn_op == CON && ln->tn_val->v_unsigned_since_c90) {
+	    ln->tn_op == CON && ln->tn_val.v_unsigned_since_c90) {
 		/* ANSI C treats constant as unsigned, op '%s' */
 		warning(218, mp->m_name);
-		ln->tn_val->v_unsigned_since_c90 = false;
+		ln->tn_val.v_unsigned_since_c90 = false;
 	}
 	if (mp->m_warn_if_right_unsigned_in_c90 &&
-	    rn->tn_op == CON && rn->tn_val->v_unsigned_since_c90) {
+	    rn->tn_op == CON && rn->tn_val.v_unsigned_since_c90) {
 		/* ANSI C treats constant as unsigned, op '%s' */
 		warning(218, mp->m_name);
-		rn->tn_val->v_unsigned_since_c90 = false;
+		rn->tn_val.v_unsigned_since_c90 = false;
 	}
 
 	/* Make sure both operands are of the same type */
@@ -1851,7 +1853,7 @@ build_binary(tnode_t *ln, op_t op, bool 
 				ntn = fold(ntn);
 			}
 		} else if (op == QUEST && ln->tn_op == CON) {
-			ntn = ln->tn_val->v_quad != 0
+			ntn = ln->tn_val.v_quad != 0
 			    ? rn->tn_left : rn->tn_right;
 		}
 	}
@@ -2286,14 +2288,14 @@ typeok_shr(const mod_t *mp,
 		if (ln->tn_op != CON) {
 			/* bitwise '%s' on signed value possibly nonportable */
 			warning(117, mp->m_name);
-		} else if (ln->tn_val->v_quad < 0) {
+		} else if (ln->tn_val.v_quad < 0) {
 			/* bitwise '%s' on signed value nonportable */
 			warning(120, mp->m_name);
 		}
 	} else if (allow_trad && allow_c90 &&
 		   !is_uinteger(olt) && is_uinteger(ort)) {
 		/* The left operand would become unsigned in traditional C. */
-		if (hflag && (ln->tn_op != CON || ln->tn_val->v_quad < 0)) {
+		if (hflag && (ln->tn_op != CON || ln->tn_val.v_quad < 0)) {
 			/* semantics of '%s' change in ANSI C; use ... */
 			warning(118, mp->m_name);
 		}
@@ -2304,7 +2306,7 @@ typeok_shr(const mod_t *mp,
 		 * In traditional C the left operand would be extended
 		 * (possibly sign-extended) and then shifted.
 		 */
-		if (hflag && (ln->tn_op != CON || ln->tn_val->v_quad < 0)) {
+		if (hflag && (ln->tn_op != CON || ln->tn_val.v_quad < 0)) {
 			/* semantics of '%s' change in ANSI C; use ... */
 			warning(118, mp->m_name);
 		}
@@ -2340,16 +2342,16 @@ typeok_shift(const type_t *ltp, tspec_t 
 	if (rn->tn_op != CON)
 		return;
 
-	if (!is_uinteger(rt) && rn->tn_val->v_quad < 0) {
+	if (!is_uinteger(rt) && rn->tn_val.v_quad < 0) {
 		/* negative shift */
 		warning(121);
-	} else if ((uint64_t)rn->tn_val->v_quad ==
+	} else if ((uint64_t)rn->tn_val.v_quad ==
 		   (uint64_t)size_in_bits(lt)) {
 		/* shift amount %u equals bit-size of '%s' */
-		warning(267, (unsigned)rn->tn_val->v_quad, type_name(ltp));
-	} else if ((uint64_t)rn->tn_val->v_quad > (uint64_t)size_in_bits(lt)) {
+		warning(267, (unsigned)rn->tn_val.v_quad, type_name(ltp));
+	} else if ((uint64_t)rn->tn_val.v_quad > (uint64_t)size_in_bits(lt)) {
 		/* shift amount %llu is greater than bit-size %llu of '%s' */
-		warning(122, (unsigned long long)rn->tn_val->v_quad,
+		warning(122, (unsigned long long)rn->tn_val.v_quad,
 		    (unsigned long long)size_in_bits(lt),
 		    tspec_name(lt));
 	}
@@ -2977,7 +2979,7 @@ is_int_constant_zero(const tnode_t *tn)
 
 	return tn->tn_op == CON &&
 	       tn->tn_type->t_tspec == INT &&
-	       tn->tn_val->v_quad == 0;
+	       tn->tn_val.v_quad == 0;
 }
 
 static void
@@ -3164,7 +3166,7 @@ check_enum_int_mismatch(op_t op, int arg
 		 */
 		if (!rn->tn_type->t_is_enum && rn->tn_op == CON &&
 		    is_integer(rn->tn_type->t_tspec) &&
-		    rn->tn_val->v_quad == 0) {
+		    rn->tn_val.v_quad == 0) {
 			return;
 		}
 		/* initialization of '%s' with '%s' */
@@ -3358,7 +3360,7 @@ should_warn_about_prototype_conversion(t
 	 */
 	if (ptn->tn_op == CON && is_integer(nt) &&
 	    signed_type(nt) == signed_type(ot) &&
-	    !msb(ptn->tn_val->v_quad, ot))
+	    !msb(ptn->tn_val.v_quad, ot))
 		return false;
 
 	return true;
@@ -3684,9 +3686,8 @@ convert(op_t op, int arg, type_t *tp, tn
 		ntn->tn_left = tn;
 	} else {
 		ntn->tn_op = CON;
-		ntn->tn_val = expr_zero_alloc(sizeof(*ntn->tn_val));
-		convert_constant(op, arg, ntn->tn_type, ntn->tn_val,
-		    tn->tn_val);
+		convert_constant(op, arg, ntn->tn_type, &ntn->tn_val,
+		    &tn->tn_val);
 	}
 
 	return ntn;
@@ -4405,14 +4406,14 @@ constant(tnode_t *tn, bool required)
 	v->v_tspec = tn->tn_type->t_tspec;
 
 	if (tn->tn_op == CON) {
-		lint_assert(tn->tn_type->t_tspec == tn->tn_val->v_tspec);
-		if (is_integer(tn->tn_val->v_tspec)) {
+		lint_assert(tn->tn_type->t_tspec == tn->tn_val.v_tspec);
+		if (is_integer(tn->tn_val.v_tspec)) {
 			v->v_unsigned_since_c90 =
-			    tn->tn_val->v_unsigned_since_c90;
-			v->v_quad = tn->tn_val->v_quad;
+			    tn->tn_val.v_unsigned_since_c90;
+			v->v_quad = tn->tn_val.v_quad;
 			return v;
 		}
-		v->v_quad = (int64_t)tn->tn_val->v_ldbl;
+		v->v_quad = (int64_t)tn->tn_val.v_ldbl;
 	} else {
 		v->v_quad = 1;
 	}
@@ -4434,7 +4435,7 @@ static bool
 is_constcond_false(const tnode_t *tn, tspec_t t)
 {
 	return (t == BOOL || t == INT) &&
-	       tn->tn_op == CON && tn->tn_val->v_quad == 0;
+	       tn->tn_op == CON && tn->tn_val.v_quad == 0;
 }
 
 /*
@@ -4514,7 +4515,7 @@ check_array_index(tnode_t *tn, bool ampe
 	 * For incomplete array types, we can print a warning only if
 	 * the index is negative.
 	 */
-	if (is_incomplete(ln->tn_left->tn_type) && rn->tn_val->v_quad >= 0)
+	if (is_incomplete(ln->tn_left->tn_type) && rn->tn_val.v_quad >= 0)
 		return;
 
 	/* Get the size of one array element */
@@ -4525,8 +4526,8 @@ check_array_index(tnode_t *tn, bool ampe
 
 	/* Change the unit of the index from bytes to element size. */
 	int64_t con = is_uinteger(rn->tn_type->t_tspec)
-	    ? (int64_t)((uint64_t)rn->tn_val->v_quad / elsz)
-	    : rn->tn_val->v_quad / elsz;
+	    ? (int64_t)((uint64_t)rn->tn_val.v_quad / elsz)
+	    : rn->tn_val.v_quad / elsz;
 
 	int dim = ln->tn_left->tn_type->t_dim + (amper ? 1 : 0);
 
@@ -4772,11 +4773,11 @@ constant_addr(const tnode_t *tn, const s
 	case PLUS:
 		offs1 = offs2 = 0;
 		if (tn->tn_left->tn_op == CON) {
-			offs1 = (ptrdiff_t)tn->tn_left->tn_val->v_quad;
+			offs1 = (ptrdiff_t)tn->tn_left->tn_val.v_quad;
 			if (!constant_addr(tn->tn_right, &sym, &offs2))
 				return false;
 		} else if (tn->tn_right->tn_op == CON) {
-			offs2 = (ptrdiff_t)tn->tn_right->tn_val->v_quad;
+			offs2 = (ptrdiff_t)tn->tn_right->tn_val.v_quad;
 			if (tn->tn_op == MINUS)
 				offs2 = -offs2;
 			if (!constant_addr(tn->tn_left, &sym, &offs1))

Reply via email to