]> git.saurik.com Git - bison.git/blobdiff - src/symtab.c
Merge remote-tracking branch 'origin/maint'
[bison.git] / src / symtab.c
index 12e19ec98f0c297016eb7992216bc1ce83898107..66e20c0520e2c0566e2a0ca38ba6b08f8de51145 100644 (file)
@@ -46,20 +46,6 @@ symbol *accept = NULL;
 symbol *startsymbol = NULL;
 location startsymbol_location;
 
-/*---------------------------------------.
-| Default %destructor's and %printer's.  |
-`---------------------------------------*/
-
-static code_props default_tagged_code_props[CODE_PROPS_SIZE] =
-  {
-    CODE_PROPS_NONE_INIT,
-    CODE_PROPS_NONE_INIT,
-  };
-static code_props default_tagless_code_props[CODE_PROPS_SIZE] =
-  {
-    CODE_PROPS_NONE_INIT,
-    CODE_PROPS_NONE_INIT,
-  };
 
 /*---------------------------------.
 | Create a new symbol, named TAG.  |
@@ -147,7 +133,7 @@ semantic_type_new (uniqstr tag, const location *loc)
     fprintf (f, " %s { %s }", #Attr, s->props[Attr].code)
 
 void
-symbol_print (symbol *s, FILE *f)
+symbol_print (symbol const *s, FILE *f)
 {
   if (s)
     {
@@ -207,16 +193,24 @@ static void
 symbol_redeclaration (symbol *s, const char *what, location first,
                       location second)
 {
-  complain_at (second, complaint, _("%s redeclaration for %s"), what, s->tag);
-  complain_at (first, complaint, _("previous declaration"));
+  unsigned i = 0;
+  complain_at_indent (second, complaint, &i,
+                      _("%s redeclaration for %s"), what, s->tag);
+  i += SUB_INDENT;
+  complain_at_indent (first, complaint, &i,
+                      _("previous declaration"));
 }
 
 static void
 semantic_type_redeclaration (semantic_type *s, const char *what, location first,
                              location second)
 {
-  complain_at (second, complaint, _("%s redeclaration for <%s>"), what, s->tag);
-  complain_at (first, complaint, _("previous declaration"));
+  unsigned i = 0;
+  complain_at_indent (second, complaint, &i,
+                      _("%s redeclaration for <%s>"), what, s->tag);
+  i += SUB_INDENT;
+  complain_at_indent (first, complaint, &i,
+                      _("previous declaration"));
 }
 
 
@@ -274,9 +268,8 @@ semantic_type_code_props_set (semantic_type *type,
 | Get the computed %destructor or %printer for SYM.  |
 `---------------------------------------------------*/
 
-code_props const *
-symbol_code_props_get (symbol const *sym,
-                       code_props_type kind)
+code_props *
+symbol_code_props_get (symbol *sym, code_props_type kind)
 {
   /* Per-symbol code props.  */
   if (sym->props[kind].code)
@@ -285,19 +278,21 @@ symbol_code_props_get (symbol const *sym,
   /* Per-type code props.  */
   if (sym->type_name)
     {
-      code_props const *code =
+      code_props *code =
         &semantic_type_get (sym->type_name, NULL)->props[kind];
       if (code->code)
         return code;
     }
 
   /* Apply default code props's only to user-defined symbols.  */
-  if (sym->tag[0] == '$' || sym == errtoken)
-    return &code_props_none;
-
-  if (sym->type_name)
-    return &default_tagged_code_props[kind];
-  return &default_tagless_code_props[kind];
+  if (sym->tag[0] != '$' && sym != errtoken)
+    {
+      code_props *code =
+        &semantic_type_get (sym->type_name ? "*" : "", NULL)->props[kind];
+      if (code->code)
+        return code;
+    }
+  return &code_props_none;
 }
 
 /*-----------------------------------------------------------------.
@@ -396,38 +391,18 @@ symbol_check_defined (symbol *sym)
 {
   if (sym->class == unknown_sym)
     {
-      switch (sym->status)
-        {
-        case used:
-          complain_at (sym->location, Wother,
-                       _("symbol %s is used, but is not defined as a token"
-                         " and has no rules"),
-                       sym->tag);
-          break;
-        case undeclared:
-        case needed:
-          complain_at (sym->location, complaint,
-                       _("symbol %s is used, but is not defined as a token"
-                         " and has no rules"),
-                    sym->tag);
-          break;
-        case declared:
-          /* If declared, then sym->class != unknown_sym. */
-          assert (0);
-        }
-
+      assert (sym->status != declared);
+      complain_at (sym->location,
+                   sym->status == needed ? complaint : Wother,
+                   _("symbol %s is used, but is not defined as a token"
+                     " and has no rules"),
+                   sym->tag);
       sym->class = nterm_sym;
       sym->number = nvars++;
     }
 
   for (int i = 0; i < 2; ++i)
-    if (sym->props[i].kind == CODE_PROPS_NONE && sym->type_name)
-      {
-        semantic_type *sem_type = semantic_type_get (sym->type_name, NULL);
-        if (sem_type
-            && sem_type->props[i].kind != CODE_PROPS_NONE)
-          sem_type->props[i].is_used = true;
-      }
+    symbol_code_props_get (sym, i)->is_used = true;
 
   /* Set the semantic type status associated to the current symbol to
      'declared' so that we could check semantic types unnecessary uses. */
@@ -444,7 +419,10 @@ symbol_check_defined (symbol *sym)
 static inline bool
 semantic_type_check_defined (semantic_type *sem_type)
 {
-  if (sem_type->status == declared)
+  // <*> and <> do not have to be "declared".
+  if (sem_type->status == declared
+      || !*sem_type->tag
+      || STREQ(sem_type->tag, "*"))
     {
       for (int i = 0; i < 2; ++i)
         if (sem_type->props[i].kind != CODE_PROPS_NONE
@@ -576,6 +554,7 @@ symbol_pack_processor (void *this, void *null ATTRIBUTE_UNUSED)
 static void
 user_token_number_redeclaration (int num, symbol *first, symbol *second)
 {
+  unsigned i = 0;
   /* User token numbers are not assigned during the parsing, but in a
      second step, via a traversal of the symbol table sorted on tag.
 
@@ -587,11 +566,13 @@ user_token_number_redeclaration (int num, symbol *first, symbol *second)
       first = second;
       second = tmp;
     }
-  complain_at (second->location, complaint,
-               _("user token number %d redeclaration for %s"),
-               num, second->tag);
-  complain_at (first->location, complaint, _("previous declaration for %s"),
-               first->tag);
+  complain_at_indent (second->location, complaint, &i,
+                      _("user token number %d redeclaration for %s"),
+                      num, second->tag);
+  i += SUB_INDENT;
+  complain_at_indent (first->location, complaint, &i,
+                      _("previous declaration for %s"),
+                      first->tag);
 }
 
 /*--------------------------------------------------.
@@ -977,36 +958,3 @@ symbols_pack (void)
                  _("the start symbol %s is a token"),
                  startsymbol->tag);
 }
-
-
-/*--------------------------------------------------.
-| Set default tagged/tagless %destructor/%printer.  |
-`--------------------------------------------------*/
-
-void
-default_tagged_code_props_set (code_props_type kind, code_props const *code)
-{
-  if (default_tagged_code_props[kind].code)
-    {
-      complain_at (code->location, complaint,
-                   _("redeclaration for default tagged %s"),
-                   code_props_type_string (kind));
-      complain_at (default_tagged_code_props[kind].location, complaint,
-                   _("previous declaration"));
-    }
-  default_tagged_code_props[kind] = *code;
-}
-
-void
-default_tagless_code_props_set (code_props_type kind, code_props const *code)
-{
-  if (default_tagless_code_props[kind].code)
-    {
-      complain_at (code->location, complaint,
-                   _("redeclaration for default tagless %s"),
-                   code_props_type_string (kind));
-      complain_at (default_tagless_code_props[kind].location, complaint,
-                   _("previous declaration"));
-    }
-  default_tagless_code_props[kind] = *code;
-}