https://gcc.gnu.org/g:e1c8dac7ca8dde4d99776685dee43e05cd3ea6d2
commit r17-3819-ge1c8dac7ca8dde4d99776685dee43e05cd3ea6d2 Author: Alexey Klimkin <[email protected]> Date: Tue Aug 25 20:36:48 2026 -0700 libcpp: Use -1 for closed header-unit fd [PR c++/127097] _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 therefore skips reopening the source and reads stdin. Descriptor zero is also a valid result from open when stdin was previously closed. Close every valid descriptor and restore -1. Add a module regression that imports a header unit and includes the same file through an alternate spelling. Assisted-by: Claude Opus 5 (Anthropic) 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. Signed-off-by: Alexey Klimkin <[email protected]> Diff: --- gcc/testsuite/g++.dg/modules/pragma-once-hu-1_b.C | 12 ++++++++++++ libcpp/files.cc | 4 ++-- gcc/testsuite/g++.dg/modules/pragma-once-hu-1_a.H | 12 ++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/gcc/testsuite/g++.dg/modules/pragma-once-hu-1_b.C b/gcc/testsuite/g++.dg/modules/pragma-once-hu-1_b.C new file mode 100644 index 000000000000..b2871d9030a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pragma-once-hu-1_b.C @@ -0,0 +1,12 @@ +// PR c++/127097 +// { dg-additional-options "-fmodules" } + +import "pragma-once-hu-1_a.H"; +// Reuse the tracked sys directory for an alternate spelling without symlinks. +#include "sys/../pragma-once-hu-1_a.H" + +int +main () +{ + return pragma_once_hu_f () != 1; +} diff --git a/libcpp/files.cc b/libcpp/files.cc index 917b7799be97..b0ecb00de24c 100644 --- a/libcpp/files.cc +++ b/libcpp/files.cc @@ -1227,11 +1227,11 @@ _cpp_find_header_unit (cpp_reader *pfile, const char *name, bool angle, { if (_cpp_file *file = test_header_unit (pfile, name, angle, loc)) { - if (file->fd > 0) + if (file->fd != -1) { /* Don't leave it open. */ close (file->fd); - file->fd = 0; + file->fd = -1; } file->header_unit = +1; diff --git a/gcc/testsuite/g++.dg/modules/pragma-once-hu-1_a.H b/gcc/testsuite/g++.dg/modules/pragma-once-hu-1_a.H new file mode 100644 index 000000000000..549f677a7753 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pragma-once-hu-1_a.H @@ -0,0 +1,12 @@ +// PR c++/127097 +// { dg-module-do run } +// { dg-additional-options "-fmodule-header" } +// { dg-module-cmi {} } + +#pragma once + +inline int +pragma_once_hu_f () +{ + return 1; +}
