summaryrefslogtreecommitdiffstats
path: root/libcpp
diff options
context:
space:
mode:
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-30 11:41:21 +0000
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-30 11:41:21 +0000
commitc55700de48b0df2d512249d4ebfaed1b98abea05 (patch)
tree1d4cb06aa5ecf72c6a60528b1d81bb97c5bb8175 /libcpp
parentd16f4f479d3b7600c9eb1552a0cd4aaccef43ee1 (diff)
downloadppe42-gcc-c55700de48b0df2d512249d4ebfaed1b98abea05.tar.gz
ppe42-gcc-c55700de48b0df2d512249d4ebfaed1b98abea05.zip
Fix token pasting with -ftrack-macro-expansion
This patch makes token pasting work with -ftrack-macro-expansion turned on. It improves some pasting related tests of the gcc.dg/cpp subdirectory. Tested and bootstrapped on x86_64-unknown-linux-gnu against trunk. Note that the bootstrap with -ftrack-macro-expansion exhibits other separate issues that are addressed in subsequent patches. This patch just fixes one class of problems. The patch does pass bootstrap with -ftrack-macro-expansion turned off, though. libcpp/ * macro.c (paste_all_tokens): Put the token resulting from pasting into an extended token context with -ftrack-macro-location is in effect. gcc/testsuite/ * gcc.dg/cpp/paste17.c: New test case for -ftrack-macro-expansion=2 mode only. * gcc.dg/cpp/macro-exp-tracking-5.c: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186966 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/ChangeLog5
-rw-r--r--libcpp/macro.c28
2 files changed, 32 insertions, 1 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index c4f7c5af01a..189f394418e 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,5 +1,10 @@
2012-04-30 Dodji Seketeli <dodji@redhat.com>
+ Fix token pasting with -ftrack-macro-expansion
+ * macro.c (paste_all_tokens): Put the token resulting from pasting
+ into an extended token context with -ftrack-macro-location is in
+ effect.
+
Fix cpp_sys_macro_p with -ftrack-macro-expansion
* macro.c (cpp_sys_macro_p): Support -ftrack-macro-expansion.
diff --git a/libcpp/macro.c b/libcpp/macro.c
index 4f8e52f22cf..f4638c49cd9 100644
--- a/libcpp/macro.c
+++ b/libcpp/macro.c
@@ -611,6 +611,21 @@ paste_all_tokens (cpp_reader *pfile, const cpp_token *lhs)
{
const cpp_token *rhs = NULL;
cpp_context *context = pfile->context;
+ source_location virt_loc = 0;
+
+ /* We must have been called on a token that appears at the left
+ hand side of a ## operator. */
+ if (!(lhs->flags & PASTE_LEFT))
+ abort ();
+
+ if (context->tokens_kind == TOKENS_KIND_EXTENDED)
+ /* The caller must have called consume_next_token_from_context
+ right before calling us. That has incremented the pointer to
+ the current virtual location. So it now points to the location
+ of the token that comes right after *LHS. We want the
+ resulting pasted token to have the location of the current
+ *LHS, though. */
+ virt_loc = context->c.mc->cur_virt_loc[-1];
do
{
@@ -650,7 +665,18 @@ paste_all_tokens (cpp_reader *pfile, const cpp_token *lhs)
while (rhs->flags & PASTE_LEFT);
/* Put the resulting token in its own context. */
- _cpp_push_token_context (pfile, NULL, lhs, 1);
+ if (context->tokens_kind == TOKENS_KIND_EXTENDED)
+ {
+ source_location *virt_locs = NULL;
+ _cpp_buff *token_buf = tokens_buff_new (pfile, 1, &virt_locs);
+ tokens_buff_add_token (token_buf, virt_locs, lhs,
+ virt_loc, 0, NULL, 0);
+ push_extended_tokens_context (pfile, context->c.mc->macro_node,
+ token_buf, virt_locs,
+ (const cpp_token **)token_buf->base, 1);
+ }
+ else
+ _cpp_push_token_context (pfile, NULL, lhs, 1);
}
/* Returns TRUE if the number of arguments ARGC supplied in an
OpenPOWER on IntegriCloud