Commit 411d4e28 by Craig Burley Committed by Craig Burley

Warn about invoking non-Y2K-compliant intrinsics

From-SVN: r25609
parent 40ae436b
Sat Mar 6 02:28:35 1999 Craig Burley <craig@jcb-sc.com>
Warn about non-Y2K-compliant intrinsics:
* bad.def (FFEBAD_INTRINSIC_Y2KBAD): New diagnostic.
* intrin.def (FFEINTRIN_impDATE, FFEINTRIN_impIDATE_vxt):
Use new DEFIMPY macro to flag these as non-Y2K-compliant.
* intdoc.c (DEFIMPY): Support new Y2K macro.
* intrin.h (DEFIMPY): Ditto.
* intrin.c (DEFIMPY): Ditto.
(ffeintrin_fulfill_generic, ffeintrin_fulfill_specific):
Warn about invocation of non-Y2K-compliant intrinsic.
* com-rt.def (FFECOM_gfrtDATE, FFECOM_gfrtVXTIDATE):
Rename external procedure names, to keep previously-
compiled (sans-new-warnings) code from linking to
new library.
* g77.texi: Document all this stuff.
* news.texi: Spread the joy.
* version.c: Bump version.
Fri Mar 5 13:22:44 1999 Craig Burley <craig@jcb-sc.com> Fri Mar 5 13:22:44 1999 Craig Burley <craig@jcb-sc.com>
* news.texi: Relocate IDATE (VXT) fix: we put it in 1.1.2 * news.texi: Relocate IDATE (VXT) fix: we put it in 1.1.2
......
...@@ -700,6 +700,8 @@ FFEBAD_MSGS1 (FFEBAD_ARRAY_LARGE, FATAL, ...@@ -700,6 +700,8 @@ FFEBAD_MSGS1 (FFEBAD_ARRAY_LARGE, FATAL,
"Array `%A' at %0 is too large to handle") "Array `%A' at %0 is too large to handle")
FFEBAD_MSGS1 (FFEBAD_SFUNC_UNUSED, WARN, FFEBAD_MSGS1 (FFEBAD_SFUNC_UNUSED, WARN,
"Statement function `%A' defined at %0 is not used") "Statement function `%A' defined at %0 is not used")
FFEBAD_MSGS1 (FFEBAD_INTRINSIC_Y2KBAD, WARN,
"Intrinsic `%A', invoked at %0, known to be non-Y2K-compliant [info -f g77 M Y2KBAD]")
#undef INFORM #undef INFORM
#undef TRIVIAL #undef TRIVIAL
......
...@@ -142,7 +142,7 @@ DEFGFRT (FFECOM_gfrtDACOS, "d_acos", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) ...@@ -142,7 +142,7 @@ DEFGFRT (FFECOM_gfrtDACOS, "d_acos", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtDASIN, "d_asin", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) DEFGFRT (FFECOM_gfrtDASIN, "d_asin", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtDATAN, "d_atan", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) DEFGFRT (FFECOM_gfrtDATAN, "d_atan", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtDATAN2, "d_atn2", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE) DEFGFRT (FFECOM_gfrtDATAN2, "d_atn2", FFECOM_rttypeDOUBLE_, "&d", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtDATE, "G77_date_0", FFECOM_rttypeVOID_, "&a", FALSE, FALSE) DEFGFRT (FFECOM_gfrtDATE, "G77_date_y2kbug_0", FFECOM_rttypeVOID_, "&a", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtDATE_AND_TIME, "G77_date_and_time_0", FFECOM_rttypeVOID_, "&a&a&a&i", FALSE, FALSE) DEFGFRT (FFECOM_gfrtDATE_AND_TIME, "G77_date_and_time_0", FFECOM_rttypeVOID_, "&a&a&a&i", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtL_BESJ0, "j0", FFECOM_rttypeDOUBLE_, "d", FALSE, FALSE) DEFGFRT (FFECOM_gfrtL_BESJ0, "j0", FFECOM_rttypeDOUBLE_, "d", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtL_BESJ1, "j1", FFECOM_rttypeDOUBLE_, "d", FALSE, FALSE) DEFGFRT (FFECOM_gfrtL_BESJ1, "j1", FFECOM_rttypeDOUBLE_, "d", FALSE, FALSE)
...@@ -242,7 +242,7 @@ DEFGFRT (FFECOM_gfrtTIME, "G77_time_0", FFECOM_rttypeLONGINT_, 0, FALSE, FALSE) ...@@ -242,7 +242,7 @@ DEFGFRT (FFECOM_gfrtTIME, "G77_time_0", FFECOM_rttypeLONGINT_, 0, FALSE, FALSE)
DEFGFRT (FFECOM_gfrtTTYNAM, "G77_ttynam_0", FFECOM_rttypeCHARACTER_, "&i", FALSE, FALSE) DEFGFRT (FFECOM_gfrtTTYNAM, "G77_ttynam_0", FFECOM_rttypeCHARACTER_, "&i", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtUNLINK, "G77_unlink_0", FFECOM_rttypeINTEGER_, "&a", FALSE, FALSE) DEFGFRT (FFECOM_gfrtUNLINK, "G77_unlink_0", FFECOM_rttypeINTEGER_, "&a", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtUMASK, "G77_umask_0", FFECOM_rttypeINTEGER_, "&i", FALSE, FALSE) DEFGFRT (FFECOM_gfrtUMASK, "G77_umask_0", FFECOM_rttypeINTEGER_, "&i", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtVXTIDATE, "G77_vxtidate_0", FFECOM_rttypeVOID_, "&i&i&i", FALSE, FALSE) DEFGFRT (FFECOM_gfrtVXTIDATE, "G77_vxtidate_y2kbug_0", FFECOM_rttypeVOID_, "&i&i&i", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtVXTTIME, "G77_vxttime_0", FFECOM_rttypeVOID_, "&a", FALSE, FALSE) DEFGFRT (FFECOM_gfrtVXTTIME, "G77_vxttime_0", FFECOM_rttypeVOID_, "&a", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtCDABS, "z_abs", FFECOM_rttypeDOUBLE_, "&e", FALSE, FALSE) DEFGFRT (FFECOM_gfrtCDABS, "z_abs", FFECOM_rttypeDOUBLE_, "&e", FALSE, FALSE)
DEFGFRT (FFECOM_gfrtCDCOS, "z_cos", FFECOM_rttypeDBLCMPLX_F2C_, "&e", FALSE, TRUE) DEFGFRT (FFECOM_gfrtCDCOS, "z_cos", FFECOM_rttypeDBLCMPLX_F2C_, "&e", FALSE, TRUE)
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
@c %**start of header @c %**start of header
@setfilename g77.info @setfilename g77.info
@set last-up-date 1999-03-03 @set last-up-date 1999-03-06
@set version-g77 0.5.24 @set version-g77 0.5.24
@set email-general egcs@@egcs.cygnus.com @set email-general egcs@@egcs.cygnus.com
@set email-bugs egcs-bugs@@egcs.cygnus.com @set email-bugs egcs-bugs@@egcs.cygnus.com
...@@ -8145,6 +8145,119 @@ on at least some systems: ...@@ -8145,6 +8145,119 @@ on at least some systems:
@ref{Date Intrinsic}, @ref{Date Intrinsic},
@ref{IDate Intrinsic (VXT)}. @ref{IDate Intrinsic (VXT)}.
@cindex y2kbuggy
@cindex date_y2kbuggy_0
@cindex vxtidate_y2kbuggy_0
@cindex G77_date_y2kbuggy_0
@cindex G77_vxtidate_y2kbuggy_0
The @code{libg2c} library
shipped with any @code{g77} that warns
about invocation of a non-Y2K-compliant intrinsic
has renamed the @samp{EXTERNAL} procedure names
of those intrinsics.
This is done so that
the @code{libg2c} implementations of these intrinsics
cannot be directly linked to
as @samp{EXTERNAL} names
(which normally would avoid the non-Y2K-intrinsic warning).
The renamed forms of the @samp{EXTERNAL} names
of these renamed procedures
may be linked to
by appending the string @samp{_y2kbug}
to the name of the procedure
in the source code.
For example:
@smallexample
CHARACTER*20 STR
INTEGER YY, MM, DD
EXTERNAL DATE_Y2KBUG, VXTIDATE_Y2KBUG
CALL DATE_Y2KBUG (STR)
CALL VXTIDATE_Y2KBUG (MM, DD, YY)
@end smallexample
(Note that the @samp{EXTERNAL} statement
is not actually required,
since the modified names are not recognized as intrinsics
by the current version of @code{g77}.
But it is shown in this specific case,
for purposes of illustration.)
The renaming of @samp{EXTERNAL} procedure names of these intrinsics
causes unresolved references at link time.
For example, @samp{EXTERNAL DATE; CALL DATE(STR)}
is normally compiled by @code{g77}
as, in C, @samp{date_(&str, 20);}.
This, in turn, links to the @samp{date_} procedure
in the @samp{libE77} portion of @code{libg2c},
which purposely calls a nonexistent procedure
named @samp{G77_date_y2kbuggy_0}.
The resulting link-time error is designed, via this name,
to encourage the programmer to look up the
index entries to this portion of the @code{g77} documentation.
Generally, we recommend that the @samp{EXTERNAL} method
of invoking procedures in @code{libg2c}
@emph{not} be used.
When used, some of the correctness checking
normally performed by @code{g77}
is skipped.
In particular, it is probably better to use the
@samp{INTRINSIC} method of invoking
non-Y2K-compliant procedures,
so anyone compiling the code
can quickly notice the potential Y2K problems
(via the warnings printing by @code{g77})
without having to even look at the code itself.
If there are problems linking @code{libg2c}
to code compiled by @code{g77}
that involve the string @samp{y2kbug},
and these are not explained above,
that probably indicates
that a version of @code{libg2c}
older than @code{g77}
is being linked to,
or that the new library is being linked
to code compiled by an older version of @code{g77}.
That's because, as of the version that warns about
non-Y2K-compliant intrinsic invocation,
@code{g77} references the @code{libg2c} implementations
of those intrinsics
using new names, containing the string @samp{y2kbug}.
So, linking newly-compiled code
(invoking one of the intrinsics in question)
to an old library
might yield an unresolved reference
to @samp{G77_date_y2kbug_0}.
(The old library calls it @samp{G77_date_0}.)
Similarly, linking previously-compiled code
to a new library
might yield an unresolved reference
to @samp{G77_vxtidate_0}.
(The new library calls it @samp{G77_vxtidate_y2kbug_0}.)
The proper fix for the above problems
is to obtain the latest release of @code{g77}
and related products
(including @code{libg2c})
and install them on all systems,
then recompile, relink, and install
(as appropriate)
all existing Fortran programs.
(Normally, this sort of renaming is steadfastly avoided.
In this case, however, it seems more important to highlight
potential Y2K problems
than to ease the transition
of potentially non-Y2K-compliant code
to new versions of @code{g77} and @code{libg2c}.)
@node Array Size @node Array Size
@subsection Array Size @subsection Array Size
@cindex limits, array size @cindex limits, array size
...@@ -14756,6 +14869,7 @@ as the above is just a sample, no such section exists. ...@@ -14756,6 +14869,7 @@ as the above is just a sample, no such section exists.
* LEX:: Various lexer messages * LEX:: Various lexer messages
* GLOBALS:: Disagreements about globals. * GLOBALS:: Disagreements about globals.
* LINKFAIL:: When linking @samp{f771} fails. * LINKFAIL:: When linking @samp{f771} fails.
* Y2KBAD:: Use of non-Y2K-compliant intrinsic.
@end menu @end menu
@node CMPAMBIG @node CMPAMBIG
...@@ -15327,6 +15441,24 @@ might solve this problem, e.g.@: by adding ...@@ -15327,6 +15441,24 @@ might solve this problem, e.g.@: by adding
BOOT_CFLAGS='-mminimal-toc -O2 -g' BOOT_CFLAGS='-mminimal-toc -O2 -g'
@end smallexample @end smallexample
to the @code{make bootstrap} command line. to the @code{make bootstrap} command line.
@node Y2KBAD
@section @code{Y2KBAD}
@cindex Y2K compliance
@cindex Year 2000 compliance
@noindent
@smallexample
Intrinsic `@var{name}', invoked at (^), known to be non-Y2K-compliant@dots{}
@end smallexample
This diagnostic indicates that
the specific intrinsic invoked by the name @var{name}
is known to have an interface
that is not Year-2000 (Y2K) compliant.
@xref{Year 2000 (Y2K) Problems}.
@end ifset @end ifset
@node Index @node Index
......
...@@ -124,11 +124,13 @@ static struct _ffeintrin_name_ names[] = { ...@@ -124,11 +124,13 @@ static struct _ffeintrin_name_ names[] = {
#define DEFGEN(CODE,NAME,SPEC1,SPEC2) #define DEFGEN(CODE,NAME,SPEC1,SPEC2)
#define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP)
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL)
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD)
#include "intrin.def" #include "intrin.def"
#undef DEFNAME #undef DEFNAME
#undef DEFGEN #undef DEFGEN
#undef DEFSPEC #undef DEFSPEC
#undef DEFIMP #undef DEFIMP
#undef DEFIMPY
}; };
static struct _ffeintrin_gen_ gens[] = { static struct _ffeintrin_gen_ gens[] = {
...@@ -137,11 +139,13 @@ static struct _ffeintrin_gen_ gens[] = { ...@@ -137,11 +139,13 @@ static struct _ffeintrin_gen_ gens[] = {
{ NAME, { SPEC1, SPEC2, }, }, { NAME, { SPEC1, SPEC2, }, },
#define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP)
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL)
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD)
#include "intrin.def" #include "intrin.def"
#undef DEFNAME #undef DEFNAME
#undef DEFGEN #undef DEFGEN
#undef DEFSPEC #undef DEFSPEC
#undef DEFIMP #undef DEFIMP
#undef DEFIMPY
}; };
static struct _ffeintrin_imp_ imps[] = { static struct _ffeintrin_imp_ imps[] = {
...@@ -151,9 +155,13 @@ static struct _ffeintrin_imp_ imps[] = { ...@@ -151,9 +155,13 @@ static struct _ffeintrin_imp_ imps[] = {
#if 0 /* FFECOM_targetCURRENT == FFECOM_targetGCC */ #if 0 /* FFECOM_targetCURRENT == FFECOM_targetGCC */
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) \ #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) \
{ NAME, FFECOM_gfrt ## GFRT, CONTROL }, { NAME, FFECOM_gfrt ## GFRT, CONTROL },
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD) \
{ NAME, FFECOM_gfrt ## GFRT, CONTROL },
#elif 1 /* FFECOM_targetCURRENT == FFECOM_targetFFE */ #elif 1 /* FFECOM_targetCURRENT == FFECOM_targetFFE */
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) \ #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) \
{ NAME, CONTROL }, { NAME, CONTROL },
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD) \
{ NAME, CONTROL },
#else #else
#error #error
#endif #endif
...@@ -162,6 +170,7 @@ static struct _ffeintrin_imp_ imps[] = { ...@@ -162,6 +170,7 @@ static struct _ffeintrin_imp_ imps[] = {
#undef DEFGEN #undef DEFGEN
#undef DEFSPEC #undef DEFSPEC
#undef DEFIMP #undef DEFIMP
#undef DEFIMPY
}; };
static struct _ffeintrin_spec_ specs[] = { static struct _ffeintrin_spec_ specs[] = {
...@@ -170,10 +179,12 @@ static struct _ffeintrin_spec_ specs[] = { ...@@ -170,10 +179,12 @@ static struct _ffeintrin_spec_ specs[] = {
#define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) \ #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) \
{ NAME, CALLABLE, FAMILY, IMP, }, { NAME, CALLABLE, FAMILY, IMP, },
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL)
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD)
#include "intrin.def" #include "intrin.def"
#undef DEFGEN #undef DEFGEN
#undef DEFSPEC #undef DEFSPEC
#undef DEFIMP #undef DEFIMP
#undef DEFIMPY
}; };
struct cc_pair { ffeintrinImp imp; char *text; }; struct cc_pair { ffeintrinImp imp; char *text; };
......
...@@ -64,6 +64,7 @@ struct _ffeintrin_imp_ ...@@ -64,6 +64,7 @@ struct _ffeintrin_imp_
ffecomGfrt gfrt_gnu; /* library routine, gnu-callable form. */ ffecomGfrt gfrt_gnu; /* library routine, gnu-callable form. */
#endif /* FFECOM_targetCURRENT == FFECOM_targetGCC */ #endif /* FFECOM_targetCURRENT == FFECOM_targetGCC */
char *control; char *control;
char y2kbad;
}; };
static ffebad ffeintrin_check_ (ffeintrinImp imp, ffebldOp op, static ffebad ffeintrin_check_ (ffeintrinImp imp, ffebldOp op,
...@@ -84,11 +85,13 @@ static struct _ffeintrin_name_ ffeintrin_names_[] ...@@ -84,11 +85,13 @@ static struct _ffeintrin_name_ ffeintrin_names_[]
#define DEFGEN(CODE,NAME,SPEC1,SPEC2) #define DEFGEN(CODE,NAME,SPEC1,SPEC2)
#define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP)
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL)
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD)
#include "intrin.def" #include "intrin.def"
#undef DEFNAME #undef DEFNAME
#undef DEFGEN #undef DEFGEN
#undef DEFSPEC #undef DEFSPEC
#undef DEFIMP #undef DEFIMP
#undef DEFIMPY
}; };
static struct _ffeintrin_gen_ ffeintrin_gens_[] static struct _ffeintrin_gen_ ffeintrin_gens_[]
...@@ -99,11 +102,13 @@ static struct _ffeintrin_gen_ ffeintrin_gens_[] ...@@ -99,11 +102,13 @@ static struct _ffeintrin_gen_ ffeintrin_gens_[]
{ NAME, { SPEC1, SPEC2, }, }, { NAME, { SPEC1, SPEC2, }, },
#define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP)
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL)
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD)
#include "intrin.def" #include "intrin.def"
#undef DEFNAME #undef DEFNAME
#undef DEFGEN #undef DEFGEN
#undef DEFSPEC #undef DEFSPEC
#undef DEFIMP #undef DEFIMP
#undef DEFIMPY
}; };
static struct _ffeintrin_imp_ ffeintrin_imps_[] static struct _ffeintrin_imp_ ffeintrin_imps_[]
...@@ -115,10 +120,15 @@ static struct _ffeintrin_imp_ ffeintrin_imps_[] ...@@ -115,10 +120,15 @@ static struct _ffeintrin_imp_ ffeintrin_imps_[]
#if FFECOM_targetCURRENT == FFECOM_targetGCC #if FFECOM_targetCURRENT == FFECOM_targetGCC
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) \ #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) \
{ NAME, FFECOM_gfrt ## GFRTDIRECT, FFECOM_gfrt ## GFRTF2C, \ { NAME, FFECOM_gfrt ## GFRTDIRECT, FFECOM_gfrt ## GFRTF2C, \
FFECOM_gfrt ## GFRTGNU, CONTROL }, FFECOM_gfrt ## GFRTGNU, CONTROL, FALSE },
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD) \
{ NAME, FFECOM_gfrt ## GFRTDIRECT, FFECOM_gfrt ## GFRTF2C, \
FFECOM_gfrt ## GFRTGNU, CONTROL, Y2KBAD },
#elif FFECOM_targetCURRENT == FFECOM_targetFFE #elif FFECOM_targetCURRENT == FFECOM_targetFFE
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) \ #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) \
{ NAME, CONTROL }, { NAME, CONTROL, FALSE },
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD) \
{ NAME, CONTROL, Y2KBAD },
#else #else
#error #error
#endif #endif
...@@ -127,6 +137,7 @@ static struct _ffeintrin_imp_ ffeintrin_imps_[] ...@@ -127,6 +137,7 @@ static struct _ffeintrin_imp_ ffeintrin_imps_[]
#undef DEFGEN #undef DEFGEN
#undef DEFSPEC #undef DEFSPEC
#undef DEFIMP #undef DEFIMP
#undef DEFIMPY
}; };
static struct _ffeintrin_spec_ ffeintrin_specs_[] static struct _ffeintrin_spec_ ffeintrin_specs_[]
...@@ -137,10 +148,12 @@ static struct _ffeintrin_spec_ ffeintrin_specs_[] ...@@ -137,10 +148,12 @@ static struct _ffeintrin_spec_ ffeintrin_specs_[]
#define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) \ #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) \
{ NAME, CALLABLE, FAMILY, IMP, }, { NAME, CALLABLE, FAMILY, IMP, },
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL)
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD)
#include "intrin.def" #include "intrin.def"
#undef DEFGEN #undef DEFGEN
#undef DEFSPEC #undef DEFSPEC
#undef DEFIMP #undef DEFIMP
#undef DEFIMPY
}; };
...@@ -1374,6 +1387,14 @@ ffeintrin_fulfill_generic (ffebld *expr, ffeinfo *info, ffelexToken t) ...@@ -1374,6 +1387,14 @@ ffeintrin_fulfill_generic (ffebld *expr, ffeinfo *info, ffelexToken t)
ffebad_string (ffeintrin_gens_[gen].name); ffebad_string (ffeintrin_gens_[gen].name);
ffebad_finish (); ffebad_finish ();
} }
if (ffeintrin_imps_[imp].y2kbad)
{
ffebad_start (FFEBAD_INTRINSIC_Y2KBAD);
ffebad_here (0, ffelex_token_where_line (t),
ffelex_token_where_column (t));
ffebad_string (ffeintrin_gens_[gen].name);
ffebad_finish ();
}
} }
} }
...@@ -1489,6 +1510,14 @@ ffeintrin_fulfill_specific (ffebld *expr, ffeinfo *info, ...@@ -1489,6 +1510,14 @@ ffeintrin_fulfill_specific (ffebld *expr, ffeinfo *info,
ffebad_string (name); ffebad_string (name);
ffebad_finish (); ffebad_finish ();
} }
if (ffeintrin_imps_[imp].y2kbad)
{
ffebad_start (FFEBAD_INTRINSIC_Y2KBAD);
ffebad_here (0, ffelex_token_where_line (t),
ffelex_token_where_column (t));
ffebad_string (name);
ffebad_finish ();
}
} }
} }
......
...@@ -3006,6 +3006,12 @@ DEFSPEC (NONE, ...@@ -3006,6 +3006,12 @@ DEFSPEC (NONE,
CONTROL -- A control string, described below. CONTROL -- A control string, described below.
The DEFIMPY macro specifies the above, plus:
Y2KBAD -- TRUE if the intrinsic is known to be non-Y2K-compliant,
FALSE if it is known to be Y2K-compliant. (In terms of
interface and libg2c implementation.)
*/ */
/* The control string has the following format: /* The control string has the following format:
...@@ -3232,7 +3238,7 @@ DEFIMP (COMPLEX, "COMPLEX", ,,, "C=:*:Real=S*,Imag=S*") ...@@ -3232,7 +3238,7 @@ DEFIMP (COMPLEX, "COMPLEX", ,,, "C=:*:Real=S*,Imag=S*")
DEFIMP (CPU_TIME, "CPU_TIME", SECOND,,, "--:-:Seconds=R*w") DEFIMP (CPU_TIME, "CPU_TIME", SECOND,,, "--:-:Seconds=R*w")
DEFIMP (CTIME_func, "CTIME_func", CTIME,,, "A1*:-:STime=I*") DEFIMP (CTIME_func, "CTIME_func", CTIME,,, "A1*:-:STime=I*")
DEFIMP (CTIME_subr, "CTIME_subr", CTIME,,, "--:-:Result=A1w,STime=I*") DEFIMP (CTIME_subr, "CTIME_subr", CTIME,,, "--:-:Result=A1w,STime=I*")
DEFIMP (DATE, "DATE", DATE,,, "--:-:Date=A1w") DEFIMPY (DATE, "DATE", DATE,,, "--:-:Date=A1w", TRUE)
DEFIMP (DATE_AND_TIME, "DATE_AND_TIME", DATE_AND_TIME,,, "--:-:Date=A1w,Time=?A1w,Zone=?A1w,Values=?I1(8)w") DEFIMP (DATE_AND_TIME, "DATE_AND_TIME", DATE_AND_TIME,,, "--:-:Date=A1w,Time=?A1w,Zone=?A1w,Values=?I1(8)w")
DEFIMP (DBESJ0, "DBESJ0", L_BESJ0,,, "R2:-:X=R2") DEFIMP (DBESJ0, "DBESJ0", L_BESJ0,,, "R2:-:X=R2")
DEFIMP (DBESJ1, "DBESJ1", L_BESJ1,,, "R2:-:X=R2") DEFIMP (DBESJ1, "DBESJ1", L_BESJ1,,, "R2:-:X=R2")
...@@ -3289,7 +3295,7 @@ DEFIMP (IBCLR, "IBCLR", ,,, "I=:0:I=I*,Pos=I*") ...@@ -3289,7 +3295,7 @@ DEFIMP (IBCLR, "IBCLR", ,,, "I=:0:I=I*,Pos=I*")
DEFIMP (IBITS, "IBITS", ,,, "I=:0:I=I*,Pos=I*,Len=I*") DEFIMP (IBITS, "IBITS", ,,, "I=:0:I=I*,Pos=I*,Len=I*")
DEFIMP (IBSET, "IBSET", ,,, "I=:0:I=I*,Pos=I*") DEFIMP (IBSET, "IBSET", ,,, "I=:0:I=I*,Pos=I*")
DEFIMP (IDATE_unix, "IDATE_unix", IDATE,,, "--:-:TArray=I1(3)w") DEFIMP (IDATE_unix, "IDATE_unix", IDATE,,, "--:-:TArray=I1(3)w")
DEFIMP (IDATE_vxt, "IDATE_vxt", VXTIDATE,,, "--:-:M=I1w,D=I1w,Y=I1w") DEFIMPY (IDATE_vxt, "IDATE_vxt", VXTIDATE,,, "--:-:M=I1w,D=I1w,Y=I1w", TRUE)
DEFIMP (IEOR, "IEOR", ,,, "I=:*:I=I*,J=I*") DEFIMP (IEOR, "IEOR", ,,, "I=:*:I=I*,J=I*")
DEFIMP (IOR, "IOR", ,,, "I=:*:I=I*,J=I*") DEFIMP (IOR, "IOR", ,,, "I=:*:I=I*,J=I*")
DEFIMP (IERRNO, "IERRNO", IERRNO,,, "I1:-:") DEFIMP (IERRNO, "IERRNO", IERRNO,,, "I1:-:")
......
...@@ -51,11 +51,13 @@ typedef enum ...@@ -51,11 +51,13 @@ typedef enum
#define DEFGEN(CODE,NAME,SPEC1,SPEC2) FFEINTRIN_gen ## CODE, #define DEFGEN(CODE,NAME,SPEC1,SPEC2) FFEINTRIN_gen ## CODE,
#define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP)
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL)
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD)
#include "intrin.def" #include "intrin.def"
#undef DEFNAME #undef DEFNAME
#undef DEFGEN #undef DEFGEN
#undef DEFSPEC #undef DEFSPEC
#undef DEFIMP #undef DEFIMP
#undef DEFIMPY
FFEINTRIN_gen FFEINTRIN_gen
} ffeintrinGen; } ffeintrinGen;
...@@ -65,11 +67,13 @@ typedef enum ...@@ -65,11 +67,13 @@ typedef enum
#define DEFGEN(CODE,NAME,SPEC1,SPEC2) #define DEFGEN(CODE,NAME,SPEC1,SPEC2)
#define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) FFEINTRIN_spec ## CODE, #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) FFEINTRIN_spec ## CODE,
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL)
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD)
#include "intrin.def" #include "intrin.def"
#undef DEFNAME #undef DEFNAME
#undef DEFGEN #undef DEFGEN
#undef DEFSPEC #undef DEFSPEC
#undef DEFIMP #undef DEFIMP
#undef DEFIMPY
FFEINTRIN_spec FFEINTRIN_spec
} ffeintrinSpec; } ffeintrinSpec;
...@@ -80,11 +84,14 @@ typedef enum ...@@ -80,11 +84,14 @@ typedef enum
#define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP)
#define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) \ #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) \
FFEINTRIN_imp ## CODE, FFEINTRIN_imp ## CODE,
#define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD) \
FFEINTRIN_imp ## CODE,
#include "intrin.def" #include "intrin.def"
#undef DEFNAME #undef DEFNAME
#undef DEFGEN #undef DEFGEN
#undef DEFSPEC #undef DEFSPEC
#undef DEFIMP #undef DEFIMP
#undef DEFIMPY
FFEINTRIN_imp FFEINTRIN_imp
} ffeintrinImp; } ffeintrinImp;
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
@c The text of this file appears in the file BUGS @c The text of this file appears in the file BUGS
@c in the G77 distribution, as well as in the G77 manual. @c in the G77 distribution, as well as in the G77 manual.
@c 1999-03-03 @c 1999-03-06
@ifclear NEWSONLY @ifclear NEWSONLY
@node News @node News
...@@ -82,6 +82,16 @@ now are recognized by @code{g77} ...@@ -82,6 +82,16 @@ now are recognized by @code{g77}
as if they ended in @samp{.for} and @samp{.fpp}, respectively. as if they ended in @samp{.for} and @samp{.fpp}, respectively.
@item @item
@code{g77} now warns about a reference to an intrinsic
that has an interface that is not Year 2000 (Y2K) compliant.
Also, the @code{libg2c} has been changed to increase the likelihood
of catching references to the implementations of these intrinsics
using the @samp{EXTERNAL} mechanism
(which would avoid the new warnings).
@xref{Year 2000 (Y2K) Problems}, for more information.
@item
@code{g77} now warns about a reference to a function @code{g77} now warns about a reference to a function
when the corresponding @emph{subsequent} function program unit when the corresponding @emph{subsequent} function program unit
disagrees with the reference concerning the type of the function. disagrees with the reference concerning the type of the function.
......
char *ffe_version_string = "0.5.24-19990219"; char *ffe_version_string = "0.5.24-19990306";
1999-03-06 Craig Burley <craig@jcb-sc.com>
Rename non-Y2K-compliant intrinsics:
* Makefile.in (F2CEXT): Now two versions each of
`date' and `vxtidt'.
* f2cext.c (date_, vxtidate_): Split into two versions,
the existing one calling a new "y2kbuggy" routine that
does not exist, and a new one named with "y2kbug" that
calls the newly renamed underlying routine.
* libU77/date_.c (G77_date_y2kbug_0): Rename from G77_date_0.
* libU77/vxtidate_.c (G77_vxtidate_y2kbug_0): Rename from
G77_vxtidate_0.
* libU77/Version.c: Bump version.
1999-03-03 Craig Burley <craig@jcb-sc.com> 1999-03-03 Craig Burley <craig@jcb-sc.com>
* libU77/vxtidate_.c (G77_vxtidate_0): Truncate * libU77/vxtidate_.c (G77_vxtidate_0): Truncate
......
...@@ -75,12 +75,13 @@ SUBDIRS = libI77 libF77 libU77 ...@@ -75,12 +75,13 @@ SUBDIRS = libI77 libF77 libU77
F2CEXT = abort derf derfc ef1asc ef1cmc erf erfc exit getarg getenv iargc \ F2CEXT = abort derf derfc ef1asc ef1cmc erf erfc exit getarg getenv iargc \
signal system flush ftell fseek access besj0 besj1 besjn besy0 besy1 \ signal system flush ftell fseek access besj0 besj1 besjn besy0 besy1 \
besyn chdir chmod ctime date dbesj0 dbesj1 dbesjn dbesy0 dbesy1 dbesyn \ besyn chdir chmod ctime dbesj0 dbesj1 dbesjn dbesy0 dbesy1 dbesyn \
dtime etime fdate fgetc fget flush1 fnum fputc fput fstat gerror \ dtime etime fdate fgetc fget flush1 fnum fputc fput fstat gerror \
getcwd getgid getlog getpid getuid gmtime hostnm idate ierrno irand \ getcwd getgid getlog getpid getuid gmtime hostnm idate ierrno irand \
isatty itime kill link lnblnk lstat ltime mclock perror rand rename \ isatty itime kill link lnblnk lstat ltime mclock perror rand rename \
secnds second sleep srand stat symlnk time ttynam umask unlink \ secnds second sleep srand stat symlnk time ttynam umask unlink \
vxtidt vxttim alarm vxttim alarm \
date_y2kbuggy date_y2kbug vxtidt_y2kbuggy vxtidt_y2kbug
.SUFFIXES: .SUFFIXES:
......
...@@ -203,10 +203,23 @@ void ctime_ (char *chtime, const ftnlen Lchtime, longint *xstime) { ...@@ -203,10 +203,23 @@ void ctime_ (char *chtime, const ftnlen Lchtime, longint *xstime) {
} }
#endif #endif
#ifdef Ldate #ifdef Ldate_y2kbuggy
int date_ (char *buf, ftnlen buf_len) { int date_ (char *buf, ftnlen buf_len) {
extern int G77_date_0 (char *buf, ftnlen buf_len); /* Fail to link, so user sees attempt to invoke non-Y2K-compliant
return G77_date_0 (buf, buf_len); routine. */
extern int G77_date_y2kbuggy_0 (char *buf, ftnlen buf_len);
return G77_date_y2kbuggy_0 (buf, buf_len);
}
#endif
#ifdef Ldate_y2kbug
int date_y2kbug__ (char *buf, ftnlen buf_len) {
/* If user wants to invoke the non-Y2K-compliant routine via
an `EXTERNAL' interface, avoiding the warning via g77's
`INTRINSIC' interface, force coding of "y2kbug" string in
user's program. */
extern int G77_date_y2kbug_0 (char *buf, ftnlen buf_len);
return G77_date_y2kbug_0 (buf, buf_len);
} }
#endif #endif
...@@ -540,10 +553,23 @@ integer unlink_ (const char *str, const ftnlen Lstr) { ...@@ -540,10 +553,23 @@ integer unlink_ (const char *str, const ftnlen Lstr) {
} }
#endif #endif
#ifdef Lvxtidt #ifdef Lvxtidt_y2kbuggy
int vxtidate_ (integer *m, integer *d, integer *y) { int vxtidate_ (integer *m, integer *d, integer *y) {
extern int G77_vxtidate_0 (integer *m, integer *d, integer *y); /* Fail to link, so user sees attempt to invoke non-Y2K-compliant
return G77_vxtidate_0 (m, d, y); routine. */
extern int G77_vxtidate_y2kbuggy_0 (integer *m, integer *d, integer *y);
return G77_vxtidate_y2kbuggy_0 (m, d, y);
}
#endif
#ifdef Lvxtidt_y2kbug
int vxtidate_y2kbug__ (integer *m, integer *d, integer *y) {
/* If user wants to invoke the non-Y2K-compliant routine via
an `EXTERNAL' interface, avoiding the warning via g77's
`INTRINSIC' interface, force coding of "y2kbug" string in
user's program. */
extern int G77_vxtidate_y2kbug_0 (integer *m, integer *d, integer *y);
return G77_vxtidate_y2kbug_0 (m, d, y);
} }
#endif #endif
......
static char junk[] = "\n@(#) LIBU77 VERSION 19980709\n"; static char junk[] = "\n@(#) LIBU77 VERSION 19980709\n";
char __G77_LIBU77_VERSION__[] = "0.5.24-19990115"; char __G77_LIBU77_VERSION__[] = "0.5.24-19990306";
#include <stdio.h> #include <stdio.h>
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
static integer c__5 = 5; static integer c__5 = 5;
/* Subroutine */ int G77_date_0 (char *buf, ftnlen buf_len) /* Subroutine */ int G77_date_y2kbug_0 (char *buf, ftnlen buf_len)
{ {
/* System generated locals */ /* System generated locals */
address a__1[5]; address a__1[5];
......
...@@ -38,10 +38,10 @@ Boston, MA 02111-1307, USA. */ ...@@ -38,10 +38,10 @@ Boston, MA 02111-1307, USA. */
/* Subroutine */ /* Subroutine */
#ifdef KR_headers #ifdef KR_headers
int G77_vxtidate_0 (m, d, y) int G77_vxtidate_y2kbug_0 (m, d, y)
integer *y, *m, *d; integer *y, *m, *d;
#else #else
int G77_vxtidate_0 (integer *m, integer *d, integer *y) int G77_vxtidate_y2kbug_0 (integer *m, integer *d, integer *y)
#endif #endif
{ {
struct tm *lt; struct tm *lt;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment