[multiple changes]
authorZack Weinberg <zack@gcc.gnu.org>
Mon, 31 Jul 2000 23:47:19 +0000 (23:47 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Mon, 31 Jul 2000 23:47:19 +0000 (23:47 +0000)
2000-07-31  Jakub Jelinek  <jakub@redhat.com>

* cpplex.c (_cpp_get_line): If index is 0, return line 0 col 0.
(_cpp_get_token): Don't macro expand a just pasted token if it
was pasted at no_expand_level.

* testsuite/gcc.dg/cpp/paste7.c: New test.

2000-07-31  Zack Weinberg  <zack@wolery.cumb.org>

* cppmacro.c (find_param, count_params, save_expansion):
Permit 'defined' as a macro parameter name.

From-SVN: r35394

gcc/ChangeLog
gcc/cpplex.c
gcc/cppmacro.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/paste7.c [new file with mode: 0644]

index 73be51bc87c1c06ab7b84cb782c93094557684c9..a0cb0143e13eeb99b225d62a235a982f1844ee85 100644 (file)
@@ -1,3 +1,14 @@
+2000-07-31  Jakub Jelinek  <jakub@redhat.com>
+
+       * cpplex.c (_cpp_get_line): If index is 0, return line 0 col 0.
+       (_cpp_get_token): Don't macro expand a just pasted token if it
+       was pasted at no_expand_level.
+
+2000-07-31  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * cppmacro.c (find_param, count_params, save_expansion):
+       Permit 'defined' as a macro parameter name.
+
 2000-07-31  Zack Weinberg  <zack@wolery.cumb.org>
 
        * Makefile.in: Rename cpp to cpp0, tradcpp to tradcpp0, and
index bbe6f355b77f218f7560f4156b0df31befc961ab..0ee0a3d9e155b6a60217c6b7212879b9f021a699 100644 (file)
@@ -3082,7 +3082,7 @@ const cpp_token *
 _cpp_get_token (pfile)
      cpp_reader *pfile;
 {
-  const cpp_token *token;
+  const cpp_token *token, *old_token;
   cpp_hashnode *node;
 
   /* Loop until we hit a non-macro token.  */
@@ -3111,6 +3111,8 @@ _cpp_get_token (pfile)
         be taken as a control macro.  */
       pfile->potential_control_macro = 0;
 
+      old_token = token;
+
       /* See if there's a token to paste with this one.  */
       if (!pfile->paste_level)
        token = maybe_paste_with_next (pfile, token);
@@ -3120,10 +3122,17 @@ _cpp_get_token (pfile)
        return token;
 
       /* Is macro expansion disabled in general, or are we in the
-        middle of a token paste?  */
-      if (pfile->no_expand_level == pfile->cur_context || pfile->paste_level)
+        middle of a token paste, or was this token just pasted?
+        (Note we don't check token->flags & PASTED, because that
+        counts tokens that were pasted at some point in the past,
+        we're only interested in tokens that were pasted by this call
+        to maybe_paste_with_next.)  */
+      if (pfile->no_expand_level == pfile->cur_context
+         || pfile->paste_level
+         || (token != old_token
+             && pfile->no_expand_level + 1 == pfile->cur_context))
        return token;
+
       node = token->val.node;
       if (node->type != T_MACRO)
        return special_symbol (pfile, node, token);
@@ -3337,6 +3346,13 @@ _cpp_get_line (pfile, pcol)
   else
     index = pfile->contexts[0].posn;
 
+  if (index == 0)
+    {
+      if (pcol)
+       *pcol = 0;
+      return 0;
+    }
+
   cur_token = &pfile->token_list.tokens[index - 1];
   if (pcol)
     *pcol = cur_token->col;
index 03a9a99659da3214653ec55036c62cb115f3d46f..8d53baf71f6fe647cf29d2051aa11dd4db5afb3b 100644 (file)
@@ -72,7 +72,7 @@ find_param (first, token)
   unsigned int param = 0;
 
   for (; first < token && first->type != CPP_CLOSE_PAREN; first++)
-    if (first->type == CPP_NAME)
+    if (first->type == CPP_NAME || first->type == CPP_DEFINED)
       {
        param++;
        if (first->val.node == token->val.node)
@@ -139,6 +139,8 @@ count_params (pfile, info)
        case CPP_COMMENT:
          continue;             /* Ignore -C comments.  */
 
+       case CPP_DEFINED:       /* 'defined' may be used as a macro
+                                  parameter name.  */
        case CPP_NAME:
          if (prev_ident)
            {
@@ -429,7 +431,7 @@ save_expansion (pfile, info)
      dumping macro definitions.  They must go first.  */
   if (list->params_len)
     for (token = info->first_param; token < info->first; token++)
-      if (token->type == CPP_NAME)
+      if (token->type == CPP_NAME || token->type == CPP_DEFINED)
        {
          /* Copy null too.  */
          memcpy (buf, token->val.node->name, token->val.node->length + 1);
@@ -443,6 +445,7 @@ save_expansion (pfile, info)
 
       switch (token->type)
        {
+       case CPP_DEFINED:
        case CPP_NAME:
          if (list->paramc == -1)
            break;
index f01f947b4a86adc3ed54e85c7caf6fe19f4b43d5..62ce61ae939f29f722b50ac266e14235ec78a6f1 100644 (file)
@@ -1,5 +1,6 @@
 2000-07-31  Jakub Jelinek  <jakub@redhat.com>
 
+       * testsuite/gcc.dg/cpp/paste7.c: New test.
        * gcc.dg/cpp/20000725-1.c: New test.
 
 2000-07-31  Zack Weinberg  <zack@wolery.cumb.org>
diff --git a/gcc/testsuite/gcc.dg/cpp/paste7.c b/gcc/testsuite/gcc.dg/cpp/paste7.c
new file mode 100644 (file)
index 0000000..ce29db8
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+
+#define D_2 1, 2
+#define C_2(X, I0, I1) X##_a = I0, X##_b = I1
+#define B_2(X, I) C_2(X, I)
+#define A(N, X) B_##N (X, D_##N)
+
+extern void abort(void);
+extern void exit(int);
+
+int x_a, x_b;
+
+int main(void)
+{
+  A(2, x);
+  if (x_a != 1 || x_b != 2)
+    abort();
+  exit(0);
+}