Home | History | Annotate | Line # | Download | only in lint1
decl.c revision 1.403.2.1
      1  1.403.2.1  perseant /* $NetBSD: decl.c,v 1.403.2.1 2025/08/02 05:58:45 perseant Exp $ */
      2        1.2       cgd 
      3        1.1       cgd /*
      4       1.12       cgd  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
      5        1.1       cgd  * Copyright (c) 1994, 1995 Jochen Pohl
      6        1.1       cgd  * All Rights Reserved.
      7        1.1       cgd  *
      8        1.1       cgd  * Redistribution and use in source and binary forms, with or without
      9        1.1       cgd  * modification, are permitted provided that the following conditions
     10        1.1       cgd  * are met:
     11        1.1       cgd  * 1. Redistributions of source code must retain the above copyright
     12        1.1       cgd  *    notice, this list of conditions and the following disclaimer.
     13        1.1       cgd  * 2. Redistributions in binary form must reproduce the above copyright
     14        1.1       cgd  *    notice, this list of conditions and the following disclaimer in the
     15        1.1       cgd  *    documentation and/or other materials provided with the distribution.
     16        1.1       cgd  * 3. All advertising materials mentioning features or use of this software
     17        1.1       cgd  *    must display the following acknowledgement:
     18      1.351    rillig  *	This product includes software developed by Jochen Pohl for
     19        1.1       cgd  *	The NetBSD Project.
     20        1.1       cgd  * 4. The name of the author may not be used to endorse or promote products
     21        1.1       cgd  *    derived from this software without specific prior written permission.
     22        1.1       cgd  *
     23        1.1       cgd  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     24        1.1       cgd  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     25        1.1       cgd  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     26        1.1       cgd  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     27        1.1       cgd  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     28        1.1       cgd  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     29        1.1       cgd  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     30        1.1       cgd  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     31        1.1       cgd  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     32        1.1       cgd  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     33        1.1       cgd  */
     34        1.1       cgd 
     35       1.33       jmc #if HAVE_NBTOOL_CONFIG_H
     36       1.33       jmc #include "nbtool_config.h"
     37       1.33       jmc #endif
     38       1.33       jmc 
     39       1.13  christos #include <sys/cdefs.h>
     40      1.281    rillig #if defined(__RCSID)
     41  1.403.2.1  perseant __RCSID("$NetBSD: decl.c,v 1.403.2.1 2025/08/02 05:58:45 perseant Exp $");
     42        1.1       cgd #endif
     43        1.1       cgd 
     44        1.1       cgd #include <sys/param.h>
     45        1.1       cgd #include <limits.h>
     46        1.1       cgd #include <stdlib.h>
     47        1.1       cgd #include <string.h>
     48        1.1       cgd 
     49        1.1       cgd #include "lint1.h"
     50        1.1       cgd 
     51      1.301    rillig const char unnamed[] = "<unnamed>";
     52        1.1       cgd 
     53      1.111    rillig /* shared type structures for arithmetic types and void */
     54      1.383    rillig static type_t typetab[NTSPEC];
     55        1.1       cgd 
     56        1.1       cgd /* value of next enumerator during declaration of enum types */
     57      1.383    rillig int enumval;
     58        1.1       cgd 
     59        1.1       cgd /*
     60      1.330    rillig  * Points to the innermost element of a stack that contains information about
     61      1.330    rillig  * nested declarations, such as struct declarations, function prototypes,
     62      1.330    rillig  * local variables.
     63        1.1       cgd  */
     64      1.383    rillig decl_level *dcs;
     65        1.1       cgd 
     66      1.402    rillig #ifdef DEBUG
     67      1.402    rillig static inline void
     68      1.402    rillig debug_func_dcs(const char *func)
     69      1.402    rillig {
     70      1.402    rillig 	debug_printf("%s: ", func);
     71      1.402    rillig 	debug_dcs();
     72      1.402    rillig }
     73      1.402    rillig #else
     74      1.402    rillig #define debug_func_dcs(func) debug_noop()
     75      1.402    rillig #endif
     76        1.1       cgd 
     77        1.1       cgd void
     78      1.391    rillig init_decl(void)
     79        1.1       cgd {
     80      1.170    rillig 	dcs = xcalloc(1, sizeof(*dcs));
     81      1.330    rillig 	dcs->d_kind = DLK_EXTERN;
     82      1.323    rillig 	dcs->d_last_dlsym = &dcs->d_first_dlsym;
     83        1.1       cgd 
     84      1.321    rillig 	if (!pflag) {
     85      1.345    rillig 		for (size_t i = 0; i < NTSPEC; i++) {
     86      1.345    rillig 			if (ttab[i].tt_rank_kind != RK_NONE)
     87      1.345    rillig 				ttab[i].tt_rank_value =
     88      1.345    rillig 				    ttab[i].tt_size_in_bits;
     89      1.345    rillig 		}
     90      1.345    rillig 		ttab[BOOL].tt_rank_value = 1;
     91      1.321    rillig 	}
     92      1.321    rillig 
     93      1.321    rillig 	if (Tflag) {
     94      1.321    rillig 		ttab[BOOL].tt_is_integer = false;
     95      1.321    rillig 		ttab[BOOL].tt_is_uinteger = false;
     96      1.321    rillig 		ttab[BOOL].tt_is_arithmetic = false;
     97      1.321    rillig 	}
     98       1.22     lukem 
     99      1.214    rillig 	/* struct, union, enum, ptr, array and func are not shared. */
    100      1.321    rillig 	for (int i = (int)SIGNED; i < (int)STRUCT; i++)
    101      1.321    rillig 		typetab[i].t_tspec = (tspec_t)i;
    102        1.1       cgd }
    103        1.1       cgd 
    104        1.1       cgd /*
    105      1.384    rillig  * Returns a shared type structure for arithmetic types and void.  The returned
    106      1.384    rillig  * type must not be modified; use block_dup_type or expr_dup_type if necessary.
    107        1.1       cgd  */
    108        1.1       cgd type_t *
    109       1.22     lukem gettyp(tspec_t t)
    110        1.1       cgd {
    111       1.22     lukem 
    112      1.348    rillig 	lint_assert((int)t < (int)STRUCT);
    113      1.172    rillig 	/* TODO: make the return type 'const' */
    114       1.76    rillig 	return &typetab[t];
    115        1.1       cgd }
    116        1.1       cgd 
    117        1.1       cgd type_t *
    118      1.247    rillig block_dup_type(const type_t *tp)
    119        1.1       cgd {
    120      1.358    rillig 	type_t *ntp = block_zero_alloc(sizeof(*ntp), "type");
    121      1.402    rillig 	// Keep referring to the same subtype, struct, union, enum, params.
    122       1.85    rillig 	*ntp = *tp;
    123      1.402    rillig 	debug_step("%s '%s'", __func__, type_name(ntp));
    124       1.76    rillig 	return ntp;
    125        1.1       cgd }
    126        1.1       cgd 
    127      1.247    rillig /* Duplicate a type, free the allocated memory after the expression. */
    128        1.1       cgd type_t *
    129      1.169    rillig expr_dup_type(const type_t *tp)
    130        1.1       cgd {
    131      1.358    rillig 	type_t *ntp = expr_zero_alloc(sizeof(*ntp), "type");
    132      1.402    rillig 	// Keep referring to the same subtype, struct, union, enum, params.
    133       1.85    rillig 	*ntp = *tp;
    134      1.402    rillig 	debug_step("%s: '%s'", __func__, type_name(ntp));
    135       1.76    rillig 	return ntp;
    136        1.1       cgd }
    137        1.1       cgd 
    138        1.1       cgd /*
    139      1.211    rillig  * Return the unqualified version of the type.  The returned type is freed at
    140      1.211    rillig  * the end of the current expression.
    141      1.211    rillig  *
    142      1.211    rillig  * See C99 6.2.5p25.
    143      1.211    rillig  */
    144      1.211    rillig type_t *
    145      1.211    rillig expr_unqualified_type(const type_t *tp)
    146      1.211    rillig {
    147      1.358    rillig 	type_t *ntp = expr_zero_alloc(sizeof(*ntp), "type");
    148      1.402    rillig 	// Keep referring to the same subtype, struct, union, enum, params.
    149      1.211    rillig 	*ntp = *tp;
    150      1.211    rillig 	ntp->t_const = false;
    151      1.211    rillig 	ntp->t_volatile = false;
    152      1.211    rillig 
    153      1.221    rillig 	/*
    154      1.221    rillig 	 * In case of a struct or union type, the members should lose their
    155      1.382    rillig 	 * qualifiers as well, but that would require a deep copy of the struct
    156      1.382    rillig 	 * or union type.  This in turn would defeat the type comparison in
    157      1.402    rillig 	 * types_compatible, which simply tests whether 'tp1->u.sou ==
    158      1.402    rillig 	 * tp2->u.sou'.
    159      1.221    rillig 	 */
    160      1.211    rillig 
    161      1.402    rillig 	debug_step("%s: '%s'", __func__, type_name(ntp));
    162      1.211    rillig 	return ntp;
    163      1.211    rillig }
    164      1.211    rillig 
    165      1.211    rillig /*
    166      1.374    rillig  * Returns whether the type is 'void' or an incomplete array, struct, union
    167      1.374    rillig  * or enum.
    168        1.1       cgd  */
    169      1.122    rillig bool
    170      1.132    rillig is_incomplete(const type_t *tp)
    171        1.1       cgd {
    172      1.327    rillig 	tspec_t t = tp->t_tspec;
    173        1.1       cgd 
    174      1.327    rillig 	if (t == VOID)
    175      1.124    rillig 		return true;
    176      1.298    rillig 	if (t == ARRAY)
    177      1.136    rillig 		return tp->t_incomplete_array;
    178      1.298    rillig 	if (is_struct_or_union(t))
    179      1.396    rillig 		return tp->u.sou->sou_incomplete;
    180      1.298    rillig 	if (t == ENUM)
    181      1.396    rillig 		return tp->u.enumer->en_incomplete;
    182      1.124    rillig 	return false;
    183        1.1       cgd }
    184        1.1       cgd 
    185      1.349    rillig void
    186      1.349    rillig dcs_add_function_specifier(function_specifier fs)
    187      1.349    rillig {
    188      1.349    rillig 	if (fs == FS_INLINE) {
    189      1.349    rillig 		if (dcs->d_inline)
    190      1.349    rillig 			/* duplicate '%s' */
    191      1.349    rillig 			warning(10, "inline");
    192      1.349    rillig 		dcs->d_inline = true;
    193      1.349    rillig 	}
    194  1.403.2.1  perseant 	if (fs == FS_NORETURN)
    195  1.403.2.1  perseant 		dcs->d_noreturn = true;
    196      1.402    rillig 	debug_func_dcs(__func__);
    197      1.349    rillig }
    198      1.349    rillig 
    199        1.1       cgd void
    200      1.296    rillig dcs_add_storage_class(scl_t sc)
    201        1.1       cgd {
    202       1.22     lukem 
    203      1.311    rillig 	if (dcs->d_type != NULL || dcs->d_abstract_type != NO_TSPEC ||
    204      1.392    rillig 	    dcs->d_sign_mod != NO_TSPEC || dcs->d_rank_mod != NO_TSPEC)
    205        1.1       cgd 		/* storage class after type is obsolescent */
    206        1.1       cgd 		warning(83);
    207      1.298    rillig 
    208      1.380    rillig 	if (dcs->d_scl == NO_SCL)
    209        1.3       jpo 		dcs->d_scl = sc;
    210      1.360    rillig 	else if ((dcs->d_scl == EXTERN && sc == THREAD_LOCAL)
    211      1.360    rillig 	    || (dcs->d_scl == THREAD_LOCAL && sc == EXTERN))
    212      1.360    rillig 		dcs->d_scl = EXTERN;	/* ignore thread_local */
    213      1.362    rillig 	else if ((dcs->d_scl == STATIC && sc == THREAD_LOCAL)
    214      1.362    rillig 	    || (dcs->d_scl == THREAD_LOCAL && sc == STATIC))
    215      1.362    rillig 		dcs->d_scl = STATIC;	/* ignore thread_local */
    216      1.298    rillig 	else
    217      1.209    rillig 		dcs->d_multiple_storage_classes = true;
    218      1.402    rillig 	debug_func_dcs(__func__);
    219        1.1       cgd }
    220        1.1       cgd 
    221      1.364    rillig /* Merge the signedness into the abstract type. */
    222      1.364    rillig static tspec_t
    223      1.364    rillig merge_signedness(tspec_t t, tspec_t s)
    224      1.364    rillig {
    225      1.364    rillig 
    226      1.364    rillig 	if (s == SIGNED)
    227      1.364    rillig 		return t == CHAR ? SCHAR : t;
    228      1.364    rillig 	if (s != UNSIGN)
    229      1.364    rillig 		return t;
    230      1.364    rillig 	return t == CHAR ? UCHAR
    231      1.364    rillig 	    : t == SHORT ? USHORT
    232      1.364    rillig 	    : t == INT ? UINT
    233      1.364    rillig 	    : t == LONG ? ULONG
    234      1.364    rillig 	    : t == LLONG ? ULLONG
    235  1.403.2.1  perseant #ifdef INT128_SIZE
    236  1.403.2.1  perseant 	    : t == INT128 ? UINT128
    237  1.403.2.1  perseant #endif
    238      1.364    rillig 	    : t;
    239      1.364    rillig }
    240      1.364    rillig 
    241      1.364    rillig /*
    242      1.364    rillig  * Called if a list of declaration specifiers contains a typedef name
    243      1.364    rillig  * and other specifiers (except struct, union, enum, typedef name).
    244      1.364    rillig  */
    245      1.364    rillig static type_t *
    246      1.364    rillig typedef_error(type_t *td, tspec_t t)
    247      1.364    rillig {
    248      1.364    rillig 	tspec_t t2 = td->t_tspec;
    249      1.364    rillig 
    250      1.364    rillig 	if ((t == SIGNED || t == UNSIGN) &&
    251      1.364    rillig 	    (t2 == CHAR || t2 == SHORT || t2 == INT ||
    252      1.364    rillig 	     t2 == LONG || t2 == LLONG)) {
    253      1.364    rillig 		if (allow_c90)
    254      1.364    rillig 			/* modifying typedef with '%s'; only qualifiers... */
    255      1.364    rillig 			warning(5, tspec_name(t));
    256      1.364    rillig 		td = block_dup_type(gettyp(merge_signedness(t2, t)));
    257      1.364    rillig 		td->t_typedef = true;
    258      1.364    rillig 		return td;
    259      1.364    rillig 	}
    260      1.364    rillig 
    261      1.364    rillig 	if (t == SHORT && (t2 == INT || t2 == UINT)) {
    262      1.364    rillig 		/* modifying typedef with '%s'; only qualifiers allowed */
    263      1.364    rillig 		warning(5, "short");
    264      1.364    rillig 		td = block_dup_type(gettyp(t2 == INT ? SHORT : USHORT));
    265      1.364    rillig 		td->t_typedef = true;
    266      1.364    rillig 		return td;
    267      1.364    rillig 	}
    268      1.364    rillig 
    269      1.364    rillig 	if (t != LONG)
    270      1.364    rillig 		goto invalid;
    271      1.364    rillig 
    272      1.367    rillig 	tspec_t lt;
    273      1.364    rillig 	if (t2 == INT)
    274      1.367    rillig 		lt = LONG;
    275      1.364    rillig 	else if (t2 == UINT)
    276      1.367    rillig 		lt = ULONG;
    277      1.364    rillig 	else if (t2 == LONG)
    278      1.367    rillig 		lt = LLONG;
    279      1.364    rillig 	else if (t2 == ULONG)
    280      1.367    rillig 		lt = ULLONG;
    281      1.364    rillig 	else if (t2 == FLOAT)
    282      1.367    rillig 		lt = DOUBLE;
    283      1.364    rillig 	else if (t2 == DOUBLE)
    284      1.367    rillig 		lt = LDOUBLE;
    285      1.364    rillig 	else if (t2 == DCOMPLEX)
    286      1.367    rillig 		lt = LCOMPLEX;
    287      1.364    rillig 	else
    288      1.364    rillig 		goto invalid;
    289      1.364    rillig 
    290      1.364    rillig 	/* modifying typedef with '%s'; only qualifiers allowed */
    291      1.364    rillig 	warning(5, "long");
    292      1.367    rillig 	td = block_dup_type(gettyp(lt));
    293      1.364    rillig 	td->t_typedef = true;
    294      1.364    rillig 	return td;
    295      1.364    rillig 
    296      1.364    rillig invalid:
    297      1.364    rillig 	dcs->d_invalid_type_combination = true;
    298      1.402    rillig 	debug_func_dcs(__func__);
    299      1.364    rillig 	return td;
    300      1.364    rillig }
    301      1.364    rillig 
    302        1.1       cgd /*
    303      1.327    rillig  * Remember the type, modifier or typedef name returned by the parser in the
    304      1.327    rillig  * top element of the declaration stack. This information is used in
    305      1.327    rillig  * dcs_end_type to build the type used for all declarators in this declaration.
    306        1.1       cgd  *
    307      1.327    rillig  * If tp->t_typedef is true, the type comes from a previously defined typename.
    308      1.327    rillig  * Otherwise, it comes from a type specifier (int, long, ...) or a
    309        1.1       cgd  * struct/union/enum tag.
    310        1.1       cgd  */
    311        1.1       cgd void
    312      1.296    rillig dcs_add_type(type_t *tp)
    313        1.1       cgd {
    314      1.213    rillig 
    315        1.1       cgd 	if (tp->t_typedef) {
    316      1.382    rillig 		/*-
    317       1.92    rillig 		 * something like "typedef int a; int a b;"
    318       1.92    rillig 		 * This should not happen with current grammar.
    319       1.92    rillig 		 */
    320       1.92    rillig 		lint_assert(dcs->d_type == NULL);
    321      1.311    rillig 		lint_assert(dcs->d_abstract_type == NO_TSPEC);
    322      1.311    rillig 		lint_assert(dcs->d_sign_mod == NO_TSPEC);
    323      1.311    rillig 		lint_assert(dcs->d_rank_mod == NO_TSPEC);
    324       1.92    rillig 
    325        1.3       jpo 		dcs->d_type = tp;
    326      1.402    rillig 		debug_func_dcs(__func__);
    327        1.1       cgd 		return;
    328        1.1       cgd 	}
    329        1.1       cgd 
    330      1.327    rillig 	tspec_t t = tp->t_tspec;
    331      1.402    rillig 	if (t == STRUCT || t == UNION || t == ENUM) {
    332      1.382    rillig 		/* something like "int struct a ..." */
    333      1.311    rillig 		if (dcs->d_type != NULL || dcs->d_abstract_type != NO_TSPEC ||
    334      1.311    rillig 		    dcs->d_rank_mod != NO_TSPEC || dcs->d_sign_mod != NO_TSPEC) {
    335      1.209    rillig 			dcs->d_invalid_type_combination = true;
    336      1.311    rillig 			dcs->d_abstract_type = NO_TSPEC;
    337      1.311    rillig 			dcs->d_sign_mod = NO_TSPEC;
    338      1.311    rillig 			dcs->d_rank_mod = NO_TSPEC;
    339        1.1       cgd 		}
    340        1.3       jpo 		dcs->d_type = tp;
    341      1.402    rillig 		debug_func_dcs(__func__);
    342        1.1       cgd 		return;
    343        1.1       cgd 	}
    344        1.1       cgd 
    345        1.3       jpo 	if (dcs->d_type != NULL && !dcs->d_type->t_typedef) {
    346      1.382    rillig 		/* something like "struct a int" */
    347      1.209    rillig 		dcs->d_invalid_type_combination = true;
    348      1.402    rillig 		debug_func_dcs(__func__);
    349        1.1       cgd 		return;
    350        1.1       cgd 	}
    351        1.1       cgd 
    352       1.39  christos 	if (t == COMPLEX) {
    353      1.147    rillig 		if (dcs->d_complex_mod == FLOAT)
    354       1.39  christos 			t = FCOMPLEX;
    355      1.147    rillig 		else if (dcs->d_complex_mod == DOUBLE)
    356       1.39  christos 			t = DCOMPLEX;
    357      1.100    rillig 		else {
    358      1.104    rillig 			/* invalid type for _Complex */
    359      1.100    rillig 			error(308);
    360      1.382    rillig 			t = DCOMPLEX;	/* just as a fallback */
    361      1.100    rillig 		}
    362      1.311    rillig 		dcs->d_complex_mod = NO_TSPEC;
    363       1.39  christos 	}
    364       1.39  christos 
    365      1.147    rillig 	if (t == LONG && dcs->d_rank_mod == LONG) {
    366        1.1       cgd 		/* "long long" or "long ... long" */
    367      1.340    rillig 		t = LLONG;
    368      1.311    rillig 		dcs->d_rank_mod = NO_TSPEC;
    369      1.350    rillig 		if (!suppress_longlong)
    370      1.243    rillig 			/* %s does not support 'long long' */
    371      1.279    rillig 			c99ism(265, allow_c90 ? "C90" : "traditional C");
    372        1.1       cgd 	}
    373        1.1       cgd 
    374        1.3       jpo 	if (dcs->d_type != NULL && dcs->d_type->t_typedef) {
    375        1.1       cgd 		/* something like "typedef int a; a long ..." */
    376      1.297    rillig 		dcs->d_type = typedef_error(dcs->d_type, t);
    377        1.1       cgd 		return;
    378        1.1       cgd 	}
    379        1.1       cgd 
    380        1.1       cgd 	/* now it can be only a combination of arithmetic types and void */
    381        1.1       cgd 	if (t == SIGNED || t == UNSIGN) {
    382      1.311    rillig 		if (dcs->d_sign_mod != NO_TSPEC)
    383      1.209    rillig 			dcs->d_invalid_type_combination = true;
    384      1.147    rillig 		dcs->d_sign_mod = t;
    385  1.403.2.1  perseant #ifdef INT128_SIZE
    386  1.403.2.1  perseant 	} else if (t == SHORT || t == LONG || t == LLONG || t == INT128) {
    387  1.403.2.1  perseant #else
    388      1.340    rillig 	} else if (t == SHORT || t == LONG || t == LLONG) {
    389  1.403.2.1  perseant #endif
    390      1.311    rillig 		if (dcs->d_rank_mod != NO_TSPEC)
    391      1.209    rillig 			dcs->d_invalid_type_combination = true;
    392      1.147    rillig 		dcs->d_rank_mod = t;
    393       1.39  christos 	} else if (t == FLOAT || t == DOUBLE) {
    394      1.311    rillig 		if (dcs->d_rank_mod == NO_TSPEC || dcs->d_rank_mod == LONG) {
    395      1.311    rillig 			if (dcs->d_complex_mod != NO_TSPEC
    396      1.147    rillig 			    || (t == FLOAT && dcs->d_rank_mod == LONG))
    397      1.209    rillig 				dcs->d_invalid_type_combination = true;
    398      1.147    rillig 			dcs->d_complex_mod = t;
    399       1.40  christos 		} else {
    400      1.311    rillig 			if (dcs->d_abstract_type != NO_TSPEC)
    401      1.209    rillig 				dcs->d_invalid_type_combination = true;
    402      1.147    rillig 			dcs->d_abstract_type = t;
    403       1.40  christos 		}
    404       1.68  christos 	} else if (t == PTR) {
    405       1.68  christos 		dcs->d_type = tp;
    406        1.1       cgd 	} else {
    407      1.311    rillig 		if (dcs->d_abstract_type != NO_TSPEC)
    408      1.209    rillig 			dcs->d_invalid_type_combination = true;
    409      1.147    rillig 		dcs->d_abstract_type = t;
    410        1.1       cgd 	}
    411      1.402    rillig 	debug_func_dcs(__func__);
    412        1.1       cgd }
    413        1.1       cgd 
    414        1.1       cgd static void
    415      1.297    rillig set_first_typedef(type_t *tp, sym_t *sym)
    416        1.1       cgd {
    417        1.1       cgd 
    418      1.327    rillig 	tspec_t t = tp->t_tspec;
    419      1.396    rillig 	if (is_struct_or_union(t) && tp->u.sou->sou_first_typedef == NULL)
    420      1.396    rillig 		tp->u.sou->sou_first_typedef = sym;
    421      1.396    rillig 	if (t == ENUM && tp->u.enumer->en_first_typedef == NULL)
    422      1.396    rillig 		tp->u.enumer->en_first_typedef = sym;
    423      1.402    rillig 	debug_printf("%s: ", __func__);
    424      1.402    rillig 	debug_type(tp);
    425        1.1       cgd }
    426        1.1       cgd 
    427      1.225    rillig static unsigned int
    428      1.332    rillig bit_fields_width(const sym_t **mem, bool *named)
    429       1.65  christos {
    430      1.326    rillig 	unsigned int width = 0;
    431      1.326    rillig 	unsigned int align = 0;
    432      1.122    rillig 	while (*mem != NULL && (*mem)->s_type->t_bitfield) {
    433      1.326    rillig 		if ((*mem)->s_name != unnamed)
    434      1.326    rillig 			*named = true;
    435      1.322    rillig 		width += (*mem)->s_type->t_bit_field_width;
    436      1.401    rillig 		unsigned mem_align = alignment((*mem)->s_type);
    437      1.326    rillig 		if (mem_align > align)
    438      1.326    rillig 			align = mem_align;
    439       1.80    rillig 		*mem = (*mem)->s_next;
    440       1.65  christos 	}
    441      1.401    rillig 	unsigned align_in_bits = align * CHAR_BIT;
    442      1.401    rillig 	return (width + align_in_bits - 1) & -align_in_bits;
    443       1.65  christos }
    444       1.65  christos 
    445       1.48  christos static void
    446      1.325    rillig pack_struct_or_union(type_t *tp)
    447       1.47  christos {
    448       1.47  christos 
    449      1.325    rillig 	if (!is_struct_or_union(tp->t_tspec)) {
    450      1.325    rillig 		/* attribute '%s' ignored for '%s' */
    451      1.325    rillig 		warning(326, "packed", type_name(tp));
    452      1.325    rillig 		return;
    453      1.325    rillig 	}
    454      1.242    rillig 
    455      1.325    rillig 	unsigned int bits = 0;
    456      1.326    rillig 	bool named = false;
    457      1.396    rillig 	for (const sym_t *mem = tp->u.sou->sou_first_member;
    458      1.381    rillig 	    mem != NULL; mem = mem->s_next) {
    459      1.325    rillig 		// TODO: Maybe update mem->u.s_member.sm_offset_in_bits.
    460      1.325    rillig 		if (mem->s_type->t_bitfield) {
    461      1.327    rillig 			bits += bit_fields_width(&mem, &named);
    462      1.325    rillig 			if (mem == NULL)
    463      1.325    rillig 				break;
    464       1.47  christos 		}
    465      1.325    rillig 		unsigned int mem_bits = type_size_in_bits(mem->s_type);
    466      1.325    rillig 		if (tp->t_tspec == STRUCT)
    467      1.325    rillig 			bits += mem_bits;
    468      1.325    rillig 		else if (mem_bits > bits)
    469      1.325    rillig 			bits = mem_bits;
    470       1.47  christos 	}
    471      1.396    rillig 	tp->u.sou->sou_size_in_bits = bits;
    472       1.47  christos }
    473       1.47  christos 
    474       1.48  christos void
    475      1.399    rillig dcs_add_alignas(tnode_t *tn)
    476      1.399    rillig {
    477      1.401    rillig 	dcs->d_mem_align = to_int_constant(tn, true);
    478      1.400    rillig 	if (dcs->d_type != NULL && is_struct_or_union(dcs->d_type->t_tspec))
    479      1.402    rillig 		// FIXME: The type must not be modified.
    480      1.401    rillig 		dcs->d_type->u.sou->sou_align = dcs->d_mem_align;
    481      1.402    rillig 	debug_func_dcs(__func__);
    482      1.399    rillig }
    483      1.399    rillig 
    484      1.399    rillig void
    485      1.296    rillig dcs_add_packed(void)
    486       1.48  christos {
    487       1.49  christos 	if (dcs->d_type == NULL)
    488      1.122    rillig 		dcs->d_packed = true;
    489       1.49  christos 	else
    490      1.325    rillig 		pack_struct_or_union(dcs->d_type);
    491      1.402    rillig 	debug_func_dcs(__func__);
    492       1.48  christos }
    493       1.48  christos 
    494       1.67  christos void
    495      1.296    rillig dcs_set_used(void)
    496       1.67  christos {
    497      1.122    rillig 	dcs->d_used = true;
    498      1.402    rillig 	debug_func_dcs(__func__);
    499       1.67  christos }
    500       1.67  christos 
    501        1.1       cgd /*
    502      1.327    rillig  * Remember a qualifier that is part of the declaration specifiers (and not the
    503      1.327    rillig  * declarator). The remembered qualifier is used by dcs_end_type for all
    504      1.327    rillig  * declarators.
    505        1.1       cgd  */
    506        1.1       cgd void
    507      1.354    rillig dcs_add_qualifiers(type_qualifiers qs)
    508        1.1       cgd {
    509      1.355    rillig 	add_type_qualifiers(&dcs->d_qual, qs);
    510      1.402    rillig 	debug_func_dcs(__func__);
    511        1.1       cgd }
    512        1.1       cgd 
    513        1.1       cgd void
    514  1.403.2.1  perseant dcs_add_type_attributes(type_attributes attrs)
    515  1.403.2.1  perseant {
    516  1.403.2.1  perseant 	if (attrs.used)
    517  1.403.2.1  perseant 		dcs_set_used();
    518  1.403.2.1  perseant 	if (attrs.noreturn)
    519  1.403.2.1  perseant 		dcs->d_noreturn = true;
    520  1.403.2.1  perseant 	if (attrs.bit_width == 128) {
    521  1.403.2.1  perseant #ifdef INT128_SIZE
    522  1.403.2.1  perseant 		dcs->d_rank_mod = INT128;
    523  1.403.2.1  perseant #else
    524  1.403.2.1  perseant 		/* Get as close as possible. */
    525  1.403.2.1  perseant 		dcs->d_rank_mod = LLONG;
    526  1.403.2.1  perseant #endif
    527  1.403.2.1  perseant 	}
    528  1.403.2.1  perseant 	if (attrs.bit_width == 64)
    529  1.403.2.1  perseant 		dcs->d_rank_mod = LLONG;
    530  1.403.2.1  perseant }
    531  1.403.2.1  perseant 
    532  1.403.2.1  perseant void
    533      1.330    rillig begin_declaration_level(decl_level_kind kind)
    534        1.1       cgd {
    535        1.1       cgd 
    536      1.330    rillig 	decl_level *dl = xcalloc(1, sizeof(*dl));
    537      1.330    rillig 	dl->d_enclosing = dcs;
    538      1.330    rillig 	dl->d_kind = kind;
    539      1.330    rillig 	dl->d_last_dlsym = &dl->d_first_dlsym;
    540      1.330    rillig 	dcs = dl;
    541      1.335    rillig 	debug_enter();
    542      1.371    rillig 	debug_dcs_all();
    543        1.1       cgd }
    544        1.1       cgd 
    545        1.1       cgd void
    546      1.160    rillig end_declaration_level(void)
    547        1.1       cgd {
    548        1.1       cgd 
    549      1.371    rillig 	debug_dcs_all();
    550        1.1       cgd 
    551      1.335    rillig 	decl_level *dl = dcs;
    552      1.330    rillig 	dcs = dl->d_enclosing;
    553      1.335    rillig 	lint_assert(dcs != NULL);
    554      1.302    rillig 
    555      1.330    rillig 	switch (dl->d_kind) {
    556      1.330    rillig 	case DLK_STRUCT:
    557      1.330    rillig 	case DLK_UNION:
    558      1.330    rillig 	case DLK_ENUM:
    559        1.1       cgd 		/*
    560      1.327    rillig 		 * Symbols declared in (nested) structs or enums are part of
    561      1.327    rillig 		 * the next level (they are removed from the symbol table if
    562      1.327    rillig 		 * the symbols of the outer level are removed).
    563        1.1       cgd 		 */
    564      1.330    rillig 		if ((*dcs->d_last_dlsym = dl->d_first_dlsym) != NULL)
    565      1.330    rillig 			dcs->d_last_dlsym = dl->d_last_dlsym;
    566        1.1       cgd 		break;
    567      1.374    rillig 	case DLK_OLD_STYLE_PARAMS:
    568        1.1       cgd 		/*
    569      1.323    rillig 		 * All symbols in dcs->d_first_dlsym are introduced in
    570      1.374    rillig 		 * old-style parameter declarations (it's not clean, but
    571      1.323    rillig 		 * possible). They are appended to the list of symbols declared
    572      1.374    rillig 		 * in an old-style parameter identifier list or a new-style
    573        1.1       cgd 		 * parameter type list.
    574        1.1       cgd 		 */
    575      1.330    rillig 		if (dl->d_first_dlsym != NULL) {
    576      1.330    rillig 			*dl->d_last_dlsym = dcs->d_func_proto_syms;
    577      1.330    rillig 			dcs->d_func_proto_syms = dl->d_first_dlsym;
    578        1.1       cgd 		}
    579        1.1       cgd 		break;
    580      1.330    rillig 	case DLK_ABSTRACT:
    581        1.1       cgd 		/*
    582      1.327    rillig 		 * Append all symbols declared in the abstract declaration to
    583      1.327    rillig 		 * the list of symbols declared in the surrounding declaration
    584      1.327    rillig 		 * or block.
    585      1.327    rillig 		 *
    586        1.1       cgd 		 * XXX I'm not sure whether they should be removed from the
    587        1.1       cgd 		 * symbol table now or later.
    588        1.1       cgd 		 */
    589      1.330    rillig 		if ((*dcs->d_last_dlsym = dl->d_first_dlsym) != NULL)
    590      1.330    rillig 			dcs->d_last_dlsym = dl->d_last_dlsym;
    591        1.1       cgd 		break;
    592      1.330    rillig 	case DLK_AUTO:
    593      1.330    rillig 		check_usage(dl);
    594        1.1       cgd 		/* FALLTHROUGH */
    595      1.330    rillig 	case DLK_PROTO_PARAMS:
    596      1.374    rillig 		/* usage of parameters will be checked by end_function() */
    597      1.335    rillig 		symtab_remove_level(dl->d_first_dlsym);
    598        1.1       cgd 		break;
    599      1.330    rillig 	case DLK_EXTERN:
    600      1.348    rillig 		/* there is nothing around an external declaration */
    601       1.97    rillig 		/* FALLTHROUGH */
    602        1.1       cgd 	default:
    603  1.403.2.1  perseant 		lint_assert(false);
    604        1.1       cgd 	}
    605      1.330    rillig 	free(dl);
    606      1.357    rillig 	debug_leave();
    607        1.1       cgd }
    608        1.1       cgd 
    609        1.1       cgd /*
    610      1.327    rillig  * Set flag d_asm in all declaration stack elements up to the outermost one.
    611       1.10       jpo  *
    612      1.327    rillig  * This is used to mark compound statements which have, possibly in nested
    613      1.327    rillig  * compound statements, asm statements. For these compound statements, no
    614      1.327    rillig  * warnings about unused or uninitialized variables are printed.
    615       1.10       jpo  *
    616      1.330    rillig  * There is no need to clear d_asm in decl_level structs with context AUTO, as
    617      1.327    rillig  * these structs are freed at the end of the compound statement. But it must be
    618      1.330    rillig  * cleared in the outermost decl_level struct, which has context EXTERN. This
    619      1.330    rillig  * could be done in dcs_begin_type and would work for C90, but not for C99 or
    620      1.330    rillig  * C++ (due to mixed statements and declarations). Thus, we clear it in
    621      1.327    rillig  * global_clean_up_decl.
    622       1.10       jpo  */
    623       1.10       jpo void
    624      1.296    rillig dcs_set_asm(void)
    625       1.10       jpo {
    626       1.10       jpo 
    627      1.330    rillig 	for (decl_level *dl = dcs; dl != NULL; dl = dl->d_enclosing)
    628      1.330    rillig 		dl->d_asm = true;
    629      1.402    rillig 	debug_step("%s", __func__);
    630      1.402    rillig 	debug_dcs_all();
    631       1.10       jpo }
    632       1.10       jpo 
    633        1.1       cgd void
    634      1.296    rillig dcs_begin_type(void)
    635        1.1       cgd {
    636       1.22     lukem 
    637      1.356    rillig 	debug_enter();
    638      1.398    rillig 
    639      1.398    rillig 	// keep d_kind
    640      1.311    rillig 	dcs->d_abstract_type = NO_TSPEC;
    641      1.311    rillig 	dcs->d_complex_mod = NO_TSPEC;
    642      1.311    rillig 	dcs->d_sign_mod = NO_TSPEC;
    643      1.311    rillig 	dcs->d_rank_mod = NO_TSPEC;
    644      1.380    rillig 	dcs->d_scl = NO_SCL;
    645        1.3       jpo 	dcs->d_type = NULL;
    646      1.372    rillig 	dcs->d_redeclared_symbol = NULL;
    647      1.398    rillig 	// keep d_sou_size_in_bits
    648      1.401    rillig 	// keep d_sou_align
    649      1.401    rillig 	dcs->d_mem_align = 0;
    650      1.355    rillig 	dcs->d_qual = (type_qualifiers) { .tq_const = false };
    651      1.122    rillig 	dcs->d_inline = false;
    652      1.209    rillig 	dcs->d_multiple_storage_classes = false;
    653      1.209    rillig 	dcs->d_invalid_type_combination = false;
    654      1.155    rillig 	dcs->d_nonempty_decl = false;
    655      1.323    rillig 	dcs->d_no_type_specifier = false;
    656      1.398    rillig 	// keep d_asm
    657      1.372    rillig 	dcs->d_packed = false;
    658      1.372    rillig 	dcs->d_used = false;
    659  1.403.2.1  perseant 	dcs->d_noreturn = false;
    660      1.398    rillig 	// keep d_tag_type
    661      1.374    rillig 	dcs->d_func_params = NULL;
    662      1.372    rillig 	dcs->d_func_def_pos = (pos_t){ NULL, 0, 0 };
    663      1.398    rillig 	// keep d_first_dlsym
    664      1.398    rillig 	// keep d_last_dlsym
    665      1.372    rillig 	dcs->d_func_proto_syms = NULL;
    666      1.398    rillig 	// keep d_enclosing
    667      1.402    rillig 
    668      1.402    rillig 	debug_func_dcs(__func__);
    669        1.1       cgd }
    670        1.1       cgd 
    671      1.150    rillig static void
    672      1.150    rillig dcs_adjust_storage_class(void)
    673      1.150    rillig {
    674      1.330    rillig 	if (dcs->d_kind == DLK_EXTERN) {
    675      1.150    rillig 		if (dcs->d_scl == REG || dcs->d_scl == AUTO) {
    676  1.403.2.1  perseant 			/* invalid storage class */
    677      1.150    rillig 			error(8);
    678      1.380    rillig 			dcs->d_scl = NO_SCL;
    679      1.150    rillig 		}
    680      1.374    rillig 	} else if (dcs->d_kind == DLK_OLD_STYLE_PARAMS ||
    681      1.381    rillig 	    dcs->d_kind == DLK_PROTO_PARAMS) {
    682      1.380    rillig 		if (dcs->d_scl != NO_SCL && dcs->d_scl != REG) {
    683      1.346    rillig 			/* only 'register' is valid as storage class ... */
    684      1.150    rillig 			error(9);
    685      1.380    rillig 			dcs->d_scl = NO_SCL;
    686      1.150    rillig 		}
    687      1.150    rillig 	}
    688      1.150    rillig }
    689      1.150    rillig 
    690      1.205    rillig /*
    691      1.205    rillig  * Merge the declaration specifiers from dcs into dcs->d_type.
    692      1.205    rillig  *
    693      1.205    rillig  * See C99 6.7.2 "Type specifiers".
    694      1.205    rillig  */
    695      1.204    rillig static void
    696      1.204    rillig dcs_merge_declaration_specifiers(void)
    697        1.1       cgd {
    698      1.339    rillig 	tspec_t t = dcs->d_abstract_type;
    699      1.339    rillig 	tspec_t c = dcs->d_complex_mod;
    700      1.339    rillig 	tspec_t s = dcs->d_sign_mod;
    701      1.339    rillig 	tspec_t l = dcs->d_rank_mod;
    702      1.339    rillig 	type_t *tp = dcs->d_type;
    703        1.1       cgd 
    704       1.92    rillig 	if (tp != NULL) {
    705      1.311    rillig 		lint_assert(t == NO_TSPEC);
    706      1.311    rillig 		lint_assert(s == NO_TSPEC);
    707      1.311    rillig 		lint_assert(l == NO_TSPEC);
    708      1.204    rillig 		return;
    709        1.1       cgd 	}
    710        1.1       cgd 
    711      1.339    rillig 	if (t == NO_TSPEC && s == NO_TSPEC && l == NO_TSPEC && c == NO_TSPEC)
    712      1.339    rillig 		dcs->d_no_type_specifier = true;
    713      1.339    rillig 	if (t == NO_TSPEC && s == NO_TSPEC && (l == NO_TSPEC || l == LONG))
    714      1.339    rillig 		t = c;
    715      1.339    rillig 
    716      1.311    rillig 	if (t == NO_TSPEC)
    717      1.204    rillig 		t = INT;
    718      1.311    rillig 	if (s == NO_TSPEC && t == INT)
    719      1.205    rillig 		s = SIGNED;
    720      1.311    rillig 	if (l != NO_TSPEC && t == CHAR) {
    721      1.209    rillig 		dcs->d_invalid_type_combination = true;
    722      1.311    rillig 		l = NO_TSPEC;
    723      1.205    rillig 	}
    724      1.205    rillig 	if (l == LONG && t == FLOAT) {
    725      1.311    rillig 		l = NO_TSPEC;
    726      1.205    rillig 		t = DOUBLE;
    727      1.279    rillig 		if (allow_c90)
    728      1.205    rillig 			/* use 'double' instead of 'long float' */
    729      1.205    rillig 			warning(6);
    730      1.205    rillig 	}
    731      1.205    rillig 	if ((l == LONG && t == DOUBLE) || t == LDOUBLE) {
    732      1.311    rillig 		l = NO_TSPEC;
    733      1.204    rillig 		t = LDOUBLE;
    734      1.204    rillig 	}
    735      1.392    rillig 	if (t == LDOUBLE && !allow_c90)
    736  1.403.2.1  perseant 		/* 'long double' requires C90 or later */
    737      1.205    rillig 		warning(266);
    738      1.205    rillig 	if (l == LONG && t == DCOMPLEX) {
    739      1.311    rillig 		l = NO_TSPEC;
    740      1.205    rillig 		t = LCOMPLEX;
    741      1.205    rillig 	}
    742      1.205    rillig 
    743      1.311    rillig 	if (t != INT && t != CHAR && (s != NO_TSPEC || l != NO_TSPEC)) {
    744      1.209    rillig 		dcs->d_invalid_type_combination = true;
    745      1.311    rillig 		l = s = NO_TSPEC;
    746        1.1       cgd 	}
    747      1.311    rillig 	if (l != NO_TSPEC)
    748      1.204    rillig 		t = l;
    749      1.206    rillig 	dcs->d_type = gettyp(merge_signedness(t, s));
    750      1.402    rillig 	debug_func_dcs(__func__);
    751      1.204    rillig }
    752      1.204    rillig 
    753      1.400    rillig static void dcs_align(unsigned int, unsigned int);
    754      1.400    rillig 
    755      1.327    rillig /* Create a type in 'dcs->d_type' from the information gathered in 'dcs'. */
    756      1.204    rillig void
    757      1.296    rillig dcs_end_type(void)
    758      1.204    rillig {
    759      1.204    rillig 
    760      1.204    rillig 	dcs_merge_declaration_specifiers();
    761        1.1       cgd 
    762      1.392    rillig 	if (dcs->d_multiple_storage_classes)
    763        1.1       cgd 		/* only one storage class allowed */
    764        1.1       cgd 		error(7);
    765      1.392    rillig 	if (dcs->d_invalid_type_combination)
    766  1.403.2.1  perseant 		/* invalid type combination */
    767        1.1       cgd 		error(4);
    768        1.1       cgd 
    769      1.150    rillig 	dcs_adjust_storage_class();
    770        1.1       cgd 
    771      1.355    rillig 	if (dcs->d_qual.tq_const && dcs->d_type->t_const
    772      1.355    rillig 	    && !dcs->d_type->t_typeof) {
    773       1.92    rillig 		lint_assert(dcs->d_type->t_typedef);
    774       1.88    rillig 		/* typedef already qualified with '%s' */
    775        1.1       cgd 		warning(68, "const");
    776        1.1       cgd 	}
    777      1.355    rillig 	if (dcs->d_qual.tq_volatile && dcs->d_type->t_volatile &&
    778      1.277    rillig 	    !dcs->d_type->t_typeof) {
    779       1.92    rillig 		lint_assert(dcs->d_type->t_typedef);
    780       1.88    rillig 		/* typedef already qualified with '%s' */
    781        1.1       cgd 		warning(68, "volatile");
    782        1.1       cgd 	}
    783        1.1       cgd 
    784      1.355    rillig 	if (dcs->d_qual.tq_const || dcs->d_qual.tq_volatile) {
    785      1.247    rillig 		dcs->d_type = block_dup_type(dcs->d_type);
    786      1.355    rillig 		dcs->d_type->t_const |= dcs->d_qual.tq_const;
    787      1.355    rillig 		dcs->d_type->t_volatile |= dcs->d_qual.tq_volatile;
    788        1.1       cgd 	}
    789      1.401    rillig 	unsigned align = dcs->d_mem_align;
    790      1.400    rillig 	if (align > 0 && dcs->d_type->t_tspec == STRUCT) {
    791      1.400    rillig 		dcs_align(align, 0);
    792      1.401    rillig 		dcs->d_type->u.sou->sou_align = align;
    793      1.401    rillig 		unsigned align_in_bits = align * CHAR_SIZE;
    794      1.400    rillig 		dcs->d_type->u.sou->sou_size_in_bits =
    795      1.401    rillig 		    (dcs->d_type->u.sou->sou_size_in_bits + align_in_bits - 1)
    796      1.401    rillig 		    & -align_in_bits;
    797      1.400    rillig 	}
    798      1.356    rillig 
    799      1.371    rillig 	debug_dcs();
    800      1.356    rillig 	debug_leave();
    801        1.1       cgd }
    802        1.1       cgd 
    803        1.1       cgd /*
    804      1.327    rillig  * Return the length of a type in bits. For bit-fields, return the length of
    805      1.327    rillig  * the underlying storage type.
    806        1.1       cgd  *
    807      1.111    rillig  * Printing a message if the outermost dimension of an array is 0 must
    808      1.270    rillig  * be done by the caller. All other problems are reported by this function
    809        1.1       cgd  * if name is not NULL.
    810        1.1       cgd  */
    811        1.1       cgd int
    812      1.270    rillig length_in_bits(const type_t *tp, const char *name)
    813        1.1       cgd {
    814        1.1       cgd 
    815      1.327    rillig 	if (tp == NULL)
    816      1.327    rillig 		return -1;
    817      1.327    rillig 
    818      1.327    rillig 	unsigned int elem = 1;
    819      1.327    rillig 	while (tp->t_tspec == ARRAY) {
    820      1.396    rillig 		elem *= tp->u.dimension;
    821        1.1       cgd 		tp = tp->t_subt;
    822        1.1       cgd 	}
    823       1.18  christos 
    824      1.327    rillig 	if (is_struct_or_union(tp->t_tspec)) {
    825      1.392    rillig 		if (is_incomplete(tp) && name != NULL)
    826      1.199    rillig 			/* '%s' has incomplete type '%s' */
    827      1.193    rillig 			error(31, name, type_name(tp));
    828      1.396    rillig 		return (int)(elem * tp->u.sou->sou_size_in_bits);
    829        1.1       cgd 	}
    830      1.327    rillig 
    831      1.327    rillig 	if (tp->t_tspec == ENUM && is_incomplete(tp) && name != NULL)
    832      1.327    rillig 		/* incomplete enum type '%s' */
    833      1.327    rillig 		warning(13, name);
    834      1.327    rillig 
    835      1.327    rillig 	lint_assert(tp->t_tspec != FUNC);
    836      1.327    rillig 
    837      1.327    rillig 	unsigned int elsz = size_in_bits(tp->t_tspec);
    838      1.327    rillig 	/*
    839      1.327    rillig 	 * Workaround until the type parser (see add_function, add_array,
    840      1.327    rillig 	 * add_pointer) does not construct the invalid intermediate declaration
    841      1.327    rillig 	 * 'void b[4]' for the legitimate declaration 'void *b[4]'.
    842      1.327    rillig 	 */
    843      1.327    rillig 	if (sytxerr > 0 && elsz == 0)
    844      1.327    rillig 		elsz = CHAR_SIZE;
    845      1.327    rillig 	lint_assert(elsz > 0);
    846      1.232    rillig 	return (int)(elem * elsz);
    847        1.1       cgd }
    848        1.1       cgd 
    849      1.225    rillig unsigned int
    850      1.401    rillig alignment(const type_t *tp)
    851        1.1       cgd {
    852        1.1       cgd 
    853      1.266    rillig 	/* Super conservative so that it works for most systems. */
    854      1.401    rillig 	unsigned worst_align = 2 * LONG_SIZE / CHAR_SIZE;
    855      1.266    rillig 
    856      1.223    rillig 	while (tp->t_tspec == ARRAY)
    857        1.1       cgd 		tp = tp->t_subt;
    858        1.1       cgd 
    859      1.327    rillig 	tspec_t t = tp->t_tspec;
    860      1.401    rillig 	unsigned a;
    861      1.327    rillig 	if (is_struct_or_union(t))
    862      1.401    rillig 		a = tp->u.sou->sou_align;
    863      1.298    rillig 	else {
    864      1.265    rillig 		lint_assert(t != FUNC);
    865      1.401    rillig 		if ((a = size_in_bits(t) / CHAR_SIZE) == 0)
    866      1.401    rillig 			a = 1;
    867      1.401    rillig 		else if (a > worst_align)
    868      1.401    rillig 			a = worst_align;
    869        1.1       cgd 	}
    870      1.401    rillig 	lint_assert(a >= 1);
    871       1.76    rillig 	return a;
    872        1.1       cgd }
    873        1.1       cgd 
    874        1.1       cgd /*
    875       1.80    rillig  * Concatenate two lists of symbols by s_next. Used by declarations of
    876        1.1       cgd  * struct/union/enum elements and parameters.
    877        1.1       cgd  */
    878        1.1       cgd sym_t *
    879      1.327    rillig concat_symbols(sym_t *l1, sym_t *l2)
    880        1.1       cgd {
    881        1.1       cgd 
    882      1.327    rillig 	if (l1 == NULL)
    883       1.76    rillig 		return l2;
    884      1.327    rillig 	sym_t *l = l1;
    885      1.327    rillig 	while (l->s_next != NULL)
    886      1.327    rillig 		l = l->s_next;
    887      1.327    rillig 	l->s_next = l2;
    888      1.327    rillig 	return l1;
    889        1.1       cgd }
    890        1.1       cgd 
    891        1.1       cgd /*
    892      1.327    rillig  * Check if the type of the given symbol is valid.
    893        1.1       cgd  *
    894        1.1       cgd  * Invalid types are:
    895      1.111    rillig  * - arrays of incomplete types or functions
    896        1.1       cgd  * - functions returning arrays or functions
    897        1.1       cgd  * - void types other than type of function or pointer
    898        1.1       cgd  */
    899        1.1       cgd void
    900       1.75    rillig check_type(sym_t *sym)
    901        1.1       cgd {
    902        1.1       cgd 
    903      1.327    rillig 	type_t **tpp = &sym->s_type;
    904      1.327    rillig 	tspec_t to = NO_TSPEC;
    905      1.327    rillig 	while (*tpp != NULL) {
    906      1.327    rillig 		type_t *tp = *tpp;
    907      1.327    rillig 		tspec_t t = tp->t_tspec;
    908        1.1       cgd 		/*
    909      1.382    rillig 		 * If this is the type of an old-style function definition, a
    910      1.382    rillig 		 * better warning is printed in begin_function().
    911        1.1       cgd 		 */
    912        1.1       cgd 		if (t == FUNC && !tp->t_proto &&
    913      1.311    rillig 		    !(to == NO_TSPEC && sym->s_osdef)) {
    914  1.403.2.1  perseant 			if (!allow_trad && hflag)
    915        1.1       cgd 				/* function declaration is not a prototype */
    916        1.1       cgd 				warning(287);
    917        1.1       cgd 		}
    918        1.1       cgd 		if (to == FUNC) {
    919        1.1       cgd 			if (t == FUNC || t == ARRAY) {
    920  1.403.2.1  perseant 				/* function returns invalid type '%s' */
    921      1.256    rillig 				error(15, type_name(tp));
    922      1.298    rillig 				*tpp = block_derive_type(
    923      1.298    rillig 				    t == FUNC ? *tpp : (*tpp)->t_subt, PTR);
    924        1.1       cgd 				return;
    925      1.298    rillig 			}
    926      1.298    rillig 			if (tp->t_const || tp->t_volatile) {
    927      1.280    rillig 				/* TODO: Make this a warning in C99 mode as well. */
    928      1.280    rillig 				if (!allow_trad && !allow_c99) {	/* XXX or better allow_c90? */
    929        1.1       cgd 					/* function cannot return const... */
    930        1.1       cgd 					warning(228);
    931        1.1       cgd 				}
    932        1.1       cgd 			}
    933      1.254    rillig 		} else if (to == ARRAY) {
    934        1.1       cgd 			if (t == FUNC) {
    935  1.403.2.1  perseant 				/* array of function is invalid */
    936        1.1       cgd 				error(16);
    937        1.1       cgd 				*tpp = gettyp(INT);
    938        1.1       cgd 				return;
    939      1.298    rillig 			}
    940      1.396    rillig 			if (t == ARRAY && tp->u.dimension == 0) {
    941        1.1       cgd 				/* null dimension */
    942        1.1       cgd 				error(17);
    943        1.1       cgd 				return;
    944      1.298    rillig 			}
    945      1.298    rillig 			if (t == VOID) {
    946  1.403.2.1  perseant 				/* invalid use of 'void' */
    947        1.1       cgd 				error(18);
    948        1.1       cgd 				*tpp = gettyp(INT);
    949        1.1       cgd 			}
    950      1.298    rillig 			/*
    951      1.298    rillig 			 * No need to check for incomplete types here as
    952      1.298    rillig 			 * length_in_bits already does this.
    953      1.298    rillig 			 */
    954      1.311    rillig 		} else if (to == NO_TSPEC && t == VOID) {
    955      1.330    rillig 			if (dcs->d_kind == DLK_PROTO_PARAMS) {
    956        1.1       cgd 				if (sym->s_scl != ABSTRACT) {
    957       1.92    rillig 					lint_assert(sym->s_name != unnamed);
    958      1.290    rillig 					/* void parameter '%s' cannot ... */
    959        1.1       cgd 					error(61, sym->s_name);
    960        1.1       cgd 					*tpp = gettyp(INT);
    961        1.1       cgd 				}
    962      1.330    rillig 			} else if (dcs->d_kind == DLK_ABSTRACT) {
    963        1.1       cgd 				/* ok */
    964        1.1       cgd 			} else if (sym->s_scl != TYPEDEF) {
    965      1.133    rillig 				/* void type for '%s' */
    966        1.1       cgd 				error(19, sym->s_name);
    967        1.1       cgd 				*tpp = gettyp(INT);
    968        1.1       cgd 			}
    969        1.1       cgd 		}
    970        1.1       cgd 		if (t == VOID && to != PTR) {
    971        1.1       cgd 			if (tp->t_const || tp->t_volatile) {
    972       1.88    rillig 				/* inappropriate qualifiers with 'void' */
    973        1.1       cgd 				warning(69);
    974      1.122    rillig 				tp->t_const = tp->t_volatile = false;
    975        1.1       cgd 			}
    976        1.1       cgd 		}
    977        1.1       cgd 		tpp = &tp->t_subt;
    978        1.1       cgd 		to = t;
    979        1.1       cgd 	}
    980        1.1       cgd }
    981        1.1       cgd 
    982      1.142    rillig /*
    983      1.142    rillig  * In traditional C, the only portable type for bit-fields is unsigned int.
    984      1.142    rillig  *
    985      1.142    rillig  * In C90, the only allowed types for bit-fields are int, signed int and
    986      1.142    rillig  * unsigned int (3.5.2.1).  There is no mention of implementation-defined
    987      1.142    rillig  * types.
    988      1.142    rillig  *
    989      1.142    rillig  * In C99, the only portable types for bit-fields are _Bool, signed int and
    990      1.142    rillig  * unsigned int (6.7.2.1p4).  In addition, C99 allows "or some other
    991      1.142    rillig  * implementation-defined type".
    992      1.142    rillig  */
    993      1.141    rillig static void
    994      1.390    rillig check_bit_field_type(sym_t *dsym, type_t **inout_tp, tspec_t *inout_t)
    995      1.141    rillig {
    996      1.179    rillig 	type_t *tp = *inout_tp;
    997      1.141    rillig 	tspec_t t = *inout_t;
    998      1.141    rillig 
    999      1.141    rillig 	if (t == CHAR || t == UCHAR || t == SCHAR ||
   1000      1.141    rillig 	    t == SHORT || t == USHORT || t == ENUM) {
   1001      1.350    rillig 		if (!suppress_bitfieldtype) {
   1002      1.280    rillig 			/* TODO: Make this an error in C99 mode as well. */
   1003      1.280    rillig 			if (!allow_trad && !allow_c99) {
   1004      1.294    rillig 				type_t *btp = block_dup_type(tp);
   1005      1.294    rillig 				btp->t_bitfield = false;
   1006      1.378    rillig 				/* bit-field type '%s' invalid in C90 or ... */
   1007      1.294    rillig 				warning(273, type_name(btp));
   1008      1.141    rillig 			} else if (pflag) {
   1009      1.294    rillig 				type_t *btp = block_dup_type(tp);
   1010      1.294    rillig 				btp->t_bitfield = false;
   1011      1.181    rillig 				/* nonportable bit-field type '%s' */
   1012      1.294    rillig 				warning(34, type_name(btp));
   1013      1.141    rillig 			}
   1014      1.141    rillig 		}
   1015      1.311    rillig 	} else if (t == INT && dcs->d_sign_mod == NO_TSPEC) {
   1016      1.350    rillig 		if (pflag && !suppress_bitfieldtype) {
   1017      1.182    rillig 			/* bit-field of type plain 'int' has ... */
   1018      1.182    rillig 			warning(344);
   1019      1.141    rillig 		}
   1020      1.350    rillig 	} else if (!(t == INT || t == UINT || t == BOOL
   1021      1.350    rillig 		|| (is_integer(t) && (suppress_bitfieldtype || allow_gcc)))) {
   1022      1.278    rillig 
   1023      1.294    rillig 		type_t *btp = block_dup_type(tp);
   1024      1.294    rillig 		btp->t_bitfield = false;
   1025  1.403.2.1  perseant 		/* invalid bit-field type '%s' */
   1026      1.294    rillig 		warning(35, type_name(btp));
   1027      1.278    rillig 
   1028      1.322    rillig 		unsigned int width = tp->t_bit_field_width;
   1029      1.278    rillig 		dsym->s_type = tp = block_dup_type(gettyp(t = INT));
   1030      1.322    rillig 		if ((tp->t_bit_field_width = width) > size_in_bits(t))
   1031      1.322    rillig 			tp->t_bit_field_width = size_in_bits(t);
   1032      1.278    rillig 		*inout_t = t;
   1033      1.278    rillig 		*inout_tp = tp;
   1034      1.141    rillig 	}
   1035      1.179    rillig }
   1036      1.179    rillig 
   1037      1.179    rillig static void
   1038      1.390    rillig check_bit_field(sym_t *dsym, tspec_t *inout_t, type_t **inout_tp)
   1039      1.179    rillig {
   1040      1.141    rillig 
   1041      1.179    rillig 	check_bit_field_type(dsym, inout_tp, inout_t);
   1042      1.179    rillig 
   1043      1.322    rillig 	type_t *tp = *inout_tp;
   1044      1.322    rillig 	tspec_t t = *inout_t;
   1045      1.322    rillig 	unsigned int t_width = size_in_bits(t);
   1046      1.322    rillig 	if (tp->t_bit_field_width > t_width) {
   1047  1.403.2.1  perseant 		/* invalid bit-field size: %d */
   1048      1.322    rillig 		error(36, (int)tp->t_bit_field_width);
   1049      1.322    rillig 		tp->t_bit_field_width = t_width;
   1050      1.322    rillig 	} else if (tp->t_bit_field_width == 0 && dsym->s_name != unnamed) {
   1051      1.141    rillig 		/* zero size bit-field */
   1052      1.141    rillig 		error(37);
   1053      1.322    rillig 		tp->t_bit_field_width = t_width;
   1054      1.141    rillig 	}
   1055      1.303    rillig 	if (dsym->s_scl == UNION_MEMBER) {
   1056      1.244    rillig 		/* bit-field in union is very unusual */
   1057      1.241  christos 		warning(41);
   1058      1.141    rillig 		dsym->s_type->t_bitfield = false;
   1059      1.141    rillig 		dsym->s_bitfield = false;
   1060      1.141    rillig 	}
   1061      1.141    rillig }
   1062      1.141    rillig 
   1063      1.401    rillig /* Aligns the next structure member as required. */
   1064      1.364    rillig static void
   1065      1.364    rillig dcs_align(unsigned int member_alignment, unsigned int bit_field_width)
   1066      1.364    rillig {
   1067      1.364    rillig 
   1068      1.401    rillig 	if (member_alignment > dcs->d_sou_align)
   1069      1.401    rillig 		dcs->d_sou_align = member_alignment;
   1070      1.364    rillig 
   1071      1.401    rillig 	unsigned align_in_bits = member_alignment * CHAR_SIZE;
   1072      1.401    rillig 	unsigned offset = (dcs->d_sou_size_in_bits + align_in_bits - 1)
   1073      1.401    rillig 	    & -align_in_bits;
   1074      1.364    rillig 	if (bit_field_width == 0
   1075      1.364    rillig 	    || dcs->d_sou_size_in_bits + bit_field_width > offset)
   1076      1.364    rillig 		dcs->d_sou_size_in_bits = offset;
   1077      1.402    rillig 	debug_func_dcs(__func__);
   1078      1.364    rillig }
   1079      1.364    rillig 
   1080      1.329    rillig /* Add a member to the struct or union type that is being built in 'dcs'. */
   1081      1.329    rillig static void
   1082      1.329    rillig dcs_add_member(sym_t *mem)
   1083      1.329    rillig {
   1084      1.329    rillig 	type_t *tp = mem->s_type;
   1085      1.329    rillig 
   1086      1.338    rillig 	unsigned int union_size = 0;
   1087      1.330    rillig 	if (dcs->d_kind == DLK_UNION) {
   1088      1.338    rillig 		union_size = dcs->d_sou_size_in_bits;
   1089      1.338    rillig 		dcs->d_sou_size_in_bits = 0;
   1090      1.329    rillig 	}
   1091      1.329    rillig 
   1092      1.329    rillig 	if (mem->s_bitfield) {
   1093      1.401    rillig 		dcs_align(alignment(tp), tp->t_bit_field_width);
   1094      1.329    rillig 		// XXX: Why round down?
   1095      1.338    rillig 		mem->u.s_member.sm_offset_in_bits = dcs->d_sou_size_in_bits
   1096      1.338    rillig 		    - dcs->d_sou_size_in_bits % size_in_bits(tp->t_tspec);
   1097      1.338    rillig 		tp->t_bit_field_offset = dcs->d_sou_size_in_bits
   1098      1.329    rillig 		    - mem->u.s_member.sm_offset_in_bits;
   1099      1.338    rillig 		dcs->d_sou_size_in_bits += tp->t_bit_field_width;
   1100      1.329    rillig 	} else {
   1101      1.401    rillig 		unsigned int align = dcs->d_mem_align > 0
   1102      1.401    rillig 		    ? dcs->d_mem_align : alignment(tp);
   1103      1.401    rillig 		dcs_align(align, 0);
   1104      1.338    rillig 		mem->u.s_member.sm_offset_in_bits = dcs->d_sou_size_in_bits;
   1105      1.338    rillig 		dcs->d_sou_size_in_bits += type_size_in_bits(tp);
   1106      1.329    rillig 	}
   1107      1.329    rillig 
   1108      1.338    rillig 	if (union_size > dcs->d_sou_size_in_bits)
   1109      1.338    rillig 		dcs->d_sou_size_in_bits = union_size;
   1110      1.369    rillig 
   1111      1.402    rillig 	debug_func_dcs(__func__);
   1112      1.329    rillig }
   1113      1.329    rillig 
   1114      1.329    rillig sym_t *
   1115      1.329    rillig declare_unnamed_member(void)
   1116      1.329    rillig {
   1117      1.329    rillig 
   1118      1.358    rillig 	sym_t *mem = block_zero_alloc(sizeof(*mem), "sym");
   1119      1.329    rillig 	mem->s_name = unnamed;
   1120      1.389    rillig 	mem->s_kind = SK_MEMBER;
   1121      1.359    rillig 	mem->s_scl = dcs->d_kind == DLK_STRUCT ? STRUCT_MEMBER : UNION_MEMBER;
   1122      1.359    rillig 	mem->s_block_level = -1;
   1123      1.329    rillig 	mem->s_type = dcs->d_type;
   1124      1.396    rillig 	mem->u.s_member.sm_containing_type = dcs->d_tag_type->u.sou;
   1125      1.329    rillig 
   1126      1.329    rillig 	dcs_add_member(mem);
   1127      1.350    rillig 	suppress_bitfieldtype = false;
   1128      1.329    rillig 	return mem;
   1129      1.329    rillig }
   1130      1.329    rillig 
   1131        1.1       cgd sym_t *
   1132      1.320    rillig declare_member(sym_t *dsym)
   1133        1.1       cgd {
   1134        1.1       cgd 
   1135      1.274    rillig 	lint_assert(is_member(dsym));
   1136        1.1       cgd 
   1137      1.369    rillig 	sym_t *rdsym = dcs->d_redeclared_symbol;
   1138      1.369    rillig 	if (rdsym != NULL) {
   1139      1.369    rillig 		debug_sym("rdsym: ", rdsym, "\n");
   1140      1.369    rillig 		lint_assert(is_member(rdsym));
   1141      1.153    rillig 
   1142      1.333    rillig 		if (dsym->u.s_member.sm_containing_type ==
   1143      1.369    rillig 		    rdsym->u.s_member.sm_containing_type) {
   1144      1.289    rillig 			/* duplicate member name '%s' */
   1145        1.1       cgd 			error(33, dsym->s_name);
   1146      1.397    rillig 			symtab_remove_forever(rdsym);
   1147        1.1       cgd 		}
   1148        1.1       cgd 	}
   1149        1.1       cgd 
   1150       1.75    rillig 	check_type(dsym);
   1151        1.1       cgd 
   1152      1.327    rillig 	type_t *tp = dsym->s_type;
   1153      1.327    rillig 	tspec_t t = tp->t_tspec;
   1154      1.298    rillig 	if (dsym->s_bitfield)
   1155      1.327    rillig 		check_bit_field(dsym, &t, &tp);
   1156      1.298    rillig 	else if (t == FUNC) {
   1157  1.403.2.1  perseant 		/* function invalid in structure or union */
   1158        1.1       cgd 		error(38);
   1159      1.247    rillig 		dsym->s_type = tp = block_derive_type(tp, t = PTR);
   1160        1.1       cgd 	}
   1161        1.1       cgd 
   1162        1.1       cgd 	/*
   1163      1.270    rillig 	 * bit-fields of length 0 are not warned about because length_in_bits
   1164      1.382    rillig 	 * does not return the length of the bit-field but the length of the
   1165      1.382    rillig 	 * type the bit-field is packed in (it's ok)
   1166        1.1       cgd 	 */
   1167      1.327    rillig 	int sz = length_in_bits(dsym->s_type, dsym->s_name);
   1168      1.396    rillig 	if (sz == 0 && t == ARRAY && dsym->s_type->u.dimension == 0)
   1169      1.379    rillig 		/* zero-sized array '%s' in struct requires C99 or later */
   1170      1.327    rillig 		c99ism(39, dsym->s_name);
   1171        1.1       cgd 
   1172      1.329    rillig 	dcs_add_member(dsym);
   1173        1.1       cgd 
   1174      1.124    rillig 	check_function_definition(dsym, false);
   1175       1.26   thorpej 
   1176      1.350    rillig 	suppress_bitfieldtype = false;
   1177        1.1       cgd 
   1178       1.76    rillig 	return dsym;
   1179        1.1       cgd }
   1180        1.1       cgd 
   1181        1.1       cgd sym_t *
   1182      1.322    rillig set_bit_field_width(sym_t *dsym, int bit_field_width)
   1183        1.1       cgd {
   1184       1.22     lukem 
   1185        1.1       cgd 	if (dsym == NULL) {
   1186      1.358    rillig 		dsym = block_zero_alloc(sizeof(*dsym), "sym");
   1187        1.1       cgd 		dsym->s_name = unnamed;
   1188      1.389    rillig 		dsym->s_kind = SK_MEMBER;
   1189      1.303    rillig 		dsym->s_scl = STRUCT_MEMBER;
   1190       1.20  sommerfe 		dsym->s_type = gettyp(UINT);
   1191      1.144    rillig 		dsym->s_block_level = -1;
   1192      1.396    rillig 		lint_assert(dcs->d_tag_type->u.sou != NULL);
   1193      1.396    rillig 		dsym->u.s_member.sm_containing_type = dcs->d_tag_type->u.sou;
   1194        1.1       cgd 	}
   1195      1.247    rillig 	dsym->s_type = block_dup_type(dsym->s_type);
   1196      1.108    rillig 	dsym->s_type->t_bitfield = true;
   1197      1.322    rillig 	dsym->s_type->t_bit_field_width = bit_field_width;
   1198      1.122    rillig 	dsym->s_bitfield = true;
   1199      1.369    rillig 	debug_sym("set_bit_field_width: ", dsym, "\n");
   1200       1.76    rillig 	return dsym;
   1201        1.1       cgd }
   1202        1.1       cgd 
   1203      1.354    rillig void
   1204      1.354    rillig add_type_qualifiers(type_qualifiers *dst, type_qualifiers src)
   1205      1.354    rillig {
   1206      1.354    rillig 
   1207      1.354    rillig 	if (src.tq_const && dst->tq_const)
   1208      1.354    rillig 		/* duplicate '%s' */
   1209      1.354    rillig 		warning(10, "const");
   1210      1.354    rillig 	if (src.tq_volatile && dst->tq_volatile)
   1211      1.354    rillig 		/* duplicate '%s' */
   1212      1.354    rillig 		warning(10, "volatile");
   1213      1.354    rillig 
   1214      1.356    rillig 	dst->tq_const = dst->tq_const | src.tq_const;
   1215      1.356    rillig 	dst->tq_restrict = dst->tq_restrict | src.tq_restrict;
   1216      1.356    rillig 	dst->tq_volatile = dst->tq_volatile | src.tq_volatile;
   1217      1.356    rillig 	dst->tq_atomic = dst->tq_atomic | src.tq_atomic;
   1218      1.369    rillig 	debug_step("%s: '%s'", __func__, type_qualifiers_string(*dst));
   1219      1.354    rillig }
   1220      1.354    rillig 
   1221      1.190    rillig qual_ptr *
   1222      1.354    rillig append_qualified_pointer(qual_ptr *p1, qual_ptr *p2)
   1223        1.1       cgd {
   1224        1.1       cgd 
   1225      1.354    rillig 	qual_ptr *tail = p2;
   1226      1.354    rillig 	while (tail->p_next != NULL)
   1227      1.354    rillig 		tail = tail->p_next;
   1228      1.354    rillig 	tail->p_next = p1;
   1229      1.354    rillig 	return p2;
   1230        1.1       cgd }
   1231        1.1       cgd 
   1232      1.263    rillig static type_t *
   1233      1.263    rillig block_derive_pointer(type_t *stp, bool is_const, bool is_volatile)
   1234      1.263    rillig {
   1235      1.263    rillig 
   1236      1.327    rillig 	type_t *tp = block_derive_type(stp, PTR);
   1237      1.263    rillig 	tp->t_const = is_const;
   1238      1.263    rillig 	tp->t_volatile = is_volatile;
   1239      1.369    rillig 	debug_step("%s: '%s'", __func__, type_name(tp));
   1240      1.263    rillig 	return tp;
   1241      1.263    rillig }
   1242      1.263    rillig 
   1243        1.1       cgd sym_t *
   1244      1.190    rillig add_pointer(sym_t *decl, qual_ptr *p)
   1245        1.1       cgd {
   1246        1.1       cgd 
   1247      1.371    rillig 	debug_dcs();
   1248      1.258    rillig 
   1249      1.298    rillig 	type_t **tpp = &decl->s_type;
   1250      1.376    rillig 	lint_assert(*tpp != NULL);
   1251      1.376    rillig 	while (*tpp != dcs->d_type) {
   1252        1.1       cgd 		tpp = &(*tpp)->t_subt;
   1253      1.376    rillig 		lint_assert(*tpp != NULL);
   1254      1.255    rillig 	}
   1255        1.1       cgd 
   1256      1.190    rillig 	while (p != NULL) {
   1257      1.263    rillig 		*tpp = block_derive_pointer(dcs->d_type,
   1258      1.354    rillig 		    p->qualifiers.tq_const, p->qualifiers.tq_volatile);
   1259      1.261    rillig 
   1260      1.263    rillig 		tpp = &(*tpp)->t_subt;
   1261      1.261    rillig 
   1262      1.298    rillig 		qual_ptr *next = p->p_next;
   1263      1.190    rillig 		free(p);
   1264      1.190    rillig 		p = next;
   1265        1.1       cgd 	}
   1266      1.402    rillig 	debug_step("%s: '%s'", __func__, type_name(decl->s_type));
   1267       1.76    rillig 	return decl;
   1268        1.1       cgd }
   1269        1.1       cgd 
   1270      1.263    rillig static type_t *
   1271      1.397    rillig block_derive_array(type_t *stp, bool has_dim, int dim)
   1272      1.263    rillig {
   1273      1.263    rillig 
   1274      1.298    rillig 	type_t *tp = block_derive_type(stp, ARRAY);
   1275      1.397    rillig 	tp->u.dimension = dim;
   1276      1.263    rillig 
   1277      1.268    rillig #if 0
   1278      1.268    rillig 	/*
   1279      1.397    rillig 	 * When the type of the declaration 'void *b[4]' is constructed (see
   1280      1.397    rillig 	 * add_function, add_array, add_pointer), the intermediate type
   1281      1.397    rillig 	 * 'void[4]' is invalid and only later gets the '*' inserted in the
   1282      1.397    rillig 	 * middle of the type.  Due to the invalid intermediate type, this
   1283      1.397    rillig 	 * check cannot be enabled yet.
   1284      1.268    rillig 	 */
   1285      1.268    rillig 	if (stp->t_tspec == VOID) {
   1286      1.268    rillig 		/* array of incomplete type */
   1287      1.268    rillig 		error(301);
   1288      1.268    rillig 		tp->t_subt = gettyp(CHAR);
   1289      1.268    rillig 	}
   1290      1.268    rillig #endif
   1291      1.397    rillig 	if (dim < 0)
   1292      1.263    rillig 		/* negative array dimension (%d) */
   1293      1.397    rillig 		error(20, dim);
   1294      1.397    rillig 	else if (dim == 0 && has_dim)
   1295      1.379    rillig 		/* zero sized array requires C99 or later */
   1296      1.263    rillig 		c99ism(322);
   1297      1.397    rillig 	else if (dim == 0 && !has_dim)
   1298      1.263    rillig 		tp->t_incomplete_array = true;
   1299      1.263    rillig 
   1300      1.369    rillig 	debug_step("%s: '%s'", __func__, type_name(tp));
   1301      1.263    rillig 	return tp;
   1302      1.263    rillig }
   1303      1.263    rillig 
   1304        1.1       cgd sym_t *
   1305      1.397    rillig add_array(sym_t *decl, bool has_dim, int dim)
   1306        1.1       cgd {
   1307        1.1       cgd 
   1308      1.371    rillig 	debug_dcs();
   1309      1.258    rillig 
   1310      1.298    rillig 	type_t **tpp = &decl->s_type;
   1311      1.376    rillig 	lint_assert(*tpp != NULL);
   1312      1.376    rillig 	while (*tpp != dcs->d_type) {
   1313        1.1       cgd 		tpp = &(*tpp)->t_subt;
   1314      1.376    rillig 		lint_assert(*tpp != NULL);
   1315      1.255    rillig 	}
   1316        1.1       cgd 
   1317      1.397    rillig 	*tpp = block_derive_array(dcs->d_type, has_dim, dim);
   1318        1.1       cgd 
   1319      1.369    rillig 	debug_step("%s: '%s'", __func__, type_name(decl->s_type));
   1320       1.76    rillig 	return decl;
   1321        1.1       cgd }
   1322        1.1       cgd 
   1323      1.263    rillig static type_t *
   1324  1.403.2.1  perseant block_derive_function(type_t *ret, bool proto, sym_t *params, bool vararg,
   1325  1.403.2.1  perseant     bool noreturn)
   1326      1.263    rillig {
   1327      1.263    rillig 
   1328      1.298    rillig 	type_t *tp = block_derive_type(ret, FUNC);
   1329      1.263    rillig 	tp->t_proto = proto;
   1330      1.263    rillig 	if (proto)
   1331      1.396    rillig 		tp->u.params = params;
   1332  1.403.2.1  perseant 	tp->t_noreturn = noreturn;
   1333      1.263    rillig 	tp->t_vararg = vararg;
   1334      1.369    rillig 	debug_step("%s: '%s'", __func__, type_name(tp));
   1335      1.263    rillig 	return tp;
   1336      1.263    rillig }
   1337      1.263    rillig 
   1338      1.377    rillig static const char *
   1339      1.377    rillig tag_name(scl_t sc)
   1340      1.377    rillig {
   1341      1.377    rillig 	return sc == STRUCT_TAG ? "struct"
   1342      1.377    rillig 	    : sc == UNION_TAG ? "union"
   1343      1.377    rillig 	    : "enum";
   1344      1.377    rillig }
   1345      1.377    rillig 
   1346      1.364    rillig static void
   1347      1.364    rillig check_prototype_parameters(sym_t *args)
   1348      1.364    rillig {
   1349      1.364    rillig 
   1350      1.364    rillig 	for (sym_t *sym = dcs->d_first_dlsym;
   1351      1.381    rillig 	    sym != NULL; sym = sym->s_level_next) {
   1352      1.364    rillig 		scl_t sc = sym->s_scl;
   1353      1.392    rillig 		if (sc == STRUCT_TAG || sc == UNION_TAG || sc == ENUM_TAG)
   1354      1.364    rillig 			/* dubious tag declaration '%s %s' */
   1355      1.377    rillig 			warning(85, tag_name(sc), sym->s_name);
   1356      1.364    rillig 	}
   1357      1.364    rillig 
   1358      1.364    rillig 	for (sym_t *arg = args; arg != NULL; arg = arg->s_next) {
   1359      1.364    rillig 		if (arg->s_type->t_tspec == VOID &&
   1360      1.364    rillig 		    !(arg == args && arg->s_next == NULL)) {
   1361      1.364    rillig 			/* void must be sole parameter */
   1362      1.364    rillig 			error(60);
   1363      1.364    rillig 			arg->s_type = gettyp(INT);
   1364      1.364    rillig 		}
   1365      1.364    rillig 	}
   1366      1.364    rillig }
   1367      1.364    rillig 
   1368      1.364    rillig static void
   1369      1.374    rillig old_style_function(sym_t *decl, sym_t *params)
   1370      1.364    rillig {
   1371      1.364    rillig 
   1372      1.364    rillig 	/*
   1373      1.364    rillig 	 * Remember the list of parameters only if this really seems to be a
   1374      1.364    rillig 	 * function definition.
   1375      1.364    rillig 	 */
   1376      1.364    rillig 	if (dcs->d_enclosing->d_kind == DLK_EXTERN &&
   1377      1.364    rillig 	    decl->s_type == dcs->d_enclosing->d_type) {
   1378      1.364    rillig 		/*
   1379      1.364    rillig 		 * Assume that this becomes a function definition. If not, it
   1380      1.364    rillig 		 * will be corrected in check_function_definition.
   1381      1.364    rillig 		 */
   1382      1.374    rillig 		if (params != NULL) {
   1383      1.364    rillig 			decl->s_osdef = true;
   1384      1.374    rillig 			decl->u.s_old_style_params = params;
   1385      1.364    rillig 		}
   1386      1.364    rillig 	} else {
   1387      1.374    rillig 		if (params != NULL)
   1388      1.364    rillig 			/* function prototype parameters must have types */
   1389      1.364    rillig 			warning(62);
   1390      1.364    rillig 	}
   1391      1.364    rillig }
   1392      1.364    rillig 
   1393        1.1       cgd sym_t *
   1394      1.395    rillig add_function(sym_t *decl, parameter_list params)
   1395        1.1       cgd {
   1396        1.1       cgd 
   1397      1.258    rillig 	debug_enter();
   1398      1.371    rillig 	debug_dcs_all();
   1399      1.258    rillig 	debug_sym("decl: ", decl, "\n");
   1400      1.258    rillig #ifdef DEBUG
   1401      1.393    rillig 	for (const sym_t *p = params.first; p != NULL; p = p->s_next)
   1402      1.393    rillig 		debug_sym("param: ", p, "\n");
   1403      1.258    rillig #endif
   1404      1.258    rillig 
   1405  1.403.2.1  perseant 	if (params.identifier && allow_c23)
   1406  1.403.2.1  perseant 		/* function definition for '%s' with identifier list is ... */
   1407  1.403.2.1  perseant 		error_at(384, &decl->s_def_pos, decl->s_name);
   1408  1.403.2.1  perseant 	else if (params.identifier && allow_c99)
   1409  1.403.2.1  perseant 		/* function definition for '%s' with identifier list is ... */
   1410  1.403.2.1  perseant 		warning_at(384, &decl->s_def_pos, decl->s_name);
   1411  1.403.2.1  perseant 
   1412      1.363    rillig 	if (params.prototype) {
   1413      1.279    rillig 		if (!allow_c90)
   1414  1.403.2.1  perseant 			/* function prototypes require C90 or later */
   1415        1.1       cgd 			warning(270);
   1416      1.363    rillig 		check_prototype_parameters(params.first);
   1417      1.363    rillig 		if (params.first != NULL
   1418      1.363    rillig 		    && params.first->s_type->t_tspec == VOID)
   1419      1.363    rillig 			params.first = NULL;
   1420      1.327    rillig 	} else
   1421      1.363    rillig 		old_style_function(decl, params.first);
   1422  1.403.2.1  perseant 	if (params.used)
   1423  1.403.2.1  perseant 		decl->s_used = true;
   1424        1.1       cgd 
   1425        1.1       cgd 	/*
   1426      1.160    rillig 	 * The symbols are removed from the symbol table by
   1427      1.382    rillig 	 * end_declaration_level after add_function. To be able to restore them
   1428      1.382    rillig 	 * if this is a function definition, a pointer to the list of all
   1429      1.382    rillig 	 * symbols is stored in dcs->d_enclosing->d_func_proto_syms. Also, a
   1430      1.382    rillig 	 * list of the parameters (concatenated by s_next) is stored in
   1431      1.374    rillig 	 * dcs->d_enclosing->d_func_params. (dcs->d_enclosing must be used
   1432      1.259    rillig 	 * because *dcs is the declaration stack element created for the list
   1433      1.259    rillig 	 * of params and is removed after add_function.)
   1434      1.259    rillig 	 */
   1435      1.330    rillig 	if (dcs->d_enclosing->d_kind == DLK_EXTERN &&
   1436      1.259    rillig 	    decl->s_type == dcs->d_enclosing->d_type) {
   1437      1.323    rillig 		dcs->d_enclosing->d_func_proto_syms = dcs->d_first_dlsym;
   1438      1.374    rillig 		dcs->d_enclosing->d_func_params = params.first;
   1439      1.372    rillig 		debug_dcs_all();
   1440        1.1       cgd 	}
   1441        1.1       cgd 
   1442      1.298    rillig 	type_t **tpp = &decl->s_type;
   1443      1.376    rillig 	lint_assert(*tpp != NULL);
   1444      1.376    rillig 	while (*tpp != dcs->d_enclosing->d_type) {
   1445        1.1       cgd 		tpp = &(*tpp)->t_subt;
   1446      1.376    rillig 		lint_assert(*tpp != NULL);
   1447      1.255    rillig 	}
   1448        1.1       cgd 
   1449      1.263    rillig 	*tpp = block_derive_function(dcs->d_enclosing->d_type,
   1450  1.403.2.1  perseant 	    params.prototype, params.first, params.vararg,
   1451  1.403.2.1  perseant 	    params.noreturn || dcs->d_enclosing->d_noreturn);
   1452        1.1       cgd 
   1453      1.261    rillig 	debug_step("add_function: '%s'", type_name(decl->s_type));
   1454      1.371    rillig 	debug_dcs_all();
   1455      1.258    rillig 	debug_leave();
   1456       1.76    rillig 	return decl;
   1457        1.1       cgd }
   1458        1.1       cgd 
   1459      1.364    rillig /*
   1460      1.364    rillig  * In a function declaration, a list of identifiers (as opposed to a list of
   1461      1.364    rillig  * types) is allowed only if it's also a function definition.
   1462      1.364    rillig  */
   1463      1.364    rillig void
   1464      1.364    rillig check_function_definition(sym_t *sym, bool msg)
   1465        1.1       cgd {
   1466        1.1       cgd 
   1467      1.364    rillig 	if (sym->s_osdef) {
   1468      1.392    rillig 		if (msg)
   1469      1.364    rillig 			/* incomplete or misplaced function definition */
   1470      1.364    rillig 			error(22);
   1471      1.364    rillig 		sym->s_osdef = false;
   1472      1.374    rillig 		sym->u.s_old_style_params = NULL;
   1473        1.1       cgd 	}
   1474      1.364    rillig }
   1475        1.1       cgd 
   1476      1.364    rillig /* The symbol gets a storage class and a definedness. */
   1477        1.1       cgd sym_t *
   1478       1.75    rillig declarator_name(sym_t *sym)
   1479        1.1       cgd {
   1480      1.380    rillig 	scl_t sc = NO_SCL;
   1481        1.1       cgd 
   1482      1.380    rillig 	if (sym->s_scl == NO_SCL)
   1483      1.154    rillig 		dcs->d_redeclared_symbol = NULL;
   1484      1.374    rillig 	else if (sym->s_defparam) {
   1485      1.374    rillig 		sym->s_defparam = false;
   1486      1.154    rillig 		dcs->d_redeclared_symbol = NULL;
   1487        1.1       cgd 	} else {
   1488      1.154    rillig 		dcs->d_redeclared_symbol = sym;
   1489      1.385    rillig 		if (is_query_enabled[16]
   1490      1.385    rillig 		    && sym->s_scl == STATIC && dcs->d_scl != STATIC) {
   1491      1.385    rillig 			/* '%s' was declared 'static', now non-'static' */
   1492      1.385    rillig 			query_message(16, sym->s_name);
   1493      1.385    rillig 			print_previous_declaration(sym);
   1494      1.385    rillig 		}
   1495        1.1       cgd 		sym = pushdown(sym);
   1496        1.1       cgd 	}
   1497        1.1       cgd 
   1498      1.276    rillig 	switch (dcs->d_kind) {
   1499      1.330    rillig 	case DLK_STRUCT:
   1500      1.330    rillig 	case DLK_UNION:
   1501      1.396    rillig 		sym->u.s_member.sm_containing_type = dcs->d_tag_type->u.sou;
   1502        1.1       cgd 		sym->s_def = DEF;
   1503      1.330    rillig 		sc = dcs->d_kind == DLK_STRUCT ? STRUCT_MEMBER : UNION_MEMBER;
   1504        1.1       cgd 		break;
   1505      1.330    rillig 	case DLK_EXTERN:
   1506        1.1       cgd 		/*
   1507      1.352    rillig 		 * Symbols that are 'static' or without any storage class are
   1508      1.352    rillig 		 * tentatively defined. Symbols that are tentatively defined or
   1509      1.352    rillig 		 * declared may later become defined if an initializer is seen
   1510      1.352    rillig 		 * or this is a function definition.
   1511        1.1       cgd 		 */
   1512      1.352    rillig 		sc = dcs->d_scl;
   1513      1.380    rillig 		if (sc == NO_SCL || sc == THREAD_LOCAL) {
   1514        1.1       cgd 			sc = EXTERN;
   1515        1.1       cgd 			sym->s_def = TDEF;
   1516      1.298    rillig 		} else if (sc == STATIC)
   1517        1.1       cgd 			sym->s_def = TDEF;
   1518      1.298    rillig 		else if (sc == TYPEDEF)
   1519        1.1       cgd 			sym->s_def = DEF;
   1520      1.298    rillig 		else {
   1521       1.93    rillig 			lint_assert(sc == EXTERN);
   1522        1.1       cgd 			sym->s_def = DECL;
   1523        1.1       cgd 		}
   1524        1.1       cgd 		break;
   1525      1.330    rillig 	case DLK_PROTO_PARAMS:
   1526      1.374    rillig 		sym->s_param = true;
   1527        1.1       cgd 		/* FALLTHROUGH */
   1528      1.374    rillig 	case DLK_OLD_STYLE_PARAMS:
   1529      1.380    rillig 		lint_assert(dcs->d_scl == NO_SCL || dcs->d_scl == REG);
   1530      1.373    rillig 		sym->s_register = dcs->d_scl == REG;
   1531      1.373    rillig 		sc = AUTO;
   1532        1.1       cgd 		sym->s_def = DEF;
   1533        1.1       cgd 		break;
   1534      1.330    rillig 	case DLK_AUTO:
   1535      1.380    rillig 		if ((sc = dcs->d_scl) == NO_SCL) {
   1536        1.1       cgd 			/*
   1537      1.327    rillig 			 * XXX somewhat ugly because we don't know whether this
   1538      1.327    rillig 			 * is AUTO or EXTERN (functions). If we are wrong, it
   1539      1.327    rillig 			 * must be corrected in declare_local, when the
   1540      1.327    rillig 			 * necessary type information is available.
   1541        1.1       cgd 			 */
   1542        1.1       cgd 			sc = AUTO;
   1543        1.1       cgd 			sym->s_def = DEF;
   1544      1.353    rillig 		} else if (sc == AUTO || sc == STATIC || sc == TYPEDEF
   1545      1.353    rillig 		    || sc == THREAD_LOCAL)
   1546        1.1       cgd 			sym->s_def = DEF;
   1547      1.298    rillig 		else if (sc == REG) {
   1548      1.249    rillig 			sym->s_register = true;
   1549        1.1       cgd 			sc = AUTO;
   1550        1.1       cgd 			sym->s_def = DEF;
   1551       1.93    rillig 		} else {
   1552       1.93    rillig 			lint_assert(sc == EXTERN);
   1553        1.1       cgd 			sym->s_def = DECL;
   1554        1.1       cgd 		}
   1555        1.1       cgd 		break;
   1556      1.327    rillig 	default:
   1557      1.330    rillig 		lint_assert(dcs->d_kind == DLK_ABSTRACT);
   1558      1.327    rillig 		/* try to continue after syntax errors */
   1559      1.380    rillig 		sc = NO_SCL;
   1560        1.1       cgd 	}
   1561        1.1       cgd 	sym->s_scl = sc;
   1562        1.1       cgd 
   1563        1.3       jpo 	sym->s_type = dcs->d_type;
   1564  1.403.2.1  perseant 	if (dcs->d_used)
   1565  1.403.2.1  perseant 		sym->s_used = true;
   1566        1.1       cgd 
   1567      1.156    rillig 	dcs->d_func_proto_syms = NULL;
   1568        1.1       cgd 
   1569      1.369    rillig 	debug_sym("declarator_name: ", sym, "\n");
   1570      1.402    rillig 	debug_func_dcs(__func__);
   1571       1.76    rillig 	return sym;
   1572        1.1       cgd }
   1573        1.1       cgd 
   1574        1.1       cgd sym_t *
   1575      1.327    rillig old_style_function_parameter_name(sym_t *sym)
   1576        1.1       cgd {
   1577       1.22     lukem 
   1578      1.380    rillig 	if (sym->s_scl != NO_SCL) {
   1579      1.144    rillig 		if (block_level == sym->s_block_level) {
   1580      1.285    rillig 			/* redeclaration of formal parameter '%s' */
   1581        1.1       cgd 			error(21, sym->s_name);
   1582      1.374    rillig 			lint_assert(sym->s_defparam);
   1583        1.1       cgd 		}
   1584        1.1       cgd 		sym = pushdown(sym);
   1585        1.1       cgd 	}
   1586        1.1       cgd 	sym->s_type = gettyp(INT);
   1587        1.1       cgd 	sym->s_scl = AUTO;
   1588        1.1       cgd 	sym->s_def = DEF;
   1589      1.374    rillig 	sym->s_defparam = true;
   1590      1.374    rillig 	sym->s_param = true;
   1591      1.369    rillig 	debug_sym("old_style_function_parameter_name: ", sym, "\n");
   1592       1.76    rillig 	return sym;
   1593        1.1       cgd }
   1594        1.1       cgd 
   1595      1.327    rillig /*-
   1596      1.364    rillig  * Checks all possible cases of tag redeclarations.
   1597      1.364    rillig  *
   1598      1.364    rillig  * decl		whether T_LBRACE follows
   1599      1.364    rillig  * semi		whether T_SEMI follows
   1600      1.364    rillig  */
   1601      1.364    rillig static sym_t *
   1602      1.364    rillig new_tag(sym_t *tag, scl_t scl, bool decl, bool semi)
   1603      1.364    rillig {
   1604      1.364    rillig 
   1605      1.364    rillig 	if (tag->s_block_level < block_level) {
   1606      1.364    rillig 		if (semi) {
   1607      1.364    rillig 			/* "struct a;" */
   1608      1.364    rillig 			if (allow_c90) {
   1609      1.364    rillig 				/* XXX: Why is this warning suppressed in C90 mode? */
   1610      1.364    rillig 				if (allow_trad || allow_c99)
   1611      1.364    rillig 					/* declaration of '%s %s' intro... */
   1612      1.377    rillig 					warning(44, tag_name(scl),
   1613      1.364    rillig 					    tag->s_name);
   1614      1.364    rillig 				tag = pushdown(tag);
   1615      1.392    rillig 			} else if (tag->s_scl != scl)
   1616      1.364    rillig 				/* base type is really '%s %s' */
   1617      1.377    rillig 				warning(45, tag_name(tag->s_scl), tag->s_name);
   1618      1.364    rillig 			dcs->d_enclosing->d_nonempty_decl = true;
   1619      1.364    rillig 		} else if (decl) {
   1620      1.364    rillig 			/* "struct a { ... } " */
   1621      1.364    rillig 			if (hflag)
   1622      1.364    rillig 				/* redefinition of '%s' hides earlier one */
   1623      1.364    rillig 				warning(43, tag->s_name);
   1624      1.364    rillig 			tag = pushdown(tag);
   1625      1.364    rillig 			dcs->d_enclosing->d_nonempty_decl = true;
   1626      1.364    rillig 		} else if (tag->s_scl != scl) {
   1627      1.364    rillig 			/* base type is really '%s %s' */
   1628      1.377    rillig 			warning(45, tag_name(tag->s_scl), tag->s_name);
   1629      1.364    rillig 			/* XXX: Why is this warning suppressed in C90 mode? */
   1630      1.392    rillig 			if (allow_trad || allow_c99)
   1631      1.364    rillig 				/* declaration of '%s %s' introduces ... */
   1632      1.377    rillig 				warning(44, tag_name(scl), tag->s_name);
   1633      1.364    rillig 			tag = pushdown(tag);
   1634      1.364    rillig 			dcs->d_enclosing->d_nonempty_decl = true;
   1635      1.364    rillig 		}
   1636      1.364    rillig 	} else {
   1637      1.364    rillig 		if (tag->s_scl != scl ||
   1638      1.364    rillig 		    (decl && !is_incomplete(tag->s_type))) {
   1639      1.364    rillig 			/* %s tag '%s' redeclared as %s */
   1640      1.377    rillig 			error(46, tag_name(tag->s_scl),
   1641      1.377    rillig 			    tag->s_name, tag_name(scl));
   1642      1.364    rillig 			print_previous_declaration(tag);
   1643      1.364    rillig 			tag = pushdown(tag);
   1644      1.364    rillig 			dcs->d_enclosing->d_nonempty_decl = true;
   1645      1.364    rillig 		} else if (semi || decl)
   1646      1.364    rillig 			dcs->d_enclosing->d_nonempty_decl = true;
   1647      1.364    rillig 	}
   1648      1.369    rillig 	debug_sym("new_tag: ", tag, "\n");
   1649      1.402    rillig 	debug_dcs_all();
   1650      1.364    rillig 	return tag;
   1651      1.364    rillig }
   1652      1.364    rillig 
   1653      1.364    rillig /*-
   1654      1.327    rillig  * tag		the symbol table entry of the tag
   1655      1.327    rillig  * kind		the kind of the tag (STRUCT/UNION/ENUM)
   1656      1.327    rillig  * decl		whether the tag type will be completed in this declaration
   1657      1.327    rillig  *		(when the following token is T_LBRACE)
   1658      1.327    rillig  * semi		whether the following token is T_SEMI
   1659        1.1       cgd  */
   1660        1.1       cgd type_t *
   1661      1.297    rillig make_tag_type(sym_t *tag, tspec_t kind, bool decl, bool semi)
   1662        1.1       cgd {
   1663      1.316    rillig 	scl_t scl;
   1664      1.316    rillig 	type_t *tp;
   1665        1.1       cgd 
   1666      1.298    rillig 	if (kind == STRUCT)
   1667      1.137    rillig 		scl = STRUCT_TAG;
   1668      1.298    rillig 	else if (kind == UNION)
   1669      1.137    rillig 		scl = UNION_TAG;
   1670      1.298    rillig 	else {
   1671       1.92    rillig 		lint_assert(kind == ENUM);
   1672      1.137    rillig 		scl = ENUM_TAG;
   1673        1.1       cgd 	}
   1674        1.1       cgd 
   1675        1.1       cgd 	if (tag != NULL) {
   1676      1.380    rillig 		if (tag->s_scl != NO_SCL)
   1677      1.297    rillig 			tag = new_tag(tag, scl, decl, semi);
   1678      1.298    rillig 		else {
   1679        1.1       cgd 			/* a new tag, no empty declaration */
   1680      1.259    rillig 			dcs->d_enclosing->d_nonempty_decl = true;
   1681      1.137    rillig 			if (scl == ENUM_TAG && !decl) {
   1682      1.280    rillig 				/* TODO: Make this an error in C99 mode as well. */
   1683      1.298    rillig 				if (allow_c90 &&
   1684      1.298    rillig 				    ((!allow_trad && !allow_c99) || pflag))
   1685        1.1       cgd 					/* forward reference to enum type */
   1686        1.1       cgd 					warning(42);
   1687        1.1       cgd 			}
   1688        1.1       cgd 		}
   1689      1.380    rillig 		if (tag->s_scl == NO_SCL) {
   1690        1.1       cgd 			tag->s_scl = scl;
   1691      1.358    rillig 			tag->s_type = tp =
   1692      1.358    rillig 			    block_zero_alloc(sizeof(*tp), "type");
   1693      1.109    rillig 			tp->t_packed = dcs->d_packed;
   1694      1.298    rillig 		} else
   1695        1.1       cgd 			tp = tag->s_type;
   1696      1.298    rillig 
   1697        1.1       cgd 	} else {
   1698      1.358    rillig 		tag = block_zero_alloc(sizeof(*tag), "sym");
   1699        1.1       cgd 		tag->s_name = unnamed;
   1700      1.328    rillig 		tag->s_def_pos = unique_curr_pos();
   1701      1.389    rillig 		tag->s_kind = SK_TAG;
   1702        1.1       cgd 		tag->s_scl = scl;
   1703      1.144    rillig 		tag->s_block_level = -1;
   1704      1.358    rillig 		tag->s_type = tp = block_zero_alloc(sizeof(*tp), "type");
   1705      1.109    rillig 		tp->t_packed = dcs->d_packed;
   1706      1.259    rillig 		dcs->d_enclosing->d_nonempty_decl = true;
   1707        1.1       cgd 	}
   1708        1.1       cgd 
   1709      1.311    rillig 	if (tp->t_tspec == NO_TSPEC) {
   1710        1.1       cgd 		tp->t_tspec = kind;
   1711        1.1       cgd 		if (kind != ENUM) {
   1712      1.396    rillig 			tp->u.sou = block_zero_alloc(sizeof(*tp->u.sou),
   1713      1.358    rillig 			    "struct_or_union");
   1714      1.401    rillig 			tp->u.sou->sou_align = 1;
   1715      1.396    rillig 			tp->u.sou->sou_tag = tag;
   1716      1.396    rillig 			tp->u.sou->sou_incomplete = true;
   1717        1.1       cgd 		} else {
   1718      1.136    rillig 			tp->t_is_enum = true;
   1719      1.396    rillig 			tp->u.enumer = block_zero_alloc(
   1720      1.396    rillig 			    sizeof(*tp->u.enumer), "enumeration");
   1721      1.396    rillig 			tp->u.enumer->en_tag = tag;
   1722      1.396    rillig 			tp->u.enumer->en_incomplete = true;
   1723        1.1       cgd 		}
   1724        1.1       cgd 	}
   1725      1.369    rillig 	debug_printf("%s: '%s'", __func__, type_name(tp));
   1726      1.369    rillig 	debug_sym(" ", tag, "\n");
   1727      1.402    rillig 	debug_dcs_all();
   1728       1.76    rillig 	return tp;
   1729        1.1       cgd }
   1730        1.1       cgd 
   1731      1.329    rillig static bool
   1732  1.403.2.1  perseant has_named_member(const struct_or_union *sou)
   1733      1.329    rillig {
   1734  1.403.2.1  perseant 	for (const sym_t *mem = sou->sou_first_member;
   1735      1.381    rillig 	    mem != NULL; mem = mem->s_next) {
   1736      1.329    rillig 		if (mem->s_name != unnamed)
   1737      1.329    rillig 			return true;
   1738      1.329    rillig 		if (is_struct_or_union(mem->s_type->t_tspec)
   1739  1.403.2.1  perseant 		    && has_named_member(mem->s_type->u.sou))
   1740      1.329    rillig 			return true;
   1741      1.329    rillig 	}
   1742      1.329    rillig 	return false;
   1743      1.329    rillig }
   1744      1.329    rillig 
   1745        1.1       cgd type_t *
   1746      1.319    rillig complete_struct_or_union(sym_t *first_member)
   1747        1.1       cgd {
   1748        1.1       cgd 
   1749      1.323    rillig 	type_t *tp = dcs->d_tag_type;
   1750      1.188    rillig 	if (tp == NULL)		/* in case of syntax errors */
   1751      1.188    rillig 		return gettyp(INT);
   1752      1.188    rillig 
   1753      1.401    rillig 	dcs_align(dcs->d_sou_align, 0);
   1754      1.298    rillig 
   1755      1.396    rillig 	struct_or_union *sou = tp->u.sou;
   1756      1.401    rillig 	sou->sou_align = dcs->d_sou_align;
   1757      1.338    rillig 	sou->sou_incomplete = false;
   1758      1.338    rillig 	sou->sou_first_member = first_member;
   1759      1.109    rillig 	if (tp->t_packed)
   1760      1.325    rillig 		pack_struct_or_union(tp);
   1761       1.78    rillig 	else
   1762      1.338    rillig 		sou->sou_size_in_bits = dcs->d_sou_size_in_bits;
   1763       1.78    rillig 
   1764      1.392    rillig 	if (sou->sou_size_in_bits == 0)
   1765      1.250    rillig 		/* zero sized %s is a C99 feature */
   1766      1.319    rillig 		c99ism(47, tspec_name(tp->t_tspec));
   1767  1.403.2.1  perseant 	else if (!has_named_member(sou))
   1768      1.293    rillig 		/* '%s' has no named members */
   1769      1.293    rillig 		warning(65, type_name(tp));
   1770      1.369    rillig 	debug_step("%s: '%s'", __func__, type_name(tp));
   1771      1.402    rillig 	debug_dcs_all();
   1772       1.76    rillig 	return tp;
   1773        1.1       cgd }
   1774        1.1       cgd 
   1775       1.78    rillig type_t *
   1776      1.319    rillig complete_enum(sym_t *first_enumerator)
   1777       1.78    rillig {
   1778       1.78    rillig 
   1779      1.323    rillig 	type_t *tp = dcs->d_tag_type;
   1780      1.396    rillig 	tp->u.enumer->en_incomplete = false;
   1781      1.396    rillig 	tp->u.enumer->en_first_enumerator = first_enumerator;
   1782      1.369    rillig 	debug_step("%s: '%s'", __func__, type_name(tp));
   1783      1.402    rillig 	debug_func_dcs(__func__);
   1784       1.78    rillig 	return tp;
   1785       1.78    rillig }
   1786       1.78    rillig 
   1787        1.1       cgd sym_t *
   1788  1.403.2.1  perseant enumeration_constant(sym_t *sym, int val, bool implicit)
   1789        1.1       cgd {
   1790       1.22     lukem 
   1791      1.380    rillig 	if (sym->s_scl != NO_SCL) {
   1792      1.144    rillig 		if (sym->s_block_level == block_level) {
   1793  1.403.2.1  perseant 			/* no hflag, because this is invalid */
   1794      1.392    rillig 			if (sym->s_param)
   1795      1.290    rillig 				/* enumeration constant '%s' hides parameter */
   1796        1.1       cgd 				warning(57, sym->s_name);
   1797      1.392    rillig 			else {
   1798      1.285    rillig 				/* redeclaration of '%s' */
   1799        1.1       cgd 				error(27, sym->s_name);
   1800        1.1       cgd 				/*
   1801      1.317    rillig 				 * Inside blocks, it should not be too
   1802       1.73    rillig 				 * complicated to find the position of the
   1803       1.73    rillig 				 * previous declaration
   1804        1.1       cgd 				 */
   1805      1.144    rillig 				if (block_level == 0)
   1806      1.299    rillig 					print_previous_declaration(sym);
   1807        1.1       cgd 			}
   1808        1.1       cgd 		} else {
   1809        1.1       cgd 			if (hflag)
   1810      1.290    rillig 				/* redefinition of '%s' hides earlier one */
   1811        1.1       cgd 				warning(43, sym->s_name);
   1812        1.1       cgd 		}
   1813        1.1       cgd 		sym = pushdown(sym);
   1814        1.1       cgd 	}
   1815      1.298    rillig 
   1816      1.272    rillig 	sym->s_scl = ENUM_CONST;
   1817      1.323    rillig 	sym->s_type = dcs->d_tag_type;
   1818      1.273    rillig 	sym->u.s_enum_constant = val;
   1819      1.298    rillig 
   1820  1.403.2.1  perseant 	if (implicit && val == TARG_INT_MIN)
   1821      1.290    rillig 		/* enumeration value '%s' overflows */
   1822        1.1       cgd 		warning(48, sym->s_name);
   1823      1.298    rillig 
   1824      1.269    rillig 	enumval = val == TARG_INT_MAX ? TARG_INT_MIN : val + 1;
   1825      1.369    rillig 	debug_sym("enumeration_constant: ", sym, "\n");
   1826       1.76    rillig 	return sym;
   1827        1.1       cgd }
   1828        1.1       cgd 
   1829      1.306    rillig static bool
   1830  1.403.2.1  perseant str_ends_with(const char *s, const char *suffix)
   1831      1.306    rillig {
   1832      1.306    rillig 	size_t s_len = strlen(s);
   1833      1.306    rillig 	size_t suffix_len = strlen(suffix);
   1834      1.306    rillig 	return s_len >= suffix_len &&
   1835      1.381    rillig 	    memcmp(s + s_len - suffix_len, suffix, suffix_len) == 0;
   1836      1.306    rillig }
   1837      1.306    rillig 
   1838      1.343    rillig void
   1839      1.306    rillig check_extern_declaration(const sym_t *sym)
   1840      1.306    rillig {
   1841      1.306    rillig 
   1842      1.306    rillig 	if (sym->s_scl == EXTERN &&
   1843      1.306    rillig 	    dcs->d_redeclared_symbol == NULL &&
   1844  1.403.2.1  perseant 	    str_ends_with(curr_pos.p_file, ".c") &&
   1845      1.343    rillig 	    allow_c90 &&
   1846      1.403    rillig 	    !ch_isdigit(sym->s_name[0]) &&	/* see mktempsym */
   1847      1.343    rillig 	    strcmp(sym->s_name, "main") != 0) {
   1848      1.310    rillig 		/* missing%s header declaration for '%s' */
   1849      1.310    rillig 		warning(351, sym->s_type->t_tspec == FUNC ? "" : " 'extern'",
   1850      1.310    rillig 		    sym->s_name);
   1851      1.306    rillig 	}
   1852  1.403.2.1  perseant 	if (sym->s_type->t_tspec == FUNC &&
   1853      1.318    rillig 	    sym->s_scl == EXTERN &&
   1854      1.318    rillig 	    sym->s_def == DECL &&
   1855      1.392    rillig 	    !in_system_header)
   1856      1.318    rillig 		/* redundant 'extern' in function declaration of '%s' */
   1857      1.318    rillig 		query_message(13, sym->s_name);
   1858      1.306    rillig }
   1859      1.306    rillig 
   1860      1.364    rillig /*
   1861      1.364    rillig  * Check whether the symbol cannot be initialized due to type/storage class.
   1862      1.364    rillig  * Return whether an error has been detected.
   1863      1.364    rillig  */
   1864      1.364    rillig static bool
   1865  1.403.2.1  perseant check_init(const sym_t *sym)
   1866      1.364    rillig {
   1867      1.364    rillig 
   1868      1.364    rillig 	if (sym->s_type->t_tspec == FUNC) {
   1869      1.364    rillig 		/* cannot initialize function '%s' */
   1870      1.364    rillig 		error(24, sym->s_name);
   1871      1.364    rillig 		return true;
   1872      1.364    rillig 	}
   1873      1.364    rillig 	if (sym->s_scl == TYPEDEF) {
   1874      1.364    rillig 		/* cannot initialize typedef '%s' */
   1875      1.364    rillig 		error(25, sym->s_name);
   1876      1.364    rillig 		return true;
   1877      1.364    rillig 	}
   1878      1.364    rillig 	if (sym->s_scl == EXTERN && sym->s_def == DECL) {
   1879      1.392    rillig 		if (dcs->d_kind == DLK_EXTERN)
   1880      1.364    rillig 			/* cannot initialize extern declaration '%s' */
   1881      1.364    rillig 			warning(26, sym->s_name);
   1882      1.392    rillig 		else {
   1883      1.364    rillig 			/* cannot initialize extern declaration '%s' */
   1884      1.364    rillig 			error(26, sym->s_name);
   1885      1.364    rillig 			return true;
   1886      1.364    rillig 		}
   1887      1.364    rillig 	}
   1888      1.364    rillig 
   1889      1.364    rillig 	return false;
   1890      1.364    rillig }
   1891      1.364    rillig 
   1892      1.364    rillig /*
   1893      1.374    rillig  * Compares a prototype declaration with the remembered parameters of a
   1894      1.374    rillig  * previous old-style function definition.
   1895      1.364    rillig  */
   1896      1.364    rillig static bool
   1897      1.369    rillig check_old_style_definition(const sym_t *rdsym, const sym_t *dsym)
   1898      1.364    rillig {
   1899      1.364    rillig 
   1900      1.374    rillig 	const sym_t *old_params = rdsym->u.s_old_style_params;
   1901      1.396    rillig 	const sym_t *proto_params = dsym->s_type->u.params;
   1902      1.364    rillig 
   1903      1.364    rillig 	bool msg = false;
   1904      1.364    rillig 
   1905      1.374    rillig 	int old_n = 0;
   1906      1.374    rillig 	for (const sym_t *p = old_params; p != NULL; p = p->s_next)
   1907      1.374    rillig 		old_n++;
   1908      1.374    rillig 	int proto_n = 0;
   1909      1.374    rillig 	for (const sym_t *p = proto_params; p != NULL; p = p->s_next)
   1910      1.374    rillig 		proto_n++;
   1911      1.374    rillig 	if (old_n != proto_n) {
   1912      1.364    rillig 		/* prototype does not match old-style definition */
   1913      1.364    rillig 		error(63);
   1914      1.364    rillig 		msg = true;
   1915      1.364    rillig 		goto end;
   1916      1.364    rillig 	}
   1917      1.364    rillig 
   1918      1.374    rillig 	const sym_t *arg = old_params;
   1919      1.374    rillig 	const sym_t *parg = proto_params;
   1920      1.364    rillig 	int n = 1;
   1921      1.374    rillig 	while (old_n-- > 0) {
   1922      1.364    rillig 		bool dowarn = false;
   1923      1.364    rillig 		if (!types_compatible(arg->s_type, parg->s_type,
   1924      1.364    rillig 		    true, true, &dowarn) ||
   1925      1.364    rillig 		    dowarn) {
   1926      1.364    rillig 			/* prototype does not match old-style ... */
   1927      1.364    rillig 			error(299, n);
   1928      1.364    rillig 			msg = true;
   1929      1.364    rillig 		}
   1930      1.364    rillig 		arg = arg->s_next;
   1931      1.364    rillig 		parg = parg->s_next;
   1932      1.364    rillig 		n++;
   1933      1.364    rillig 	}
   1934      1.364    rillig 
   1935      1.364    rillig end:
   1936      1.392    rillig 	if (msg && rflag)
   1937      1.364    rillig 		/* old-style definition */
   1938      1.364    rillig 		message_at(300, &rdsym->s_def_pos);
   1939      1.364    rillig 	return msg;
   1940      1.364    rillig }
   1941      1.364    rillig 
   1942      1.306    rillig /* Process a single external or 'static' declarator. */
   1943      1.165    rillig static void
   1944  1.403.2.1  perseant declare_extern(sym_t *dsym, bool has_initializer, const sbuf_t *renaming)
   1945        1.1       cgd {
   1946      1.166    rillig 
   1947      1.166    rillig 	if (renaming != NULL) {
   1948      1.166    rillig 		lint_assert(dsym->s_rename == NULL);
   1949      1.166    rillig 
   1950      1.358    rillig 		char *s = level_zero_alloc(1, renaming->sb_len + 1, "string");
   1951      1.166    rillig 		(void)memcpy(s, renaming->sb_name, renaming->sb_len + 1);
   1952      1.166    rillig 		dsym->s_rename = s;
   1953      1.166    rillig 	}
   1954        1.1       cgd 
   1955      1.306    rillig 	check_extern_declaration(dsym);
   1956      1.306    rillig 
   1957      1.124    rillig 	check_function_definition(dsym, true);
   1958        1.1       cgd 
   1959       1.75    rillig 	check_type(dsym);
   1960        1.1       cgd 
   1961      1.312    rillig 	if (has_initializer && !check_init(dsym))
   1962        1.1       cgd 		dsym->s_def = DEF;
   1963        1.1       cgd 
   1964        1.1       cgd 	/*
   1965       1.75    rillig 	 * Declarations of functions are marked as "tentative" in
   1966      1.382    rillig 	 * declarator_name(). This is wrong because there are no tentative
   1967      1.382    rillig 	 * function definitions.
   1968        1.1       cgd 	 */
   1969        1.1       cgd 	if (dsym->s_type->t_tspec == FUNC && dsym->s_def == TDEF)
   1970        1.1       cgd 		dsym->s_def = DECL;
   1971        1.1       cgd 
   1972        1.4       jpo 	if (dcs->d_inline) {
   1973        1.4       jpo 		if (dsym->s_type->t_tspec == FUNC) {
   1974      1.122    rillig 			dsym->s_inline = true;
   1975        1.4       jpo 		} else {
   1976      1.284    rillig 			/* variable '%s' declared inline */
   1977        1.5       jpo 			warning(268, dsym->s_name);
   1978        1.4       jpo 		}
   1979        1.4       jpo 	}
   1980        1.4       jpo 
   1981        1.1       cgd 	/* Write the declaration into the output file */
   1982        1.1       cgd 	if (plibflg && llibflg &&
   1983        1.1       cgd 	    dsym->s_type->t_tspec == FUNC && dsym->s_type->t_proto) {
   1984        1.1       cgd 		/*
   1985      1.382    rillig 		 * With both LINTLIBRARY and PROTOLIB the prototype is written
   1986      1.382    rillig 		 * as a function definition to the output file.
   1987        1.1       cgd 		 */
   1988      1.298    rillig 		bool rval = dsym->s_type->t_subt->t_tspec != VOID;
   1989      1.124    rillig 		outfdef(dsym, &dsym->s_def_pos, rval, false, NULL);
   1990      1.313    rillig 	} else if (!is_compiler_builtin(dsym->s_name)
   1991      1.313    rillig 	    && !(has_initializer && dsym->s_type->t_incomplete_array)) {
   1992        1.4       jpo 		outsym(dsym, dsym->s_scl, dsym->s_def);
   1993        1.1       cgd 	}
   1994        1.1       cgd 
   1995      1.314    rillig 	sym_t *rdsym = dcs->d_redeclared_symbol;
   1996      1.314    rillig 	if (rdsym != NULL) {
   1997        1.1       cgd 
   1998        1.1       cgd 		/*
   1999      1.300    rillig 		 * If the old symbol stems from an old-style function
   2000      1.271    rillig 		 * definition, we have remembered the params in
   2001      1.374    rillig 		 * rdsym->s_old_style_params and compare them with the params
   2002      1.271    rillig 		 * of the prototype.
   2003        1.1       cgd 		 */
   2004      1.298    rillig 		bool redec = rdsym->s_osdef && dsym->s_type->t_proto &&
   2005      1.298    rillig 		    check_old_style_definition(rdsym, dsym);
   2006       1.22     lukem 
   2007      1.298    rillig 		bool dowarn = false;
   2008      1.298    rillig 		if (!redec && !check_redeclaration(dsym, &dowarn)) {
   2009       1.44  dholland 			if (dowarn) {
   2010      1.280    rillig 				/* TODO: Make this an error in C99 mode as well. */
   2011      1.280    rillig 				if (!allow_trad && !allow_c99)
   2012      1.285    rillig 					/* redeclaration of '%s' */
   2013      1.105    rillig 					error(27, dsym->s_name);
   2014      1.105    rillig 				else
   2015      1.285    rillig 					/* redeclaration of '%s' */
   2016      1.105    rillig 					warning(27, dsym->s_name);
   2017      1.299    rillig 				print_previous_declaration(rdsym);
   2018        1.1       cgd 			}
   2019        1.1       cgd 
   2020        1.1       cgd 			/*
   2021      1.382    rillig 			 * Take over the remembered params if the new symbol is
   2022      1.382    rillig 			 * not a prototype.
   2023        1.1       cgd 			 */
   2024        1.1       cgd 			if (rdsym->s_osdef && !dsym->s_type->t_proto) {
   2025        1.1       cgd 				dsym->s_osdef = rdsym->s_osdef;
   2026      1.374    rillig 				dsym->u.s_old_style_params =
   2027      1.374    rillig 				    rdsym->u.s_old_style_params;
   2028       1.85    rillig 				dsym->s_def_pos = rdsym->s_def_pos;
   2029        1.1       cgd 			}
   2030        1.1       cgd 
   2031      1.298    rillig 			if (rdsym->s_type->t_proto && !dsym->s_type->t_proto)
   2032       1.85    rillig 				dsym->s_def_pos = rdsym->s_def_pos;
   2033      1.298    rillig 			else if (rdsym->s_def == DEF && dsym->s_def != DEF)
   2034       1.85    rillig 				dsym->s_def_pos = rdsym->s_def_pos;
   2035        1.1       cgd 
   2036       1.75    rillig 			copy_usage_info(dsym, rdsym);
   2037        1.1       cgd 
   2038        1.1       cgd 			/* Once a name is defined, it remains defined. */
   2039        1.1       cgd 			if (rdsym->s_def == DEF)
   2040        1.1       cgd 				dsym->s_def = DEF;
   2041        1.1       cgd 
   2042        1.4       jpo 			/* once a function is inline, it remains inline */
   2043        1.4       jpo 			if (rdsym->s_inline)
   2044      1.122    rillig 				dsym->s_inline = true;
   2045        1.4       jpo 
   2046       1.75    rillig 			complete_type(dsym, rdsym);
   2047        1.1       cgd 		}
   2048       1.22     lukem 
   2049      1.397    rillig 		symtab_remove_forever(rdsym);
   2050        1.1       cgd 	}
   2051        1.1       cgd 
   2052        1.1       cgd 	if (dsym->s_scl == TYPEDEF) {
   2053      1.247    rillig 		dsym->s_type = block_dup_type(dsym->s_type);
   2054      1.122    rillig 		dsym->s_type->t_typedef = true;
   2055      1.297    rillig 		set_first_typedef(dsym->s_type, dsym);
   2056  1.403.2.1  perseant 		if (dsym->s_type->t_tspec == STRUCT)
   2057  1.403.2.1  perseant 			/* typedef '%s' of struct type '%s' */
   2058  1.403.2.1  perseant 			query_message(21, dsym->s_name,
   2059  1.403.2.1  perseant 			    type_name(dsym->s_type));
   2060  1.403.2.1  perseant 		else if (dsym->s_type->t_tspec == UNION)
   2061  1.403.2.1  perseant 			/* typedef '%s' of union type '%s' */
   2062  1.403.2.1  perseant 			query_message(22, dsym->s_name,
   2063  1.403.2.1  perseant 			    type_name(dsym->s_type));
   2064  1.403.2.1  perseant 		else if (dsym->s_type->t_tspec == PTR
   2065  1.403.2.1  perseant 		    && dsym->s_type->t_subt->t_tspec == STRUCT)
   2066  1.403.2.1  perseant 			/* typedef '%s' of pointer to struct type '%s' */
   2067  1.403.2.1  perseant 			query_message(23, dsym->s_name,
   2068  1.403.2.1  perseant 			    type_name(dsym->s_type));
   2069  1.403.2.1  perseant 		else if (dsym->s_type->t_tspec == PTR
   2070  1.403.2.1  perseant 		    && dsym->s_type->t_subt->t_tspec == UNION)
   2071  1.403.2.1  perseant 			/* typedef '%s' of pointer to union type '%s' */
   2072  1.403.2.1  perseant 			query_message(24, dsym->s_name,
   2073  1.403.2.1  perseant 			    type_name(dsym->s_type));
   2074        1.1       cgd 	}
   2075      1.369    rillig 	debug_printf("%s: ", __func__);
   2076      1.369    rillig 	debug_sym("", dsym, "\n");
   2077        1.1       cgd }
   2078        1.1       cgd 
   2079      1.165    rillig void
   2080      1.312    rillig declare(sym_t *decl, bool has_initializer, sbuf_t *renaming)
   2081      1.165    rillig {
   2082      1.165    rillig 
   2083      1.330    rillig 	if (dcs->d_kind == DLK_EXTERN)
   2084      1.312    rillig 		declare_extern(decl, has_initializer, renaming);
   2085      1.374    rillig 	else if (dcs->d_kind == DLK_OLD_STYLE_PARAMS ||
   2086      1.381    rillig 	    dcs->d_kind == DLK_PROTO_PARAMS) {
   2087      1.392    rillig 		if (renaming != NULL)
   2088      1.374    rillig 			/* symbol renaming can't be used on function ... */
   2089      1.165    rillig 			error(310);
   2090      1.392    rillig 		else
   2091      1.374    rillig 			(void)declare_parameter(decl, has_initializer);
   2092      1.166    rillig 	} else {
   2093      1.330    rillig 		lint_assert(dcs->d_kind == DLK_AUTO);
   2094      1.392    rillig 		if (renaming != NULL)
   2095      1.374    rillig 			/* symbol renaming can't be used on automatic ... */
   2096      1.165    rillig 			error(311);
   2097      1.392    rillig 		else
   2098      1.312    rillig 			declare_local(decl, has_initializer);
   2099      1.165    rillig 	}
   2100      1.369    rillig 	debug_printf("%s: ", __func__);
   2101      1.369    rillig 	debug_sym("", decl, "\n");
   2102      1.165    rillig }
   2103      1.165    rillig 
   2104        1.1       cgd /*
   2105       1.73    rillig  * Copies information about usage into a new symbol table entry of
   2106        1.1       cgd  * the same symbol.
   2107        1.1       cgd  */
   2108        1.1       cgd void
   2109  1.403.2.1  perseant copy_usage_info(sym_t *sym, const sym_t *rdsym)
   2110        1.1       cgd {
   2111       1.22     lukem 
   2112       1.84    rillig 	sym->s_set_pos = rdsym->s_set_pos;
   2113       1.84    rillig 	sym->s_use_pos = rdsym->s_use_pos;
   2114        1.1       cgd 	sym->s_set = rdsym->s_set;
   2115        1.1       cgd 	sym->s_used = rdsym->s_used;
   2116        1.1       cgd }
   2117        1.1       cgd 
   2118        1.1       cgd /*
   2119      1.131    rillig  * Prints an error and returns true if a symbol is redeclared/redefined.
   2120      1.298    rillig  * Otherwise, returns false and, in some cases of minor problems, prints
   2121        1.1       cgd  * a warning.
   2122        1.1       cgd  */
   2123      1.122    rillig bool
   2124      1.122    rillig check_redeclaration(sym_t *dsym, bool *dowarn)
   2125        1.1       cgd {
   2126        1.1       cgd 
   2127      1.314    rillig 	sym_t *rdsym = dcs->d_redeclared_symbol;
   2128      1.314    rillig 	if (rdsym->s_scl == ENUM_CONST) {
   2129      1.285    rillig 		/* redeclaration of '%s' */
   2130        1.1       cgd 		error(27, dsym->s_name);
   2131      1.314    rillig 		print_previous_declaration(rdsym);
   2132      1.122    rillig 		return true;
   2133        1.1       cgd 	}
   2134      1.314    rillig 	if (rdsym->s_scl == TYPEDEF) {
   2135      1.289    rillig 		/* typedef '%s' redeclared */
   2136        1.1       cgd 		error(89, dsym->s_name);
   2137      1.314    rillig 		print_previous_declaration(rdsym);
   2138      1.122    rillig 		return true;
   2139        1.1       cgd 	}
   2140        1.1       cgd 	if (dsym->s_scl == TYPEDEF) {
   2141      1.285    rillig 		/* redeclaration of '%s' */
   2142        1.1       cgd 		error(27, dsym->s_name);
   2143      1.314    rillig 		print_previous_declaration(rdsym);
   2144      1.122    rillig 		return true;
   2145        1.1       cgd 	}
   2146      1.314    rillig 	if (rdsym->s_def == DEF && dsym->s_def == DEF) {
   2147      1.288    rillig 		/* redefinition of '%s' */
   2148        1.1       cgd 		error(28, dsym->s_name);
   2149      1.314    rillig 		print_previous_declaration(rdsym);
   2150      1.122    rillig 		return true;
   2151        1.1       cgd 	}
   2152      1.327    rillig 	if (!types_compatible(rdsym->s_type, dsym->s_type,
   2153      1.327    rillig 	    false, false, dowarn)) {
   2154      1.236    rillig 		/* redeclaration of '%s' with type '%s', expected '%s' */
   2155      1.236    rillig 		error(347, dsym->s_name,
   2156      1.314    rillig 		    type_name(dsym->s_type), type_name(rdsym->s_type));
   2157      1.314    rillig 		print_previous_declaration(rdsym);
   2158      1.122    rillig 		return true;
   2159        1.1       cgd 	}
   2160      1.314    rillig 	if (rdsym->s_scl == EXTERN && dsym->s_scl == EXTERN)
   2161      1.122    rillig 		return false;
   2162      1.314    rillig 	if (rdsym->s_scl == STATIC && dsym->s_scl == STATIC)
   2163      1.122    rillig 		return false;
   2164      1.314    rillig 	if (rdsym->s_scl == STATIC && dsym->s_def == DECL)
   2165      1.122    rillig 		return false;
   2166      1.314    rillig 	if (rdsym->s_scl == EXTERN && rdsym->s_def == DEF) {
   2167        1.1       cgd 		/*
   2168      1.382    rillig 		 * All cases except "int a = 1; static int a;" are caught above
   2169      1.382    rillig 		 * with or without a warning
   2170        1.1       cgd 		 */
   2171      1.285    rillig 		/* redeclaration of '%s' */
   2172        1.1       cgd 		error(27, dsym->s_name);
   2173      1.314    rillig 		print_previous_declaration(rdsym);
   2174      1.122    rillig 		return true;
   2175        1.1       cgd 	}
   2176      1.314    rillig 	if (rdsym->s_scl == EXTERN) {
   2177      1.288    rillig 		/* '%s' was previously declared extern, becomes static */
   2178        1.1       cgd 		warning(29, dsym->s_name);
   2179      1.314    rillig 		print_previous_declaration(rdsym);
   2180      1.122    rillig 		return false;
   2181        1.1       cgd 	}
   2182      1.382    rillig 	/*-
   2183       1.86    rillig 	 * Now it's one of:
   2184      1.382    rillig 	 * "static a; int a;"
   2185      1.382    rillig 	 * "static a; int a = 1;"
   2186      1.382    rillig 	 * "static a = 1; int a;"
   2187        1.1       cgd 	 */
   2188      1.280    rillig 	/* TODO: Make this an error in C99 mode as well. */
   2189      1.280    rillig 	if (!allow_trad && !allow_c99) {
   2190      1.378    rillig 		/* redeclaration of '%s'; C90 or later require static */
   2191        1.1       cgd 		warning(30, dsym->s_name);
   2192      1.314    rillig 		print_previous_declaration(rdsym);
   2193        1.1       cgd 	}
   2194        1.1       cgd 	dsym->s_scl = STATIC;
   2195      1.122    rillig 	return false;
   2196        1.1       cgd }
   2197        1.1       cgd 
   2198      1.117    rillig static bool
   2199      1.364    rillig qualifiers_correspond(const type_t *tp1, const type_t *tp2, bool ignqual)
   2200      1.364    rillig {
   2201      1.364    rillig 
   2202      1.364    rillig 	if (tp1->t_const != tp2->t_const && !ignqual && allow_c90)
   2203      1.364    rillig 		return false;
   2204      1.364    rillig 	if (tp1->t_volatile != tp2->t_volatile && !ignqual && allow_c90)
   2205      1.364    rillig 		return false;
   2206      1.364    rillig 	return true;
   2207      1.364    rillig }
   2208      1.364    rillig 
   2209      1.364    rillig bool
   2210      1.364    rillig pointer_types_are_compatible(const type_t *tp1, const type_t *tp2, bool ignqual)
   2211      1.364    rillig {
   2212      1.364    rillig 
   2213      1.364    rillig 	return tp1->t_tspec == VOID || tp2->t_tspec == VOID ||
   2214      1.381    rillig 	    qualifiers_correspond(tp1, tp2, ignqual);
   2215      1.364    rillig }
   2216      1.364    rillig 
   2217      1.364    rillig static bool
   2218      1.364    rillig prototypes_compatible(const type_t *tp1, const type_t *tp2, bool *dowarn)
   2219      1.364    rillig {
   2220      1.364    rillig 
   2221      1.364    rillig 	if (tp1->t_vararg != tp2->t_vararg)
   2222      1.364    rillig 		return false;
   2223      1.364    rillig 
   2224      1.396    rillig 	const sym_t *p1 = tp1->u.params;
   2225      1.396    rillig 	const sym_t *p2 = tp2->u.params;
   2226      1.364    rillig 
   2227      1.374    rillig 	for (; p1 != NULL && p2 != NULL; p1 = p1->s_next, p2 = p2->s_next) {
   2228      1.374    rillig 		if (!types_compatible(p1->s_type, p2->s_type,
   2229      1.364    rillig 		    true, false, dowarn))
   2230      1.364    rillig 			return false;
   2231      1.364    rillig 	}
   2232      1.374    rillig 	return p1 == p2;
   2233      1.364    rillig }
   2234      1.364    rillig 
   2235      1.364    rillig /*
   2236      1.364    rillig  * Returns whether all parameters of a prototype are compatible with an
   2237      1.364    rillig  * old-style function declaration.
   2238      1.364    rillig  */
   2239      1.364    rillig static bool
   2240  1.403.2.1  perseant is_old_style_compat(const type_t *tp)
   2241       1.45  christos {
   2242      1.298    rillig 
   2243  1.403.2.1  perseant 	if (tp->t_vararg)
   2244  1.403.2.1  perseant 		return false;
   2245      1.396    rillig 	for (const sym_t *p = tp->u.params; p != NULL; p = p->s_next) {
   2246      1.374    rillig 		tspec_t t = p->s_type->t_tspec;
   2247      1.364    rillig 		if (t == FLOAT ||
   2248      1.364    rillig 		    t == CHAR || t == SCHAR || t == UCHAR ||
   2249  1.403.2.1  perseant 		    t == SHORT || t == USHORT)
   2250  1.403.2.1  perseant 			return false;
   2251      1.364    rillig 	}
   2252      1.117    rillig 	return true;
   2253       1.45  christos }
   2254       1.45  christos 
   2255      1.327    rillig /*-
   2256      1.327    rillig  * ignqual	ignore type qualifiers; used for function parameters
   2257      1.298    rillig  * promot	promote the left type; used for comparison of parameters of
   2258      1.298    rillig  *		old-style function definitions with parameters of prototypes.
   2259      1.298    rillig  * *dowarn	is set to true if an old-style function declaration is not
   2260        1.1       cgd  *		compatible with a prototype
   2261        1.1       cgd  */
   2262      1.122    rillig bool
   2263      1.298    rillig types_compatible(const type_t *tp1, const type_t *tp2,
   2264      1.298    rillig 		     bool ignqual, bool promot, bool *dowarn)
   2265        1.1       cgd {
   2266        1.1       cgd 
   2267        1.1       cgd 	while (tp1 != NULL && tp2 != NULL) {
   2268      1.298    rillig 		tspec_t t = tp1->t_tspec;
   2269        1.1       cgd 		if (promot) {
   2270      1.298    rillig 			if (t == FLOAT)
   2271        1.1       cgd 				t = DOUBLE;
   2272      1.298    rillig 			else if (t == CHAR || t == SCHAR)
   2273        1.1       cgd 				t = INT;
   2274      1.298    rillig 			else if (t == UCHAR)
   2275      1.279    rillig 				t = allow_c90 ? INT : UINT;
   2276      1.298    rillig 			else if (t == SHORT)
   2277        1.1       cgd 				t = INT;
   2278      1.298    rillig 			else if (t == USHORT) {
   2279      1.279    rillig 				t = TARG_INT_MAX < TARG_USHRT_MAX || !allow_c90
   2280      1.254    rillig 				    ? UINT : INT;
   2281        1.1       cgd 			}
   2282        1.1       cgd 		}
   2283        1.1       cgd 
   2284        1.1       cgd 		if (t != tp2->t_tspec)
   2285      1.124    rillig 			return false;
   2286        1.1       cgd 
   2287      1.116    rillig 		if (!qualifiers_correspond(tp1, tp2, ignqual))
   2288      1.124    rillig 			return false;
   2289        1.1       cgd 
   2290      1.292    rillig 		if (is_struct_or_union(t))
   2291      1.396    rillig 			return tp1->u.sou == tp2->u.sou;
   2292        1.1       cgd 
   2293      1.219    rillig 		if (t == ENUM && eflag)
   2294      1.396    rillig 			return tp1->u.enumer == tp2->u.enumer;
   2295      1.219    rillig 
   2296      1.396    rillig 		if (t == ARRAY && tp1->u.dimension != tp2->u.dimension) {
   2297      1.396    rillig 			if (tp1->u.dimension != 0 && tp2->u.dimension != 0)
   2298      1.124    rillig 				return false;
   2299        1.1       cgd 		}
   2300        1.1       cgd 
   2301      1.279    rillig 		if (t == FUNC && allow_c90) {
   2302        1.1       cgd 			if (tp1->t_proto && tp2->t_proto) {
   2303      1.298    rillig 				if (!prototypes_compatible(tp1, tp2, dowarn))
   2304      1.124    rillig 					return false;
   2305  1.403.2.1  perseant 			} else if ((tp1->t_proto || tp2->t_proto)
   2306  1.403.2.1  perseant 			    && dowarn != NULL
   2307  1.403.2.1  perseant 			    && !is_old_style_compat(tp1->t_proto ? tp1 : tp2))
   2308  1.403.2.1  perseant 				*dowarn = true;
   2309        1.1       cgd 		}
   2310        1.1       cgd 
   2311        1.1       cgd 		tp1 = tp1->t_subt;
   2312        1.1       cgd 		tp2 = tp2->t_subt;
   2313      1.122    rillig 		ignqual = promot = false;
   2314        1.1       cgd 	}
   2315        1.1       cgd 
   2316       1.76    rillig 	return tp1 == tp2;
   2317        1.1       cgd }
   2318        1.1       cgd 
   2319        1.1       cgd /*
   2320      1.327    rillig  * Completes a type by copying the dimension and prototype information from a
   2321      1.327    rillig  * second compatible type.
   2322        1.1       cgd  *
   2323        1.1       cgd  * Following lines are legal:
   2324  1.403.2.1  perseant  *	"typedef a[]; a b; a b[10]; a c; a c[20];"
   2325  1.403.2.1  perseant  *	"typedef ft(); ft f; f(int); ft g; g(long);"
   2326      1.327    rillig  * This means that, if a type is completed, the type structure must be
   2327      1.327    rillig  * duplicated.
   2328        1.1       cgd  */
   2329        1.1       cgd void
   2330  1.403.2.1  perseant complete_type(sym_t *dsym, const sym_t *ssym)
   2331        1.1       cgd {
   2332      1.327    rillig 	type_t **dstp = &dsym->s_type;
   2333      1.327    rillig 	type_t *src = ssym->s_type;
   2334        1.1       cgd 
   2335      1.327    rillig 	while (*dstp != NULL) {
   2336      1.327    rillig 		type_t *dst = *dstp;
   2337       1.92    rillig 		lint_assert(src != NULL);
   2338       1.92    rillig 		lint_assert(dst->t_tspec == src->t_tspec);
   2339        1.1       cgd 		if (dst->t_tspec == ARRAY) {
   2340      1.396    rillig 			if (dst->u.dimension == 0 && src->u.dimension != 0) {
   2341      1.247    rillig 				*dstp = dst = block_dup_type(dst);
   2342      1.396    rillig 				dst->u.dimension = src->u.dimension;
   2343      1.262    rillig 				dst->t_incomplete_array = false;
   2344        1.1       cgd 			}
   2345        1.1       cgd 		} else if (dst->t_tspec == FUNC) {
   2346        1.1       cgd 			if (!dst->t_proto && src->t_proto) {
   2347      1.247    rillig 				*dstp = dst = block_dup_type(dst);
   2348      1.122    rillig 				dst->t_proto = true;
   2349      1.396    rillig 				dst->u.params = src->u.params;
   2350        1.1       cgd 			}
   2351        1.1       cgd 		}
   2352        1.1       cgd 		dstp = &dst->t_subt;
   2353        1.1       cgd 		src = src->t_subt;
   2354        1.1       cgd 	}
   2355      1.369    rillig 	debug_printf("%s: ", __func__);
   2356      1.369    rillig 	debug_sym("dsym: ", dsym, "");
   2357      1.369    rillig 	debug_sym("ssym: ", ssym, "\n");
   2358        1.1       cgd }
   2359        1.1       cgd 
   2360        1.1       cgd sym_t *
   2361      1.374    rillig declare_parameter(sym_t *sym, bool has_initializer)
   2362        1.1       cgd {
   2363        1.1       cgd 
   2364      1.124    rillig 	check_function_definition(sym, true);
   2365        1.1       cgd 
   2366       1.75    rillig 	check_type(sym);
   2367        1.1       cgd 
   2368      1.154    rillig 	if (dcs->d_redeclared_symbol != NULL &&
   2369      1.154    rillig 	    dcs->d_redeclared_symbol->s_block_level == block_level) {
   2370      1.285    rillig 		/* redeclaration of formal parameter '%s' */
   2371        1.1       cgd 		error(237, sym->s_name);
   2372      1.397    rillig 		symtab_remove_forever(dcs->d_redeclared_symbol);
   2373      1.374    rillig 		sym->s_param = true;
   2374        1.1       cgd 	}
   2375        1.1       cgd 
   2376      1.374    rillig 	if (!sym->s_param) {
   2377      1.374    rillig 		/* declared parameter '%s' is missing */
   2378        1.1       cgd 		error(53, sym->s_name);
   2379      1.374    rillig 		sym->s_param = true;
   2380        1.1       cgd 	}
   2381        1.1       cgd 
   2382      1.392    rillig 	if (has_initializer)
   2383      1.290    rillig 		/* cannot initialize parameter '%s' */
   2384        1.1       cgd 		error(52, sym->s_name);
   2385        1.1       cgd 
   2386      1.196    rillig 	if (sym->s_type == NULL)	/* for c(void()) */
   2387      1.196    rillig 		sym->s_type = gettyp(VOID);
   2388      1.196    rillig 
   2389      1.327    rillig 	tspec_t t = sym->s_type->t_tspec;
   2390  1.403.2.1  perseant 	if (t == ARRAY) {
   2391  1.403.2.1  perseant 		type_t *subt = block_dup_type(sym->s_type->t_subt);
   2392  1.403.2.1  perseant 		if (sym->s_type->t_const)
   2393  1.403.2.1  perseant 			subt->t_const = true;
   2394  1.403.2.1  perseant 		if (sym->s_type->t_volatile)
   2395  1.403.2.1  perseant 			subt->t_volatile = true;
   2396  1.403.2.1  perseant 		sym->s_type = block_derive_type(subt, PTR);
   2397  1.403.2.1  perseant 	}
   2398      1.327    rillig 	if (t == FUNC) {
   2399      1.279    rillig 		if (!allow_c90)
   2400      1.347    rillig 			/* parameter '%s' has function type, should be ... */
   2401        1.1       cgd 			warning(50, sym->s_name);
   2402      1.247    rillig 		sym->s_type = block_derive_type(sym->s_type, PTR);
   2403        1.1       cgd 	}
   2404      1.327    rillig 	if (t == FLOAT && !allow_c90)
   2405      1.327    rillig 		sym->s_type = gettyp(DOUBLE);
   2406        1.1       cgd 
   2407        1.4       jpo 	if (dcs->d_inline)
   2408      1.347    rillig 		/* parameter '%s' declared inline */
   2409        1.5       jpo 		warning(269, sym->s_name);
   2410        1.4       jpo 
   2411  1.403.2.1  perseant 	if (sym->s_type->t_const
   2412      1.387    rillig 	    && (sym->s_scl == AUTO || sym->s_scl == REG)) {
   2413      1.387    rillig 		/* const automatic variable '%s' */
   2414      1.387    rillig 		query_message(18, sym->s_name);
   2415      1.387    rillig 	}
   2416      1.387    rillig 
   2417        1.1       cgd 	/*
   2418      1.382    rillig 	 * Arguments must have complete types. length_in_bits prints the needed
   2419      1.382    rillig 	 * error messages (null dimension is impossible because arrays are
   2420      1.382    rillig 	 * converted to pointers).
   2421        1.1       cgd 	 */
   2422        1.1       cgd 	if (sym->s_type->t_tspec != VOID)
   2423      1.270    rillig 		(void)length_in_bits(sym->s_type, sym->s_name);
   2424        1.1       cgd 
   2425       1.67  christos 	sym->s_used = dcs->d_used;
   2426       1.75    rillig 	mark_as_set(sym);
   2427        1.1       cgd 
   2428      1.369    rillig 	debug_printf("%s: ", __func__);
   2429      1.369    rillig 	debug_sym("", sym, "\n");
   2430       1.76    rillig 	return sym;
   2431        1.1       cgd }
   2432        1.1       cgd 
   2433      1.298    rillig static bool
   2434      1.298    rillig is_character_pointer(const type_t *tp)
   2435      1.298    rillig {
   2436      1.298    rillig 	tspec_t st;
   2437      1.298    rillig 
   2438      1.298    rillig 	return tp->t_tspec == PTR &&
   2439      1.381    rillig 	    (st = tp->t_subt->t_tspec,
   2440      1.381    rillig 		st == CHAR || st == SCHAR || st == UCHAR);
   2441      1.298    rillig }
   2442      1.298    rillig 
   2443        1.1       cgd void
   2444       1.87    rillig check_func_lint_directives(void)
   2445        1.1       cgd {
   2446        1.1       cgd 
   2447  1.403.2.1  perseant 	/* check for invalid combinations of lint directives */
   2448      1.110    rillig 	if (printflike_argnum != -1 && scanflike_argnum != -1) {
   2449      1.346    rillig 		/* ** PRINTFLIKE ** and ** SCANFLIKE ** cannot be combined */
   2450        1.1       cgd 		warning(289);
   2451      1.110    rillig 		printflike_argnum = scanflike_argnum = -1;
   2452        1.1       cgd 	}
   2453      1.110    rillig 	if (nvararg != -1 &&
   2454      1.110    rillig 	    (printflike_argnum != -1 || scanflike_argnum != -1)) {
   2455        1.1       cgd 		/* dubious use of ** VARARGS ** with ** %s ** */
   2456      1.110    rillig 		warning(288,
   2457      1.110    rillig 		    printflike_argnum != -1 ? "PRINTFLIKE" : "SCANFLIKE");
   2458        1.1       cgd 		nvararg = -1;
   2459        1.1       cgd 	}
   2460        1.1       cgd 
   2461        1.1       cgd 	/*
   2462      1.374    rillig 	 * check if the numeric argument of a lint directive is compatible with
   2463      1.374    rillig 	 * the number of parameters of the function.
   2464        1.1       cgd 	 */
   2465      1.298    rillig 	int narg = 0;
   2466      1.374    rillig 	for (const sym_t *p = dcs->d_func_params; p != NULL; p = p->s_next)
   2467        1.1       cgd 		narg++;
   2468        1.1       cgd 	if (nargusg > narg) {
   2469      1.374    rillig 		/* parameter number mismatch in comment ** %s ** */
   2470        1.1       cgd 		warning(283, "ARGSUSED");
   2471        1.1       cgd 		nargusg = 0;
   2472        1.1       cgd 	}
   2473        1.1       cgd 	if (nvararg > narg) {
   2474      1.374    rillig 		/* parameter number mismatch in comment ** %s ** */
   2475        1.1       cgd 		warning(283, "VARARGS");
   2476        1.1       cgd 		nvararg = 0;
   2477        1.1       cgd 	}
   2478      1.110    rillig 	if (printflike_argnum > narg) {
   2479      1.374    rillig 		/* parameter number mismatch in comment ** %s ** */
   2480        1.1       cgd 		warning(283, "PRINTFLIKE");
   2481      1.110    rillig 		printflike_argnum = -1;
   2482      1.110    rillig 	} else if (printflike_argnum == 0) {
   2483      1.110    rillig 		printflike_argnum = -1;
   2484        1.1       cgd 	}
   2485      1.110    rillig 	if (scanflike_argnum > narg) {
   2486      1.374    rillig 		/* parameter number mismatch in comment ** %s ** */
   2487        1.1       cgd 		warning(283, "SCANFLIKE");
   2488      1.110    rillig 		scanflike_argnum = -1;
   2489      1.110    rillig 	} else if (scanflike_argnum == 0) {
   2490      1.110    rillig 		scanflike_argnum = -1;
   2491      1.110    rillig 	}
   2492      1.110    rillig 	if (printflike_argnum != -1 || scanflike_argnum != -1) {
   2493      1.110    rillig 		narg = printflike_argnum != -1
   2494      1.110    rillig 		    ? printflike_argnum : scanflike_argnum;
   2495      1.374    rillig 		const sym_t *param = dcs->d_func_params;
   2496      1.298    rillig 		for (int n = 1; n < narg; n++)
   2497      1.374    rillig 			param = param->s_next;
   2498      1.374    rillig 		if (!is_character_pointer(param->s_type)) {
   2499      1.374    rillig 			/* parameter %d must be 'char *' for PRINTFLIKE/... */
   2500        1.1       cgd 			warning(293, narg);
   2501      1.110    rillig 			printflike_argnum = scanflike_argnum = -1;
   2502        1.1       cgd 		}
   2503        1.1       cgd 	}
   2504       1.87    rillig }
   2505       1.87    rillig 
   2506       1.87    rillig /*
   2507      1.364    rillig  * Checks compatibility of an old-style function definition with a previous
   2508      1.364    rillig  * prototype declaration.
   2509      1.364    rillig  * Returns true if the position of the previous declaration should be reported.
   2510      1.364    rillig  */
   2511      1.364    rillig static bool
   2512      1.374    rillig check_prototype_declaration(const sym_t *old_param, const sym_t *proto_param)
   2513      1.364    rillig {
   2514      1.374    rillig 	type_t *old_tp = old_param->s_type;
   2515      1.374    rillig 	type_t *proto_tp = proto_param->s_type;
   2516      1.364    rillig 	bool dowarn = false;
   2517      1.364    rillig 
   2518      1.374    rillig 	if (!types_compatible(old_tp, proto_tp, true, true, &dowarn)) {
   2519      1.374    rillig 		if (types_compatible(old_tp, proto_tp, true, false, &dowarn)) {
   2520      1.364    rillig 			/* type of '%s' does not match prototype */
   2521      1.374    rillig 			return gnuism(58, old_param->s_name);
   2522      1.364    rillig 		} else {
   2523      1.364    rillig 			/* type of '%s' does not match prototype */
   2524      1.374    rillig 			error(58, old_param->s_name);
   2525      1.364    rillig 			return true;
   2526      1.364    rillig 		}
   2527      1.364    rillig 	}
   2528      1.364    rillig 	if (dowarn) {
   2529      1.364    rillig 		/* TODO: Make this an error in C99 mode as well. */
   2530      1.364    rillig 		if (!allow_trad && !allow_c99)
   2531      1.364    rillig 			/* type of '%s' does not match prototype */
   2532      1.374    rillig 			error(58, old_param->s_name);
   2533      1.364    rillig 		else
   2534      1.364    rillig 			/* type of '%s' does not match prototype */
   2535      1.374    rillig 			warning(58, old_param->s_name);
   2536      1.364    rillig 		return true;
   2537      1.364    rillig 	}
   2538      1.364    rillig 
   2539      1.364    rillig 	return false;
   2540      1.364    rillig }
   2541      1.364    rillig 
   2542      1.364    rillig /*
   2543      1.374    rillig  * Warn about parameters in old-style function definitions that default to int.
   2544      1.300    rillig  * Check that an old-style function definition is compatible to a previous
   2545       1.87    rillig  * prototype.
   2546       1.87    rillig  */
   2547       1.87    rillig void
   2548      1.374    rillig check_func_old_style_parameters(void)
   2549       1.87    rillig {
   2550      1.374    rillig 	sym_t *old_params = funcsym->u.s_old_style_params;
   2551      1.396    rillig 	sym_t *proto_params = funcsym->s_type->u.params;
   2552       1.87    rillig 
   2553      1.374    rillig 	for (sym_t *arg = old_params; arg != NULL; arg = arg->s_next) {
   2554      1.374    rillig 		if (arg->s_defparam) {
   2555      1.374    rillig 			/* type of parameter '%s' defaults to 'int' */
   2556        1.1       cgd 			warning(32, arg->s_name);
   2557      1.374    rillig 			arg->s_defparam = false;
   2558       1.75    rillig 			mark_as_set(arg);
   2559        1.1       cgd 		}
   2560        1.1       cgd 	}
   2561        1.1       cgd 
   2562        1.1       cgd 	/*
   2563      1.382    rillig 	 * If this is an old-style function definition and a prototype exists,
   2564      1.382    rillig 	 * compare the types of parameters.
   2565        1.1       cgd 	 */
   2566        1.1       cgd 	if (funcsym->s_osdef && funcsym->s_type->t_proto) {
   2567        1.1       cgd 		/*
   2568      1.374    rillig 		 * If the number of parameters does not match, we need not
   2569        1.1       cgd 		 * continue.
   2570        1.1       cgd 		 */
   2571      1.374    rillig 		int old_n = 0, proto_n = 0;
   2572      1.374    rillig 		bool msg = false;
   2573      1.374    rillig 		for (const sym_t *p = proto_params; p != NULL; p = p->s_next)
   2574      1.374    rillig 			proto_n++;
   2575      1.374    rillig 		for (const sym_t *p = old_params; p != NULL; p = p->s_next)
   2576      1.374    rillig 			old_n++;
   2577      1.374    rillig 		if (old_n != proto_n) {
   2578        1.1       cgd 			/* parameter mismatch: %d declared, %d defined */
   2579      1.374    rillig 			error(51, proto_n, old_n);
   2580      1.122    rillig 			msg = true;
   2581        1.1       cgd 		} else {
   2582      1.374    rillig 			const sym_t *proto_param = proto_params;
   2583      1.374    rillig 			const sym_t *old_param = old_params;
   2584      1.374    rillig 			while (old_n-- > 0) {
   2585      1.374    rillig 				msg |= check_prototype_declaration(old_param, proto_param);
   2586      1.374    rillig 				proto_param = proto_param->s_next;
   2587      1.374    rillig 				old_param = old_param->s_next;
   2588        1.1       cgd 			}
   2589        1.1       cgd 		}
   2590      1.392    rillig 		if (msg && rflag)
   2591        1.1       cgd 			/* prototype declaration */
   2592      1.299    rillig 			message_at(285, &dcs->d_redeclared_symbol->s_def_pos);
   2593        1.6       jpo 
   2594       1.73    rillig 		/* from now on the prototype is valid */
   2595      1.122    rillig 		funcsym->s_osdef = false;
   2596      1.374    rillig 		funcsym->u.s_old_style_params = NULL;
   2597        1.1       cgd 	}
   2598        1.1       cgd }
   2599        1.1       cgd 
   2600      1.229    rillig static void
   2601  1.403.2.1  perseant check_local_hiding(const sym_t *dsym, const sym_t *rdsym)
   2602      1.229    rillig {
   2603      1.229    rillig 	switch (dsym->s_scl) {
   2604      1.229    rillig 	case AUTO:
   2605  1.403.2.1  perseant 		/* automatic '%s' hides external declaration with type '%s' */
   2606  1.403.2.1  perseant 		warning(86, dsym->s_name, type_name(rdsym->s_type));
   2607      1.229    rillig 		break;
   2608      1.229    rillig 	case STATIC:
   2609  1.403.2.1  perseant 		/* static '%s' hides external declaration with type '%s' */
   2610  1.403.2.1  perseant 		warning(87, dsym->s_name, type_name(rdsym->s_type));
   2611      1.229    rillig 		break;
   2612      1.229    rillig 	case TYPEDEF:
   2613  1.403.2.1  perseant 		/* typedef '%s' hides external declaration with type '%s' */
   2614  1.403.2.1  perseant 		warning(88, dsym->s_name, type_name(rdsym->s_type));
   2615      1.229    rillig 		break;
   2616      1.229    rillig 	case EXTERN:
   2617      1.229    rillig 		/* Already checked in declare_external_in_block. */
   2618      1.229    rillig 		break;
   2619      1.229    rillig 	default:
   2620  1.403.2.1  perseant 		lint_assert(false);
   2621      1.229    rillig 	}
   2622      1.229    rillig }
   2623      1.229    rillig 
   2624      1.229    rillig static void
   2625      1.314    rillig check_local_redeclaration(const sym_t *dsym, sym_t *rdsym)
   2626      1.229    rillig {
   2627      1.314    rillig 	if (rdsym->s_block_level == 0) {
   2628      1.229    rillig 		if (hflag)
   2629  1.403.2.1  perseant 			check_local_hiding(dsym, rdsym);
   2630      1.229    rillig 
   2631      1.314    rillig 	} else if (rdsym->s_block_level == block_level) {
   2632      1.229    rillig 
   2633  1.403.2.1  perseant 		/* no hflag, because it's invalid! */
   2634      1.374    rillig 		if (rdsym->s_param) {
   2635      1.364    rillig 			/*
   2636      1.382    rillig 			 * if allow_c90, a "redeclaration of '%s'" error is
   2637      1.382    rillig 			 * produced below
   2638      1.364    rillig 			 */
   2639      1.364    rillig 			if (!allow_c90) {
   2640      1.392    rillig 				if (hflag)
   2641      1.364    rillig 					/* declaration of '%s' hides ... */
   2642      1.364    rillig 					warning(91, dsym->s_name);
   2643      1.397    rillig 				symtab_remove_forever(rdsym);
   2644      1.364    rillig 			}
   2645      1.364    rillig 		}
   2646      1.364    rillig 
   2647      1.392    rillig 	} else if (rdsym->s_block_level < block_level && hflag)
   2648      1.392    rillig 		/* declaration of '%s' hides earlier one */
   2649      1.392    rillig 		warning(95, dsym->s_name);
   2650      1.364    rillig 
   2651      1.364    rillig 	if (rdsym->s_block_level == block_level) {
   2652      1.364    rillig 		/* redeclaration of '%s' */
   2653      1.364    rillig 		error(27, dsym->s_name);
   2654      1.397    rillig 		symtab_remove_forever(rdsym);
   2655      1.364    rillig 	}
   2656      1.364    rillig }
   2657      1.364    rillig 
   2658      1.364    rillig /* Processes (re)declarations of external symbols inside blocks. */
   2659      1.364    rillig static void
   2660      1.364    rillig declare_external_in_block(sym_t *dsym)
   2661      1.364    rillig {
   2662      1.364    rillig 
   2663      1.364    rillig 	/* look for a symbol with the same name */
   2664      1.364    rillig 	sym_t *esym = dcs->d_redeclared_symbol;
   2665      1.364    rillig 	while (esym != NULL && esym->s_block_level != 0) {
   2666      1.364    rillig 		while ((esym = esym->s_symtab_next) != NULL) {
   2667      1.389    rillig 			if (esym->s_kind != SK_VCFT)
   2668      1.364    rillig 				continue;
   2669      1.364    rillig 			if (strcmp(dsym->s_name, esym->s_name) == 0)
   2670      1.364    rillig 				break;
   2671      1.364    rillig 		}
   2672      1.364    rillig 	}
   2673      1.364    rillig 	if (esym == NULL)
   2674      1.364    rillig 		return;
   2675      1.364    rillig 	if (esym->s_scl != EXTERN && esym->s_scl != STATIC) {
   2676      1.364    rillig 		/* gcc accepts this without a warning, pcc prints an error. */
   2677      1.364    rillig 		/* redeclaration of '%s' */
   2678      1.364    rillig 		warning(27, dsym->s_name);
   2679      1.364    rillig 		print_previous_declaration(esym);
   2680      1.364    rillig 		return;
   2681      1.364    rillig 	}
   2682      1.364    rillig 
   2683      1.364    rillig 	bool dowarn = false;
   2684      1.364    rillig 	bool compatible = types_compatible(esym->s_type, dsym->s_type,
   2685      1.364    rillig 	    false, false, &dowarn);
   2686      1.229    rillig 
   2687      1.364    rillig 	if (!compatible || dowarn) {
   2688      1.364    rillig 		if (esym->s_scl == EXTERN) {
   2689      1.364    rillig 			/* inconsistent redeclaration of extern '%s' */
   2690      1.364    rillig 			warning(90, dsym->s_name);
   2691      1.364    rillig 			print_previous_declaration(esym);
   2692      1.364    rillig 		} else {
   2693      1.364    rillig 			/* inconsistent redeclaration of static '%s' */
   2694      1.364    rillig 			warning(92, dsym->s_name);
   2695      1.364    rillig 			print_previous_declaration(esym);
   2696      1.298    rillig 		}
   2697      1.229    rillig 	}
   2698      1.229    rillig 
   2699      1.364    rillig 	if (compatible) {
   2700      1.364    rillig 		/*
   2701      1.364    rillig 		 * Remember the external symbol, so we can update usage
   2702      1.364    rillig 		 * information at the end of the block.
   2703      1.364    rillig 		 */
   2704      1.364    rillig 		dsym->s_ext_sym = esym;
   2705      1.229    rillig 	}
   2706      1.229    rillig }
   2707      1.229    rillig 
   2708        1.1       cgd /*
   2709        1.1       cgd  * Completes a single local declaration/definition.
   2710        1.1       cgd  */
   2711        1.1       cgd void
   2712      1.312    rillig declare_local(sym_t *dsym, bool has_initializer)
   2713        1.1       cgd {
   2714       1.22     lukem 
   2715       1.75    rillig 	/* Correct a mistake done in declarator_name(). */
   2716        1.1       cgd 	if (dsym->s_type->t_tspec == FUNC) {
   2717        1.1       cgd 		dsym->s_def = DECL;
   2718      1.380    rillig 		if (dcs->d_scl == NO_SCL)
   2719        1.1       cgd 			dsym->s_scl = EXTERN;
   2720        1.1       cgd 	}
   2721        1.1       cgd 
   2722      1.392    rillig 	if (dsym->s_scl == EXTERN)
   2723      1.307    rillig 		/* nested 'extern' declaration of '%s' */
   2724      1.307    rillig 		warning(352, dsym->s_name);
   2725      1.307    rillig 
   2726        1.1       cgd 	if (dsym->s_type->t_tspec == FUNC) {
   2727        1.1       cgd 		if (dsym->s_scl == STATIC) {
   2728      1.291    rillig 			/* dubious static function '%s' at block level */
   2729        1.1       cgd 			warning(93, dsym->s_name);
   2730        1.1       cgd 			dsym->s_scl = EXTERN;
   2731        1.1       cgd 		} else if (dsym->s_scl != EXTERN && dsym->s_scl != TYPEDEF) {
   2732  1.403.2.1  perseant 			/* function '%s' has invalid storage class */
   2733        1.1       cgd 			error(94, dsym->s_name);
   2734        1.1       cgd 			dsym->s_scl = EXTERN;
   2735        1.1       cgd 		}
   2736        1.1       cgd 	}
   2737        1.1       cgd 
   2738        1.4       jpo 	/*
   2739      1.382    rillig 	 * functions may be declared inline at local scope, although this has
   2740      1.382    rillig 	 * no effect for a later definition of the same function.
   2741      1.382    rillig 	 *
   2742      1.382    rillig 	 * XXX it should have an effect if !allow_c90 is set. this would also
   2743      1.382    rillig 	 * be the way gcc behaves.
   2744        1.4       jpo 	 */
   2745        1.4       jpo 	if (dcs->d_inline) {
   2746      1.298    rillig 		if (dsym->s_type->t_tspec == FUNC)
   2747      1.122    rillig 			dsym->s_inline = true;
   2748      1.298    rillig 		else {
   2749      1.284    rillig 			/* variable '%s' declared inline */
   2750        1.5       jpo 			warning(268, dsym->s_name);
   2751        1.4       jpo 		}
   2752        1.4       jpo 	}
   2753        1.4       jpo 
   2754  1.403.2.1  perseant 	if (dsym->s_type->t_const
   2755      1.387    rillig 	    && (dsym->s_scl == AUTO || dsym->s_scl == REG)) {
   2756      1.387    rillig 		/* const automatic variable '%s' */
   2757      1.387    rillig 		query_message(18, dsym->s_name);
   2758      1.387    rillig 	}
   2759      1.387    rillig 
   2760      1.124    rillig 	check_function_definition(dsym, true);
   2761        1.1       cgd 
   2762       1.75    rillig 	check_type(dsym);
   2763        1.1       cgd 
   2764      1.154    rillig 	if (dcs->d_redeclared_symbol != NULL && dsym->s_scl == EXTERN)
   2765      1.116    rillig 		declare_external_in_block(dsym);
   2766        1.1       cgd 
   2767        1.1       cgd 	if (dsym->s_scl == EXTERN) {
   2768        1.1       cgd 		/*
   2769      1.382    rillig 		 * XXX if the static variable at level 0 is only defined later,
   2770      1.382    rillig 		 * checking will be possible.
   2771        1.1       cgd 		 */
   2772      1.298    rillig 		if (dsym->s_ext_sym == NULL)
   2773        1.4       jpo 			outsym(dsym, EXTERN, dsym->s_def);
   2774      1.298    rillig 		else
   2775       1.83    rillig 			outsym(dsym, dsym->s_ext_sym->s_scl, dsym->s_def);
   2776        1.1       cgd 	}
   2777        1.1       cgd 
   2778      1.229    rillig 	if (dcs->d_redeclared_symbol != NULL)
   2779      1.229    rillig 		check_local_redeclaration(dsym, dcs->d_redeclared_symbol);
   2780        1.1       cgd 
   2781      1.312    rillig 	if (has_initializer && !check_init(dsym)) {
   2782        1.1       cgd 		dsym->s_def = DEF;
   2783       1.75    rillig 		mark_as_set(dsym);
   2784        1.1       cgd 	}
   2785        1.1       cgd 
   2786        1.1       cgd 	if (dsym->s_scl == TYPEDEF) {
   2787      1.247    rillig 		dsym->s_type = block_dup_type(dsym->s_type);
   2788      1.122    rillig 		dsym->s_type->t_typedef = true;
   2789      1.297    rillig 		set_first_typedef(dsym->s_type, dsym);
   2790        1.1       cgd 	}
   2791        1.1       cgd 
   2792  1.403.2.1  perseant 	if (dsym->s_scl == STATIC)
   2793      1.315    rillig 		/* static variable '%s' in function */
   2794      1.315    rillig 		query_message(11, dsym->s_name);
   2795      1.369    rillig 
   2796      1.369    rillig 	debug_printf("%s: ", __func__);
   2797      1.369    rillig 	debug_sym("", dsym, "\n");
   2798        1.1       cgd }
   2799        1.1       cgd 
   2800      1.327    rillig /* Create a symbol for an abstract declaration. */
   2801      1.375    rillig static sym_t *
   2802      1.375    rillig abstract_name_level(bool enclosing)
   2803        1.1       cgd {
   2804        1.1       cgd 
   2805      1.330    rillig 	lint_assert(dcs->d_kind == DLK_ABSTRACT
   2806      1.330    rillig 	    || dcs->d_kind == DLK_PROTO_PARAMS);
   2807        1.1       cgd 
   2808      1.358    rillig 	sym_t *sym = block_zero_alloc(sizeof(*sym), "sym");
   2809        1.1       cgd 	sym->s_name = unnamed;
   2810        1.1       cgd 	sym->s_def = DEF;
   2811        1.1       cgd 	sym->s_scl = ABSTRACT;
   2812      1.144    rillig 	sym->s_block_level = -1;
   2813      1.374    rillig 	sym->s_param = dcs->d_kind == DLK_PROTO_PARAMS;
   2814        1.1       cgd 
   2815      1.240    rillig 	/*
   2816      1.382    rillig 	 * At this point, dcs->d_type contains only the basic type.  That type
   2817      1.382    rillig 	 * will be updated later, adding pointers, arrays and functions as
   2818      1.382    rillig 	 * necessary.
   2819      1.240    rillig 	 */
   2820      1.397    rillig 	sym->s_type = enclosing ? dcs->d_enclosing->d_type : dcs->d_type;
   2821      1.154    rillig 	dcs->d_redeclared_symbol = NULL;
   2822        1.1       cgd 
   2823      1.369    rillig 	debug_printf("%s: ", __func__);
   2824      1.369    rillig 	debug_sym("", sym, "\n");
   2825      1.402    rillig 	debug_func_dcs(__func__);
   2826       1.76    rillig 	return sym;
   2827        1.1       cgd }
   2828        1.1       cgd 
   2829      1.375    rillig sym_t *
   2830      1.375    rillig abstract_name(void)
   2831      1.375    rillig {
   2832      1.375    rillig 	return abstract_name_level(false);
   2833      1.375    rillig }
   2834      1.375    rillig 
   2835      1.375    rillig sym_t *
   2836      1.375    rillig abstract_enclosing_name(void)
   2837      1.375    rillig {
   2838      1.375    rillig 	return abstract_name_level(true);
   2839      1.375    rillig }
   2840      1.375    rillig 
   2841      1.327    rillig /* Removes anything which has nothing to do on global level. */
   2842        1.1       cgd void
   2843       1.77    rillig global_clean_up(void)
   2844        1.1       cgd {
   2845       1.22     lukem 
   2846      1.259    rillig 	while (dcs->d_enclosing != NULL)
   2847      1.160    rillig 		end_declaration_level();
   2848        1.1       cgd 
   2849      1.253    rillig 	clean_up_after_error();
   2850      1.144    rillig 	block_level = 0;
   2851      1.144    rillig 	mem_block_level = 0;
   2852      1.357    rillig 	debug_step("%s: mem_block_level = %zu", __func__, mem_block_level);
   2853      1.124    rillig 	global_clean_up_decl(true);
   2854        1.1       cgd }
   2855        1.1       cgd 
   2856        1.1       cgd sym_t *
   2857      1.320    rillig declare_abstract_type(sym_t *sym)
   2858        1.1       cgd {
   2859       1.22     lukem 
   2860      1.124    rillig 	check_function_definition(sym, true);
   2861       1.75    rillig 	check_type(sym);
   2862       1.76    rillig 	return sym;
   2863        1.1       cgd }
   2864        1.1       cgd 
   2865      1.327    rillig /* Checks size after declarations of variables and their initialization. */
   2866        1.1       cgd void
   2867      1.365    rillig check_size(const sym_t *dsym)
   2868        1.1       cgd {
   2869       1.22     lukem 
   2870      1.298    rillig 	if (dsym->s_def == DEF &&
   2871      1.298    rillig 	    dsym->s_scl != TYPEDEF &&
   2872      1.298    rillig 	    dsym->s_type->t_tspec != FUNC &&
   2873      1.298    rillig 	    length_in_bits(dsym->s_type, dsym->s_name) == 0 &&
   2874      1.298    rillig 	    dsym->s_type->t_tspec == ARRAY &&
   2875      1.396    rillig 	    dsym->s_type->u.dimension == 0) {
   2876      1.327    rillig 		if (!allow_c90)
   2877      1.293    rillig 			/* empty array declaration for '%s' */
   2878        1.1       cgd 			warning(190, dsym->s_name);
   2879      1.327    rillig 		else
   2880      1.293    rillig 			/* empty array declaration for '%s' */
   2881        1.1       cgd 			error(190, dsym->s_name);
   2882        1.1       cgd 	}
   2883        1.1       cgd }
   2884        1.1       cgd 
   2885      1.327    rillig /* Mark an object as set if it is not already. */
   2886        1.1       cgd void
   2887       1.75    rillig mark_as_set(sym_t *sym)
   2888        1.1       cgd {
   2889       1.22     lukem 
   2890        1.1       cgd 	if (!sym->s_set) {
   2891      1.122    rillig 		sym->s_set = true;
   2892      1.328    rillig 		sym->s_set_pos = unique_curr_pos();
   2893        1.1       cgd 	}
   2894        1.1       cgd }
   2895        1.1       cgd 
   2896      1.327    rillig /* Mark an object as used if it is not already. */
   2897        1.1       cgd void
   2898      1.122    rillig mark_as_used(sym_t *sym, bool fcall, bool szof)
   2899        1.1       cgd {
   2900       1.22     lukem 
   2901        1.1       cgd 	if (!sym->s_used) {
   2902      1.122    rillig 		sym->s_used = true;
   2903      1.328    rillig 		sym->s_use_pos = unique_curr_pos();
   2904        1.1       cgd 	}
   2905        1.1       cgd 	/*
   2906      1.302    rillig 	 * For function calls, another record is written.
   2907        1.1       cgd 	 *
   2908      1.302    rillig 	 * XXX: Should symbols used in sizeof() be treated as used or not?
   2909      1.302    rillig 	 * Probably not, because there is no point in declaring an external
   2910      1.302    rillig 	 * variable only to get its size.
   2911        1.1       cgd 	 */
   2912      1.389    rillig 	if (!fcall && !szof && sym->s_kind == SK_VCFT && sym->s_scl == EXTERN)
   2913        1.1       cgd 		outusg(sym);
   2914        1.1       cgd }
   2915        1.1       cgd 
   2916      1.327    rillig /* Warns about variables and labels that are not used or only set. */
   2917        1.1       cgd void
   2918      1.365    rillig check_usage(const decl_level *dl)
   2919        1.1       cgd {
   2920       1.57  christos 	/* for this warning LINTED has no effect */
   2921      1.298    rillig 	int saved_lwarn = lwarn;
   2922       1.56  christos 	lwarn = LWARN_ALL;
   2923        1.1       cgd 
   2924      1.216    rillig 	debug_step("begin lwarn %d", lwarn);
   2925      1.330    rillig 	for (sym_t *sym = dl->d_first_dlsym;
   2926      1.381    rillig 	    sym != NULL; sym = sym->s_level_next)
   2927      1.330    rillig 		check_usage_sym(dl->d_asm, sym);
   2928      1.282    rillig 	lwarn = saved_lwarn;
   2929      1.216    rillig 	debug_step("end lwarn %d", lwarn);
   2930        1.1       cgd }
   2931        1.1       cgd 
   2932        1.1       cgd static void
   2933      1.374    rillig check_parameter_usage(bool novar, const sym_t *arg)
   2934        1.1       cgd {
   2935       1.22     lukem 
   2936       1.92    rillig 	lint_assert(arg->s_set);
   2937        1.1       cgd 
   2938       1.10       jpo 	if (novar)
   2939       1.10       jpo 		return;
   2940       1.10       jpo 
   2941      1.392    rillig 	if (!arg->s_used && !vflag)
   2942      1.347    rillig 		/* parameter '%s' unused in function '%s' */
   2943      1.178    rillig 		warning_at(231, &arg->s_def_pos, arg->s_name, funcsym->s_name);
   2944        1.1       cgd }
   2945        1.1       cgd 
   2946        1.1       cgd static void
   2947      1.365    rillig check_variable_usage(bool novar, const sym_t *sym)
   2948        1.1       cgd {
   2949        1.1       cgd 
   2950      1.144    rillig 	lint_assert(block_level != 0);
   2951      1.186    rillig 
   2952      1.186    rillig 	/* example at file scope: int c = ({ return 3; }); */
   2953      1.403    rillig 	if (sym->s_block_level == 0 && ch_isdigit(sym->s_name[0]))
   2954      1.186    rillig 		return;
   2955        1.1       cgd 
   2956        1.1       cgd 	/* errors in expressions easily cause lots of these warnings */
   2957      1.342    rillig 	if (seen_error)
   2958        1.1       cgd 		return;
   2959        1.1       cgd 
   2960        1.1       cgd 	/*
   2961      1.382    rillig 	 * XXX Only variables are checked, although types should probably also
   2962      1.382    rillig 	 * be checked
   2963        1.1       cgd 	 */
   2964      1.327    rillig 	scl_t sc = sym->s_scl;
   2965      1.298    rillig 	if (sc != EXTERN && sc != STATIC && sc != AUTO && sc != REG)
   2966        1.1       cgd 		return;
   2967       1.10       jpo 
   2968       1.10       jpo 	if (novar)
   2969       1.10       jpo 		return;
   2970        1.1       cgd 
   2971        1.1       cgd 	if (sc == EXTERN) {
   2972        1.1       cgd 		if (!sym->s_used && !sym->s_set) {
   2973      1.171    rillig 			/* '%s' unused in function '%s' */
   2974      1.178    rillig 			warning_at(192, &sym->s_def_pos,
   2975      1.177    rillig 			    sym->s_name, funcsym->s_name);
   2976        1.1       cgd 		}
   2977        1.1       cgd 	} else {
   2978        1.1       cgd 		if (sym->s_set && !sym->s_used) {
   2979      1.171    rillig 			/* '%s' set but not used in function '%s' */
   2980      1.178    rillig 			warning_at(191, &sym->s_set_pos,
   2981      1.177    rillig 			    sym->s_name, funcsym->s_name);
   2982        1.1       cgd 		} else if (!sym->s_used) {
   2983      1.171    rillig 			/* '%s' unused in function '%s' */
   2984      1.178    rillig 			warning_at(192, &sym->s_def_pos,
   2985      1.177    rillig 			    sym->s_name, funcsym->s_name);
   2986        1.1       cgd 		}
   2987        1.1       cgd 	}
   2988        1.1       cgd 
   2989        1.1       cgd 	if (sc == EXTERN) {
   2990        1.1       cgd 		/*
   2991      1.382    rillig 		 * information about usage is taken over into the symbol table
   2992      1.382    rillig 		 * entry at level 0 if the symbol was locally declared as an
   2993      1.382    rillig 		 * external symbol.
   2994        1.1       cgd 		 *
   2995      1.382    rillig 		 * XXX This is wrong for symbols declared static at level 0 if
   2996      1.382    rillig 		 * the usage information stems from sizeof(). This is because
   2997      1.382    rillig 		 * symbols at level 0 only used in sizeof() are considered to
   2998      1.382    rillig 		 * not be used.
   2999        1.1       cgd 		 */
   3000      1.327    rillig 		sym_t *xsym = sym->s_ext_sym;
   3001      1.327    rillig 		if (xsym != NULL) {
   3002        1.1       cgd 			if (sym->s_used && !xsym->s_used) {
   3003      1.122    rillig 				xsym->s_used = true;
   3004       1.85    rillig 				xsym->s_use_pos = sym->s_use_pos;
   3005        1.1       cgd 			}
   3006        1.1       cgd 			if (sym->s_set && !xsym->s_set) {
   3007      1.122    rillig 				xsym->s_set = true;
   3008       1.85    rillig 				xsym->s_set_pos = sym->s_set_pos;
   3009        1.1       cgd 			}
   3010        1.1       cgd 		}
   3011        1.1       cgd 	}
   3012        1.1       cgd }
   3013        1.1       cgd 
   3014        1.1       cgd static void
   3015      1.365    rillig check_label_usage(const sym_t *lab)
   3016        1.1       cgd {
   3017       1.22     lukem 
   3018      1.144    rillig 	lint_assert(block_level == 1);
   3019      1.144    rillig 	lint_assert(lab->s_block_level == 1);
   3020        1.1       cgd 
   3021      1.327    rillig 	if (funcsym == NULL)
   3022      1.283    rillig 		/* syntax error '%s' */
   3023      1.283    rillig 		error(249, "labels are only valid inside a function");
   3024      1.327    rillig 	else if (lab->s_set && !lab->s_used)
   3025      1.198    rillig 		/* label '%s' unused in function '%s' */
   3026      1.178    rillig 		warning_at(232, &lab->s_set_pos, lab->s_name, funcsym->s_name);
   3027      1.327    rillig 	else if (!lab->s_set)
   3028      1.198    rillig 		/* undefined label '%s' */
   3029      1.178    rillig 		warning_at(23, &lab->s_use_pos, lab->s_name);
   3030        1.1       cgd }
   3031        1.1       cgd 
   3032        1.1       cgd static void
   3033      1.365    rillig check_tag_usage(const sym_t *sym)
   3034        1.1       cgd {
   3035       1.22     lukem 
   3036      1.132    rillig 	if (!is_incomplete(sym->s_type))
   3037        1.1       cgd 		return;
   3038        1.1       cgd 
   3039       1.73    rillig 	/* always complain about incomplete tags declared inside blocks */
   3040      1.341    rillig 	if (zflag || dcs->d_kind != DLK_EXTERN)
   3041        1.1       cgd 		return;
   3042        1.1       cgd 
   3043        1.1       cgd 	switch (sym->s_type->t_tspec) {
   3044        1.1       cgd 	case STRUCT:
   3045      1.284    rillig 		/* struct '%s' never defined */
   3046      1.178    rillig 		warning_at(233, &sym->s_def_pos, sym->s_name);
   3047        1.1       cgd 		break;
   3048        1.1       cgd 	case UNION:
   3049      1.284    rillig 		/* union '%s' never defined */
   3050      1.178    rillig 		warning_at(234, &sym->s_def_pos, sym->s_name);
   3051        1.1       cgd 		break;
   3052      1.327    rillig 	default:
   3053      1.327    rillig 		lint_assert(sym->s_type->t_tspec == ENUM);
   3054      1.284    rillig 		/* enum '%s' never defined */
   3055      1.178    rillig 		warning_at(235, &sym->s_def_pos, sym->s_name);
   3056        1.1       cgd 		break;
   3057        1.1       cgd 	}
   3058        1.1       cgd }
   3059        1.1       cgd 
   3060      1.364    rillig /* Warns about a variable or a label that is not used or only set. */
   3061        1.1       cgd void
   3062      1.365    rillig check_usage_sym(bool novar, const sym_t *sym)
   3063      1.364    rillig {
   3064      1.364    rillig 
   3065      1.364    rillig 	if (sym->s_block_level == -1)
   3066      1.364    rillig 		return;
   3067      1.364    rillig 
   3068      1.389    rillig 	if (sym->s_kind == SK_VCFT && sym->s_param)
   3069      1.374    rillig 		check_parameter_usage(novar, sym);
   3070      1.389    rillig 	else if (sym->s_kind == SK_VCFT)
   3071      1.364    rillig 		check_variable_usage(novar, sym);
   3072      1.389    rillig 	else if (sym->s_kind == SK_LABEL)
   3073      1.364    rillig 		check_label_usage(sym);
   3074      1.389    rillig 	else if (sym->s_kind == SK_TAG)
   3075      1.364    rillig 		check_tag_usage(sym);
   3076      1.364    rillig }
   3077      1.364    rillig 
   3078      1.364    rillig static void
   3079      1.364    rillig check_global_variable_size(const sym_t *sym)
   3080        1.1       cgd {
   3081        1.1       cgd 
   3082      1.364    rillig 	if (sym->s_def != TDEF)
   3083      1.364    rillig 		return;
   3084      1.392    rillig 	if (sym->s_type->t_tspec == FUNC)
   3085      1.364    rillig 		/* Maybe a syntax error after a function declaration. */
   3086      1.364    rillig 		return;
   3087      1.392    rillig 	if (sym->s_def == TDEF && sym->s_type->t_tspec == VOID)
   3088      1.364    rillig 		/* Prevent an internal error in length_in_bits below. */
   3089      1.364    rillig 		return;
   3090      1.364    rillig 
   3091      1.364    rillig 	pos_t cpos = curr_pos;
   3092      1.364    rillig 	curr_pos = sym->s_def_pos;
   3093      1.364    rillig 	int len_in_bits = length_in_bits(sym->s_type, sym->s_name);
   3094      1.364    rillig 	curr_pos = cpos;
   3095        1.1       cgd 
   3096      1.364    rillig 	if (len_in_bits == 0 &&
   3097      1.396    rillig 	    sym->s_type->t_tspec == ARRAY && sym->s_type->u.dimension == 0) {
   3098      1.364    rillig 		/* TODO: C99 6.7.5.2p1 defines this as an error as well. */
   3099      1.364    rillig 		if (!allow_c90 ||
   3100      1.364    rillig 		    (sym->s_scl == EXTERN && (allow_trad || allow_c99))) {
   3101      1.364    rillig 			/* empty array declaration for '%s' */
   3102      1.364    rillig 			warning_at(190, &sym->s_def_pos, sym->s_name);
   3103      1.364    rillig 		} else {
   3104      1.364    rillig 			/* empty array declaration for '%s' */
   3105      1.364    rillig 			error_at(190, &sym->s_def_pos, sym->s_name);
   3106      1.364    rillig 		}
   3107        1.1       cgd 	}
   3108        1.1       cgd }
   3109        1.1       cgd 
   3110        1.1       cgd static void
   3111      1.120    rillig check_unused_static_global_variable(const sym_t *sym)
   3112      1.120    rillig {
   3113      1.120    rillig 	if (sym->s_type->t_tspec == FUNC) {
   3114      1.120    rillig 		if (sym->s_def == DEF) {
   3115      1.120    rillig 			if (!sym->s_inline)
   3116      1.284    rillig 				/* static function '%s' unused */
   3117      1.178    rillig 				warning_at(236, &sym->s_def_pos, sym->s_name);
   3118      1.392    rillig 		} else
   3119      1.293    rillig 			/* static function '%s' declared but not defined */
   3120      1.178    rillig 			warning_at(290, &sym->s_def_pos, sym->s_name);
   3121      1.392    rillig 	} else if (!sym->s_set)
   3122      1.284    rillig 		/* static variable '%s' unused */
   3123      1.178    rillig 		warning_at(226, &sym->s_def_pos, sym->s_name);
   3124      1.392    rillig 	else
   3125      1.284    rillig 		/* static variable '%s' set but not used */
   3126      1.178    rillig 		warning_at(307, &sym->s_def_pos, sym->s_name);
   3127      1.120    rillig }
   3128      1.120    rillig 
   3129      1.120    rillig static void
   3130      1.120    rillig check_static_global_variable(const sym_t *sym)
   3131      1.120    rillig {
   3132      1.392    rillig 	if (sym->s_type->t_tspec == FUNC && sym->s_used && sym->s_def != DEF)
   3133      1.293    rillig 		/* static function '%s' called but not defined */
   3134      1.178    rillig 		error_at(225, &sym->s_use_pos, sym->s_name);
   3135      1.120    rillig 
   3136      1.120    rillig 	if (!sym->s_used)
   3137      1.120    rillig 		check_unused_static_global_variable(sym);
   3138      1.120    rillig 
   3139      1.392    rillig 	if (allow_c90 && sym->s_def == TDEF && sym->s_type->t_const)
   3140      1.293    rillig 		/* const object '%s' should have initializer */
   3141      1.178    rillig 		warning_at(227, &sym->s_def_pos, sym->s_name);
   3142      1.120    rillig }
   3143      1.120    rillig 
   3144      1.120    rillig static void
   3145      1.120    rillig check_global_variable(const sym_t *sym)
   3146        1.1       cgd {
   3147      1.272    rillig 	scl_t scl = sym->s_scl;
   3148       1.22     lukem 
   3149      1.272    rillig 	if (scl == TYPEDEF || scl == BOOL_CONST || scl == ENUM_CONST)
   3150        1.1       cgd 		return;
   3151       1.22     lukem 
   3152      1.380    rillig 	if (scl == NO_SCL)
   3153      1.119    rillig 		return;		/* May be caused by a syntax error. */
   3154      1.119    rillig 
   3155      1.272    rillig 	lint_assert(scl == EXTERN || scl == STATIC);
   3156        1.1       cgd 
   3157       1.75    rillig 	check_global_variable_size(sym);
   3158        1.1       cgd 
   3159      1.272    rillig 	if (scl == STATIC)
   3160      1.120    rillig 		check_static_global_variable(sym);
   3161        1.1       cgd }
   3162        1.1       cgd 
   3163      1.364    rillig void
   3164      1.366    rillig end_translation_unit(void)
   3165        1.1       cgd {
   3166       1.22     lukem 
   3167      1.364    rillig 	if (block_level != 0 || dcs->d_enclosing != NULL)
   3168      1.364    rillig 		norecover();
   3169      1.129    rillig 
   3170      1.366    rillig 	for (const sym_t *sym = dcs->d_first_dlsym;
   3171      1.381    rillig 	    sym != NULL; sym = sym->s_level_next) {
   3172      1.364    rillig 		if (sym->s_block_level == -1)
   3173      1.364    rillig 			continue;
   3174      1.389    rillig 		if (sym->s_kind == SK_VCFT)
   3175      1.364    rillig 			check_global_variable(sym);
   3176      1.389    rillig 		else if (sym->s_kind == SK_TAG)
   3177      1.364    rillig 			check_tag_usage(sym);
   3178      1.364    rillig 		else
   3179      1.389    rillig 			lint_assert(sym->s_kind == SK_MEMBER);
   3180        1.1       cgd 	}
   3181        1.1       cgd }
   3182        1.1       cgd 
   3183        1.1       cgd /*
   3184        1.1       cgd  * Prints information about location of previous definition/declaration.
   3185        1.1       cgd  */
   3186        1.1       cgd void
   3187      1.299    rillig print_previous_declaration(const sym_t *psym)
   3188        1.1       cgd {
   3189        1.1       cgd 
   3190        1.1       cgd 	if (!rflag)
   3191        1.1       cgd 		return;
   3192        1.1       cgd 
   3193      1.392    rillig 	if (psym->s_def == DEF || psym->s_def == TDEF)
   3194      1.284    rillig 		/* previous definition of '%s' */
   3195      1.178    rillig 		message_at(261, &psym->s_def_pos, psym->s_name);
   3196      1.392    rillig 	else
   3197      1.284    rillig 		/* previous declaration of '%s' */
   3198      1.178    rillig 		message_at(260, &psym->s_def_pos, psym->s_name);
   3199        1.1       cgd }
   3200      1.146    rillig 
   3201      1.146    rillig /*
   3202      1.146    rillig  * Gets a node for a constant and returns the value of this constant
   3203      1.146    rillig  * as integer.
   3204      1.146    rillig  *
   3205      1.146    rillig  * If the node is not constant or too large for int or of type float,
   3206      1.146    rillig  * a warning will be printed.
   3207      1.146    rillig  *
   3208      1.146    rillig  * to_int_constant() should be used only inside declarations. If it is used in
   3209      1.146    rillig  * expressions, it frees the memory used for the expression.
   3210      1.146    rillig  */
   3211      1.146    rillig int
   3212      1.146    rillig to_int_constant(tnode_t *tn, bool required)
   3213      1.146    rillig {
   3214      1.146    rillig 
   3215      1.295    rillig 	if (tn == NULL)
   3216      1.295    rillig 		return 1;
   3217      1.295    rillig 
   3218      1.331    rillig 	val_t *v = integer_constant(tn, required);
   3219      1.331    rillig 	bool is_unsigned = is_uinteger(v->v_tspec);
   3220      1.337    rillig 	int64_t val = v->u.integer;
   3221      1.331    rillig 	free(v);
   3222      1.146    rillig 
   3223      1.146    rillig 	/*
   3224      1.382    rillig 	 * Abstract declarations are used inside expression. To free the memory
   3225      1.382    rillig 	 * would be a fatal error. We don't free blocks that are inside casts
   3226      1.382    rillig 	 * because these will be used later to match types.
   3227      1.146    rillig 	 */
   3228      1.330    rillig 	if (tn->tn_op != CON && dcs->d_kind != DLK_ABSTRACT)
   3229      1.168    rillig 		expr_free_all();
   3230      1.146    rillig 
   3231      1.331    rillig 	bool out_of_bounds = is_unsigned
   3232      1.331    rillig 	    ? (uint64_t)val > (uint64_t)TARG_INT_MAX
   3233      1.331    rillig 	    : val > (int64_t)TARG_INT_MAX || val < (int64_t)TARG_INT_MIN;
   3234  1.403.2.1  perseant 	if (out_of_bounds) {
   3235  1.403.2.1  perseant 		char buf[256];
   3236  1.403.2.1  perseant 		unsigned long long abs_val = is_unsigned || val >= 0
   3237  1.403.2.1  perseant 		    ? (unsigned long long)val
   3238  1.403.2.1  perseant 		    : -(unsigned long long)val;
   3239  1.403.2.1  perseant 		snprintf(buf, sizeof(buf), "%s%#llx",
   3240  1.403.2.1  perseant 		    is_unsigned || val >= 0 ? "" : "-",	abs_val);
   3241  1.403.2.1  perseant 		/* constant %s too large for 'int' */
   3242  1.403.2.1  perseant 		warning(56, buf);
   3243  1.403.2.1  perseant 	}
   3244      1.331    rillig 	return (int)val;
   3245      1.146    rillig }
   3246