/* Definitions and documentations for attributes used in GNU F77 compiler
   Copyright (C) 1995, 1996 Free Software Foundation, Inc.
   Contributed by James Craig Burley.

This file is part of GNU Fortran.

GNU Fortran is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Fortran is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Fortran; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */

/* "How g77 learns about symbols"

   There are three primary things in a symbol that g77 uses to keep
   track of what it has learned about that symbol:

   1.  The state
   2.  The attributes
   3.  The info

   State, attributes, and info (see f-info* files) all start out with
   "NONE" fields when a symbol is first created.

   In a PROGRAM or BLOCK DATA program unit, info where cannot be DUMMY
   or RESULT.  Any combinations including those possibilities are not
   considered possible in such program units.

   As soon as a symbol is created, it _must_ have its state changed to
   SEEN, UNCERTAIN, or UNDERSTOOD.

   If SEEN, some info might be set, such as the type info (as in when
   the TYPE attribute is present) or kind/where info.

   If UNCERTAIN, the permitted combinations of attributes and info are
   listed below.  Only the attributes ACTUALARG, ADJUSTABLE, ANYLEN, ARRAY,
   DUMMY, EXTERNAL, SFARG, and TYPE are permitted.  (All these attributes
   are contrasted to each attribute below, even though some combinations
   wouldn't be permitted in SEEN state either.)  Note that DUMMY and
   RESULT are not permitted in a PROGRAM/BLOCKDATA program unit, which
   results in some of the combinations below not occurring (not UNCERTAIN,
   but UNDERSTOOD).

   ANYLEN|TYPE & ~(ACTUALARG|ADJUSTABLE|ARRAY|DUMMY|EXTERNAL|SFARG):
	ENTITY/DUMMY, ENTITY/RESULT, FUNCTION/INTRINSIC.

   ARRAY & ~(ACTUALARG|ANYLEN|DUMMY|EXTERNAL|SFARG|TYPE):
	ENTITY/DUMMY, ENTITY/LOCAL.

   ARRAY|TYPE & ~(ACTUALARG|ANYLEN|DUMMY|EXTERNAL|SFARG):
	ENTITY/DUMMY, ENTITY/LOCAL.

   DUMMY & ~(ACTUALARG|ADJUSTABLE|ANYLEN|ARRAY|EXTERNAL|SFARG|TYPE):
	ENTITY/DUMMY, FUNCTION/DUMMY, SUBROUTINE/DUMMY.

   DUMMY|TYPE & ~(ACTUALARG|ADJUSTABLE|ANYLEN|ARRAY|EXTERNAL|SFARG):
	ENTITY/DUMMY, FUNCTION/DUMMY.

   EXTERNAL & ~(ACTUALARG|ADJUSTABLE|ANYLEN|ARRAY|DUMMY|SFARG|TYPE):
	FUNCTION/DUMMY, FUNCTION/GLOBAL, SUBROUTINE/DUMMY,
	SUBROUTINE/GLOBAL, BLOCKDATA/GLOBAL.

   EXTERNAL|ACTUALARG & ~(ADJUSTABLE|ANYLEN|ARRAY|DUMMY|SFARG|TYPE):
	FUNCTION/GLOBAL, SUBROUTINE/GLOBAL.

   EXTERNAL|DUMMY & ~(ACTUALARG|ADJUSTABLE|ANYLEN|ARRAY|SFARG|TYPE):
	FUNCTION/DUMMY, SUBROUTINE/DUMMY.

   EXTERNAL|TYPE & ~(ACTUALARG|ADJUSTABLE|ANYLEN|ARRAY|DUMMY|SFARG):
	FUNCTION/DUMMY, FUNCTION/GLOBAL.

   SFARG & ~(ACTUALARG|ADJUSTABLE|ANYLEN|ARRAY|DUMMY|EXTERNAL|TYPE):
	ENTITY/DUMMY, ENTITY/LOCAL.

   SFARG|TYPE & ~(ACTUALARG|ADJUSTABLE|ANYLEN|ARRAY|DUMMY|EXTERNAL):
	ENTITY/DUMMY, ENTITY/LOCAL.

   TYPE & ~(ACTUALARG|ANYLEN|ARRAY|DUMMY|EXTERNAL|SFARG):
	ENTITY/DUMMY, ENTITY/LOCAL, ENTITY/RESULT, FUNCTION/DUMMY,
	FUNCTION/GLOBAL, FUNCTION/INTRINSIC.

   If UNDERSTOOD, the attributes are no longer considered, and the info
   field is considered to be as fully filled in as possible by analyzing
   a single program unit.

   Each of the attributes (used only for SEEN/UNCERTAIN states) is
   defined and described below.  In many cases, a symbol starts out as
   SEEN and has attributes set as it is seen in various contexts prior
   to the first executable statement being seen (the "exec transition").
   Once that happens, either it becomes immediately UNDERSTOOD and all
   its info filled in, or it becomes UNCERTAIN and its info only partially
   filled in until it becomes UNDERSTOOD.  While UNCERTAIN, only a
   subset of attributes are possible/important.

   Not all symbols reach the UNDERSTOOD state, and in some cases symbols
   go immediately from NONE to the UNDERSTOOD or even UNCERTAIN state.
   For example, given "PROGRAM FOO", everything is known about the name
   "FOO", so it becomes immediately UNDERSTOOD.

   Also, there are multiple name spaces, and not all attributes are
   possible/permitted in all name spaces.

   The only attributes permitted in the global name space are:

   ANY, CBLOCK, SAVECBLOCK.

   The only attributes permitted in the local name space are:

   ANY, ACTUALARG, ADJUSTABLE, ADJUSTS, ANYLEN, ANYSIZE, ARRAY, COMMON,
   DUMMY, EQUIV, EXTERNAL, INIT, INTRINSIC, NAMELIST, RESULT, SAVE, SFARG,
   SFUNC, TYPE.

   In the stmt-func name space, no attributes are used, just the states.

*/


/* Actual argument.  Always accompanied by EXTERNAL.

   Context is a name used as an actual argument passed to a procedure
   other than a statement function.

   Valid in UNCERTAIN state and local name space only.

   This attribute is used only to flag the fact that an EXTERNAL'ed name
   has been seen as an actual argument, and therefore cannot be
   discovered later to be a DUMMY argument (via an ENTRY statement).

   If DUMMY + EXTERNAL already, it is permitted to see the name
   as an actual argument, but ACTUALARG is not added as an attribute since
   that fact does not improve knowledge about the name.  Hence it is not
   permitted to transition ACTUALARG + EXTERNAL += DUMMY, and the
   transition DUMMY + EXTERNAL += ACTUALARG is not actually done.

   Cannot be combined with: ANYLEN, ARRAY, DUMMY, SFARG, TYPE.

   Can be combined with: ACTUALARG, ANY, EXTERNAL.

   Unrelated: ADJUSTABLE, ADJUSTS, ANYSIZE, CBLOCK, COMMON, EQUIV, INIT,
   INTRINSIC, NAMELIST, RESULT, SAVE, SAVECBLOCK, SFUNC.

*/

DEFATTR (FFESYMBOL_attrACTUALARG, FFESYMBOL_attrsACTUALARG, "ACTUALARG")
#ifndef FFESYMBOL_attrsACTUALARG
#define FFESYMBOL_attrsACTUALARG ((ffesymbolAttrs) 1 << FFESYMBOL_attrACTUALARG)
#endif

/* Has adjustable dimension(s).  Always accompanied by ARRAY.

   Context is an ARRAY-attributed name with an adjustable dimension (at
   least one dimension containing a variable reference).

   Valid in SEEN state and local name space only.

   Cannot be combined with: ADJUSTABLE, ADJUSTS, COMMON, EQUIV, EXTERNAL,
   NAMELIST, INIT, INTRINSIC, RESULT, SAVE, SFARG, SFUNC.

   Can be combined with: ANY, ANYLEN, ANYSIZE, ARRAY, TYPE.

   Must be combined with: DUMMY.

   Unrelated: ACTUALARG, CBLOCK, SAVECBLOCK.

*/

DEFATTR (FFESYMBOL_attrADJUSTABLE, FFESYMBOL_attrsADJUSTABLE, "ADJUSTABLE")
#ifndef FFESYMBOL_attrsADJUSTABLE
#define FFESYMBOL_attrsADJUSTABLE ((ffesymbolAttrs) 1 << FFESYMBOL_attrADJUSTABLE)
#endif

/* Adjusts an array.

   Context is an expression in an array declarator, such as in a
   DIMENSION, COMMON, or type-specification statement.

   Valid in SEEN state and local name space only.

   Cannot be combined with: ADJUSTABLE, ANYLEN, ANYSIZE, ARRAY,
   EXTERNAL, INTRINSIC, RESULT, SAVE, SFUNC.

   Can be combined with: ADJUSTS, ANY, COMMON, DUMMY, EQUIV, INIT,
   NAMELIST, SFARG, TYPE.

   Unrelated: ACTUALARG, CBLOCK, SAVECBLOCK.

*/

DEFATTR (FFESYMBOL_attrADJUSTS, FFESYMBOL_attrsADJUSTS, "ADJUSTS")
#ifndef FFESYMBOL_attrsADJUSTS
#define FFESYMBOL_attrsADJUSTS ((ffesymbolAttrs) 1 << FFESYMBOL_attrADJUSTS)
#endif

/* Can be anything now, diagnostic has been issued at least once.

   Valid in UNDERSTOOD state only.  Valid in any name space.

   Can be combined with anything.

*/

DEFATTR (FFESYMBOL_attrANY, FFESYMBOL_attrsANY, "ANY")
#ifndef FFESYMBOL_attrsANY
#define FFESYMBOL_attrsANY ((ffesymbolAttrs) 1 << FFESYMBOL_attrANY)
#endif

/* Assumed (any) length.  Always accompanied by TYPE.

   Context is a name listed in a CHARACTER statement and given a length
   specification of (*).

   Valid in SEEN and UNCERTAIN states.  Valid in local name space only.

   In SEEN state, attributes marked below with "=" are unrelated.

   In UNCERTAIN state, attributes marked below with "+" are unrelated,
   attributes marked below with "-" cannot be combined with ANYLEN,
   and attributes marked below with "!" transition to state UNDERSTOOD
   instead of acquiring the new attribute.  Any other subsequent mentioning
   of the name transitions to state UNDERSTOOD.  UNCERTAIN state is not
   valid for this attribute in PROGRAM/BLOCKDATA program unit.

   Cannot be combined with: ACTUALARG=, ADJUSTS+, ANYLEN, COMMON+, EQUIV+,
   EXTERNAL, INIT+, INTRINSIC+, NAMELIST+, SAVE+, SFARG, SFUNC+.

   Can be combined with: ADJUSTABLE+, ANY, ANYSIZE+, ARRAY-, DUMMY!, RESULT+,
   TYPE.

   Unrelated: CBLOCK, SAVECBLOCK.

   In PROGRAM/BLOCKDATA, cannot be combined with ARRAY.

*/

DEFATTR (FFESYMBOL_attrANYLEN, FFESYMBOL_attrsANYLEN, "ANYLEN")
#ifndef FFESYMBOL_attrsANYLEN
#define FFESYMBOL_attrsANYLEN ((ffesymbolAttrs) 1 << FFESYMBOL_attrANYLEN)
#endif

/* Has assumed (any) size.  Always accompanied by ARRAY.

   Context is an ARRAY-attributed name with its last dimension having
   an upper bound of "*".

   Valid in SEEN state and local name space only.

   Cannot be combined with: ADJUSTS, ANYSIZE, COMMON, EQUIV, EXTERNAL,
   NAMELIST, INIT, INTRINSIC, RESULT, SAVE, SFARG, SFUNC.

   Can be combined with: ADJUSTABLE, ANY, ANYLEN, ARRAY, TYPE.

   Must be combined with: DUMMY.

   Unrelated: ACTUALARG, CBLOCK, SAVECBLOCK.

*/

DEFATTR (FFESYMBOL_attrANYSIZE, FFESYMBOL_attrsANYSIZE, "ANYSIZE")
#ifndef FFESYMBOL_attrsANYSIZE
#define FFESYMBOL_attrsANYSIZE ((ffesymbolAttrs) 1 << FFESYMBOL_attrANYSIZE)
#endif

/* Array.

   Context is a name followed by an array declarator, such as in a
   type-statement-decl, a DIMENSION statement, or a COMMON statement.

   Valid in SEEN and UNCERTAIN states.  Valid in local name space only.

   In SEEN state, attributes marked below with "=" are unrelated.

   In UNCERTAIN state, attributes marked below with "+" are unrelated,
   attributes marked below with "-" cannot be combined with ARRAY,
   and attributes marked below with "!" transition to state UNDERSTOOD
   instead of acquiring the new attribute.  Any other subsequent mentioning
   of the name transitions to state UNDERSTOOD.  UNCERTAIN state is not
   valid for this attribute in PROGRAM/BLOCKDATA program unit.

   Cannot be combined with: ACTUALARG=, ADJUSTS+, ARRAY, EXTERNAL,
   INTRINSIC+, RESULT+, SFARG, SFUNC+.

   Can be combined with: ADJUSTABLE+, ANY, ANYLEN-, ANYSIZE+, COMMON+,
   DUMMY!, EQUIV+, INIT+, NAMELIST+, SAVE+, TYPE.

   Unrelated: CBLOCK, SAVECBLOCK.

   In PROGRAM/BLOCKDATA, cannot be combined with ANYLEN.
   Cannot follow INIT.

*/

DEFATTR (FFESYMBOL_attrARRAY, FFESYMBOL_attrsARRAY, "ARRAY")
#ifndef FFESYMBOL_attrsARRAY
#define FFESYMBOL_attrsARRAY ((ffesymbolAttrs) 1 << FFESYMBOL_attrARRAY)
#endif

/* COMMON block.

   Context is a name enclosed in slashes in a COMMON statement.

   Valid in SEEN state and global name space only.

   Cannot be combined with:

   Can be combined with: CBLOCK, SAVECBLOCK.

   Unrelated: ACTUALARG, ADJUSTABLE, ADJUSTS, ANY, ANYLEN, ANYSIZE,
   ARRAY, COMMON, DUMMY, EQUIV, EXTERNAL, INIT, INTRINSIC, NAMELIST,
   RESULT, SAVE, SFARG, SFUNC, TYPE.

*/

DEFATTR (FFESYMBOL_attrCBLOCK, FFESYMBOL_attrsCBLOCK, "CBLOCK")
#ifndef FFESYMBOL_attrsCBLOCK
#define FFESYMBOL_attrsCBLOCK ((ffesymbolAttrs) 1 << FFESYMBOL_attrCBLOCK)
#endif

/* Placed in COMMON.

   Context is a name listed in a COMMON statement but not enclosed in
   slashes.

   Valid in SEEN state and local name space only.

   Cannot be combined with: ADJUSTABLE, ANYLEN, ANYSIZE, COMMON, DUMMY,
   EXTERNAL, INTRINSIC, RESULT, SAVE, SFUNC.

   Can be combined with: ADJUSTS, ANY, ARRAY, EQUIV, INIT, NAMELIST,
   SFARG, TYPE.

   Unrelated: ACTUALARG, CBLOCK, SAVECBLOCK.

*/

DEFATTR (FFESYMBOL_attrCOMMON, FFESYMBOL_attrsCOMMON, "COMMON")
#ifndef FFESYMBOL_attrsCOMMON
#define FFESYMBOL_attrsCOMMON ((ffesymbolAttrs) 1 << FFESYMBOL_attrCOMMON)
#endif

/* Dummy argument.

   Context is a name listed in the arglist of FUNCTION, SUBROUTINE, ENTRY.
   (Statement-function definitions have dummy arguments, but since they're
   the only possible entities in the statement-function name space, this
   attribution mechanism isn't used for them.)

   Valid in SEEN and UNCERTAIN states.  Valid in local name space only.

   In SEEN state, attributes marked below with "=" are unrelated.

   In UNCERTAIN state, attributes marked below with "+" are unrelated,
   attributes marked below with "-" cannot be combined with DUMMY,
   and attributes marked below with "!" transition to state UNDERSTOOD
   instead of acquiring the new attribute.  Any other subsequent mentioning
   of the name transitions to state UNDERSTOOD.  UNCERTAIN state is not
   valid for this attribute in PROGRAM/BLOCKDATA program unit.

   Cannot be combined with: ACTUALARG=, COMMON+, EQUIV+, INIT+, INTRINSIC+,
   NAMELIST+, RESULT+, SAVE+, SFUNC+.

   Can be combined with: ADJUSTABLE+, ADJUSTS+, ANY, ANYLEN-, ANYSIZE+,
   ARRAY-, DUMMY, EXTERNAL, SFARG-, TYPE.

   Unrelated: CBLOCK, SAVECBLOCK.

   VXT Fortran disallows DUMMY + NAMELIST.
   F90 allows DUMMY + NAMELIST (with some restrictions), g77 doesn't yet.

*/

DEFATTR (FFESYMBOL_attrDUMMY, FFESYMBOL_attrsDUMMY, "DUMMY")
#ifndef FFESYMBOL_attrsDUMMY
#define FFESYMBOL_attrsDUMMY ((ffesymbolAttrs) 1 << FFESYMBOL_attrDUMMY)
#endif

/* EQUIVALENCE'd.

   Context is a name given in an EQUIVALENCE statement.

   Valid in SEEN state and local name space only.

   Cannot be combined with: ADJUSTABLE, ANYLEN, ANYSIZE, DUMMY,
   EXTERNAL, INTRINSIC, RESULT, SFUNC.

   Can be combined with: ADJUSTS, ANY, ARRAY, COMMON, EQUIV, INIT,
   NAMELIST, SAVE, SFARG, TYPE.

   Unrelated: ACTUALARG, CBLOCK, SAVECBLOCK.

*/

DEFATTR (FFESYMBOL_attrEQUIV, FFESYMBOL_attrsEQUIV, "EQUIV")
#ifndef FFESYMBOL_attrsEQUIV
#define FFESYMBOL_attrsEQUIV ((ffesymbolAttrs) 1 << FFESYMBOL_attrEQUIV)
#endif

/* EXTERNAL.

   Context is a name listed in an EXTERNAL statement.

   Valid in SEEN and UNCERTAIN states.  Valid in local name space only.

   In SEEN state, attributes marked below with "=" are unrelated.

   In UNCERTAIN state, attributes marked below with "+" are unrelated,
   attributes marked below with "-" cannot be combined with EXTERNAL,
   and attributes marked below with "!" transition to state UNDERSTOOD
   instead of acquiring the new attribute.  Many other subsequent mentionings
   of the name transitions to state UNDERSTOOD.  UNCERTAIN state is not
   valid for this attribute in PROGRAM/BLOCKDATA program unit.

   Cannot be combined with: ADJUSTABLE+, ADJUSTS+, ANYLEN, ANYSIZE+,
   ARRAY, COMMON+, EQUIV+, EXTERNAL, INIT+, INTRINSIC+, NAMELIST+, RESULT+,
   SAVE+, SFARG, SFUNC+.

   Can be combined with: ACTUALARG=, ANY, DUMMY, TYPE.

   Unrelated: CBLOCK, SAVECBLOCK.

*/

DEFATTR (FFESYMBOL_attrEXTERNAL, FFESYMBOL_attrsEXTERNAL, "EXTERNAL")
#ifndef FFESYMBOL_attrsEXTERNAL
#define FFESYMBOL_attrsEXTERNAL ((ffesymbolAttrs) 1 << FFESYMBOL_attrEXTERNAL)
#endif

/* Given an initial value.

   Context is a name listed in a type-def-stmt such as INTEGER or REAL
   and given an initial value or values.  Someday will also include
   names in DATA statements, which currently immediately exec-transition
   their targets.

   Valid in SEEN state and local name space only.

   Cannot be combined with: ADJUSTABLE, ANYLEN, ANYSIZE, DUMMY, EXTERNAL,
   INIT, INTRINSIC, RESULT, SFUNC.

   Can be combined with: ADJUSTS, ANY, ARRAY, COMMON, EQUIV, NAMELIST,
   SAVE, SFARG, TYPE.

   Unrelated: ACTUALARG, CBLOCK, SAVECBLOCK.

   Cannot be followed by ARRAY.

*/

DEFATTR (FFESYMBOL_attrINIT, FFESYMBOL_attrsINIT, "INIT")
#ifndef FFESYMBOL_attrsINIT
#define FFESYMBOL_attrsINIT ((ffesymbolAttrs) 1 << FFESYMBOL_attrINIT)
#endif

/* INTRINSIC.

   Context is a name listed in an INTRINSIC statement.

   Valid in SEEN state and local name space only.

   Cannot be combined with: ADJUSTABLE, ADJUSTS, ANYLEN, ANYSIZE, ARRAY,
   COMMON, DUMMY, EQUIV, EXTERNAL, INIT, INTRINSIC, NAMELIST, RESULT,
   SAVE, SFARG, SFUNC.

   Can be combined with: ANY, TYPE.

   Unrelated: ACTUALARG, CBLOCK, SAVECBLOCK.

*/

DEFATTR (FFESYMBOL_attrINTRINSIC, FFESYMBOL_attrsINTRINSIC, "INTRINSIC")
#ifndef FFESYMBOL_attrsINTRINSIC
#define FFESYMBOL_attrsINTRINSIC ((ffesymbolAttrs) 1 << FFESYMBOL_attrINTRINSIC)
#endif

/* NAMELISTed.

   Context is a name listed in a NAMELIST statement but not enclosed in
   slashes.

   Valid in SEEN state and local name space only.

   Cannot be combined with: ADJUSTABLE, ANYLEN, ANYSIZE, DUMMY, EXTERNAL,
   INTRINSIC, RESULT, SFUNC.

   Can be combined with: ADJUSTS, ANY, ARRAY, COMMON, EQUIV, INIT,
   NAMELIST, SAVE, SFARG, TYPE.

   Unrelated: ACTUALARG, CBLOCK, SAVECBLOCK.

*/

DEFATTR (FFESYMBOL_attrNAMELIST, FFESYMBOL_attrsNAMELIST, "NAMELIST")
#ifndef FFESYMBOL_attrsNAMELIST
#define FFESYMBOL_attrsNAMELIST ((ffesymbolAttrs) 1 << FFESYMBOL_attrNAMELIST)
#endif

/* RESULT of a function.

   Context is name in RESULT() clause in FUNCTION or ENTRY statement, or
   the name in a FUNCTION or ENTRY statement (within a FUNCTION subprogram)
   that has no RESULT() clause.

   Valid in SEEN state and local name space only.

   Cannot be combined with: ADJUSTABLE, ADJUSTS, ANYSIZE, ARRAY, COMMON,
   DUMMY, EQUIV, EXTERNAL, INIT, INTRINSIC, NAMELIST, RESULT, SAVE, SFUNC.

   Can be combined with: ANY, ANYLEN, SFARG, TYPE.

   Unrelated: ACTUALARG, CBLOCK, SAVECBLOCK.

   Cannot be preceded by SFARG.

*/

DEFATTR (FFESYMBOL_attrRESULT, FFESYMBOL_attrsRESULT, "RESULT")
#ifndef FFESYMBOL_attrsRESULT
#define FFESYMBOL_attrsRESULT ((ffesymbolAttrs) 1 << FFESYMBOL_attrRESULT)
#endif

/* SAVEd (not enclosed in slashes).

   Context is a name listed in a SAVE statement but not enclosed in slashes.

   Valid in SEEN state and local name space only.

   Cannot be combined with: ADUSTABLE, ADJUSTS, ANYLEN, ANYSIZE, COMMON,
   DUMMY, EXTERNAL, INTRINSIC, RESULT, SAVE, SFUNC.

   Can be combined with: ANY, ARRAY, EQUIV, INIT, NAMELIST,
   SFARG, TYPE.

   Unrelated: ACTUALARG, CBLOCK, SAVECBLOCK.

*/

DEFATTR (FFESYMBOL_attrSAVE, FFESYMBOL_attrsSAVE, "SAVE")
#ifndef FFESYMBOL_attrsSAVE
#define FFESYMBOL_attrsSAVE ((ffesymbolAttrs) 1 << FFESYMBOL_attrSAVE)
#endif

/* SAVEd (enclosed in slashes).

   Context is a name enclosed in slashes in a SAVE statement.

   Valid in SEEN state and global name space only.

   Cannot be combined with: SAVECBLOCK.

   Can be combined with: CBLOCK.

   Unrelated: ACTUALARG, ADJUSTABLE, ADJUSTS, ANY, ANYLEN, ANYSIZE,
   ARRAY, COMMON, DUMMY, EQUIV, EXTERNAL, INIT, INTRINSIC, NAMELIST,
   RESULT, SAVE, SFARG, SFUNC, TYPE.

*/

DEFATTR (FFESYMBOL_attrSAVECBLOCK, FFESYMBOL_attrsSAVECBLOCK, "SAVECBLOCK")
#ifndef FFESYMBOL_attrsSAVECBLOCK
#define FFESYMBOL_attrsSAVECBLOCK ((ffesymbolAttrs) 1 << FFESYMBOL_attrSAVECBLOCK)
#endif

/* Name used as a statement function arg or DATA implied-DO iterator.

   Context is a name listed in the arglist of statement-function-definition
   or as the iterator in an implied-DO construct in a DATA statement.

   Valid in SEEN and UNCERTAIN states.  Valid in local name space only.

   In SEEN state, attributes marked below with "=" are unrelated.

   In UNCERTAIN state, attributes marked below with "+" are unrelated,
   attributes marked below with "-" cannot be combined with SFARG,
   and attributes marked below with "!" transition to state UNDERSTOOD
   instead of acquiring the new attribute.  Any other subsequent mentioning
   of the name transitions to state UNDERSTOOD.  UNCERTAIN state is not
   valid for this attribute in PROGRAM/BLOCKDATA program unit.

   Cannot be combined with: ACTUALARG=, ADJUSTABLE+, ANYLEN, ANYSIZE+,
   ARRAY, EXTERNAL, INTRINSIC+, SFUNC+.

   Can be combined with: ADJUSTS+, ANY, COMMON+, DUMMY!, EQUIV+, INIT+,
   NAMELIST+, RESULT+, SAVE+, SFARG, TYPE.

   Unrelated: CBLOCK, SAVECBLOCK.

   Cannot be followed by RESULT.

*/

DEFATTR (FFESYMBOL_attrSFARG, FFESYMBOL_attrsSFARG, "SFARG")
#ifndef FFESYMBOL_attrsSFARG
#define FFESYMBOL_attrsSFARG ((ffesymbolAttrs) 1 << FFESYMBOL_attrSFARG)
#endif

/* Statement function name.

   Context is a statement-function-definition statement, the name being
   defined.

   Valid in SEEN state and local name space only.

   Cannot be combined with: ADJUSTABLE, ADJUSTS, ANYLEN, ANYSIZE, ARRAY,
   COMMON, DUMMY, EQUIV, EXTERNAL, INIT, INTRINSIC, NAMELIST, RESULT,
   SAVE, SFARG, SFUNC.

   Can be combined with: ANY, TYPE.

   Unrelated: ACTUALARG, CBLOCK, SAVECBLOCK.

*/

DEFATTR (FFESYMBOL_attrSFUNC, FFESYMBOL_attrsSFUNC, "SFUNC")
#ifndef FFESYMBOL_attrsSFUNC
#define FFESYMBOL_attrsSFUNC ((ffesymbolAttrs) 1 << FFESYMBOL_attrSFUNC)
#endif

/* Explicitly typed.

   Context is a name listed in a type-def-stmt such as INTEGER or REAL.

   Valid in SEEN and UNCERTAIN states.  Valid in local name space only.

   In SEEN state, attributes marked below with "=" are unrelated.

   In UNCERTAIN state, attributes marked below with "+" are unrelated,
   attributes marked below with "-" cannot be combined with TYPE,
   and attributes marked below with "!" transition to state UNDERSTOOD
   instead of acquiring the new attribute.  Many other subsequent mentionings
   of the name transitions to state UNDERSTOOD.  UNCERTAIN state is not
   valid for this attribute in PROGRAM/BLOCKDATA program unit.

   Cannot be combined with: ACTUALARG=, TYPE.

   Can be combined with: ADJUSTABLE+, ADJUSTS+, ANY, ANYLEN, ANYSIZE+,
   ARRAY, COMMON+, DUMMY, EQUIV+, EXTERNAL, INIT+, INTRINSIC+, NAMELIST+,
   RESULT+, SAVE+, SFARG, SFUNC+.

   Unrelated: CBLOCK, SAVECBLOCK.

*/

DEFATTR (FFESYMBOL_attrTYPE, FFESYMBOL_attrsTYPE, "TYPE")
#ifndef FFESYMBOL_attrsTYPE
#define FFESYMBOL_attrsTYPE ((ffesymbolAttrs) 1 << FFESYMBOL_attrTYPE)
#endif
