xlint: update.

Bring some important updates from NetBSD up to about 2008/04/25.
The main feature is initial support for C99.

This is a very basic update to make it easier to merge new
compiler attirbutes but more updates are likely to follow.

Obtained from:	NetBSD
MFC after:	2 weeks
This commit is contained in:
Pedro F. Giffuni 2015-03-23 18:45:29 +00:00
parent 347b9f6de0
commit c0089353cf
18 changed files with 868 additions and 356 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: targparam.h,v 1.2 2002/01/30 06:55:00 thorpej Exp $ */
/* $NetBSD: targparam.h,v 1.3 2002/01/31 23:31:34 he Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@ -29,6 +29,8 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD$
*/
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: lint.h,v 1.5 2002/03/07 18:29:56 tv Exp $ */
/* $NetBSD: lint.h,v 1.7 2003/10/27 00:12:44 lukem Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@ -29,6 +29,8 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD$
*/
#if HAVE_CONFIG_H
@ -90,7 +92,7 @@ typedef struct {
u_int tt_isftyp : 1; /* 1 if floating point type */
u_int tt_isatyp : 1; /* 1 if arithmetic type */
u_int tt_issclt : 1; /* 1 if scalar type */
char *tt_name; /* Bezeichnung des Typs */
const char *tt_name; /* Bezeichnung des Typs */
} ttab_t;
#define size(t) (ttab[t].tt_sz)

View File

@ -1,4 +1,4 @@
/* $NetBSD: mem.c,v 1.2 2002/01/21 19:49:51 tv Exp $ */
/* $NetBSD: mem.c,v 1.4 2003/10/16 06:35:26 itojun Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@ -33,8 +33,9 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: mem.c,v 1.2 2002/01/21 19:49:51 tv Exp $");
__RCSID("$NetBSD: mem.c,v 1.4 2003/10/16 06:35:26 itojun Exp $");
#endif
__FBSDID("$FreeBSD$");
#include <stdlib.h>
#include <string.h>
@ -64,9 +65,13 @@ xcalloc(size_t n, size_t s)
void *
xrealloc(void *p, size_t s)
{
void *n;
if ((p = realloc(p, s)) == NULL)
if ((n = realloc(p, s)) == NULL) {
free(p);
nomem();
}
p = n;
return (p);
}

View File

@ -1,5 +1,5 @@
%{
/* $NetBSD: cgram.y,v 1.23 2002/01/31 19:36:53 tv Exp $ */
/* $NetBSD: cgram.y,v 1.40 2008/04/25 17:18:24 christos Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@ -35,7 +35,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: cgram.y,v 1.23 2002/01/31 19:36:53 tv Exp $");
__RCSID("$NetBSD: cgram.y,v 1.40 2008/04/25 17:18:24 christos Exp $");
#endif
__FBSDID("$FreeBSD$");
@ -65,13 +65,13 @@ int mblklev;
*/
static int onowarn = -1;
static int toicon(tnode_t *);
static int toicon(tnode_t *, int);
static void idecl(sym_t *, int, sbuf_t *);
static void ignuptorp(void);
#ifdef DEBUG
static __inline void CLRWFLGS(void);
static __inline void CLRWFLGS(void)
static inline void CLRWFLGS(void);
static inline void CLRWFLGS(void)
{
printf("%s, %d: clear flags %s %d\n", curr_pos.p_file,
curr_pos.p_line, __FILE__, __LINE__);
@ -79,8 +79,8 @@ static __inline void CLRWFLGS(void)
onowarn = -1;
}
static __inline void SAVE(void);
static __inline void SAVE(void)
static inline void SAVE(void);
static inline void SAVE(void)
{
if (onowarn != -1)
abort();
@ -89,8 +89,8 @@ static __inline void SAVE(void)
onowarn = nowarn;
}
static __inline void RESTORE(void);
static __inline void RESTORE(void)
static inline void RESTORE(void);
static inline void RESTORE(void)
{
if (onowarn != -1) {
nowarn = onowarn;
@ -107,6 +107,8 @@ static __inline void RESTORE(void)
#endif
%}
%expect 1
%union {
int y_int;
val_t *y_val;
@ -118,6 +120,7 @@ static __inline void RESTORE(void)
tqual_t y_tqual;
type_t *y_type;
tnode_t *y_tnode;
range_t y_range;
strg_t *y_strg;
pqinf_t *y_pqinf;
};
@ -243,6 +246,8 @@ static __inline void RESTORE(void)
%type <y_sym> parameter_type_list
%type <y_sym> parameter_declaration
%type <y_tnode> expr
%type <y_tnode> expr_stmnt_val
%type <y_tnode> expr_stmnt_list
%type <y_tnode> term
%type <y_tnode> func_arg_list
%type <y_op> point_or_arrow
@ -253,6 +258,8 @@ static __inline void RESTORE(void)
%type <y_strg> string
%type <y_strg> string2
%type <y_sb> opt_asm_or_symbolrename
%type <y_range> range
%type <y_range> lorange
%%
@ -682,12 +689,12 @@ notype_member_decl:
$$ = $1;
}
| notype_decl T_COLON constant {
$$ = bitfield($1, toicon($3));
$$ = bitfield($1, toicon($3, 1));
}
| {
symtyp = FVFT;
} T_COLON constant {
$$ = bitfield(NULL, toicon($3));
$$ = bitfield(NULL, toicon($3, 1));
}
;
@ -696,12 +703,12 @@ type_member_decl:
$$ = $1;
}
| type_decl T_COLON constant {
$$ = bitfield($1, toicon($3));
$$ = bitfield($1, toicon($3, 1));
}
| {
symtyp = FVFT;
} T_COLON constant {
$$ = bitfield(NULL, toicon($3));
$$ = bitfield(NULL, toicon($3, 1));
}
;
@ -784,7 +791,7 @@ enumerator:
$$ = ename($1, enumval, 1);
}
| ename T_ASSIGN constant {
$$ = ename($1, toicon($3), 0);
$$ = ename($1, toicon($3, 1), 0);
}
;
@ -849,7 +856,7 @@ notype_direct_decl:
$$ = addarray($1, 0, 0);
}
| notype_direct_decl T_LBRACK constant T_RBRACK {
$$ = addarray($1, 1, toicon($3));
$$ = addarray($1, 1, toicon($3, 0));
}
| notype_direct_decl param_list {
$$ = addfunc($1, $2);
@ -878,7 +885,7 @@ type_direct_decl:
$$ = addarray($1, 0, 0);
}
| type_direct_decl T_LBRACK constant T_RBRACK {
$$ = addarray($1, 1, toicon($3));
$$ = addarray($1, 1, toicon($3, 0));
}
| type_direct_decl param_list {
$$ = addfunc($1, $2);
@ -914,7 +921,7 @@ direct_param_decl:
$$ = addarray($1, 0, 0);
}
| direct_param_decl T_LBRACK constant T_RBRACK {
$$ = addarray($1, 1, toicon($3));
$$ = addarray($1, 1, toicon($3, 0));
}
| direct_param_decl param_list {
$$ = addfunc($1, $2);
@ -943,7 +950,7 @@ direct_notype_param_decl:
$$ = addarray($1, 0, 0);
}
| direct_notype_param_decl T_LBRACK constant T_RBRACK {
$$ = addarray($1, 1, toicon($3));
$$ = addarray($1, 1, toicon($3, 0));
}
| direct_notype_param_decl param_list {
$$ = addfunc($1, $2);
@ -1121,6 +1128,7 @@ init_expr:
expr %prec T_COMMA {
mkinit($1);
}
| init_by_name init_expr %prec T_COMMA
| init_lbrace init_expr_list init_rbrace
| init_lbrace init_expr_list T_COMMA init_rbrace
| error
@ -1131,6 +1139,38 @@ init_expr_list:
| init_expr_list T_COMMA init_expr
;
lorange:
constant T_ELLIPSE {
$$.lo = toicon($1, 1);
}
;
range:
constant {
$$.lo = toicon($1, 1);
$$.hi = $$.lo + 1;
}
| lorange constant {
$$.lo = $1.lo;
$$.hi = toicon($2, 1);
}
;
init_by_name:
T_LBRACK range T_RBRACK T_ASSIGN {
if (!Sflag)
warning(321);
}
| point identifier T_ASSIGN {
if (!Sflag)
warning(313);
memberpush($2);
}
| identifier T_COLON {
gnuism(315);
memberpush($1);
}
;
init_lbrace:
T_LBRACE {
initlbr();
@ -1187,13 +1227,13 @@ direct_abs_decl:
$$ = addarray(aname(), 0, 0);
}
| T_LBRACK constant T_RBRACK {
$$ = addarray(aname(), 1, toicon($2));
$$ = addarray(aname(), 1, toicon($2, 0));
}
| direct_abs_decl T_LBRACK T_RBRACK {
$$ = addarray($1, 0, 0);
}
| direct_abs_decl T_LBRACK constant T_RBRACK {
$$ = addarray($1, 1, toicon($3));
$$ = addarray($1, 1, toicon($3, 0));
}
| abs_decl_param_list {
$$ = addfunc(aname(), $1);
@ -1207,9 +1247,8 @@ direct_abs_decl:
}
;
stmnt:
non_expr_stmnt:
labeled_stmnt
| expr_stmnt
| comp_stmnt
| selection_stmnt
| iteration_stmnt
@ -1217,6 +1256,10 @@ stmnt:
ftflg = 0;
}
| asm_stmnt
stmnt:
expr_stmnt
| non_expr_stmnt
;
labeled_stmnt:
@ -1231,7 +1274,12 @@ label:
| T_CASE constant T_COLON {
label(T_CASE, NULL, $2);
ftflg = 1;
}
}
| T_CASE constant T_ELLIPSE constant T_COLON {
/* XXX: We don't fill all cases */
label(T_CASE, NULL, $2);
ftflg = 1;
}
| T_DEFAULT T_COLON {
label(T_DEFAULT, NULL, NULL);
ftflg = 1;
@ -1239,11 +1287,11 @@ label:
;
comp_stmnt:
compstmnt_lbrace declaration_list opt_stmnt_list compstmnt_rbrace
| compstmnt_lbrace opt_stmnt_list compstmnt_rbrace
comp_stmnt_lbrace declaration_list opt_stmnt_list comp_stmnt_rbrace
| comp_stmnt_lbrace opt_stmnt_list comp_stmnt_rbrace
;
compstmnt_lbrace:
comp_stmnt_lbrace:
T_LBRACE {
blklev++;
mblklev++;
@ -1251,7 +1299,7 @@ compstmnt_lbrace:
}
;
compstmnt_rbrace:
comp_stmnt_rbrace:
T_RBRACE {
popdecl();
freeblk();
@ -1276,7 +1324,7 @@ stmnt_list:
expr_stmnt:
expr T_SEMI {
expr($1, 0, 0);
expr($1, 0, 0, 1);
ftflg = 0;
}
| T_SEMI {
@ -1284,6 +1332,34 @@ expr_stmnt:
}
;
/*
* The following two productions are used to implement
* ({ [[decl-list] stmt-list] }).
* XXX: This is not well tested.
*/
expr_stmnt_val:
expr T_SEMI {
/* XXX: We should really do that only on the last name */
if ($1->tn_op == NAME)
$1->tn_sym->s_used = 1;
$$ = $1;
expr($1, 0, 0, 0);
ftflg = 0;
}
| non_expr_stmnt {
$$ = getnode();
$$->tn_type = gettyp(VOID);
}
;
expr_stmnt_list:
expr_stmnt_val
| expr_stmnt_list expr_stmnt_val {
$$ = $2;
}
| expr_stmnt_list expr_stmnt_val
;
selection_stmnt:
if_without_else {
SAVE();
@ -1525,6 +1601,26 @@ term:
$2->tn_parn = 1;
$$ = $2;
}
| T_LPARN comp_stmnt_lbrace declaration_list expr_stmnt_list {
blklev--;
mblklev--;
initsym = mktempsym(duptyp($4->tn_type));
mblklev++;
blklev++;
gnuism(320);
} comp_stmnt_rbrace T_RPARN {
$$ = getnnode(initsym, 0);
}
| T_LPARN comp_stmnt_lbrace expr_stmnt_list {
blklev--;
mblklev--;
initsym = mktempsym($3->tn_type);
mblklev++;
blklev++;
gnuism(320);
} comp_stmnt_rbrace T_RPARN {
$$ = getnnode(initsym, 0);
}
| term T_INCDEC {
$$ = build($2 == INC ? INCAFT : DECAFT, $1, NULL);
}
@ -1580,6 +1676,14 @@ term:
| T_LPARN type_name T_RPARN term %prec T_UNOP {
$$ = cast($4, $2);
}
| T_LPARN type_name T_RPARN %prec T_UNOP {
sym_t *tmp = mktempsym($2);
idecl(tmp, 1, NULL);
} init_lbrace init_expr_list init_rbrace {
if (!Sflag)
gnuism(319);
$$ = getnnode(initsym, 0);
}
;
string:
@ -1620,6 +1724,13 @@ point_or_arrow:
}
;
point:
T_STROP {
if ($1 != POINT)
error(249);
}
;
identifier:
T_NAME {
$$ = $1;
@ -1635,7 +1746,6 @@ identifier:
int
yyerror(char *msg)
{
error(249);
if (++sytxerr >= 5)
norecover();
@ -1670,13 +1780,13 @@ q_gt(int64_t a, int64_t b)
* expressions, it frees the memory used for the expression.
*/
static int
toicon(tnode_t *tn)
toicon(tnode_t *tn, int required)
{
int i;
tspec_t t;
val_t *v;
v = constant(tn);
v = constant(tn, required);
/*
* Abstract declarations are used inside expression. To free
@ -1721,7 +1831,7 @@ idecl(sym_t *decl, int initflg, sbuf_t *rename)
case EXTERN:
if (rename != NULL) {
if (decl->s_rename != NULL)
lerror("idecl() 1");
LERROR("idecl()");
s = getlblk(1, rename->sb_len + 1);
(void)memcpy(s, rename->sb_name, rename->sb_len + 1);
@ -1749,7 +1859,7 @@ idecl(sym_t *decl, int initflg, sbuf_t *rename)
decl1loc(decl, initflg);
break;
default:
lerror("idecl() 2");
LERROR("idecl()");
}
if (initflg && !initerr)

View File

@ -1,4 +1,4 @@
/* $NetBSD: decl.c,v 1.29 2002/01/18 21:01:39 thorpej Exp $ */
/* $NetBSD: decl.c,v 1.33 2004/06/20 22:20:16 jmc Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@ -34,7 +34,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: decl.c,v 1.29 2002/01/18 21:01:39 thorpej Exp $");
__RCSID("$NetBSD: decl.c,v 1.33 2004/06/20 22:20:16 jmc Exp $");
#endif
__FBSDID("$FreeBSD$");
@ -197,7 +197,7 @@ setcompl(type_t *tp, int ic)
tp->t_str->sincompl = ic;
} else {
if (t != ENUM)
lerror("setcompl() 1");
LERROR("setcompl()");
tp->t_enum->eincompl = ic;
}
}
@ -256,7 +256,7 @@ addtype(type_t *tp)
* something like "typedef int a; int a b;"
* This should not happen with current grammar.
*/
lerror("addtype()");
LERROR("addtype()");
}
dcs->d_type = tp;
return;
@ -297,7 +297,7 @@ addtype(type_t *tp)
dcs->d_lmod = NOTSPEC;
if (!quadflg)
/* %s C does not support 'long long' */
(void)gnuism(265, tflag ? "traditional" : "ANSI");
(void)c99ism(265, tflag ? "traditional" : "c89");
}
if (dcs->d_type != NULL && dcs->d_type->t_typedef) {
@ -466,7 +466,7 @@ addqual(tqual_t q)
dcs->d_const = 1;
} else {
if (q != VOLATILE)
lerror("addqual() 1");
LERROR("addqual()");
if (dcs->d_volatile) {
/* duplicate "%s" */
warning(10, "volatile");
@ -508,13 +508,13 @@ popdecl(void)
(void)printf("popdecl(%d)\n", (int)dcs->d_ctx);
if (dcs->d_nxt == NULL)
lerror("popdecl() 1");
LERROR("popdecl()");
di = dcs;
dcs = di->d_nxt;
switch (di->d_ctx) {
case EXTERN:
/* there is nothing after external declarations */
lerror("popdecl() 2");
LERROR("popdecl()");
/* NOTREACHED */
case MOS:
case MOU:
@ -562,7 +562,7 @@ popdecl(void)
rmsyms(di->d_dlsyms);
break;
default:
lerror("popdecl() 3");
LERROR("popdecl()");
}
free(di);
}
@ -635,7 +635,7 @@ deftyp(void)
if (tp != NULL && (t != NOTSPEC || s != NOTSPEC || l != NOTSPEC)) {
/* should never happen */
lerror("deftyp() 1");
LERROR("deftyp()");
}
if (tp == NULL) {
@ -674,7 +674,7 @@ deftyp(void)
case VOID:
break;
default:
lerror("deftyp() 2");
LERROR("deftyp()");
}
if (t != INT && t != CHAR && (s != NOTSPEC || l != NOTSPEC)) {
dcs->d_terr = 1;
@ -712,13 +712,13 @@ deftyp(void)
if (dcs->d_const && dcs->d_type->t_const) {
if (!dcs->d_type->t_typedef)
lerror("deftyp() 3");
LERROR("deftyp()");
/* typedef already qualified with "%s" */
warning(68, "const");
}
if (dcs->d_volatile && dcs->d_type->t_volatile) {
if (!dcs->d_type->t_typedef)
lerror("deftyp() 4");
LERROR("deftyp()");
/* typedef already qualified with "%s" */
warning(68, "volatile");
}
@ -777,7 +777,7 @@ length(type_t *tp, const char *name)
switch (tp->t_tspec) {
case FUNC:
/* compiler takes size of function */
lerror("%s", msgs[12]);
LERROR("%s", msgs[12]);
/* NOTREACHED */
case STRUCT:
case UNION:
@ -796,7 +796,7 @@ length(type_t *tp, const char *name)
default:
elsz = size(tp->t_tspec);
if (elsz <= 0)
lerror("length()");
LERROR("length()");
break;
}
return (elem * elsz);
@ -831,7 +831,7 @@ getbound(type_t *tp)
}
}
if (a < CHAR_BIT || a > LINT_ALIGN(1) * CHAR_BIT)
lerror("getbound() 1");
LERROR("getbound()");
return (a);
}
@ -925,7 +925,7 @@ chktyp(sym_t *sym)
if (dcs->d_ctx == PARG) {
if (sym->s_scl != ABSTRACT) {
if (sym->s_name == unnamed)
lerror("chktyp()");
LERROR("chktyp()");
/* void param cannot have name: %s */
error(61, sym->s_name);
*tpp = gettyp(INT);
@ -963,12 +963,12 @@ decl1str(sym_t *dsym)
scl_t sc;
if ((sc = dsym->s_scl) != MOS && sc != MOU)
lerror("decl1str() 1");
LERROR("decl1str()");
if (dcs->d_rdcsym != NULL) {
if ((sc = dcs->d_rdcsym->s_scl) != MOS && sc != MOU)
/* should be ensured by storesym() */
lerror("decl1str() 2");
LERROR("decl1str()");
if (dsym->s_styp == dcs->d_rdcsym->s_styp) {
/* duplicate member name: %s */
error(33, dsym->s_name);
@ -991,11 +991,13 @@ decl1str(sym_t *dsym)
t == SHORT || t == USHORT || t == ENUM) {
if (bitfieldtype_ok == 0) {
if (sflag) {
char buf[64];
/*
* bit-field type '%s' invalid in
* ANSI C
*/
warning(273, tyname(tp));
warning(273,
tyname(buf, sizeof(buf), tp));
} else if (pflag) {
/* nonportable bit-field type */
warning(34);
@ -1051,7 +1053,7 @@ decl1str(sym_t *dsym)
if ((sz = length(dsym->s_type, dsym->s_name)) == 0) {
if (t == ARRAY && dsym->s_type->t_dim == 0) {
/* illegal zero sized structure member: %s */
warning(39, dsym->s_name);
c99ism(39, dsym->s_name);
}
}
@ -1221,12 +1223,12 @@ addarray(sym_t *decl, int dim, int n)
tp->t_dim = n;
if (n < 0) {
/* zero or negative array dimension */
error(20);
/* negative array dimension */
error(20, n);
n = 0;
} else if (n == 0 && dim) {
/* zero or negative array dimension */
warning(20);
/* zero array dimension */
c99ism(322, dim);
} else if (n == 0 && !dim) {
/* is incomplete type */
setcompl(tp, 1);
@ -1417,7 +1419,7 @@ dname(sym_t *sym)
} else if (sc == EXTERN) {
sym->s_def = DECL;
} else {
lerror("dname() 1");
LERROR("dname()");
}
break;
case PARG:
@ -1430,7 +1432,7 @@ dname(sym_t *sym)
sym->s_reg = 1;
sc = AUTO;
} else {
lerror("dname() 2");
LERROR("dname()");
}
sym->s_def = DEF;
break;
@ -1453,11 +1455,11 @@ dname(sym_t *sym)
} else if (sc == EXTERN) {
sym->s_def = DECL;
} else {
lerror("dname() 3");
LERROR("dname()");
}
break;
default:
lerror("dname() 4");
LERROR("dname()");
}
sym->s_scl = sc;
@ -1481,7 +1483,7 @@ iname(sym_t *sym)
/* redeclaration of formal parameter %s */
error(21, sym->s_name);
if (!sym->s_defarg)
lerror("iname()");
LERROR("iname()");
}
sym = pushdown(sym);
}
@ -1514,7 +1516,7 @@ mktag(sym_t *tag, tspec_t kind, int decl, int semi)
} else if (kind == ENUM) {
scl = ENUMTAG;
} else {
lerror("mktag()");
LERROR("mktag()");
}
if (tag != NULL) {
@ -1636,7 +1638,7 @@ scltoa(scl_t sc)
case STRTAG: s = "struct"; break;
case UNIONTAG: s = "union"; break;
case ENUMTAG: s = "enum"; break;
default: lerror("tagttoa()");
default: LERROR("tagttoa()");
}
return (s);
}
@ -1664,7 +1666,7 @@ compltag(type_t *tp, sym_t *fmem)
sp->memb = fmem;
if (sp->size == 0) {
/* zero sized %s */
(void)gnuism(47, ttab[t].tt_name);
(void)c99ism(47, ttab[t].tt_name);
} else {
n = 0;
for (mem = fmem; mem != NULL; mem = mem->s_nxt) {
@ -2143,7 +2145,7 @@ compltyp(sym_t *dsym, sym_t *ssym)
while ((dst = *dstp) != NULL) {
if (src == NULL || dst->t_tspec != src->t_tspec)
lerror("compltyp() 1");
LERROR("compltyp()");
if (dst->t_tspec == ARRAY) {
if (dst->t_dim == 0 && src->t_dim != 0) {
*dstp = dst = duptyp(dst);
@ -2472,7 +2474,7 @@ decl1loc(sym_t *dsym, int initflg)
*/
break;
default:
lerror("decl1loc() 1");
LERROR("decl1loc()");
}
} else if (dcs->d_rdcsym->s_blklev == blklev) {
@ -2621,7 +2623,7 @@ aname(void)
sym_t *sym;
if (dcs->d_ctx != ABSTRACT && dcs->d_ctx != PARG)
lerror("aname()");
LERROR("aname()");
sym = getblk(sizeof (sym_t));
@ -2791,7 +2793,7 @@ chkausg(int novar, sym_t *arg)
{
if (!arg->s_set)
lerror("chkausg() 1");
LERROR("chkausg()");
if (novar)
return;
@ -2810,7 +2812,7 @@ chkvusg(int novar, sym_t *sym)
sym_t *xsym;
if (blklev == 0 || sym->s_blklev == 0)
lerror("chkvusg() 1");
LERROR("chkvusg()");
/* errors in expressions easily cause lots of these warnings */
if (nerr != 0)
@ -2875,7 +2877,7 @@ chklusg(sym_t *lab)
{
if (blklev != 1 || lab->s_blklev != 1)
lerror("chklusg() 1");
LERROR("chklusg()");
if (lab->s_set && !lab->s_used) {
STRUCT_ASSIGN(curr_pos, lab->s_spos);
@ -2914,7 +2916,7 @@ chktusg(sym_t *sym)
warning(235, sym->s_name);
break;
default:
lerror("chktusg() 1");
LERROR("chktusg()");
}
}
@ -2946,7 +2948,7 @@ chkglsyms(void)
chktusg(sym);
} else {
if (sym->s_kind != FMOS)
lerror("chkglsyms() 1");
LERROR("chkglsyms()");
}
}
@ -2961,7 +2963,7 @@ chkglvar(sym_t *sym)
return;
if (sym->s_scl != EXTERN && sym->s_scl != STATIC)
lerror("chkglvar() 1");
LERROR("chkglvar()");
glchksz(sym);

View File

@ -1,4 +1,4 @@
/* $NetBSD: emit1.c,v 1.11 2002/01/31 19:36:54 tv Exp $ */
/* $NetBSD: emit1.c,v 1.14 2004/06/20 22:20:16 jmc Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@ -34,7 +34,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: emit1.c,v 1.11 2002/01/31 19:36:54 tv Exp $");
__RCSID("$NetBSD: emit1.c,v 1.14 2004/06/20 22:20:16 jmc Exp $");
#endif
__FBSDID("$FreeBSD$");
@ -117,7 +117,7 @@ outtype(type_t *tp)
case STRUCT: t = 'T'; s = 's'; break;
case UNION: t = 'T'; s = 'u'; break;
default:
lerror("outtyp() 1");
LERROR("outtyp()");
}
if (tp->t_const)
outchar('c');
@ -257,7 +257,7 @@ outsym(sym_t *sym, scl_t sc, def_t def)
outchar('e');
break;
default:
lerror("outsym() 2");
LERROR("outsym()");
}
if (llibflg && def != DECL) {
/*
@ -485,7 +485,7 @@ outfstrg(strg_t *strg)
u_char *cp;
if (strg->st_tspec != CHAR)
lerror("outfstrg() 1");
LERROR("outfstrg()");
cp = strg->st_cp;

View File

@ -1,4 +1,4 @@
/* $NetBSD: err.c,v 1.17 2002/01/31 19:36:54 tv Exp $ */
/* $NetBSD: err.c,v 1.40 2009/04/15 01:20:57 christos Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@ -33,7 +33,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: err.c,v 1.17 2002/01/31 19:36:54 tv Exp $");
__RCSID("$NetBSD: err.c,v 1.40 2009/04/15 01:20:57 christos Exp $");
#endif
__FBSDID("$FreeBSD$");
@ -76,7 +76,7 @@ const char *msgs[] = {
"null dimension", /* 17 */
"illegal use of 'void'", /* 18 */
"void type for %s", /* 19 */
"zero or negative array dimension", /* 20 */
"negative array dimension (%d)", /* 20 */
"redeclaration of formal parameter %s", /* 21 */
"incomplete or misplaced function definition", /* 22 */
"undefined label %s", /* 23 */
@ -95,7 +95,7 @@ const char *msgs[] = {
"illegal bit-field size", /* 36 */
"zero size bit-field", /* 37 */
"function illegal in structure or union", /* 38 */
"illegal zero sized structure member: %s", /* 39 */
"zero sized array in struct is a C99 extension: %s", /* 39 */
"unknown size: %s", /* 40 */
"illegal use of bit-field", /* 41 */
"forward reference to enum type", /* 42 */
@ -103,7 +103,7 @@ const char *msgs[] = {
"declaration introduces new type in ANSI C: %s %s", /* 44 */
"base type is really '%s %s'", /* 45 */
"(%s) tag redeclared", /* 46 */
"zero sized %s", /* 47 */
"zero sized %s is a C9X feature", /* 47 */
"overflow in enumeration values: %s", /* 48 */
"struct or union member must be named", /* 49 */
"a function is declared as an argument: %s", /* 50 */
@ -188,7 +188,7 @@ const char *msgs[] = {
"expression has null effect", /* 129 */
"enum type mismatch, op %s", /* 130 */
"conversion to '%s' may sign-extend incorrectly", /* 131 */
"conversion from '%s' may lose accuracy", /* 132 */
"conversion from '%s' to '%s' may lose accuracy", /* 132 */
"conversion of pointer to '%s' loses bits", /* 133 */
"conversion of pointer to '%s' may lose bits", /* 134 */
"possible pointer alignment problem", /* 135 */
@ -232,7 +232,7 @@ const char *msgs[] = {
"too many array initializers", /* 173 */
"too many initializers", /* 174 */
"initialisation of an incomplete type", /* 175 */
"invalid initializer", /* 176 */
"invalid initializer type %s", /* 176 */
"non-constant initializer", /* 177 */
"initializer does not fit", /* 178 */
"cannot initialize struct/union with no named member", /* 179 */
@ -354,7 +354,7 @@ const char *msgs[] = {
"conversion of '%s' to '%s' is out of range, arg #%d", /* 295 */
"conversion of negative constant to unsigned type, arg #%d", /* 296 */
"conversion to '%s' may sign-extend incorrectly, arg #%d", /* 297 */
"conversion from '%s' may lose accuracy, arg #%d", /* 298 */
"conversion from '%s' to '%s' may lose accuracy, arg #%d", /* 298 */
"prototype does not match old style definition, arg #%d", /* 299 */
"old style definition", /* 300 */
"array of incomplete type", /* 301 */
@ -369,6 +369,16 @@ const char *msgs[] = {
"symbol renaming can't be used on function arguments", /* 310 */
"symbol renaming can't be used on automatic variables", /* 311 */
"%s C does not support // comments", /* 312 */
"struct or union member name in initializer is a C9X feature",/* 313 */
"%s is not a structure or a union", /* 314 */
"GCC style struct or union member name in initializer", /* 315 */
"__FUNCTION__ is a GCC extension", /* 316 */
"__func__ is a C9X feature", /* 317 */
"variable array dimension is a C99/GCC extension", /* 318 */
"compound literals are a C9X/GCC extension", /* 319 */
"({ }) is a GCC extension", /* 320 */
"array initializer with designators is a C9X feature", /* 321 */
"zero sized array is a C99 extension", /* 322 */
};
/*
@ -377,10 +387,10 @@ const char *msgs[] = {
void
msglist(void)
{
int i;
size_t i;
for (i = 0; i < sizeof(msgs) / sizeof(msgs[0]); i++)
printf("%d\t%s\n", i, msgs[i]);
printf("%zu\t%s\n", i, msgs[i]);
}
/*
@ -451,14 +461,15 @@ error(int n, ...)
}
void
lerror(const char *msg, ...)
lerror(const char *file, int line, const char *msg, ...)
{
va_list ap;
const char *fn;
va_start(ap, msg);
fn = lbasename(curr_pos.p_file);
(void)fprintf(stderr, "%s(%d): lint error: ", fn, curr_pos.p_line);
(void)fprintf(stderr, "%s(%d): lint error: %s, %d", fn, curr_pos.p_line,
file, line);
(void)vfprintf(stderr, msg, ap);
(void)fprintf(stderr, "\n");
va_end(ap);
@ -492,6 +503,33 @@ message(int n, ...)
va_end(ap);
}
/*
* XXX I think the logic is possibly somewhat screwed up here. The
* question is, how do we want to interpret the -s and -S flags going
* forward? We need to answer that and then we can fix this to be
* "right"... [perry, 2 Nov 2002]
*/
int
c99ism(int n, ...)
{
va_list ap;
int msg;
va_start(ap, n);
if (sflag && !(Sflag || gflag)) {
verror(n, ap);
msg = 1;
} else if (!sflag && (Sflag || gflag)) {
msg = 0;
} else {
vwarning(n, ap);
msg = 1;
}
va_end(ap);
return (msg);
}
int
gnuism(int n, ...)
{

View File

@ -1,4 +1,4 @@
/* $NetBSD: externs1.h,v 1.13 2002/01/18 21:01:39 thorpej Exp $ */
/* $NetBSD: externs1.h,v 1.20 2002/11/02 20:09:27 perry Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@ -29,6 +29,8 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD$
*/
/*
@ -50,6 +52,7 @@ extern int vflag;
extern int yflag;
extern int wflag;
extern int zflag;
extern int Sflag;
extern void norecover(void);
@ -80,6 +83,7 @@ extern void clrwflgs(void);
extern sym_t *getsym(sbuf_t *);
extern void cleanup(void);
extern sym_t *pushdown(sym_t *);
extern sym_t *mktempsym(type_t *);
extern void rmsym(sym_t *);
extern void rmsyms(sym_t *);
extern void inssym(int, sym_t *);
@ -118,8 +122,9 @@ extern void error(int, ...);
extern void warning(int, ...);
extern void message(int, ...);
extern int gnuism(int, ...);
extern void lerror(const char *, ...)
__attribute__((__noreturn__,__format__(__printf__, 1, 2)));
extern int c99ism(int, ...);
extern void lerror(const char *, int, const char *, ...)
__attribute__((__noreturn__,__format__(__printf__, 3, 4)));
/*
* decl.c
@ -194,13 +199,14 @@ extern int typeok(op_t, int, tnode_t *, tnode_t *);
extern tnode_t *promote(op_t, int, tnode_t *);
extern tnode_t *convert(op_t, int, type_t *, tnode_t *);
extern void cvtcon(op_t, int, type_t *, val_t *, val_t *);
extern const char *tyname(type_t *);
extern const char *tyname(char *, size_t, type_t *);
extern const char *basictyname(tspec_t);
extern tnode_t *bldszof(type_t *);
extern tnode_t *cast(tnode_t *, type_t *);
extern tnode_t *funcarg(tnode_t *, tnode_t *);
extern tnode_t *funccall(tnode_t *, tnode_t *);
extern val_t *constant(tnode_t *);
extern void expr(tnode_t *, int, int);
extern val_t *constant(tnode_t *, int);
extern void expr(tnode_t *, int, int, int);
extern void chkmisc(tnode_t *, int, int, int, int, int, int);
extern int conaddr(tnode_t *, sym_t **, ptrdiff_t *);
extern strg_t *catstrg(strg_t *, strg_t *);
@ -273,6 +279,7 @@ extern void prepinit(void);
extern void initrbr(void);
extern void initlbr(void);
extern void mkinit(tnode_t *);
extern void memberpush(sbuf_t *);
/*
* emit.c

View File

@ -1,4 +1,4 @@
/* $NetBSD: func.c,v 1.16 2002/01/03 04:25:15 thorpej Exp $ */
/* $NetBSD: func.c,v 1.22 2005/09/24 15:30:35 perry Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@ -167,7 +167,7 @@ popctrl(int env)
clst_t *cl;
if (cstk == NULL || cstk->c_env != env)
lerror("popctrl() 1");
LERROR("popctrl()");
cstk = (ci = cstk)->c_nxt;
@ -220,7 +220,7 @@ funcdef(sym_t *fsym)
for (sym = dcs->d_fpsyms; sym != NULL; sym = sym->s_dlnxt) {
if (sym->s_blklev != -1) {
if (sym->s_blklev != 1)
lerror("funcdef() 1");
LERROR("funcdef()");
inssym(1, sym);
}
}
@ -264,12 +264,12 @@ funcdef(sym_t *fsym)
for (arg = fsym->s_type->t_args; arg != NULL; arg = arg->s_nxt) {
if (arg->s_scl == ABSTRACT) {
if (arg->s_name != unnamed)
lerror("funcdef() 2");
LERROR("funcdef()");
/* formal parameter lacks name: param #%d */
error(59, n);
} else {
if (arg->s_name == unnamed)
lerror("funcdef() 3");
LERROR("funcdef()");
}
n++;
}
@ -389,7 +389,7 @@ funcend(void)
* the symbol table
*/
if (dcs->d_nxt != NULL || dcs->d_ctx != EXTERN)
lerror("funcend() 1");
LERROR("funcend()");
rmsyms(dcs->d_fpsyms);
/* must be set on level 0 */
@ -446,7 +446,7 @@ label(int typ, sym_t *sym, tnode_t *tn)
if (tn != NULL) {
if (ci->c_swtype == NULL)
lerror("label() 1");
LERROR("label()");
if (reached && !ftflg) {
if (hflag)
@ -466,7 +466,7 @@ label(int typ, sym_t *sym, tnode_t *tn)
* get the value of the expression and convert it
* to the type of the switch expression
*/
v = constant(tn);
v = constant(tn, 1);
(void) memset(&nv, 0, sizeof nv);
cvtcon(CASE, 0, ci->c_swtype, &nv, v);
free(v);
@ -532,7 +532,7 @@ if1(tnode_t *tn)
tn = cconv(tn);
if (tn != NULL)
tn = promote(NOOP, 0, tn);
expr(tn, 0, 1);
expr(tn, 0, 1, 1);
pushctrl(T_IF);
}
@ -606,7 +606,7 @@ switch1(tnode_t *tn)
tp->t_tspec = INT;
}
expr(tn, 1, 0);
expr(tn, 1, 0, 1);
pushctrl(T_SWITCH);
cstk->c_switch = 1;
@ -627,7 +627,7 @@ switch2(void)
clst_t *cl;
if (cstk->c_swtype == NULL)
lerror("switch2() 1");
LERROR("switch2()");
/*
* If the switch expression was of type enumeration, count the case
@ -637,7 +637,7 @@ switch2(void)
if (cstk->c_swtype->t_isenum) {
nenum = nclab = 0;
if (cstk->c_swtype->t_enum == NULL)
lerror("switch2() 2");
LERROR("switch2()");
for (esym = cstk->c_swtype->t_enum->elem;
esym != NULL; esym = esym->s_nxt) {
nenum++;
@ -704,7 +704,7 @@ while1(tnode_t *tn)
}
}
expr(tn, 0, 1);
expr(tn, 0, 1, 1);
}
/*
@ -775,7 +775,7 @@ do2(tnode_t *tn)
}
}
expr(tn, 0, 1);
expr(tn, 0, 1, 1);
/*
* The end of the loop is only reached if it is no endless loop
@ -818,7 +818,7 @@ for1(tnode_t *tn1, tnode_t *tn2, tnode_t *tn3)
STRUCT_ASSIGN(cstk->c_cfpos, csrc_pos);
if (tn1 != NULL)
expr(tn1, 0, 0);
expr(tn1, 0, 0, 1);
if (tn2 != NULL)
tn2 = cconv(tn2);
@ -830,7 +830,7 @@ for1(tnode_t *tn1, tnode_t *tn2, tnode_t *tn3)
tn2 = NULL;
}
if (tn2 != NULL)
expr(tn2, 0, 1);
expr(tn2, 0, 1, 1);
if (tn2 == NULL) {
cstk->c_infinite = 1;
@ -877,7 +877,7 @@ for2(void)
}
if (tn3 != NULL) {
expr(tn3, 0, 0);
expr(tn3, 0, 0, 1);
} else {
tfreeblk();
}
@ -1014,7 +1014,7 @@ doreturn(tnode_t *tn)
}
}
expr(tn, 1, 0);
expr(tn, 1, 0, 1);
} else {

View File

@ -1,4 +1,4 @@
/* $NetBSD: init.c,v 1.9 2001/09/18 18:15:54 wiz Exp $ */
/* $NetBSD: init.c,v 1.10 2002/01/31 19:36:54 tv Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@ -33,11 +33,13 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: init.c,v 1.9 2001/09/18 18:15:54 wiz Exp $");
__RCSID("$NetBSD: init.c,v 1.10 2002/01/31 19:36:54 tv Exp $");
#endif
__FBSDID("$FreeBSD$");
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "lint1.h"
@ -54,6 +56,15 @@ sym_t *initsym;
/* Points to the top element of the initialisation stack. */
istk_t *initstk;
typedef struct namlist {
const char *n_name;
struct namlist *n_prev;
struct namlist *n_next;
} namlist_t;
/* Points to a c9x named member; */
namlist_t *namedmem = NULL;
static void popi2(void);
static void popinit(int);
@ -61,6 +72,53 @@ static void pushinit(void);
static void testinit(void);
static void nextinit(int);
static int strginit(tnode_t *);
static void memberpop(void);
#ifndef DEBUG
#define DPRINTF(a)
#else
#define DPRINTF(a) printf a
#endif
void
memberpush(sb)
sbuf_t *sb;
{
namlist_t *nam = xcalloc(1, sizeof (namlist_t));
nam->n_name = sb->sb_name;
DPRINTF(("memberpush = %s\n", nam->n_name));
if (namedmem == NULL) {
nam->n_prev = nam->n_next = nam;
namedmem = nam;
} else {
namedmem->n_prev->n_next = nam;
nam->n_prev = namedmem->n_prev;
nam->n_next = namedmem;
namedmem->n_prev = nam;
}
#if 0
nam->n_next = namedmem;
namedmem = nam;
#endif
}
static void
memberpop()
{
DPRINTF(("memberpop = %s\n", namedmem->n_name));
if (namedmem->n_next == namedmem) {
free(namedmem);
namedmem = NULL;
} else {
namlist_t *nam = namedmem;
namedmem = namedmem->n_next;
free(nam);
}
#if 0
namedmem = namedmem->n_next;
free(nam);
#endif
}
/*
@ -97,29 +155,53 @@ prepinit(void)
static void
popi2(void)
{
#ifdef DEBUG
char buf[64];
#endif
istk_t *istk;
sym_t *m;
initstk = (istk = initstk)->i_nxt;
if (initstk == NULL)
lerror("popi2() 1");
LERROR("popi2()");
free(istk);
istk = initstk;
istk->i_cnt--;
if (istk->i_cnt < 0)
lerror("popi2() 3");
LERROR("popi2()");
DPRINTF(("popi2(): %d %s\n", istk->i_cnt,
namedmem ? namedmem->n_name : "*null*"));
if (istk->i_cnt >= 0 && namedmem != NULL) {
DPRINTF(("popi2(): %d %s %s\n", istk->i_cnt,
tyname(buf, sizeof(buf), istk->i_type), namedmem->n_name));
for (m = istk->i_type->t_str->memb; m != NULL; m = m->s_nxt) {
if (m->s_field && m->s_name == unnamed)
continue;
if (strcmp(m->s_name, namedmem->n_name) == 0) {
istk->i_subt = m->s_type;
istk->i_cnt++;
memberpop();
return;
}
}
error(101, namedmem->n_name);
memberpop();
istk->i_namedmem = 1;
return;
}
/*
* If the removed element was a structure member, we must go
* to the next structure member.
*/
if (istk->i_cnt > 0 && istk->i_type->t_tspec == STRUCT) {
if (istk->i_cnt > 0 && istk->i_type->t_tspec == STRUCT &&
!istk->i_namedmem) {
do {
m = istk->i_mem = istk->i_mem->s_nxt;
if (m == NULL)
lerror("popi2() 2");
LERROR("popi2()");
} while (m->s_field && m->s_name == unnamed);
istk->i_subt = m->s_type;
}
@ -128,6 +210,7 @@ popi2(void)
static void
popinit(int brace)
{
DPRINTF(("popinit(%d)\n", brace));
if (brace) {
/*
@ -154,6 +237,9 @@ popinit(int brace)
static void
pushinit(void)
{
#ifdef DEBUG
char buf[64];
#endif
istk_t *istk;
int cnt;
sym_t *m;
@ -162,35 +248,45 @@ pushinit(void)
/* Extend an incomplete array type by one element */
if (istk->i_cnt == 0) {
DPRINTF(("pushinit(extend) %s\n", tyname(buf, sizeof(buf),
istk->i_type)));
/*
* Inside of other aggregate types must not be an incomplete
* type.
*/
if (istk->i_nxt->i_nxt != NULL)
lerror("pushinit() 1");
LERROR("pushinit()");
istk->i_cnt = 1;
if (istk->i_type->t_tspec != ARRAY)
lerror("pushinit() 2");
LERROR("pushinit()");
istk->i_type->t_dim++;
/* from now its a complete type */
setcompl(istk->i_type, 0);
}
if (istk->i_cnt <= 0)
lerror("pushinit() 3");
LERROR("pushinit()");
if (istk->i_type != NULL && issclt(istk->i_type->t_tspec))
lerror("pushinit() 4");
LERROR("pushinit() 4");
initstk = xcalloc(1, sizeof (istk_t));
initstk->i_nxt = istk;
initstk->i_type = istk->i_subt;
if (initstk->i_type->t_tspec == FUNC)
lerror("pushinit() 5");
LERROR("pushinit()");
again:
istk = initstk;
DPRINTF(("pushinit(%s)\n", tyname(buf, sizeof(buf), istk->i_type)));
switch (istk->i_type->t_tspec) {
case ARRAY:
if (namedmem) {
DPRINTF(("pushinit ARRAY %s\n", namedmem->n_name));
free(istk);
initstk = initstk->i_nxt;
goto again;
}
if (incompl(istk->i_type) && istk->i_nxt->i_nxt != NULL) {
/* initialisation of an incomplete type */
error(175);
@ -200,6 +296,9 @@ pushinit(void)
istk->i_subt = istk->i_type->t_subt;
istk->i_nolimit = incompl(istk->i_type);
istk->i_cnt = istk->i_type->t_dim;
DPRINTF(("elements array %s[%d] %s\n",
tyname(buf, sizeof(buf), istk->i_subt), istk->i_cnt,
namedmem ? namedmem->n_name : "*none*"));
break;
case UNION:
if (tflag)
@ -214,14 +313,38 @@ pushinit(void)
return;
}
cnt = 0;
DPRINTF(("2. member lookup %s %s\n",
tyname(buf, sizeof(buf), istk->i_type),
namedmem ? namedmem->n_name : "*none*"));
for (m = istk->i_type->t_str->memb; m != NULL; m = m->s_nxt) {
if (m->s_field && m->s_name == unnamed)
continue;
if (namedmem != NULL) {
DPRINTF(("pushinit():[member:%s, looking:%s]\n",
m->s_name, namedmem->n_name));
if (strcmp(m->s_name, namedmem->n_name) == 0) {
cnt++;
break;
} else
continue;
}
if (++cnt == 1) {
istk->i_mem = m;
istk->i_subt = m->s_type;
}
}
if (namedmem != NULL) {
istk->i_namedmem = 1;
if (m == NULL) {
error(101, namedmem->n_name);
initerr = 1;
} else {
istk->i_mem = m;
istk->i_subt = m->s_type;
}
memberpop();
cnt = istk->i_type->t_tspec == STRUCT ? 2 : 1;
}
if (cnt == 0) {
/* cannot init. struct/union with no named member */
error(179);
@ -231,6 +354,12 @@ pushinit(void)
istk->i_cnt = istk->i_type->t_tspec == STRUCT ? cnt : 1;
break;
default:
if (namedmem) {
DPRINTF(("pushinit(): pop\n"));
free(istk);
initstk = initstk->i_nxt;
goto again;
}
istk->i_cnt = 1;
break;
}
@ -247,7 +376,7 @@ testinit(void)
* If a closing brace is expected we have at least one initializer
* too much.
*/
if (istk->i_cnt == 0 && !istk->i_nolimit) {
if (istk->i_cnt == 0 && !istk->i_nolimit && !istk->i_namedmem) {
switch (istk->i_type->t_tspec) {
case ARRAY:
/* too many array initializers */
@ -270,7 +399,9 @@ testinit(void)
static void
nextinit(int brace)
{
char buf[64];
DPRINTF(("nextinit(%d)\n", brace));
if (!brace) {
if (initstk->i_type == NULL &&
!issclt(initstk->i_subt->t_tspec)) {
@ -346,14 +477,18 @@ mkinit(tnode_t *tn)
tnode_t *ln;
struct mbl *tmem;
scl_t sc;
#ifdef DEBUG
char buf[64];
#endif
DPRINTF(("mkinit(%s)\n", tyname(buf, sizeof(buf), tn->tn_type)));
if (initerr || tn == NULL)
goto end;
sc = initsym->s_scl;
/*
* Do not test for automatic aggregat initialisation. If the
* Do not test for automatic aggregate initialisation. If the
* initializer starts with a brace we have the warning already.
* If not, an error will be printed that the initializer must
* be enclosed by braces.
@ -369,7 +504,7 @@ mkinit(tnode_t *tn)
ln->tn_type = tduptyp(ln->tn_type);
ln->tn_type->t_const = 0;
tn = build(ASSIGN, ln, tn);
expr(tn, 0, 0);
expr(tn, 0, 0, 1);
goto end;
}
@ -388,7 +523,7 @@ mkinit(tnode_t *tn)
goto end;
initstk->i_cnt--;
DPRINTF(("mkinit() cnt=%d tn=%p\n", initstk->i_cnt, tn));
/* Create a temporary node for the left side. */
ln = tgetblk(sizeof (tnode_t));
ln->tn_op = NAME;
@ -403,7 +538,7 @@ mkinit(tnode_t *tn)
rt = tn->tn_type->t_tspec;
if (!issclt(lt))
lerror("mkinit() 1");
LERROR("mkinit()");
if (!typeok(INIT, 0, ln, tn))
goto end;
@ -413,7 +548,7 @@ mkinit(tnode_t *tn)
* expr() would free it.
*/
tmem = tsave();
expr(tn, 1, 0);
expr(tn, 1, 0, 1);
trestor(tmem);
if (isityp(lt) && ln->tn_type->t_isfield && !isityp(rt)) {
@ -444,7 +579,13 @@ mkinit(tnode_t *tn)
}
end:
tfreeblk();
/*
* We only free the block, if we are not a compound declaration
* We know that the only symbols that start with a digit are the
* ones we allocate with mktempsym() for compound declarations
*/
if (!isdigit((unsigned char)initsym->s_name[0]))
tfreeblk();
}
@ -466,7 +607,7 @@ strginit(tnode_t *tn)
* Check if we have an array type which can be initialized by
* the string.
*/
if (istk->i_subt->t_tspec == ARRAY) {
if (istk->i_subt != NULL && istk->i_subt->t_tspec == ARRAY) {
t = istk->i_subt->t_subt->t_tspec;
if (!((strg->st_tspec == CHAR &&
(t == CHAR || t == UCHAR || t == SCHAR)) ||

View File

@ -1,4 +1,4 @@
/* $NetBSD: lint1.h,v 1.12 2002/01/31 19:33:27 tv Exp $ */
/* $NetBSD: lint1.h,v 1.16 2002/10/21 22:44:08 christos Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@ -106,7 +106,7 @@ typedef struct {
* Structures of type str_t uniqely identify structures. This can't
* be done in structures of type type_t, because these are copied
* if they must be modified. So it would not be possible to check
* if to structures are identical by comparing the pointers to
* if two structures are identical by comparing the pointers to
* the type structures.
*
* The typename is used if the structure is unnamed to identify
@ -141,7 +141,7 @@ typedef struct type {
u_int t_const : 1; /* const modifier */
u_int t_volatile : 1; /* volatile modifier */
u_int t_proto : 1; /* function prototype (t_args valid) */
u_int t_vararg : 1; /* protoype with ... */
u_int t_vararg : 1; /* prototype with ... */
u_int t_typedef : 1; /* type defined with typedef */
u_int t_isfield : 1; /* type is bitfield */
u_int t_isenum : 1; /* type is (or was) enum (t_enum valid) */
@ -221,7 +221,7 @@ typedef struct sym {
u_int s_reg : 1; /* symbol is register variable */
u_int s_defarg : 1; /* undefined symbol in old style function
definition */
u_int s_rimpl : 1; /* return value of function implizit decl. */
u_int s_rimpl : 1; /* return value of function implicit decl. */
u_int s_osdef : 1; /* symbol stems from old style function def. */
u_int s_inline : 1; /* true if this is an inline function */
struct sym *s_xsym; /* for local declared external symbols pointer
@ -347,6 +347,7 @@ typedef struct istk {
type_t *i_subt; /* type of next level */
u_int i_brace : 1; /* need } for pop */
u_int i_nolimit : 1; /* incomplete array type */
u_int i_namedmem : 1; /* has c9x named members */
sym_t *i_mem; /* next structure member */
int i_cnt; /* # of remaining elements */
struct istk *i_nxt; /* previous level */
@ -396,6 +397,11 @@ typedef struct cstk {
struct cstk *c_nxt; /* outer control statement */
} cstk_t;
typedef struct {
size_t lo;
size_t hi;
} range_t;
#include "externs1.h"
#define ERR_SETSIZE 1024
@ -413,4 +419,6 @@ typedef struct err_set {
((p)->errs_bits[(n)/__NERRBITS] & (1 << ((n) % __NERRBITS)))
#define ERR_ZERO(p) (void)memset((p), 0, sizeof(*(p)))
#define LERROR(fmt, args...) lerror(__FILE__, __LINE__, fmt, ##args)
extern err_set msgset;

View File

@ -1,4 +1,4 @@
/* $NetBSD: main1.c,v 1.11 2002/01/29 02:43:38 tv Exp $ */
/* $NetBSD: main1.c,v 1.17 2006/11/08 18:31:15 christos Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@ -33,7 +33,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: main1.c,v 1.11 2002/01/29 02:43:38 tv Exp $");
__RCSID("$NetBSD: main1.c,v 1.17 2006/11/08 18:31:15 christos Exp $");
#endif
__FBSDID("$FreeBSD$");
@ -53,7 +53,7 @@ int yflag;
/*
* Print warnings if an assignment of an integertype to another integertype
* causes an implizit narrowing conversion. If aflag is 1, these warnings
* causes an implicit narrowing conversion. If aflag is 1, these warnings
* are printed only if the source type is at least as wide as long. If aflag
* is greater than 1, they are always printed.
*/
@ -101,6 +101,8 @@ int sflag;
/* Traditional C mode. */
int tflag;
/* Enable C9X extensions */
int Sflag;
/*
* Complain about functions and external variables used and not defined,
* or defined and not used.
@ -126,7 +128,7 @@ main(int argc, char *argv[])
char *ptr;
ERR_ZERO(&msgset);
while ((c = getopt(argc, argv, "abcdeghmprstuvwyzFX:")) != -1) {
while ((c = getopt(argc, argv, "abcdeghmprstuvwyzFSX:")) != -1) {
switch (c) {
case 'a': aflag++; break;
case 'b': bflag = 1; break;
@ -139,6 +141,7 @@ main(int argc, char *argv[])
case 'p': pflag = 1; break;
case 'r': rflag = 1; break;
case 's': sflag = 1; break;
case 'S': Sflag = 1; break;
case 't': tflag = 1; break;
case 'u': uflag = 0; break;
case 'w': wflag = 1; break;
@ -154,7 +157,10 @@ main(int argc, char *argv[])
for (ptr = strtok(optarg, ","); ptr;
ptr = strtok(NULL, ",")) {
char *eptr;
long msg = strtol(ptr, &eptr, 0);
long msg;
errno = 0;
msg = strtol(ptr, &eptr, 0);
if ((msg == LONG_MIN || msg == LONG_MAX) &&
errno == ERANGE)
err(1, "invalid error message id '%s'",
@ -197,7 +203,9 @@ main(int argc, char *argv[])
/* Following warnings cannot be suppressed by LINTED */
nowarn = 0;
#ifdef DEBUG
printf("%s, %d: nowarn = 0\n", curr_pos.p_file, curr_pos.p_line);
#endif
chkglsyms();
outclose();
@ -209,7 +217,7 @@ static void
usage(void)
{
(void)fprintf(stderr,
"usage: lint1 [-abcdeghmprstuvwyzF] [-X <id>[,<id>]... src dest\n");
"usage: lint1 [-abcdeghmprstuvwyzFS] [-X <id>[,<id>]... src dest\n");
exit(1);
}

View File

@ -74,7 +74,7 @@ It is intended to be used with
.Fl X
flag of
.Xr lint 1 .
.Bl -column -offset indent "Id#" "Message"
.Bl -column -offset indent "XXXX"
__EOF
"$@" | sed -e 's/\\/\\e/g' -e "s/'/\\'/"
echo ".El"

View File

@ -1,5 +1,5 @@
%{
/* $NetBSD: scan.l,v 1.26 2002/01/31 22:30:21 tv Exp $ */
/* $NetBSD: scan.l,v 1.37 2007/02/06 00:08:31 he Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@ -35,7 +35,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: scan.l,v 1.26 2002/01/31 22:30:21 tv Exp $");
__RCSID("$NetBSD: scan.l,v 1.37 2007/02/06 00:08:31 he Exp $");
#endif
__FBSDID("$FreeBSD$");
@ -96,12 +96,13 @@ EX ([eE][+-]?[0-9]+)
%%
{L}({L}|{D})* return (name());
{L}({L}|{D})* return (name());
0{OD}*[lLuU]* return (icon(8));
{NZD}{D}*[lLuU]* return (icon(10));
0[xX]{HD}+[lLuU]* return (icon(16));
{D}+\.{D}*{EX}?[fFlL]? |
{D}+{EX}[fFlL]? |
0[xX]{HD}+p{HD}+[fFlL]? |
\.{D}+{EX}?[fFlL]? return (fcon());
"=" return (operator(T_ASSIGN, ASSIGN));
"*=" return (operator(T_OPASS, MULASS));
@ -191,55 +192,56 @@ static struct kwtab {
scl_t kw_scl; /* storage class if kw_token T_SCLASS */
tspec_t kw_tspec; /* type spec. if kw_token T_TYPE or T_SOU */
tqual_t kw_tqual; /* type qual. fi kw_token T_QUAL */
u_int kw_stdc : 1; /* STDC keyword */
u_int kw_gcc : 1; /* GCC keyword */
u_int kw_c89; /* c89 keyword */
u_int kw_c99; /* c99 keyword */
u_int kw_gcc; /* GCC keyword */
} kwtab[] = {
{ "asm", T_ASM, 0, 0, 0, 0, 1 },
{ "__asm", T_ASM, 0, 0, 0, 0, 0 },
{ "__asm__", T_ASM, 0, 0, 0, 0, 0 },
{ "auto", T_SCLASS, AUTO, 0, 0, 0, 0 },
{ "break", T_BREAK, 0, 0, 0, 0, 0 },
{ "case", T_CASE, 0, 0, 0, 0, 0 },
{ "char", T_TYPE, 0, CHAR, 0, 0, 0 },
{ "const", T_QUAL, 0, 0, CONST, 1, 0 },
{ "__const__", T_QUAL, 0, 0, CONST, 0, 0 },
{ "__const", T_QUAL, 0, 0, CONST, 0, 0 },
{ "continue", T_CONTINUE, 0, 0, 0, 0, 0 },
{ "default", T_DEFAULT, 0, 0, 0, 0, 0 },
{ "do", T_DO, 0, 0, 0, 0, 0 },
{ "double", T_TYPE, 0, DOUBLE, 0, 0, 0 },
{ "else", T_ELSE, 0, 0, 0, 0, 0 },
{ "enum", T_ENUM, 0, 0, 0, 0, 0 },
{ "extern", T_SCLASS, EXTERN, 0, 0, 0, 0 },
{ "float", T_TYPE, 0, FLOAT, 0, 0, 0 },
{ "for", T_FOR, 0, 0, 0, 0, 0 },
{ "goto", T_GOTO, 0, 0, 0, 0, 0 },
{ "if", T_IF, 0, 0, 0, 0, 0 },
{ "inline", T_SCLASS, INLINE, 0, 0, 0, 1 },
{ "__inline__", T_SCLASS, INLINE, 0, 0, 0, 0 },
{ "__inline", T_SCLASS, INLINE, 0, 0, 0, 0 },
{ "int", T_TYPE, 0, INT, 0, 0, 0 },
{ "__symbolrename", T_SYMBOLRENAME, 0, 0, 0, 0, 0 },
{ "long", T_TYPE, 0, LONG, 0, 0, 0 },
{ "register", T_SCLASS, REG, 0, 0, 0, 0 },
{ "return", T_RETURN, 0, 0, 0, 0, 0 },
{ "short", T_TYPE, 0, SHORT, 0, 0, 0 },
{ "signed", T_TYPE, 0, SIGNED, 0, 1, 0 },
{ "__signed__", T_TYPE, 0, SIGNED, 0, 0, 0 },
{ "__signed", T_TYPE, 0, SIGNED, 0, 0, 0 },
{ "sizeof", T_SIZEOF, 0, 0, 0, 0, 0 },
{ "static", T_SCLASS, STATIC, 0, 0, 0, 0 },
{ "struct", T_SOU, 0, STRUCT, 0, 0, 0 },
{ "switch", T_SWITCH, 0, 0, 0, 0, 0 },
{ "typedef", T_SCLASS, TYPEDEF, 0, 0, 0, 0 },
{ "union", T_SOU, 0, UNION, 0, 0, 0 },
{ "unsigned", T_TYPE, 0, UNSIGN, 0, 0, 0 },
{ "void", T_TYPE, 0, VOID, 0, 0, 0 },
{ "volatile", T_QUAL, 0, 0, VOLATILE, 1, 0 },
{ "__volatile__", T_QUAL, 0, 0, VOLATILE, 0, 0 },
{ "__volatile", T_QUAL, 0, 0, VOLATILE, 0, 0 },
{ "while", T_WHILE, 0, 0, 0, 0, 0 },
{ NULL, 0, 0, 0, 0, 0, 0 }
{ "asm", T_ASM, 0, 0, 0, 0, 0, 1 },
{ "__asm", T_ASM, 0, 0, 0, 0, 0, 0 },
{ "__asm__", T_ASM, 0, 0, 0, 0, 0, 0 },
{ "auto", T_SCLASS, AUTO, 0, 0, 0, 0, 0 },
{ "break", T_BREAK, 0, 0, 0, 0, 0, 0 },
{ "case", T_CASE, 0, 0, 0, 0, 0, 0 },
{ "char", T_TYPE, 0, CHAR, 0, 0, 0, 0 },
{ "const", T_QUAL, 0, 0, CONST, 1, 0, 0 },
{ "__const__", T_QUAL, 0, 0, CONST, 0, 0, 0 },
{ "__const", T_QUAL, 0, 0, CONST, 0, 0, 0 },
{ "continue", T_CONTINUE, 0, 0, 0, 0, 0, 0 },
{ "default", T_DEFAULT, 0, 0, 0, 0, 0, 0 },
{ "do", T_DO, 0, 0, 0, 0, 0, 0 },
{ "double", T_TYPE, 0, DOUBLE, 0, 0, 0, 0 },
{ "else", T_ELSE, 0, 0, 0, 0, 0, 0 },
{ "enum", T_ENUM, 0, 0, 0, 0, 0, 0 },
{ "extern", T_SCLASS, EXTERN, 0, 0, 0, 0, 0 },
{ "float", T_TYPE, 0, FLOAT, 0, 0, 0, 0 },
{ "for", T_FOR, 0, 0, 0, 0, 0, 0 },
{ "goto", T_GOTO, 0, 0, 0, 0, 0, 0 },
{ "if", T_IF, 0, 0, 0, 0, 0, 0 },
{ "inline", T_SCLASS, INLINE, 0, 0, 0, 1, 0 },
{ "__inline__", T_SCLASS, INLINE, 0, 0, 0, 0, 0 },
{ "__inline", T_SCLASS, INLINE, 0, 0, 0, 0, 0 },
{ "int", T_TYPE, 0, INT, 0, 0, 0, 0 },
{ "__symbolrename", T_SYMBOLRENAME, 0, 0, 0, 0, 0, 0 },
{ "long", T_TYPE, 0, LONG, 0, 0, 0, 0 },
{ "register", T_SCLASS, REG, 0, 0, 0, 0, 0 },
{ "return", T_RETURN, 0, 0, 0, 0, 0, 0 },
{ "short", T_TYPE, 0, SHORT, 0, 0, 0, 0 },
{ "signed", T_TYPE, 0, SIGNED, 0, 1, 0, 0 },
{ "__signed__", T_TYPE, 0, SIGNED, 0, 0, 0, 0 },
{ "__signed", T_TYPE, 0, SIGNED, 0, 0, 0, 0 },
{ "sizeof", T_SIZEOF, 0, 0, 0, 0, 0, 0 },
{ "static", T_SCLASS, STATIC, 0, 0, 0, 0, 0 },
{ "struct", T_SOU, 0, STRUCT, 0, 0, 0, 0 },
{ "switch", T_SWITCH, 0, 0, 0, 0, 0, 0 },
{ "typedef", T_SCLASS, TYPEDEF, 0, 0, 0, 0, 0 },
{ "union", T_SOU, 0, UNION, 0, 0, 0, 0 },
{ "unsigned", T_TYPE, 0, UNSIGN, 0, 0, 0, 0 },
{ "void", T_TYPE, 0, VOID, 0, 0, 0, 0 },
{ "volatile", T_QUAL, 0, 0, VOLATILE, 1, 0, 0 },
{ "__volatile__", T_QUAL, 0, 0, VOLATILE, 0, 0, 0 },
{ "__volatile", T_QUAL, 0, 0, VOLATILE, 0, 0, 0 },
{ "while", T_WHILE, 0, 0, 0, 0, 0, 0 },
{ NULL, 0, 0, 0, 0, 0, 0, 0 }
};
/* Symbol table */
@ -274,7 +276,9 @@ initscan(void)
uint64_t uq;
for (kw = kwtab; kw->kw_name != NULL; kw++) {
if (kw->kw_stdc && tflag)
if ((kw->kw_c89 || kw->kw_c99) && tflag)
continue;
if (kw->kw_c99 && !(Sflag || gflag))
continue;
if (kw->kw_gcc && !gflag)
continue;
@ -400,7 +404,7 @@ name(void)
if (sym != NULL) {
if (blklev < sym->s_blklev)
lerror("name() 1");
LERROR("name()");
sb->sb_name = sym->s_name;
sb->sb_len = strlen(sym->s_name);
tok = sym->s_scl == TYPEDEF ? T_TYPENAME : T_NAME;
@ -508,7 +512,7 @@ icon(int base)
uq = strtouq(cp, &eptr, base);
}
if (eptr != cp + len)
lerror("icon() 1");
LERROR("icon()");
if (errno != 0)
/* integer constant out of range */
warning(252);
@ -524,8 +528,10 @@ icon(int base)
/* ok */
} else if (ul <= (unsigned)UINT_MAX && base != 10) {
typ = UINT;
#if INT_MAX != LONG_MAX
} else if (ul <= LONG_MAX) {
typ = LONG;
#endif
} else {
typ = ULONG;
}
@ -681,8 +687,24 @@ fcon(void)
errno = 0;
d = strtod(cp, &eptr);
if (eptr != cp + len)
lerror("fcon() 1");
if (eptr != cp + len) {
switch (*eptr) {
/*
* XXX: non-native non-current strtod() may not handle hex
* floats, ignore the rest if we find traces of hex float
* syntax...
*/
case 'p':
case 'P':
case 'x':
case 'X':
d = 0;
errno = 0;
break;
default:
LERROR("fcon()");
}
}
if (errno != 0)
/* floating-point constant out of range */
warning(248);
@ -1140,7 +1162,7 @@ slashslashcomment(void)
{
int c;
if (sflag < 2 && !gflag)
if (!Sflag && !gflag)
/* // comments only supported in C99 */
(void)gnuism(312, tflag ? "traditional" : "ANSI");
@ -1299,7 +1321,7 @@ getsym(sbuf_t *sb)
if (sym != NULL) {
if (sym->s_kind != symtyp)
lerror("storesym() 1");
LERROR("storesym()");
symtyp = FVFT;
freesb(sb);
return (sym);
@ -1318,7 +1340,7 @@ getsym(sbuf_t *sb)
while (di->d_nxt != NULL && di->d_nxt->d_nxt != NULL)
di = di->d_nxt;
if (di->d_ctx != AUTO)
lerror("storesym() 2");
LERROR("storesym()");
} else {
sym = getblk(sizeof (sym_t));
sym->s_name = sb->sb_name;
@ -1343,6 +1365,39 @@ getsym(sbuf_t *sb)
return (sym);
}
/*
* Construct a temporary symbol. The symbol starts with a digit, so that
* it is illegal.
*/
sym_t *
mktempsym(type_t *t)
{
static int n = 0;
int h;
char *s = getlblk(blklev, 64);
sym_t *sym = getblk(sizeof (sym_t));
(void)snprintf(s, 64, "%.8d_tmp", n++);
h = hash(s);
sym->s_name = s;
sym->s_type = t;
sym->s_blklev = blklev;
sym->s_scl = AUTO;
sym->s_kind = FVFT;
sym->s_used = 1;
sym->s_set = 1;
if ((sym->s_link = symtab[h]) != NULL)
symtab[h]->s_rlink = &sym->s_link;
(symtab[h] = sym)->s_rlink = &symtab[h];
*dcs->d_ldlsym = sym;
dcs->d_ldlsym = &sym->s_dlnxt;
return sym;
}
/*
* Remove a symbol forever from the symbol table. s_blklev
* is set to -1 to avoid that the symbol will later be put
@ -1391,7 +1446,7 @@ inssym(int bl, sym_t *sym)
(symtab[h] = sym)->s_rlink = &symtab[h];
sym->s_blklev = bl;
if (sym->s_link != NULL && sym->s_blklev < sym->s_link->s_blklev)
lerror("inssym()");
LERROR("inssym()");
}
/*
@ -1432,7 +1487,7 @@ pushdown(sym_t *sym)
h = hash(sym->s_name);
nsym = getblk(sizeof (sym_t));
if (sym->s_blklev > blklev)
lerror("pushdown()");
LERROR("pushdown()");
nsym->s_name = sym->s_name;
UNIQUE_CURR_POS(nsym->s_dpos);
nsym->s_kind = sym->s_kind;
@ -1469,7 +1524,7 @@ freeyyv(void *sp, int tok)
} else if (strg->st_tspec == WCHAR) {
free(strg->st_wcp);
} else {
lerror("fryylv() 1");
LERROR("fryylv()");
}
free(strg);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: tree.c,v 1.24 2002/01/31 22:30:20 tv Exp $ */
/* $NetBSD: tree.c,v 1.45 2008/03/04 02:41:46 christos Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@ -33,7 +33,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: tree.c,v 1.24 2002/01/31 22:30:20 tv Exp $");
__RCSID("$NetBSD: tree.c,v 1.45 2008/03/04 02:41:46 christos Exp $");
#endif
__FBSDID("$FreeBSD$");
@ -302,13 +302,32 @@ getnnode(sym_t *sym, int ntok)
*/
sym->s_type = incref(sym->s_type, FUNC);
} else {
/* %s undefined */
error(99, sym->s_name);
if (!blklev) {
/* %s undefined */
error(99, sym->s_name);
} else {
int fixtype;
if (strcmp(sym->s_name, "__FUNCTION__") == 0) {
gnuism(316);
fixtype = 1;
} else if (strcmp(sym->s_name, "__func__") == 0) {
if (!Sflag)
warning(317);
fixtype = 1;
} else {
error(99, sym->s_name);
fixtype = 0;
}
if (fixtype) {
sym->s_type = incref(gettyp(CHAR), PTR);
sym->s_type->t_const = 1;
}
}
}
}
if (sym->s_kind != FVFT && sym->s_kind != FMOS)
lerror("getnnode() 1");
LERROR("getnnode()");
n = getnode();
n->tn_type = sym->s_type;
@ -382,6 +401,7 @@ strmemb(tnode_t *tn, op_t op, sym_t *msym)
*/
if (msym->s_scl == NOSCL) {
/* undefined struct/union member: %s */
fprintf(stderr, "3. %s\n", msym->s_name);
error(101, msym->s_name);
rmsym(msym);
msym->s_kind = FMOS;
@ -651,7 +671,7 @@ build(op_t op, tnode_t *ln, tnode_t *rn)
default:
rtp = mp->m_logop ? gettyp(INT) : ln->tn_type;
if (!mp->m_binary && rn != NULL)
lerror("build() 1");
LERROR("build()");
ntn = mktnode(op, rtp, ln, rn);
break;
}
@ -757,10 +777,15 @@ typeok(op_t op, int arg, tnode_t *ln, tnode_t *rn)
mp = &modtab[op];
if ((lt = (ltp = ln->tn_type)->t_tspec) == PTR)
if ((ltp = ln->tn_type) == NULL)
LERROR("typeok()");
if ((lt = ltp->t_tspec) == PTR)
lst = (lstp = ltp->t_subt)->t_tspec;
if (mp->m_binary) {
if ((rt = (rtp = rn->tn_type)->t_tspec) == PTR)
if ((rtp = rn->tn_type) == NULL)
LERROR("typeok()");
if ((rt = rtp->t_tspec) == PTR)
rst = (rstp = rtp->t_subt)->t_tspec;
}
@ -1009,8 +1034,10 @@ typeok(op_t op, int arg, tnode_t *ln, tnode_t *rn)
error(170);
return (0);
}
while (rn->tn_op == CVT)
rn = rn->tn_left;
if (rn->tn_op != COLON)
lerror("typeok() 2");
LERROR("typeok()");
break;
case COLON:
@ -1149,9 +1176,9 @@ typeok(op_t op, int arg, tnode_t *ln, tnode_t *rn)
if (mp->m_badeop &&
(ltp->t_isenum || (mp->m_binary && rtp->t_isenum))) {
chkbeop(op, ln, rn);
} else if (mp->m_enumop && (ltp->t_isenum && rtp->t_isenum)) {
} else if (mp->m_enumop && (ltp->t_isenum && rtp && rtp->t_isenum)) {
chkeop2(op, arg, ln, rn);
} else if (mp->m_enumop && (ltp->t_isenum || rtp->t_isenum)) {
} else if (mp->m_enumop && (ltp->t_isenum || (rtp &&rtp->t_isenum))) {
chkeop1(op, arg, ln, rn);
}
@ -1409,6 +1436,7 @@ chkeop2(op_t op, int arg, tnode_t *ln, tnode_t *rn)
static void
chkeop1(op_t op, int arg, tnode_t *ln, tnode_t *rn)
{
char lbuf[64], rbuf[64];
if (!eflag)
return;
@ -1425,20 +1453,24 @@ chkeop1(op_t op, int arg, tnode_t *ln, tnode_t *rn)
return;
}
/* initialisation of '%s' with '%s' */
warning(277, tyname(ln->tn_type), tyname(rn->tn_type));
warning(277, tyname(lbuf, sizeof(lbuf), ln->tn_type),
tyname(rbuf, sizeof(rbuf), rn->tn_type));
break;
case FARG:
/* combination of '%s' and '%s', arg #%d */
warning(278, tyname(ln->tn_type), tyname(rn->tn_type), arg);
warning(278, tyname(lbuf, sizeof(lbuf), ln->tn_type),
tyname(rbuf, sizeof(rbuf), rn->tn_type), arg);
break;
case RETURN:
/* combination of '%s' and '%s' in return */
warning(279, tyname(ln->tn_type), tyname(rn->tn_type));
warning(279, tyname(lbuf, sizeof(lbuf), ln->tn_type),
tyname(rbuf, sizeof(rbuf), rn->tn_type));
break;
default:
/* combination of '%s' and %s, op %s */
warning(242, tyname(ln->tn_type), tyname(rn->tn_type),
modtab[op].m_name);
warning(242, tyname(lbuf, sizeof(lbuf), ln->tn_type),
tyname(rbuf, sizeof(rbuf), rn->tn_type),
modtab[op].m_name);
break;
}
}
@ -1465,7 +1497,7 @@ mktnode(op_t op, type_t *type, tnode_t *ln, tnode_t *rn)
if (t != FUNC && t != VOID)
ntn->tn_lvalue = 1;
} else {
lerror("mktnode() 2");
LERROR("mktnode()");
}
}
@ -1503,7 +1535,7 @@ promote(op_t op, int farg, tnode_t *tn)
t = INT;
} else {
if (size(INT) != len)
lerror("promote() 1");
LERROR("promote()");
if (isutyp(t)) {
t = UINT;
} else {
@ -1636,7 +1668,7 @@ convert(op_t op, int arg, type_t *tp, tnode_t *tn)
tspec_t nt, ot, ost = NOTSPEC;
if (tn->tn_lvalue)
lerror("convert() 1");
LERROR("convert()");
nt = tp->t_tspec;
if ((ot = tn->tn_type->t_tspec) == PTR)
@ -1682,6 +1714,7 @@ static void
ptconv(int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
{
tnode_t *ptn;
char buf[64];
if (!isatyp(nt) || !isatyp(ot))
return;
@ -1704,9 +1737,10 @@ ptconv(int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
if (isftyp(nt) != isftyp(ot) || psize(nt) != psize(ot)) {
/* representation and/or width change */
if (styp(nt) != SHORT || !isityp(ot) || psize(ot) > psize(INT))
if (!isityp(ot) || psize(ot) > psize(INT)) {
/* conversion to '%s' due to prototype, arg #%d */
warning(259, tyname(tp), arg);
warning(259, tyname(buf, sizeof(buf), tp), arg);
}
} else if (hflag) {
/*
* they differ in sign or base type (char, short, int,
@ -1720,7 +1754,7 @@ ptconv(int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
/* ok */
} else {
/* conversion to '%s' due to prototype, arg #%d */
warning(259, tyname(tp), arg);
warning(259, tyname(buf, sizeof(buf), tp), arg);
}
}
}
@ -1733,6 +1767,7 @@ ptconv(int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
static void
iiconv(op_t op, int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
{
char lbuf[64], rbuf[64];
if (tn->tn_op == CON)
return;
@ -1744,9 +1779,10 @@ iiconv(op_t op, int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
/* conversion to %s may sign-extend incorrectly (, arg #%d) */
if (aflag && pflag) {
if (op == FARG) {
warning(297, tyname(tp), arg);
warning(297, tyname(lbuf, sizeof(lbuf), tp),
arg);
} else {
warning(131, tyname(tp));
warning(131, tyname(lbuf, sizeof(lbuf), tp));
}
}
}
@ -1758,9 +1794,14 @@ iiconv(op_t op, int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
/* conversion from '%s' may lose accuracy */
if (aflag) {
if (op == FARG) {
warning(298, tyname(tn->tn_type), arg);
warning(298,
tyname(rbuf, sizeof(rbuf), tn->tn_type),
tyname(lbuf, sizeof(lbuf), tp),
arg);
} else {
warning(132, tyname(tn->tn_type));
warning(132,
tyname(rbuf, sizeof(rbuf), tn->tn_type),
tyname(lbuf, sizeof(lbuf), tp));
}
}
}
@ -1772,6 +1813,7 @@ iiconv(op_t op, int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
static void
piconv(op_t op, tspec_t nt, type_t *tp, tnode_t *tn)
{
char buf[64];
if (tn->tn_op == CON)
return;
@ -1784,10 +1826,10 @@ piconv(op_t op, tspec_t nt, type_t *tp, tnode_t *tn)
if (psize(nt) < psize(PTR)) {
if (pflag && size(nt) >= size(PTR)) {
/* conv. of pointer to %s may lose bits */
warning(134, tyname(tp));
warning(134, tyname(buf, sizeof(buf), tp));
} else {
/* conv. of pointer to %s loses bits */
warning(133, tyname(tp));
warning(133, tyname(buf, sizeof(buf), tp));
}
}
}
@ -1855,6 +1897,7 @@ ppconv(op_t op, tnode_t *tn, type_t *tp)
void
cvtcon(op_t op, int arg, type_t *tp, val_t *nv, val_t *v)
{
char lbuf[64], rbuf[64];
tspec_t ot, nt;
ldbl_t max = 0.0, min = 0.0;
int sz, rchk;
@ -1899,18 +1942,21 @@ cvtcon(op_t op, int arg, type_t *tp, val_t *nv, val_t *v)
case LDOUBLE:
max = LDBL_MAX; min = -LDBL_MAX; break;
default:
lerror("cvtcon() 1");
LERROR("cvtcon()");
}
if (v->v_ldbl > max || v->v_ldbl < min) {
if (nt == LDOUBLE)
lerror("cvtcon() 2");
LERROR("cvtcon()");
if (op == FARG) {
/* conv. of %s to %s is out of rng., arg #%d */
warning(295, tyname(gettyp(ot)), tyname(tp),
arg);
warning(295, tyname(lbuf, sizeof(lbuf),
gettyp(ot)), tyname(rbuf, sizeof(rbuf), tp),
arg);
} else {
/* conversion of %s to %s is out of range */
warning(119, tyname(gettyp(ot)), tyname(tp));
warning(119, tyname(lbuf, sizeof(lbuf),
gettyp(ot)),
tyname(rbuf, sizeof(rbuf), tp));
}
v->v_ldbl = v->v_ldbl > 0 ? max : min;
}
@ -1988,8 +2034,9 @@ cvtcon(op_t op, int arg, type_t *tp, val_t *nv, val_t *v)
* extra bits set to 0 in conversion
* of '%s' to '%s', op %s
*/
warning(309, tyname(gettyp(ot)),
tyname(tp), modtab[op].m_name);
warning(309, tyname(lbuf, sizeof(lbuf),
gettyp(ot)), tyname(rbuf, sizeof(rbuf), tp),
modtab[op].m_name);
} else if (nsz < osz &&
(v->v_quad & xmask) != xmask &&
(v->v_quad & xmask) != 0) {
@ -2049,11 +2096,14 @@ cvtcon(op_t op, int arg, type_t *tp, val_t *nv, val_t *v)
warning(196);
} else if (op == FARG) {
/* conv. of %s to %s is out of rng., arg #%d */
warning(295, tyname(gettyp(ot)), tyname(tp),
arg);
warning(295, tyname(lbuf, sizeof(lbuf),
gettyp(ot)), tyname(rbuf, sizeof(rbuf), tp),
arg);
} else {
/* conversion of %s to %s is out of range */
warning(119, tyname(gettyp(ot)), tyname(tp));
warning(119, tyname(lbuf, sizeof(lbuf),
gettyp(ot)),
tyname(rbuf, sizeof(rbuf), tp));
}
} else if (nv->v_quad != v->v_quad) {
if (op == ASSIGN && tp->t_isfield) {
@ -2067,11 +2117,14 @@ cvtcon(op_t op, int arg, type_t *tp, val_t *nv, val_t *v)
warning(196);
} else if (op == FARG) {
/* conv. of %s to %s is out of rng., arg #%d */
warning(295, tyname(gettyp(ot)), tyname(tp),
arg);
warning(295, tyname(lbuf, sizeof(lbuf),
gettyp(ot)), tyname(rbuf, sizeof(rbuf), tp),
arg);
} else {
/* conversion of %s to %s is out of range */
warning(119, tyname(gettyp(ot)), tyname(tp));
warning(119, tyname(lbuf, sizeof(lbuf),
gettyp(ot)),
tyname(rbuf, sizeof(rbuf), tp));
}
}
}
@ -2119,7 +2172,7 @@ illptrc(mod_t *mp, type_t *ltp, type_t *rtp)
tspec_t lt, rt;
if (ltp->t_tspec != PTR || rtp->t_tspec != PTR)
lerror("illptrc() 1");
LERROR("illptrc()");
lt = ltp->t_subt->t_tspec;
rt = rtp->t_subt->t_tspec;
@ -2153,7 +2206,7 @@ mrgqual(type_t **tpp, type_t *tp1, type_t *tp2)
if ((*tpp)->t_tspec != PTR ||
tp1->t_tspec != PTR || tp2->t_tspec != PTR) {
lerror("mrgqual()");
LERROR("mrgqual()");
}
if ((*tpp)->t_subt->t_const ==
@ -2182,7 +2235,7 @@ conmemb(type_t *tp)
tspec_t t;
if ((t = tp->t_tspec) != STRUCT && t != UNION)
lerror("conmemb()");
LERROR("conmemb()");
for (m = tp->t_str->memb; m != NULL; m = m->s_nxt) {
tp = m->s_type;
if (tp->t_const)
@ -2196,39 +2249,87 @@ conmemb(type_t *tp)
}
const char *
tyname(type_t *tp)
basictyname(tspec_t t)
{
switch (t) {
case CHAR: return "char";
case UCHAR: return "unsigned char";
case SCHAR: return "signed char";
case SHORT: return "short";
case USHORT: return "unsigned short";
case INT: return "int";
case UINT: return "unsigned int";
case LONG: return "long";
case ULONG: return "unsigned long";
case QUAD: return "long long";
case UQUAD: return "unsigned long long";
case FLOAT: return "float";
case DOUBLE: return "double";
case LDOUBLE: return "long double";
case PTR: return "pointer";
case ENUM: return "enum";
case STRUCT: return "struct";
case UNION: return "union";
case FUNC: return "function";
case ARRAY: return "array";
default:
LERROR("basictyname()");
return NULL;
}
}
const char *
tyname(char *buf, size_t bufsiz, type_t *tp)
{
tspec_t t;
const char *s;
char lbuf[64];
if ((t = tp->t_tspec) == INT && tp->t_isenum)
t = ENUM;
s = basictyname(t);
switch (t) {
case CHAR: s = "char"; break;
case UCHAR: s = "unsigned char"; break;
case SCHAR: s = "signed char"; break;
case SHORT: s = "short"; break;
case USHORT: s = "unsigned short"; break;
case INT: s = "int"; break;
case UINT: s = "unsigned int"; break;
case LONG: s = "long"; break;
case ULONG: s = "unsigned long"; break;
case QUAD: s = "long long"; break;
case UQUAD: s = "unsigned long long"; break;
case FLOAT: s = "float"; break;
case DOUBLE: s = "double"; break;
case LDOUBLE: s = "long double"; break;
case PTR: s = "pointer"; break;
case ENUM: s = "enum"; break;
case STRUCT: s = "struct"; break;
case UNION: s = "union"; break;
case FUNC: s = "function"; break;
case ARRAY: s = "array"; break;
case CHAR:
case UCHAR:
case SCHAR:
case SHORT:
case USHORT:
case INT:
case UINT:
case LONG:
case ULONG:
case QUAD:
case UQUAD:
case FLOAT:
case DOUBLE:
case LDOUBLE:
case FUNC:
(void)snprintf(buf, bufsiz, "%s", s);
break;
case PTR:
(void)snprintf(buf, bufsiz, "%s to %s", s,
tyname(lbuf, sizeof(lbuf), tp->t_subt));
break;
case ENUM:
(void)snprintf(buf, bufsiz, "%s %s", s,
tp->t_enum->etag->s_name);
break;
case STRUCT:
case UNION:
(void)snprintf(buf, bufsiz, "%s %s", s,
tp->t_str->stag->s_name);
break;
case ARRAY:
(void)snprintf(buf, bufsiz, "%s of %s[%d]", s,
tyname(lbuf, sizeof(lbuf), tp->t_subt), tp->t_dim);
break;
default:
lerror("tyname()");
LERROR("tyname()");
}
return (s);
return (buf);
}
/*
@ -2241,11 +2342,11 @@ bldstr(op_t op, tnode_t *ln, tnode_t *rn)
int nolval;
if (rn->tn_op != NAME)
lerror("bldstr() 1");
LERROR("bldstr()");
if (rn->tn_sym->s_value.v_tspec != INT)
lerror("bldstr() 2");
LERROR("bldstr()");
if (rn->tn_sym->s_scl != MOS && rn->tn_sym->s_scl != MOU)
lerror("bldstr() 3");
LERROR("bldstr()");
/*
* Remember if the left operand is an lvalue (structure members
@ -2257,7 +2358,7 @@ bldstr(op_t op, tnode_t *ln, tnode_t *rn)
ln = bldamper(ln, 1);
} else if (ln->tn_type->t_tspec != PTR) {
if (!tflag || !isityp(ln->tn_type->t_tspec))
lerror("bldstr() 4");
LERROR("bldstr()");
ln = convert(NOOP, 0, tincref(gettyp(VOID), PTR), ln);
}
@ -2292,7 +2393,7 @@ bldincdec(op_t op, tnode_t *ln)
tnode_t *cn, *ntn;
if (ln == NULL)
lerror("bldincdec() 1");
LERROR("bldincdec()");
if (ln->tn_type->t_tspec == PTR) {
cn = plength(ln->tn_type);
@ -2351,7 +2452,7 @@ bldplmi(op_t op, tnode_t *ln, tnode_t *rn)
if (ln->tn_type->t_tspec == PTR && rn->tn_type->t_tspec != PTR) {
if (!isityp(rn->tn_type->t_tspec))
lerror("bldplmi() 1");
LERROR("bldplmi()");
ctn = plength(ln->tn_type);
if (rn->tn_type->t_tspec != ctn->tn_type->t_tspec)
@ -2364,7 +2465,7 @@ bldplmi(op_t op, tnode_t *ln, tnode_t *rn)
} else if (rn->tn_type->t_tspec == PTR) {
if (ln->tn_type->t_tspec != PTR || op != MINUS)
lerror("bldplmi() 2");
LERROR("bldplmi()");
#if PTRDIFF_IS_LONG
tp = gettyp(LONG);
#else
@ -2429,9 +2530,9 @@ bldcol(tnode_t *ln, tnode_t *rn)
} else if (lt == STRUCT || lt == UNION) {
/* Both types must be identical. */
if (rt != STRUCT && rt != UNION)
lerror("bldcol() 1");
LERROR("bldcol()");
if (ln->tn_type->t_str != rn->tn_type->t_str)
lerror("bldcol() 2");
LERROR("bldcol()");
if (incompl(ln->tn_type)) {
/* unknown operand size, op %s */
error(138, modtab[COLON].m_name);
@ -2452,17 +2553,17 @@ bldcol(tnode_t *ln, tnode_t *rn)
rtp = rn->tn_type;
} else if (lt == PTR && ln->tn_type->t_subt->t_tspec == VOID) {
if (rt != PTR)
lerror("bldcol() 4");
LERROR("bldcol()");
rtp = ln->tn_type;
mrgqual(&rtp, ln->tn_type, rn->tn_type);
} else if (rt == PTR && rn->tn_type->t_subt->t_tspec == VOID) {
if (lt != PTR)
lerror("bldcol() 5");
LERROR("bldcol()");
rtp = rn->tn_type;
mrgqual(&rtp, ln->tn_type, rn->tn_type);
} else {
if (lt != PTR || rt != PTR)
lerror("bldcol() 6");
LERROR("bldcol()");
/*
* XXX For now we simply take the left type. This is
* probably wrong, if one type contains a functionprototype
@ -2488,14 +2589,14 @@ bldasgn(op_t op, tnode_t *ln, tnode_t *rn)
tnode_t *ntn, *ctn;
if (ln == NULL || rn == NULL)
lerror("bldasgn() 1");
LERROR("bldasgn()");
lt = ln->tn_type->t_tspec;
rt = rn->tn_type->t_tspec;
if ((op == ADDASS || op == SUBASS) && lt == PTR) {
if (!isityp(rt))
lerror("bldasgn() 2");
LERROR("bldasgn()");
ctn = plength(ln->tn_type);
if (rn->tn_type->t_tspec != ctn->tn_type->t_tspec)
rn = convert(NOOP, 0, ctn->tn_type, rn);
@ -2506,7 +2607,7 @@ bldasgn(op_t op, tnode_t *ln, tnode_t *rn)
if ((op == ASSIGN || op == RETURN) && (lt == STRUCT || rt == STRUCT)) {
if (rt != lt || ln->tn_type->t_str != rn->tn_type->t_str)
lerror("bldasgn() 3");
LERROR("bldasgn()");
if (incompl(ln->tn_type)) {
if (op == RETURN) {
/* cannot return incomplete type */
@ -2519,12 +2620,13 @@ bldasgn(op_t op, tnode_t *ln, tnode_t *rn)
}
}
if (op == SHLASS || op == SHRASS) {
if (rt != INT) {
rn = convert(NOOP, 0, gettyp(INT), rn);
rt = INT;
if (op == SHLASS) {
if (psize(lt) < psize(rt)) {
if (hflag)
/* semantics of %s change in ANSI C; use ... */
warning(118, "<<=");
}
} else {
} else if (op != SHRASS) {
if (op == ASSIGN || lt != PTR) {
if (lt != rt ||
(ln->tn_type->t_isfield && rn->tn_op == CON)) {
@ -2549,7 +2651,7 @@ plength(type_t *tp)
tspec_t st;
if (tp->t_tspec != PTR)
lerror("plength() 1");
LERROR("plength()");
tp = tp->t_subt;
elem = 1;
@ -2586,7 +2688,7 @@ plength(type_t *tp)
/* cannot do pointer arithmetic on operand of ... */
error(136);
} else if (elsz == -1) {
lerror("plength() 2");
LERROR("plength()");
}
break;
}
@ -2743,7 +2845,7 @@ fold(tnode_t *tn)
q = utyp ? ul | ur : sl | sr;
break;
default:
lerror("fold() 5");
LERROR("fold()");
}
/* XXX does not work for quads. */
@ -2773,7 +2875,7 @@ foldtst(tnode_t *tn)
nomem();
v->v_tspec = tn->tn_type->t_tspec;
if (tn->tn_type->t_tspec != INT)
lerror("foldtst() 1");
LERROR("foldtst()");
if (isftyp(tn->tn_left->tn_type->t_tspec)) {
l = tn->tn_left->tn_val->v_ldbl != 0.0;
@ -2803,7 +2905,7 @@ foldtst(tnode_t *tn)
v->v_quad = l || r;
break;
default:
lerror("foldtst() 1");
LERROR("foldtst()");
}
return (getcnode(tn->tn_type, v));
@ -2824,12 +2926,12 @@ foldflt(tnode_t *tn)
v->v_tspec = t = tn->tn_type->t_tspec;
if (!isftyp(t))
lerror("foldflt() 1");
LERROR("foldflt()");
if (t != tn->tn_left->tn_type->t_tspec)
lerror("foldflt() 2");
LERROR("foldflt()");
if (modtab[tn->tn_op].m_binary && t != tn->tn_right->tn_type->t_tspec)
lerror("foldflt() 3");
LERROR("foldflt()");
l = tn->tn_left->tn_val->v_ldbl;
if (modtab[tn->tn_op].m_binary)
@ -2885,11 +2987,11 @@ foldflt(tnode_t *tn)
v->v_quad = l != r;
break;
default:
lerror("foldflt() 4");
LERROR("foldflt()");
}
if (isnan((double)v->v_ldbl))
lerror("foldflt() 5");
LERROR("foldflt()");
if (!finite((double)v->v_ldbl) ||
(t == FLOAT &&
(v->v_ldbl > FLT_MAX || v->v_ldbl < -FLT_MAX)) ||
@ -2962,7 +3064,7 @@ bldszof(type_t *tp)
} else {
elsz = size(tp->t_tspec);
if (elsz <= 0)
lerror("bldszof() 1");
LERROR("bldszof()");
}
break;
}
@ -3199,7 +3301,7 @@ parg( int n, /* pos of arg */
* type, an error message is printed.
*/
val_t *
constant(tnode_t *tn)
constant(tnode_t *tn, int required)
{
val_t *v;
@ -3213,7 +3315,7 @@ constant(tnode_t *tn)
if (tn == NULL) {
if (nerr == 0)
lerror("constant() 1");
LERROR("constant()");
v->v_tspec = INT;
v->v_quad = 1;
return (v);
@ -3223,7 +3325,7 @@ constant(tnode_t *tn)
if (tn->tn_op == CON) {
if (tn->tn_type->t_tspec != tn->tn_val->v_tspec)
lerror("constant() 2");
LERROR("constant()");
if (isityp(tn->tn_val->v_tspec)) {
v->v_ansiu = tn->tn_val->v_ansiu;
v->v_quad = tn->tn_val->v_quad;
@ -3235,7 +3337,10 @@ constant(tnode_t *tn)
}
/* integral constant expression expected */
error(55);
if (required)
error(55);
else
c99ism(318);
if (!isityp(v->v_tspec))
v->v_tspec = INT;
@ -3252,11 +3357,11 @@ constant(tnode_t *tn)
* for the expression.
*/
void
expr(tnode_t *tn, int vctx, int tctx)
expr(tnode_t *tn, int vctx, int tctx, int freeblk)
{
if (tn == NULL && nerr == 0)
lerror("expr() 1");
LERROR("expr()");
if (tn == NULL) {
tfreeblk();
@ -3289,7 +3394,8 @@ expr(tnode_t *tn, int vctx, int tctx)
displexpr(tn, 0);
/* free the tree memory */
tfreeblk();
if (freeblk)
tfreeblk();
}
static void
@ -3361,7 +3467,7 @@ displexpr(tnode_t *tn, int offs)
(long)uq & 0xffffffffl);
} else if (tn->tn_op == CON) {
if (tn->tn_type->t_tspec != PTR)
lerror("displexpr() 1");
LERROR("displexpr()");
(void)printf("0x%0*lx ", (int)(sizeof (void *) * CHAR_BIT / 4),
(u_long)tn->tn_val->v_quad);
} else if (tn->tn_op == STRING) {
@ -3477,7 +3583,7 @@ chkmisc(tnode_t *tn, int vctx, int tctx, int eqwarn, int fcall, int rvdisc,
break;
case CALL:
if (ln->tn_op != AMPER || ln->tn_left->tn_op != NAME)
lerror("chkmisc() 1");
LERROR("chkmisc()");
if (!szof)
outcall(tn, vctx || tctx, rvdisc);
break;
@ -3632,6 +3738,7 @@ chkaidx(tnode_t *tn, int amper)
static void
chkcomp(op_t op, tnode_t *ln, tnode_t *rn)
{
char buf[64];
tspec_t lt, rt;
mod_t *mp;
@ -3663,11 +3770,12 @@ chkcomp(op_t op, tnode_t *ln, tnode_t *rn)
rn->tn_op == CON && rn->tn_val->v_quad <= 0) {
if (rn->tn_val->v_quad < 0) {
/* comparison of %s with %s, op %s */
warning(162, tyname(ln->tn_type), "negative constant",
mp->m_name);
warning(162, tyname(buf, sizeof(buf), ln->tn_type),
"negative constant", mp->m_name);
} else if (op == LT || op == GE || (hflag && op == LE)) {
/* comparison of %s with %s, op %s */
warning(162, tyname(ln->tn_type), "0", mp->m_name);
warning(162, tyname(buf, sizeof(buf), ln->tn_type),
"0", mp->m_name);
}
return;
}
@ -3675,11 +3783,12 @@ chkcomp(op_t op, tnode_t *ln, tnode_t *rn)
ln->tn_op == CON && ln->tn_val->v_quad <= 0) {
if (ln->tn_val->v_quad < 0) {
/* comparison of %s with %s, op %s */
warning(162, "negative constant", tyname(rn->tn_type),
mp->m_name);
warning(162, "negative constant",
tyname(buf, sizeof(buf), rn->tn_type), mp->m_name);
} else if (op == GT || op == LE || (hflag && op == GE)) {
/* comparison of %s with %s, op %s */
warning(162, "0", tyname(rn->tn_type), mp->m_name);
warning(162, "0", tyname(buf, sizeof(buf), rn->tn_type),
mp->m_name);
}
return;
}
@ -3689,7 +3798,7 @@ chkcomp(op_t op, tnode_t *ln, tnode_t *rn)
* Takes an expression an returns 0 if this expression can be used
* for static initialisation, otherwise -1.
*
* Constant initialisation expressions must be costant or an address
* Constant initialisation expressions must be constant or an address
* of a static object with an optional offset. In the first case,
* the result is returned in *offsp. In the second case, the static
* object is returned in *symp and the offset in *offsp.
@ -3707,7 +3816,9 @@ conaddr(tnode_t *tn, sym_t **symp, ptrdiff_t *offsp)
switch (tn->tn_op) {
case MINUS:
if (tn->tn_right->tn_op != CON)
if (tn->tn_right->tn_op == CVT)
return conaddr(tn->tn_right, symp, offsp);
else if (tn->tn_right->tn_op != CON)
return (-1);
/* FALLTHROUGH */
case PLUS:
@ -3743,9 +3854,9 @@ conaddr(tnode_t *tn, sym_t **symp, ptrdiff_t *offsp)
case CVT:
t = tn->tn_type->t_tspec;
ot = tn->tn_left->tn_type->t_tspec;
if ((!isityp(t) && t != PTR) || (!isityp(ot) && ot != PTR)) {
if ((!isityp(t) && t != PTR) || (!isityp(ot) && ot != PTR))
return (-1);
} else if (psize(t) != psize(ot)) {
else if (psize(t) != psize(ot)) {
return (-1);
}
if (conaddr(tn->tn_left, symp, offsp) == -1)

View File

@ -1,4 +1,4 @@
/* $NetBSD: read.c,v 1.12 2002/01/21 19:49:52 tv Exp $ */
/* $NetBSD: read.c,v 1.19 2007/09/28 21:53:50 uwe Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@ -34,7 +34,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: read.c,v 1.12 2002/01/21 19:49:52 tv Exp $");
__RCSID("$NetBSD: read.c,v 1.19 2007/09/28 21:53:50 uwe Exp $");
#endif
__FBSDID("$FreeBSD$");
@ -87,7 +87,8 @@ static hte_t **renametab;
static int csrcfile;
static void inperr(void);
#define inperr() inperror(__FILE__, __LINE__)
static void inperror(const char *, size_t);
static void setsrc(const char *);
static void setfnid(int, const char *);
static void funccall(pos_t *, const char *);
@ -213,10 +214,10 @@ readfile(const char *name)
static void
inperr(void)
inperror(const char *file, size_t line)
{
errx(1, "input file error: %s", fnames[srcfile]);
errx(1, "%s,%zd: input file error: %s", file, line, fnames[srcfile]);
}
/*
@ -361,9 +362,7 @@ decldef(pos_t *posp, const char *cp)
used = 0;
while ((c = *cp) == 't' || c == 'd' || c == 'e' || c == 'u' ||
c == 'r' || c == 'o' || c == 's' || c == 'v' ||
c == 'P' || c == 'S') {
while (strchr("tdeurosvPS", (c = *cp)) != NULL) {
cp++;
switch (c) {
case 't':
@ -545,7 +544,7 @@ inptype(const char *cp, const char **epp)
type_t *tp;
int narg, i, osdef = 0;
size_t tlen;
u_short tidx;
u_short tidx, sidx;
int h;
/* If we have this type already, return it's index. */
@ -621,10 +620,12 @@ inptype(const char *cp, const char **epp)
case ARRAY:
tp->t_dim = (int)strtol(cp, &eptr, 10);
cp = eptr;
tp->t_subt = TP(inptype(cp, &cp));
sidx = inptype(cp, &cp); /* force seq. point! (ditto below) */
tp->t_subt = TP(sidx);
break;
case PTR:
tp->t_subt = TP(inptype(cp, &cp));
sidx = inptype(cp, &cp);
tp->t_subt = TP(sidx);
break;
case FUNC:
c = *cp;
@ -641,11 +642,13 @@ inptype(const char *cp, const char **epp)
tp->t_vararg = 1;
cp++;
} else {
tp->t_args[i] = TP(inptype(cp, &cp));
sidx = inptype(cp, &cp);
tp->t_args[i] = TP(sidx);
}
}
}
tp->t_subt = TP(inptype(cp, &cp));
sidx = inptype(cp, &cp);
tp->t_subt = TP(sidx);
break;
case ENUM:
tp->t_tspec = INT;

View File

@ -1,4 +1,4 @@
.\" $NetBSD: lint.1,v 1.21 2002/01/03 04:25:18 thorpej Exp $
.\" $NetBSD: lint.1,v 1.29 2004/01/26 21:59:42 wiz Exp $
.\"
.\" Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
.\" Copyright (c) 1994, 1995 Jochen Pohl
@ -32,7 +32,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd May 24, 2001
.Dd Mar 23, 2015
.Dt LINT 1
.Os
.Sh NAME
@ -49,6 +49,7 @@
.Op Fl I Ar directory
.Op Fl d Ar directory
.Op Fl L Ar directory
.Op Fl MD
.Op Fl l Ar library
.Op Fl o Ar outputfile
.Op Fl B Ar directory
@ -269,6 +270,8 @@ With the
flag,
.Dv __STRICT_ANSI__
is a predefined preprocessor macro.
.It Fl S
C9X mode. Currently not fully implemented.
.It Fl t
Traditional C mode.
.Dv __STDC__
@ -369,6 +372,13 @@ If a complaint stems from an included file
.Nm
prints the name of the included file instead of the source file name
followed by a question mark.
.It Fl MD
Pass
.Fl MD
to
.Xr cpp 1
causing cpp to create files containing dependency information for
each source file.
.It Fl o Ar outputfile
Name the output file
.Ar outputfile .
@ -415,7 +425,7 @@ The
utility recognizes the following C comments as commands.
.Bl -tag -width indent
.It Li /* ARGSUSED Ns Ar n Li */
makes
Makes
.Nm
check only the first
.Ar n

View File

@ -1,4 +1,4 @@
/* $NetBSD: xlint.c,v 1.27 2002/01/31 19:09:33 tv Exp $ */
/* $NetBSD: xlint.c,v 1.36 2005/02/09 21:24:48 dsl Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@ -34,7 +34,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: xlint.c,v 1.27 2002/01/31 19:09:33 tv Exp $");
__RCSID("$NetBSD: xlint.c,v 1.36 2005/02/09 21:24:48 dsl Exp $");
#endif
__FBSDID("$FreeBSD$");
@ -104,7 +104,7 @@ static char **libsrchpath;
static char *libexec_path;
/* flags */
static int iflag, oflag, Cflag, sflag, tflag, Fflag, dflag, Bflag;
static int iflag, oflag, Cflag, sflag, tflag, Fflag, dflag, Bflag, Sflag;
/* print the commands executed to run the stages of compilation */
static int Vflag;
@ -145,7 +145,7 @@ static void cat(char *const *, const char *);
/*
* Some functions to deal with lists of strings.
* Take care that we get no surprises in case of asyncron signals.
* Take care that we get no surprises in case of asynchronous signals.
*/
static void
appstrg(char ***lstp, char *s)
@ -286,13 +286,13 @@ usage(void)
{
(void)fprintf(stderr,
"usage: lint [-abceghprvwxzHF] [-s|-t] [-i|-nu] [-Dname[=def]]"
"usage: lint [-abceghprvwxzHFS] [-s|-t] [-i|-nu] [-Dname[=def]]"
" [-Uname] [-X <id>[,<id>]...\n");
(void)fprintf(stderr,
"\t[-Idirectory] [-Ldirectory] [-llibrary] [-ooutputfile]"
" file...\n");
(void)fprintf(stderr,
" lint [-abceghprvwzHF] [-s|-t] -Clibrary [-Dname[=def]]\n"
" lint [-abceghprvwzHFS] [-s|-t] -Clibrary [-Dname[=def]]\n"
" [-X <id>[,<id>]...\n");
(void)fprintf(stderr, "\t[-Idirectory] [-Uname] [-Bpath] file"
" ...\n");
@ -344,6 +344,9 @@ main(int argc, char *argv[])
#else
appcstrg(&cflags, "-U__GNUC__");
appcstrg(&cflags, "-undef");
#endif
#if 0
appcstrg(&cflags, "-Wp,-$");
#endif
appcstrg(&cflags, "-Wp,-C");
appcstrg(&cflags, "-Wcomment");
@ -359,8 +362,7 @@ main(int argc, char *argv[])
(void)signal(SIGINT, terminate);
(void)signal(SIGQUIT, terminate);
(void)signal(SIGTERM, terminate);
while ((c = getopt(argc, argv, "abcd:eghil:no:prstuvwxzB:C:D:FHI:L:U:VX:")) != -1) {
while ((c = getopt(argc, argv, "abcd:eghil:no:prstuvwxzB:C:D:FHI:L:M:SU:VX:")) != -1) {
switch (c) {
case 'a':
@ -426,6 +428,13 @@ main(int argc, char *argv[])
sflag = 1;
break;
case 'S':
if (tflag)
usage();
appcstrg(&l1flags, "-S");
Sflag = 1;
break;
#if !HAVE_CONFIG_H
case 't':
if (sflag)
@ -465,6 +474,7 @@ main(int argc, char *argv[])
case 'D':
case 'I':
case 'M':
case 'U':
(void)sprintf(flgbuf, "-%c", c);
appstrg(&cflags, concat2(flgbuf, optarg));