Albert Chin wrote: > If I change: > #include "///usr/include.dtk/stdio.h" > to: > #include_next <stdio.h> > then it works as expected (./stdio.h, /usr/include.dtk/stdio.h, > /usr/include/stdio.h). > > If I #include_next "///usr/include.dtk/stdio.h", it does not.
Thanks for these tests. Furthermore the #include_next must be outside our double-inclusion guard, otherwise it breaks: Often we use the CPPFLAGS -Ilib -I./lib (or similar), and then the compiler has these files in his list: lib/stdio.h ./lib/stdio.h /usr/include.dtk/stdio.h /usr/include/stdio.h the second one will expand to empty (i.e. not include /usr/include.dtk/stdio.h) if the #include_next is inside the double-inclusion guard. I'm applying this. Not just for <stdio.h>, but for all header files for which there is a /usr/include.dtk/....h with an include_next directive. 2007-04-06 Bruno Haible <[EMAIL PROTECTED]> Fix problem with Compaq (ex-DEC) Desktop C compiler on Tru64. * lib/math_.h [__DECC]: Include the overridden include file through #include_next, outside the double-inclusion guard. * lib/stdio_.h [__DECC]: Likewise. * lib/stdlib_.h [__DECC]: Likewise. * lib/string_.h [__DECC]: Likewise. * lib/time_.h [__DECC]: Likewise. * lib/wchar_.h [__DECC]: Likewise. * lib/wctype_.h [__DECC]: Likewise. Reported by Albert Chin <[EMAIL PROTECTED]> in <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00088.html>. *** lib/math_.h 30 Mar 2007 00:13:24 -0000 1.8 --- lib/math_.h 6 Apr 2007 12:17:19 -0000 *************** *** 16,25 **** along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _GL_MATH_H #define _GL_MATH_H ! #include @ABSOLUTE_MATH_H@ /* The definition of GL_LINK_WARNING is copied here. */ --- 16,31 ---- along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + #ifdef __DECC + # include_next <math.h> + #endif + #ifndef _GL_MATH_H #define _GL_MATH_H ! #ifndef __DECC ! # include @ABSOLUTE_MATH_H@ ! #endif /* The definition of GL_LINK_WARNING is copied here. */ *** lib/stdio_.h 27 Mar 2007 20:18:17 -0000 1.14 --- lib/stdio_.h 6 Apr 2007 12:17:19 -0000 *************** *** 23,32 **** #else /* Normal invocation convention. */ #ifndef _GL_STDIO_H #define _GL_STDIO_H ! #include @ABSOLUTE_STDIO_H@ #include <stdarg.h> #include <stddef.h> --- 23,39 ---- #else /* Normal invocation convention. */ + + #ifdef __DECC + # include_next <stdio.h> + #endif + #ifndef _GL_STDIO_H #define _GL_STDIO_H ! #ifndef __DECC ! # include @ABSOLUTE_STDIO_H@ ! #endif #include <stdarg.h> #include <stddef.h> *** lib/stdlib_.h 17 Mar 2007 19:02:51 -0000 1.7 --- lib/stdlib_.h 6 Apr 2007 12:17:19 -0000 *************** *** 30,35 **** --- 30,40 ---- #else /* Normal invocation convention. */ + + #ifdef __DECC + # include_next <stdlib.h> + #endif + #ifndef _GL_STDLIB_H #define _GL_STDLIB_H *************** *** 40,46 **** # pragma GCC system_header #endif ! #include @ABSOLUTE_STDLIB_H@ /* The definition of GL_LINK_WARNING is copied here. */ --- 45,53 ---- # pragma GCC system_header #endif ! #ifndef __DECC ! # include @ABSOLUTE_STDLIB_H@ ! #endif /* The definition of GL_LINK_WARNING is copied here. */ *** lib/string_.h 21 Mar 2007 04:22:35 -0000 1.29 --- lib/string_.h 6 Apr 2007 12:17:19 -0000 *************** *** 16,21 **** --- 16,25 ---- along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + #ifdef __DECC + # include_next <string.h> + #endif + #ifndef _GL_STRING_H #define _GL_STRING_H *************** *** 25,31 **** # pragma GCC system_header #endif ! #include @ABSOLUTE_STRING_H@ /* The definition of GL_LINK_WARNING is copied here. */ --- 29,37 ---- # pragma GCC system_header #endif ! #ifndef __DECC ! # include @ABSOLUTE_STRING_H@ ! #endif /* The definition of GL_LINK_WARNING is copied here. */ *** lib/time_.h 1 Mar 2007 21:24:55 -0000 1.2 --- lib/time_.h 6 Apr 2007 12:17:19 -0000 *************** *** 22,107 **** #if defined __need_time_t || defined __need_clock_t || defined __need_timespec # include @ABSOLUTE_TIME_H@ ! #elif ! defined _GL_TIME_H ! # define _GL_TIME_H ! # include @ABSOLUTE_TIME_H@ ! # ifdef __cplusplus ! extern "C" { # endif /* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3). Or they define it with the wrong member names or define it in <sys/time.h> (e.g., FreeBSD circa 1997). */ ! # if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@ ! # if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ ! # include <sys/time.h> ! # else ! # undef timespec ! # define timespec rpl_timespec struct timespec { time_t tv_sec; long int tv_nsec; }; # endif - # endif /* Sleep for at least RQTP seconds unless interrupted, If interrupted, return -1 and store the remaining time into RMTP. See <http://www.opengroup.org/susv3xsh/nanosleep.html>. */ ! # if @REPLACE_NANOSLEEP@ ! # define nanosleep rpl_nanosleep int nanosleep (struct timespec const *__rqtp, struct timespec *__rmtp); ! # endif /* Convert TIMER to RESULT, assuming local time and UTC respectively. See <http://www.opengroup.org/susv3xsh/localtime_r.html> and <http://www.opengroup.org/susv3xsh/gmtime_r.html>. */ ! # if @REPLACE_LOCALTIME_R@ ! # undef localtime_r ! # define localtime_r rpl_localtime_r ! # undef gmtime_r ! # define gmtime_r rpl_gmtime_r struct tm *localtime_r (time_t const *restrict __timer, struct tm *restrict __result); struct tm *gmtime_r (time_t const *restrict __timer, struct tm *restrict __result); ! # endif /* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store the resulting broken-down time into TM. See <http://www.opengroup.org/susv3xsh/strptime.html>. */ ! # if @REPLACE_STRPTIME@ ! # undef strptime ! # define strptime rpl_strptime char *strptime (char const *restrict __buf, char const *restrict __format, struct tm *restrict __tm); ! # endif /* Convert TM to a time_t value, assuming UTC. */ ! # if @REPLACE_TIMEGM@ ! # undef timegm ! # define timegm rpl_timegm time_t timegm (struct tm *__tm); ! #endif /* Encourage applications to avoid unsafe functions that can overrun buffers when given outlandish struct tm values. Portable applications should use strftime (or even sprintf) instead. */ ! # if GNULIB_PORTCHECK ! # undef asctime ! # define asctime eschew_asctime ! # undef asctime_r ! # define asctime_r eschew_asctime_r ! # undef ctime ! # define ctime eschew_ctime ! # undef ctime_r ! # define ctime_r eschew_ctime_r ! # endif ! # ifdef __cplusplus } ! # endif #endif --- 22,118 ---- #if defined __need_time_t || defined __need_clock_t || defined __need_timespec # include @ABSOLUTE_TIME_H@ ! #else ! /* Normal invocation convention. */ ! # ifdef __DECC ! # include_next <time.h> # endif + # if ! defined _GL_TIME_H + # define _GL_TIME_H + + # ifndef __DECC + # include @ABSOLUTE_TIME_H@ + # endif + + # ifdef __cplusplus + extern "C" { + # endif + /* Some systems don't define struct timespec (e.g., AIX 4.1, Ultrix 4.3). Or they define it with the wrong member names or define it in <sys/time.h> (e.g., FreeBSD circa 1997). */ ! # if ! @TIME_H_DEFINES_STRUCT_TIMESPEC@ ! # if @SYS_TIME_H_DEFINES_STRUCT_TIMESPEC@ ! # include <sys/time.h> ! # else ! # undef timespec ! # define timespec rpl_timespec struct timespec { time_t tv_sec; long int tv_nsec; }; + # endif # endif /* Sleep for at least RQTP seconds unless interrupted, If interrupted, return -1 and store the remaining time into RMTP. See <http://www.opengroup.org/susv3xsh/nanosleep.html>. */ ! # if @REPLACE_NANOSLEEP@ ! # define nanosleep rpl_nanosleep int nanosleep (struct timespec const *__rqtp, struct timespec *__rmtp); ! # endif /* Convert TIMER to RESULT, assuming local time and UTC respectively. See <http://www.opengroup.org/susv3xsh/localtime_r.html> and <http://www.opengroup.org/susv3xsh/gmtime_r.html>. */ ! # if @REPLACE_LOCALTIME_R@ ! # undef localtime_r ! # define localtime_r rpl_localtime_r ! # undef gmtime_r ! # define gmtime_r rpl_gmtime_r struct tm *localtime_r (time_t const *restrict __timer, struct tm *restrict __result); struct tm *gmtime_r (time_t const *restrict __timer, struct tm *restrict __result); ! # endif /* Parse BUF as a time stamp, assuming FORMAT specifies its layout, and store the resulting broken-down time into TM. See <http://www.opengroup.org/susv3xsh/strptime.html>. */ ! # if @REPLACE_STRPTIME@ ! # undef strptime ! # define strptime rpl_strptime char *strptime (char const *restrict __buf, char const *restrict __format, struct tm *restrict __tm); ! # endif /* Convert TM to a time_t value, assuming UTC. */ ! # if @REPLACE_TIMEGM@ ! # undef timegm ! # define timegm rpl_timegm time_t timegm (struct tm *__tm); ! # endif /* Encourage applications to avoid unsafe functions that can overrun buffers when given outlandish struct tm values. Portable applications should use strftime (or even sprintf) instead. */ ! # if GNULIB_PORTCHECK ! # undef asctime ! # define asctime eschew_asctime ! # undef asctime_r ! # define asctime_r eschew_asctime_r ! # undef ctime ! # define ctime eschew_ctime ! # undef ctime_r ! # define ctime_r eschew_ctime_r ! # endif ! # ifdef __cplusplus } ! # endif + # endif #endif *** lib/wchar_.h 13 Jan 2007 05:23:37 -0000 1.1 --- lib/wchar_.h 6 Apr 2007 12:17:19 -0000 *************** *** 25,30 **** --- 25,35 ---- * For now, this just ensures proper prerequisite inclusion order. */ + #ifdef __DECC + # include <stdio.h> + # include_next <wchar.h> + #endif + #ifndef _GL_WCHAR_H #define _GL_WCHAR_H *************** *** 37,42 **** #include <time.h> /* Include the original <wchar.h>. */ ! #include @ABSOLUTE_WCHAR_H@ #endif /* _GL_WCHAR_H */ --- 42,49 ---- #include <time.h> /* Include the original <wchar.h>. */ ! #ifndef __DECC ! # include @ABSOLUTE_WCHAR_H@ ! #endif #endif /* _GL_WCHAR_H */ *** lib/wctype_.h 10 Jan 2007 22:25:04 -0000 1.8 --- lib/wctype_.h 6 Apr 2007 12:17:19 -0000 *************** *** 26,34 **** * wctrans_t, and wctype_t are not yet implemented. */ - #ifndef _GL_WCTYPE_H - #define _GL_WCTYPE_H - #if @HAVE_WINT_T@ /* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before --- 26,31 ---- *************** *** 39,53 **** # include <stdio.h> # include <time.h> # include <wchar.h> - typedef wint_t __wctype_wint_t; - #else - typedef int __wctype_wint_t; #endif /* Include the original <wctype.h> if it exists. BeOS 5 has the functions but no <wctype.h>. */ #if @HAVE_WCTYPE_H@ ! # include @ABSOLUTE_WCTYPE_H@ #endif /* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions. --- 36,64 ---- # include <stdio.h> # include <time.h> # include <wchar.h> #endif + #if @HAVE_WCTYPE_H@ + # ifdef __DECC + # include_next <wctype.h> + # endif + #endif + + #ifndef _GL_WCTYPE_H + #define _GL_WCTYPE_H + /* Include the original <wctype.h> if it exists. BeOS 5 has the functions but no <wctype.h>. */ #if @HAVE_WCTYPE_H@ ! # ifndef __DECC ! # include @ABSOLUTE_WCTYPE_H@ ! # endif ! #endif ! ! #if @HAVE_WINT_T@ ! typedef wint_t __wctype_wint_t; ! #else ! typedef int __wctype_wint_t; #endif /* FreeBSD 4.4 to 4.11 has <wctype.h> but lacks the functions.