* gdbtypes.c, gdbtypes.h: New function lookup_signed_typename.
authorPer Bothner <per@bothner.com>
Fri, 10 Jul 1992 23:30:40 +0000 (23:30 +0000)
committerPer Bothner <per@bothner.com>
Fri, 10 Jul 1992 23:30:40 +0000 (23:30 +0000)
* c-exp.y:  Call lookup_signed_typename() after seeing
"signed".  This handles "signed char" correctly.
* c-exp.y:  Recognize (but ignore) 'const' and 'volatile'
keywords before a type specifier.

gdb/ChangeLog
gdb/c-exp.y
gdb/gdbtypes.c
gdb/gdbtypes.h

index c7c91a5e7e44978c4228edf8d52ff18b632e94f7..9f2b62c71abf668c9a5eee7729127a88c1e067d3 100644 (file)
@@ -1,3 +1,11 @@
+Fri Jul 10 13:58:34 1992  Per Bothner  (bothner@rtl.cygnus.com)
+
+       * gdbtypes.c, gdbtypes.h:  New function lookup_signed_typename.
+       * c-exp.y:  Call lookup_signed_typename() after seeing
+       "signed".  This handles "signed char" correctly.
+       * c-exp.y:  Recognize (but ignore) 'const' and 'volatile'
+       keywords before a type specifier.
+
 Fri Jul 10 10:19:52 1992  Fred Fish  (fnf@cygnus.com)
 
        * command.c (lookup_cmd_1):  Clarify descriptive comments.
index 793b76942895b37a8c36960c18236f08daaf1983..fa8ebb90b99fd64ad0bf9ef5c414a0795e32160c 100644 (file)
@@ -161,7 +161,7 @@ parse_number PARAMS ((char *, int, int, YYSTYPE *));
 
 /* Special type cases, put in to allow the parser to distinguish different
    legal basetypes.  */
-%token SIGNED_KEYWORD LONG SHORT INT_KEYWORD
+%token SIGNED_KEYWORD LONG SHORT INT_KEYWORD CONST_KEYWORD VOLATILE_KEYWORD
 
 %token <lval> LAST REGNAME
 
@@ -834,6 +834,9 @@ type        :       ptype
                        { $$ = lookup_member_type
                            (lookup_function_type ($1), $3);
                          free ((PTR)$8); }
+       /* "const" and "volatile" are curently ignored. */
+       |       CONST_KEYWORD type { $$ = $2; }
+       |       VOLATILE_KEYWORD type { $$ = $2; }
        ;
 
 typebase
@@ -878,7 +881,7 @@ typebase
        |       UNSIGNED
                        { $$ = builtin_type_unsigned_int; }
        |       SIGNED_KEYWORD typename
-                       { $$ = $2.type; }
+                       { $$ = lookup_signed_typename (TYPE_NAME($2.type)); }
        |       SIGNED_KEYWORD
                        { $$ = builtin_type_int; }
        |       TEMPLATE name '<' type '>'
@@ -1359,6 +1362,8 @@ yylex ()
       if (current_language->la_language == language_cplus
          && !strncmp (tokstart, "template", 8))
        return TEMPLATE;
+      if (!strncmp (tokstart, "volatile", 8))
+       return VOLATILE_KEYWORD;
       break;
     case 6:
       if (!strncmp (tokstart, "struct", 6))
@@ -1376,6 +1381,8 @@ yylex ()
        return UNION;
       if (!strncmp (tokstart, "short", 5))
        return SHORT;
+      if (!strncmp (tokstart, "const", 5))
+       return CONST_KEYWORD;
       break;
     case 4:
       if (!strncmp (tokstart, "enum", 4))
index 7559ed2d2440e4db43ba1433ce2a4f38f2a42f5b..f34dfcb0fad78aed47f966d1a7ede40791275dd4 100644 (file)
@@ -499,6 +499,22 @@ lookup_unsigned_typename (name)
   return (lookup_typename (uns, (struct block *) NULL, 0));
 }
 
+struct type *
+lookup_signed_typename (name)
+     char *name;
+{
+  struct type *t;
+  char *uns = alloca (strlen (name) + 8);
+
+  strcpy (uns, "signed ");
+  strcpy (uns + 7, name);
+  t = lookup_typename (uns, (struct block *) NULL, 1);
+  /* If we don't find "signed FOO" just try again with plain "FOO". */
+  if (t != NULL)
+    return t;
+  return lookup_typename (name, (struct block *) NULL, 0);
+}
+
 /* Lookup a structure type named "struct NAME",
    visible in lexical block BLOCK.  */
 
index 7a16b37161f1dfa2c7301628124522b0dd9bf7b9..cbc329e5bc55db81fc27f051a953ab6ee5e43224 100644 (file)
@@ -543,6 +543,9 @@ create_array_type PARAMS ((struct type *, int));
 extern struct type *
 lookup_unsigned_typename PARAMS ((char *));
 
+extern struct type *
+lookup_signed_typename PARAMS ((char *));
+
 extern void
 check_stub_type PARAMS ((struct type *));