On Thu, 2016-03-10 at 09:40 +0100, Bernd Schmidt wrote: > This is a case where bogus #line directives can confuse libcpp into > producing nonsensical line numbers, even leading to a crash later on > in LTO. > > The following patch moves the test earlier to a point where we can > more > easily recover from the error condition. I should note that I changed > the raw fprintf (stderr) to a cpp_error call, which is a slight > change > in behaviour (we don't even get to LTO anymore due to erroring out > earlier). > > Bootstrapped and tested on x86_64-linux (as always including Ada, > which > failed with an earlier version of the patch). Ok?
Thanks for looking at this. > --- libcpp/directives.c (revision 234025) > +++ libcpp/directives.c (working copy) > @@ -1046,6 +1046,19 @@ do_linemarker (cpp_reader *pfile) > > skip_rest_of_line (pfile); > > + if (reason == LC_LEAVE) > + { > + const line_map_ordinary *from; > + if (MAIN_FILE_P (map) > + || (new_file > + && (from = INCLUDED_FROM (pfile->line_table, map)) != NULL > + && filename_cmp (ORDINARY_MAP_FILE_NAME (from), new_file) != 0)) > + { > + cpp_error (pfile, CPP_DL_ERROR, > + "file \"%s\" left but not entered", new_file); ^^^^^^^^ Although it looks like you're preserving the existing behavior from when this was in linemap_add, shouldn't this be ORDINARY_MAP_FILE_NAME (from) rather than new_file? (i.e. shouldn't it report the name of the file being *left*, rather than the one being entered?) [...] > Index: gcc/testsuite/gcc.dg/pr69650.c > =================================================================== > --- gcc/testsuite/gcc.dg/pr69650.c (revision 0) > +++ gcc/testsuite/gcc.dg/pr69650.c (working copy) > @@ -0,0 +1,5 @@ > +/* { dg-do compile } */ > +/* { dg-options "-std=gnu99" } */ > + > +# 9 "" 2 /* { dg-error "left but not entered" } */ > +not_a_type a; /* { dg-error "unknown type" } */ Can we also have a testcase with a non-empty filename? I'm interested in seeing what the exact error messages looks like. Also, is it possible to construct a testcase that triggers the logic in the non-MAIN_FILE_P clause? (perhaps with some # directives for a variety of "files")? Hope this is constructive Dave