LCOV - code coverage report
Current view: top level - gcc/fortran - gfortran.h (source / functions) Hit Total Coverage
Test: gcc.info Lines: 7 7 100.0 %
Date: 2020-03-28 11:57:23 Functions: 1 1 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /* gfortran header file
       2                 :            :    Copyright (C) 2000-2020 Free Software Foundation, Inc.
       3                 :            :    Contributed by Andy Vaught
       4                 :            : 
       5                 :            : This file is part of GCC.
       6                 :            : 
       7                 :            : GCC is free software; you can redistribute it and/or modify it under
       8                 :            : the terms of the GNU General Public License as published by the Free
       9                 :            : Software Foundation; either version 3, or (at your option) any later
      10                 :            : version.
      11                 :            : 
      12                 :            : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13                 :            : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14                 :            : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15                 :            : for more details.
      16                 :            : 
      17                 :            : You should have received a copy of the GNU General Public License
      18                 :            : along with GCC; see the file COPYING3.  If not see
      19                 :            : <http://www.gnu.org/licenses/>.  */
      20                 :            : 
      21                 :            : #ifndef GCC_GFORTRAN_H
      22                 :            : #define GCC_GFORTRAN_H
      23                 :            : 
      24                 :            : /* It's probably insane to have this large of a header file, but it
      25                 :            :    seemed like everything had to be recompiled anyway when a change
      26                 :            :    was made to a header file, and there were ordering issues with
      27                 :            :    multiple header files.  Besides, Microsoft's winnt.h was 250k last
      28                 :            :    time I looked, so by comparison this is perfectly reasonable.  */
      29                 :            : 
      30                 :            : #ifndef GCC_CORETYPES_H
      31                 :            : #error "gfortran.h must be included after coretypes.h"
      32                 :            : #endif
      33                 :            : 
      34                 :            : /* In order for the format checking to accept the Fortran front end
      35                 :            :    diagnostic framework extensions, you must include this file before
      36                 :            :    diagnostic-core.h, not after.  We override the definition of GCC_DIAG_STYLE
      37                 :            :    in c-common.h.  */
      38                 :            : #undef GCC_DIAG_STYLE
      39                 :            : #define GCC_DIAG_STYLE __gcc_gfc__
      40                 :            : #if defined(GCC_DIAGNOSTIC_CORE_H)
      41                 :            : #error \
      42                 :            : In order for the format checking to accept the Fortran front end diagnostic \
      43                 :            : framework extensions, you must include this file before diagnostic-core.h, \
      44                 :            : not after.
      45                 :            : #endif
      46                 :            : 
      47                 :            : /* Declarations common to the front-end and library are put in
      48                 :            :    libgfortran/libgfortran_frontend.h  */
      49                 :            : #include "libgfortran.h"
      50                 :            : 
      51                 :            : 
      52                 :            : #include "intl.h"
      53                 :            : #include "splay-tree.h"
      54                 :            : 
      55                 :            : /* Major control parameters.  */
      56                 :            : 
      57                 :            : #define GFC_MAX_SYMBOL_LEN 63   /* Must be at least 63 for F2003.  */
      58                 :            : #define GFC_LETTERS 26          /* Number of letters in the alphabet.  */
      59                 :            : 
      60                 :            : #define MAX_SUBRECORD_LENGTH 2147483639   /* 2**31-9 */
      61                 :            : 
      62                 :            : 
      63                 :            : #define gfc_is_whitespace(c) ((c==' ') || (c=='\t') || (c=='\f'))
      64                 :            : 
      65                 :            : /* Macros to check for groups of structure-like types and flavors since
      66                 :            :    derived types, structures, maps, unions are often treated similarly. */
      67                 :            : #define gfc_bt_struct(t) \
      68                 :            :   ((t) == BT_DERIVED || (t) == BT_UNION)
      69                 :            : #define gfc_fl_struct(f) \
      70                 :            :   ((f) == FL_DERIVED || (f) == FL_UNION || (f) == FL_STRUCT)
      71                 :            : #define case_bt_struct case BT_DERIVED: case BT_UNION
      72                 :            : #define case_fl_struct case FL_DERIVED: case FL_UNION: case FL_STRUCT
      73                 :            : 
      74                 :            : /* Stringization.  */
      75                 :            : #define stringize(x) expand_macro(x)
      76                 :            : #define expand_macro(x) # x
      77                 :            : 
      78                 :            : /* For the runtime library, a standard prefix is a requirement to
      79                 :            :    avoid cluttering the namespace with things nobody asked for.  It's
      80                 :            :    ugly to look at and a pain to type when you add the prefix by hand,
      81                 :            :    so we hide it behind a macro.  */
      82                 :            : #define PREFIX(x) "_gfortran_" x
      83                 :            : #define PREFIX_LEN 10
      84                 :            : 
      85                 :            : /* A prefix for internal variables, which are not user-visible.  */
      86                 :            : #if !defined (NO_DOT_IN_LABEL)
      87                 :            : # define GFC_PREFIX(x) "_F." x
      88                 :            : #elif !defined (NO_DOLLAR_IN_LABEL)
      89                 :            : # define GFC_PREFIX(x) "_F$" x
      90                 :            : #else
      91                 :            : # define GFC_PREFIX(x) "_F_" x
      92                 :            : #endif
      93                 :            : 
      94                 :            : #define BLANK_COMMON_NAME "__BLNK__"
      95                 :            : 
      96                 :            : /* Macro to initialize an mstring structure.  */
      97                 :            : #define minit(s, t) { s, NULL, t }
      98                 :            : 
      99                 :            : /* Structure for storing strings to be matched by gfc_match_string.  */
     100                 :            : typedef struct
     101                 :            : {
     102                 :            :   const char *string;
     103                 :            :   const char *mp;
     104                 :            :   int tag;
     105                 :            : }
     106                 :            : mstring;
     107                 :            : 
     108                 :            : 
     109                 :            : 
     110                 :            : /*************************** Enums *****************************/
     111                 :            : 
     112                 :            : /* Used when matching and resolving data I/O transfer statements.  */
     113                 :            : 
     114                 :            : enum io_kind
     115                 :            : { M_READ, M_WRITE, M_PRINT, M_INQUIRE };
     116                 :            : 
     117                 :            : 
     118                 :            : /* These are flags for identifying whether we are reading a character literal
     119                 :            :    between quotes or normal source code.  */
     120                 :            : 
     121                 :            : enum gfc_instring
     122                 :            : { NONSTRING = 0, INSTRING_WARN, INSTRING_NOWARN };
     123                 :            : 
     124                 :            : /* This is returned by gfc_notification_std to know if, given the flags
     125                 :            :    that were given (-std=, -pedantic) we should issue an error, a warning
     126                 :            :    or nothing.  */
     127                 :            : 
     128                 :            : enum notification
     129                 :            : { SILENT, WARNING, ERROR };
     130                 :            : 
     131                 :            : /* Matchers return one of these three values.  The difference between
     132                 :            :    MATCH_NO and MATCH_ERROR is that MATCH_ERROR means that a match was
     133                 :            :    successful, but that something non-syntactic is wrong and an error
     134                 :            :    has already been issued.  */
     135                 :            : 
     136                 :            : enum match
     137                 :            : { MATCH_NO = 1, MATCH_YES, MATCH_ERROR };
     138                 :            : 
     139                 :            : /* Used for different Fortran source forms in places like scanner.c.  */
     140                 :            : enum gfc_source_form
     141                 :            : { FORM_FREE, FORM_FIXED, FORM_UNKNOWN };
     142                 :            : 
     143                 :            : /* Expression node types.  */
     144                 :            : enum expr_t
     145                 :            :   { EXPR_UNKNOWN = 0, EXPR_OP = 1, EXPR_FUNCTION, EXPR_CONSTANT, EXPR_VARIABLE,
     146                 :            :   EXPR_SUBSTRING, EXPR_STRUCTURE, EXPR_ARRAY, EXPR_NULL, EXPR_COMPCALL, EXPR_PPC
     147                 :            : };
     148                 :            : 
     149                 :            : /* Array types.  */
     150                 :            : enum array_type
     151                 :            : { AS_EXPLICIT = 1, AS_ASSUMED_SHAPE, AS_DEFERRED,
     152                 :            :   AS_ASSUMED_SIZE, AS_IMPLIED_SHAPE, AS_ASSUMED_RANK,
     153                 :            :   AS_UNKNOWN
     154                 :            : };
     155                 :            : 
     156                 :            : enum ar_type
     157                 :            : { AR_FULL = 1, AR_ELEMENT, AR_SECTION, AR_UNKNOWN };
     158                 :            : 
     159                 :            : /* Statement label types. ST_LABEL_DO_TARGET is used for obsolescent warnings
     160                 :            :    related to shared DO terminations and DO targets which are neither END DO
     161                 :            :    nor CONTINUE; otherwise it is identical to ST_LABEL_TARGET.  */
     162                 :            : enum gfc_sl_type
     163                 :            : { ST_LABEL_UNKNOWN = 1, ST_LABEL_TARGET, ST_LABEL_DO_TARGET,
     164                 :            :   ST_LABEL_BAD_TARGET, ST_LABEL_FORMAT
     165                 :            : };
     166                 :            : 
     167                 :            : /* Intrinsic operators.  */
     168                 :            : enum gfc_intrinsic_op
     169                 :            : { GFC_INTRINSIC_BEGIN = 0,
     170                 :            :   INTRINSIC_NONE = -1, INTRINSIC_UPLUS = GFC_INTRINSIC_BEGIN,
     171                 :            :   INTRINSIC_UMINUS, INTRINSIC_PLUS, INTRINSIC_MINUS, INTRINSIC_TIMES,
     172                 :            :   INTRINSIC_DIVIDE, INTRINSIC_POWER, INTRINSIC_CONCAT,
     173                 :            :   INTRINSIC_AND, INTRINSIC_OR, INTRINSIC_EQV, INTRINSIC_NEQV,
     174                 :            :   /* ==, /=, >, >=, <, <=  */
     175                 :            :   INTRINSIC_EQ, INTRINSIC_NE, INTRINSIC_GT, INTRINSIC_GE,
     176                 :            :   INTRINSIC_LT, INTRINSIC_LE,
     177                 :            :   /* .EQ., .NE., .GT., .GE., .LT., .LE. (OS = Old-Style)  */
     178                 :            :   INTRINSIC_EQ_OS, INTRINSIC_NE_OS, INTRINSIC_GT_OS, INTRINSIC_GE_OS,
     179                 :            :   INTRINSIC_LT_OS, INTRINSIC_LE_OS,
     180                 :            :   INTRINSIC_NOT, INTRINSIC_USER, INTRINSIC_ASSIGN, INTRINSIC_PARENTHESES,
     181                 :            :   GFC_INTRINSIC_END, /* Sentinel */
     182                 :            :   /* User defined derived type pseudo operators. These are set beyond the
     183                 :            :      sentinel so that they are excluded from module_read and module_write.  */
     184                 :            :   INTRINSIC_FORMATTED, INTRINSIC_UNFORMATTED
     185                 :            : };
     186                 :            : 
     187                 :            : /* This macro is the number of intrinsic operators that exist.
     188                 :            :    Assumptions are made about the numbering of the interface_op enums.  */
     189                 :            : #define GFC_INTRINSIC_OPS GFC_INTRINSIC_END
     190                 :            : 
     191                 :            : /* Arithmetic results.  */
     192                 :            : enum arith
     193                 :            : { ARITH_OK = 1, ARITH_OVERFLOW, ARITH_UNDERFLOW, ARITH_NAN,
     194                 :            :   ARITH_DIV0, ARITH_INCOMMENSURATE, ARITH_ASYMMETRIC, ARITH_PROHIBIT,
     195                 :            :   ARITH_WRONGCONCAT
     196                 :            : };
     197                 :            : 
     198                 :            : /* Statements.  */
     199                 :            : enum gfc_statement
     200                 :            : {
     201                 :            :   ST_ARITHMETIC_IF, ST_ALLOCATE, ST_ATTR_DECL, ST_ASSOCIATE,
     202                 :            :   ST_BACKSPACE, ST_BLOCK, ST_BLOCK_DATA,
     203                 :            :   ST_CALL, ST_CASE, ST_CLOSE, ST_COMMON, ST_CONTINUE, ST_CONTAINS, ST_CYCLE,
     204                 :            :   ST_DATA, ST_DATA_DECL, ST_DEALLOCATE, ST_DO, ST_ELSE, ST_ELSEIF,
     205                 :            :   ST_ELSEWHERE, ST_END_ASSOCIATE, ST_END_BLOCK, ST_END_BLOCK_DATA,
     206                 :            :   ST_ENDDO, ST_IMPLIED_ENDDO, ST_END_FILE, ST_FINAL, ST_FLUSH, ST_END_FORALL,
     207                 :            :   ST_END_FUNCTION, ST_ENDIF, ST_END_INTERFACE, ST_END_MODULE, ST_END_SUBMODULE,
     208                 :            :   ST_END_PROGRAM, ST_END_SELECT, ST_END_SUBROUTINE, ST_END_WHERE, ST_END_TYPE,
     209                 :            :   ST_ENTRY, ST_EQUIVALENCE, ST_ERROR_STOP, ST_EXIT, ST_FORALL, ST_FORALL_BLOCK,
     210                 :            :   ST_FORMAT, ST_FUNCTION, ST_GOTO, ST_IF_BLOCK, ST_IMPLICIT, ST_IMPLICIT_NONE,
     211                 :            :   ST_IMPORT, ST_INQUIRE, ST_INTERFACE, ST_SYNC_ALL, ST_SYNC_MEMORY,
     212                 :            :   ST_SYNC_IMAGES, ST_PARAMETER, ST_MODULE, ST_SUBMODULE, ST_MODULE_PROC,
     213                 :            :   ST_NAMELIST, ST_NULLIFY, ST_OPEN, ST_PAUSE, ST_PRIVATE, ST_PROGRAM, ST_PUBLIC,
     214                 :            :   ST_READ, ST_RETURN, ST_REWIND, ST_STOP, ST_SUBROUTINE, ST_TYPE, ST_USE,
     215                 :            :   ST_WHERE_BLOCK, ST_WHERE, ST_WAIT, ST_WRITE, ST_ASSIGNMENT,
     216                 :            :   ST_POINTER_ASSIGNMENT, ST_SELECT_CASE, ST_SEQUENCE, ST_SIMPLE_IF,
     217                 :            :   ST_STATEMENT_FUNCTION, ST_DERIVED_DECL, ST_LABEL_ASSIGNMENT, ST_ENUM,
     218                 :            :   ST_ENUMERATOR, ST_END_ENUM, ST_SELECT_TYPE, ST_TYPE_IS, ST_CLASS_IS,
     219                 :            :   ST_SELECT_RANK, ST_RANK, ST_STRUCTURE_DECL, ST_END_STRUCTURE,
     220                 :            :   ST_UNION, ST_END_UNION, ST_MAP, ST_END_MAP,
     221                 :            :   ST_OACC_PARALLEL_LOOP, ST_OACC_END_PARALLEL_LOOP, ST_OACC_PARALLEL,
     222                 :            :   ST_OACC_END_PARALLEL, ST_OACC_KERNELS, ST_OACC_END_KERNELS, ST_OACC_DATA,
     223                 :            :   ST_OACC_END_DATA, ST_OACC_HOST_DATA, ST_OACC_END_HOST_DATA, ST_OACC_LOOP,
     224                 :            :   ST_OACC_END_LOOP, ST_OACC_DECLARE, ST_OACC_UPDATE, ST_OACC_WAIT,
     225                 :            :   ST_OACC_CACHE, ST_OACC_KERNELS_LOOP, ST_OACC_END_KERNELS_LOOP,
     226                 :            :   ST_OACC_SERIAL_LOOP, ST_OACC_END_SERIAL_LOOP, ST_OACC_SERIAL,
     227                 :            :   ST_OACC_END_SERIAL, ST_OACC_ENTER_DATA, ST_OACC_EXIT_DATA, ST_OACC_ROUTINE,
     228                 :            :   ST_OACC_ATOMIC, ST_OACC_END_ATOMIC,
     229                 :            :   ST_OMP_ATOMIC, ST_OMP_BARRIER, ST_OMP_CRITICAL, ST_OMP_END_ATOMIC,
     230                 :            :   ST_OMP_END_CRITICAL, ST_OMP_END_DO, ST_OMP_END_MASTER, ST_OMP_END_ORDERED,
     231                 :            :   ST_OMP_END_PARALLEL, ST_OMP_END_PARALLEL_DO, ST_OMP_END_PARALLEL_SECTIONS,
     232                 :            :   ST_OMP_END_PARALLEL_WORKSHARE, ST_OMP_END_SECTIONS, ST_OMP_END_SINGLE,
     233                 :            :   ST_OMP_END_WORKSHARE, ST_OMP_DO, ST_OMP_FLUSH, ST_OMP_MASTER, ST_OMP_ORDERED,
     234                 :            :   ST_OMP_PARALLEL, ST_OMP_PARALLEL_DO, ST_OMP_PARALLEL_SECTIONS,
     235                 :            :   ST_OMP_PARALLEL_WORKSHARE, ST_OMP_SECTIONS, ST_OMP_SECTION, ST_OMP_SINGLE,
     236                 :            :   ST_OMP_THREADPRIVATE, ST_OMP_WORKSHARE, ST_OMP_TASK, ST_OMP_END_TASK,
     237                 :            :   ST_OMP_TASKWAIT, ST_OMP_TASKYIELD, ST_OMP_CANCEL, ST_OMP_CANCELLATION_POINT,
     238                 :            :   ST_OMP_TASKGROUP, ST_OMP_END_TASKGROUP, ST_OMP_SIMD, ST_OMP_END_SIMD,
     239                 :            :   ST_OMP_DO_SIMD, ST_OMP_END_DO_SIMD, ST_OMP_PARALLEL_DO_SIMD,
     240                 :            :   ST_OMP_END_PARALLEL_DO_SIMD, ST_OMP_DECLARE_SIMD, ST_OMP_DECLARE_REDUCTION,
     241                 :            :   ST_OMP_TARGET, ST_OMP_END_TARGET, ST_OMP_TARGET_DATA, ST_OMP_END_TARGET_DATA,
     242                 :            :   ST_OMP_TARGET_UPDATE, ST_OMP_DECLARE_TARGET,
     243                 :            :   ST_OMP_TEAMS, ST_OMP_END_TEAMS, ST_OMP_DISTRIBUTE, ST_OMP_END_DISTRIBUTE,
     244                 :            :   ST_OMP_DISTRIBUTE_SIMD, ST_OMP_END_DISTRIBUTE_SIMD,
     245                 :            :   ST_OMP_DISTRIBUTE_PARALLEL_DO, ST_OMP_END_DISTRIBUTE_PARALLEL_DO,
     246                 :            :   ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD, ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD,
     247                 :            :   ST_OMP_TARGET_TEAMS, ST_OMP_END_TARGET_TEAMS, ST_OMP_TEAMS_DISTRIBUTE,
     248                 :            :   ST_OMP_END_TEAMS_DISTRIBUTE, ST_OMP_TEAMS_DISTRIBUTE_SIMD,
     249                 :            :   ST_OMP_END_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TARGET_TEAMS_DISTRIBUTE,
     250                 :            :   ST_OMP_END_TARGET_TEAMS_DISTRIBUTE, ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
     251                 :            :   ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
     252                 :            :   ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO,
     253                 :            :   ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
     254                 :            :   ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
     255                 :            :   ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
     256                 :            :   ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
     257                 :            :   ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
     258                 :            :   ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
     259                 :            :   ST_OMP_TARGET_PARALLEL, ST_OMP_END_TARGET_PARALLEL,
     260                 :            :   ST_OMP_TARGET_PARALLEL_DO, ST_OMP_END_TARGET_PARALLEL_DO,
     261                 :            :   ST_OMP_TARGET_PARALLEL_DO_SIMD, ST_OMP_END_TARGET_PARALLEL_DO_SIMD,
     262                 :            :   ST_OMP_TARGET_ENTER_DATA, ST_OMP_TARGET_EXIT_DATA,
     263                 :            :   ST_OMP_TARGET_SIMD, ST_OMP_END_TARGET_SIMD,
     264                 :            :   ST_OMP_TASKLOOP, ST_OMP_END_TASKLOOP,
     265                 :            :   ST_OMP_TASKLOOP_SIMD, ST_OMP_END_TASKLOOP_SIMD, ST_OMP_ORDERED_DEPEND,
     266                 :            :   ST_PROCEDURE, ST_GENERIC, ST_CRITICAL, ST_END_CRITICAL,
     267                 :            :   ST_GET_FCN_CHARACTERISTICS, ST_LOCK, ST_UNLOCK, ST_EVENT_POST,
     268                 :            :   ST_EVENT_WAIT, ST_FAIL_IMAGE, ST_FORM_TEAM, ST_CHANGE_TEAM,
     269                 :            :   ST_END_TEAM, ST_SYNC_TEAM, ST_NONE
     270                 :            : };
     271                 :            : 
     272                 :            : /* Types of interfaces that we can have.  Assignment interfaces are
     273                 :            :    considered to be intrinsic operators.  */
     274                 :            : enum interface_type
     275                 :            : {
     276                 :            :   INTERFACE_NAMELESS = 1, INTERFACE_GENERIC,
     277                 :            :   INTERFACE_INTRINSIC_OP, INTERFACE_USER_OP, INTERFACE_ABSTRACT,
     278                 :            :   INTERFACE_DTIO
     279                 :            : };
     280                 :            : 
     281                 :            : /* Symbol flavors: these are all mutually exclusive.
     282                 :            :    12 elements = 4 bits.  */
     283                 :            : enum sym_flavor
     284                 :            : {
     285                 :            :   FL_UNKNOWN = 0, FL_PROGRAM, FL_BLOCK_DATA, FL_MODULE, FL_VARIABLE,
     286                 :            :   FL_PARAMETER, FL_LABEL, FL_PROCEDURE, FL_DERIVED, FL_NAMELIST,
     287                 :            :   FL_UNION, FL_STRUCT, FL_VOID
     288                 :            : };
     289                 :            : 
     290                 :            : /* Procedure types.  7 elements = 3 bits.  */
     291                 :            : enum procedure_type
     292                 :            : { PROC_UNKNOWN, PROC_MODULE, PROC_INTERNAL, PROC_DUMMY,
     293                 :            :   PROC_INTRINSIC, PROC_ST_FUNCTION, PROC_EXTERNAL
     294                 :            : };
     295                 :            : 
     296                 :            : /* Intent types. Note that these values are also used in another enum in
     297                 :            :    decl.c (match_attr_spec).  */
     298                 :            : enum sym_intent
     299                 :            : { INTENT_UNKNOWN = 0, INTENT_IN, INTENT_OUT, INTENT_INOUT
     300                 :            : };
     301                 :            : 
     302                 :            : /* Access types.  */
     303                 :            : enum gfc_access
     304                 :            : { ACCESS_UNKNOWN = 0, ACCESS_PUBLIC, ACCESS_PRIVATE
     305                 :            : };
     306                 :            : 
     307                 :            : /* Flags to keep track of where an interface came from.
     308                 :            :    3 elements = 2 bits.  */
     309                 :            : enum ifsrc
     310                 :            : { IFSRC_UNKNOWN = 0,    /* Interface unknown, only return type may be known.  */
     311                 :            :   IFSRC_DECL,           /* FUNCTION or SUBROUTINE declaration.  */
     312                 :            :   IFSRC_IFBODY          /* INTERFACE statement or PROCEDURE statement
     313                 :            :                            with explicit interface.  */
     314                 :            : };
     315                 :            : 
     316                 :            : /* Whether a SAVE attribute was set explicitly or implicitly.  */
     317                 :            : enum save_state
     318                 :            : { SAVE_NONE = 0, SAVE_EXPLICIT, SAVE_IMPLICIT
     319                 :            : };
     320                 :            : 
     321                 :            : /* OpenACC 'routine' directive's level of parallelism.  */
     322                 :            : enum oacc_routine_lop
     323                 :            : { OACC_ROUTINE_LOP_NONE = 0,
     324                 :            :   OACC_ROUTINE_LOP_GANG,
     325                 :            :   OACC_ROUTINE_LOP_WORKER,
     326                 :            :   OACC_ROUTINE_LOP_VECTOR,
     327                 :            :   OACC_ROUTINE_LOP_SEQ,
     328                 :            :   OACC_ROUTINE_LOP_ERROR
     329                 :            : };
     330                 :            : 
     331                 :            : /* Strings for all symbol attributes.  We use these for dumping the
     332                 :            :    parse tree, in error messages, and also when reading and writing
     333                 :            :    modules.  In symbol.c.  */
     334                 :            : extern const mstring flavors[];
     335                 :            : extern const mstring procedures[];
     336                 :            : extern const mstring intents[];
     337                 :            : extern const mstring access_types[];
     338                 :            : extern const mstring ifsrc_types[];
     339                 :            : extern const mstring save_status[];
     340                 :            : 
     341                 :            : /* Strings for DTIO procedure names.  In symbol.c.  */
     342                 :            : extern const mstring dtio_procs[];
     343                 :            : 
     344                 :            : enum dtio_codes
     345                 :            : { DTIO_RF = 0, DTIO_WF, DTIO_RUF, DTIO_WUF };
     346                 :            : 
     347                 :            : /* Enumeration of all the generic intrinsic functions.  Used by the
     348                 :            :    backend for identification of a function.  */
     349                 :            : 
     350                 :            : enum gfc_isym_id
     351                 :            : {
     352                 :            :   /* GFC_ISYM_NONE is used for intrinsics which will never be seen by
     353                 :            :      the backend (e.g. KIND).  */
     354                 :            :   GFC_ISYM_NONE = 0,
     355                 :            :   GFC_ISYM_ABORT,
     356                 :            :   GFC_ISYM_ABS,
     357                 :            :   GFC_ISYM_ACCESS,
     358                 :            :   GFC_ISYM_ACHAR,
     359                 :            :   GFC_ISYM_ACOS,
     360                 :            :   GFC_ISYM_ACOSH,
     361                 :            :   GFC_ISYM_ADJUSTL,
     362                 :            :   GFC_ISYM_ADJUSTR,
     363                 :            :   GFC_ISYM_AIMAG,
     364                 :            :   GFC_ISYM_AINT,
     365                 :            :   GFC_ISYM_ALARM,
     366                 :            :   GFC_ISYM_ALL,
     367                 :            :   GFC_ISYM_ALLOCATED,
     368                 :            :   GFC_ISYM_AND,
     369                 :            :   GFC_ISYM_ANINT,
     370                 :            :   GFC_ISYM_ANY,
     371                 :            :   GFC_ISYM_ASIN,
     372                 :            :   GFC_ISYM_ASINH,
     373                 :            :   GFC_ISYM_ASSOCIATED,
     374                 :            :   GFC_ISYM_ATAN,
     375                 :            :   GFC_ISYM_ATAN2,
     376                 :            :   GFC_ISYM_ATANH,
     377                 :            :   GFC_ISYM_ATOMIC_ADD,
     378                 :            :   GFC_ISYM_ATOMIC_AND,
     379                 :            :   GFC_ISYM_ATOMIC_CAS,
     380                 :            :   GFC_ISYM_ATOMIC_DEF,
     381                 :            :   GFC_ISYM_ATOMIC_FETCH_ADD,
     382                 :            :   GFC_ISYM_ATOMIC_FETCH_AND,
     383                 :            :   GFC_ISYM_ATOMIC_FETCH_OR,
     384                 :            :   GFC_ISYM_ATOMIC_FETCH_XOR,
     385                 :            :   GFC_ISYM_ATOMIC_OR,
     386                 :            :   GFC_ISYM_ATOMIC_REF,
     387                 :            :   GFC_ISYM_ATOMIC_XOR,
     388                 :            :   GFC_ISYM_BGE,
     389                 :            :   GFC_ISYM_BGT,
     390                 :            :   GFC_ISYM_BIT_SIZE,
     391                 :            :   GFC_ISYM_BLE,
     392                 :            :   GFC_ISYM_BLT,
     393                 :            :   GFC_ISYM_BTEST,
     394                 :            :   GFC_ISYM_CAF_GET,
     395                 :            :   GFC_ISYM_CAF_SEND,
     396                 :            :   GFC_ISYM_CEILING,
     397                 :            :   GFC_ISYM_CHAR,
     398                 :            :   GFC_ISYM_CHDIR,
     399                 :            :   GFC_ISYM_CHMOD,
     400                 :            :   GFC_ISYM_CMPLX,
     401                 :            :   GFC_ISYM_CO_BROADCAST,
     402                 :            :   GFC_ISYM_CO_MAX,
     403                 :            :   GFC_ISYM_CO_MIN,
     404                 :            :   GFC_ISYM_CO_REDUCE,
     405                 :            :   GFC_ISYM_CO_SUM,
     406                 :            :   GFC_ISYM_COMMAND_ARGUMENT_COUNT,
     407                 :            :   GFC_ISYM_COMPILER_OPTIONS,
     408                 :            :   GFC_ISYM_COMPILER_VERSION,
     409                 :            :   GFC_ISYM_COMPLEX,
     410                 :            :   GFC_ISYM_CONJG,
     411                 :            :   GFC_ISYM_CONVERSION,
     412                 :            :   GFC_ISYM_COS,
     413                 :            :   GFC_ISYM_COSH,
     414                 :            :   GFC_ISYM_COTAN,
     415                 :            :   GFC_ISYM_COUNT,
     416                 :            :   GFC_ISYM_CPU_TIME,
     417                 :            :   GFC_ISYM_CSHIFT,
     418                 :            :   GFC_ISYM_CTIME,
     419                 :            :   GFC_ISYM_C_ASSOCIATED,
     420                 :            :   GFC_ISYM_C_F_POINTER,
     421                 :            :   GFC_ISYM_C_F_PROCPOINTER,
     422                 :            :   GFC_ISYM_C_FUNLOC,
     423                 :            :   GFC_ISYM_C_LOC,
     424                 :            :   GFC_ISYM_C_SIZEOF,
     425                 :            :   GFC_ISYM_DATE_AND_TIME,
     426                 :            :   GFC_ISYM_DBLE,
     427                 :            :   GFC_ISYM_DFLOAT,
     428                 :            :   GFC_ISYM_DIGITS,
     429                 :            :   GFC_ISYM_DIM,
     430                 :            :   GFC_ISYM_DOT_PRODUCT,
     431                 :            :   GFC_ISYM_DPROD,
     432                 :            :   GFC_ISYM_DSHIFTL,
     433                 :            :   GFC_ISYM_DSHIFTR,
     434                 :            :   GFC_ISYM_DTIME,
     435                 :            :   GFC_ISYM_EOSHIFT,
     436                 :            :   GFC_ISYM_EPSILON,
     437                 :            :   GFC_ISYM_ERF,
     438                 :            :   GFC_ISYM_ERFC,
     439                 :            :   GFC_ISYM_ERFC_SCALED,
     440                 :            :   GFC_ISYM_ETIME,
     441                 :            :   GFC_ISYM_EVENT_QUERY,
     442                 :            :   GFC_ISYM_EXECUTE_COMMAND_LINE,
     443                 :            :   GFC_ISYM_EXIT,
     444                 :            :   GFC_ISYM_EXP,
     445                 :            :   GFC_ISYM_EXPONENT,
     446                 :            :   GFC_ISYM_EXTENDS_TYPE_OF,
     447                 :            :   GFC_ISYM_FAILED_IMAGES,
     448                 :            :   GFC_ISYM_FDATE,
     449                 :            :   GFC_ISYM_FE_RUNTIME_ERROR,
     450                 :            :   GFC_ISYM_FGET,
     451                 :            :   GFC_ISYM_FGETC,
     452                 :            :   GFC_ISYM_FINDLOC,
     453                 :            :   GFC_ISYM_FLOAT,
     454                 :            :   GFC_ISYM_FLOOR,
     455                 :            :   GFC_ISYM_FLUSH,
     456                 :            :   GFC_ISYM_FNUM,
     457                 :            :   GFC_ISYM_FPUT,
     458                 :            :   GFC_ISYM_FPUTC,
     459                 :            :   GFC_ISYM_FRACTION,
     460                 :            :   GFC_ISYM_FREE,
     461                 :            :   GFC_ISYM_FSEEK,
     462                 :            :   GFC_ISYM_FSTAT,
     463                 :            :   GFC_ISYM_FTELL,
     464                 :            :   GFC_ISYM_TGAMMA,
     465                 :            :   GFC_ISYM_GERROR,
     466                 :            :   GFC_ISYM_GETARG,
     467                 :            :   GFC_ISYM_GET_COMMAND,
     468                 :            :   GFC_ISYM_GET_COMMAND_ARGUMENT,
     469                 :            :   GFC_ISYM_GETCWD,
     470                 :            :   GFC_ISYM_GETENV,
     471                 :            :   GFC_ISYM_GET_ENVIRONMENT_VARIABLE,
     472                 :            :   GFC_ISYM_GETGID,
     473                 :            :   GFC_ISYM_GETLOG,
     474                 :            :   GFC_ISYM_GETPID,
     475                 :            :   GFC_ISYM_GET_TEAM,
     476                 :            :   GFC_ISYM_GETUID,
     477                 :            :   GFC_ISYM_GMTIME,
     478                 :            :   GFC_ISYM_HOSTNM,
     479                 :            :   GFC_ISYM_HUGE,
     480                 :            :   GFC_ISYM_HYPOT,
     481                 :            :   GFC_ISYM_IACHAR,
     482                 :            :   GFC_ISYM_IALL,
     483                 :            :   GFC_ISYM_IAND,
     484                 :            :   GFC_ISYM_IANY,
     485                 :            :   GFC_ISYM_IARGC,
     486                 :            :   GFC_ISYM_IBCLR,
     487                 :            :   GFC_ISYM_IBITS,
     488                 :            :   GFC_ISYM_IBSET,
     489                 :            :   GFC_ISYM_ICHAR,
     490                 :            :   GFC_ISYM_IDATE,
     491                 :            :   GFC_ISYM_IEOR,
     492                 :            :   GFC_ISYM_IERRNO,
     493                 :            :   GFC_ISYM_IMAGE_INDEX,
     494                 :            :   GFC_ISYM_IMAGE_STATUS,
     495                 :            :   GFC_ISYM_INDEX,
     496                 :            :   GFC_ISYM_INT,
     497                 :            :   GFC_ISYM_INT2,
     498                 :            :   GFC_ISYM_INT8,
     499                 :            :   GFC_ISYM_IOR,
     500                 :            :   GFC_ISYM_IPARITY,
     501                 :            :   GFC_ISYM_IRAND,
     502                 :            :   GFC_ISYM_ISATTY,
     503                 :            :   GFC_ISYM_IS_CONTIGUOUS,
     504                 :            :   GFC_ISYM_IS_IOSTAT_END,
     505                 :            :   GFC_ISYM_IS_IOSTAT_EOR,
     506                 :            :   GFC_ISYM_ISNAN,
     507                 :            :   GFC_ISYM_ISHFT,
     508                 :            :   GFC_ISYM_ISHFTC,
     509                 :            :   GFC_ISYM_ITIME,
     510                 :            :   GFC_ISYM_J0,
     511                 :            :   GFC_ISYM_J1,
     512                 :            :   GFC_ISYM_JN,
     513                 :            :   GFC_ISYM_JN2,
     514                 :            :   GFC_ISYM_KILL,
     515                 :            :   GFC_ISYM_KIND,
     516                 :            :   GFC_ISYM_LBOUND,
     517                 :            :   GFC_ISYM_LCOBOUND,
     518                 :            :   GFC_ISYM_LEADZ,
     519                 :            :   GFC_ISYM_LEN,
     520                 :            :   GFC_ISYM_LEN_TRIM,
     521                 :            :   GFC_ISYM_LGAMMA,
     522                 :            :   GFC_ISYM_LGE,
     523                 :            :   GFC_ISYM_LGT,
     524                 :            :   GFC_ISYM_LINK,
     525                 :            :   GFC_ISYM_LLE,
     526                 :            :   GFC_ISYM_LLT,
     527                 :            :   GFC_ISYM_LOC,
     528                 :            :   GFC_ISYM_LOG,
     529                 :            :   GFC_ISYM_LOG10,
     530                 :            :   GFC_ISYM_LOGICAL,
     531                 :            :   GFC_ISYM_LONG,
     532                 :            :   GFC_ISYM_LSHIFT,
     533                 :            :   GFC_ISYM_LSTAT,
     534                 :            :   GFC_ISYM_LTIME,
     535                 :            :   GFC_ISYM_MALLOC,
     536                 :            :   GFC_ISYM_MASKL,
     537                 :            :   GFC_ISYM_MASKR,
     538                 :            :   GFC_ISYM_MATMUL,
     539                 :            :   GFC_ISYM_MAX,
     540                 :            :   GFC_ISYM_MAXEXPONENT,
     541                 :            :   GFC_ISYM_MAXLOC,
     542                 :            :   GFC_ISYM_MAXVAL,
     543                 :            :   GFC_ISYM_MCLOCK,
     544                 :            :   GFC_ISYM_MCLOCK8,
     545                 :            :   GFC_ISYM_MERGE,
     546                 :            :   GFC_ISYM_MERGE_BITS,
     547                 :            :   GFC_ISYM_MIN,
     548                 :            :   GFC_ISYM_MINEXPONENT,
     549                 :            :   GFC_ISYM_MINLOC,
     550                 :            :   GFC_ISYM_MINVAL,
     551                 :            :   GFC_ISYM_MOD,
     552                 :            :   GFC_ISYM_MODULO,
     553                 :            :   GFC_ISYM_MOVE_ALLOC,
     554                 :            :   GFC_ISYM_MVBITS,
     555                 :            :   GFC_ISYM_NEAREST,
     556                 :            :   GFC_ISYM_NEW_LINE,
     557                 :            :   GFC_ISYM_NINT,
     558                 :            :   GFC_ISYM_NORM2,
     559                 :            :   GFC_ISYM_NOT,
     560                 :            :   GFC_ISYM_NULL,
     561                 :            :   GFC_ISYM_NUM_IMAGES,
     562                 :            :   GFC_ISYM_OR,
     563                 :            :   GFC_ISYM_PACK,
     564                 :            :   GFC_ISYM_PARITY,
     565                 :            :   GFC_ISYM_PERROR,
     566                 :            :   GFC_ISYM_POPCNT,
     567                 :            :   GFC_ISYM_POPPAR,
     568                 :            :   GFC_ISYM_PRECISION,
     569                 :            :   GFC_ISYM_PRESENT,
     570                 :            :   GFC_ISYM_PRODUCT,
     571                 :            :   GFC_ISYM_RADIX,
     572                 :            :   GFC_ISYM_RAND,
     573                 :            :   GFC_ISYM_RANDOM_INIT,
     574                 :            :   GFC_ISYM_RANDOM_NUMBER,
     575                 :            :   GFC_ISYM_RANDOM_SEED,
     576                 :            :   GFC_ISYM_RANGE,
     577                 :            :   GFC_ISYM_RANK,
     578                 :            :   GFC_ISYM_REAL,
     579                 :            :   GFC_ISYM_REALPART,
     580                 :            :   GFC_ISYM_RENAME,
     581                 :            :   GFC_ISYM_REPEAT,
     582                 :            :   GFC_ISYM_RESHAPE,
     583                 :            :   GFC_ISYM_RRSPACING,
     584                 :            :   GFC_ISYM_RSHIFT,
     585                 :            :   GFC_ISYM_SAME_TYPE_AS,
     586                 :            :   GFC_ISYM_SC_KIND,
     587                 :            :   GFC_ISYM_SCALE,
     588                 :            :   GFC_ISYM_SCAN,
     589                 :            :   GFC_ISYM_SECNDS,
     590                 :            :   GFC_ISYM_SECOND,
     591                 :            :   GFC_ISYM_SET_EXPONENT,
     592                 :            :   GFC_ISYM_SHAPE,
     593                 :            :   GFC_ISYM_SHIFTA,
     594                 :            :   GFC_ISYM_SHIFTL,
     595                 :            :   GFC_ISYM_SHIFTR,
     596                 :            :   GFC_ISYM_BACKTRACE,
     597                 :            :   GFC_ISYM_SIGN,
     598                 :            :   GFC_ISYM_SIGNAL,
     599                 :            :   GFC_ISYM_SI_KIND,
     600                 :            :   GFC_ISYM_SIN,
     601                 :            :   GFC_ISYM_SINH,
     602                 :            :   GFC_ISYM_SIZE,
     603                 :            :   GFC_ISYM_SLEEP,
     604                 :            :   GFC_ISYM_SIZEOF,
     605                 :            :   GFC_ISYM_SNGL,
     606                 :            :   GFC_ISYM_SPACING,
     607                 :            :   GFC_ISYM_SPREAD,
     608                 :            :   GFC_ISYM_SQRT,
     609                 :            :   GFC_ISYM_SRAND,
     610                 :            :   GFC_ISYM_SR_KIND,
     611                 :            :   GFC_ISYM_STAT,
     612                 :            :   GFC_ISYM_STOPPED_IMAGES,
     613                 :            :   GFC_ISYM_STORAGE_SIZE,
     614                 :            :   GFC_ISYM_STRIDE,
     615                 :            :   GFC_ISYM_SUM,
     616                 :            :   GFC_ISYM_SYMLINK,
     617                 :            :   GFC_ISYM_SYMLNK,
     618                 :            :   GFC_ISYM_SYSTEM,
     619                 :            :   GFC_ISYM_SYSTEM_CLOCK,
     620                 :            :   GFC_ISYM_TAN,
     621                 :            :   GFC_ISYM_TANH,
     622                 :            :   GFC_ISYM_TEAM_NUMBER,
     623                 :            :   GFC_ISYM_THIS_IMAGE,
     624                 :            :   GFC_ISYM_TIME,
     625                 :            :   GFC_ISYM_TIME8,
     626                 :            :   GFC_ISYM_TINY,
     627                 :            :   GFC_ISYM_TRAILZ,
     628                 :            :   GFC_ISYM_TRANSFER,
     629                 :            :   GFC_ISYM_TRANSPOSE,
     630                 :            :   GFC_ISYM_TRIM,
     631                 :            :   GFC_ISYM_TTYNAM,
     632                 :            :   GFC_ISYM_UBOUND,
     633                 :            :   GFC_ISYM_UCOBOUND,
     634                 :            :   GFC_ISYM_UMASK,
     635                 :            :   GFC_ISYM_UNLINK,
     636                 :            :   GFC_ISYM_UNPACK,
     637                 :            :   GFC_ISYM_VERIFY,
     638                 :            :   GFC_ISYM_XOR,
     639                 :            :   GFC_ISYM_Y0,
     640                 :            :   GFC_ISYM_Y1,
     641                 :            :   GFC_ISYM_YN,
     642                 :            :   GFC_ISYM_YN2
     643                 :            : };
     644                 :            : 
     645                 :            : enum init_local_logical
     646                 :            : {
     647                 :            :   GFC_INIT_LOGICAL_OFF = 0,
     648                 :            :   GFC_INIT_LOGICAL_FALSE,
     649                 :            :   GFC_INIT_LOGICAL_TRUE
     650                 :            : };
     651                 :            : 
     652                 :            : enum init_local_character
     653                 :            : {
     654                 :            :   GFC_INIT_CHARACTER_OFF = 0,
     655                 :            :   GFC_INIT_CHARACTER_ON
     656                 :            : };
     657                 :            : 
     658                 :            : enum init_local_integer
     659                 :            : {
     660                 :            :   GFC_INIT_INTEGER_OFF = 0,
     661                 :            :   GFC_INIT_INTEGER_ON
     662                 :            : };
     663                 :            : 
     664                 :            : enum gfc_reverse
     665                 :            : {
     666                 :            :   GFC_ENABLE_REVERSE,
     667                 :            :   GFC_FORWARD_SET,
     668                 :            :   GFC_REVERSE_SET,
     669                 :            :   GFC_INHIBIT_REVERSE
     670                 :            : };
     671                 :            : 
     672                 :            : enum gfc_param_spec_type
     673                 :            : {
     674                 :            :   SPEC_EXPLICIT,
     675                 :            :   SPEC_ASSUMED,
     676                 :            :   SPEC_DEFERRED
     677                 :            : };
     678                 :            : 
     679                 :            : /************************* Structures *****************************/
     680                 :            : 
     681                 :            : /* Used for keeping things in balanced binary trees.  */
     682                 :            : #define BBT_HEADER(self) int priority; struct self *left, *right
     683                 :            : 
     684                 :            : #define NAMED_INTCST(a,b,c,d) a,
     685                 :            : #define NAMED_KINDARRAY(a,b,c,d) a,
     686                 :            : #define NAMED_FUNCTION(a,b,c,d) a,
     687                 :            : #define NAMED_SUBROUTINE(a,b,c,d) a,
     688                 :            : #define NAMED_DERIVED_TYPE(a,b,c,d) a,
     689                 :            : enum iso_fortran_env_symbol
     690                 :            : {
     691                 :            :   ISOFORTRANENV_INVALID = -1,
     692                 :            : #include "iso-fortran-env.def"
     693                 :            :   ISOFORTRANENV_LAST, ISOFORTRANENV_NUMBER = ISOFORTRANENV_LAST
     694                 :            : };
     695                 :            : #undef NAMED_INTCST
     696                 :            : #undef NAMED_KINDARRAY
     697                 :            : #undef NAMED_FUNCTION
     698                 :            : #undef NAMED_SUBROUTINE
     699                 :            : #undef NAMED_DERIVED_TYPE
     700                 :            : 
     701                 :            : #define NAMED_INTCST(a,b,c,d) a,
     702                 :            : #define NAMED_REALCST(a,b,c,d) a,
     703                 :            : #define NAMED_CMPXCST(a,b,c,d) a,
     704                 :            : #define NAMED_LOGCST(a,b,c) a,
     705                 :            : #define NAMED_CHARKNDCST(a,b,c) a,
     706                 :            : #define NAMED_CHARCST(a,b,c) a,
     707                 :            : #define DERIVED_TYPE(a,b,c) a,
     708                 :            : #define NAMED_FUNCTION(a,b,c,d) a,
     709                 :            : #define NAMED_SUBROUTINE(a,b,c,d) a,
     710                 :            : enum iso_c_binding_symbol
     711                 :            : {
     712                 :            :   ISOCBINDING_INVALID = -1,
     713                 :            : #include "iso-c-binding.def"
     714                 :            :   ISOCBINDING_LAST,
     715                 :            :   ISOCBINDING_NUMBER = ISOCBINDING_LAST
     716                 :            : };
     717                 :            : #undef NAMED_INTCST
     718                 :            : #undef NAMED_REALCST
     719                 :            : #undef NAMED_CMPXCST
     720                 :            : #undef NAMED_LOGCST
     721                 :            : #undef NAMED_CHARKNDCST
     722                 :            : #undef NAMED_CHARCST
     723                 :            : #undef DERIVED_TYPE
     724                 :            : #undef NAMED_FUNCTION
     725                 :            : #undef NAMED_SUBROUTINE
     726                 :            : 
     727                 :            : enum intmod_id
     728                 :            : {
     729                 :            :   INTMOD_NONE = 0, INTMOD_ISO_FORTRAN_ENV, INTMOD_ISO_C_BINDING,
     730                 :            :   INTMOD_IEEE_FEATURES, INTMOD_IEEE_EXCEPTIONS, INTMOD_IEEE_ARITHMETIC
     731                 :            : };
     732                 :            : 
     733                 :            : typedef struct
     734                 :            : {
     735                 :            :   char name[GFC_MAX_SYMBOL_LEN + 1];
     736                 :            :   int value;  /* Used for both integer and character values.  */
     737                 :            :   bt f90_type;
     738                 :            : }
     739                 :            : CInteropKind_t;
     740                 :            : 
     741                 :            : /* Array of structs, where the structs represent the C interop kinds.
     742                 :            :    The list will be implemented based on a hash of the kind name since
     743                 :            :    these could be accessed multiple times.
     744                 :            :    Declared in trans-types.c as a global, since it's in that file
     745                 :            :    that the list is initialized.  */
     746                 :            : extern CInteropKind_t c_interop_kinds_table[];
     747                 :            : 
     748                 :            : 
     749                 :            : /* Structure and list of supported extension attributes.  */
     750                 :            : typedef enum
     751                 :            : {
     752                 :            :   EXT_ATTR_DLLIMPORT = 0,
     753                 :            :   EXT_ATTR_DLLEXPORT,
     754                 :            :   EXT_ATTR_STDCALL,
     755                 :            :   EXT_ATTR_CDECL,
     756                 :            :   EXT_ATTR_FASTCALL,
     757                 :            :   EXT_ATTR_NO_ARG_CHECK,
     758                 :            :   EXT_ATTR_LAST, EXT_ATTR_NUM = EXT_ATTR_LAST
     759                 :            : }
     760                 :            : ext_attr_id_t;
     761                 :            : 
     762                 :            : typedef struct
     763                 :            : {
     764                 :            :   const char *name;
     765                 :            :   unsigned id;
     766                 :            :   const char *middle_end_name;
     767                 :            : }
     768                 :            : ext_attr_t;
     769                 :            : 
     770                 :            : extern const ext_attr_t ext_attr_list[];
     771                 :            : 
     772                 :            : /* Symbol attribute structure.  */
     773                 :            : typedef struct
     774                 :            : {
     775                 :            :   /* Variable attributes.  */
     776                 :            :   unsigned allocatable:1, dimension:1, codimension:1, external:1, intrinsic:1,
     777                 :            :     optional:1, pointer:1, target:1, value:1, volatile_:1, temporary:1,
     778                 :            :     dummy:1, result:1, assign:1, threadprivate:1, not_always_present:1,
     779                 :            :     implied_index:1, subref_array_pointer:1, proc_pointer:1, asynchronous:1,
     780                 :            :     contiguous:1, fe_temp: 1, automatic: 1;
     781                 :            : 
     782                 :            :   /* For CLASS containers, the pointer attribute is sometimes set internally
     783                 :            :      even though it was not directly specified.  In this case, keep the
     784                 :            :      "real" (original) value here.  */
     785                 :            :   unsigned class_pointer:1;
     786                 :            : 
     787                 :            :   ENUM_BITFIELD (save_state) save:2;
     788                 :            : 
     789                 :            :   unsigned data:1,              /* Symbol is named in a DATA statement.  */
     790                 :            :     is_protected:1,             /* Symbol has been marked as protected.  */
     791                 :            :     use_assoc:1,                /* Symbol has been use-associated.  */
     792                 :            :     used_in_submodule:1,        /* Symbol has been use-associated in a
     793                 :            :                                    submodule. Needed since these entities must
     794                 :            :                                    be set host associated to be compliant.  */
     795                 :            :     use_only:1,                 /* Symbol has been use-associated, with ONLY.  */
     796                 :            :     use_rename:1,               /* Symbol has been use-associated and renamed.  */
     797                 :            :     imported:1,                 /* Symbol has been associated by IMPORT.  */
     798                 :            :     host_assoc:1;               /* Symbol has been host associated.  */
     799                 :            : 
     800                 :            :   unsigned in_namelist:1, in_common:1, in_equivalence:1;
     801                 :            :   unsigned function:1, subroutine:1, procedure:1;
     802                 :            :   unsigned generic:1, generic_copy:1;
     803                 :            :   unsigned implicit_type:1;     /* Type defined via implicit rules.  */
     804                 :            :   unsigned untyped:1;           /* No implicit type could be found.  */
     805                 :            : 
     806                 :            :   unsigned is_bind_c:1;         /* say if is bound to C.  */
     807                 :            :   unsigned extension:8;         /* extension level of a derived type.  */
     808                 :            :   unsigned is_class:1;          /* is a CLASS container.  */
     809                 :            :   unsigned class_ok:1;          /* is a CLASS object with correct attributes.  */
     810                 :            :   unsigned vtab:1;              /* is a derived type vtab, pointed to by CLASS objects.  */
     811                 :            :   unsigned vtype:1;             /* is a derived type of a vtab.  */
     812                 :            : 
     813                 :            :   /* These flags are both in the typespec and attribute.  The attribute
     814                 :            :      list is what gets read from/written to a module file.  The typespec
     815                 :            :      is created from a decl being processed.  */
     816                 :            :   unsigned is_c_interop:1;      /* It's c interoperable.  */
     817                 :            :   unsigned is_iso_c:1;          /* Symbol is from iso_c_binding.  */
     818                 :            : 
     819                 :            :   /* Function/subroutine attributes */
     820                 :            :   unsigned sequence:1, elemental:1, pure:1, recursive:1;
     821                 :            :   unsigned unmaskable:1, masked:1, contained:1, mod_proc:1, abstract:1;
     822                 :            : 
     823                 :            :   /* Set if this is a module function or subroutine. Note that it is an
     824                 :            :      attribute because it appears as a prefix in the declaration like
     825                 :            :      PURE, etc..  */
     826                 :            :   unsigned module_procedure:1;
     827                 :            : 
     828                 :            :   /* Set if a (public) symbol [e.g. generic name] exposes this symbol,
     829                 :            :      which is relevant for private module procedures.  */
     830                 :            :   unsigned public_used:1;
     831                 :            : 
     832                 :            :   /* This is set if a contained procedure could be declared pure.  This is
     833                 :            :      used for certain optimizations that require the result or arguments
     834                 :            :      cannot alias.  Note that this is zero for PURE procedures.  */
     835                 :            :   unsigned implicit_pure:1;
     836                 :            : 
     837                 :            :   /* This is set for a procedure that contains expressions referencing
     838                 :            :      arrays coming from outside its namespace.
     839                 :            :      This is used to force the creation of a temporary when the LHS of
     840                 :            :      an array assignment may be used by an elemental procedure appearing
     841                 :            :      on the RHS.  */
     842                 :            :   unsigned array_outer_dependency:1;
     843                 :            : 
     844                 :            :   /* This is set if the subroutine doesn't return.  Currently, this
     845                 :            :      is only possible for intrinsic subroutines.  */
     846                 :            :   unsigned noreturn:1;
     847                 :            : 
     848                 :            :   /* Set if this procedure is an alternate entry point.  These procedures
     849                 :            :      don't have any code associated, and the backend will turn them into
     850                 :            :      thunks to the master function.  */
     851                 :            :   unsigned entry:1;
     852                 :            : 
     853                 :            :   /* Set if this is the master function for a procedure with multiple
     854                 :            :      entry points.  */
     855                 :            :   unsigned entry_master:1;
     856                 :            : 
     857                 :            :   /* Set if this is the master function for a function with multiple
     858                 :            :      entry points where characteristics of the entry points differ.  */
     859                 :            :   unsigned mixed_entry_master:1;
     860                 :            : 
     861                 :            :   /* Set if a function must always be referenced by an explicit interface.  */
     862                 :            :   unsigned always_explicit:1;
     863                 :            : 
     864                 :            :   /* Set if the symbol is generated and, hence, standard violations
     865                 :            :      shouldn't be flaged.  */
     866                 :            :   unsigned artificial:1;
     867                 :            : 
     868                 :            :   /* Set if the symbol has been referenced in an expression.  No further
     869                 :            :      modification of type or type parameters is permitted.  */
     870                 :            :   unsigned referenced:1;
     871                 :            : 
     872                 :            :   /* Set if this is the symbol for the main program.  */
     873                 :            :   unsigned is_main_program:1;
     874                 :            : 
     875                 :            :   /* Mutually exclusive multibit attributes.  */
     876                 :            :   ENUM_BITFIELD (gfc_access) access:2;
     877                 :            :   ENUM_BITFIELD (sym_intent) intent:2;
     878                 :            :   ENUM_BITFIELD (sym_flavor) flavor:4;
     879                 :            :   ENUM_BITFIELD (ifsrc) if_source:2;
     880                 :            : 
     881                 :            :   ENUM_BITFIELD (procedure_type) proc:3;
     882                 :            : 
     883                 :            :   /* Special attributes for Cray pointers, pointees.  */
     884                 :            :   unsigned cray_pointer:1, cray_pointee:1;
     885                 :            : 
     886                 :            :   /* The symbol is a derived type with allocatable components, pointer
     887                 :            :      components or private components, procedure pointer components,
     888                 :            :      possibly nested.  zero_comp is true if the derived type has no
     889                 :            :      component at all.  defined_assign_comp is true if the derived
     890                 :            :      type or a (sub-)component has a typebound defined assignment.
     891                 :            :      unlimited_polymorphic flags the type of the container for these
     892                 :            :      entities.  */
     893                 :            :   unsigned alloc_comp:1, pointer_comp:1, proc_pointer_comp:1,
     894                 :            :            private_comp:1, zero_comp:1, coarray_comp:1, lock_comp:1,
     895                 :            :            event_comp:1, defined_assign_comp:1, unlimited_polymorphic:1,
     896                 :            :            has_dtio_procs:1, caf_token:1;
     897                 :            : 
     898                 :            :   /* This is a temporary selector for SELECT TYPE/RANK or an associate
     899                 :            :      variable for SELECT TYPE/RANK or ASSOCIATE.  */
     900                 :            :   unsigned select_type_temporary:1, select_rank_temporary:1, associate_var:1;
     901                 :            : 
     902                 :            :   /* These are the attributes required for parameterized derived
     903                 :            :      types.  */
     904                 :            :   unsigned pdt_kind:1, pdt_len:1, pdt_type:1, pdt_template:1,
     905                 :            :            pdt_array:1, pdt_string:1;
     906                 :            : 
     907                 :            :   /* This is omp_{out,in,priv,orig} artificial variable in
     908                 :            :      !$OMP DECLARE REDUCTION.  */
     909                 :            :   unsigned omp_udr_artificial_var:1;
     910                 :            : 
     911                 :            :   /* Mentioned in OMP DECLARE TARGET.  */
     912                 :            :   unsigned omp_declare_target:1;
     913                 :            :   unsigned omp_declare_target_link:1;
     914                 :            : 
     915                 :            :   /* Mentioned in OACC DECLARE.  */
     916                 :            :   unsigned oacc_declare_create:1;
     917                 :            :   unsigned oacc_declare_copyin:1;
     918                 :            :   unsigned oacc_declare_deviceptr:1;
     919                 :            :   unsigned oacc_declare_device_resident:1;
     920                 :            :   unsigned oacc_declare_link:1;
     921                 :            : 
     922                 :            :   /* OpenACC 'routine' directive's level of parallelism.  */
     923                 :            :   ENUM_BITFIELD (oacc_routine_lop) oacc_routine_lop:3;
     924                 :            : 
     925                 :            :   /* Attributes set by compiler extensions (!GCC$ ATTRIBUTES).  */
     926                 :            :   unsigned ext_attr:EXT_ATTR_NUM;
     927                 :            : 
     928                 :            :   /* The namespace where the attribute has been set.  */
     929                 :            :   struct gfc_namespace *volatile_ns, *asynchronous_ns;
     930                 :            : }
     931                 :            : symbol_attribute;
     932                 :            : 
     933                 :            : 
     934                 :            : /* We need to store source lines as sequences of multibyte source
     935                 :            :    characters. We define here a type wide enough to hold any multibyte
     936                 :            :    source character, just like libcpp does.  A 32-bit type is enough.  */
     937                 :            : 
     938                 :            : #if HOST_BITS_PER_INT >= 32
     939                 :            : typedef unsigned int gfc_char_t;
     940                 :            : #elif HOST_BITS_PER_LONG >= 32
     941                 :            : typedef unsigned long gfc_char_t;
     942                 :            : #elif defined(HAVE_LONG_LONG) && (HOST_BITS_PER_LONGLONG >= 32)
     943                 :            : typedef unsigned long long gfc_char_t;
     944                 :            : #else
     945                 :            : # error "Cannot find an integer type with at least 32 bits"
     946                 :            : #endif
     947                 :            : 
     948                 :            : 
     949                 :            : /* The following three structures are used to identify a location in
     950                 :            :    the sources.
     951                 :            : 
     952                 :            :    gfc_file is used to maintain a tree of the source files and how
     953                 :            :    they include each other
     954                 :            : 
     955                 :            :    gfc_linebuf holds a single line of source code and information
     956                 :            :    which file it resides in
     957                 :            : 
     958                 :            :    locus point to the sourceline and the character in the source
     959                 :            :    line.
     960                 :            : */
     961                 :            : 
     962                 :            : typedef struct gfc_file
     963                 :            : {
     964                 :            :   struct gfc_file *next, *up;
     965                 :            :   int inclusion_line, line;
     966                 :            :   char *filename;
     967                 :            : } gfc_file;
     968                 :            : 
     969                 :            : typedef struct gfc_linebuf
     970                 :            : {
     971                 :            :   location_t location;
     972                 :            :   struct gfc_file *file;
     973                 :            :   struct gfc_linebuf *next;
     974                 :            : 
     975                 :            :   int truncated;
     976                 :            :   bool dbg_emitted;
     977                 :            : 
     978                 :            :   gfc_char_t line[1];
     979                 :            : } gfc_linebuf;
     980                 :            : 
     981                 :            : #define gfc_linebuf_header_size (offsetof (gfc_linebuf, line))
     982                 :            : 
     983                 :            : #define gfc_linebuf_linenum(LBUF) (LOCATION_LINE ((LBUF)->location))
     984                 :            : 
     985                 :            : typedef struct
     986                 :            : {
     987                 :            :   gfc_char_t *nextc;
     988                 :            :   gfc_linebuf *lb;
     989                 :            : } locus;
     990                 :            : 
     991                 :            : /* In order for the "gfc" format checking to work correctly, you must
     992                 :            :    have declared a typedef locus first.  */
     993                 :            : #if GCC_VERSION >= 4001
     994                 :            : #define ATTRIBUTE_GCC_GFC(m, n) __attribute__ ((__format__ (__gcc_gfc__, m, n))) ATTRIBUTE_NONNULL(m)
     995                 :            : #else
     996                 :            : #define ATTRIBUTE_GCC_GFC(m, n) ATTRIBUTE_NONNULL(m)
     997                 :            : #endif
     998                 :            : 
     999                 :            : 
    1000                 :            : /* Suppress error messages or re-enable them.  */
    1001                 :            : 
    1002                 :            : void gfc_push_suppress_errors (void);
    1003                 :            : void gfc_pop_suppress_errors (void);
    1004                 :            : 
    1005                 :            : 
    1006                 :            : /* Character length structures hold the expression that gives the
    1007                 :            :    length of a character variable.  We avoid putting these into
    1008                 :            :    gfc_typespec because doing so prevents us from doing structure
    1009                 :            :    copies and forces us to deallocate any typespecs we create, as well
    1010                 :            :    as structures that contain typespecs.  They also can have multiple
    1011                 :            :    character typespecs pointing to them.
    1012                 :            : 
    1013                 :            :    These structures form a singly linked list within the current
    1014                 :            :    namespace and are deallocated with the namespace.  It is possible to
    1015                 :            :    end up with gfc_charlen structures that have nothing pointing to them.  */
    1016                 :            : 
    1017                 :            : typedef struct gfc_charlen
    1018                 :            : {
    1019                 :            :   struct gfc_expr *length;
    1020                 :            :   struct gfc_charlen *next;
    1021                 :            :   bool length_from_typespec; /* Length from explicit array ctor typespec?  */
    1022                 :            :   tree backend_decl;
    1023                 :            :   tree passed_length; /* Length argument explicitly passed.  */
    1024                 :            : 
    1025                 :            :   int resolved;
    1026                 :            : }
    1027                 :            : gfc_charlen;
    1028                 :            : 
    1029                 :            : #define gfc_get_charlen() XCNEW (gfc_charlen)
    1030                 :            : 
    1031                 :            : /* Type specification structure.  */
    1032                 :            : typedef struct
    1033                 :            : {
    1034                 :            :   bt type;
    1035                 :            :   int kind;
    1036                 :            : 
    1037                 :            :   union
    1038                 :            :   {
    1039                 :            :     struct gfc_symbol *derived; /* For derived types only.  */
    1040                 :            :     gfc_charlen *cl;            /* For character types only.  */
    1041                 :            :     int pad;                    /* For hollerith types only.  */
    1042                 :            :   }
    1043                 :            :   u;
    1044                 :            : 
    1045                 :            :   struct gfc_symbol *interface; /* For PROCEDURE declarations.  */
    1046                 :            :   int is_c_interop;
    1047                 :            :   int is_iso_c;
    1048                 :            :   bt f90_type;
    1049                 :            :   bool deferred;
    1050                 :            :   gfc_symbol *interop_kind;
    1051                 :            : }
    1052                 :            : gfc_typespec;
    1053                 :            : 
    1054                 :            : /* Array specification.  */
    1055                 :            : typedef struct
    1056                 :            : {
    1057                 :            :   int rank;     /* A scalar has a rank of 0, an assumed-rank array has -1.  */
    1058                 :            :   int corank;
    1059                 :            :   array_type type, cotype;
    1060                 :            :   struct gfc_expr *lower[GFC_MAX_DIMENSIONS], *upper[GFC_MAX_DIMENSIONS];
    1061                 :            : 
    1062                 :            :   /* These two fields are used with the Cray Pointer extension.  */
    1063                 :            :   bool cray_pointee; /* True iff this spec belongs to a cray pointee.  */
    1064                 :            :   bool cp_was_assumed; /* AS_ASSUMED_SIZE cp arrays are converted to
    1065                 :            :                         AS_EXPLICIT, but we want to remember that we
    1066                 :            :                         did this.  */
    1067                 :            : 
    1068                 :            :   bool resolved;
    1069                 :            : }
    1070                 :            : gfc_array_spec;
    1071                 :            : 
    1072                 :            : #define gfc_get_array_spec() XCNEW (gfc_array_spec)
    1073                 :            : 
    1074                 :            : 
    1075                 :            : /* Components of derived types.  */
    1076                 :            : typedef struct gfc_component
    1077                 :            : {
    1078                 :            :   const char *name;
    1079                 :            :   gfc_typespec ts;
    1080                 :            : 
    1081                 :            :   symbol_attribute attr;
    1082                 :            :   gfc_array_spec *as;
    1083                 :            : 
    1084                 :            :   tree backend_decl;
    1085                 :            :   /* Used to cache a FIELD_DECL matching this same component
    1086                 :            :      but applied to a different backend containing type that was
    1087                 :            :      generated by gfc_nonrestricted_type.  */
    1088                 :            :   tree norestrict_decl;
    1089                 :            :   locus loc;
    1090                 :            :   struct gfc_expr *initializer;
    1091                 :            :   /* Used in parameterized derived type declarations to store parameterized
    1092                 :            :      kind expressions.  */
    1093                 :            :   struct gfc_expr *kind_expr;
    1094                 :            :   struct gfc_actual_arglist *param_list;
    1095                 :            : 
    1096                 :            :   struct gfc_component *next;
    1097                 :            : 
    1098                 :            :   /* Needed for procedure pointer components.  */
    1099                 :            :   struct gfc_typebound_proc *tb;
    1100                 :            :   /* When allocatable/pointer and in a coarray the associated token.  */
    1101                 :            :   tree caf_token;
    1102                 :            :   bool finalized;
    1103                 :            : }
    1104                 :            : gfc_component;
    1105                 :            : 
    1106                 :            : #define gfc_get_component() XCNEW (gfc_component)
    1107                 :            : 
    1108                 :            : /* Formal argument lists are lists of symbols.  */
    1109                 :            : typedef struct gfc_formal_arglist
    1110                 :            : {
    1111                 :            :   /* Symbol representing the argument at this position in the arglist.  */
    1112                 :            :   struct gfc_symbol *sym;
    1113                 :            :   /* Points to the next formal argument.  */
    1114                 :            :   struct gfc_formal_arglist *next;
    1115                 :            : }
    1116                 :            : gfc_formal_arglist;
    1117                 :            : 
    1118                 :            : #define gfc_get_formal_arglist() XCNEW (gfc_formal_arglist)
    1119                 :            : 
    1120                 :            : 
    1121                 :            : /* The gfc_actual_arglist structure is for actual arguments and
    1122                 :            :    for type parameter specification lists.  */
    1123                 :            : typedef struct gfc_actual_arglist
    1124                 :            : {
    1125                 :            :   const char *name;
    1126                 :            :   /* Alternate return label when the expr member is null.  */
    1127                 :            :   struct gfc_st_label *label;
    1128                 :            : 
    1129                 :            :   /* This is set to the type of an eventual omitted optional
    1130                 :            :      argument. This is used to determine if a hidden string length
    1131                 :            :      argument has to be added to a function call.  */
    1132                 :            :   bt missing_arg_type;
    1133                 :            : 
    1134                 :            :   gfc_param_spec_type spec_type;
    1135                 :            : 
    1136                 :            :   struct gfc_expr *expr;
    1137                 :            :   struct gfc_actual_arglist *next;
    1138                 :            : }
    1139                 :            : gfc_actual_arglist;
    1140                 :            : 
    1141                 :            : #define gfc_get_actual_arglist() XCNEW (gfc_actual_arglist)
    1142                 :            : 
    1143                 :            : 
    1144                 :            : /* Because a symbol can belong to multiple namelists, they must be
    1145                 :            :    linked externally to the symbol itself.  */
    1146                 :            : typedef struct gfc_namelist
    1147                 :            : {
    1148                 :            :   struct gfc_symbol *sym;
    1149                 :            :   struct gfc_namelist *next;
    1150                 :            : }
    1151                 :            : gfc_namelist;
    1152                 :            : 
    1153                 :            : #define gfc_get_namelist() XCNEW (gfc_namelist)
    1154                 :            : 
    1155                 :            : /* Likewise to gfc_namelist, but contains expressions.  */
    1156                 :            : typedef struct gfc_expr_list
    1157                 :            : {
    1158                 :            :   struct gfc_expr *expr;
    1159                 :            :   struct gfc_expr_list *next;
    1160                 :            : }
    1161                 :            : gfc_expr_list;
    1162                 :            : 
    1163                 :            : #define gfc_get_expr_list() XCNEW (gfc_expr_list)
    1164                 :            : 
    1165                 :            : enum gfc_omp_reduction_op
    1166                 :            : {
    1167                 :            :   OMP_REDUCTION_NONE = -1,
    1168                 :            :   OMP_REDUCTION_PLUS = INTRINSIC_PLUS,
    1169                 :            :   OMP_REDUCTION_MINUS = INTRINSIC_MINUS,
    1170                 :            :   OMP_REDUCTION_TIMES = INTRINSIC_TIMES,
    1171                 :            :   OMP_REDUCTION_AND = INTRINSIC_AND,
    1172                 :            :   OMP_REDUCTION_OR = INTRINSIC_OR,
    1173                 :            :   OMP_REDUCTION_EQV = INTRINSIC_EQV,
    1174                 :            :   OMP_REDUCTION_NEQV = INTRINSIC_NEQV,
    1175                 :            :   OMP_REDUCTION_MAX = GFC_INTRINSIC_END,
    1176                 :            :   OMP_REDUCTION_MIN,
    1177                 :            :   OMP_REDUCTION_IAND,
    1178                 :            :   OMP_REDUCTION_IOR,
    1179                 :            :   OMP_REDUCTION_IEOR,
    1180                 :            :   OMP_REDUCTION_USER
    1181                 :            : };
    1182                 :            : 
    1183                 :            : enum gfc_omp_depend_op
    1184                 :            : {
    1185                 :            :   OMP_DEPEND_IN,
    1186                 :            :   OMP_DEPEND_OUT,
    1187                 :            :   OMP_DEPEND_INOUT,
    1188                 :            :   OMP_DEPEND_SINK_FIRST,
    1189                 :            :   OMP_DEPEND_SINK
    1190                 :            : };
    1191                 :            : 
    1192                 :            : enum gfc_omp_map_op
    1193                 :            : {
    1194                 :            :   OMP_MAP_ALLOC,
    1195                 :            :   OMP_MAP_IF_PRESENT,
    1196                 :            :   OMP_MAP_ATTACH,
    1197                 :            :   OMP_MAP_TO,
    1198                 :            :   OMP_MAP_FROM,
    1199                 :            :   OMP_MAP_TOFROM,
    1200                 :            :   OMP_MAP_DELETE,
    1201                 :            :   OMP_MAP_DETACH,
    1202                 :            :   OMP_MAP_FORCE_ALLOC,
    1203                 :            :   OMP_MAP_FORCE_TO,
    1204                 :            :   OMP_MAP_FORCE_FROM,
    1205                 :            :   OMP_MAP_FORCE_TOFROM,
    1206                 :            :   OMP_MAP_FORCE_PRESENT,
    1207                 :            :   OMP_MAP_FORCE_DEVICEPTR,
    1208                 :            :   OMP_MAP_DEVICE_RESIDENT,
    1209                 :            :   OMP_MAP_LINK,
    1210                 :            :   OMP_MAP_RELEASE,
    1211                 :            :   OMP_MAP_ALWAYS_TO,
    1212                 :            :   OMP_MAP_ALWAYS_FROM,
    1213                 :            :   OMP_MAP_ALWAYS_TOFROM
    1214                 :            : };
    1215                 :            : 
    1216                 :            : enum gfc_omp_linear_op
    1217                 :            : {
    1218                 :            :   OMP_LINEAR_DEFAULT,
    1219                 :            :   OMP_LINEAR_REF,
    1220                 :            :   OMP_LINEAR_VAL,
    1221                 :            :   OMP_LINEAR_UVAL
    1222                 :            : };
    1223                 :            : 
    1224                 :            : /* For use in OpenMP clauses in case we need extra information
    1225                 :            :    (aligned clause alignment, linear clause step, etc.).  */
    1226                 :            : 
    1227                 :            : typedef struct gfc_omp_namelist
    1228                 :            : {
    1229                 :            :   struct gfc_symbol *sym;
    1230                 :            :   struct gfc_expr *expr;
    1231                 :            :   union
    1232                 :            :     {
    1233                 :            :       gfc_omp_reduction_op reduction_op;
    1234                 :            :       gfc_omp_depend_op depend_op;
    1235                 :            :       gfc_omp_map_op map_op;
    1236                 :            :       gfc_omp_linear_op linear_op;
    1237                 :            :       struct gfc_common_head *common;
    1238                 :            :     } u;
    1239                 :            :   struct gfc_omp_namelist_udr *udr;
    1240                 :            :   struct gfc_omp_namelist *next;
    1241                 :            :   locus where;
    1242                 :            : }
    1243                 :            : gfc_omp_namelist;
    1244                 :            : 
    1245                 :            : #define gfc_get_omp_namelist() XCNEW (gfc_omp_namelist)
    1246                 :            : 
    1247                 :            : enum
    1248                 :            : {
    1249                 :            :   OMP_LIST_FIRST,
    1250                 :            :   OMP_LIST_PRIVATE = OMP_LIST_FIRST,
    1251                 :            :   OMP_LIST_FIRSTPRIVATE,
    1252                 :            :   OMP_LIST_LASTPRIVATE,
    1253                 :            :   OMP_LIST_COPYPRIVATE,
    1254                 :            :   OMP_LIST_SHARED,
    1255                 :            :   OMP_LIST_COPYIN,
    1256                 :            :   OMP_LIST_UNIFORM,
    1257                 :            :   OMP_LIST_ALIGNED,
    1258                 :            :   OMP_LIST_LINEAR,
    1259                 :            :   OMP_LIST_DEPEND,
    1260                 :            :   OMP_LIST_MAP,
    1261                 :            :   OMP_LIST_TO,
    1262                 :            :   OMP_LIST_FROM,
    1263                 :            :   OMP_LIST_REDUCTION,
    1264                 :            :   OMP_LIST_DEVICE_RESIDENT,
    1265                 :            :   OMP_LIST_LINK,
    1266                 :            :   OMP_LIST_USE_DEVICE,
    1267                 :            :   OMP_LIST_CACHE,
    1268                 :            :   OMP_LIST_IS_DEVICE_PTR,
    1269                 :            :   OMP_LIST_USE_DEVICE_PTR,
    1270                 :            :   OMP_LIST_USE_DEVICE_ADDR,
    1271                 :            :   OMP_LIST_NUM
    1272                 :            : };
    1273                 :            : 
    1274                 :            : /* Because a symbol can belong to multiple namelists, they must be
    1275                 :            :    linked externally to the symbol itself.  */
    1276                 :            : 
    1277                 :            : enum gfc_omp_sched_kind
    1278                 :            : {
    1279                 :            :   OMP_SCHED_NONE,
    1280                 :            :   OMP_SCHED_STATIC,
    1281                 :            :   OMP_SCHED_DYNAMIC,
    1282                 :            :   OMP_SCHED_GUIDED,
    1283                 :            :   OMP_SCHED_RUNTIME,
    1284                 :            :   OMP_SCHED_AUTO
    1285                 :            : };
    1286                 :            : 
    1287                 :            : enum gfc_omp_default_sharing
    1288                 :            : {
    1289                 :            :   OMP_DEFAULT_UNKNOWN,
    1290                 :            :   OMP_DEFAULT_NONE,
    1291                 :            :   OMP_DEFAULT_PRIVATE,
    1292                 :            :   OMP_DEFAULT_SHARED,
    1293                 :            :   OMP_DEFAULT_FIRSTPRIVATE,
    1294                 :            :   OMP_DEFAULT_PRESENT
    1295                 :            : };
    1296                 :            : 
    1297                 :            : enum gfc_omp_proc_bind_kind
    1298                 :            : {
    1299                 :            :   OMP_PROC_BIND_UNKNOWN,
    1300                 :            :   OMP_PROC_BIND_MASTER,
    1301                 :            :   OMP_PROC_BIND_SPREAD,
    1302                 :            :   OMP_PROC_BIND_CLOSE
    1303                 :            : };
    1304                 :            : 
    1305                 :            : enum gfc_omp_cancel_kind
    1306                 :            : {
    1307                 :            :   OMP_CANCEL_UNKNOWN,
    1308                 :            :   OMP_CANCEL_PARALLEL,
    1309                 :            :   OMP_CANCEL_SECTIONS,
    1310                 :            :   OMP_CANCEL_DO,
    1311                 :            :   OMP_CANCEL_TASKGROUP
    1312                 :            : };
    1313                 :            : 
    1314                 :            : enum gfc_omp_if_kind
    1315                 :            : {
    1316                 :            :   OMP_IF_PARALLEL,
    1317                 :            :   OMP_IF_TASK,
    1318                 :            :   OMP_IF_TASKLOOP,
    1319                 :            :   OMP_IF_TARGET,
    1320                 :            :   OMP_IF_TARGET_DATA,
    1321                 :            :   OMP_IF_TARGET_UPDATE,
    1322                 :            :   OMP_IF_TARGET_ENTER_DATA,
    1323                 :            :   OMP_IF_TARGET_EXIT_DATA,
    1324                 :            :   OMP_IF_LAST
    1325                 :            : };
    1326                 :            : 
    1327                 :            : typedef struct gfc_omp_clauses
    1328                 :            : {
    1329                 :            :   struct gfc_expr *if_expr;
    1330                 :            :   struct gfc_expr *final_expr;
    1331                 :            :   struct gfc_expr *num_threads;
    1332                 :            :   gfc_omp_namelist *lists[OMP_LIST_NUM];
    1333                 :            :   enum gfc_omp_sched_kind sched_kind;
    1334                 :            :   struct gfc_expr *chunk_size;
    1335                 :            :   enum gfc_omp_default_sharing default_sharing;
    1336                 :            :   int collapse, orderedc;
    1337                 :            :   bool nowait, ordered, untied, mergeable;
    1338                 :            :   bool inbranch, notinbranch, defaultmap, nogroup;
    1339                 :            :   bool sched_simd, sched_monotonic, sched_nonmonotonic;
    1340                 :            :   bool simd, threads, depend_source;
    1341                 :            :   enum gfc_omp_cancel_kind cancel;
    1342                 :            :   enum gfc_omp_proc_bind_kind proc_bind;
    1343                 :            :   struct gfc_expr *safelen_expr;
    1344                 :            :   struct gfc_expr *simdlen_expr;
    1345                 :            :   struct gfc_expr *num_teams;
    1346                 :            :   struct gfc_expr *device;
    1347                 :            :   struct gfc_expr *thread_limit;
    1348                 :            :   struct gfc_expr *grainsize;
    1349                 :            :   struct gfc_expr *hint;
    1350                 :            :   struct gfc_expr *num_tasks;
    1351                 :            :   struct gfc_expr *priority;
    1352                 :            :   struct gfc_expr *if_exprs[OMP_IF_LAST];
    1353                 :            :   enum gfc_omp_sched_kind dist_sched_kind;
    1354                 :            :   struct gfc_expr *dist_chunk_size;
    1355                 :            :   const char *critical_name;
    1356                 :            : 
    1357                 :            :   /* OpenACC. */
    1358                 :            :   struct gfc_expr *async_expr;
    1359                 :            :   struct gfc_expr *gang_static_expr;
    1360                 :            :   struct gfc_expr *gang_num_expr;
    1361                 :            :   struct gfc_expr *worker_expr;
    1362                 :            :   struct gfc_expr *vector_expr;
    1363                 :            :   struct gfc_expr *num_gangs_expr;
    1364                 :            :   struct gfc_expr *num_workers_expr;
    1365                 :            :   struct gfc_expr *vector_length_expr;
    1366                 :            :   gfc_expr_list *wait_list;
    1367                 :            :   gfc_expr_list *tile_list;
    1368                 :            :   unsigned async:1, gang:1, worker:1, vector:1, seq:1, independent:1;
    1369                 :            :   unsigned par_auto:1, gang_static:1;
    1370                 :            :   unsigned if_present:1, finalize:1;
    1371                 :            :   locus loc;
    1372                 :            : 
    1373                 :            : }
    1374                 :            : gfc_omp_clauses;
    1375                 :            : 
    1376                 :            : #define gfc_get_omp_clauses() XCNEW (gfc_omp_clauses)
    1377                 :            : 
    1378                 :            : 
    1379                 :            : /* Node in the linked list used for storing !$oacc declare constructs.  */
    1380                 :            : 
    1381                 :            : typedef struct gfc_oacc_declare
    1382                 :            : {
    1383                 :            :   struct gfc_oacc_declare *next;
    1384                 :            :   bool module_var;
    1385                 :            :   gfc_omp_clauses *clauses;
    1386                 :            :   locus loc;
    1387                 :            : }
    1388                 :            : gfc_oacc_declare;
    1389                 :            : 
    1390                 :            : #define gfc_get_oacc_declare() XCNEW (gfc_oacc_declare)
    1391                 :            : 
    1392                 :            : 
    1393                 :            : /* Node in the linked list used for storing !$omp declare simd constructs.  */
    1394                 :            : 
    1395                 :            : typedef struct gfc_omp_declare_simd
    1396                 :            : {
    1397                 :            :   struct gfc_omp_declare_simd *next;
    1398                 :            :   locus where; /* Where the !$omp declare simd construct occurred.  */
    1399                 :            : 
    1400                 :            :   gfc_symbol *proc_name;
    1401                 :            : 
    1402                 :            :   gfc_omp_clauses *clauses;
    1403                 :            : }
    1404                 :            : gfc_omp_declare_simd;
    1405                 :            : #define gfc_get_omp_declare_simd() XCNEW (gfc_omp_declare_simd)
    1406                 :            : 
    1407                 :            : typedef struct gfc_omp_udr
    1408                 :            : {
    1409                 :            :   struct gfc_omp_udr *next;
    1410                 :            :   locus where; /* Where the !$omp declare reduction construct occurred.  */
    1411                 :            : 
    1412                 :            :   const char *name;
    1413                 :            :   gfc_typespec ts;
    1414                 :            :   gfc_omp_reduction_op rop;
    1415                 :            : 
    1416                 :            :   struct gfc_symbol *omp_out;
    1417                 :            :   struct gfc_symbol *omp_in;
    1418                 :            :   struct gfc_namespace *combiner_ns;
    1419                 :            : 
    1420                 :            :   struct gfc_symbol *omp_priv;
    1421                 :            :   struct gfc_symbol *omp_orig;
    1422                 :            :   struct gfc_namespace *initializer_ns;
    1423                 :            : }
    1424                 :            : gfc_omp_udr;
    1425                 :            : #define gfc_get_omp_udr() XCNEW (gfc_omp_udr)
    1426                 :            : 
    1427                 :            : typedef struct gfc_omp_namelist_udr
    1428                 :            : {
    1429                 :            :   struct gfc_omp_udr *udr;
    1430                 :            :   struct gfc_code *combiner;
    1431                 :            :   struct gfc_code *initializer;
    1432                 :            : }
    1433                 :            : gfc_omp_namelist_udr;
    1434                 :            : #define gfc_get_omp_namelist_udr() XCNEW (gfc_omp_namelist_udr)
    1435                 :            : 
    1436                 :            : /* The gfc_st_label structure is a BBT attached to a namespace that
    1437                 :            :    records the usage of statement labels within that space.  */
    1438                 :            : 
    1439                 :            : typedef struct gfc_st_label
    1440                 :            : {
    1441                 :            :   BBT_HEADER(gfc_st_label);
    1442                 :            : 
    1443                 :            :   int value;
    1444                 :            : 
    1445                 :            :   gfc_sl_type defined, referenced;
    1446                 :            : 
    1447                 :            :   struct gfc_expr *format;
    1448                 :            : 
    1449                 :            :   tree backend_decl;
    1450                 :            : 
    1451                 :            :   locus where;
    1452                 :            : 
    1453                 :            :   gfc_namespace *ns;
    1454                 :            : }
    1455                 :            : gfc_st_label;
    1456                 :            : 
    1457                 :            : 
    1458                 :            : /* gfc_interface()-- Interfaces are lists of symbols strung together.  */
    1459                 :            : typedef struct gfc_interface
    1460                 :            : {
    1461                 :            :   struct gfc_symbol *sym;
    1462                 :            :   locus where;
    1463                 :            :   struct gfc_interface *next;
    1464                 :            : }
    1465                 :            : gfc_interface;
    1466                 :            : 
    1467                 :            : #define gfc_get_interface() XCNEW (gfc_interface)
    1468                 :            : 
    1469                 :            : /* User operator nodes.  These are like stripped down symbols.  */
    1470                 :            : typedef struct
    1471                 :            : {
    1472                 :            :   const char *name;
    1473                 :            : 
    1474                 :            :   gfc_interface *op;
    1475                 :            :   struct gfc_namespace *ns;
    1476                 :            :   gfc_access access;
    1477                 :            : }
    1478                 :            : gfc_user_op;
    1479                 :            : 
    1480                 :            : 
    1481                 :            : /* A list of specific bindings that are associated with a generic spec.  */
    1482                 :            : typedef struct gfc_tbp_generic
    1483                 :            : {
    1484                 :            :   /* The parser sets specific_st, upon resolution we look for the corresponding
    1485                 :            :      gfc_typebound_proc and set specific for further use.  */
    1486                 :            :   struct gfc_symtree* specific_st;
    1487                 :            :   struct gfc_typebound_proc* specific;
    1488                 :            : 
    1489                 :            :   struct gfc_tbp_generic* next;
    1490                 :            :   bool is_operator;
    1491                 :            : }
    1492                 :            : gfc_tbp_generic;
    1493                 :            : 
    1494                 :            : #define gfc_get_tbp_generic() XCNEW (gfc_tbp_generic)
    1495                 :            : 
    1496                 :            : 
    1497                 :            : /* Data needed for type-bound procedures.  */
    1498                 :            : typedef struct gfc_typebound_proc
    1499                 :            : {
    1500                 :            :   locus where; /* Where the PROCEDURE/GENERIC definition was.  */
    1501                 :            : 
    1502                 :            :   union
    1503                 :            :   {
    1504                 :            :     struct gfc_symtree* specific; /* The interface if DEFERRED.  */
    1505                 :            :     gfc_tbp_generic* generic;
    1506                 :            :   }
    1507                 :            :   u;
    1508                 :            : 
    1509                 :            :   gfc_access access;
    1510                 :            :   const char* pass_arg; /* Argument-name for PASS.  NULL if not specified.  */
    1511                 :            : 
    1512                 :            :   /* The overridden type-bound proc (or GENERIC with this name in the
    1513                 :            :      parent-type) or NULL if non.  */
    1514                 :            :   struct gfc_typebound_proc* overridden;
    1515                 :            : 
    1516                 :            :   /* Once resolved, we use the position of pass_arg in the formal arglist of
    1517                 :            :      the binding-target procedure to identify it.  The first argument has
    1518                 :            :      number 1 here, the second 2, and so on.  */
    1519                 :            :   unsigned pass_arg_num;
    1520                 :            : 
    1521                 :            :   unsigned nopass:1; /* Whether we have NOPASS (PASS otherwise).  */
    1522                 :            :   unsigned non_overridable:1;
    1523                 :            :   unsigned deferred:1;
    1524                 :            :   unsigned is_generic:1;
    1525                 :            :   unsigned function:1, subroutine:1;
    1526                 :            :   unsigned error:1; /* Ignore it, when an error occurred during resolution.  */
    1527                 :            :   unsigned ppc:1;
    1528                 :            : }
    1529                 :            : gfc_typebound_proc;
    1530                 :            : 
    1531                 :            : 
    1532                 :            : /* Symbol nodes.  These are important things.  They are what the
    1533                 :            :    standard refers to as "entities".  The possibly multiple names that
    1534                 :            :    refer to the same entity are accomplished by a binary tree of
    1535                 :            :    symtree structures that is balanced by the red-black method-- more
    1536                 :            :    than one symtree node can point to any given symbol.  */
    1537                 :            : 
    1538                 :            : typedef struct gfc_symbol
    1539                 :            : {
    1540                 :            :   const char *name;     /* Primary name, before renaming */
    1541                 :            :   const char *module;   /* Module this symbol came from */
    1542                 :            :   locus declared_at;
    1543                 :            : 
    1544                 :            :   gfc_typespec ts;
    1545                 :            :   symbol_attribute attr;
    1546                 :            : 
    1547                 :            :   /* The formal member points to the formal argument list if the
    1548                 :            :      symbol is a function or subroutine name.  If the symbol is a
    1549                 :            :      generic name, the generic member points to the list of
    1550                 :            :      interfaces.  */
    1551                 :            : 
    1552                 :            :   gfc_interface *generic;
    1553                 :            :   gfc_access component_access;
    1554                 :            : 
    1555                 :            :   gfc_formal_arglist *formal;
    1556                 :            :   struct gfc_namespace *formal_ns;
    1557                 :            :   struct gfc_namespace *f2k_derived;
    1558                 :            : 
    1559                 :            :   /* List of PDT parameter expressions  */
    1560                 :            :   struct gfc_actual_arglist *param_list;
    1561                 :            : 
    1562                 :            :   struct gfc_expr *value;       /* Parameter/Initializer value */
    1563                 :            :   gfc_array_spec *as;
    1564                 :            :   struct gfc_symbol *result;    /* function result symbol */
    1565                 :            :   gfc_component *components;    /* Derived type components */
    1566                 :            : 
    1567                 :            :   /* Defined only for Cray pointees; points to their pointer.  */
    1568                 :            :   struct gfc_symbol *cp_pointer;
    1569                 :            : 
    1570                 :            :   int entry_id;                 /* Used in resolve.c for entries.  */
    1571                 :            : 
    1572                 :            :   /* CLASS hashed name for declared and dynamic types in the class.  */
    1573                 :            :   int hash_value;
    1574                 :            : 
    1575                 :            :   struct gfc_symbol *common_next;       /* Links for COMMON syms */
    1576                 :            : 
    1577                 :            :   /* This is only used for pointer comparisons to check if symbols
    1578                 :            :      are in the same common block.
    1579                 :            :      In opposition to common_block, the common_head pointer takes into account
    1580                 :            :      equivalences: if A is in a common block C and A and B are in equivalence,
    1581                 :            :      then both A and B have common_head pointing to C, while A's common_block
    1582                 :            :      points to C and B's is NULL.  */
    1583                 :            :   struct gfc_common_head* common_head;
    1584                 :            : 
    1585                 :            :   /* Make sure setup code for dummy arguments is generated in the correct
    1586                 :            :      order.  */
    1587                 :            :   int dummy_order;
    1588                 :            : 
    1589                 :            :   gfc_namelist *namelist, *namelist_tail;
    1590                 :            : 
    1591                 :            :   /* Change management fields.  Symbols that might be modified by the
    1592                 :            :      current statement have the mark member nonzero.  Of these symbols,
    1593                 :            :      symbols with old_symbol equal to NULL are symbols created within
    1594                 :            :      the current statement.  Otherwise, old_symbol points to a copy of
    1595                 :            :      the old symbol. gfc_new is used in symbol.c to flag new symbols.
    1596                 :            :      comp_mark is used to indicate variables which have component accesses
    1597                 :            :      in OpenMP/OpenACC directive clauses.  */
    1598                 :            :   struct gfc_symbol *old_symbol;
    1599                 :            :   unsigned mark:1, comp_mark:1, gfc_new:1;
    1600                 :            : 
    1601                 :            :   /* The tlink field is used in the front end to carry the module
    1602                 :            :      declaration of separate module procedures so that the characteristics
    1603                 :            :      can be compared with the corresponding declaration in a submodule. In
    1604                 :            :      translation this field carries a linked list of symbols that require
    1605                 :            :      deferred initialization.  */
    1606                 :            :   struct gfc_symbol *tlink;
    1607                 :            : 
    1608                 :            :   /* Nonzero if all equivalences associated with this symbol have been
    1609                 :            :      processed.  */
    1610                 :            :   unsigned equiv_built:1;
    1611                 :            :   /* Set if this variable is used as an index name in a FORALL.  */
    1612                 :            :   unsigned forall_index:1;
    1613                 :            :   /* Set if the symbol is used in a function result specification .  */
    1614                 :            :   unsigned fn_result_spec:1;
    1615                 :            :   /* Used to avoid multiple resolutions of a single symbol.  */
    1616                 :            :   unsigned resolved:1;
    1617                 :            :   /* Set if this is a module function or subroutine with the
    1618                 :            :      abreviated declaration in a submodule.  */
    1619                 :            :   unsigned abr_modproc_decl:1;
    1620                 :            :   /* Set if a previous error or warning has occurred and no other
    1621                 :            :      should be reported.  */
    1622                 :            :   unsigned error:1;
    1623                 :            :   /* Set if the dummy argument of a procedure could be an array despite
    1624                 :            :      being called with a scalar actual argument. */
    1625                 :            :   unsigned maybe_array:1;
    1626                 :            : 
    1627                 :            :   int refs;
    1628                 :            :   struct gfc_namespace *ns;     /* namespace containing this symbol */
    1629                 :            : 
    1630                 :            :   tree backend_decl;
    1631                 :            : 
    1632                 :            :   /* Identity of the intrinsic module the symbol comes from, or
    1633                 :            :      INTMOD_NONE if it's not imported from a intrinsic module.  */
    1634                 :            :   intmod_id from_intmod;
    1635                 :            :   /* Identity of the symbol from intrinsic modules, from enums maintained
    1636                 :            :      separately by each intrinsic module.  Used together with from_intmod,
    1637                 :            :      it uniquely identifies a symbol from an intrinsic module.  */
    1638                 :            :   int intmod_sym_id;
    1639                 :            : 
    1640                 :            :   /* This may be repetitive, since the typespec now has a binding
    1641                 :            :      label field.  */
    1642                 :            :   const char* binding_label;
    1643                 :            :   /* Store a reference to the common_block, if this symbol is in one.  */
    1644                 :            :   struct gfc_common_head *common_block;
    1645                 :            : 
    1646                 :            :   /* Link to corresponding association-list if this is an associate name.  */
    1647                 :            :   struct gfc_association_list *assoc;
    1648                 :            : 
    1649                 :            :   /* Link to next entry in derived type list */
    1650                 :            :   struct gfc_symbol *dt_next;
    1651                 :            : }
    1652                 :            : gfc_symbol;
    1653                 :            : 
    1654                 :            : 
    1655                 :            : struct gfc_undo_change_set
    1656                 :            : {
    1657                 :            :   vec<gfc_symbol *> syms;
    1658                 :            :   vec<gfc_typebound_proc *> tbps;
    1659                 :            :   gfc_undo_change_set *previous;
    1660                 :            : };
    1661                 :            : 
    1662                 :            : 
    1663                 :            : /* This structure is used to keep track of symbols in common blocks.  */
    1664                 :            : typedef struct gfc_common_head
    1665                 :            : {
    1666                 :            :   locus where;
    1667                 :            :   char use_assoc, saved, threadprivate;
    1668                 :            :   unsigned char omp_declare_target : 1;
    1669                 :            :   unsigned char omp_declare_target_link : 1;
    1670                 :            :   char name[GFC_MAX_SYMBOL_LEN + 1];
    1671                 :            :   struct gfc_symbol *head;
    1672                 :            :   const char* binding_label;
    1673                 :            :   int is_bind_c;
    1674                 :            :   int refs;
    1675                 :            : }
    1676                 :            : gfc_common_head;
    1677                 :            : 
    1678                 :            : #define gfc_get_common_head() XCNEW (gfc_common_head)
    1679                 :            : 
    1680                 :            : 
    1681                 :            : /* A list of all the alternate entry points for a procedure.  */
    1682                 :            : 
    1683                 :            : typedef struct gfc_entry_list
    1684                 :            : {
    1685                 :            :   /* The symbol for this entry point.  */
    1686                 :            :   gfc_symbol *sym;
    1687                 :            :   /* The zero-based id of this entry point.  */
    1688                 :            :   int id;
    1689                 :            :   /* The LABEL_EXPR marking this entry point.  */
    1690                 :            :   tree label;
    1691                 :            :   /* The next item in the list.  */
    1692                 :            :   struct gfc_entry_list *next;
    1693                 :            : }
    1694                 :            : gfc_entry_list;
    1695                 :            : 
    1696                 :            : #define gfc_get_entry_list() XCNEW (gfc_entry_list)
    1697                 :            : 
    1698                 :            : /* Lists of rename info for the USE statement.  */
    1699                 :            : 
    1700                 :            : typedef struct gfc_use_rename
    1701                 :            : {
    1702                 :            :   char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
    1703                 :            :   struct gfc_use_rename *next;
    1704                 :            :   int found;
    1705                 :            :   gfc_intrinsic_op op;
    1706                 :            :   locus where;
    1707                 :            : }
    1708                 :            : gfc_use_rename;
    1709                 :            : 
    1710                 :            : #define gfc_get_use_rename() XCNEW (gfc_use_rename);
    1711                 :            : 
    1712                 :            : /* A list of all USE statements in a namespace.  */
    1713                 :            : 
    1714                 :            : typedef struct gfc_use_list
    1715                 :            : {
    1716                 :            :   const char *module_name;
    1717                 :            :   const char *submodule_name;
    1718                 :            :   bool intrinsic;
    1719                 :            :   bool non_intrinsic;
    1720                 :            :   bool only_flag;
    1721                 :            :   struct gfc_use_rename *rename;
    1722                 :            :   locus where;
    1723                 :            :   /* Next USE statement.  */
    1724                 :            :   struct gfc_use_list *next;
    1725                 :            : }
    1726                 :            : gfc_use_list;
    1727                 :            : 
    1728                 :            : #define gfc_get_use_list() XCNEW (gfc_use_list)
    1729                 :            : 
    1730                 :            : /* Within a namespace, symbols are pointed to by symtree nodes that
    1731                 :            :    are linked together in a balanced binary tree.  There can be
    1732                 :            :    several symtrees pointing to the same symbol node via USE
    1733                 :            :    statements.  */
    1734                 :            : 
    1735                 :            : typedef struct gfc_symtree
    1736                 :            : {
    1737                 :            :   BBT_HEADER (gfc_symtree);
    1738                 :            :   const char *name;
    1739                 :            :   int ambiguous;
    1740                 :            :   union
    1741                 :            :   {
    1742                 :            :     gfc_symbol *sym;            /* Symbol associated with this node */
    1743                 :            :     gfc_user_op *uop;
    1744                 :            :     gfc_common_head *common;
    1745                 :            :     gfc_typebound_proc *tb;
    1746                 :            :     gfc_omp_udr *omp_udr;
    1747                 :            :   }
    1748                 :            :   n;
    1749                 :            : }
    1750                 :            : gfc_symtree;
    1751                 :            : 
    1752                 :            : /* A list of all derived types.  */
    1753                 :            : extern gfc_symbol *gfc_derived_types;
    1754                 :            : 
    1755                 :            : typedef struct gfc_oacc_routine_name
    1756                 :            : {
    1757                 :            :   struct gfc_symbol *sym;
    1758                 :            :   struct gfc_omp_clauses *clauses;
    1759                 :            :   struct gfc_oacc_routine_name *next;
    1760                 :            :   locus loc;
    1761                 :            : }
    1762                 :            : gfc_oacc_routine_name;
    1763                 :            : 
    1764                 :            : #define gfc_get_oacc_routine_name() XCNEW (gfc_oacc_routine_name)
    1765                 :            : 
    1766                 :            : /* A namespace describes the contents of procedure, module, interface block
    1767                 :            :    or BLOCK construct.  */
    1768                 :            : /* ??? Anything else use these?  */
    1769                 :            : 
    1770                 :            : typedef struct gfc_namespace
    1771                 :            : {
    1772                 :            :   /* Tree containing all the symbols in this namespace.  */
    1773                 :            :   gfc_symtree *sym_root;
    1774                 :            :   /* Tree containing all the user-defined operators in the namespace.  */
    1775                 :            :   gfc_symtree *uop_root;
    1776                 :            :   /* Tree containing all the common blocks.  */
    1777                 :            :   gfc_symtree *common_root;
    1778                 :            :   /* Tree containing all the OpenMP user defined reductions.  */
    1779                 :            :   gfc_symtree *omp_udr_root;
    1780                 :            : 
    1781                 :            :   /* Tree containing type-bound procedures.  */
    1782                 :            :   gfc_symtree *tb_sym_root;
    1783                 :            :   /* Type-bound user operators.  */
    1784                 :            :   gfc_symtree *tb_uop_root;
    1785                 :            :   /* For derived-types, store type-bound intrinsic operators here.  */
    1786                 :            :   gfc_typebound_proc *tb_op[GFC_INTRINSIC_OPS];
    1787                 :            :   /* Linked list of finalizer procedures.  */
    1788                 :            :   struct gfc_finalizer *finalizers;
    1789                 :            : 
    1790                 :            :   /* If set_flag[letter] is set, an implicit type has been set for letter.  */
    1791                 :            :   int set_flag[GFC_LETTERS];
    1792                 :            :   /* Keeps track of the implicit types associated with the letters.  */
    1793                 :            :   gfc_typespec default_type[GFC_LETTERS];
    1794                 :            :   /* Store the positions of IMPLICIT statements.  */
    1795                 :            :   locus implicit_loc[GFC_LETTERS];
    1796                 :            : 
    1797                 :            :   /* If this is a namespace of a procedure, this points to the procedure.  */
    1798                 :            :   struct gfc_symbol *proc_name;
    1799                 :            :   /* If this is the namespace of a unit which contains executable
    1800                 :            :      code, this points to it.  */
    1801                 :            :   struct gfc_code *code;
    1802                 :            : 
    1803                 :            :   /* Points to the equivalences set up in this namespace.  */
    1804                 :            :   struct gfc_equiv *equiv, *old_equiv;
    1805                 :            : 
    1806                 :            :   /* Points to the equivalence groups produced by trans_common.  */
    1807                 :            :   struct gfc_equiv_list *equiv_lists;
    1808                 :            : 
    1809                 :            :   gfc_interface *op[GFC_INTRINSIC_OPS];
    1810                 :            : 
    1811                 :            :   /* Points to the parent namespace, i.e. the namespace of a module or
    1812                 :            :      procedure in which the procedure belonging to this namespace is
    1813                 :            :      contained. The parent namespace points to this namespace either
    1814                 :            :      directly via CONTAINED, or indirectly via the chain built by
    1815                 :            :      SIBLING.  */
    1816                 :            :   struct gfc_namespace *parent;
    1817                 :            :   /* CONTAINED points to the first contained namespace. Sibling
    1818                 :            :      namespaces are chained via SIBLING.  */
    1819                 :            :   struct gfc_namespace  *contained, *sibling;
    1820                 :            : 
    1821                 :            :   gfc_common_head blank_common;
    1822                 :            :   gfc_access default_access, operator_access[GFC_INTRINSIC_OPS];
    1823                 :            : 
    1824                 :            :   gfc_st_label *st_labels;
    1825                 :            :   /* This list holds information about all the data initializers in
    1826                 :            :      this namespace.  */
    1827                 :            :   struct gfc_data *data, *old_data;
    1828                 :            : 
    1829                 :            :   /* !$ACC DECLARE.  */
    1830                 :            :   gfc_oacc_declare *oacc_declare;
    1831                 :            : 
    1832                 :            :   /* !$ACC ROUTINE clauses.  */
    1833                 :            :   gfc_omp_clauses *oacc_routine_clauses;
    1834                 :            : 
    1835                 :            :   /* !$ACC ROUTINE names.  */
    1836                 :            :   gfc_oacc_routine_name *oacc_routine_names;
    1837                 :            : 
    1838                 :            :   gfc_charlen *cl_list;
    1839                 :            : 
    1840                 :            :   gfc_symbol *derived_types;
    1841                 :            : 
    1842                 :            :   int save_all, seen_save, seen_implicit_none;
    1843                 :            : 
    1844                 :            :   /* Normally we don't need to refcount namespaces.  However when we read
    1845                 :            :      a module containing a function with multiple entry points, this
    1846                 :            :      will appear as several functions with the same formal namespace.  */
    1847                 :            :   int refs;
    1848                 :            : 
    1849                 :            :   /* A list of all alternate entry points to this procedure (or NULL).  */
    1850                 :            :   gfc_entry_list *entries;
    1851                 :            : 
    1852                 :            :   /* A list of USE statements in this namespace.  */
    1853                 :            :   gfc_use_list *use_stmts;
    1854                 :            : 
    1855                 :            :   /* Linked list of !$omp declare simd constructs.  */
    1856                 :            :   struct gfc_omp_declare_simd *omp_declare_simd;
    1857                 :            : 
    1858                 :            :   /* Set to 1 if namespace is a BLOCK DATA program unit.  */
    1859                 :            :   unsigned is_block_data:1;
    1860                 :            : 
    1861                 :            :   /* Set to 1 if namespace is an interface body with "IMPORT" used.  */
    1862                 :            :   unsigned has_import_set:1;
    1863                 :            : 
    1864                 :            :   /* Set to 1 if the namespace uses "IMPLICT NONE (export)".  */
    1865                 :            :   unsigned has_implicit_none_export:1;
    1866                 :            : 
    1867                 :            :   /* Set to 1 if resolved has been called for this namespace.
    1868                 :            :      Holds -1 during resolution.  */
    1869                 :            :   signed resolved:2;
    1870                 :            : 
    1871                 :            :   /* Set when resolve_types has been called for this namespace.  */
    1872                 :            :   unsigned types_resolved:1;
    1873                 :            : 
    1874                 :            :   /* Set to 1 if code has been generated for this namespace.  */
    1875                 :            :   unsigned translated:1;
    1876                 :            : 
    1877                 :            :   /* Set to 1 if symbols in this namespace should be 'construct entities',
    1878                 :            :      i.e. for BLOCK local variables.  */
    1879                 :            :   unsigned construct_entities:1;
    1880                 :            : 
    1881                 :            :   /* Set to 1 for !$OMP DECLARE REDUCTION namespaces.  */
    1882                 :            :   unsigned omp_udr_ns:1;
    1883                 :            : 
    1884                 :            :   /* Set to 1 for !$ACC ROUTINE namespaces.  */
    1885                 :            :   unsigned oacc_routine:1;
    1886                 :            : 
    1887                 :            :   /* Set to 1 if there are any calls to procedures with implicit interface.  */
    1888                 :            :   unsigned implicit_interface_calls:1;
    1889                 :            : }
    1890                 :            : gfc_namespace;
    1891                 :            : 
    1892                 :            : extern gfc_namespace *gfc_current_ns;
    1893                 :            : extern gfc_namespace *gfc_global_ns_list;
    1894                 :            : 
    1895                 :            : /* Global symbols are symbols of global scope. Currently we only use
    1896                 :            :    this to detect collisions already when parsing.
    1897                 :            :    TODO: Extend to verify procedure calls.  */
    1898                 :            : 
    1899                 :            : enum gfc_symbol_type
    1900                 :            : {
    1901                 :            :   GSYM_UNKNOWN=1, GSYM_PROGRAM, GSYM_FUNCTION, GSYM_SUBROUTINE,
    1902                 :            :   GSYM_MODULE, GSYM_COMMON, GSYM_BLOCK_DATA
    1903                 :            : };
    1904                 :            : 
    1905                 :            : typedef struct gfc_gsymbol
    1906                 :            : {
    1907                 :            :   BBT_HEADER(gfc_gsymbol);
    1908                 :            : 
    1909                 :            :   const char *name;
    1910                 :            :   const char *sym_name;
    1911                 :            :   const char *mod_name;
    1912                 :            :   const char *binding_label;
    1913                 :            :   enum gfc_symbol_type type;
    1914                 :            : 
    1915                 :            :   int defined, used;
    1916                 :            :   bool bind_c;
    1917                 :            :   locus where;
    1918                 :            :   gfc_namespace *ns;
    1919                 :            : }
    1920                 :            : gfc_gsymbol;
    1921                 :            : 
    1922                 :            : extern gfc_gsymbol *gfc_gsym_root;
    1923                 :            : 
    1924                 :            : /* Information on interfaces being built.  */
    1925                 :            : typedef struct
    1926                 :            : {
    1927                 :            :   interface_type type;
    1928                 :            :   gfc_symbol *sym;
    1929                 :            :   gfc_namespace *ns;
    1930                 :            :   gfc_user_op *uop;
    1931                 :            :   gfc_intrinsic_op op;
    1932                 :            : }
    1933                 :            : gfc_interface_info;
    1934                 :            : 
    1935                 :            : extern gfc_interface_info current_interface;
    1936                 :            : 
    1937                 :            : 
    1938                 :            : /* Array reference.  */
    1939                 :            : 
    1940                 :            : enum gfc_array_ref_dimen_type
    1941                 :            : {
    1942                 :            :   DIMEN_ELEMENT = 1, DIMEN_RANGE, DIMEN_VECTOR, DIMEN_STAR, DIMEN_THIS_IMAGE, DIMEN_UNKNOWN
    1943                 :            : };
    1944                 :            : 
    1945                 :            : typedef struct gfc_array_ref
    1946                 :            : {
    1947                 :            :   ar_type type;
    1948                 :            :   int dimen;                    /* # of components in the reference */
    1949                 :            :   int codimen;
    1950                 :            :   bool in_allocate;             /* For coarray checks. */
    1951                 :            :   gfc_expr *team;
    1952                 :            :   gfc_expr *stat;
    1953                 :            :   locus where;
    1954                 :            :   gfc_array_spec *as;
    1955                 :            : 
    1956                 :            :   locus c_where[GFC_MAX_DIMENSIONS];    /* All expressions can be NULL */
    1957                 :            :   struct gfc_expr *start[GFC_MAX_DIMENSIONS], *end[GFC_MAX_DIMENSIONS],
    1958                 :            :     *stride[GFC_MAX_DIMENSIONS];
    1959                 :            : 
    1960                 :            :   enum gfc_array_ref_dimen_type dimen_type[GFC_MAX_DIMENSIONS];
    1961                 :            : }
    1962                 :            : gfc_array_ref;
    1963                 :            : 
    1964                 :            : #define gfc_get_array_ref() XCNEW (gfc_array_ref)
    1965                 :            : 
    1966                 :            : 
    1967                 :            : /* Component reference nodes.  A variable is stored as an expression
    1968                 :            :    node that points to the base symbol.  After that, a singly linked
    1969                 :            :    list of component reference nodes gives the variable's complete
    1970                 :            :    resolution.  The array_ref component may be present and comes
    1971                 :            :    before the component component.  */
    1972                 :            : 
    1973                 :            : enum ref_type
    1974                 :            :   { REF_ARRAY, REF_COMPONENT, REF_SUBSTRING, REF_INQUIRY };
    1975                 :            : 
    1976                 :            : enum inquiry_type
    1977                 :            :   { INQUIRY_RE, INQUIRY_IM, INQUIRY_KIND, INQUIRY_LEN };
    1978                 :            : 
    1979                 :            : typedef struct gfc_ref
    1980                 :            : {
    1981                 :            :   ref_type type;
    1982                 :            : 
    1983                 :            :   union
    1984                 :            :   {
    1985                 :            :     struct gfc_array_ref ar;
    1986                 :            : 
    1987                 :            :     struct
    1988                 :            :     {
    1989                 :            :       gfc_component *component;
    1990                 :            :       gfc_symbol *sym;
    1991                 :            :     }
    1992                 :            :     c;
    1993                 :            : 
    1994                 :            :     struct
    1995                 :            :     {
    1996                 :            :       struct gfc_expr *start, *end;     /* Substring */
    1997                 :            :       gfc_charlen *length;
    1998                 :            :     }
    1999                 :            :     ss;
    2000                 :            : 
    2001                 :            :     inquiry_type i;
    2002                 :            : 
    2003                 :            :   }
    2004                 :            :   u;
    2005                 :            : 
    2006                 :            :   struct gfc_ref *next;
    2007                 :            : }
    2008                 :            : gfc_ref;
    2009                 :            : 
    2010                 :            : #define gfc_get_ref() XCNEW (gfc_ref)
    2011                 :            : 
    2012                 :            : 
    2013                 :            : /* Structures representing intrinsic symbols and their arguments lists.  */
    2014                 :            : typedef struct gfc_intrinsic_arg
    2015                 :            : {
    2016                 :            :   char name[GFC_MAX_SYMBOL_LEN + 1];
    2017                 :            : 
    2018                 :            :   gfc_typespec ts;
    2019                 :            :   unsigned optional:1, value:1;
    2020                 :            :   ENUM_BITFIELD (sym_intent) intent:2;
    2021                 :            :   gfc_actual_arglist *actual;
    2022                 :            : 
    2023                 :            :   struct gfc_intrinsic_arg *next;
    2024                 :            : 
    2025                 :            : }
    2026                 :            : gfc_intrinsic_arg;
    2027                 :            : 
    2028                 :            : 
    2029                 :            : /* Specifies the various kinds of check functions used to verify the
    2030                 :            :    argument lists of intrinsic functions. fX with X an integer refer
    2031                 :            :    to check functions of intrinsics with X arguments. f1m is used for
    2032                 :            :    the MAX and MIN intrinsics which can have an arbitrary number of
    2033                 :            :    arguments, f4ml is used for the MINLOC and MAXLOC intrinsics as
    2034                 :            :    these have special semantics.  */
    2035                 :            : 
    2036                 :            : typedef union
    2037                 :            : {
    2038                 :            :   bool (*f0)(void);
    2039                 :            :   bool (*f1)(struct gfc_expr *);
    2040                 :            :   bool (*f1m)(gfc_actual_arglist *);
    2041                 :            :   bool (*f2)(struct gfc_expr *, struct gfc_expr *);
    2042                 :            :   bool (*f3)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
    2043                 :            :   bool (*f5ml)(gfc_actual_arglist *);
    2044                 :            :   bool (*f6fl)(gfc_actual_arglist *);
    2045                 :            :   bool (*f3red)(gfc_actual_arglist *);
    2046                 :            :   bool (*f4)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2047                 :            :             struct gfc_expr *);
    2048                 :            :   bool (*f5)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2049                 :            :             struct gfc_expr *, struct gfc_expr *);
    2050                 :            : }
    2051                 :            : gfc_check_f;
    2052                 :            : 
    2053                 :            : /* Like gfc_check_f, these specify the type of the simplification
    2054                 :            :    function associated with an intrinsic. The fX are just like in
    2055                 :            :    gfc_check_f. cc is used for type conversion functions.  */
    2056                 :            : 
    2057                 :            : typedef union
    2058                 :            : {
    2059                 :            :   struct gfc_expr *(*f0)(void);
    2060                 :            :   struct gfc_expr *(*f1)(struct gfc_expr *);
    2061                 :            :   struct gfc_expr *(*f2)(struct gfc_expr *, struct gfc_expr *);
    2062                 :            :   struct gfc_expr *(*f3)(struct gfc_expr *, struct gfc_expr *,
    2063                 :            :                          struct gfc_expr *);
    2064                 :            :   struct gfc_expr *(*f4)(struct gfc_expr *, struct gfc_expr *,
    2065                 :            :                          struct gfc_expr *, struct gfc_expr *);
    2066                 :            :   struct gfc_expr *(*f5)(struct gfc_expr *, struct gfc_expr *,
    2067                 :            :                          struct gfc_expr *, struct gfc_expr *,
    2068                 :            :                          struct gfc_expr *);
    2069                 :            :   struct gfc_expr *(*f6)(struct gfc_expr *, struct gfc_expr *,
    2070                 :            :                          struct gfc_expr *, struct gfc_expr *,
    2071                 :            :                          struct gfc_expr *, struct gfc_expr *);
    2072                 :            :   struct gfc_expr *(*cc)(struct gfc_expr *, bt, int);
    2073                 :            : }
    2074                 :            : gfc_simplify_f;
    2075                 :            : 
    2076                 :            : /* Again like gfc_check_f, these specify the type of the resolution
    2077                 :            :    function associated with an intrinsic. The fX are just like in
    2078                 :            :    gfc_check_f. f1m is used for MIN and MAX, s1 is used for abort().  */
    2079                 :            : 
    2080                 :            : typedef union
    2081                 :            : {
    2082                 :            :   void (*f0)(struct gfc_expr *);
    2083                 :            :   void (*f1)(struct gfc_expr *, struct gfc_expr *);
    2084                 :            :   void (*f1m)(struct gfc_expr *, struct gfc_actual_arglist *);
    2085                 :            :   void (*f2)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
    2086                 :            :   void (*f3)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2087                 :            :              struct gfc_expr *);
    2088                 :            :   void (*f4)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2089                 :            :              struct gfc_expr *, struct gfc_expr *);
    2090                 :            :   void (*f5)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2091                 :            :              struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
    2092                 :            :   void (*f6)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2093                 :            :              struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2094                 :            :              struct gfc_expr *);
    2095                 :            :   void (*s1)(struct gfc_code *);
    2096                 :            : }
    2097                 :            : gfc_resolve_f;
    2098                 :            : 
    2099                 :            : 
    2100                 :            : typedef struct gfc_intrinsic_sym
    2101                 :            : {
    2102                 :            :   const char *name, *lib_name;
    2103                 :            :   gfc_intrinsic_arg *formal;
    2104                 :            :   gfc_typespec ts;
    2105                 :            :   unsigned elemental:1, inquiry:1, transformational:1, pure:1,
    2106                 :            :     generic:1, specific:1, actual_ok:1, noreturn:1, conversion:1,
    2107                 :            :     from_module:1, vararg:1;
    2108                 :            : 
    2109                 :            :   int standard;
    2110                 :            : 
    2111                 :            :   gfc_simplify_f simplify;
    2112                 :            :   gfc_check_f check;
    2113                 :            :   gfc_resolve_f resolve;
    2114                 :            :   struct gfc_intrinsic_sym *specific_head, *next;
    2115                 :            :   gfc_isym_id id;
    2116                 :            : 
    2117                 :            : }
    2118                 :            : gfc_intrinsic_sym;
    2119                 :            : 
    2120                 :            : 
    2121                 :            : /* Expression nodes.  The expression node types deserve explanations,
    2122                 :            :    since the last couple can be easily misconstrued:
    2123                 :            : 
    2124                 :            :    EXPR_OP         Operator node pointing to one or two other nodes
    2125                 :            :    EXPR_FUNCTION   Function call, symbol points to function's name
    2126                 :            :    EXPR_CONSTANT   A scalar constant: Logical, String, Real, Int or Complex
    2127                 :            :    EXPR_VARIABLE   An Lvalue with a root symbol and possible reference list
    2128                 :            :                    which expresses structure, array and substring refs.
    2129                 :            :    EXPR_NULL       The NULL pointer value (which also has a basic type).
    2130                 :            :    EXPR_SUBSTRING  A substring of a constant string
    2131                 :            :    EXPR_STRUCTURE  A structure constructor
    2132                 :            :    EXPR_ARRAY      An array constructor.
    2133                 :            :    EXPR_COMPCALL   Function (or subroutine) call of a procedure pointer
    2134                 :            :                    component or type-bound procedure.  */
    2135                 :            : 
    2136                 :            : #include <mpfr.h>
    2137                 :            : #include <mpc.h>
    2138                 :            : #define GFC_RND_MODE MPFR_RNDN
    2139                 :            : #define GFC_MPC_RND_MODE MPC_RNDNN
    2140                 :            : 
    2141                 :            : typedef splay_tree gfc_constructor_base;
    2142                 :            : 
    2143                 :            : 
    2144                 :            : /* This should be an unsigned variable of type size_t.  But to handle
    2145                 :            :    compiling to a 64-bit target from a 32-bit host, we need to use a
    2146                 :            :    HOST_WIDE_INT.  Also, occasionally the string length field is used
    2147                 :            :    as a flag with values -1 and -2, see e.g. gfc_add_assign_aux_vars.
    2148                 :            :    So it needs to be signed.  */
    2149                 :            : typedef HOST_WIDE_INT gfc_charlen_t;
    2150                 :            : 
    2151                 :            : typedef struct gfc_expr
    2152                 :            : {
    2153                 :            :   expr_t expr_type;
    2154                 :            : 
    2155                 :            :   gfc_typespec ts;      /* These two refer to the overall expression */
    2156                 :            : 
    2157                 :            :   int rank;             /* 0 indicates a scalar, -1 an assumed-rank array.  */
    2158                 :            :   mpz_t *shape;         /* Can be NULL if shape is unknown at compile time */
    2159                 :            : 
    2160                 :            :   /* Nonnull for functions and structure constructors, may also used to hold the
    2161                 :            :      base-object for component calls.  */
    2162                 :            :   gfc_symtree *symtree;
    2163                 :            : 
    2164                 :            :   gfc_ref *ref;
    2165                 :            : 
    2166                 :            :   locus where;
    2167                 :            : 
    2168                 :            :   /* Used to store the base expression in component calls, when the expression
    2169                 :            :      is not a variable.  */
    2170                 :            :   struct gfc_expr *base_expr;
    2171                 :            : 
    2172                 :            :   /* is_snan denotes a signalling not-a-number.  */
    2173                 :            :   unsigned int is_snan : 1;
    2174                 :            : 
    2175                 :            :   /* Sometimes, when an error has been emitted, it is necessary to prevent
    2176                 :            :       it from recurring.  */
    2177                 :            :   unsigned int error : 1;
    2178                 :            : 
    2179                 :            :   /* Mark an expression where a user operator has been substituted by
    2180                 :            :      a function call in interface.c(gfc_extend_expr).  */
    2181                 :            :   unsigned int user_operator : 1;
    2182                 :            : 
    2183                 :            :   /* Mark an expression as being a MOLD argument of ALLOCATE.  */
    2184                 :            :   unsigned int mold : 1;
    2185                 :            : 
    2186                 :            :   /* Will require finalization after use.  */
    2187                 :            :   unsigned int must_finalize : 1;
    2188                 :            : 
    2189                 :            :   /* Set this if no range check should be performed on this expression.  */
    2190                 :            : 
    2191                 :            :   unsigned int no_bounds_check : 1;
    2192                 :            : 
    2193                 :            :   /* Set this if a matmul expression has already been evaluated for conversion
    2194                 :            :      to a BLAS call.  */
    2195                 :            : 
    2196                 :            :   unsigned int external_blas : 1;
    2197                 :            : 
    2198                 :            :   /* Set this if resolution has already happened. It could be harmful
    2199                 :            :      if done again.  */
    2200                 :            : 
    2201                 :            :   unsigned int do_not_resolve_again : 1;
    2202                 :            : 
    2203                 :            :   /* Set this if no warning should be given somewhere in a lower level.  */
    2204                 :            : 
    2205                 :            :   unsigned int do_not_warn : 1;
    2206                 :            : 
    2207                 :            :   /* Set this if the expression came from expanding an array constructor.  */
    2208                 :            :   unsigned int from_constructor : 1;
    2209                 :            : 
    2210                 :            :   /* If an expression comes from a Hollerith constant or compile-time
    2211                 :            :      evaluation of a transfer statement, it may have a prescribed target-
    2212                 :            :      memory representation, and these cannot always be backformed from
    2213                 :            :      the value.  */
    2214                 :            :   struct
    2215                 :            :   {
    2216                 :            :     gfc_charlen_t length;
    2217                 :            :     char *string;
    2218                 :            :   }
    2219                 :            :   representation;
    2220                 :            : 
    2221                 :            :   struct
    2222                 :            :   {
    2223                 :            :     int len;    /* Length of BOZ string without terminating NULL.  */
    2224                 :            :     int rdx;    /* Radix of BOZ.  */
    2225                 :            :     char *str;  /* BOZ string with NULL terminating character.  */
    2226                 :            :   }
    2227                 :            :   boz;
    2228                 :            : 
    2229                 :            :   union
    2230                 :            :   {
    2231                 :            :     int logical;
    2232                 :            : 
    2233                 :            :     io_kind iokind;
    2234                 :            : 
    2235                 :            :     mpz_t integer;
    2236                 :            : 
    2237                 :            :     mpfr_t real;
    2238                 :            : 
    2239                 :            :     mpc_t complex;
    2240                 :            : 
    2241                 :            :     struct
    2242                 :            :     {
    2243                 :            :       gfc_intrinsic_op op;
    2244                 :            :       gfc_user_op *uop;
    2245                 :            :       struct gfc_expr *op1, *op2;
    2246                 :            :     }
    2247                 :            :     op;
    2248                 :            : 
    2249                 :            :     struct
    2250                 :            :     {
    2251                 :            :       gfc_actual_arglist *actual;
    2252                 :            :       const char *name; /* Points to the ultimate name of the function */
    2253                 :            :       gfc_intrinsic_sym *isym;
    2254                 :            :       gfc_symbol *esym;
    2255                 :            :     }
    2256                 :            :     function;
    2257                 :            : 
    2258                 :            :     struct
    2259                 :            :     {
    2260                 :            :       gfc_actual_arglist* actual;
    2261                 :            :       const char* name;
    2262                 :            :       /* Base-object, whose component was called.  NULL means that it should
    2263                 :            :          be taken from symtree/ref.  */
    2264                 :            :       struct gfc_expr* base_object;
    2265                 :            :       gfc_typebound_proc* tbp; /* Should overlap with esym.  */
    2266                 :            : 
    2267                 :            :       /* For type-bound operators, we want to call PASS procedures but already
    2268                 :            :          have the full arglist; mark this, so that it is not extended by the
    2269                 :            :          PASS argument.  */
    2270                 :            :       unsigned ignore_pass:1;
    2271                 :            : 
    2272                 :            :       /* Do assign-calls rather than calls, that is appropriate dependency
    2273                 :            :          checking.  */
    2274                 :            :       unsigned assign:1;
    2275                 :            :     }
    2276                 :            :     compcall;
    2277                 :            : 
    2278                 :            :     struct
    2279                 :            :     {
    2280                 :            :       gfc_charlen_t length;
    2281                 :            :       gfc_char_t *string;
    2282                 :            :     }
    2283                 :            :     character;
    2284                 :            : 
    2285                 :            :     gfc_constructor_base constructor;
    2286                 :            :   }
    2287                 :            :   value;
    2288                 :            : 
    2289                 :            :   /* Used to store PDT expression lists associated with expressions.  */
    2290                 :            :   gfc_actual_arglist *param_list;
    2291                 :            : 
    2292                 :            : }
    2293                 :            : gfc_expr;
    2294                 :            : 
    2295                 :            : 
    2296                 :            : #define gfc_get_shape(rank) (XCNEWVEC (mpz_t, (rank)))
    2297                 :            : 
    2298                 :            : /* Structures for information associated with different kinds of
    2299                 :            :    numbers.  The first set of integer parameters define all there is
    2300                 :            :    to know about a particular kind.  The rest of the elements are
    2301                 :            :    computed from the first elements.  */
    2302                 :            : 
    2303                 :            : typedef struct
    2304                 :            : {
    2305                 :            :   /* Values really representable by the target.  */
    2306                 :            :   mpz_t huge, pedantic_min_int, min_int;
    2307                 :            : 
    2308                 :            :   int kind, radix, digits, bit_size, range;
    2309                 :            : 
    2310                 :            :   /* True if the C type of the given name maps to this precision.
    2311                 :            :      Note that more than one bit can be set.  */
    2312                 :            :   unsigned int c_char : 1;
    2313                 :            :   unsigned int c_short : 1;
    2314                 :            :   unsigned int c_int : 1;
    2315                 :            :   unsigned int c_long : 1;
    2316                 :            :   unsigned int c_long_long : 1;
    2317                 :            : }
    2318                 :            : gfc_integer_info;
    2319                 :            : 
    2320                 :            : extern gfc_integer_info gfc_integer_kinds[];
    2321                 :            : 
    2322                 :            : 
    2323                 :            : typedef struct
    2324                 :            : {
    2325                 :            :   int kind, bit_size;
    2326                 :            : 
    2327                 :            :   /* True if the C++ type bool, C99 type _Bool, maps to this precision.  */
    2328                 :            :   unsigned int c_bool : 1;
    2329                 :            : }
    2330                 :            : gfc_logical_info;
    2331                 :            : 
    2332                 :            : extern gfc_logical_info gfc_logical_kinds[];
    2333                 :            : 
    2334                 :            : 
    2335                 :            : typedef struct
    2336                 :            : {
    2337                 :            :   mpfr_t epsilon, huge, tiny, subnormal;
    2338                 :            :   int kind, radix, digits, min_exponent, max_exponent;
    2339                 :            :   int range, precision;
    2340                 :            : 
    2341                 :            :   /* The precision of the type as reported by GET_MODE_PRECISION.  */
    2342                 :            :   int mode_precision;
    2343                 :            : 
    2344                 :            :   /* True if the C type of the given name maps to this precision.
    2345                 :            :      Note that more than one bit can be set.  */
    2346                 :            :   unsigned int c_float : 1;
    2347                 :            :   unsigned int c_double : 1;
    2348                 :            :   unsigned int c_long_double : 1;
    2349                 :            :   unsigned int c_float128 : 1;
    2350                 :            : }
    2351                 :            : gfc_real_info;
    2352                 :            : 
    2353                 :            : extern gfc_real_info gfc_real_kinds[];
    2354                 :            : 
    2355                 :            : typedef struct
    2356                 :            : {
    2357                 :            :   int kind, bit_size;
    2358                 :            :   const char *name;
    2359                 :            : }
    2360                 :            : gfc_character_info;
    2361                 :            : 
    2362                 :            : extern gfc_character_info gfc_character_kinds[];
    2363                 :            : 
    2364                 :            : 
    2365                 :            : /* Equivalence structures.  Equivalent lvalues are linked along the
    2366                 :            :    *eq pointer, equivalence sets are strung along the *next node.  */
    2367                 :            : typedef struct gfc_equiv
    2368                 :            : {
    2369                 :            :   struct gfc_equiv *next, *eq;
    2370                 :            :   gfc_expr *expr;
    2371                 :            :   const char *module;
    2372                 :            :   int used;
    2373                 :            : }
    2374                 :            : gfc_equiv;
    2375                 :            : 
    2376                 :            : #define gfc_get_equiv() XCNEW (gfc_equiv)
    2377                 :            : 
    2378                 :            : /* Holds a single equivalence member after processing.  */
    2379                 :            : typedef struct gfc_equiv_info
    2380                 :            : {
    2381                 :            :   gfc_symbol *sym;
    2382                 :            :   HOST_WIDE_INT offset;
    2383                 :            :   HOST_WIDE_INT length;
    2384                 :            :   struct gfc_equiv_info *next;
    2385                 :            : } gfc_equiv_info;
    2386                 :            : 
    2387                 :            : /* Holds equivalence groups, after they have been processed.  */
    2388                 :            : typedef struct gfc_equiv_list
    2389                 :            : {
    2390                 :            :   gfc_equiv_info *equiv;
    2391                 :            :   struct gfc_equiv_list *next;
    2392                 :            : } gfc_equiv_list;
    2393                 :            : 
    2394                 :            : /* gfc_case stores the selector list of a case statement.  The *low
    2395                 :            :    and *high pointers can point to the same expression in the case of
    2396                 :            :    a single value.  If *high is NULL, the selection is from *low
    2397                 :            :    upwards, if *low is NULL the selection is *high downwards.
    2398                 :            : 
    2399                 :            :    This structure has separate fields to allow single and double linked
    2400                 :            :    lists of CASEs at the same time.  The singe linked list along the NEXT
    2401                 :            :    field is a list of cases for a single CASE label.  The double linked
    2402                 :            :    list along the LEFT/RIGHT fields is used to detect overlap and to
    2403                 :            :    build a table of the cases for SELECT constructs with a CHARACTER
    2404                 :            :    case expression.  */
    2405                 :            : 
    2406                 :            : typedef struct gfc_case
    2407                 :            : {
    2408                 :            :   /* Where we saw this case.  */
    2409                 :            :   locus where;
    2410                 :            :   int n;
    2411                 :            : 
    2412                 :            :   /* Case range values.  If (low == high), it's a single value.  If one of
    2413                 :            :      the labels is NULL, it's an unbounded case.  If both are NULL, this
    2414                 :            :      represents the default case.  */
    2415                 :            :   gfc_expr *low, *high;
    2416                 :            : 
    2417                 :            :   /* Only used for SELECT TYPE.  */
    2418                 :            :   gfc_typespec ts;
    2419                 :            : 
    2420                 :            :   /* Next case label in the list of cases for a single CASE label.  */
    2421                 :            :   struct gfc_case *next;
    2422                 :            : 
    2423                 :            :   /* Used for detecting overlap, and for code generation.  */
    2424                 :            :   struct gfc_case *left, *right;
    2425                 :            : 
    2426                 :            :   /* True if this case label can never be matched.  */
    2427                 :            :   int unreachable;
    2428                 :            : }
    2429                 :            : gfc_case;
    2430                 :            : 
    2431                 :            : #define gfc_get_case() XCNEW (gfc_case)
    2432                 :            : 
    2433                 :            : 
    2434                 :            : typedef struct
    2435                 :            : {
    2436                 :            :   gfc_expr *var, *start, *end, *step;
    2437                 :            :   unsigned short unroll;
    2438                 :            :   bool ivdep;
    2439                 :            :   bool vector;
    2440                 :            :   bool novector;
    2441                 :            : }
    2442                 :            : gfc_iterator;
    2443                 :            : 
    2444                 :            : #define gfc_get_iterator() XCNEW (gfc_iterator)
    2445                 :            : 
    2446                 :            : 
    2447                 :            : /* Allocation structure for ALLOCATE, DEALLOCATE and NULLIFY statements.  */
    2448                 :            : 
    2449                 :            : typedef struct gfc_alloc
    2450                 :            : {
    2451                 :            :   gfc_expr *expr;
    2452                 :            :   struct gfc_alloc *next;
    2453                 :            : }
    2454                 :            : gfc_alloc;
    2455                 :            : 
    2456                 :            : #define gfc_get_alloc() XCNEW (gfc_alloc)
    2457                 :            : 
    2458                 :            : 
    2459                 :            : typedef struct
    2460                 :            : {
    2461                 :            :   gfc_expr *unit, *file, *status, *access, *form, *recl,
    2462                 :            :     *blank, *position, *action, *delim, *pad, *iostat, *iomsg, *convert,
    2463                 :            :     *decimal, *encoding, *round, *sign, *asynchronous, *id, *newunit,
    2464                 :            :     *share, *cc;
    2465                 :            :   char readonly;
    2466                 :            :   gfc_st_label *err;
    2467                 :            : }
    2468                 :            : gfc_open;
    2469                 :            : 
    2470                 :            : 
    2471                 :            : typedef struct
    2472                 :            : {
    2473                 :            :   gfc_expr *unit, *status, *iostat, *iomsg;
    2474                 :            :   gfc_st_label *err;
    2475                 :            : }
    2476                 :            : gfc_close;
    2477                 :            : 
    2478                 :            : 
    2479                 :            : typedef struct
    2480                 :            : {
    2481                 :            :   gfc_expr *unit, *iostat, *iomsg;
    2482                 :            :   gfc_st_label *err;
    2483                 :            : }
    2484                 :            : gfc_filepos;
    2485                 :            : 
    2486                 :            : 
    2487                 :            : typedef struct
    2488                 :            : {
    2489                 :            :   gfc_expr *unit, *file, *iostat, *exist, *opened, *number, *named,
    2490                 :            :     *name, *access, *sequential, *direct, *form, *formatted,
    2491                 :            :     *unformatted, *recl, *nextrec, *blank, *position, *action, *read,
    2492                 :            :     *write, *readwrite, *delim, *pad, *iolength, *iomsg, *convert, *strm_pos,
    2493                 :            :     *asynchronous, *decimal, *encoding, *pending, *round, *sign, *size, *id,
    2494                 :            :     *iqstream, *share, *cc;
    2495                 :            : 
    2496                 :            :   gfc_st_label *err;
    2497                 :            : 
    2498                 :            : }
    2499                 :            : gfc_inquire;
    2500                 :            : 
    2501                 :            : 
    2502                 :            : typedef struct
    2503                 :            : {
    2504                 :            :   gfc_expr *unit, *iostat, *iomsg, *id;
    2505                 :            :   gfc_st_label *err, *end, *eor;
    2506                 :            : }
    2507                 :            : gfc_wait;
    2508                 :            : 
    2509                 :            : 
    2510                 :            : typedef struct
    2511                 :            : {
    2512                 :            :   gfc_expr *io_unit, *format_expr, *rec, *advance, *iostat, *size, *iomsg,
    2513                 :            :            *id, *pos, *asynchronous, *blank, *decimal, *delim, *pad, *round,
    2514                 :            :            *sign, *extra_comma, *dt_io_kind, *udtio;
    2515                 :            :   char dec_ext;
    2516                 :            : 
    2517                 :            :   gfc_symbol *namelist;
    2518                 :            :   /* A format_label of `format_asterisk' indicates the "*" format */
    2519                 :            :   gfc_st_label *format_label;
    2520                 :            :   gfc_st_label *err, *end, *eor;
    2521                 :            : 
    2522                 :            :   locus eor_where, end_where, err_where;
    2523                 :            : }
    2524                 :            : gfc_dt;
    2525                 :            : 
    2526                 :            : 
    2527                 :            : typedef struct gfc_forall_iterator
    2528                 :            : {
    2529                 :            :   gfc_expr *var, *start, *end, *stride;
    2530                 :            :   struct gfc_forall_iterator *next;
    2531                 :            : }
    2532                 :            : gfc_forall_iterator;
    2533                 :            : 
    2534                 :            : 
    2535                 :            : /* Linked list to store associations in an ASSOCIATE statement.  */
    2536                 :            : 
    2537                 :            : typedef struct gfc_association_list
    2538                 :            : {
    2539                 :            :   struct gfc_association_list *next;
    2540                 :            : 
    2541                 :            :   /* Whether this is association to a variable that can be changed; otherwise,
    2542                 :            :      it's association to an expression and the name may not be used as
    2543                 :            :      lvalue.  */
    2544                 :            :   unsigned variable:1;
    2545                 :            : 
    2546                 :            :   /* True if this struct is currently only linked to from a gfc_symbol rather
    2547                 :            :      than as part of a real list in gfc_code->ext.block.assoc.  This may
    2548                 :            :      happen for SELECT TYPE temporaries and must be considered
    2549                 :            :      for memory handling.  */
    2550                 :            :   unsigned dangling:1;
    2551                 :            : 
    2552                 :            :   /* True when the rank of the target expression is guessed during parsing.  */
    2553                 :            :   unsigned rankguessed:1;
    2554                 :            : 
    2555                 :            :   char name[GFC_MAX_SYMBOL_LEN + 1];
    2556                 :            :   gfc_symtree *st; /* Symtree corresponding to name.  */
    2557                 :            :   locus where;
    2558                 :            : 
    2559                 :            :   gfc_expr *target;
    2560                 :            : }
    2561                 :            : gfc_association_list;
    2562                 :            : #define gfc_get_association_list() XCNEW (gfc_association_list)
    2563                 :            : 
    2564                 :            : 
    2565                 :            : /* Executable statements that fill gfc_code structures.  */
    2566                 :            : enum gfc_exec_op
    2567                 :            : {
    2568                 :            :   EXEC_NOP = 1, EXEC_END_NESTED_BLOCK, EXEC_END_BLOCK, EXEC_ASSIGN,
    2569                 :            :   EXEC_LABEL_ASSIGN, EXEC_POINTER_ASSIGN, EXEC_CRITICAL, EXEC_ERROR_STOP,
    2570                 :            :   EXEC_GOTO, EXEC_CALL, EXEC_COMPCALL, EXEC_ASSIGN_CALL, EXEC_RETURN,
    2571                 :            :   EXEC_ENTRY, EXEC_PAUSE, EXEC_STOP, EXEC_CONTINUE, EXEC_INIT_ASSIGN,
    2572                 :            :   EXEC_IF, EXEC_ARITHMETIC_IF, EXEC_DO, EXEC_DO_CONCURRENT, EXEC_DO_WHILE,
    2573                 :            :   EXEC_SELECT, EXEC_BLOCK, EXEC_FORALL, EXEC_WHERE, EXEC_CYCLE, EXEC_EXIT,
    2574                 :            :   EXEC_CALL_PPC, EXEC_ALLOCATE, EXEC_DEALLOCATE, EXEC_END_PROCEDURE,
    2575                 :            :   EXEC_SELECT_TYPE, EXEC_SELECT_RANK, EXEC_SYNC_ALL, EXEC_SYNC_MEMORY,
    2576                 :            :   EXEC_SYNC_IMAGES, EXEC_OPEN, EXEC_CLOSE, EXEC_WAIT,
    2577                 :            :   EXEC_READ, EXEC_WRITE, EXEC_IOLENGTH, EXEC_TRANSFER, EXEC_DT_END,
    2578                 :            :   EXEC_BACKSPACE, EXEC_ENDFILE, EXEC_INQUIRE, EXEC_REWIND, EXEC_FLUSH,
    2579                 :            :   EXEC_FORM_TEAM, EXEC_CHANGE_TEAM, EXEC_END_TEAM, EXEC_SYNC_TEAM,
    2580                 :            :   EXEC_LOCK, EXEC_UNLOCK, EXEC_EVENT_POST, EXEC_EVENT_WAIT, EXEC_FAIL_IMAGE,
    2581                 :            :   EXEC_OACC_KERNELS_LOOP, EXEC_OACC_PARALLEL_LOOP, EXEC_OACC_SERIAL_LOOP,
    2582                 :            :   EXEC_OACC_ROUTINE, EXEC_OACC_PARALLEL, EXEC_OACC_KERNELS, EXEC_OACC_SERIAL,
    2583                 :            :   EXEC_OACC_DATA, EXEC_OACC_HOST_DATA, EXEC_OACC_LOOP, EXEC_OACC_UPDATE,
    2584                 :            :   EXEC_OACC_WAIT, EXEC_OACC_CACHE, EXEC_OACC_ENTER_DATA, EXEC_OACC_EXIT_DATA,
    2585                 :            :   EXEC_OACC_ATOMIC, EXEC_OACC_DECLARE,
    2586                 :            :   EXEC_OMP_CRITICAL, EXEC_OMP_DO, EXEC_OMP_FLUSH, EXEC_OMP_MASTER,
    2587                 :            :   EXEC_OMP_ORDERED, EXEC_OMP_PARALLEL, EXEC_OMP_PARALLEL_DO,
    2588                 :            :   EXEC_OMP_PARALLEL_SECTIONS, EXEC_OMP_PARALLEL_WORKSHARE,
    2589                 :            :   EXEC_OMP_SECTIONS, EXEC_OMP_SINGLE, EXEC_OMP_WORKSHARE,
    2590                 :            :   EXEC_OMP_ATOMIC, EXEC_OMP_BARRIER, EXEC_OMP_END_NOWAIT,
    2591                 :            :   EXEC_OMP_END_SINGLE, EXEC_OMP_TASK, EXEC_OMP_TASKWAIT,
    2592                 :            :   EXEC_OMP_TASKYIELD, EXEC_OMP_CANCEL, EXEC_OMP_CANCELLATION_POINT,
    2593                 :            :   EXEC_OMP_TASKGROUP, EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD,
    2594                 :            :   EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_TARGET, EXEC_OMP_TARGET_DATA,
    2595                 :            :   EXEC_OMP_TEAMS, EXEC_OMP_DISTRIBUTE, EXEC_OMP_DISTRIBUTE_SIMD,
    2596                 :            :   EXEC_OMP_DISTRIBUTE_PARALLEL_DO, EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD,
    2597                 :            :   EXEC_OMP_TARGET_TEAMS, EXEC_OMP_TEAMS_DISTRIBUTE,
    2598                 :            :   EXEC_OMP_TEAMS_DISTRIBUTE_SIMD, EXEC_OMP_TARGET_TEAMS_DISTRIBUTE,
    2599                 :            :   EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
    2600                 :            :   EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
    2601                 :            :   EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
    2602                 :            :   EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
    2603                 :            :   EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
    2604                 :            :   EXEC_OMP_TARGET_UPDATE, EXEC_OMP_END_CRITICAL,
    2605                 :            :   EXEC_OMP_TARGET_ENTER_DATA, EXEC_OMP_TARGET_EXIT_DATA,
    2606                 :            :   EXEC_OMP_TARGET_PARALLEL, EXEC_OMP_TARGET_PARALLEL_DO,
    2607                 :            :   EXEC_OMP_TARGET_PARALLEL_DO_SIMD, EXEC_OMP_TARGET_SIMD,
    2608                 :            :   EXEC_OMP_TASKLOOP, EXEC_OMP_TASKLOOP_SIMD
    2609                 :            : };
    2610                 :            : 
    2611                 :            : enum gfc_omp_atomic_op
    2612                 :            : {
    2613                 :            :   GFC_OMP_ATOMIC_UPDATE = 0,
    2614                 :            :   GFC_OMP_ATOMIC_READ = 1,
    2615                 :            :   GFC_OMP_ATOMIC_WRITE = 2,
    2616                 :            :   GFC_OMP_ATOMIC_CAPTURE = 3,
    2617                 :            :   GFC_OMP_ATOMIC_MASK = 3,
    2618                 :            :   GFC_OMP_ATOMIC_SEQ_CST = 4,
    2619                 :            :   GFC_OMP_ATOMIC_SWAP = 8
    2620                 :            : };
    2621                 :            : 
    2622                 :            : typedef struct gfc_code
    2623                 :            : {
    2624                 :            :   gfc_exec_op op;
    2625                 :            : 
    2626                 :            :   struct gfc_code *block, *next;
    2627                 :            :   locus loc;
    2628                 :            : 
    2629                 :            :   gfc_st_label *here, *label1, *label2, *label3;
    2630                 :            :   gfc_symtree *symtree;
    2631                 :            :   gfc_expr *expr1, *expr2, *expr3, *expr4;
    2632                 :            :   /* A name isn't sufficient to identify a subroutine, we need the actual
    2633                 :            :      symbol for the interface definition.
    2634                 :            :   const char *sub_name;  */
    2635                 :            :   gfc_symbol *resolved_sym;
    2636                 :            :   gfc_intrinsic_sym *resolved_isym;
    2637                 :            : 
    2638                 :            :   union
    2639                 :            :   {
    2640                 :            :     gfc_actual_arglist *actual;
    2641                 :            :     gfc_iterator *iterator;
    2642                 :            : 
    2643                 :            :     struct
    2644                 :            :     {
    2645                 :            :       gfc_typespec ts;
    2646                 :            :       gfc_alloc *list;
    2647                 :            :       /* Take the array specification from expr3 to allocate arrays
    2648                 :            :          without an explicit array specification.  */
    2649                 :            :       unsigned arr_spec_from_expr3:1;
    2650                 :            :     }
    2651                 :            :     alloc;
    2652                 :            : 
    2653                 :            :     struct
    2654                 :            :     {
    2655                 :            :       gfc_namespace *ns;
    2656                 :            :       gfc_association_list *assoc;
    2657                 :            :       gfc_case *case_list;
    2658                 :            :     }
    2659                 :            :     block;
    2660                 :            : 
    2661                 :            :     gfc_open *open;
    2662                 :            :     gfc_close *close;
    2663                 :            :     gfc_filepos *filepos;
    2664                 :            :     gfc_inquire *inquire;
    2665                 :            :     gfc_wait *wait;
    2666                 :            :     gfc_dt *dt;
    2667                 :            :     gfc_forall_iterator *forall_iterator;
    2668                 :            :     struct gfc_code *which_construct;
    2669                 :            :     int stop_code;
    2670                 :            :     gfc_entry_list *entry;
    2671                 :            :     gfc_oacc_declare *oacc_declare;
    2672                 :            :     gfc_omp_clauses *omp_clauses;
    2673                 :            :     const char *omp_name;
    2674                 :            :     gfc_omp_namelist *omp_namelist;
    2675                 :            :     bool omp_bool;
    2676                 :            :     gfc_omp_atomic_op omp_atomic;
    2677                 :            :   }
    2678                 :            :   ext;          /* Points to additional structures required by statement */
    2679                 :            : 
    2680                 :            :   /* Cycle and break labels in constructs.  */
    2681                 :            :   tree cycle_label;
    2682                 :            :   tree exit_label;
    2683                 :            : }
    2684                 :            : gfc_code;
    2685                 :            : 
    2686                 :            : 
    2687                 :            : /* Storage for DATA statements.  */
    2688                 :            : typedef struct gfc_data_variable
    2689                 :            : {
    2690                 :            :   gfc_expr *expr;
    2691                 :            :   gfc_iterator iter;
    2692                 :            :   struct gfc_data_variable *list, *next;
    2693                 :            : }
    2694                 :            : gfc_data_variable;
    2695                 :            : 
    2696                 :            : 
    2697                 :            : typedef struct gfc_data_value
    2698                 :            : {
    2699                 :            :   mpz_t repeat;
    2700                 :            :   gfc_expr *expr;
    2701                 :            :   struct gfc_data_value *next;
    2702                 :            : }
    2703                 :            : gfc_data_value;
    2704                 :            : 
    2705                 :            : 
    2706                 :            : typedef struct gfc_data
    2707                 :            : {
    2708                 :            :   gfc_data_variable *var;
    2709                 :            :   gfc_data_value *value;
    2710                 :            :   locus where;
    2711                 :            : 
    2712                 :            :   struct gfc_data *next;
    2713                 :            : }
    2714                 :            : gfc_data;
    2715                 :            : 
    2716                 :            : 
    2717                 :            : /* Structure for holding compile options */
    2718                 :            : typedef struct
    2719                 :            : {
    2720                 :            :   char *module_dir;
    2721                 :            :   gfc_source_form source_form;
    2722                 :            :   int max_continue_fixed;
    2723                 :            :   int max_continue_free;
    2724                 :            :   int max_identifier_length;
    2725                 :            : 
    2726                 :            :   int max_errors;
    2727                 :            : 
    2728                 :            :   int flag_preprocessed;
    2729                 :            :   int flag_d_lines;
    2730                 :            :   int flag_init_integer;
    2731                 :            :   long flag_init_integer_value;
    2732                 :            :   int flag_init_logical;
    2733                 :            :   int flag_init_character;
    2734                 :            :   char flag_init_character_value;
    2735                 :            : 
    2736                 :            :   int fpe;
    2737                 :            :   int fpe_summary;
    2738                 :            :   int rtcheck;
    2739                 :            : 
    2740                 :            :   int warn_std;
    2741                 :            :   int allow_std;
    2742                 :            : }
    2743                 :            : gfc_option_t;
    2744                 :            : 
    2745                 :            : extern gfc_option_t gfc_option;
    2746                 :            : 
    2747                 :            : /* Constructor nodes for array and structure constructors.  */
    2748                 :            : typedef struct gfc_constructor
    2749                 :            : {
    2750                 :            :   gfc_constructor_base base;
    2751                 :            :   mpz_t offset;               /* Offset within a constructor, used as
    2752                 :            :                                  key within base. */
    2753                 :            : 
    2754                 :            :   gfc_expr *expr;
    2755                 :            :   gfc_iterator *iterator;
    2756                 :            :   locus where;
    2757                 :            : 
    2758                 :            :   union
    2759                 :            :   {
    2760                 :            :      gfc_component *component; /* Record the component being initialized.  */
    2761                 :            :   }
    2762                 :            :   n;
    2763                 :            :   mpz_t repeat; /* Record the repeat number of initial values in data
    2764                 :            :                   statement like "data a/5*10/".  */
    2765                 :            : }
    2766                 :            : gfc_constructor;
    2767                 :            : 
    2768                 :            : 
    2769                 :            : typedef struct iterator_stack
    2770                 :            : {
    2771                 :            :   gfc_symtree *variable;
    2772                 :            :   mpz_t value;
    2773                 :            :   struct iterator_stack *prev;
    2774                 :            : }
    2775                 :            : iterator_stack;
    2776                 :            : extern iterator_stack *iter_stack;
    2777                 :            : 
    2778                 :            : 
    2779                 :            : /* Used for (possibly nested) SELECT TYPE statements.  */
    2780                 :            : typedef struct gfc_select_type_stack
    2781                 :            : {
    2782                 :            :   gfc_symbol *selector;                 /* Current selector variable.  */
    2783                 :            :   gfc_symtree *tmp;                     /* Current temporary variable.  */
    2784                 :            :   struct gfc_select_type_stack *prev;   /* Previous element on stack.  */
    2785                 :            : }
    2786                 :            : gfc_select_type_stack;
    2787                 :            : extern gfc_select_type_stack *select_type_stack;
    2788                 :            : #define gfc_get_select_type_stack() XCNEW (gfc_select_type_stack)
    2789                 :            : 
    2790                 :            : 
    2791                 :            : /* Node in the linked list used for storing finalizer procedures.  */
    2792                 :            : 
    2793                 :            : typedef struct gfc_finalizer
    2794                 :            : {
    2795                 :            :   struct gfc_finalizer* next;
    2796                 :            :   locus where; /* Where the FINAL declaration occurred.  */
    2797                 :            : 
    2798                 :            :   /* Up to resolution, we want the gfc_symbol, there we lookup the corresponding
    2799                 :            :      symtree and later need only that.  This way, we can access and call the
    2800                 :            :      finalizers from every context as they should be "always accessible".  I
    2801                 :            :      don't make this a union because we need the information whether proc_sym is
    2802                 :            :      still referenced or not for dereferencing it on deleting a gfc_finalizer
    2803                 :            :      structure.  */
    2804                 :            :   gfc_symbol*  proc_sym;
    2805                 :            :   gfc_symtree* proc_tree;
    2806                 :            : }
    2807                 :            : gfc_finalizer;
    2808                 :            : #define gfc_get_finalizer() XCNEW (gfc_finalizer)
    2809                 :            : 
    2810                 :            : 
    2811                 :            : /************************ Function prototypes *************************/
    2812                 :            : 
    2813                 :            : /* decl.c */
    2814                 :            : bool gfc_in_match_data (void);
    2815                 :            : match gfc_match_char_spec (gfc_typespec *);
    2816                 :            : extern int directive_unroll;
    2817                 :            : extern bool directive_ivdep;
    2818                 :            : extern bool directive_vector;
    2819                 :            : extern bool directive_novector;
    2820                 :            : 
    2821                 :            : /* SIMD clause enum.  */
    2822                 :            : enum gfc_simd_clause
    2823                 :            : {
    2824                 :            :   SIMD_NONE = (1 << 0),
    2825                 :            :   SIMD_INBRANCH = (1 << 1),
    2826                 :            :   SIMD_NOTINBRANCH = (1 << 2)
    2827                 :            : };
    2828                 :            : 
    2829                 :            : /* Tuple for parsing of vectorized built-ins.  */
    2830                 :            : struct gfc_vect_builtin_tuple
    2831                 :            : {
    2832                 :            :   gfc_vect_builtin_tuple (const char *n, gfc_simd_clause t)
    2833                 :            :     : name (n), simd_type (t) {}
    2834                 :            : 
    2835                 :            :   const char *name;
    2836                 :            :   gfc_simd_clause simd_type;
    2837                 :            : };
    2838                 :            : 
    2839                 :            : /* Map of middle-end built-ins that should be vectorized.  */
    2840                 :            : extern hash_map<nofree_string_hash, int> *gfc_vectorized_builtins;
    2841                 :            : 
    2842                 :            : /* Handling Parameterized Derived Types  */
    2843                 :            : bool gfc_insert_kind_parameter_exprs (gfc_expr *);
    2844                 :            : bool gfc_insert_parameter_exprs (gfc_expr *, gfc_actual_arglist *);
    2845                 :            : match gfc_get_pdt_instance (gfc_actual_arglist *, gfc_symbol **,
    2846                 :            :                             gfc_actual_arglist **);
    2847                 :            : 
    2848                 :            : 
    2849                 :            : /* Given a symbol, test whether it is a module procedure in a submodule */
    2850                 :            : #define gfc_submodule_procedure(attr)                                \
    2851                 :            :   (gfc_state_stack->previous && gfc_state_stack->previous->previous  \
    2852                 :            :    && gfc_state_stack->previous->previous->state == COMP_SUBMODULE   \
    2853                 :            :    && attr->module_procedure)
    2854                 :            : 
    2855                 :            : /* scanner.c */
    2856                 :            : void gfc_scanner_done_1 (void);
    2857                 :            : void gfc_scanner_init_1 (void);
    2858                 :            : 
    2859                 :            : void gfc_add_include_path (const char *, bool, bool, bool);
    2860                 :            : void gfc_add_intrinsic_modules_path (const char *);
    2861                 :            : void gfc_release_include_path (void);
    2862                 :            : FILE *gfc_open_included_file (const char *, bool, bool);
    2863                 :            : 
    2864                 :            : int gfc_at_end (void);
    2865                 :            : int gfc_at_eof (void);
    2866                 :            : int gfc_at_bol (void);
    2867                 :            : int gfc_at_eol (void);
    2868                 :            : void gfc_advance_line (void);
    2869                 :            : int gfc_check_include (void);
    2870                 :            : int gfc_define_undef_line (void);
    2871                 :            : 
    2872                 :            : int gfc_wide_is_printable (gfc_char_t);
    2873                 :            : int gfc_wide_is_digit (gfc_char_t);
    2874                 :            : int gfc_wide_fits_in_byte (gfc_char_t);
    2875                 :            : gfc_char_t gfc_wide_tolower (gfc_char_t);
    2876                 :            : gfc_char_t gfc_wide_toupper (gfc_char_t);
    2877                 :            : size_t gfc_wide_strlen (const gfc_char_t *);
    2878                 :            : int gfc_wide_strncasecmp (const gfc_char_t *, const char *, size_t);
    2879                 :            : gfc_char_t *gfc_wide_memset (gfc_char_t *, gfc_char_t, size_t);
    2880                 :            : char *gfc_widechar_to_char (const gfc_char_t *, int);
    2881                 :            : gfc_char_t *gfc_char_to_widechar (const char *);
    2882                 :            : 
    2883                 :            : #define gfc_get_wide_string(n) XCNEWVEC (gfc_char_t, n)
    2884                 :            : 
    2885                 :            : void gfc_skip_comments (void);
    2886                 :            : gfc_char_t gfc_next_char_literal (gfc_instring);
    2887                 :            : gfc_char_t gfc_next_char (void);
    2888                 :            : char gfc_next_ascii_char (void);
    2889                 :            : gfc_char_t gfc_peek_char (void);
    2890                 :            : char gfc_peek_ascii_char (void);
    2891                 :            : void gfc_error_recovery (void);
    2892                 :            : void gfc_gobble_whitespace (void);
    2893                 :            : bool gfc_new_file (void);
    2894                 :            : const char * gfc_read_orig_filename (const char *, const char **);
    2895                 :            : 
    2896                 :            : extern gfc_source_form gfc_current_form;
    2897                 :            : extern const char *gfc_source_file;
    2898                 :            : extern locus gfc_current_locus;
    2899                 :            : 
    2900                 :            : void gfc_start_source_files (void);
    2901                 :            : void gfc_end_source_files (void);
    2902                 :            : 
    2903                 :            : /* misc.c */
    2904                 :            : void gfc_clear_ts (gfc_typespec *);
    2905                 :            : FILE *gfc_open_file (const char *);
    2906                 :            : const char *gfc_basic_typename (bt);
    2907                 :            : const char *gfc_dummy_typename (gfc_typespec *);
    2908                 :            : const char *gfc_typename (gfc_typespec *);
    2909                 :            : const char *gfc_typename (gfc_expr *);
    2910                 :            : const char *gfc_op2string (gfc_intrinsic_op);
    2911                 :            : const char *gfc_code2string (const mstring *, int);
    2912                 :            : int gfc_string2code (const mstring *, const char *);
    2913                 :            : const char *gfc_intent_string (sym_intent);
    2914                 :            : 
    2915                 :            : void gfc_init_1 (void);
    2916                 :            : void gfc_init_2 (void);
    2917                 :            : void gfc_done_1 (void);
    2918                 :            : void gfc_done_2 (void);
    2919                 :            : 
    2920                 :            : int get_c_kind (const char *, CInteropKind_t *);
    2921                 :            : 
    2922                 :            : const char *gfc_closest_fuzzy_match (const char *, char **);
    2923                 :            : static inline void
    2924                 :        378 : vec_push (char **&optr, size_t &osz, const char *elt)
    2925                 :            : {
    2926                 :            :   /* {auto,}vec.safe_push () replacement.  Don't ask..  */
    2927                 :            :   // if (strlen (elt) < 4) return; premature optimization: eliminated by cutoff
    2928                 :        378 :   optr = XRESIZEVEC (char *, optr, osz + 2);
    2929                 :        378 :   optr[osz] = CONST_CAST (char *, elt);
    2930                 :        378 :   optr[++osz] = NULL;
    2931                 :        378 : }
    2932                 :            : 
    2933                 :            : HOST_WIDE_INT gfc_mpz_get_hwi (mpz_t);
    2934                 :            : void gfc_mpz_set_hwi (mpz_t, const HOST_WIDE_INT);
    2935                 :            : 
    2936                 :            : /* options.c */
    2937                 :            : unsigned int gfc_option_lang_mask (void);
    2938                 :            : void gfc_init_options_struct (struct gcc_options *);
    2939                 :            : void gfc_init_options (unsigned int,
    2940                 :            :                        struct cl_decoded_option *);
    2941                 :            : bool gfc_handle_option (size_t, const char *, HOST_WIDE_INT, int, location_t,
    2942                 :            :                         const struct cl_option_handlers *);
    2943                 :            : bool gfc_post_options (const char **);
    2944                 :            : char *gfc_get_option_string (void);
    2945                 :            : 
    2946                 :            : /* f95-lang.c */
    2947                 :            : void gfc_maybe_initialize_eh (void);
    2948                 :            : 
    2949                 :            : /* iresolve.c */
    2950                 :            : const char * gfc_get_string (const char *, ...) ATTRIBUTE_PRINTF_1;
    2951                 :            : bool gfc_find_sym_in_expr (gfc_symbol *, gfc_expr *);
    2952                 :            : 
    2953                 :            : /* error.c */
    2954                 :            : void gfc_error_init_1 (void);
    2955                 :            : void gfc_diagnostics_init (void);
    2956                 :            : void gfc_diagnostics_finish (void);
    2957                 :            : void gfc_buffer_error (bool);
    2958                 :            : 
    2959                 :            : const char *gfc_print_wide_char (gfc_char_t);
    2960                 :            : 
    2961                 :            : bool gfc_warning (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
    2962                 :            : bool gfc_warning_now (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
    2963                 :            : bool gfc_warning_internal (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
    2964                 :            : bool gfc_warning_now_at (location_t loc, int opt, const char *gmsgid, ...)
    2965                 :            :   ATTRIBUTE_GCC_GFC(3,4);
    2966                 :            : 
    2967                 :            : void gfc_clear_warning (void);
    2968                 :            : void gfc_warning_check (void);
    2969                 :            : 
    2970                 :            : void gfc_error_opt (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
    2971                 :            : void gfc_error (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
    2972                 :            : void gfc_error_now (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
    2973                 :            : void gfc_fatal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);
    2974                 :            : void gfc_internal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);
    2975                 :            : void gfc_clear_error (void);
    2976                 :            : bool gfc_error_check (void);
    2977                 :            : bool gfc_error_flag_test (void);
    2978                 :            : 
    2979                 :            : notification gfc_notification_std (int);
    2980                 :            : bool gfc_notify_std (int, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
    2981                 :            : 
    2982                 :            : /* A general purpose syntax error.  */
    2983                 :            : #define gfc_syntax_error(ST)    \
    2984                 :            :   gfc_error ("Syntax error in %s statement at %C", gfc_ascii_statement (ST));
    2985                 :            : 
    2986                 :            : #include "pretty-print.h"  /* For output_buffer.  */
    2987                 :    5318765 : struct gfc_error_buffer
    2988                 :            : {
    2989                 :            :   bool flag;
    2990                 :            :   output_buffer buffer;
    2991                 :    5318768 :   gfc_error_buffer(void) : flag(false), buffer() {}
    2992                 :            : };
    2993                 :            : 
    2994                 :            : void gfc_push_error (gfc_error_buffer *);
    2995                 :            : void gfc_pop_error (gfc_error_buffer *);
    2996                 :            : void gfc_free_error (gfc_error_buffer *);
    2997                 :            : 
    2998                 :            : void gfc_get_errors (int *, int *);
    2999                 :            : void gfc_errors_to_warnings (bool);
    3000                 :            : 
    3001                 :            : /* arith.c */
    3002                 :            : void gfc_arith_init_1 (void);
    3003                 :            : void gfc_arith_done_1 (void);
    3004                 :            : arith gfc_check_integer_range (mpz_t p, int kind);
    3005                 :            : bool gfc_check_character_range (gfc_char_t, int);
    3006                 :            : 
    3007                 :            : extern bool gfc_seen_div0;
    3008                 :            : 
    3009                 :            : /* trans-types.c */
    3010                 :            : bool gfc_check_any_c_kind (gfc_typespec *);
    3011                 :            : int gfc_validate_kind (bt, int, bool);
    3012                 :            : int gfc_get_int_kind_from_width_isofortranenv (int size);
    3013                 :            : int gfc_get_real_kind_from_width_isofortranenv (int size);
    3014                 :            : tree gfc_get_union_type (gfc_symbol *);
    3015                 :            : tree gfc_get_derived_type (gfc_symbol * derived, int codimen = 0);
    3016                 :            : extern int gfc_index_integer_kind;
    3017                 :            : extern int gfc_default_integer_kind;
    3018                 :            : extern int gfc_max_integer_kind;
    3019                 :            : extern int gfc_default_real_kind;
    3020                 :            : extern int gfc_default_double_kind;
    3021                 :            : extern int gfc_default_character_kind;
    3022                 :            : extern int gfc_default_logical_kind;
    3023                 :            : extern int gfc_default_complex_kind;
    3024                 :            : extern int gfc_c_int_kind;
    3025                 :            : extern int gfc_atomic_int_kind;
    3026                 :            : extern int gfc_atomic_logical_kind;
    3027                 :            : extern int gfc_intio_kind;
    3028                 :            : extern int gfc_charlen_int_kind;
    3029                 :            : extern int gfc_size_kind;
    3030                 :            : extern int gfc_numeric_storage_size;
    3031                 :            : extern int gfc_character_storage_size;
    3032                 :            : 
    3033                 :            : #define gfc_logical_4_kind 4
    3034                 :            : #define gfc_integer_4_kind 4
    3035                 :            : #define gfc_real_4_kind 4
    3036                 :            : 
    3037                 :            : /* symbol.c */
    3038                 :            : void gfc_clear_new_implicit (void);
    3039                 :            : bool gfc_add_new_implicit_range (int, int);
    3040                 :            : bool gfc_merge_new_implicit (gfc_typespec *);
    3041                 :            : void gfc_set_implicit_none (bool, bool, locus *);
    3042                 :            : void gfc_check_function_type (gfc_namespace *);
    3043                 :            : bool gfc_is_intrinsic_typename (const char *);
    3044                 :            : bool gfc_check_conflict (symbol_attribute *, const char *, locus *);
    3045                 :            : 
    3046                 :            : gfc_typespec *gfc_get_default_type (const char *, gfc_namespace *);
    3047                 :            : bool gfc_set_default_type (gfc_symbol *, int, gfc_namespace *);
    3048                 :            : 
    3049                 :            : void gfc_set_sym_referenced (gfc_symbol *);
    3050                 :            : 
    3051                 :            : bool gfc_add_attribute (symbol_attribute *, locus *);
    3052                 :            : bool gfc_add_ext_attribute (symbol_attribute *, ext_attr_id_t, locus *);
    3053                 :            : bool gfc_add_allocatable (symbol_attribute *, locus *);
    3054                 :            : bool gfc_add_codimension (symbol_attribute *, const char *, locus *);
    3055                 :            : bool gfc_add_contiguous (symbol_attribute *, const char *, locus *);
    3056                 :            : bool gfc_add_dimension (symbol_attribute *, const char *, locus *);
    3057                 :            : bool gfc_add_external (symbol_attribute *, locus *);
    3058                 :            : bool gfc_add_intrinsic (symbol_attribute *, locus *);
    3059                 :            : bool gfc_add_optional (symbol_attribute *, locus *);
    3060                 :            : bool gfc_add_kind (symbol_attribute *, locus *);
    3061                 :            : bool gfc_add_len (symbol_attribute *, locus *);
    3062                 :            : bool gfc_add_pointer (symbol_attribute *, locus *);
    3063                 :            : bool gfc_add_cray_pointer (symbol_attribute *, locus *);
    3064                 :            : bool gfc_add_cray_pointee (symbol_attribute *, locus *);
    3065                 :            : match gfc_mod_pointee_as (gfc_array_spec *);
    3066                 :            : bool gfc_add_protected (symbol_attribute *, const char *, locus *);
    3067                 :            : bool gfc_add_result (symbol_attribute *, const char *, locus *);
    3068                 :            : bool gfc_add_automatic (symbol_attribute *, const char *, locus *);
    3069                 :            : bool gfc_add_save (symbol_attribute *, save_state, const char *, locus *);
    3070                 :            : bool gfc_add_threadprivate (symbol_attribute *, const char *, locus *);
    3071                 :            : bool gfc_add_omp_declare_target (symbol_attribute *, const char *, locus *);
    3072                 :            : bool gfc_add_omp_declare_target_link (symbol_attribute *, const char *,
    3073                 :            :                                       locus *);
    3074                 :            : bool gfc_add_saved_common (symbol_attribute *, locus *);
    3075                 :            : bool gfc_add_target (symbol_attribute *, locus *);
    3076                 :            : bool gfc_add_dummy (symbol_attribute *, const char *, locus *);
    3077                 :            : bool gfc_add_generic (symbol_attribute *, const char *, locus *);
    3078                 :            : bool gfc_add_common (symbol_attribute *, locus *);
    3079                 :            : bool gfc_add_in_common (symbol_attribute *, const char *, locus *);
    3080                 :            : bool gfc_add_in_equivalence (symbol_attribute *, const char *, locus *);
    3081                 :            : bool gfc_add_data (symbol_attribute *, const char *, locus *);
    3082                 :            : bool gfc_add_in_namelist (symbol_attribute *, const char *, locus *);
    3083                 :            : bool gfc_add_sequence (symbol_attribute *, const char *, locus *);
    3084                 :            : bool gfc_add_elemental (symbol_attribute *, locus *);
    3085                 :            : bool gfc_add_pure (symbol_attribute *, locus *);
    3086                 :            : bool gfc_add_recursive (symbol_attribute *, locus *);
    3087                 :            : bool gfc_add_function (symbol_attribute *, const char *, locus *);
    3088                 :            : bool gfc_add_subroutine (symbol_attribute *, const char *, locus *);
    3089                 :            : bool gfc_add_volatile (symbol_attribute *, const char *, locus *);
    3090                 :            : bool gfc_add_asynchronous (symbol_attribute *, const char *, locus *);
    3091                 :            : bool gfc_add_proc (symbol_attribute *attr, const char *name, locus *where);
    3092                 :            : bool gfc_add_abstract (symbol_attribute* attr, locus* where);
    3093                 :            : 
    3094                 :            : bool gfc_add_access (symbol_attribute *, gfc_access, const char *, locus *);
    3095                 :            : bool gfc_add_is_bind_c (symbol_attribute *, const char *, locus *, int);
    3096                 :            : bool gfc_add_extension (symbol_attribute *, locus *);
    3097                 :            : bool gfc_add_value (symbol_attribute *, const char *, locus *);
    3098                 :            : bool gfc_add_flavor (symbol_attribute *, sym_flavor, const char *, locus *);
    3099                 :            : bool gfc_add_entry (symbol_attribute *, const char *, locus *);
    3100                 :            : bool gfc_add_procedure (symbol_attribute *, procedure_type,
    3101                 :            :                        const char *, locus *);
    3102                 :            : bool gfc_add_intent (symbol_attribute *, sym_intent, locus *);
    3103                 :            : bool gfc_add_explicit_interface (gfc_symbol *, ifsrc,
    3104                 :            :                                 gfc_formal_arglist *, locus *);
    3105                 :            : bool gfc_add_type (gfc_symbol *, gfc_typespec *, locus *);
    3106                 :            : 
    3107                 :            : void gfc_clear_attr (symbol_attribute *);
    3108                 :            : bool gfc_missing_attr (symbol_attribute *, locus *);
    3109                 :            : bool gfc_copy_attr (symbol_attribute *, symbol_attribute *, locus *);
    3110                 :            : int gfc_copy_dummy_sym (gfc_symbol **, gfc_symbol *, int);
    3111                 :            : bool gfc_add_component (gfc_symbol *, const char *, gfc_component **);
    3112                 :            : gfc_symbol *gfc_use_derived (gfc_symbol *);
    3113                 :            : gfc_symtree *gfc_use_derived_tree (gfc_symtree *);
    3114                 :            : gfc_component *gfc_find_component (gfc_symbol *, const char *, bool, bool,
    3115                 :            :                                    gfc_ref **);
    3116                 :            : 
    3117                 :            : gfc_st_label *gfc_get_st_label (int);
    3118                 :            : void gfc_free_st_label (gfc_st_label *);
    3119                 :            : void gfc_define_st_label (gfc_st_label *, gfc_sl_type, locus *);
    3120                 :            : bool gfc_reference_st_label (gfc_st_label *, gfc_sl_type);
    3121                 :            : 
    3122                 :            : gfc_namespace *gfc_get_namespace (gfc_namespace *, int);
    3123                 :            : gfc_symtree *gfc_new_symtree (gfc_symtree **, const char *);
    3124                 :            : gfc_symtree *gfc_find_symtree (gfc_symtree *, const char *);
    3125                 :            : void gfc_delete_symtree (gfc_symtree **, const char *);
    3126                 :            : gfc_symtree *gfc_get_unique_symtree (gfc_namespace *);
    3127                 :            : gfc_user_op *gfc_get_uop (const char *);
    3128                 :            : gfc_user_op *gfc_find_uop (const char *, gfc_namespace *);
    3129                 :            : void gfc_free_symbol (gfc_symbol *);
    3130                 :            : void gfc_release_symbol (gfc_symbol *);
    3131                 :            : gfc_symbol *gfc_new_symbol (const char *, gfc_namespace *);
    3132                 :            : gfc_symtree* gfc_find_symtree_in_proc (const char *, gfc_namespace *);
    3133                 :            : int gfc_find_symbol (const char *, gfc_namespace *, int, gfc_symbol **);
    3134                 :            : int gfc_find_sym_tree (const char *, gfc_namespace *, int, gfc_symtree **);
    3135                 :            : int gfc_get_symbol (const char *, gfc_namespace *, gfc_symbol **);
    3136                 :            : bool gfc_verify_c_interop (gfc_typespec *);
    3137                 :            : bool gfc_verify_c_interop_param (gfc_symbol *);
    3138                 :            : bool verify_bind_c_sym (gfc_symbol *, gfc_typespec *, int, gfc_common_head *);
    3139                 :            : bool verify_bind_c_derived_type (gfc_symbol *);
    3140                 :            : bool verify_com_block_vars_c_interop (gfc_common_head *);
    3141                 :            : gfc_symtree *generate_isocbinding_symbol (const char *, iso_c_binding_symbol,
    3142                 :            :                                           const char *, gfc_symtree *, bool);
    3143                 :            : void gfc_save_symbol_data (gfc_symbol *);
    3144                 :            : int gfc_get_sym_tree (const char *, gfc_namespace *, gfc_symtree **, bool);
    3145                 :            : int gfc_get_ha_symbol (const char *, gfc_symbol **);
    3146                 :            : int gfc_get_ha_sym_tree (const char *, gfc_symtree **);
    3147                 :            : 
    3148                 :            : void gfc_drop_last_undo_checkpoint (void);
    3149                 :            : void gfc_restore_last_undo_checkpoint (void);
    3150                 :            : void gfc_undo_symbols (void);
    3151                 :            : void gfc_commit_symbols (void);
    3152                 :            : void gfc_commit_symbol (gfc_symbol *);
    3153                 :            : gfc_charlen *gfc_new_charlen (gfc_namespace *, gfc_charlen *);
    3154                 :            : void gfc_free_charlen (gfc_charlen *, gfc_charlen *);
    3155                 :            : void gfc_free_namespace (gfc_namespace *);
    3156                 :            : 
    3157                 :            : void gfc_symbol_init_2 (void);
    3158                 :            : void gfc_symbol_done_2 (void);
    3159                 :            : 
    3160                 :            : void gfc_traverse_symtree (gfc_symtree *, void (*)(gfc_symtree *));
    3161                 :            : void gfc_traverse_ns (gfc_namespace *, void (*)(gfc_symbol *));
    3162                 :            : void gfc_traverse_user_op (gfc_namespace *, void (*)(gfc_user_op *));
    3163                 :            : void gfc_save_all (gfc_namespace *);
    3164                 :            : 
    3165                 :            : void gfc_enforce_clean_symbol_state (void);
    3166                 :            : 
    3167                 :            : gfc_gsymbol *gfc_get_gsymbol (const char *, bool bind_c);
    3168                 :            : gfc_gsymbol *gfc_find_gsymbol (gfc_gsymbol *, const char *);
    3169                 :            : gfc_gsymbol *gfc_find_case_gsymbol (gfc_gsymbol *, const char *);
    3170                 :            : void gfc_traverse_gsymbol (gfc_gsymbol *, void (*)(gfc_gsymbol *, void *), void *);
    3171                 :            : 
    3172                 :            : gfc_typebound_proc* gfc_get_typebound_proc (gfc_typebound_proc*);
    3173                 :            : gfc_symbol* gfc_get_derived_super_type (gfc_symbol*);
    3174                 :            : gfc_symbol* gfc_get_ultimate_derived_super_type (gfc_symbol*);
    3175                 :            : bool gfc_type_is_extension_of (gfc_symbol *, gfc_symbol *);
    3176                 :            : bool gfc_type_compatible (gfc_typespec *, gfc_typespec *);
    3177                 :            : 
    3178                 :            : void gfc_copy_formal_args_intr (gfc_symbol *, gfc_intrinsic_sym *,
    3179                 :            :                                 gfc_actual_arglist *);
    3180                 :            : 
    3181                 :            : void gfc_free_finalizer (gfc_finalizer *el); /* Needed in resolve.c, too  */
    3182                 :            : 
    3183                 :            : bool gfc_check_symbol_typed (gfc_symbol*, gfc_namespace*, bool, locus);
    3184                 :            : gfc_namespace* gfc_find_proc_namespace (gfc_namespace*);
    3185                 :            : 
    3186                 :            : bool gfc_is_associate_pointer (gfc_symbol*);
    3187                 :            : gfc_symbol * gfc_find_dt_in_generic (gfc_symbol *);
    3188                 :            : gfc_formal_arglist *gfc_sym_get_dummy_args (gfc_symbol *);
    3189                 :            : 
    3190                 :            : /* intrinsic.c -- true if working in an init-expr, false otherwise.  */
    3191                 :            : extern bool gfc_init_expr_flag;
    3192                 :            : 
    3193                 :            : /* Given a symbol that we have decided is intrinsic, mark it as such
    3194                 :            :    by placing it into a special module that is otherwise impossible to
    3195                 :            :    read or write.  */
    3196                 :            : 
    3197                 :            : #define gfc_intrinsic_symbol(SYM) SYM->module = gfc_get_string ("(intrinsic)")
    3198                 :            : 
    3199                 :            : void gfc_intrinsic_init_1 (void);
    3200                 :            : void gfc_intrinsic_done_1 (void);
    3201                 :            : 
    3202                 :            : char gfc_type_letter (bt, bool logical_equals_int = false);
    3203                 :            : gfc_symbol * gfc_get_intrinsic_sub_symbol (const char *);
    3204                 :            : bool gfc_convert_type (gfc_expr *, gfc_typespec *, int);
    3205                 :            : bool gfc_convert_type_warn (gfc_expr *, gfc_typespec *, int, int,
    3206                 :            :                             bool array = false);
    3207                 :            : bool gfc_convert_chartype (gfc_expr *, gfc_typespec *);
    3208                 :            : int gfc_generic_intrinsic (const char *);
    3209                 :            : int gfc_specific_intrinsic (const char *);
    3210                 :            : bool gfc_is_intrinsic (gfc_symbol*, int, locus);
    3211                 :            : int gfc_intrinsic_actual_ok (const char *, const bool);
    3212                 :            : gfc_intrinsic_sym *gfc_find_function (const char *);
    3213                 :            : gfc_intrinsic_sym *gfc_find_subroutine (const char *);
    3214                 :            : gfc_intrinsic_sym *gfc_intrinsic_function_by_id (gfc_isym_id);
    3215                 :            : gfc_intrinsic_sym *gfc_intrinsic_subroutine_by_id (gfc_isym_id);
    3216                 :            : gfc_isym_id gfc_isym_id_by_intmod (intmod_id, int);
    3217                 :            : gfc_isym_id gfc_isym_id_by_intmod_sym (gfc_symbol *);
    3218                 :            : 
    3219                 :            : 
    3220                 :            : match gfc_intrinsic_func_interface (gfc_expr *, int);
    3221                 :            : match gfc_intrinsic_sub_interface (gfc_code *, int);
    3222                 :            : 
    3223                 :            : void gfc_warn_intrinsic_shadow (const gfc_symbol*, bool, bool);
    3224                 :            : bool gfc_check_intrinsic_standard (const gfc_intrinsic_sym*, const char**,
    3225                 :            :                                       bool, locus);
    3226                 :            : 
    3227                 :            : /* match.c -- FIXME */
    3228                 :            : void gfc_free_iterator (gfc_iterator *, int);
    3229                 :            : void gfc_free_forall_iterator (gfc_forall_iterator *);
    3230                 :            : void gfc_free_alloc_list (gfc_alloc *);
    3231                 :            : void gfc_free_namelist (gfc_namelist *);
    3232                 :            : void gfc_free_omp_namelist (gfc_omp_namelist *);
    3233                 :            : void gfc_free_equiv (gfc_equiv *);
    3234                 :            : void gfc_free_equiv_until (gfc_equiv *, gfc_equiv *);
    3235                 :            : void gfc_free_data (gfc_data *);
    3236                 :            : void gfc_reject_data (gfc_namespace *);
    3237                 :            : void gfc_free_case_list (gfc_case *);
    3238                 :            : 
    3239                 :            : /* matchexp.c -- FIXME too?  */
    3240                 :            : gfc_expr *gfc_get_parentheses (gfc_expr *);
    3241                 :            : 
    3242                 :            : /* openmp.c */
    3243                 :            : struct gfc_omp_saved_state { void *ptrs[2]; int ints[1]; };
    3244                 :            : void gfc_free_omp_clauses (gfc_omp_clauses *);
    3245                 :            : void gfc_free_oacc_declare_clauses (struct gfc_oacc_declare *);
    3246                 :            : void gfc_free_omp_declare_simd (gfc_omp_declare_simd *);
    3247                 :            : void gfc_free_omp_declare_simd_list (gfc_omp_declare_simd *);
    3248                 :            : void gfc_free_omp_udr (gfc_omp_udr *);
    3249                 :            : gfc_omp_udr *gfc_omp_udr_find (gfc_symtree *, gfc_typespec *);
    3250                 :            : void gfc_resolve_omp_directive (gfc_code *, gfc_namespace *);
    3251                 :            : void gfc_resolve_do_iterator (gfc_code *, gfc_symbol *, bool);
    3252                 :            : void gfc_resolve_omp_local_vars (gfc_namespace *);
    3253                 :            : void gfc_resolve_omp_parallel_blocks (gfc_code *, gfc_namespace *);
    3254                 :            : void gfc_resolve_omp_do_blocks (gfc_code *, gfc_namespace *);
    3255                 :            : void gfc_resolve_omp_declare_simd (gfc_namespace *);
    3256                 :            : void gfc_resolve_omp_udrs (gfc_symtree *);
    3257                 :            : void gfc_omp_save_and_clear_state (struct gfc_omp_saved_state *);
    3258                 :            : void gfc_omp_restore_state (struct gfc_omp_saved_state *);
    3259                 :            : void gfc_free_expr_list (gfc_expr_list *);
    3260                 :            : void gfc_resolve_oacc_directive (gfc_code *, gfc_namespace *);
    3261                 :            : void gfc_resolve_oacc_declare (gfc_namespace *);
    3262                 :            : void gfc_resolve_oacc_parallel_loop_blocks (gfc_code *, gfc_namespace *);
    3263                 :            : void gfc_resolve_oacc_blocks (gfc_code *, gfc_namespace *);
    3264                 :            : void gfc_resolve_oacc_routines (gfc_namespace *);
    3265                 :            : 
    3266                 :            : /* expr.c */
    3267                 :            : void gfc_free_actual_arglist (gfc_actual_arglist *);
    3268                 :            : gfc_actual_arglist *gfc_copy_actual_arglist (gfc_actual_arglist *);
    3269                 :            : 
    3270                 :            : bool gfc_extract_int (gfc_expr *, int *, int = 0);
    3271                 :            : bool gfc_extract_hwi (gfc_expr *, HOST_WIDE_INT *, int = 0);
    3272                 :            : 
    3273                 :            : bool is_CFI_desc (gfc_symbol *, gfc_expr *);
    3274                 :            : bool is_subref_array (gfc_expr *);
    3275                 :            : bool gfc_is_simply_contiguous (gfc_expr *, bool, bool);
    3276                 :            : bool gfc_is_not_contiguous (gfc_expr *);
    3277                 :            : bool gfc_check_init_expr (gfc_expr *);
    3278                 :            : 
    3279                 :            : gfc_expr *gfc_build_conversion (gfc_expr *);
    3280                 :            : void gfc_free_ref_list (gfc_ref *);
    3281                 :            : void gfc_type_convert_binary (gfc_expr *, int);
    3282                 :            : bool gfc_is_constant_expr (gfc_expr *);
    3283                 :            : bool gfc_simplify_expr (gfc_expr *, int);
    3284                 :            : int gfc_has_vector_index (gfc_expr *);
    3285                 :            : 
    3286                 :            : gfc_expr *gfc_get_expr (void);
    3287                 :            : gfc_expr *gfc_get_array_expr (bt type, int kind, locus *);
    3288                 :            : gfc_expr *gfc_get_null_expr (locus *);
    3289                 :            : gfc_expr *gfc_get_operator_expr (locus *, gfc_intrinsic_op,gfc_expr *, gfc_expr *);
    3290                 :            : gfc_expr *gfc_get_structure_constructor_expr (bt, int, locus *);
    3291                 :            : gfc_expr *gfc_get_constant_expr (bt, int, locus *);
    3292                 :            : gfc_expr *gfc_get_character_expr (int, locus *, const char *, gfc_charlen_t len);
    3293                 :            : gfc_expr *gfc_get_int_expr (int, locus *, HOST_WIDE_INT);
    3294                 :            : gfc_expr *gfc_get_logical_expr (int, locus *, bool);
    3295                 :            : gfc_expr *gfc_get_iokind_expr (locus *, io_kind);
    3296                 :            : 
    3297                 :            : void gfc_clear_shape (mpz_t *shape, int rank);
    3298                 :            : void gfc_free_shape (mpz_t **shape, int rank);
    3299                 :            : void gfc_free_expr (gfc_expr *);
    3300                 :            : void gfc_replace_expr (gfc_expr *, gfc_expr *);
    3301                 :            : mpz_t *gfc_copy_shape (mpz_t *, int);
    3302                 :            : mpz_t *gfc_copy_shape_excluding (mpz_t *, int, gfc_expr *);
    3303                 :            : gfc_expr *gfc_copy_expr (gfc_expr *);
    3304                 :            : gfc_ref* gfc_copy_ref (gfc_ref*);
    3305                 :            : 
    3306                 :            : bool gfc_specification_expr (gfc_expr *);
    3307                 :            : 
    3308                 :            : int gfc_numeric_ts (gfc_typespec *);
    3309                 :            : int gfc_kind_max (gfc_expr *, gfc_expr *);
    3310                 :            : 
    3311                 :            : bool gfc_check_conformance (gfc_expr *, gfc_expr *, const char *, ...) ATTRIBUTE_PRINTF_3;
    3312                 :            : bool gfc_check_assign (gfc_expr *, gfc_expr *, int, bool c = true);
    3313                 :            : bool gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue,
    3314                 :            :                                bool suppres_type_test = false,
    3315                 :            :                                bool is_init_expr = false);
    3316                 :            : bool gfc_check_assign_symbol (gfc_symbol *, gfc_component *, gfc_expr *);
    3317                 :            : 
    3318                 :            : gfc_expr *gfc_build_default_init_expr (gfc_typespec *, locus *);
    3319                 :            : gfc_expr *gfc_build_init_expr (gfc_typespec *, locus *, bool);
    3320                 :            : void gfc_apply_init (gfc_typespec *, symbol_attribute *, gfc_expr *);
    3321                 :            : bool gfc_has_default_initializer (gfc_symbol *);
    3322                 :            : gfc_expr *gfc_default_initializer (gfc_typespec *);
    3323                 :            : gfc_expr *gfc_generate_initializer (gfc_typespec *, bool);
    3324                 :            : gfc_expr *gfc_get_variable_expr (gfc_symtree *);
    3325                 :            : void gfc_add_full_array_ref (gfc_expr *, gfc_array_spec *);
    3326                 :            : gfc_expr * gfc_lval_expr_from_sym (gfc_symbol *);
    3327                 :            : 
    3328                 :            : gfc_array_spec *gfc_get_full_arrayspec_from_expr (gfc_expr *expr);
    3329                 :            : 
    3330                 :            : bool gfc_traverse_expr (gfc_expr *, gfc_symbol *,
    3331                 :            :                         bool (*)(gfc_expr *, gfc_symbol *, int*),
    3332                 :            :                         int);
    3333                 :            : void gfc_expr_set_symbols_referenced (gfc_expr *);
    3334                 :            : bool gfc_expr_check_typed (gfc_expr*, gfc_namespace*, bool);
    3335                 :            : bool gfc_derived_parameter_expr (gfc_expr *);
    3336                 :            : gfc_param_spec_type gfc_spec_list_type (gfc_actual_arglist *, gfc_symbol *);
    3337                 :            : gfc_component * gfc_get_proc_ptr_comp (gfc_expr *);
    3338                 :            : bool gfc_is_proc_ptr_comp (gfc_expr *);
    3339                 :            : bool gfc_is_alloc_class_scalar_function (gfc_expr *);
    3340                 :            : bool gfc_is_class_array_function (gfc_expr *);
    3341                 :            : 
    3342                 :            : bool gfc_ref_this_image (gfc_ref *ref);
    3343                 :            : bool gfc_is_coindexed (gfc_expr *);
    3344                 :            : bool gfc_is_coarray (gfc_expr *);
    3345                 :            : int gfc_get_corank (gfc_expr *);
    3346                 :            : bool gfc_has_ultimate_allocatable (gfc_expr *);
    3347                 :            : bool gfc_has_ultimate_pointer (gfc_expr *);
    3348                 :            : gfc_expr* gfc_find_team_co (gfc_expr *);
    3349                 :            : gfc_expr* gfc_find_stat_co (gfc_expr *);
    3350                 :            : gfc_expr* gfc_build_intrinsic_call (gfc_namespace *, gfc_isym_id, const char*,
    3351                 :            :                                     locus, unsigned, ...);
    3352                 :            : bool gfc_check_vardef_context (gfc_expr*, bool, bool, bool, const char*);
    3353                 :            : 
    3354                 :            : 
    3355                 :            : /* st.c */
    3356                 :            : extern gfc_code new_st;
    3357                 :            : 
    3358                 :            : void gfc_clear_new_st (void);
    3359                 :            : gfc_code *gfc_get_code (gfc_exec_op);
    3360                 :            : gfc_code *gfc_append_code (gfc_code *, gfc_code *);
    3361                 :            : void gfc_free_statement (gfc_code *);
    3362                 :            : void gfc_free_statements (gfc_code *);
    3363                 :            : void gfc_free_association_list (gfc_association_list *);
    3364                 :            : 
    3365                 :            : /* resolve.c */
    3366                 :            : void gfc_expression_rank (gfc_expr *);
    3367                 :            : bool gfc_resolve_ref (gfc_expr *);
    3368                 :            : bool gfc_resolve_expr (gfc_expr *);
    3369                 :            : void gfc_resolve (gfc_namespace *);
    3370                 :            : void gfc_resolve_code (gfc_code *, gfc_namespace *);
    3371                 :            : void gfc_resolve_blocks (gfc_code *, gfc_namespace *);
    3372                 :            : int gfc_impure_variable (gfc_symbol *);
    3373                 :            : int gfc_pure (gfc_symbol *);
    3374                 :            : int gfc_implicit_pure (gfc_symbol *);
    3375                 :            : void gfc_unset_implicit_pure (gfc_symbol *);
    3376                 :            : int gfc_elemental (gfc_symbol *);
    3377                 :            : bool gfc_resolve_iterator (gfc_iterator *, bool, bool);
    3378                 :            : bool find_forall_index (gfc_expr *, gfc_symbol *, int);
    3379                 :            : bool gfc_resolve_index (gfc_expr *, int);
    3380                 :            : bool gfc_resolve_dim_arg (gfc_expr *);
    3381                 :            : bool gfc_is_formal_arg (void);
    3382                 :            : void gfc_resolve_substring_charlen (gfc_expr *);
    3383                 :            : match gfc_iso_c_sub_interface(gfc_code *, gfc_symbol *);
    3384                 :            : gfc_expr *gfc_expr_to_initialize (gfc_expr *);
    3385                 :            : bool gfc_type_is_extensible (gfc_symbol *);
    3386                 :            : bool gfc_resolve_intrinsic (gfc_symbol *, locus *);
    3387                 :            : bool gfc_explicit_interface_required (gfc_symbol *, char *, int);
    3388                 :            : extern int gfc_do_concurrent_flag;
    3389                 :            : const char* gfc_lookup_function_fuzzy (const char *, gfc_symtree *);
    3390                 :            : int gfc_pure_function (gfc_expr *e, const char **name);
    3391                 :            : int gfc_implicit_pure_function (gfc_expr *e);
    3392                 :            : 
    3393                 :            : 
    3394                 :            : /* array.c */
    3395                 :            : gfc_iterator *gfc_copy_iterator (gfc_iterator *);
    3396                 :            : 
    3397                 :            : void gfc_free_array_spec (gfc_array_spec *);
    3398                 :            : gfc_array_ref *gfc_copy_array_ref (gfc_array_ref *);
    3399                 :            : 
    3400                 :            : bool gfc_set_array_spec (gfc_symbol *, gfc_array_spec *, locus *);
    3401                 :            : gfc_array_spec *gfc_copy_array_spec (gfc_array_spec *);
    3402                 :            : bool gfc_resolve_array_spec (gfc_array_spec *, int);
    3403                 :            : 
    3404                 :            : int gfc_compare_array_spec (gfc_array_spec *, gfc_array_spec *);
    3405                 :            : 
    3406                 :            : void gfc_simplify_iterator_var (gfc_expr *);
    3407                 :            : bool gfc_expand_constructor (gfc_expr *, bool);
    3408                 :            : int gfc_constant_ac (gfc_expr *);
    3409                 :            : int gfc_expanded_ac (gfc_expr *);
    3410                 :            : bool gfc_resolve_character_array_constructor (gfc_expr *);
    3411                 :            : bool gfc_resolve_array_constructor (gfc_expr *);
    3412                 :            : bool gfc_check_constructor_type (gfc_expr *);
    3413                 :            : bool gfc_check_iter_variable (gfc_expr *);
    3414                 :            : bool gfc_check_constructor (gfc_expr *, bool (*)(gfc_expr *));
    3415                 :            : bool gfc_array_size (gfc_expr *, mpz_t *);
    3416                 :            : bool gfc_array_dimen_size (gfc_expr *, int, mpz_t *);
    3417                 :            : bool gfc_array_ref_shape (gfc_array_ref *, mpz_t *);
    3418                 :            : gfc_array_ref *gfc_find_array_ref (gfc_expr *, bool a = false);
    3419                 :            : tree gfc_conv_array_initializer (tree type, gfc_expr *);
    3420                 :            : bool spec_size (gfc_array_spec *, mpz_t *);
    3421                 :            : bool spec_dimen_size (gfc_array_spec *, int, mpz_t *);
    3422                 :            : bool gfc_is_compile_time_shape (gfc_array_spec *);
    3423                 :            : 
    3424                 :            : bool gfc_ref_dimen_size (gfc_array_ref *, int dimen, mpz_t *, mpz_t *);
    3425                 :            : 
    3426                 :            : 
    3427                 :            : #define gfc_str_startswith(str, pref) \
    3428                 :            :         (strncmp ((str), (pref), strlen (pref)) == 0)
    3429                 :            : 
    3430                 :            : /* interface.c -- FIXME: some of these should be in symbol.c */
    3431                 :            : void gfc_free_interface (gfc_interface *);
    3432                 :            : bool gfc_compare_derived_types (gfc_symbol *, gfc_symbol *);
    3433                 :            : bool gfc_compare_types (gfc_typespec *, gfc_typespec *);
    3434                 :            : bool gfc_check_dummy_characteristics (gfc_symbol *, gfc_symbol *,
    3435                 :            :                                       bool, char *, int);
    3436                 :            : bool gfc_check_result_characteristics (gfc_symbol *, gfc_symbol *,
    3437                 :            :                                        char *, int);
    3438                 :            : bool gfc_compare_interfaces (gfc_symbol*, gfc_symbol*, const char *, int, int,
    3439                 :            :                              char *, int, const char *, const char *);
    3440                 :            : void gfc_check_interfaces (gfc_namespace *);
    3441                 :            : bool gfc_procedure_use (gfc_symbol *, gfc_actual_arglist **, locus *);
    3442                 :            : void gfc_ppc_use (gfc_component *, gfc_actual_arglist **, locus *);
    3443                 :            : gfc_symbol *gfc_search_interface (gfc_interface *, int,
    3444                 :            :                                   gfc_actual_arglist **);
    3445                 :            : match gfc_extend_expr (gfc_expr *);
    3446                 :            : void gfc_free_formal_arglist (gfc_formal_arglist *);
    3447                 :            : bool gfc_extend_assign (gfc_code *, gfc_namespace *);
    3448                 :            : bool gfc_check_new_interface (gfc_interface *, gfc_symbol *, locus);
    3449                 :            : bool gfc_add_interface (gfc_symbol *);
    3450                 :            : gfc_interface *gfc_current_interface_head (void);
    3451                 :            : void gfc_set_current_interface_head (gfc_interface *);
    3452                 :            : gfc_symtree* gfc_find_sym_in_symtree (gfc_symbol*);
    3453                 :            : bool gfc_arglist_matches_symbol (gfc_actual_arglist**, gfc_symbol*);
    3454                 :            : bool gfc_check_operator_interface (gfc_symbol*, gfc_intrinsic_op, locus);
    3455                 :            : bool gfc_has_vector_subscript (gfc_expr*);
    3456                 :            : gfc_intrinsic_op gfc_equivalent_op (gfc_intrinsic_op);
    3457                 :            : bool gfc_check_typebound_override (gfc_symtree*, gfc_symtree*);
    3458                 :            : void gfc_check_dtio_interfaces (gfc_symbol*);
    3459                 :            : gfc_symtree* gfc_find_typebound_dtio_proc (gfc_symbol *, bool, bool);
    3460                 :            : gfc_symbol* gfc_find_specific_dtio_proc (gfc_symbol*, bool, bool);
    3461                 :            : void gfc_get_formal_from_actual_arglist (gfc_symbol *, gfc_actual_arglist *);
    3462                 :            : bool gfc_compare_actual_formal (gfc_actual_arglist **, gfc_formal_arglist *,
    3463                 :            :                                 int, int, bool, locus *);
    3464                 :            : 
    3465                 :            : 
    3466                 :            : /* io.c */
    3467                 :            : extern gfc_st_label format_asterisk;
    3468                 :            : 
    3469                 :            : void gfc_free_open (gfc_open *);
    3470                 :            : bool gfc_resolve_open (gfc_open *);
    3471                 :            : void gfc_free_close (gfc_close *);
    3472                 :            : bool gfc_resolve_close (gfc_close *);
    3473                 :            : void gfc_free_filepos (gfc_filepos *);
    3474                 :            : bool gfc_resolve_filepos (gfc_filepos *, locus *);
    3475                 :            : void gfc_free_inquire (gfc_inquire *);
    3476                 :            : bool gfc_resolve_inquire (gfc_inquire *);
    3477                 :            : void gfc_free_dt (gfc_dt *);
    3478                 :            : bool gfc_resolve_dt (gfc_dt *, locus *);
    3479                 :            : void gfc_free_wait (gfc_wait *);
    3480                 :            : bool gfc_resolve_wait (gfc_wait *);
    3481                 :            : extern bool async_io_dt;
    3482                 :            : 
    3483                 :            : /* module.c */
    3484                 :            : void gfc_module_init_2 (void);
    3485                 :            : void gfc_module_done_2 (void);
    3486                 :            : void gfc_dump_module (const char *, int);
    3487                 :            : bool gfc_check_symbol_access (gfc_symbol *);
    3488                 :            : void gfc_free_use_stmts (gfc_use_list *);
    3489                 :            : const char *gfc_dt_lower_string (const char *);
    3490                 :            : const char *gfc_dt_upper_string (const char *);
    3491                 :            : 
    3492                 :            : /* primary.c */
    3493                 :            : symbol_attribute gfc_variable_attr (gfc_expr *, gfc_typespec *);
    3494                 :            : symbol_attribute gfc_expr_attr (gfc_expr *);
    3495                 :            : symbol_attribute gfc_caf_attr (gfc_expr *, bool i = false, bool *r = NULL);
    3496                 :            : match gfc_match_rvalue (gfc_expr **);
    3497                 :            : match gfc_match_varspec (gfc_expr*, int, bool, bool);
    3498                 :            : int gfc_check_digit (char, int);
    3499                 :            : bool gfc_is_function_return_value (gfc_symbol *, gfc_namespace *);
    3500                 :            : bool gfc_convert_to_structure_constructor (gfc_expr *, gfc_symbol *,
    3501                 :            :                                               gfc_expr **,
    3502                 :            :                                               gfc_actual_arglist **, bool);
    3503                 :            : 
    3504                 :            : /* trans.c */
    3505                 :            : void gfc_generate_code (gfc_namespace *);
    3506                 :            : void gfc_generate_module_code (gfc_namespace *);
    3507                 :            : 
    3508                 :            : /* trans-intrinsic.c */
    3509                 :            : bool gfc_inline_intrinsic_function_p (gfc_expr *);
    3510                 :            : 
    3511                 :            : /* bbt.c */
    3512                 :            : typedef int (*compare_fn) (void *, void *);
    3513                 :            : void gfc_insert_bbt (void *, void *, compare_fn);
    3514                 :            : void gfc_delete_bbt (void *, void *, compare_fn);
    3515                 :            : 
    3516                 :            : /* dump-parse-tree.c */
    3517                 :            : void gfc_dump_parse_tree (gfc_namespace *, FILE *);
    3518                 :            : void gfc_dump_c_prototypes (gfc_namespace *, FILE *);
    3519                 :            : void gfc_dump_external_c_prototypes (FILE *);
    3520                 :            : void gfc_dump_global_symbols (FILE *);
    3521                 :            : void debug (gfc_symbol *);
    3522                 :            : void debug (gfc_expr *);
    3523                 :            : 
    3524                 :            : /* parse.c */
    3525                 :            : bool gfc_parse_file (void);
    3526                 :            : void gfc_global_used (gfc_gsymbol *, locus *);
    3527                 :            : gfc_namespace* gfc_build_block_ns (gfc_namespace *);
    3528                 :            : 
    3529                 :            : /* dependency.c */
    3530                 :            : int gfc_dep_compare_functions (gfc_expr *, gfc_expr *, bool);
    3531                 :            : int gfc_dep_compare_expr (gfc_expr *, gfc_expr *);
    3532                 :            : bool gfc_dep_difference (gfc_expr *, gfc_expr *, mpz_t *);
    3533                 :            : 
    3534                 :            : /* check.c */
    3535                 :            : bool gfc_check_same_strlen (const gfc_expr*, const gfc_expr*, const char*);
    3536                 :            : bool gfc_calculate_transfer_sizes (gfc_expr*, gfc_expr*, gfc_expr*,
    3537                 :            :                                       size_t*, size_t*, size_t*);
    3538                 :            : bool gfc_boz2int (gfc_expr *, int);
    3539                 :            : bool gfc_boz2real (gfc_expr *, int);
    3540                 :            : bool gfc_invalid_boz (const char *, locus *);
    3541                 :            : 
    3542                 :            : 
    3543                 :            : /* class.c */
    3544                 :            : void gfc_fix_class_refs (gfc_expr *e);
    3545                 :            : void gfc_add_component_ref (gfc_expr *, const char *);
    3546                 :            : void gfc_add_class_array_ref (gfc_expr *);
    3547                 :            : #define gfc_add_data_component(e)     gfc_add_component_ref(e,"_data")
    3548                 :            : #define gfc_add_vptr_component(e)     gfc_add_component_ref(e,"_vptr")
    3549                 :            : #define gfc_add_len_component(e)      gfc_add_component_ref(e,"_len")
    3550                 :            : #define gfc_add_hash_component(e)     gfc_add_component_ref(e,"_hash")
    3551                 :            : #define gfc_add_size_component(e)     gfc_add_component_ref(e,"_size")
    3552                 :            : #define gfc_add_def_init_component(e) gfc_add_component_ref(e,"_def_init")
    3553                 :            : #define gfc_add_final_component(e)    gfc_add_component_ref(e,"_final")
    3554                 :            : bool gfc_is_class_array_ref (gfc_expr *, bool *);
    3555                 :            : bool gfc_is_class_scalar_expr (gfc_expr *);
    3556                 :            : bool gfc_is_class_container_ref (gfc_expr *e);
    3557                 :            : gfc_expr *gfc_class_initializer (gfc_typespec *, gfc_expr *);
    3558                 :            : unsigned int gfc_hash_value (gfc_symbol *);
    3559                 :            : gfc_expr *gfc_get_len_component (gfc_expr *e, int);
    3560                 :            : bool gfc_build_class_symbol (gfc_typespec *, symbol_attribute *,
    3561                 :            :                              gfc_array_spec **);
    3562                 :            : gfc_symbol *gfc_find_derived_vtab (gfc_symbol *);
    3563                 :            : gfc_symbol *gfc_find_vtab (gfc_typespec *);
    3564                 :            : gfc_symtree* gfc_find_typebound_proc (gfc_symbol*, bool*,
    3565                 :            :                                       const char*, bool, locus*);
    3566                 :            : gfc_symtree* gfc_find_typebound_user_op (gfc_symbol*, bool*,
    3567                 :            :                                          const char*, bool, locus*);
    3568                 :            : gfc_typebound_proc* gfc_find_typebound_intrinsic_op (gfc_symbol*, bool*,
    3569                 :            :                                                      gfc_intrinsic_op, bool,
    3570                 :            :                                                      locus*);
    3571                 :            : gfc_symtree* gfc_get_tbp_symtree (gfc_symtree**, const char*);
    3572                 :            : bool gfc_is_finalizable (gfc_symbol *, gfc_expr **);
    3573                 :            : 
    3574                 :            : #define CLASS_DATA(sym) sym->ts.u.derived->components
    3575                 :            : #define UNLIMITED_POLY(sym) \
    3576                 :            :         (sym != NULL && sym->ts.type == BT_CLASS \
    3577                 :            :          && CLASS_DATA (sym) \
    3578                 :            :          && CLASS_DATA (sym)->ts.u.derived \
    3579                 :            :          && CLASS_DATA (sym)->ts.u.derived->attr.unlimited_polymorphic)
    3580                 :            : #define IS_CLASS_ARRAY(sym) \
    3581                 :            :         (sym->ts.type == BT_CLASS \
    3582                 :            :          && CLASS_DATA (sym) \
    3583                 :            :          && CLASS_DATA (sym)->attr.dimension \
    3584                 :            :          && !CLASS_DATA (sym)->attr.class_pointer)
    3585                 :            : 
    3586                 :            : /* frontend-passes.c */
    3587                 :            : 
    3588                 :            : void gfc_run_passes (gfc_namespace *);
    3589                 :            : 
    3590                 :            : typedef int (*walk_code_fn_t) (gfc_code **, int *, void *);
    3591                 :            : typedef int (*walk_expr_fn_t) (gfc_expr **, int *, void *);
    3592                 :            : 
    3593                 :            : int gfc_dummy_code_callback (gfc_code **, int *, void *);
    3594                 :            : int gfc_expr_walker (gfc_expr **, walk_expr_fn_t, void *);
    3595                 :            : int gfc_code_walker (gfc_code **, walk_code_fn_t, walk_expr_fn_t, void *);
    3596                 :            : bool gfc_has_dimen_vector_ref (gfc_expr *e);
    3597                 :            : void gfc_check_externals (gfc_namespace *);
    3598                 :            : 
    3599                 :            : /* simplify.c */
    3600                 :            : 
    3601                 :            : void gfc_convert_mpz_to_signed (mpz_t, int);
    3602                 :            : gfc_expr *gfc_simplify_ieee_functions (gfc_expr *);
    3603                 :            : bool gfc_is_size_zero_array (gfc_expr *);
    3604                 :            : 
    3605                 :            : /* trans-array.c  */
    3606                 :            : 
    3607                 :            : bool gfc_is_reallocatable_lhs (gfc_expr *);
    3608                 :            : 
    3609                 :            : /* trans-decl.c */
    3610                 :            : 
    3611                 :            : void finish_oacc_declare (gfc_namespace *, gfc_symbol *, bool);
    3612                 :            : void gfc_adjust_builtins (void);
    3613                 :            : 
    3614                 :            : #endif /* GCC_GFORTRAN_H  */

Generated by: LCOV version 1.0

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto --enable-host-shared. GCC test suite is run with the built compiler.