From f368d9fd26ae002fe2fce20add4cb2b806f48972 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Tue, 12 Mar 2019 15:24:00 -0400 Subject: [PATCH] make FILE a complete type for pre-C11 standard profiles C11 removed the requirement that FILE be a complete type, which was deemed erroneous, as part of the changes introduced by N1439 regarding completeness of types (see footnote 6 for specific mention of FILE). however the current version of POSIX is still based on C99 and incorporates the old requirement that FILE be a complete type. expose an arbitrary, useless complete type definition because the actual object used to represent FILE streams cannot be public/ABI. thanks to commit 13d1afa46f8098df290008c681816c9eb89ffbdb, we now have a framework for suppressing the public complete-type definition of FILE when stdio.h is included internally, so that a different internal definition can be provided. this is perfectly well-defined, since the same struct tag can refer to different types in different translation units. it would be a problem if the implementation were accessing the application's FILE objects or vice versa, but either would be undefined behavior. --- include/alltypes.h.in | 1 + include/stdio.h | 4 ++++ include/wchar.h | 4 ++++ src/include/stdio.h | 2 ++ src/include/wchar.h | 9 +++++++++ 5 files changed, 20 insertions(+) create mode 100644 src/include/wchar.h diff --git a/include/alltypes.h.in b/include/alltypes.h.in index 622ca01d..4cc879b1 100644 --- a/include/alltypes.h.in +++ b/include/alltypes.h.in @@ -57,6 +57,7 @@ TYPEDEF struct { unsigned __attr; } pthread_condattr_t; TYPEDEF struct { unsigned __attr; } pthread_barrierattr_t; TYPEDEF struct { unsigned __attr[2]; } pthread_rwlockattr_t; +STRUCT _IO_FILE { char __x; }; TYPEDEF struct _IO_FILE FILE; TYPEDEF struct __mbstate_t { unsigned __opaque1, __opaque2; } mbstate_t; diff --git a/include/stdio.h b/include/stdio.h index afadd912..3604198c 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -11,6 +11,10 @@ extern "C" { #define __NEED___isoc_va_list #define __NEED_size_t +#if __STDC_VERSION__ < 201112L +#define __NEED_struct__IO_FILE +#endif + #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \ || defined(_BSD_SOURCE) diff --git a/include/wchar.h b/include/wchar.h index 369b1e9f..88eb55b1 100644 --- a/include/wchar.h +++ b/include/wchar.h @@ -14,6 +14,10 @@ extern "C" { #define __NEED_wint_t #define __NEED_mbstate_t +#if __STDC_VERSION__ < 201112L +#define __NEED_struct__IO_FILE +#endif + #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) #define __NEED_locale_t diff --git a/src/include/stdio.h b/src/include/stdio.h index 534c6907..fae3755b 100644 --- a/src/include/stdio.h +++ b/src/include/stdio.h @@ -1,6 +1,8 @@ #ifndef STDIO_H #define STDIO_H +#define __DEFINED_struct__IO_FILE + #include "../../include/stdio.h" #undef stdin diff --git a/src/include/wchar.h b/src/include/wchar.h new file mode 100644 index 00000000..79f5d0e7 --- /dev/null +++ b/src/include/wchar.h @@ -0,0 +1,9 @@ +#ifndef WCHAR_H +#define WCHAR_H + +#define __DEFINED_struct__IO_FILE + +#include "../../include/wchar.h" + +#endif + -- 2.25.1