diff options
author | Zack Weinberg <zack@gcc.gnu.org> | 2000-07-31 23:47:19 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2000-07-31 23:47:19 +0000 |
commit | 6ead1e9971df29c9e71b19d3f2faae33c78e13e0 (patch) | |
tree | 09f352803e0788fc35ed3daa9f4930ebd0f0d29b /gcc | |
parent | ed39843b4149642ce7cabec509db61ef46e34b70 (diff) | |
download | gcc-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/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/cpplex.c | 24 | ||||
-rw-r--r-- | gcc/cppmacro.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 1 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/cpp/paste7.c | 19 |
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); +} |