diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cpplex.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/cpp/macro2.c | 14 |
4 files changed, 26 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 88195b5..f218aa1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Sat 16-Sep-2000 08:13:45 BST Neil Booth <NeilB@earthling.net> + + * cpplex.c (push_macro_context): Set an argument's level after + calling parse_args. We could loop infinitely otherwise. + 2000-09-15 Tom Tromey <tromey@cygnus.com> * configure, config.in: Rebuilt. diff --git a/gcc/cpplex.c b/gcc/cpplex.c index 56b8543..970b35f 100644 --- a/gcc/cpplex.c +++ b/gcc/cpplex.c @@ -2972,7 +2972,6 @@ push_macro_context (pfile, token) args->tokens = 0; args->capacity = 0; args->used = 0; - args->level = pfile->cur_context; prev_nme = prevent_macro_expansion (pfile); pfile->args = args; @@ -2984,6 +2983,8 @@ push_macro_context (pfile, token) free_macro_args (args); return 1; } + /* Set the level after the call to parse_args. */ + args->level = pfile->cur_context; } /* Now push its context. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 54d0fa9..510c033 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +Sat 16-Sep-2000 08:14:58 BST Neil Booth <NeilB@earthling.net> + + * gcc.dg/cpp/macro2.c: Testcase for multi-context arguments + in nested macro bug. + Fri 15-Sep-2000 06:50:11 BST Neil Booth <NeilB@earthling.net> * gcc.dg/cpp/paste10.c: Testcase for PASTE_LEFT buglet. diff --git a/gcc/testsuite/gcc.dg/cpp/macro2.c b/gcc/testsuite/gcc.dg/cpp/macro2.c new file mode 100644 index 0000000..2265a2b --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/macro2.c @@ -0,0 +1,14 @@ +/* Copyright (C) 2000 Free Software Foundation, Inc. */ + +/* { dg-do preprocess } */ + +/* Tests the argument context get set at the lower level if we drop + contexts whilst parsing arguments. This would enter an infinite + loop in is_macro_disabled previously. */ + +#define A Something +#define B C +#define C K( +#define K(S) S +#define T B A ) +T /* Expands to <Something>. */ |