diagnostics: complain about undeclared string tokens

String literals, which allow for better error messages, are (too)
liberally accepted by Bison, which might result in silent errors.  For
instance

    %type <exVal> cond "condition"

does not define “condition” as a string alias to 'cond' (nonterminal
symbols do not have string aliases).  It is rather equivalent to

    %nterm <exVal> cond
    %token <exVal> "condition"

i.e., it gives the type 'exVal' to the "condition" token, which was
clearly not the intention.

Introduce -Wdangling-alias to catch this.

* src/complain.h, src/complain.c: Add support for -Wdangling-alias.
(argmatch_warning_args): Sort.
* src/symtab.c (symbol_check_defined): Complain about dangling
aliases.
* doc/bison.texi: Document it.
* tests/input.at (Dangling aliases): New test.
This commit is contained in:
Akim Demaille
2019-11-12 08:28:51 +01:00
parent 28d1ca8f48
commit 8a910107b3
6 changed files with 134 additions and 13 deletions

View File

@@ -26,12 +26,12 @@
#include <assure.h>
#include <fstrcmp.h>
#include <hash.h>
#include <quote.h>
#include "complain.h"
#include "getargs.h"
#include "gram.h"
#include "intprops.h"
#include "quote.h"
static struct hash_table *symbol_table = NULL;
static struct hash_table *semantic_type_table = NULL;
@@ -610,6 +610,13 @@ symbol_check_defined (symbol *sym)
s->number = nvars++;
}
if (s->class == token_sym
&& sym->tag[0] == '"'
&& !sym->is_alias)
complain (&sym->location, Wdangling_alias,
_("string literal %s not attached to a symbol"),
sym->tag);
for (int i = 0; i < 2; ++i)
symbol_code_props_get (sym, i)->is_used = true;