Module Name: src Committed By: rillig Date: Sun Jul 25 10:39:10 UTC 2021
Modified Files: src/tests/usr.bin/xlint/lint1: msg_147.c msg_147.exp src/usr.bin/xlint/lint1: err.c tree.c Log Message: lint: add type information to message about invalid cast This probably doesn't matter in practice since the compiler is supposed to catch this kind of error. Adding the type information mainly ensures that parsing abstract type names works as specified. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/tests/usr.bin/xlint/lint1/msg_147.c \ src/tests/usr.bin/xlint/lint1/msg_147.exp cvs rdiff -u -r1.130 -r1.131 src/usr.bin/xlint/lint1/err.c cvs rdiff -u -r1.318 -r1.319 src/usr.bin/xlint/lint1/tree.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/usr.bin/xlint/lint1/msg_147.c diff -u src/tests/usr.bin/xlint/lint1/msg_147.c:1.3 src/tests/usr.bin/xlint/lint1/msg_147.c:1.4 --- src/tests/usr.bin/xlint/lint1/msg_147.c:1.3 Sun Jul 25 10:26:46 2021 +++ src/tests/usr.bin/xlint/lint1/msg_147.c Sun Jul 25 10:39:10 2021 @@ -1,7 +1,7 @@ -/* $NetBSD: msg_147.c,v 1.3 2021/07/25 10:26:46 rillig Exp $ */ +/* $NetBSD: msg_147.c,v 1.4 2021/07/25 10:39:10 rillig Exp $ */ # 3 "msg_147.c" -// Test for message: invalid cast expression [147] +// Test for message: invalid cast from '%s' to '%s' [147] // The type name 'int(int)' is a 'function(int) returning int'. void take(int(int)); @@ -10,7 +10,6 @@ void take(int(int)); void call_take(int (*ptr)(int)) { - /* XXX: That's a little too unspecific. */ - /* expect+1: error: invalid cast expression [147] */ + /* expect+1: error: invalid cast from 'pointer to function(int) returning int' to 'function(int) returning int' [147] */ take((int(int))ptr); } Index: src/tests/usr.bin/xlint/lint1/msg_147.exp diff -u src/tests/usr.bin/xlint/lint1/msg_147.exp:1.3 src/tests/usr.bin/xlint/lint1/msg_147.exp:1.4 --- src/tests/usr.bin/xlint/lint1/msg_147.exp:1.3 Sun Jul 25 10:26:46 2021 +++ src/tests/usr.bin/xlint/lint1/msg_147.exp Sun Jul 25 10:39:10 2021 @@ -1 +1 @@ -msg_147.c(15): error: invalid cast expression [147] +msg_147.c(14): error: invalid cast from 'pointer to function(int) returning int' to 'function(int) returning int' [147] Index: src/usr.bin/xlint/lint1/err.c diff -u src/usr.bin/xlint/lint1/err.c:1.130 src/usr.bin/xlint/lint1/err.c:1.131 --- src/usr.bin/xlint/lint1/err.c:1.130 Thu Jul 15 20:05:49 2021 +++ src/usr.bin/xlint/lint1/err.c Sun Jul 25 10:39:10 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: err.c,v 1.130 2021/07/15 20:05:49 rillig Exp $ */ +/* $NetBSD: err.c,v 1.131 2021/07/25 10:39:10 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: err.c,v 1.130 2021/07/15 20:05:49 rillig Exp $"); +__RCSID("$NetBSD: err.c,v 1.131 2021/07/25 10:39:10 rillig Exp $"); #endif #include <sys/types.h> @@ -201,7 +201,7 @@ const char *const msgs[] = { "cannot take size/alignment of function", /* 144 */ "cannot take size/alignment of bit-field", /* 145 */ "cannot take size/alignment of void", /* 146 */ - "invalid cast expression", /* 147 */ + "invalid cast from '%s' to '%s'", /* 147 */ "improper cast of void expression", /* 148 */ "illegal function (type %s)", /* 149 */ "argument mismatch: %d arg%s passed, %d expected", /* 150 */ Index: src/usr.bin/xlint/lint1/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.318 src/usr.bin/xlint/lint1/tree.c:1.319 --- src/usr.bin/xlint/lint1/tree.c:1.318 Tue Jul 20 19:44:36 2021 +++ src/usr.bin/xlint/lint1/tree.c Sun Jul 25 10:39:10 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.318 2021/07/20 19:44:36 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.319 2021/07/25 10:39:10 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: tree.c,v 1.318 2021/07/20 19:44:36 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.319 2021/07/25 10:39:10 rillig Exp $"); #endif #include <float.h> @@ -3423,15 +3423,10 @@ cast(tnode_t *tn, type_t *tp) error(329, type_name(tn->tn_type), type_name(tp)); return NULL; } else if (nt == STRUCT || nt == ARRAY || nt == FUNC) { - if (!Sflag || nt == ARRAY || nt == FUNC) { - /* invalid cast expression */ - error(147); - return NULL; - } + if (!Sflag || nt == ARRAY || nt == FUNC) + goto invalid_cast; } else if (ot == STRUCT || ot == UNION) { - /* invalid cast expression */ - error(147); - return NULL; + goto invalid_cast; } else if (ot == VOID) { /* improper cast of void expression */ error(148); @@ -3448,16 +3443,18 @@ cast(tnode_t *tn, type_t *tp) /* cast discards 'const' from type '%s' */ warning(275, type_name(tn->tn_type)); } - } else { - /* invalid cast expression */ - error(147); - return NULL; - } + } else + goto invalid_cast; tn = convert(CVT, 0, tp, tn); tn->tn_cast = true; return tn; + +invalid_cast: + /* invalid cast from '%s' to '%s' */ + error(147, type_name(tn->tn_type), type_name(tp)); + return NULL; } /*