While working on PR 55399 (pch broken on mips-mti-linux-gnu) I traced through the execution of test gcc.dg/pch/common-1.c and in comparing r192714 and r192715 I found that in the earlier version the compiler gets to pch_open_file (with common-1.h) and does this check:
if (pfile->all_files && pfile->all_files->next_file) { it finds that pfile->all_files->next_file is NULL and continues on in the routine. In the new version there is: if (pfile->all_files && pfile->all_files->next_file && !pfile->all_files->next_file->implicit_preinclude) { and here it finds that pfile->all_files->next_file is true but pfile->all_files->next_file->implicit_preinclude is false so it exits the routine and this is why the code compiler doesn't find the preprocessed header file. Looking at pfile I see that pfile->all_files is pointing at stdc-predef.h where implicit_preinclude is true but pfile->all_files->next_file is pointing at common-1.c where implicit_preinclude is false. My best guess as to why this is happening for me and not other people is that the order of common-1.c and stdc-predef.h in this linked list is dependent on how things are put into pfile->file_hash and for some reason stdc-predef.h shows up before common-1.c for me but not for other people, where they get common-1.c and then stdc-predef.h. This patch checks for implicit_preinclude on both pfile->all_files and pfile->all_files->next_file and it fixes the problem for me. I tested it on mips-mti-linux-gnu and had no regressions. OK to checkin? Steve Ellcey sell...@mips.com 2012-11-21 Steve Ellcey <sell...@mips.com> PR pch/55399 * files.c (pch_open_file): Fix check for implicit_preinclude. diff --git a/libcpp/files.c b/libcpp/files.c index a8288dc..9f84d8c 100644 --- a/libcpp/files.c +++ b/libcpp/files.c @@ -295,7 +295,8 @@ pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch) file or the command-line it is not a valid use of PCH. */ if (pfile->all_files && pfile->all_files->next_file - && !pfile->all_files->next_file->implicit_preinclude) + && !(pfile->all_files->implicit_preinclude + || pfile->all_files->next_file->implicit_preinclude)) return false; flen = strlen (path);