After r7-1651-gac81cf0b2bf5efdd7, the location for the error for #include would be the location on the token. Except in traditional cpp, the location information for directives is all messed up because first libcpp processes the directive line in traditional and copies it to a new buffer and then does the lexing using the ISO lexer. This means the location information for the tokens are wrong and should just grab the location of the directive line instead. This patch does exactly that. Uses directive line location for traditional cpp when parsing the include.
Bootstrapped and tested on x86_64-linux-gnu. PR preprocessor/100904 libcpp/ChangeLog: * directives.cc (parse_include): Use the directive line location for the location in traditional cpp mode instead of the location of the token. gcc/testsuite/ChangeLog: * gcc.dg/cpp/missing-header-trad-1.c: New test. Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> --- gcc/testsuite/gcc.dg/cpp/missing-header-trad-1.c | 10 ++++++++++ libcpp/directives.cc | 9 ++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/cpp/missing-header-trad-1.c diff --git a/gcc/testsuite/gcc.dg/cpp/missing-header-trad-1.c b/gcc/testsuite/gcc.dg/cpp/missing-header-trad-1.c new file mode 100644 index 00000000000..d77cc5fe228 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/missing-header-trad-1.c @@ -0,0 +1,10 @@ +/* { dg-do preprocess } */ +/* { dg-options "-traditional-cpp" } */ + +/* PR preprocessor/100904 */ +/* Make sure we error out on the correct line + for traditional cpp. */ + +#include "nonexistent.h" /* { dg-error "-: nonexistent.h" } */ + +/* { dg-message "terminated" "terminated" { target *-*-* } 0 } */ diff --git a/libcpp/directives.cc b/libcpp/directives.cc index 9c0f77ab017..d4a5ab1cbec 100644 --- a/libcpp/directives.cc +++ b/libcpp/directives.cc @@ -841,7 +841,14 @@ parse_include (cpp_reader *pfile, int *pangle_brackets, /* Allow macro expansion. */ header = get_token_no_padding (pfile); - *location = header->src_loc; + + /* The location for traditional is the directive line as the + token line information for the temporary buffer. */ + if (CPP_OPTION (pfile, traditional)) + *location = pfile->directive_line; + else + *location = header->src_loc; + if ((header->type == CPP_STRING && header->val.str.text[0] != 'R') || header->type == CPP_HEADER_NAME) { -- 2.43.0