https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115312
Lewis Hyatt <lhyatt at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever confirmed|0 |1 Last reconfirmed| |2024-06-17 Summary|[14/15 Regression] ICE when |[14/15 Regression] ICE when |including a PCH via |including a PCH via |compiler option -include |compiler option -include | |since r14-5836 --- Comment #7 from Lewis Hyatt <lhyatt at gcc dot gnu.org> --- OK I see now. For the case of a PCH combined with -include it is a regression in GCC 14 caused by r14-5836. I think any platform that does not make use of the stdc-predef.h preinclude will be affected (including MinGW). The assert added in r14-5836 should not be failing, but it is failing due to an oversight in r14-2893. This was a new feature for GCC 14 that made #pragma work during preprocessing, which required the creation of a parser object in preprocess-only mode. I will test this patch that should fix it: ===== diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc index faaf9ee6350..a09a0518c52 100644 --- a/gcc/c-family/c-opts.cc +++ b/gcc/c-family/c-opts.cc @@ -1296,8 +1296,8 @@ c_common_init (void) if (flag_preprocess_only) { - c_finish_options (); c_init_preprocess (); + c_finish_options (); preprocess_file (parse_in); return false; } ===== The problem is that c_finish_options() will also include the first command-line- specified include file. On glibc platforms, this is always the stdc-predef.h preinclude and then things work. In the absence of a preinclude, it will include the first file requested with -include. If that file triggers a PCH load, then we hit the code path introduced in r14-5836; after the PCH is loaded, we reinitialize the parser. But in this case we have not called c_init_preprocess() yet, so when we do call it afterward, the parser already exists and so the assert fails. The above patch should make things right, I am testing it now and it should get into GCC 14.2. You could add it to the list of MinGW-specific patches for WinLibs and MSYS2 in the meantime too. It's preferable to commenting out the assert, although that workaround probably does work fine at the moment as well.