This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[libcpp PATCH] Fix up location of builtin macros (PR c/61861)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]