From 61eb99f6cc4a1deed034cca72870a21d340d5aa2 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Sun, 27 Jul 2014 17:09:38 +0000 Subject: [PATCH] re PR c/61861 (Incorrect column number for -Wdiscarded-qualifiers) 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. From-SVN: r213102 --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr61861.c | 37 ++++++++++++++++++++++++++++++++++ libcpp/ChangeLog | 7 +++++++ libcpp/macro.c | 11 ++++++---- 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr61861.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9f2311b33cd..48717fc3e8c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-07-27 Marek Polacek + + PR c/61861 + * gcc.dg/pr61861.c: New test. + 2014-07-27 Petr Murzin * gcc.target/i386/avx512f-vbroadcastf64x4-2.c: Fix the uninitialized diff --git a/gcc/testsuite/gcc.dg/pr61861.c b/gcc/testsuite/gcc.dg/pr61861.c new file mode 100644 index 00000000000..d9028686e26 --- /dev/null +++ b/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 a/libcpp/ChangeLog b/libcpp/ChangeLog index 7a6b8e3a5cc..e550d177c26 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,10 @@ +2014-07-27 Marek Polacek + + 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. + 2014-07-16 Dodji Seketeli Support location tracking for built-in macro tokens diff --git a/libcpp/macro.c b/libcpp/macro.c index 3b8fa406935..556628ba7c7 100644 --- a/libcpp/macro.c +++ b/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