Skip to content
Snippets Groups Projects
  • Lewis Hyatt's avatar
    65c5bbe1
    diagnostics: libcpp: Improve locations for _Pragma lexing diagnostics [PR114423] · 65c5bbe1
    Lewis Hyatt authored
    libcpp is not currently set up to be able to generate valid
    locations for tokens lexed from a _Pragma string. Instead, after obtaining
    the tokens, it sets their locations all to the location of the _Pragma
    operator itself. This makes things like _Pragma("GCC diagnostic") work well
    enough, but if any diagnostics are issued during lexing, prior to resetting
    the token locations, those diagnostics get issued at the invalid
    locations. Fix that up by adding a new field pfile->diagnostic_override_loc
    that instructs libcpp to issue diagnostics at the alternate location.
    
    libcpp/ChangeLog:
    
    	PR preprocessor/114423
    	* internal.h (struct cpp_reader): Add DIAGNOSTIC_OVERRIDE_LOC
    	field.
    	* directives.cc (destringize_and_run): Set the new field to the
    	location of the _Pragma operator.
    	* errors.cc (cpp_diagnostic_at): Support DIAGNOSTIC_OVERRIDE_LOC to
    	temporarily issue diagnostics at a different location.
    	(cpp_diagnostic_with_line): Likewise.
    
    gcc/testsuite/ChangeLog:
    
    	PR preprocessor/114423
    	* c-c++-common/cpp/pragma-diagnostic-loc.c: New test.
    	* c-c++-common/cpp/diagnostic-pragma-1.c: Adjust expected output.
    	* g++.dg/pch/operator-1.C: Likewise.
    65c5bbe1
    History
    diagnostics: libcpp: Improve locations for _Pragma lexing diagnostics [PR114423]
    Lewis Hyatt authored
    libcpp is not currently set up to be able to generate valid
    locations for tokens lexed from a _Pragma string. Instead, after obtaining
    the tokens, it sets their locations all to the location of the _Pragma
    operator itself. This makes things like _Pragma("GCC diagnostic") work well
    enough, but if any diagnostics are issued during lexing, prior to resetting
    the token locations, those diagnostics get issued at the invalid
    locations. Fix that up by adding a new field pfile->diagnostic_override_loc
    that instructs libcpp to issue diagnostics at the alternate location.
    
    libcpp/ChangeLog:
    
    	PR preprocessor/114423
    	* internal.h (struct cpp_reader): Add DIAGNOSTIC_OVERRIDE_LOC
    	field.
    	* directives.cc (destringize_and_run): Set the new field to the
    	location of the _Pragma operator.
    	* errors.cc (cpp_diagnostic_at): Support DIAGNOSTIC_OVERRIDE_LOC to
    	temporarily issue diagnostics at a different location.
    	(cpp_diagnostic_with_line): Likewise.
    
    gcc/testsuite/ChangeLog:
    
    	PR preprocessor/114423
    	* c-c++-common/cpp/pragma-diagnostic-loc.c: New test.
    	* c-c++-common/cpp/diagnostic-pragma-1.c: Adjust expected output.
    	* g++.dg/pch/operator-1.C: Likewise.