home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / g77-0.5.15-src.tgz / tar.out / fsf / g77 / f / DOC < prev    next >
Text File  |  1996-09-28  |  54KB  |  1,151 lines

  1. 950513
  2.  
  3. *IMPORTANT GENERAL INFORMATION*
  4.  
  5. 1. Local variables are not necessarily initialized to zero, even if they
  6.    are saved (or if -fno-automatic is used).  Use -finit-local-zero to
  7.    initialize otherwise uninitialized local variables and arrays to
  8.    binary zeros, or, better yet, use -Wuninitialized (which requires -O)
  9.    to get g77 to find some obvious (and perhaps some not-so-obvious)
  10.    possible cases of references to uninitialized variables at compile
  11.    time.
  12.  
  13. 2. g77 currently is implemented as a replacement for the f2c+gcc
  14.    combination, and its implementation is designed so it can, in
  15.    most cases, generate object files that are link-compatible with
  16.    those generated by f2c+gcc using the identical combination (which
  17.    includes a similar/identical copy of f2c.h).  Therefore, the
  18.    g77-gcc C-Fortran interface ought to work in a way that is
  19.    consistent with f2c.  For instance, a Fortran string subroutine
  20.    argument will become two arguments on the C side: a char * and an int
  21.    length.  Much of this compatibility results from the fact that
  22.    g77 uses the same run-time library, libf2c, used by f2c+gcc.
  23.  
  24.    However, it is expected that a future version of g77 will not
  25.    by default generate object files compatible with f2c+gcc and not
  26.    use libf2c.  If you expect to depend on this compatibility in the
  27.    long term, use the options "-ff2c -ff2c-library" when compiling
  28.    all of the applicable code (which should at the very least trigger
  29.    compiler warning messages, if not enable f2c compatibility compilation,
  30.    in future versions of g77).
  31.  
  32. 3. Due to #2 above, object files compiled by g77 are not guaranteed to work
  33.    well with objects compiled by the native compiler.  Libraries compiled
  34.    with the native compiler will probably have to be recompiled with
  35.    g77 to be used with g77.  There are two reasons for this: (1) there
  36.    may be subtle type mismatches which cause subroutine arguments
  37.    and function return values to get corrupted; (2) native compilers
  38.    use libraries of private I/O routines which will not be available
  39.    at link time unless you have the native compiler - and you would
  40.    have to explicitly ask for them.  For instance, on the Sun you
  41.    would have to add "-L/usr/lang/SCx.x -lF77 -lV77" to the link
  42.    command.
  43.  
  44. 4. On some systems, perhaps just those with out-of-date (shared?) libraries,
  45.    unresolved-reference errors happen when linking g77-compiled programs
  46.    (which should be done using g77).  If this happens to you, try appending
  47.    `-lc' to the command you use to link the program, i.e. `g77 foo.f -lc'.
  48.    g77 already specifies `-lf2c -lm' when it calls the linker, but it
  49.    cannot also specify `-lc' because not all systems have a libc.a.
  50.  
  51. *PORTING INFORMATION*
  52.  
  53. During the private alpha test phase, which lasted about 2.5 years,
  54. g77 was tested by a small number of people worldwide on a fairly
  55. wide variety of machines.
  56.  
  57. Currently, all of these configurations were self-hosted, i.e. it
  58. is not likely that g77 can itself be cross-compiled or that it can
  59. be configured as a cross-compiler.  There is only one known bug
  60. (a design bug to be fixed in 0.6) that prevents configuration of
  61. g77 as a cross-compiler, though there are assumptions made during
  62. configuration that probably make doing non-self-hosting builds
  63. a hassle, requiring manual intervention.
  64.  
  65. *USER-VISIBLE CHANGES DURING 0.5.x*
  66.  
  67. In 0.5.15:
  68.  
  69. -  -ffixed-line-length-N, a new option where N is 72 by default,
  70.    sets the column after which characters are ignored in typical
  71.    fixed-form lines in the source file -- popular values for N
  72.    include 72 (standard), 80 (card image), and 132 (corresponds
  73.    to "extended-source" options in some popular compilers);
  74.    "none" is supported for N, meaning that the entire line is
  75.    meaningful, and that continued character constants never have
  76.    implicit spaces appended to them to fill out the line (since
  77.    they'd be infinite); note that N="0" is the same as N="none"
  78.  
  79. In 0.5.14:
  80.  
  81. -  -I now works for INCLUDE statements, but note that the
  82.    option must be specified _without_ any spaces between -I and
  83.    the directory name -- that is, `-Idir' is valid, but `-I dir'
  84.    is rejected by the g77 compiler (though the preprocessor still
  85.    supports the latter form); also note that the general behavior
  86.    of -I and INCLUDE is pretty much the same as of -I with #include
  87.    in gcc's C preprocessor, with regard to looking for `header.gcc'
  88.    files and other such things
  89.  
  90. -  -fbackslash, a new option on by default, changes the interpretation of
  91.    character and hollerith constants that contain the backslash (`\')
  92.    character -- they are now interpreted the same way gcc would interpret
  93.    them in C string constants, i.e. 'A\nB' specifies three characters, with
  94.    the second one being newline -- specify -fno-backslash to get the
  95.    old, pre-0.5.14 behavior
  96.  
  97. -  -fugly-args is now on by default (allows CALL FOO(4HABCD))
  98.  
  99. -  -fugly-init, a new option on by default, specifically allows use of
  100.    hollerith and typeless constants as initial values for variables, arrays,
  101.    and named constants (PARAMETER), and use of character and numeric
  102.    types to initialize each other in those contexts (e.g. DATA I/'F'/,
  103.    CHRVAR/65/)
  104.  
  105. -  -finit-local-zero, a new option that causes g77 to initialize all
  106.    uninitialized local variables and arrays to binary zeros -- since
  107.    there is a run-time penalty for such initialization of stack-based
  108.    (non-SAVEd) variables, it might be a good idea to also use
  109.    -fno-automatic with this option
  110.  
  111. -  -Wimplicit, a gcc option, now works for g77 as well
  112.  
  113. -  -Wall now implies -Wunused and, when -O is specified, -Wuninitialized --
  114.    future versions might add more warnings that are also specifiable
  115.    via -Wall, using the same general policy to decide whether a warning
  116.    should be enabled via -Wall as used by gcc
  117.  
  118. -  Hollerith constants as actual arguments now are passed by reference
  119.    instead of by value -- so CALL FOO(4HABCD) is now compiled exactly
  120.    the same as CALL FOO(%REF('ABCD')), instead of as CALL FOO(%VAL('ABCD'))
  121.  
  122. -  Hollerith constants converted to larger types now are padded on the
  123.    right with spaces; converted to smaller types, warnings are issued
  124.    if non-spaces are truncated on the right
  125.  
  126. -  Format specifications of arrays of types other than CHARACTER are
  127.    allowed in I/O statements, such as when they contain Hollerith
  128.    data
  129.  
  130. -  Typeless constants as actual arguments now are passed by reference
  131.    to a INTEGER version of the constant instead of by value
  132.  
  133. -  Typeless constants converted to larger types are padded on the left
  134.    with zeros; converted to smaller types, warnings are issued if non-zero
  135.    bits are truncated on the left
  136.  
  137. -  %DESCR() of a non-CHARACTER expression treats the expression as if
  138.    it were CHARACTER, passing both a pointer to the expression and the
  139.    length of the type of the expression in bytes, by value, in the
  140.    "hidden" list of lengths used for CHARACTER arguments
  141.  
  142. -  The ICHAR(), IACHAR(), and LEN() intrinsics now accept character
  143.    expressions involving concatenation of assumed-length dummy arguments
  144.  
  145. -  BLOCK DATA program units now can contain NAMELIST, EXTERNAL, INTRINSIC,
  146.    and VOLATILE statements
  147.  
  148. -  Zero-length character expressions now supported
  149.  
  150. -  f2c's IMAG() intrinsic now supported
  151.  
  152. -  INCLUDE statement restrictions, such as no continuation lines allowed,
  153.    now lifted
  154.  
  155. In 0.5.13:
  156.  
  157. -  SAVE now allowed with SAVE FOO,/BAR/,... in the same program unit
  158.  
  159. In 0.5.11:
  160.  
  161. -  The -fugly-args command-line option has been introduced.  It enables
  162.    a subset of the constructs enabled by -fugly -- specifically, the
  163.    ability to specify a Hollerith or Typeless constant directly as
  164.    an actual argument.  The default, -fnougly-args, produces a diagnostic
  165.    message that, as of 0.5.11, has been revised to suggest ways to
  166.    avoid the message, either by using -fugly-args or -fugly, or by
  167.    changing the Fortran source code as follows:
  168.  
  169.    Replace CALL FOO(4HABCD) with CALL FOO(%VAL('ABCD'))
  170.    Replace CALL FOO('FF00'X) with CALL FOO(%VAL(65280))
  171.  
  172.    Currently, typeless constants as actual arguments are converted to INTEGER.
  173.    This might change if it is discovered that industry practices conform
  174.    to some other conversion process for typeless constants.  Hollerith
  175.    constants are converted to a string of bytes as specified by the
  176.    length of the constants, so CALL FOO(13Hhello there!!) really passes
  177.    a 13-byte argument by value, just as gcc would if given `foo(x);'
  178.    where x is declared as `struct { char a[13]; } x = "hello there!!";'.
  179.    [THE ABOVE IS CHANGED AS OF 0.5.14!!]
  180.  
  181. -  f2c's DFLOAT() intrinsic now supported
  182.  
  183. In 0.5.9:
  184.  
  185. -  Carriage returns ('\r') in source lines are ignored.  This is somewhat
  186.    different from f2c, which seems to treat them as spaces outside
  187.    character/hollerith constants, and encodes them as '\r' inside such
  188.    constants.
  189.  
  190. -  A source line with a TAB character anywhere in it is treated as
  191.    entirely significant -- however long it is -- instead of ending
  192.    in column 72 (for fixed-form source) or 132 (for free-form source).
  193.    This also is different from f2c, which encodes tabs as '\t' inside
  194.    character and hollerith constants, but nevertheless seems to treat
  195.    the column position as if it had been affected by any tab.
  196.  
  197.    NOTE: this default behavior probably will change for 0.6, when
  198.    it will presumably be available via a command-line option.  The
  199.    default as of 0.6 is expected to be a "pure visual" model, where
  200.    tabs are immediately converted to spaces and otherwise have no
  201.    effect, so the way a typical user sees source lines produces a
  202.    consistent result no matter how the spacing in those source lines
  203.    is actually implemented via tabs, spaces, and trailing tabs/spaces
  204.    before newline.  Command-line options are likely to be added to
  205.    specify whether all or just-tabbed lines are to be extended to
  206.    132 or full input-line length, and perhaps even an option will be
  207.    added to specify the truncated-line behavior to which Digital compilers
  208.    default.
  209.  
  210. In 0.5.5:
  211.  
  212. -  A warning message now is issued when g77 sees code that provides
  213.    initial values (e.g. via DATA) to an aggregate area (COMMON or
  214.    EQUIVALENCE, or even a large enough array or CHARACTER variable)
  215.    that is large enough to increase g77's compile time by roughly
  216.    a factor of 10.  This size is currently quite small, since g77
  217.    currently has a known bug (see f/BUGS) requiring too much memory
  218.    and time to handle such cases.  See f/data.c macro
  219.    FFEDATA_sizeTOO_BIG_INIT_ for the minimum size (in storage units,
  220.    which can be bytes, words, or whatever, on a case-by-case basis).
  221.  
  222. In 0.5.4:
  223.  
  224. -  Entities in local EQUIVALENCE no longer are emitted for debug support
  225.    when specifying -g, because this triggered the same bug found when
  226.    trying to support emitting COMMON members.
  227.  
  228. In 0.5.3:
  229.  
  230. -  The "gcc" command driver no longer automatically links the Fortran
  231.    run-time library (libf2c, or libF77 and libI77 on some systems).
  232.    Since that library is required for just about any g77-produced code
  233.    to link and run successfully, the "g77" command driver should be
  234.    used instead (at least to link the executable), or "-lf2c -lm" should
  235.    be specified on the "gcc" command line.
  236.  
  237. -  The "g77" command driver recognizes "none" as a non-language, just as
  238.    does the "gcc" command driver, as per documentation.  Previously, "g77"
  239.    treated the option "-xnone" as it would any other "-xlanguage" option.
  240.    This probably has no actual effect on the behavior of the command.
  241.  
  242. -  The "g77" command driver now recognizes both the "-xlanguage" and
  243.    "-x language" forms of the -x option.
  244.  
  245. -  The "g77" command driver now handles much larger command lines --
  246.    specifically, lines containing lots of .f or .F source file names --
  247.    in the sense that it passes smaller command lines on to the gcc
  248.    driver
  249.  
  250. -  g77 has a new, more consistent way to map Fortran types to their sizes.
  251.    These rules are based on the configuration that is in force for the
  252.    version of gcc built in the same release as g77:
  253.  
  254.      REAL: same size as whatever gcc calls a "float"
  255.      DOUBLE PRECISION: same size as whatever floating-point type gcc provides
  256.        that is twice the size of a "float" (usually a "double")
  257.      INTEGER: a gcc integral type that is the same storage size as "float"
  258.      LOGICAL: same size as INTEGER
  259.      COMPLEX: two REALs
  260.      DOUBLE COMPLEX: two DOUBLE PRECISIONs
  261.  
  262.      numeric-type*N (any type other than CHARACTER, such as INTEGER*2):
  263.        is N times the size of whatever gcc calls a "char"
  264.  
  265.      numeric-type(KIND=N): N=1 for REAL, INTEGER, LOGICAL, COMPLEX;
  266.        N=2 for DOUBLE PRECISION, DOUBLE COMPLEX [this is proposed for now;
  267.        it might change in the future]
  268.  
  269.    Some of the above might seem unexpected, but is based on the requirements
  270.    of the Fortran standards (77 and 90).  g77 is going to provide a
  271.    consistent interpretation across all machines by following the above
  272.    rules, rather than conforming to the expectations of the users of
  273.    particular machines when they reflect inconsistent type-sizing rules.
  274.    This consistency also should improve the interoperability and portability
  275.    of applications combining Fortran and C-family code.
  276.  
  277.    For now, g77 does not support numeric types other than the ones listed
  278.    above.  So, on a typical 32-bit machine, only INTEGER*4, REAL*4,
  279.    LOGICAL*4, COMPLEX*8, etc., will work.  When g77 does support other
  280.    types, they will be derived from gcc types such as "char", "short",
  281.    "int", "long", "long long", "long double", and so on.  That is, whatever
  282.    types gcc already supports, g77 will someday support.  The rules for
  283.    the "numeric-type*N" notation will be applied to the new types, and
  284.    new values for "numeric-type(KIND=N)" will be assigned on a clear,
  285.    consistent basis, which we will invent when the time is right.
  286.  
  287.    Note that g77 strictly assigns types to all constants not documented
  288.    as "typeless" (the typeless constants include things like "Z'1'").
  289.    Context is never a determining factor for the type, and hence the
  290.    interpretation, of a typed constant.  Examples: "1" is always type
  291.    INTEGER, "3.141592653545256234" is always type REAL (even if the
  292.    additional precision specified is lost, and even when used in a
  293.    DOUBLE PRECISION context), "1E0" is always type REAL, and "1D0" is
  294.    always type DOUBLE PRECISION.
  295.  
  296.    Many other Fortran compilers attempt to assign types to typed constants
  297.    based on their context.  This results in hard-to-find bugs, nonportable
  298.    code, and is not in the spirit (though it strictly follows the letter)
  299.    of the 77 and 90 standards.  g77 will not support these dangerous
  300.    semantics, but might offer, in a future release, explicit constructs
  301.    by which a wider variety of typeless constants may be specified.
  302.  
  303. -  g77 now, on most machines, puts more variables and arrays on the stack
  304.    where possible, and can be configured (by changing FFECOM_sizeMAXSTACKITEM
  305.    in com.c) to force smaller-sized entities into static storage (saving
  306.    on stack space) or permit larger-sized entities to be put on the
  307.    stack (which can improve run-time performance).
  308.  
  309. -  Entities in EQUIVALENCE but not in COMMON now are emitted via -g so
  310.    they can be easily debugged.  COMMON blocks themselves still are emitted,
  311.    but their members are not emitted due to what appears to be a back-end
  312.    bug in at least one output module for a debugging format.  (THIS IS
  313.    REVERTED IN 0.5.4.)
  314.  
  315. -  All debuggable entities in a program unit, not just the referenced ones,
  316.    are output when -g is specified.
  317.  
  318. -  g77 build will crash if an attempt is made to build it as a cross-compiler
  319.    for a target when g77 cannot reliably determine the bit pattern of
  320.    floating-point constants for the target.  Planned improvements for g77-0.6
  321.    will give it the capabilities it needs to not have to crash the build
  322.    but rather generate correct code for the target.  (Currently, g77
  323.    would generate bad code under such circumstances if it didn't crash
  324.    during the build, e.g. when compiling a source file that does
  325.    something like EQUIVALENCE (I,R) and DATA R/3.1415926535/.)
  326.  
  327. In 0.5.2:
  328.  
  329. -  Dollar signs ('$') allowed in identifiers (other than as the first
  330.    character) when the command-line option -fdollar-ok is specified
  331.  
  332. *CHANGES DURING 0.4.x*
  333.  
  334. In 0.4.14:
  335.  
  336. -  Default options are now -fno-f90, -ff90-intrinsics-delete,
  337.    -ff2c-intrinsics-enable, so g77 now, by default, behaves much
  338.    more like a traditional Unix f77 compiler
  339.  
  340. -  '_' now valid after first character of a symbol name even for
  341.    -ff90
  342.  
  343. -  '_' as first character of symbol name (valid if -fno-f90) is
  344.    treated as if IMPLICIT REAL(_) were present -- this makes g77
  345.    compatible with f2c, though f2c does not allow IMPLICIT specification
  346.    for '_' (except via IMPLICIT NONE) unlike g77, which treats
  347.    '_' just as any other first character
  348.  
  349. In 0.4.12:
  350.  
  351. -  Symbol names can no longer contain the '$' character at all --
  352.    previously, they could contain '$' as any character except the
  353.    first character (THIS IS CHANGED IN 0.5.2)
  354.  
  355. -  Symbol names can contain the '_' only if -fno-f90, else they
  356.    cannot contain '_' -- previously, they could contain '_' as
  357.    any character except the first character, independent of -ff90
  358.    (THIS IS CHANGED IN 0.4.14)
  359.  
  360. *CHANGES SINCE 0.3.12*
  361.  
  362. Among the user-visible changes in 0.4:
  363.  
  364. -  g77 crashes immediately in ffecom_init_0 if the size/alignment info
  365.    the front end has for the user-visible types (INTEGER, REAL,
  366.    CHARACTER, and so on) disagrees with what the back end uses -- the
  367.    g77 installer must fix this by patching target.h or the appropriate
  368.    file(s) in the config/ directory (and please email the patches,
  369.    along with your config.status file, to the maintainers).  (THIS IS
  370.    CHANGED IN 0.5.x.)
  371.  
  372. -  Handling of floating-point constants has been radically changed for
  373.    systems where gcc emulates floating-point computations during
  374.    compilation (systems where real.h #define's REAL_ARITHMETIC) -- this
  375.    not only fixes some bugs involving mixed-type EQUIVALENCE and
  376.    COMMON areas with initial floating-point values, but it changes
  377.    the values produced by some cases such as where single-precision
  378.    constants (using the "E" exponent letter, if any) are used in a
  379.    double-precision context such that they no longer are interpreted
  380.    as if they were specified as double-precision constants (i.e.
  381.    precision is now apparently lost in these cases; use the "D" exponent
  382.    letter in these cases to force the constants to be interpreted as
  383.    double-precision, as you generally should anyplace a floating-point
  384.    constant is used in a double-precision context).
  385.  
  386. -  Some options like -w and -Werror now work.
  387.  
  388. -  gcc now refuses to continue compiling when errors are detected in
  389.    a .f file -- in other words, the f771 program gcc invokes to
  390.    compile the Fortran source file into assembler output now should
  391.    return an indication that errors were detected, which should prevent
  392.    gcc from trying to assemble (and then maybe link) the assembler output
  393.    into an object/executable file.
  394.  
  395. -  New: -fxxx-intrinsics-hide, a way to "hide" intrinsics that aren't normally
  396.    used and whose names should normally be available as names of external
  397.    procedures -- like -fxxx-intrinsics-delete, but allows INTRINSIC FOO
  398.    as a way of saying "I really want the FOO intrinsic available in this
  399.    program unit".
  400.  
  401. -  Some convenient new options to specify common combinations of source-
  402.    file casing, such as -fcase-upper and -fcase-lower.
  403.  
  404. -  Handling of implied-DO control variables in DATA statements has been
  405.    redone so some useful (and valid) constructs now work, and so some
  406.    useless and weird constructs no longer are accepted (and are made
  407.    invalid by the Fortran 90 standard, even though they were valid
  408.    according to the FORTRAN 77 standard) -- note that it is very
  409.    unlikely that any existing Fortran code uses the constructs that
  410.    g77 no longer supports and F90 makes invalid.
  411.  
  412. -  Error reporting is fixed for source files using INCLUDE more than
  413.    once -- the proper line numbers are given now.
  414.  
  415. -  Passing a hollerith constant as an actual argument to an external
  416.    procedure now works (with no diagnostic when -fugly is specified),
  417.    though the meaning of this might not be what is expected by users
  418.    of various other Fortran systems -- I copied what the DEC VAX/VMS
  419.    FORTRAN documentation says that system does, which is basically to
  420.    pass the hollerith string "3HFOO" as if it read "%VAL('FOO')";
  421.    note that use of hollerith constants in such contexts is usually
  422.    nonportable.
  423.  
  424. -  Passing a typeless constant as an actual argument to an external
  425.    procedure now works (with no diagnostic when -fugly is specified) --
  426.    it is converted to INTEGER and passed by reference; note that use of
  427.    typeless constants in such contexts is usually nonportable.
  428.  
  429. *WHAT IS AND ISN'T SUPPORTED*
  430.  
  431. This release supports ANSI FORTRAN 77 with the following caveats:
  432.  
  433. -  No passing of an external procedure as an actual argument if the procedure's
  434.    type is declared CHARACTER*(*) (because it isn't clear the standard
  435.    really considers this standard-conforming, but it should be fairly easy
  436.    to support if someone gets an RFI showing it is standard-conforming).
  437.  
  438. -  No passing of a dummy procedure as an actual argument if the procedure's
  439.    type is declared CHARACTER*(*) (again, because it isn't clear the
  440.    standard considers this conformant).
  441.  
  442. -  The DO variable for an implied-DO construct in a DATA statement may
  443.    not be used as the DO variable for an outer implied-DO construct (this
  444.    is also disallowed by Fortran 90, as it offers no additional capabilities).
  445.    Note that it is very unlikely that any existing Fortran code
  446.    tries to use this unsupported construct.
  447.  
  448. -  An array element initializer in an implied-DO construct in a DATA
  449.    statement must contain at least one reference to the DO variables of
  450.    each outer implied-DO construct (this is also required by Fortran 90,
  451.    as FORTRAN 77's more permissive requirements offer no additional
  452.    capabilities).  However, g77 doesn't necessarily diagnose all cases
  453.    where this requirement is not met.  Note that in any case it is
  454.    very unlikely that any existing Fortran code tries to use this
  455.    unsupported construct.
  456.  
  457. This release supports ANSI FORTRAN 77 plus:
  458.  
  459. -  -g for local variables and external names; COMMON variables, local
  460.    EQUIVALENCE variables, labels, and so on aren't support yet.
  461.  
  462. -  LOC(), if -fvxt-intrinsics-enable is in force.
  463.  
  464. -  %LOC, %VAL, %REF, and %DESCR -- where %DESCR currently means the same thing
  465.    as passing the argument the normal way.
  466.  
  467. -  MIL-STD 1753 features (IAND, IOR, MVBITS, DO WHILE, END DO, etc).
  468.  
  469. -  NAMELIST.
  470.  
  471. -  Most f2c/f77 intrinsics (AND, OR, LSHIFT, RSHIFT, and so on).
  472.  
  473. -  DOUBLE COMPLEX and related intrinsics (standard and f2c varieties).
  474.  
  475. -  Various Fortran 90 features.
  476.  
  477. -  Various DEC VAX/VMS FORTRAN v4.0 features.
  478.  
  479. -  Various f2c features.
  480.  
  481. -  Source files that are uppercase-only (enforced), lowercase-only
  482.    (enforced), caseless, and various other combinations as chosen via
  483.    command-line options.
  484.  
  485. -  Arbitrary (limited only by available memory) number of continuation
  486.    lines.
  487.  
  488. -  Use of '&' in column 1 to indicate a continuation line a la f2c.
  489.  
  490. -  Dollar signs ('$') in identifiers (other than as the first character)
  491.    when the command-line option -fdollar-ok is specified.
  492.  
  493. *BLOCK DATA AND LIBRARIES*
  494.  
  495. To ensure that BLOCK DATA program units are linked, especially a concern
  496. when they are put into libraries, give each one a name (as in
  497. BLOCK DATA FOO) and make sure there is an EXTERNAL FOO statement
  498. in every program unit that uses any COMMON area initialized by the
  499. corresponding BLOCK DATA.  g77 currently compiles a BLOCK DATA as
  500. if it were a SUBROUTINE, that is, it generates an actual procedure
  501. having the appropriate name.  The procedure does nothing but return
  502. immediately if it happens to be called.  For EXTERNAL FOO, where FOO
  503. is not otherwise referenced in the same program unit, g77 assumes
  504. it is a BLOCK DATA and generates a reference to it so the linker will
  505. make sure it is present.  (Specifically, g77 outputs in the data
  506. section a static pointer to the external name FOO.)
  507.  
  508. The implementation g77 currently uses to make this work is
  509. one of the few things not compatible with f2c as currently
  510. shipped.  f2c currently does nothing with EXTERNAL FOO except
  511. issue a warning that FOO is not otherwise referenced, and for
  512. BLOCK DATA FOO, f2c doesn't generate a dummy procedure with the
  513. name FOO.  The upshot is that you shouldn't mix f2c and g77 in
  514. this particular case.  If you use f2c to compile BLOCK DATA FOO,
  515. then any g77-compiled program unit that says EXTERNAL FOO will
  516. result in an unresolved reference when linked.  If you do the
  517. opposite, then FOO might not be linked in under various
  518. circumstances (such as when FOO is in a library, or you're
  519. using a "clever" linker).
  520.  
  521. The changes you make to your code to make g77 handle this
  522. situation, however, appear to be a widely portable way to handle
  523. it.  That is, many systems permit it (as they should, since the
  524. FORTRAN 77 standard permits EXTERNAL FOO when FOO is a BLOCK DATA
  525. program unit), and of the ones that might not link BLOCK DATA FOO
  526. under some circumstances, most of them appear to do so once
  527. EXTERNAL FOO is present in the appropriate program units.
  528.  
  529. *FORTRAN 90*
  530.  
  531. The -ff90 and -fno-f90 command-line options control whether certain
  532. Fortran 90 constructs are recognized.  (Other Fortran 90 constructs
  533. might or might not be recognized depending on other options such as
  534. -fvxt-not-f90, -ff90-intrinsics-enable, and the current level of support
  535. for Fortran 90.)
  536.  
  537. When -ff90 is specified, the following constructs are accepted:
  538.  
  539.   -  Zero-length CHARACTER entities even when -pedantic specified
  540.   -  Zero-size array dimensions (as in INTEGER I(10,20,4:2)) (not supported
  541.      by run-time code, so diagnostics are produced for g77 nevertheless).
  542.   -  DOUBLE COMPLEX (explicit or implicit) even when -fpedantic specified.
  543.   -  Substrings of constants (as in "'hello'(3:5)") even when -fpedantic
  544.      specified.
  545.   -  DATA statements allowed to precede executable statements even when
  546.      -fpedantic specified (note that this is not the same as whether
  547.      "DATA I/1/" is permitted before other specifications for I, such as
  548.      "INTEGER I" -- it does allow, however, "DATA I/1/" before "INTEGER J").
  549.   -  Semicolon as statement separator even when -fpedantic specified
  550.      (so "CALL FOO; CALL BAR" works).
  551.   -  Underscores are not accepted as the first character of a
  552.      symbol name, since F90 provides a different interpretation
  553.      for certain cases where that would occur (though g77 does not
  554.      yet support that interpretation).
  555.  
  556. If -pedantic is specified, the following constructs result in diagnostics:
  557.  
  558.   -  Use of semicolons on line with INCLUDE statement.
  559.  
  560. *VAX FORTRAN VERSUS FORTRAN 90*
  561.  
  562. The -fvxt-not-f90 and -ff90-not-vxt command-line options control how
  563. g77 interprets certain tokens and constructs that are have different
  564. meanings in VAX FORTRAN and Fortran 90.
  565.  
  566. When -ff90-not-vxt is specified, the following interpretations are
  567. made:
  568.  
  569.   -  "TYPE <symbol-name>" and "TYPE (<symbol-name>), <...>"
  570.      statements recognized as the Fortran 90 variety, not I/O statements.
  571.   -  Double-quote character (") delimits character constant just as does
  572.      apostrophe ('), rather than beginning an octal constant of INTEGER type.
  573.   -  Exclamation point in column 5 of fixed-form source file treated as
  574.      a continuation character rather than the beginning of a comment (as it
  575.      does in any other column).
  576.  
  577. *LIBRARY AND PROCEDURE-CALLING INTERFACE*
  578.  
  579. Currently, -ff2c and -ff2c-library are defaults and -ff2c-library must be
  580. in force for g77 to work properly.
  581.  
  582. The -ff2c option specifies that g77 is to generate code that is
  583. link-time and run-time compatible with code generated by an
  584. version of f2c built to be generally compatible with g77.  (This
  585. will normally be the case, but it is possible that with older or
  586. perhaps even newer versions of f2c, or with certain configuration
  587. changes to f2c internals, incompatibilities will nevertheless
  588. result.)
  589.  
  590. Specifying -fno-f2c allows g77 to generate, in some cases, faster code.
  591. For example, how REAL and [DOUBLE] COMPLEX FUNCTIONs are called is
  592. governed by the -ff2c command-line option.  With -fno-f2c, they
  593. are compiled as returning the appropriate type (float, __complex__ float,
  594. __complex__ double), whereas with -ff2c, they are compiled differently
  595. (with perhaps slower run-time performance) to accommodate the restrictions
  596. inherent in f2c's use of K&R C as an intermediate language -- REAL
  597. functions return double, while [DOUBLE] COMPLEX functions return void
  598. but have an extra argument pointing to a place for the functions to
  599. return their values.  (It is possible that in some cases -ff2c might
  600. produce faster code.  Experiment and enjoy.)
  601.  
  602. An example of the effect of -ff2c-library, which is the default (and
  603. currently must be in force, since g77 compiles code for use only
  604. with libf2c), is that diagnostics are issued for some features
  605. unsupported by the f2c library, such as NAMELIST in combination with
  606. source case preservation.
  607.  
  608. *SOURCE FORM*
  609.  
  610. The -ffree-form (aka -fno-fixed-form) and -ffixed-form (aka -fno-free-form)
  611. command-line options govern how the source file is interpreted.  Fixed form
  612. corresponds to classic ANSI FORTRAN 77 (plus popular extensions, such as
  613. allowing tabs) and Fortran 90's fixed form.  Free form corresponds to
  614. Fortran 90's free form (though possibly not entirely up-to-date, and
  615. without complaining about some things that for which Fortran 90 requires
  616. diagnostics, such as "R = 3 . 1").
  617.  
  618. *OPTIONS FOR POTENTIALLY BUGGY PROGRAMS*
  619.  
  620. The -finit-local-zero options tells g77 to initialize all local variables
  621. and arrays (that are not otherwise explicitly initialized) to binary
  622. zeros.  Many other compilers do this, which means lots of Fortran code
  623. developed with those compilers depends on it.  It is safer (and probably
  624. would produce a faster program) to find the variables and arrays that
  625. need such initialization and provide it explicitly via DATA, so that
  626. -finit-local-zero is not needed.  Use the -Wuninitialized option (which
  627. requires -O as well) to find some such cases.
  628.  
  629. The -fno-automatic command-line option tells g77 to assume, in essence, that
  630. a SAVE statement is present in every program unit.  The effect of this
  631. is that all variables and arrays are made static, i.e. not placed on
  632. the stack or in heap storage.  This might cause a buggy program to appear
  633. to work better -- if so, rather than relying on this command-line
  634. option (and hoping all compilers provide the equivalent one), add SAVE
  635. statements to some or all program unit sources, as appropriate.  The
  636. default is -fautomatic, which tells g77 to try and put variables and
  637. arrays on the stack where possible and reasonable.
  638.  
  639. *OPTIONS FOR SPEEDING UP PROGRAMS*
  640.  
  641. Aside from the usual gcc options, such as -O, -ffast-math, and so on
  642. (see the gcc documentation), consider trying:
  643.  
  644.   -fno-f2c, if you aren't linking with any f2c-produced code (other
  645.     than libf2c)
  646.  
  647. If you're using -fno-automatic already, you probably should change
  648. your code to allow compilation with -fautomatic, because the program
  649. should run faster.  Similarly, you should be able to use
  650. -fno-init-local-zero instead of -finit-local-zero.  This is because
  651. it is rare that every variable affected by these options in a given
  652. program actually needs to be so affected.  For example,
  653. -fno-automatic, which effectively SAVEs every local variable and
  654. array, affects even things like DO iteration variables, which rarely
  655. need to be SAVEd, and this often reduces run-time performances.
  656. Similarly, -fno-init-local-zero forces such variables to be
  657. initialized to zero -- when SAVEd (e.g. via -fno-automatic), this
  658. by itself generally affects only startup time for a program, but
  659. when not SAVEd, it can slow down the procedure every time it is called.
  660.  
  661. See *SUMMARY OF OVERLY CONVENIENT COMMAND-LINE OPTIONS* for information
  662. on the -fno-automatic and -finit-local-zero options and how to convert
  663. their use into selective changes in your own code.
  664.  
  665. *PEDANTIC COMPILATION*
  666.  
  667. The -fpedantic and -fno-pedantic command-line options control whether
  668. certain non-standard constructs elicit diagnostics (usually in the form
  669. of warnings) from g77.  The -fpedantic option is useful for finding
  670. some extensions g77 accepts that other compilers might not accept.
  671.  
  672. With -ff90 in force along with -fpedantic, some constructs are
  673. accepted that result in diagnostics when -fno-f90 and -fpedantic are
  674. both in force.  See *FORTRAN 90* for information on those constructs.
  675.  
  676. The constructs for which g77 issues diagnostics when -fpedantic is
  677. specified (and -fno-f90 is in force) are:
  678.  
  679.   -  "READ (<cilist>), <iolist>" -- the standard disallows the comma
  680.      here, while allowing it in "READ <f>[, <iolist>]", but many
  681.      compilers (including f2c) support the superfluous comma.
  682.   -  DOUBLE COMPLEX, either explicitly (via explicit or IMPLICIT statement)
  683.      or implicitly (as in "C*D", where C is COMPLEX and D is DOUBLE
  684.      PRECISION, which is prohibited by the standard because it should
  685.      produce a non-standard DOUBLE COMPLEX result).
  686.   -  Automatic conversion of LOGICAL, REAL, DOUBLE PRECISION, and COMPLEX
  687.      expressions to INTEGER in contexts such as: array-reference indexes;
  688.      alternate-RETURN values; computed GOTO; FORMAT run-time expressions
  689.      (not yet supported); dimension lists in specification statements;
  690.      numbers for I/O statements (such as "READ (UNIT=3.2, <...>)"); sizes
  691.      of CHARACTER entities in specification statements; kind types in
  692.      specification entities (a Fortran 90 feature); initial, terminal,
  693.      and incrementation parameters for implied-DO constructs in DATA
  694.      statements.
  695.   -  Automatic conversion of LOGICAL expressions to INTEGER in context
  696.      such as: arithmetic IF (where COMPLEX expressions are completely
  697.      disallowed).
  698.   -  Substring operators applied to character constants and named
  699.      constants (such as "PRINT *,'hello'(3:5)", which would print "llo").
  700.   -  Null argument passed to statement function (as in "PRINT *,FOO(,3)").
  701.   -  Differences between program units regarding whether a given COMMON
  702.      area is SAVEd (for targets where program units in a single source
  703.      file are "glued" together as they typically are for UNIX development
  704.      environments).
  705.   -  Differences between named-COMMON-block sizes between program units.
  706.   -  Specification statements following first DATA statement (normally
  707.      "DATA I/1/" may be followed by "INTEGER J", though not "INTEGER I",
  708.      but -fpedantic complains about both cases).
  709.   -  Semicolon as statement separator (as in "CALL FOO; CALL BAR").
  710.   -  Comma before list of I/O items in WRITE, ENCODE, DECODE, REWRITE
  711.      statements (kind of strange, since ENCODE/DECODE/REWRITE should yield
  712.      diagnostics with -fpedantic???), as with READ (as explained above).
  713.   -  Use of '&' in column 1 of fixed-form source (indicates continuation).
  714.   -  Use of CHARACTER constants to initialize numeric entities, and vice
  715.      versa.
  716.  
  717. And these constructs actually are _enabled_ via -fpedantic, because they
  718. are considered too dangerous to allow under normal circumstances even
  719. though they are permitted by the standard:
  720.  
  721.   -  DO loops with REAL or DOUBLE PRECISION DO variables (including
  722.      implied-DO loops in I/O and DATA statements), since the implementation
  723.      required by the standard, combined with the vagaries of floating-point
  724.      arithmetic on most machines, will likely result in terminating
  725.      conditions not meeting the programmer's expectations (with regard
  726.      to the terminal value for the loop).
  727.  
  728. *UGLY FEATURES*
  729.  
  730. The -fugly and -fno-ugly command-line options determine whether certain
  731. features supported by VAX FORTRAN and other such compilers, but considered
  732. too ugly to be in code that can be changed to use safer and/or more
  733. portable constructs, are accepted.
  734.  
  735. The constructs enabled via -fugly include:
  736.  
  737.   -  Automatic conversion between INTEGER and LOGICAL as dictated by
  738.      context (typically implies nonportable dependencies on how a
  739.      particular implementation encodes .TRUE. and .FALSE.).
  740.   -  Use of typeless and hollerith constants in non-standard places
  741.      (the "standard" here being the appendix in ANSI FORTRAN 77 and
  742.      the descriptions in MIL-STD 1753), plus in places controlled
  743.      by -fugly-args and -fugly-init.
  744.   -  Use of LOGICAL variable in ASSIGN and assigned-GOTO statements.
  745.   -  Single trailing comma meaning "pass extra trailing null argument" in
  746.      list of actual arguments to procedure other than statement function
  747.      (e.g. "CALL FOO(,)" meaning "pass two null arguments" rather than
  748.      "pass one null argument").
  749.   -  DO loops with REAL or DOUBLE PRECISION DO variables (including
  750.      implied-DO loops in I/O and DATA statements).
  751.  
  752. As of 0.5.11, the -fugly-args and -fno-ugly-args options are available.
  753. The construct enabled via -fugly-args is one of those enabled via
  754. -fugly, and is:
  755.  
  756.   -  Passing of typeless and hollerith constants as actual arguments
  757.      in procedure invocations
  758.  
  759. As of 0.5.14, the -fugly-init and -fno-ugly-init options are available.
  760. The set of constructs enabled via -fugly-init is a subset of those
  761. enabled via -fugly, and is:
  762.  
  763.   -  Use of hollerith and typeless constants in contexts where they
  764.      set initial (compile-time) values for variables, arrays, and
  765.      named constants -- i.e. DATA and PARAMETER statements, plus
  766.      type-declaration statements specifying initial values
  767.   -  In the same contexts as above, use of character constants to
  768.      initialize numeric items and vice versa (one constant per item)
  769.  
  770. The defaults are "-fugly-args -fugly-init".  Note that specifying
  771. -fugly or -fno-ugly affects all related options, so that "-fugly-args
  772. -fno-ugly -fugly-init" would leave only the ugly-init option enabled.
  773.  
  774. *CASE SENSITIVITY IN SOURCE CODE*
  775.  
  776. There are 66 useful settings that affect case sensitivity, plus 10
  777. settings that are nearly useless, with the remaining 116 settings
  778. being either redundant or useless.
  779.  
  780. None of these settings have any effect on the contents of comments
  781. (the text after a "c" or "C" in Column 1, for example) or of character
  782. or Hollerith constants.  Note that things like the "E" in the statement
  783. "CALL FOO(3.2E10)" and the "TO" in "ASSIGN 10 TO LAB" are considered
  784. built-in keywords.
  785.  
  786. Low-level switches are identified in this discussion thusly:
  787.  
  788. A: Source Case Conversion:
  789.    0: Preserve (see Note 1)
  790.    1: Convert to Upper Case
  791.    2: Convert to Lower Case
  792.  
  793. B: Built-in Keyword Matching:
  794.    0: Match Any Case (per-character basis)
  795.    1: Match Upper Case Only
  796.    2: Match Lower Case Only
  797.    3: Match InitialCaps Only (see tables for spellings)
  798.  
  799. C: Built-in Intrinsic Matching:
  800.    0: Match Any Case (per-character basis)
  801.    1: Match Upper Case Only
  802.    2: Match Lower Case Only
  803.    3: Match InitialCaps Only (see tables for spellings)
  804.  
  805. D: User-defined Symbol Possibilities (warnings only)
  806.    0: Allow Any Case (per-character basis)
  807.    1: Allow Upper Case Only
  808.    2: Allow Lower Case Only
  809.    3: Allow InitialCaps Only (see Note 2)
  810.  
  811. Note 1: g77 will eventually support NAMELIST in a manner that is
  812. coordinate with these source switches, in that input will be
  813. expected to meet the same requirements as source code in terms
  814. of matching symbol names and keywords (for the exponent letters).
  815. Currently, however, NAMELIST is supported via the f2c library,
  816. which uppercases NAMELIST input and symbol names for matching.
  817. This means not only that NAMELIST output currently shows symbol
  818. (and keyword) names in uppercase even if lower-case source
  819. conversion (option A2) is selected, but that NAMELIST cannot be
  820. adequately supported when source case preservation (option A0)
  821. is selected.  If A0 is selected, a warning message will be
  822. output for each NAMELIST statement to this effect.  The behavior
  823. of the program is undefined at run time if two or more symbol names
  824. appear in a given NAMELIST such that the names are identical
  825. when converted to upper case (e.g. "NAMELIST /X/ VAR, Var, var").
  826. For complete and total elegance, perhaps there should be a warning
  827. when option A2 is selected, since the output of NAMELIST is currently
  828. in uppercase but will someday be lowercase (when a g77lib is written),
  829. but that seems to be overkill for a product in alpha (or even beta)
  830. test.
  831.  
  832. Note 2: Rules for InitialCaps names are:
  833.    -  Must be a single uppercase letter OR
  834.    -  Must start with an uppercase letter and contain at least one
  835.       lowercase letter
  836. So A, Ab, ABc, AbC, and Abc are valid InitialCaps names, but AB, A2, and
  837. ABC are not.  Note that most, but not all, built-in names meet these
  838. requirements -- the exceptions are some of the two-letter FORMAT
  839. specifiers, such as BN and BZ.
  840.  
  841. Here are the names of the corresponding command-line options for
  842. the stand-alone front end (ffe):
  843.  
  844. A0: -fsource-case-preserve
  845. A1: -fsource-case-upper
  846. A2: -fsource-case-lower
  847.  
  848. B0: -fmatch-case-any
  849. B1: -fmatch-case-upper
  850. B2: -fmatch-case-lower
  851. B3: -fmatch-case-initcap
  852.  
  853. C0: -fintrin-case-any
  854. C1: -fintrin-case-upper
  855. C2: -fintrin-case-lower
  856. C3: -fintrin-case-initcap
  857.  
  858. D0: -fsymbol-case-any
  859. D1: -fsymbol-case-upper
  860. D2: -fsymbol-case-lower
  861. D3: -fsymbol-case-initcap
  862.  
  863.  
  864. Useful combinations of the above settings, along with abbreviated
  865. option names that set some of these combinations all at once:
  866.  
  867.  1: A0--  B0---  C0---  D0---    -fcase-preserve
  868.  2: A0--  B0---  C0---  D-1--
  869.  3: A0--  B0---  C0---  D--2-
  870.  4: A0--  B0---  C0---  D---3
  871.  5: A0--  B0---  C-1--  D0---
  872.  6: A0--  B0---  C-1--  D-1--
  873.  7: A0--  B0---  C-1--  D--2-
  874.  8: A0--  B0---  C-1--  D---3
  875.  9: A0--  B0---  C--2-  D0---
  876. 10: A0--  B0---  C--2-  D-1--
  877. 11: A0--  B0---  C--2-  D--2-
  878. 12: A0--  B0---  C--2-  D---3
  879. 13: A0--  B0---  C---3  D0---
  880. 14: A0--  B0---  C---3  D-1--
  881. 15: A0--  B0---  C---3  D--2-
  882. 16: A0--  B0---  C---3  D---3
  883. 17: A0--  B-1--  C0---  D0---
  884. 18: A0--  B-1--  C0---  D-1--
  885. 19: A0--  B-1--  C0---  D--2-
  886. 20: A0--  B-1--  C0---  D---3
  887. 21: A0--  B-1--  C-1--  D0---
  888. 22: A0--  B-1--  C-1--  D-1--    -fcase-strict-upper
  889. 23: A0--  B-1--  C-1--  D--2-
  890. 24: A0--  B-1--  C-1--  D---3
  891. 25: A0--  B-1--  C--2-  D0---
  892. 26: A0--  B-1--  C--2-  D-1--
  893. 27: A0--  B-1--  C--2-  D--2-
  894. 28: A0--  B-1--  C--2-  D---3
  895. 29: A0--  B-1--  C---3  D0---
  896. 30: A0--  B-1--  C---3  D-1--
  897. 31: A0--  B-1--  C---3  D--2-
  898. 32: A0--  B-1--  C---3  D---3
  899. 33: A0--  B--2-  C0---  D0---
  900. 34: A0--  B--2-  C0---  D-1--
  901. 35: A0--  B--2-  C0---  D--2-
  902. 36: A0--  B--2-  C0---  D---3
  903. 37: A0--  B--2-  C-1--  D0---
  904. 38: A0--  B--2-  C-1--  D-1--
  905. 39: A0--  B--2-  C-1--  D--2-
  906. 40: A0--  B--2-  C-1--  D---3
  907. 41: A0--  B--2-  C--2-  D0---
  908. 42: A0--  B--2-  C--2-  D-1--
  909. 43: A0--  B--2-  C--2-  D--2-    -fcase-strict-lower
  910. 44: A0--  B--2-  C--2-  D---3
  911. 45: A0--  B--2-  C---3  D0---
  912. 46: A0--  B--2-  C---3  D-1--
  913. 47: A0--  B--2-  C---3  D--2-
  914. 48: A0--  B--2-  C---3  D---3
  915. 49: A0--  B---3  C0---  D0---
  916. 50: A0--  B---3  C0---  D-1--
  917. 51: A0--  B---3  C0---  D--2-
  918. 52: A0--  B---3  C0---  D---3
  919. 53: A0--  B---3  C-1--  D0---
  920. 54: A0--  B---3  C-1--  D-1--
  921. 55: A0--  B---3  C-1--  D--2-
  922. 56: A0--  B---3  C-1--  D---3
  923. 57: A0--  B---3  C--2-  D0---
  924. 58: A0--  B---3  C--2-  D-1--
  925. 59: A0--  B---3  C--2-  D--2-
  926. 60: A0--  B---3  C--2-  D---3
  927. 61: A0--  B---3  C---3  D0---
  928. 62: A0--  B---3  C---3  D-1--
  929. 63: A0--  B---3  C---3  D--2-
  930. 64: A0--  B---3  C---3  D---3    -fcase-initcap
  931. 65: A-1-  B01--  C01--  D01--    -fcase-upper
  932. 66: A--2  B0-2-  C0-2-  D0-2-    -fcase-lower
  933.  
  934. Number 22 is the "strict" ANSI FORTRAN 77 model whereas all input
  935. (except comments, character constants, and hollerith strings) must
  936. be entered in uppercase.  Use -fcase-strict-upper to specify this
  937. combination.
  938.  
  939. Number 43 is like Number 22 except all input must be lowercase.  Use
  940. -fcase-strict-lower to specify this combination.
  941.  
  942. Number 65 is the "classic" ANSI FORTRAN 77 model as implemented on many
  943. non-UNIX machines whereby all the source is translated to uppercase.
  944. Use -fcase-upper to specify this combination.
  945.  
  946. Number 66 is the "canonical" UNIX model whereby all the source is
  947. translated to lowercase.  Use -fcase-lower to specify this
  948. combination.
  949.  
  950. There are a few nearly useless combinations:
  951.  
  952. 67: A-1-  B01--  C01--  D--2-
  953. 68: A-1-  B01--  C01--  D---3
  954. 69: A-1-  B01--  C--23  D01--
  955. 70: A-1-  B01--  C--23  D--2-
  956. 71: A-1-  B01--  C--23  D---3
  957. 72: A--2  B01--  C0-2-  D-1--
  958. 73: A--2  B01--  C0-2-  D---3
  959. 74: A--2  B01--  C-1-3  D0-2-
  960. 75: A--2  B01--  C-1-3  D-1--
  961. 76: A--2  B01--  C-1-3  D---3
  962.  
  963. The above allow some programs to be compiled but with restrictions that
  964. make most useful programs impossible: Numbers 67 and 72 warn about
  965. _any_ user-defined symbol names (such as "SUBROUTINE FOO"); Numbers
  966. 68 and 73 warn about any user-defined symbol names longer than one
  967. character that don't have at least one non-alphabetic character after
  968. the first; Numbers 69 and 74 disallow any references to intrinsics; and
  969. Numbers 70, 71, 75, and 76 are combinations of the restrictions in
  970. 67+69, 68+69, 72+74, and 73+74, respectively.
  971.  
  972. All redundant combinations are shown in the above tables anyplace
  973. where more than one setting is shown for a low-level switch.  For
  974. example, "B0-2-" means either setting 0 or 2 is valid for switch B.
  975. The "proper" setting in such a case is the one that copies the setting
  976. of switch A -- any other setting might slightly reduce the speed of
  977. the compiler, though possibly to an unmeasurable extent.
  978.  
  979. All remaining combinations are useless in that they prevent successful
  980. compilation of non-null source files (source files with something other
  981. than comments).
  982.  
  983. *INTRINSIC GROUPS*
  984.  
  985. A given specific intrinsic belongs in one or more groups.  Each group
  986. is deleted, disabled, hidden, or enabled by default or a command-line
  987. option.  If a group is deleted, no intrinsics will be recognized as
  988. belonging to that group; if it is disabled, intrinsics will be recognized
  989. as belonging to the group but cannot be referenced (other than via
  990. the INTRINSIC statement) through that group; if hidden, intrinsics
  991. in that group are recognized and enabled (if implemented) only if
  992. the first mention of the actual name of an intrinsic is in an INTRINSIC
  993. statement; if enabled, intrinsics in that group are recognized and
  994. enabled (if implemented).
  995.  
  996. The distinction between deleting and disabling a group is illustrated
  997. by the following example.  Assume intrinsic FOO belongs only to group
  998. FGR.  If group FGR is deleted, the following program unit will successfully
  999. compile, because FOO() will be seen as a reference to an external
  1000. function named FOO:
  1001.  
  1002.       PRINT *, FOO()
  1003.       END
  1004.  
  1005. If group FGR is disabled, the above program unit will be compiled with
  1006. errors, either because the FOO intrinsic is improperly invoked or, if
  1007. properly invoked, it is not enabled.  To change the above program so it
  1008. references an external function FOO instead of the disabled FOO intrinsic,
  1009. add the following line to the top:
  1010.  
  1011.       EXTERNAL FOO
  1012.  
  1013. So, deleting a group tells g77 to pretend as though the intrinsics in
  1014. that group do not exist at all, whereas disabling it tells g77 to
  1015. recognize them as (disabled) intrinsics in intrinsic-like contexts.
  1016.  
  1017. Hiding a group is like enabling it, but the intrinsic must be first
  1018. named in an INTRINSIC statement to be considered a reference to the
  1019. intrinsic rather than to an external procedure.  This might be the
  1020. "safest" way to treat a new group of intrinsics when compiling old
  1021. code, because it allows the old code to be generally written as if
  1022. those new intrinsics never existed, but to be changed to use them
  1023. by inserting INTRINSIC statements in the appropriate places.  However,
  1024. it should be the goal of development to use EXTERNAL for all names
  1025. of external procedures that might be intrinsic names.
  1026.  
  1027. If an intrinsic is in more than one group, it is enabled if any of its
  1028. containing groups are enabled; if not so enabled, it is hidden if
  1029. any of its containing groups are hidden; if not so hidden, it is disabled
  1030. if any of its containing groups are disabled; if not so disabled, it is
  1031. deleted.  This extra complication is necessary because some intrinsics,
  1032. such as IBITS, belong to more than one group, and hence should be
  1033. enabled if any of the groups to which they belong are enabled, etc.
  1034.  
  1035. The groups are:
  1036.  
  1037. DCP -- DOUBLE COMPLEX intrinsics from the standards (F77, F90)
  1038. F2C -- Intrinsics supported by AT&T's f2c converter
  1039. F90 -- Fortran 90 intrinsics
  1040. MIL -- MIL-STD 1753 intrinsics (MVBITS, IAND, BTEST, and so on)
  1041. VXT -- VAX/VMS FORTRAN (as of V4) intrinsics
  1042.  
  1043. The command-line options are:
  1044.  
  1045. -fdcp-intrinsics-delete  -- Delete DCP intrinsics
  1046. -fdcp-intrinsics-hide    -- Hide DCP intrinsics
  1047. -fdcp-intrinsics-disable -- Disable DCP intrinsics
  1048. -fdcp-intrinsics-enable  -- Enable DCP intrinsics
  1049. -ff2c-intrinsics-delete  -- Delete F2C intrinsics
  1050. -ff2c-intrinsics-hide    -- Hide F2C intrinsics
  1051. -ff2c-intrinsics-disable -- Disable F2C intrinsics
  1052. -ff2c-intrinsics-enable  -- Enable F2C intrinsics
  1053. -ff90-intrinsics-delete  -- Delete F90 intrinsics
  1054. -ff90-intrinsics-hide    -- Hide F90 intrinsics
  1055. -ff90-intrinsics-disable -- Disable F90 intrinsics
  1056. -ff90-intrinsics-enable  -- Enable F90 intrinsics
  1057. -fmil-intrinsics-delete  -- Delete MIL intrinsics
  1058. -fmil-intrinsics-hide    -- Hide MIL intrinsics
  1059. -fmil-intrinsics-disable -- Disable MIL intrinsics
  1060. -fmil-intrinsics-enable  -- Enable MIL intrinsics
  1061. -fvxt-intrinsics-delete  -- Delete VXT intrinsics
  1062. -fvxt-intrinsics-hide    -- Hide VXT intrinsics
  1063. -fvxt-intrinsics-disable -- Disable VXT intrinsics
  1064. -fvxt-intrinsics-enable  -- Enable VXT intrinsics
  1065.  
  1066. *HOW TO DIAGNOSE BUGS*
  1067.  
  1068. If g77 crashes, that is a bug that you should report to
  1069. fortran@gnu.ai.mit.edu.  Enclose the command line that
  1070. crashed it, specifying the `-v' option after the `g77' command
  1071. so the configuration and version number is available in the
  1072. output you send with the bug report.  Also send along the
  1073. source code that crashes g77, plus any INCLUDEd or #include'd
  1074. files it uses.  (If you want to try running gdb on the g77
  1075. compiler itself, named f771, note that the global variables
  1076. lineno and input_filename usually are accurate for most kinds
  1077. of crashes, and the presence of an invocation of ffestd_exec_end()
  1078. on the stack indicates that g77 was in the second pass of processing
  1079. a program unit instead of the first pass.  This might help you
  1080. fix the bug or find a temporary workaround -- the fix and the
  1081. information should be sent in addition to the bug report.)
  1082.  
  1083. Diagnostics produced by g77 that you do not understand or expect
  1084. are not necessarily g77 bugs.  They might indicate problems with
  1085. your code that, perhaps, no other compiler has found.  Please check
  1086. out your code thoroughly, and read applicable g77 documentation,
  1087. before assuming g77 has a bug in this area.
  1088.  
  1089. If your program doesn't link, due to unresolved references to name
  1090. like "_main", make sure you're using the `g77' command to do the
  1091. link, since this command ensures that the necessary libraries are
  1092. loaded by specifying `-lf2c -lm' when it invokes the `gcc'
  1093. command to do the actual link.  (Use the `-v' option to discover
  1094. more about what actually happens when you use the `g77' and `gcc'
  1095. commands.)  Also, try specifying `-lc' as the last item on the g77
  1096. command line, because some systems need it and g77 doesn't do it
  1097. automatically.
  1098.  
  1099. If your program successfully compiles and links, but doesn't work,
  1100. either producing incorrect results or crashing, there are various
  1101. things you can try.  Among the things you should try with your code
  1102. before giving up, or assuming g77 or libf2c must have a bug, are
  1103. the following:
  1104.  
  1105. -  Compile all your Fortran code with `-O -Wall -Wimplicit'
  1106.    and make sure all the resulting warnings are ones you expect and
  1107.    understand.
  1108.  
  1109. -  Try using f2c instead of g77 to compile all your code, using the
  1110.    -C option with f2c (which checks array bounds -- g77 doesn't have
  1111.    such an option yet, which is why you have to use f2c), and link
  1112.    and run the resulting program trying to reproduce the bug.
  1113.  
  1114. If a run-time bug occurs both when your program is compiled with g77
  1115. and when compiled with f2c, that suggests (but does not prove) that
  1116. the bug is not in g77, rather that it is either in your own code
  1117. (quite likely), in libf2c, in gcc, or elsewhere.  Probably 99% of the
  1118. time the bug is in your own code, EVEN IN CASES WHERE YOUR OWN CODE
  1119. "WORKS" WITH OTHER COMPILERS.  Please follow the instructions above
  1120. to try and find bugs in your code before submitting bug reports.
  1121.  
  1122. *SUMMARY OF OVERLY CONVENIENT COMMAND-LINE OPTIONS*
  1123.  
  1124. These options should be used only as a quick-and-dirty way to determine
  1125. how well your program will run under different compilation models
  1126. without having to change the source.  Some are more problematic
  1127. than others, depending on how portable and maintainable you want the
  1128. program to be (and, of course, whether you are allowed to change it
  1129. at all is crucial).
  1130.  
  1131. You should not continue to use these command-line options to compile
  1132. a given program, but rather should make changes to the source code:
  1133.  
  1134. -finit-local-zero
  1135.     Use explicit DATA (or other initial-value-setting) statements
  1136.     to initialize local variables and arrays to zero -- consider using
  1137.     -Wuninitialized (which requires -O) first to find likely candidates.
  1138. -fno-automatic
  1139.     Use SAVE statements in the appropriate places instead.  Consider
  1140.     using -Wuninitialized (which requires -O) to find likely candidates.
  1141. -fugly*
  1142.     Fix the source code so that -fno-ugly (the default) will work.
  1143.     Note that, for many programs, it is difficult to practically
  1144.     avoid using the features enabled via -fugly-init, and these
  1145.     features pose the lowest risk of writing nonportable code of the
  1146.     various "ugly" features.
  1147. -fxxx-intrinsics-hide
  1148.     Change the source code to use EXTERNAL for any external procedure
  1149.     that might be the name of an intrinsic.  It is easy to find these
  1150.     using -fxxx-intrinsics-disable.
  1151.