From: Marek Polacek <polacek@redhat.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>
Cc: Tom Tromey <tromey@redhat.com>,
"Joseph S. Myers" <joseph@codesourcery.com>,
Dodji Seketeli <dodji@redhat.com>
Subject: Re: [libcpp PATCH] Fix up location of builtin macros (PR c/61861)
Date: Wed, 23 Jul 2014 15:44:00 -0000 [thread overview]
Message-ID: <20140723153951.GF30336@redhat.com> (raw)
In-Reply-To: <20140723131553.GD30336@redhat.com>
CCing Dodji, please, can you have a look? (I don't believe it is
caused by yours
https://gcc.gnu.org/ml/gcc-patches/2014-07/msg01063.html though,
this was wrong even in 4.8 and maybe earlier.)
On Wed, Jul 23, 2014 at 03:15:53PM +0200, Marek Polacek wrote:
> Bultin macros like __FILE__, __DATE__, etc. had wrong locus - always
> column 1. This patch fixes it by giving those macros location
> of the expansion point, i.e, the location, where builtin macro is used.
> It now also does the correct thing if we do e.g.
> #define F __FILE__.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
>
> 2014-07-23 Marek Polacek <polacek@redhat.com>
>
> PR c/61861
> * macro.c (builtin_macro): Add location parameter. Set
> location of builtin macro to the expansion point.
> (enter_macro_context): Pass location to builtin_macro.
>
> * gcc.dg/pr61861.c: New test.
>
> diff --git gcc/gcc/testsuite/gcc.dg/pr61861.c gcc/gcc/testsuite/gcc.dg/pr61861.c
> index e69de29..d902868 100644
> --- gcc/gcc/testsuite/gcc.dg/pr61861.c
> +++ gcc/gcc/testsuite/gcc.dg/pr61861.c
> @@ -0,0 +1,37 @@
> +/* { dg-do compile } */
> +/* { dg-prune-output "expected" } */
> +
> +extern void foo (int);
> +extern void bar (int, char *);
> +
> +#define F __FILE__ /* { dg-error "11:passing argument" } */
> +#define T __TIME__ /* { dg-error "11:passing argument" } */
> +#define D __DATE__ /* { dg-error "11:passing argument" } */
> +#define L __LINE__ /* { dg-error "11:passing argument" } */
> +
> +#define F2 "foo" /* { dg-error "12:passing argument" } */
> +#define T2 "foo" /* { dg-error "12:passing argument" } */
> +#define D2 "foo" /* { dg-error "12:passing argument" } */
> +#define L2 42 /* { dg-error "12:passing argument" } */
> +
> +void
> +f (void)
> +{
> + foo (__FILE__); /* { dg-error "8:passing argument" } */
> + foo (__BASE_FILE__); /* { dg-error "8:passing argument" } */
> + foo (__TIME__); /* { dg-error "8:passing argument" } */
> + foo (__DATE__); /* { dg-error "8:passing argument" } */
> + foo (__TIMESTAMP__); /* { dg-error "8:passing argument" } */
> + bar (1, __LINE__); /* { dg-error "11:passing argument" } */
> + bar (__COUNTER__, __COUNTER__); /* { dg-error "21:passing argument" } */
> +
> + foo (F); /* { dg-message "8:in expansion of" } */
> + foo (T); /* { dg-message "8:in expansion of" } */
> + foo (D); /* { dg-message "8:in expansion of" } */
> + bar (1, L); /* { dg-message "11:in expansion of" } */
> +
> + foo (F2); /* { dg-message "8:in expansion of" } */
> + foo (T2); /* { dg-message "8:in expansion of" } */
> + foo (D2); /* { dg-message "8:in expansion of" } */
> + bar (1, L2); /* { dg-message "11:in expansion of" } */
> +}
> diff --git gcc/libcpp/macro.c gcc/libcpp/macro.c
> index 3b8fa40..556628b 100644
> --- gcc/libcpp/macro.c
> +++ gcc/libcpp/macro.c
> @@ -84,7 +84,7 @@ struct macro_arg_token_iter
>
> static int enter_macro_context (cpp_reader *, cpp_hashnode *,
> const cpp_token *, source_location);
> -static int builtin_macro (cpp_reader *, cpp_hashnode *);
> +static int builtin_macro (cpp_reader *, cpp_hashnode *, source_location);
> static void push_ptoken_context (cpp_reader *, cpp_hashnode *, _cpp_buff *,
> const cpp_token **, unsigned int);
> static void push_extended_tokens_context (cpp_reader *, cpp_hashnode *,
> @@ -399,9 +399,10 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node)
> /* Convert builtin macros like __FILE__ to a token and push it on the
> context stack. Also handles _Pragma, for which a new token may not
> be created. Returns 1 if it generates a new token context, 0 to
> - return the token to the caller. */
> + return the token to the caller. LOC is the location of the expansion
> + point of the macro. */
> static int
> -builtin_macro (cpp_reader *pfile, cpp_hashnode *node)
> +builtin_macro (cpp_reader *pfile, cpp_hashnode *node, source_location loc)
> {
> const uchar *buf;
> size_t len;
> @@ -429,6 +430,8 @@ builtin_macro (cpp_reader *pfile, cpp_hashnode *node)
> /* Set pfile->cur_token as required by _cpp_lex_direct. */
> pfile->cur_token = _cpp_temp_token (pfile);
> cpp_token *token = _cpp_lex_direct (pfile);
> + /* We should point to the expansion point of the builtin macro. */
> + token->src_loc = loc;
> if (pfile->context->tokens_kind == TOKENS_KIND_EXTENDED)
> {
> /* We are tracking tokens resulting from macro expansion.
> @@ -1212,7 +1215,7 @@ enter_macro_context (cpp_reader *pfile, cpp_hashnode *node,
>
> pfile->about_to_expand_macro_p = false;
> /* Handle built-in macros and the _Pragma operator. */
> - return builtin_macro (pfile, node);
> + return builtin_macro (pfile, node, location);
> }
>
> /* De-allocate the memory used by BUFF which is an array of instances
>
> Marek
Marek
next prev parent reply other threads:[~2014-07-23 15:40 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-23 13:20 Marek Polacek
2014-07-23 15:44 ` Marek Polacek [this message]
2014-07-23 15:59 ` Marek Polacek
2014-07-25 21:21 ` Jeff Law
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140723153951.GF30336@redhat.com \
--to=polacek@redhat.com \
--cc=dodji@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=joseph@codesourcery.com \
--cc=tromey@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).