This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[libcpp PATCH] Fix up location of builtin macros (PR c/61861)
- From: Marek Polacek <polacek at redhat dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Tom Tromey <tromey at redhat dot com>, "Joseph S. Myers" <joseph at codesourcery dot com>
- Date: Wed, 23 Jul 2014 15:15:53 +0200
- Subject: [libcpp PATCH] Fix up location of builtin macros (PR c/61861)
- Authentication-results: sourceware.org; auth=none
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