On Tue, Feb 11, 2025 at 12:51 AM Andrew Pinski <[email protected]> wrote: > > 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.
Ping? > > 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 <[email protected]> > --- > 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 >
