Expand preprocessor macros in C expressions.
[deliverable/binutils-gdb.git] / gdb / c-exp.y
index 3d2d1aa661f724b0b87b521359f1fb89b74e2e7b..f555518ea0013c7ba40bf6e8135d1d89d185af52 100644 (file)
@@ -807,24 +807,52 @@ typebase  /* Implements (approximately): (type-qualifier)* type-specifier */
                        { $$ = builtin_type_short; }
        |       LONG INT_KEYWORD
                        { $$ = builtin_type_long; }
+       |       LONG SIGNED_KEYWORD INT_KEYWORD
+                       { $$ = builtin_type_long; }
+       |       LONG SIGNED_KEYWORD
+                       { $$ = builtin_type_long; }
+       |       SIGNED_KEYWORD LONG INT_KEYWORD
+                       { $$ = builtin_type_long; }
        |       UNSIGNED LONG INT_KEYWORD
                        { $$ = builtin_type_unsigned_long; }
+       |       LONG UNSIGNED INT_KEYWORD
+                       { $$ = builtin_type_unsigned_long; }
+       |       LONG UNSIGNED
+                       { $$ = builtin_type_unsigned_long; }
        |       LONG LONG
                        { $$ = builtin_type_long_long; }
        |       LONG LONG INT_KEYWORD
                        { $$ = builtin_type_long_long; }
+       |       LONG LONG SIGNED_KEYWORD INT_KEYWORD
+                       { $$ = builtin_type_long_long; }
+       |       LONG LONG SIGNED_KEYWORD
+                       { $$ = builtin_type_long_long; }
+       |       SIGNED_KEYWORD LONG LONG
+                       { $$ = builtin_type_long_long; }
        |       UNSIGNED LONG LONG
                        { $$ = builtin_type_unsigned_long_long; }
        |       UNSIGNED LONG LONG INT_KEYWORD
                        { $$ = builtin_type_unsigned_long_long; }
+       |       LONG LONG UNSIGNED
+                       { $$ = builtin_type_unsigned_long_long; }
+       |       LONG LONG UNSIGNED INT_KEYWORD
+                       { $$ = builtin_type_unsigned_long_long; }
        |       SIGNED_KEYWORD LONG LONG
                        { $$ = lookup_signed_typename ("long long"); }
        |       SIGNED_KEYWORD LONG LONG INT_KEYWORD
                        { $$ = lookup_signed_typename ("long long"); }
        |       SHORT INT_KEYWORD
                        { $$ = builtin_type_short; }
+       |       SHORT SIGNED_KEYWORD INT_KEYWORD
+                       { $$ = builtin_type_short; }
+       |       SHORT SIGNED_KEYWORD
+                       { $$ = builtin_type_short; }
        |       UNSIGNED SHORT INT_KEYWORD
                        { $$ = builtin_type_unsigned_short; }
+       |       SHORT UNSIGNED 
+                       { $$ = builtin_type_unsigned_short; }
+       |       SHORT UNSIGNED INT_KEYWORD
+                       { $$ = builtin_type_unsigned_short; }
        |       DOUBLE_KEYWORD
                        { $$ = builtin_type_double; }
        |       LONG DOUBLE_KEYWORD
@@ -1218,6 +1246,18 @@ yylex ()
    
  retry:
 
+  /* Check if this is a macro invocation that we need to expand.  */
+  if (! scanning_macro_expansion ())
+    {
+      char *expanded = macro_expand_next (&lexptr,
+                                          expression_macro_lookup_func,
+                                          expression_macro_lookup_baton);
+
+      if (expanded)
+        scan_macro_expansion (expanded);
+    }
+
+  prev_lexptr = lexptr;
   unquoted_expr = 1;
 
   tokstart = lexptr;
@@ -1242,7 +1282,17 @@ yylex ()
   switch (c = *tokstart)
     {
     case 0:
-      return 0;
+      /* If we were just scanning the result of a macro expansion,
+         then we need to resume scanning the original text.
+         Otherwise, we were already scanning the original text, and
+         we're really done.  */
+      if (scanning_macro_expansion ())
+        {
+          finished_macro_expansion ();
+          goto retry;
+        }
+      else
+        return 0;
 
     case ' ':
     case '\t':
@@ -1295,7 +1345,9 @@ yylex ()
       return c;
 
     case ',':
-      if (comma_terminates && paren_depth == 0)
+      if (comma_terminates
+          && paren_depth == 0
+          && ! scanning_macro_expansion ())
        return 0;
       lexptr++;
       return c;
@@ -1474,9 +1526,13 @@ yylex ()
       c = tokstart[++namelen];
     }
 
-  /* The token "if" terminates the expression and is NOT 
-     removed from the input stream.  */
-  if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
+  /* The token "if" terminates the expression and is NOT removed from
+     the input stream.  It doesn't count if it appears in the
+     expansion of a macro.  */
+  if (namelen == 2
+      && tokstart[0] == 'i'
+      && tokstart[1] == 'f'
+      && ! scanning_macro_expansion ())
     {
       return 0;
     }
@@ -1738,5 +1794,8 @@ void
 yyerror (msg)
      char *msg;
 {
+  if (prev_lexptr)
+    lexptr = prev_lexptr;
+
   error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr);
 }
This page took 0.026837 seconds and 4 git commands to generate.