* postfix stuff had been applied in wrong order (e.g. int a[2][3] generated int [addressable][toplevel] a[3][2]) * after fixing that, we've no need for recursion anymore, a bunch of arguments go away and turn into local variables and we get an easy way to get rid of bogus space in the show_typename() result. Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> --- evaluate.c | 4 +- show-parse.c | 100 +++++++++++++++++++++++++++++---------------------------- 2 files changed, 53 insertions(+), 51 deletions(-) diff --git a/evaluate.c b/evaluate.c index 777f603..2901c1b 100644 --- a/evaluate.c +++ b/evaluate.c @@ -502,7 +502,7 @@ static inline void unrestrict(struct expression *expr, if (class & TYPE_RESTRICT) { if (class & TYPE_FOULED) *ctype = unfoul(*ctype); - warning(expr->pos, "%sdegrades to integer", + warning(expr->pos, "%s degrades to integer", show_typename(*ctype)); *ctype = (*ctype)->ctype.base_type; /* get to arithmetic type */ } @@ -1802,7 +1802,7 @@ static struct symbol *evaluate_preop(struct expression *expr) expr->right->ctype = ctype; expr->right->fvalue = 0; } else if (is_fouled_type(ctype)) { - warning(expr->pos, "%sdegrades to integer", + warning(expr->pos, "%s degrades to integer", show_typename(ctype->ctype.base_type)); } ctype = &bool_ctype; diff --git a/show-parse.c b/show-parse.c index b9a2828..064af32 100644 --- a/show-parse.c +++ b/show-parse.c @@ -226,12 +226,16 @@ const char *builtin_ctypename(struct ctype *ctype) return NULL; } -static void do_show_type(struct symbol *sym, struct type_name *name, - unsigned long mod, int as, int was_ptr) +static void do_show_type(struct symbol *sym, struct type_name *name) { const char *typename; - int is_ptr = was_ptr; + unsigned long mod = 0; + int as = 0; + int was_ptr = 0; + int restr = 0; + int fouled = 0; +deeper: if (!sym || (sym->type != SYM_NODE && sym->type != SYM_ARRAY && sym->type != SYM_BITFIELD)) { const char *s; @@ -249,14 +253,15 @@ static void do_show_type(struct symbol *sym, struct type_name *name, } if (!sym) - return; + goto out; if ((typename = builtin_typename(sym))) { int len = strlen(typename); - *--name->start = ' '; + if (name->start != name->end) + *--name->start = ' '; name->start -= len; memcpy(name->start, typename, len); - return; + goto out; } /* Prepend */ @@ -265,20 +270,29 @@ static void do_show_type(struct symbol *sym, struct type_name *name, prepend(name, "*"); mod = sym->ctype.modifiers; as = sym->ctype.as; - is_ptr = 1; + was_ptr = 1; break; + case SYM_FN: - if (was_ptr) + if (was_ptr) { prepend(name, "( "); - is_ptr = 0; + append(name, " )"); + was_ptr = 0; + } + append(name, "( ... )"); break; + case SYM_STRUCT: - prepend(name, "struct %s ", show_ident(sym->ident)); - return; + if (name->start != name->end) + *--name->start = ' '; + prepend(name, "struct %s", show_ident(sym->ident)); + goto out; case SYM_UNION: - prepend(name, "union %s ", show_ident(sym->ident)); - return; + if (name->start != name->end) + *--name->start = ' '; + prepend(name, "union %s", show_ident(sym->ident)); + goto out; case SYM_ENUM: prepend(name, "enum %s ", show_ident(sym->ident)); @@ -298,60 +312,48 @@ static void do_show_type(struct symbol *sym, struct type_name *name, case SYM_LABEL: append(name, "label(%s:%p)", show_ident(sym->ident), sym); - break; + return; case SYM_ARRAY: mod |= sym->ctype.modifiers; as |= sym->ctype.as; - if (was_ptr) + if (was_ptr) { prepend(name, "( "); - is_ptr = 0; + append(name, " )"); + was_ptr = 0; + } + append(name, "[%lld]", get_expression_value(sym->array_size)); break; case SYM_RESTRICT: - if (sym->ident) { - prepend(name, "restricted %s ", show_ident(sym->ident)); - return; + if (!sym->ident) { + restr = 1; + break; } - break; + if (name->start != name->end) + *--name->start = ' '; + prepend(name, "restricted %s", show_ident(sym->ident)); + goto out; case SYM_FOULED: + fouled = 1; break; default: + if (name->start != name->end) + *--name->start = ' '; prepend(name, "unknown type %d", sym->type); - return; + goto out; } - do_show_type(sym->ctype.base_type, name, mod, as, is_ptr); - - switch (sym->type) { - case SYM_PTR: - return; - - case SYM_FN: - if (was_ptr) - append(name, " )"); - append(name, "( ... )"); - return; - - case SYM_ARRAY: - if (was_ptr) - append(name, " )"); - append(name, "[%lld]", get_expression_value(sym->array_size)); - return; + sym = sym->ctype.base_type; + goto deeper; - case SYM_RESTRICT: +out: + if (restr) prepend(name, "restricted "); - return; - - case SYM_FOULED: + if (fouled) prepend(name, "fouled "); - return; - - default: - break; - } } void show_type(struct symbol *sym) @@ -360,7 +362,7 @@ void show_type(struct symbol *sym) struct type_name name; name.start = name.end = array+100; - do_show_type(sym, &name, 0, 0, 0); + do_show_type(sym, &name); *name.end = 0; printf("%s", name.start); } @@ -371,7 +373,7 @@ const char *show_typename(struct symbol *sym) struct type_name name; name.start = name.end = array+100; - do_show_type(sym, &name, 0, 0, 0); + do_show_type(sym, &name); *name.end = 0; return name.start; } -- 1.5.3.GIT - To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html