lint: clean up warn_incompatible_types

Splitting the code arbitrarily in separate phases made the code harder
to understand, both for humans as well as automated tools.

One of these tools, check-msgs.lua, couldn't check whether the comments
match the actual messages, and of course, the comments were wrong.
There was no good reason to deviate from the pattern followed by all the
rest of the code.
This commit is contained in:
rillig 2021-01-01 01:38:14 +00:00
parent 5cf99a8e7a
commit 15ccb490cc

View File

@ -1,4 +1,4 @@
/* $NetBSD: tree.c,v 1.109 2021/01/01 01:07:08 rillig Exp $ */
/* $NetBSD: tree.c,v 1.110 2021/01/01 01:38:14 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.109 2021/01/01 01:07:08 rillig Exp $");
__RCSID("$NetBSD: tree.c,v 1.110 2021/01/01 01:38:14 rillig Exp $");
#endif
#include <float.h>
@ -2190,42 +2190,27 @@ static void
warn_incompatible_types(op_t op, tspec_t lt, tspec_t rt)
{
mod_t *mp;
int e = 0;
mp = &modtab[op];
if (lt == VOID || (mp->m_binary && rt == VOID)) {
/* void type illegal in expression */
e = 109;
error(109);
} else if (op == ASSIGN) {
if ((lt == STRUCT || lt == UNION) &&
(rt == STRUCT || rt == UNION)) {
/* assignment of different structures */
e = 240;
/* assignment of different structures (%s != %s) */
error(240, basic_type_name(lt), basic_type_name(rt));
} else {
/* assignment type mismatch */
e = 171;
/* assignment type mismatch (%s != %s) */
error(171, basic_type_name(lt), basic_type_name(rt));
}
} else if (mp->m_binary) {
/* operands of %s have incompatible types */
e = 107;
/* operands of '%s' have incompatible types (%s != %s) */
error(107, mp->m_name, basic_type_name(lt), basic_type_name(rt));
} else {
/* operand of %s has incompatible type */
e = 108;
}
switch (e) {
case 0:
return;
case 109:
error(e);
return;
case 108:
case 107:
error(e, mp->m_name, basic_type_name(lt), basic_type_name(rt));
return;
default:
error(e, basic_type_name(lt), basic_type_name(rt));
return;
/* operand of '%s' has incompatible type (%s != %s) */
error(108, mp->m_name, basic_type_name(lt), basic_type_name(rt));
}
}