On 8/31/26 12:45 PM, Klimkin, Alexey wrote:
_cpp_find_header_unit closes the source descriptor after resolving a

header unit, but records zero instead of the established -1 sentinel.

A later textual include through an alternate pathname consequently

skips reopening the source and reads stdin.  This gives a misleading

"file is shorter than expected" warning followed by redefinition

errors.  The existing fd > 0 check also misses a real header descriptor

when open returns zero because stdin was closed.

Close every valid descriptor and restore -1 after closing it.

The regression imports a header unit and then includes the same

physical file through a sys/../ spelling.  It fails on unpatched trunk

and compiles, links, and runs after the fix.

Bootstrapped and regression-tested on x86_64-pc-linux-gnu, configured with

--disable-multilib --enable-languages=c,c++,fortran,objc,obj-c++,lto.

Compared against an unpatched build of the same parent commit: identical

FAIL/XPASS sets, and 15 new PASSes from the added test.

Per https://gcc.gnu.org/ai-policy.html: this change was LLM-assisted.

I have reviewed and understand the change and can

answer questions about it.

libcpp/

         PR c++/127097

         * files.cc (_cpp_find_header_unit): Close descriptor zero and set

         the closed descriptor sentinel to -1.

gcc/testsuite/

         PR c++/127097

         * g++.dg/modules/pragma-once-hu-1_a.H: New test.

         * g++.dg/modules/pragma-once-hu-1_b.C: New test.
Pushed, thanks!

Jason

Reply via email to