aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZack Weinberg <zack@gcc.gnu.org>2000-07-31 23:47:19 +0000
committerZack Weinberg <zack@gcc.gnu.org>2000-07-31 23:47:19 +0000
commit6ead1e9971df29c9e71b19d3f2faae33c78e13e0 (patch)
tree09f352803e0788fc35ed3daa9f4930ebd0f0d29b /gcc
parented39843b4149642ce7cabec509db61ef46e34b70 (diff)
downloadgcc-6ead1e9971df29c9e71b19d3f2faae33c78e13e0.zip
gcc-6ead1e9971df29c9e71b19d3f2faae33c78e13e0.tar.gz
gcc-6ead1e9971df29c9e71b19d3f2faae33c78e13e0.tar.bz2
[multiple changes]
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/cpplex.c24
-rw-r--r--gcc/cppmacro.c7
-rw-r--r--gcc/testsuite/ChangeLog1
-rw-r--r--gcc/testsuite/gcc.dg/cpp/paste7.c19
5 files changed, 56 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 73be51b..a0cb014 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cpplex.c b/gcc/cpplex.c
index bbe6f35..0ee0a3d 100644
--- a/gcc/cpplex.c
+++ b/gcc/cpplex.c
@@ -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;
diff --git a/gcc/cppmacro.c b/gcc/cppmacro.c
index 03a9a99..8d53baf 100644
--- a/gcc/cppmacro.c
+++ b/gcc/cppmacro.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f01f947..62ce61a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..ce29db8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/paste7.c
@@ -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);
+}