diff options
author | Lewis Hyatt <lhyatt@gmail.com> | 2022-08-03 10:46:23 -0400 |
---|---|---|
committer | Lewis Hyatt <lhyatt@gmail.com> | 2023-06-20 16:58:12 -0400 |
commit | 4f3be7cbebce8ec9e0c5d9340b2772581454b862 (patch) | |
tree | d70c4253852252415f1388fa2cecd508b116eba4 /libcpp/directives.cc | |
parent | 079f31c553182f49eda70f4d4ce839c3e35bf6cf (diff) | |
download | gcc-4f3be7cbebce8ec9e0c5d9340b2772581454b862.zip gcc-4f3be7cbebce8ec9e0c5d9340b2772581454b862.tar.gz gcc-4f3be7cbebce8ec9e0c5d9340b2772581454b862.tar.bz2 |
libcpp: Improve location for macro names [PR66290]
When libcpp reports diagnostics whose locus is a macro name (such as for
-Wunused-macros), it uses the location in the cpp_macro object that was
stored by _cpp_new_macro. This is currently set to pfile->directive_line,
which contains the line number only and no column information. This patch
changes the stored location to the src_loc for the token defining the macro
name, which includes the location and range information.
libcpp/ChangeLog:
PR c++/66290
* macro.cc (_cpp_create_definition): Add location argument.
* internal.h (_cpp_create_definition): Adjust prototype.
* directives.cc (do_define): Pass new location argument to
_cpp_create_definition.
(do_undef): Stop passing inferior location to cpp_warning_with_line;
the default from cpp_warning is better.
(cpp_pop_definition): Pass new location argument to
_cpp_create_definition.
* pch.cc (cpp_read_state): Likewise.
gcc/testsuite/ChangeLog:
PR c++/66290
* c-c++-common/cpp/macro-ranges.c: New test.
* c-c++-common/cpp/line-2.c: Adapt to check for column information
on macro-related libcpp warnings.
* c-c++-common/cpp/line-3.c: Likewise.
* c-c++-common/cpp/macro-arg-count-1.c: Likewise.
* c-c++-common/cpp/pr58844-1.c: Likewise.
* c-c++-common/cpp/pr58844-2.c: Likewise.
* c-c++-common/cpp/warning-zero-location.c: Likewise.
* c-c++-common/pragma-diag-14.c: Likewise.
* c-c++-common/pragma-diag-15.c: Likewise.
* g++.dg/modules/macro-2_d.C: Likewise.
* g++.dg/modules/macro-4_d.C: Likewise.
* g++.dg/modules/macro-4_e.C: Likewise.
* g++.dg/spellcheck-macro-ordering.C: Likewise.
* gcc.dg/builtin-redefine.c: Likewise.
* gcc.dg/cpp/Wunused.c: Likewise.
* gcc.dg/cpp/redef2.c: Likewise.
* gcc.dg/cpp/redef3.c: Likewise.
* gcc.dg/cpp/redef4.c: Likewise.
* gcc.dg/cpp/ucnid-11-utf8.c: Likewise.
* gcc.dg/cpp/ucnid-11.c: Likewise.
* gcc.dg/cpp/undef2.c: Likewise.
* gcc.dg/cpp/warn-redefined-2.c: Likewise.
* gcc.dg/cpp/warn-redefined.c: Likewise.
* gcc.dg/cpp/warn-unused-macros-2.c: Likewise.
* gcc.dg/cpp/warn-unused-macros.c: Likewise.
Diffstat (limited to 'libcpp/directives.cc')
-rw-r--r-- | libcpp/directives.cc | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/libcpp/directives.cc b/libcpp/directives.cc index 1fdd73e..ee5419d 100644 --- a/libcpp/directives.cc +++ b/libcpp/directives.cc @@ -655,6 +655,10 @@ do_define (cpp_reader *pfile) if (node) { + /* This is a better location than pfile->directive_line to store + as the macro location. */ + const location_t name_loc = cpp_diagnostic_get_current_location (pfile); + /* If we have been requested to expand comments into macros, then re-enable saving of comments. */ pfile->state.save_comments = @@ -663,7 +667,7 @@ do_define (cpp_reader *pfile) if (pfile->cb.before_define) pfile->cb.before_define (pfile); - if (_cpp_create_definition (pfile, node)) + if (_cpp_create_definition (pfile, node, name_loc)) if (pfile->cb.define) pfile->cb.define (pfile, pfile->directive_line, node); @@ -694,9 +698,8 @@ do_undef (cpp_reader *pfile) "undefining \"%s\"", NODE_NAME (node)); else if (cpp_builtin_macro_p (node) && CPP_OPTION (pfile, warn_builtin_macro_redefined)) - cpp_warning_with_line (pfile, CPP_W_BUILTIN_MACRO_REDEFINED, - pfile->directive_line, 0, - "undefining \"%s\"", NODE_NAME (node)); + cpp_warning (pfile, CPP_W_BUILTIN_MACRO_REDEFINED, + "undefining \"%s\"", NODE_NAME (node)); if (node->value.macro && CPP_OPTION (pfile, warn_unused_macros)) @@ -2642,7 +2645,7 @@ cpp_pop_definition (cpp_reader *pfile, struct def_pragma_macro *c) { _cpp_clean_line (pfile); nbuf->sysp = 1; - if (!_cpp_create_definition (pfile, h)) + if (!_cpp_create_definition (pfile, h, 0)) abort (); _cpp_pop_buffer (pfile); } |