LCOV - code coverage report
Current view: top level - gcc/fortran - gfortran.h (source / functions) Coverage Total Hit
Test: gcc.info Lines: 100.0 % 17 17
Test Date: 2026-08-01 15:33:25 Functions: 100.0 % 2 2
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* gfortran header file
       2              :    Copyright (C) 2000-2026 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              : /* ISO_Fortran_binding.h
     109              :    CAUTION: This has to be kept in sync with libgfortran.  */
     110              : 
     111              : #define CFI_type_kind_shift 8
     112              : #define CFI_type_mask 0xFF
     113              : #define CFI_type_from_type_kind(t, k) (t + (k << CFI_type_kind_shift))
     114              : 
     115              : /* Constants, defined as macros. */
     116              : #define CFI_VERSION 1
     117              : #define CFI_MAX_RANK 15
     118              : 
     119              : /* Attributes. */
     120              : #define CFI_attribute_pointer 0
     121              : #define CFI_attribute_allocatable 1
     122              : #define CFI_attribute_other 2
     123              : 
     124              : #define CFI_type_mask 0xFF
     125              : #define CFI_type_kind_shift 8
     126              : 
     127              : /* Intrinsic types. Their kind number defines their storage size. */
     128              : #define CFI_type_Integer 1
     129              : #define CFI_type_Logical 2
     130              : #define CFI_type_Real 3
     131              : #define CFI_type_Complex 4
     132              : #define CFI_type_Character 5
     133              : 
     134              : /* Combined type (for more, see ISO_Fortran_binding.h).  */
     135              : #define CFI_type_ucs4_char (CFI_type_Character + (4 << CFI_type_kind_shift))
     136              : 
     137              : /* Types with no kind. */
     138              : #define CFI_type_struct 6
     139              : #define CFI_type_cptr 7
     140              : #define CFI_type_cfunptr 8
     141              : #define CFI_type_other -1
     142              : 
     143              : 
     144              : /*************************** Enums *****************************/
     145              : 
     146              : /* Used when matching and resolving data I/O transfer statements.  */
     147              : 
     148              : enum io_kind
     149              : { M_READ, M_WRITE, M_PRINT, M_INQUIRE };
     150              : 
     151              : 
     152              : /* These are flags for identifying whether we are reading a character literal
     153              :    between quotes or normal source code.  */
     154              : 
     155              : enum gfc_instring
     156              : { NONSTRING = 0, INSTRING_WARN, INSTRING_NOWARN };
     157              : 
     158              : /* This is returned by gfc_notification_std to know if, given the flags
     159              :    that were given (-std=, -pedantic) we should issue an error, a warning
     160              :    or nothing.  */
     161              : 
     162              : enum notification
     163              : { SILENT, WARNING, ERROR };
     164              : 
     165              : /* Matchers return one of these three values.  The difference between
     166              :    MATCH_NO and MATCH_ERROR is that MATCH_ERROR means that a match was
     167              :    successful, but that something non-syntactic is wrong and an error
     168              :    has already been issued.  */
     169              : 
     170              : enum match
     171              : { MATCH_NO = 1, MATCH_YES, MATCH_ERROR };
     172              : 
     173              : /* Used for different Fortran source forms in places like scanner.cc.  */
     174              : enum gfc_source_form
     175              : { FORM_FREE, FORM_FIXED, FORM_UNKNOWN };
     176              : 
     177              : /* Expression node types.  */
     178              : enum expr_t
     179              : {
     180              :   EXPR_UNKNOWN = 0,
     181              :   EXPR_OP = 1,
     182              :   EXPR_FUNCTION,
     183              :   EXPR_CONSTANT,
     184              :   EXPR_VARIABLE,
     185              :   EXPR_SUBSTRING,
     186              :   EXPR_STRUCTURE,
     187              :   EXPR_ARRAY,
     188              :   EXPR_NULL,
     189              :   EXPR_COMPCALL,
     190              :   EXPR_PPC,
     191              :   EXPR_CONDITIONAL,
     192              : };
     193              : 
     194              : /* Array types.  */
     195              : enum array_type
     196              : { AS_EXPLICIT = 1, AS_ASSUMED_SHAPE, AS_DEFERRED,
     197              :   AS_ASSUMED_SIZE, AS_IMPLIED_SHAPE, AS_ASSUMED_RANK,
     198              :   AS_UNKNOWN
     199              : };
     200              : 
     201              : enum ar_type
     202              : { AR_FULL = 1, AR_ELEMENT, AR_SECTION, AR_UNKNOWN };
     203              : 
     204              : /* Statement label types. ST_LABEL_DO_TARGET is used for obsolescent warnings
     205              :    related to shared DO terminations and DO targets which are neither END DO
     206              :    nor CONTINUE; otherwise it is identical to ST_LABEL_TARGET.  */
     207              : enum gfc_sl_type
     208              : { ST_LABEL_UNKNOWN = 1, ST_LABEL_TARGET, ST_LABEL_DO_TARGET,
     209              :   ST_LABEL_BAD_TARGET, ST_LABEL_FORMAT
     210              : };
     211              : 
     212              : /* Intrinsic operators.  */
     213              : enum gfc_intrinsic_op
     214              : { GFC_INTRINSIC_BEGIN = 0,
     215              :   INTRINSIC_NONE = -1, INTRINSIC_UPLUS = GFC_INTRINSIC_BEGIN,
     216              :   INTRINSIC_UMINUS, INTRINSIC_PLUS, INTRINSIC_MINUS, INTRINSIC_TIMES,
     217              :   INTRINSIC_DIVIDE, INTRINSIC_POWER, INTRINSIC_CONCAT,
     218              :   INTRINSIC_AND, INTRINSIC_OR, INTRINSIC_EQV, INTRINSIC_NEQV,
     219              :   /* ==, /=, >, >=, <, <=  */
     220              :   INTRINSIC_EQ, INTRINSIC_NE, INTRINSIC_GT, INTRINSIC_GE,
     221              :   INTRINSIC_LT, INTRINSIC_LE,
     222              :   /* .EQ., .NE., .GT., .GE., .LT., .LE. (OS = Old-Style)  */
     223              :   INTRINSIC_EQ_OS, INTRINSIC_NE_OS, INTRINSIC_GT_OS, INTRINSIC_GE_OS,
     224              :   INTRINSIC_LT_OS, INTRINSIC_LE_OS,
     225              :   INTRINSIC_NOT, INTRINSIC_USER, INTRINSIC_ASSIGN, INTRINSIC_PARENTHESES,
     226              :   GFC_INTRINSIC_END, /* Sentinel */
     227              :   /* User defined derived type pseudo operators. These are set beyond the
     228              :      sentinel so that they are excluded from module_read and module_write.  */
     229              :   INTRINSIC_FORMATTED, INTRINSIC_UNFORMATTED
     230              : };
     231              : 
     232              : /* This macro is the number of intrinsic operators that exist.
     233              :    Assumptions are made about the numbering of the interface_op enums.  */
     234              : #define GFC_INTRINSIC_OPS GFC_INTRINSIC_END
     235              : 
     236              : /* Arithmetic results.  ARITH_NOT_REDUCED is used to keep track of expressions
     237              :    that were not reduced by the arithmetic evaluation code.  */
     238              : enum arith
     239              : { ARITH_OK = 1, ARITH_OVERFLOW, ARITH_UNDERFLOW, ARITH_NAN,
     240              :   ARITH_DIV0, ARITH_INCOMMENSURATE, ARITH_ASYMMETRIC, ARITH_PROHIBIT,
     241              :   ARITH_WRONGCONCAT, ARITH_INVALID_TYPE, ARITH_NOT_REDUCED,
     242              :   ARITH_UNSIGNED_TRUNCATED, ARITH_UNSIGNED_NEGATIVE
     243              : };
     244              : 
     245              : /* Statements.  */
     246              : enum gfc_statement
     247              : {
     248              :   ST_ARITHMETIC_IF, ST_ALLOCATE, ST_ATTR_DECL, ST_ASSOCIATE,
     249              :   ST_BACKSPACE, ST_BLOCK, ST_BLOCK_DATA,
     250              :   ST_CALL, ST_CASE, ST_CLOSE, ST_COMMON, ST_CONTINUE, ST_CONTAINS, ST_CYCLE,
     251              :   ST_DATA, ST_DATA_DECL, ST_DEALLOCATE, ST_DO, ST_ELSE, ST_ELSEIF,
     252              :   ST_ELSEWHERE, ST_END_ASSOCIATE, ST_END_BLOCK, ST_END_BLOCK_DATA,
     253              :   ST_ENDDO, ST_IMPLIED_ENDDO, ST_END_FILE, ST_FINAL, ST_FLUSH, ST_END_FORALL,
     254              :   ST_END_FUNCTION, ST_ENDIF, ST_END_INTERFACE, ST_END_MODULE, ST_END_SUBMODULE,
     255              :   ST_END_PROGRAM, ST_END_SELECT, ST_END_SUBROUTINE, ST_END_WHERE, ST_END_TYPE,
     256              :   ST_ENTRY, ST_EQUIVALENCE, ST_ERROR_STOP, ST_EXIT, ST_FORALL, ST_FORALL_BLOCK,
     257              :   ST_FORMAT, ST_FUNCTION, ST_GOTO, ST_IF_BLOCK, ST_IMPLICIT, ST_IMPLICIT_NONE,
     258              :   ST_IMPORT, ST_INQUIRE, ST_INTERFACE, ST_SYNC_ALL, ST_SYNC_MEMORY,
     259              :   ST_SYNC_IMAGES, ST_PARAMETER, ST_MODULE, ST_SUBMODULE, ST_MODULE_PROC,
     260              :   ST_NAMELIST, ST_NULLIFY, ST_OPEN, ST_PAUSE, ST_PRIVATE, ST_PROGRAM, ST_PUBLIC,
     261              :   ST_READ, ST_RETURN, ST_REWIND, ST_STOP, ST_SUBROUTINE, ST_TYPE, ST_USE,
     262              :   ST_WHERE_BLOCK, ST_WHERE, ST_WAIT, ST_WRITE, ST_ASSIGNMENT,
     263              :   ST_POINTER_ASSIGNMENT, ST_SELECT_CASE, ST_SEQUENCE, ST_SIMPLE_IF,
     264              :   ST_STATEMENT_FUNCTION, ST_DERIVED_DECL, ST_LABEL_ASSIGNMENT, ST_ENUM,
     265              :   ST_ENUMERATOR, ST_END_ENUM, ST_SELECT_TYPE, ST_TYPE_IS, ST_CLASS_IS,
     266              :   ST_SELECT_RANK, ST_RANK, ST_STRUCTURE_DECL, ST_END_STRUCTURE,
     267              :   ST_UNION, ST_END_UNION, ST_MAP, ST_END_MAP,
     268              :   ST_OACC_PARALLEL_LOOP, ST_OACC_END_PARALLEL_LOOP, ST_OACC_PARALLEL,
     269              :   ST_OACC_END_PARALLEL, ST_OACC_KERNELS, ST_OACC_END_KERNELS, ST_OACC_DATA,
     270              :   ST_OACC_END_DATA, ST_OACC_HOST_DATA, ST_OACC_END_HOST_DATA, ST_OACC_LOOP,
     271              :   ST_OACC_END_LOOP, ST_OACC_DECLARE, ST_OACC_UPDATE, ST_OACC_WAIT,
     272              :   ST_OACC_CACHE, ST_OACC_KERNELS_LOOP, ST_OACC_END_KERNELS_LOOP,
     273              :   ST_OACC_SERIAL_LOOP, ST_OACC_END_SERIAL_LOOP, ST_OACC_SERIAL,
     274              :   ST_OACC_END_SERIAL, ST_OACC_ENTER_DATA, ST_OACC_EXIT_DATA, ST_OACC_ROUTINE,
     275              :   ST_OACC_ATOMIC, ST_OACC_END_ATOMIC,
     276              :   ST_OACC_INIT, ST_OACC_SHUTDOWN, ST_OACC_SET,
     277              :   ST_OMP_ATOMIC, ST_OMP_BARRIER, ST_OMP_CRITICAL, ST_OMP_END_ATOMIC,
     278              :   ST_OMP_END_CRITICAL, ST_OMP_END_DO, ST_OMP_END_MASTER, ST_OMP_END_ORDERED,
     279              :   ST_OMP_END_PARALLEL, ST_OMP_END_PARALLEL_DO, ST_OMP_END_PARALLEL_SECTIONS,
     280              :   ST_OMP_END_PARALLEL_WORKSHARE, ST_OMP_END_SECTIONS, ST_OMP_END_SINGLE,
     281              :   ST_OMP_END_WORKSHARE, ST_OMP_DO, ST_OMP_FLUSH, ST_OMP_MASTER, ST_OMP_ORDERED,
     282              :   ST_OMP_PARALLEL, ST_OMP_PARALLEL_DO, ST_OMP_PARALLEL_SECTIONS,
     283              :   ST_OMP_PARALLEL_WORKSHARE, ST_OMP_SECTIONS, ST_OMP_SECTION, ST_OMP_SINGLE,
     284              :   ST_OMP_THREADPRIVATE, ST_OMP_WORKSHARE, ST_OMP_TASK, ST_OMP_END_TASK,
     285              :   ST_OMP_TASKWAIT, ST_OMP_TASKYIELD, ST_OMP_CANCEL, ST_OMP_CANCELLATION_POINT,
     286              :   ST_OMP_TASKGROUP, ST_OMP_END_TASKGROUP, ST_OMP_SIMD, ST_OMP_END_SIMD,
     287              :   ST_OMP_DO_SIMD, ST_OMP_END_DO_SIMD, ST_OMP_PARALLEL_DO_SIMD,
     288              :   ST_OMP_END_PARALLEL_DO_SIMD, ST_OMP_DECLARE_SIMD, ST_OMP_DECLARE_MAPPER,
     289              :   ST_OMP_DECLARE_REDUCTION, ST_OMP_TARGET, ST_OMP_END_TARGET,
     290              :   ST_OMP_TARGET_DATA, ST_OMP_END_TARGET_DATA,
     291              :   ST_OMP_TARGET_UPDATE, ST_OMP_DECLARE_TARGET, ST_OMP_DECLARE_VARIANT,
     292              :   ST_OMP_TEAMS, ST_OMP_END_TEAMS, ST_OMP_DISTRIBUTE, ST_OMP_END_DISTRIBUTE,
     293              :   ST_OMP_DISTRIBUTE_SIMD, ST_OMP_END_DISTRIBUTE_SIMD,
     294              :   ST_OMP_DISTRIBUTE_PARALLEL_DO, ST_OMP_END_DISTRIBUTE_PARALLEL_DO,
     295              :   ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD, ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD,
     296              :   ST_OMP_TARGET_TEAMS, ST_OMP_END_TARGET_TEAMS, ST_OMP_TEAMS_DISTRIBUTE,
     297              :   ST_OMP_END_TEAMS_DISTRIBUTE, ST_OMP_TEAMS_DISTRIBUTE_SIMD,
     298              :   ST_OMP_END_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TARGET_TEAMS_DISTRIBUTE,
     299              :   ST_OMP_END_TARGET_TEAMS_DISTRIBUTE, ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
     300              :   ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
     301              :   ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO,
     302              :   ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
     303              :   ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
     304              :   ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
     305              :   ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
     306              :   ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
     307              :   ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
     308              :   ST_OMP_TARGET_PARALLEL, ST_OMP_END_TARGET_PARALLEL,
     309              :   ST_OMP_TARGET_PARALLEL_DO, ST_OMP_END_TARGET_PARALLEL_DO,
     310              :   ST_OMP_TARGET_PARALLEL_DO_SIMD, ST_OMP_END_TARGET_PARALLEL_DO_SIMD,
     311              :   ST_OMP_TARGET_ENTER_DATA, ST_OMP_TARGET_EXIT_DATA,
     312              :   ST_OMP_TARGET_SIMD, ST_OMP_END_TARGET_SIMD,
     313              :   ST_OMP_TASKLOOP, ST_OMP_END_TASKLOOP, ST_OMP_SCAN, ST_OMP_DEPOBJ,
     314              :   ST_OMP_TASKLOOP_SIMD, ST_OMP_END_TASKLOOP_SIMD, ST_OMP_ORDERED_DEPEND,
     315              :   ST_OMP_REQUIRES, ST_PROCEDURE, ST_GENERIC, ST_CRITICAL, ST_END_CRITICAL,
     316              :   ST_OMP_GROUPPRIVATE,
     317              :   ST_GET_FCN_CHARACTERISTICS, ST_LOCK, ST_UNLOCK, ST_EVENT_POST,
     318              :   ST_EVENT_WAIT, ST_FAIL_IMAGE, ST_FORM_TEAM, ST_CHANGE_TEAM,
     319              :   ST_END_TEAM, ST_SYNC_TEAM,  ST_OMP_PARALLEL_MASTER,
     320              :   ST_OMP_END_PARALLEL_MASTER, ST_OMP_PARALLEL_MASTER_TASKLOOP,
     321              :   ST_OMP_END_PARALLEL_MASTER_TASKLOOP, ST_OMP_PARALLEL_MASTER_TASKLOOP_SIMD,
     322              :   ST_OMP_END_PARALLEL_MASTER_TASKLOOP_SIMD, ST_OMP_MASTER_TASKLOOP,
     323              :   ST_OMP_END_MASTER_TASKLOOP, ST_OMP_MASTER_TASKLOOP_SIMD,
     324              :   ST_OMP_END_MASTER_TASKLOOP_SIMD, ST_OMP_LOOP, ST_OMP_END_LOOP,
     325              :   ST_OMP_PARALLEL_LOOP, ST_OMP_END_PARALLEL_LOOP, ST_OMP_TEAMS_LOOP,
     326              :   ST_OMP_END_TEAMS_LOOP, ST_OMP_TARGET_PARALLEL_LOOP,
     327              :   ST_OMP_END_TARGET_PARALLEL_LOOP, ST_OMP_TARGET_TEAMS_LOOP,
     328              :   ST_OMP_END_TARGET_TEAMS_LOOP, ST_OMP_MASKED, ST_OMP_END_MASKED,
     329              :   ST_OMP_PARALLEL_MASKED, ST_OMP_END_PARALLEL_MASKED,
     330              :   ST_OMP_PARALLEL_MASKED_TASKLOOP, ST_OMP_END_PARALLEL_MASKED_TASKLOOP,
     331              :   ST_OMP_PARALLEL_MASKED_TASKLOOP_SIMD,
     332              :   ST_OMP_END_PARALLEL_MASKED_TASKLOOP_SIMD, ST_OMP_MASKED_TASKLOOP,
     333              :   ST_OMP_END_MASKED_TASKLOOP, ST_OMP_MASKED_TASKLOOP_SIMD,
     334              :   ST_OMP_END_MASKED_TASKLOOP_SIMD, ST_OMP_SCOPE, ST_OMP_END_SCOPE,
     335              :   ST_OMP_METADIRECTIVE, ST_OMP_BEGIN_METADIRECTIVE, ST_OMP_END_METADIRECTIVE,
     336              :   ST_OMP_ERROR, ST_OMP_ASSUME, ST_OMP_END_ASSUME, ST_OMP_ASSUMES,
     337              :   ST_OMP_ALLOCATE, ST_OMP_ALLOCATE_EXEC,
     338              :   ST_OMP_ALLOCATORS, ST_OMP_END_ALLOCATORS,
     339              :   /* Note: gfc_match_omp_nothing returns ST_NONE. */
     340              :   ST_OMP_NOTHING, ST_NONE,
     341              :   ST_OMP_UNROLL, ST_OMP_END_UNROLL,
     342              :   ST_OMP_TILE, ST_OMP_END_TILE, ST_OMP_INTEROP, ST_OMP_DISPATCH,
     343              :   ST_OMP_END_DISPATCH
     344              : };
     345              : 
     346              : /* Types of interfaces that we can have.  Assignment interfaces are
     347              :    considered to be intrinsic operators.  */
     348              : enum interface_type
     349              : {
     350              :   INTERFACE_NAMELESS = 1, INTERFACE_GENERIC,
     351              :   INTERFACE_INTRINSIC_OP, INTERFACE_USER_OP, INTERFACE_ABSTRACT,
     352              :   INTERFACE_DTIO
     353              : };
     354              : 
     355              : /* Symbol flavors: these are all mutually exclusive.
     356              :    12 elements = 4 bits.  */
     357              : enum sym_flavor
     358              : {
     359              :   FL_UNKNOWN = 0, FL_PROGRAM, FL_BLOCK_DATA, FL_MODULE, FL_VARIABLE,
     360              :   FL_PARAMETER, FL_LABEL, FL_PROCEDURE, FL_DERIVED, FL_NAMELIST,
     361              :   FL_UNION, FL_STRUCT, FL_VOID
     362              : };
     363              : 
     364              : /* Procedure types.  7 elements = 3 bits.  */
     365              : enum procedure_type
     366              : { PROC_UNKNOWN, PROC_MODULE, PROC_INTERNAL, PROC_DUMMY,
     367              :   PROC_INTRINSIC, PROC_ST_FUNCTION, PROC_EXTERNAL
     368              : };
     369              : 
     370              : /* Intent types. Note that these values are also used in another enum in
     371              :    decl.cc (match_attr_spec).  */
     372              : enum sym_intent
     373              : { INTENT_UNKNOWN = 0, INTENT_IN, INTENT_OUT, INTENT_INOUT
     374              : };
     375              : 
     376              : /* Access types.  */
     377              : enum gfc_access
     378              : { ACCESS_UNKNOWN = 0, ACCESS_PUBLIC, ACCESS_PRIVATE
     379              : };
     380              : 
     381              : /* Flags to keep track of where an interface came from.
     382              :    3 elements = 2 bits.  */
     383              : enum ifsrc
     384              : { IFSRC_UNKNOWN = 0,    /* Interface unknown, only return type may be known.  */
     385              :   IFSRC_DECL,           /* FUNCTION or SUBROUTINE declaration.  */
     386              :   IFSRC_IFBODY          /* INTERFACE statement or PROCEDURE statement
     387              :                            with explicit interface.  */
     388              : };
     389              : 
     390              : /* Whether a SAVE attribute was set explicitly or implicitly.  */
     391              : enum save_state
     392              : { SAVE_NONE = 0, SAVE_EXPLICIT, SAVE_IMPLICIT
     393              : };
     394              : 
     395              : /* OpenACC 'routine' directive's level of parallelism.  */
     396              : enum oacc_routine_lop
     397              : { OACC_ROUTINE_LOP_NONE = 0,
     398              :   OACC_ROUTINE_LOP_GANG,
     399              :   OACC_ROUTINE_LOP_WORKER,
     400              :   OACC_ROUTINE_LOP_VECTOR,
     401              :   OACC_ROUTINE_LOP_SEQ,
     402              :   OACC_ROUTINE_LOP_ERROR
     403              : };
     404              : 
     405              : /* How a variable gets its value.  Ordering is significant.  */
     406              : 
     407              : enum value_set
     408              : { VALUE_UNSET = 0,
     409              :   VALUE_INTENT_OUT,
     410              :   VALUE_ARG,
     411              :   VALUE_READ,
     412              :   VALUE_VARDEF
     413              : };
     414              : 
     415              : /* How a variable's value is used.  */
     416              : enum value_used
     417              : {
     418              :   VALUE_UNUSED = 0,
     419              :   VALUE_MAYBE_USED,
     420              :   VALUE_INTENT_IN,
     421              :   VALUE_VALUE_ARG,
     422              :   VALUE_USED
     423              : };
     424              : 
     425              : /* How a variable is allocated.  */
     426              : enum var_allocated
     427              : {
     428              :   ALLOCATED_NEVER = 0,
     429              :   ALLOCATED_ARG,
     430              :   ALLOCATED_ALLOCATE_STMT,
     431              :   ALLOCATED_ASSIGNMENT
     432              : };
     433              : 
     434              : /* Strings for all symbol attributes.  We use these for dumping the
     435              :    parse tree, in error messages, and also when reading and writing
     436              :    modules.  In symbol.cc.  */
     437              : extern const mstring flavors[];
     438              : extern const mstring procedures[];
     439              : extern const mstring intents[];
     440              : extern const mstring access_types[];
     441              : extern const mstring ifsrc_types[];
     442              : extern const mstring save_status[];
     443              : 
     444              : /* Strings for DTIO procedure names.  In symbol.cc.  */
     445              : extern const mstring dtio_procs[];
     446              : 
     447              : enum dtio_codes
     448              : { DTIO_RF = 0, DTIO_WF, DTIO_RUF, DTIO_WUF };
     449              : 
     450              : /* Enumeration of all the generic intrinsic functions.  Used by the
     451              :    backend for identification of a function.  */
     452              : 
     453              : enum gfc_isym_id
     454              : {
     455              :   /* GFC_ISYM_NONE is used for intrinsics which will never be seen by
     456              :      the backend (e.g. KIND).  */
     457              :   GFC_ISYM_NONE = 0,
     458              :   GFC_ISYM_ABORT,
     459              :   GFC_ISYM_ABS,
     460              :   GFC_ISYM_ACCESS,
     461              :   GFC_ISYM_ACHAR,
     462              :   GFC_ISYM_ACOS,
     463              :   GFC_ISYM_ACOSD,
     464              :   GFC_ISYM_ACOSH,
     465              :   GFC_ISYM_ADJUSTL,
     466              :   GFC_ISYM_ADJUSTR,
     467              :   GFC_ISYM_AIMAG,
     468              :   GFC_ISYM_AINT,
     469              :   GFC_ISYM_ALARM,
     470              :   GFC_ISYM_ALL,
     471              :   GFC_ISYM_ALLOCATED,
     472              :   GFC_ISYM_AND,
     473              :   GFC_ISYM_ANINT,
     474              :   GFC_ISYM_ANY,
     475              :   GFC_ISYM_ASIN,
     476              :   GFC_ISYM_ASIND,
     477              :   GFC_ISYM_ASINH,
     478              :   GFC_ISYM_ASSOCIATED,
     479              :   GFC_ISYM_ATAN,
     480              :   GFC_ISYM_ATAN2,
     481              :   GFC_ISYM_ATAN2D,
     482              :   GFC_ISYM_ATAND,
     483              :   GFC_ISYM_ATANH,
     484              :   GFC_ISYM_ATOMIC_ADD,
     485              :   GFC_ISYM_ATOMIC_AND,
     486              :   GFC_ISYM_ATOMIC_CAS,
     487              :   GFC_ISYM_ATOMIC_DEF,
     488              :   GFC_ISYM_ATOMIC_FETCH_ADD,
     489              :   GFC_ISYM_ATOMIC_FETCH_AND,
     490              :   GFC_ISYM_ATOMIC_FETCH_OR,
     491              :   GFC_ISYM_ATOMIC_FETCH_XOR,
     492              :   GFC_ISYM_ATOMIC_OR,
     493              :   GFC_ISYM_ATOMIC_REF,
     494              :   GFC_ISYM_ATOMIC_XOR,
     495              :   GFC_ISYM_BGE,
     496              :   GFC_ISYM_BGT,
     497              :   GFC_ISYM_BIT_SIZE,
     498              :   GFC_ISYM_BLE,
     499              :   GFC_ISYM_BLT,
     500              :   GFC_ISYM_BTEST,
     501              :   GFC_ISYM_CAF_GET,
     502              :   GFC_ISYM_CAF_IS_PRESENT_ON_REMOTE,
     503              :   GFC_ISYM_CAF_SEND,
     504              :   GFC_ISYM_CAF_SENDGET,
     505              :   GFC_ISYM_CEILING,
     506              :   GFC_ISYM_CHAR,
     507              :   GFC_ISYM_CHDIR,
     508              :   GFC_ISYM_CHMOD,
     509              :   GFC_ISYM_CMPLX,
     510              :   GFC_ISYM_CO_BROADCAST,
     511              :   GFC_ISYM_CO_MAX,
     512              :   GFC_ISYM_CO_MIN,
     513              :   GFC_ISYM_CO_REDUCE,
     514              :   GFC_ISYM_CO_SUM,
     515              :   GFC_ISYM_COMMAND_ARGUMENT_COUNT,
     516              :   GFC_ISYM_COMPILER_OPTIONS,
     517              :   GFC_ISYM_COMPILER_VERSION,
     518              :   GFC_ISYM_COMPLEX,
     519              :   GFC_ISYM_CONJG,
     520              :   GFC_ISYM_CONVERSION,
     521              :   GFC_ISYM_COS,
     522              :   GFC_ISYM_COSD,
     523              :   GFC_ISYM_COSH,
     524              :   GFC_ISYM_COSHAPE,
     525              :   GFC_ISYM_COTAN,
     526              :   GFC_ISYM_COTAND,
     527              :   GFC_ISYM_COUNT,
     528              :   GFC_ISYM_CPU_TIME,
     529              :   GFC_ISYM_CSHIFT,
     530              :   GFC_ISYM_CTIME,
     531              :   GFC_ISYM_C_ASSOCIATED,
     532              :   GFC_ISYM_C_F_POINTER,
     533              :   GFC_ISYM_C_F_PROCPOINTER,
     534              :   GFC_ISYM_C_F_STRPOINTER,
     535              :   GFC_ISYM_C_FUNLOC,
     536              :   GFC_ISYM_C_LOC,
     537              :   GFC_ISYM_C_SIZEOF,
     538              :   GFC_ISYM_DATE_AND_TIME,
     539              :   GFC_ISYM_DBLE,
     540              :   GFC_ISYM_DFLOAT,
     541              :   GFC_ISYM_DIGITS,
     542              :   GFC_ISYM_DIM,
     543              :   GFC_ISYM_DOT_PRODUCT,
     544              :   GFC_ISYM_DPROD,
     545              :   GFC_ISYM_DSHIFTL,
     546              :   GFC_ISYM_DSHIFTR,
     547              :   GFC_ISYM_DTIME,
     548              :   GFC_ISYM_EOSHIFT,
     549              :   GFC_ISYM_EPSILON,
     550              :   GFC_ISYM_ERF,
     551              :   GFC_ISYM_ERFC,
     552              :   GFC_ISYM_ERFC_SCALED,
     553              :   GFC_ISYM_ETIME,
     554              :   GFC_ISYM_EVENT_QUERY,
     555              :   GFC_ISYM_EXECUTE_COMMAND_LINE,
     556              :   GFC_ISYM_EXIT,
     557              :   GFC_ISYM_EXP,
     558              :   GFC_ISYM_EXPONENT,
     559              :   GFC_ISYM_EXTENDS_TYPE_OF,
     560              :   GFC_ISYM_F_C_STRING,
     561              :   GFC_ISYM_FAILED_IMAGES,
     562              :   GFC_ISYM_FDATE,
     563              :   GFC_ISYM_FE_RUNTIME_ERROR,
     564              :   GFC_ISYM_FGET,
     565              :   GFC_ISYM_FGETC,
     566              :   GFC_ISYM_FINDLOC,
     567              :   GFC_ISYM_FLOAT,
     568              :   GFC_ISYM_FLOOR,
     569              :   GFC_ISYM_FLUSH,
     570              :   GFC_ISYM_FNUM,
     571              :   GFC_ISYM_FPUT,
     572              :   GFC_ISYM_FPUTC,
     573              :   GFC_ISYM_FRACTION,
     574              :   GFC_ISYM_FREE,
     575              :   GFC_ISYM_FSEEK,
     576              :   GFC_ISYM_FSTAT,
     577              :   GFC_ISYM_FTELL,
     578              :   GFC_ISYM_TGAMMA,
     579              :   GFC_ISYM_GERROR,
     580              :   GFC_ISYM_GETARG,
     581              :   GFC_ISYM_GET_COMMAND,
     582              :   GFC_ISYM_GET_COMMAND_ARGUMENT,
     583              :   GFC_ISYM_GETCWD,
     584              :   GFC_ISYM_GETENV,
     585              :   GFC_ISYM_GET_ENVIRONMENT_VARIABLE,
     586              :   GFC_ISYM_GETGID,
     587              :   GFC_ISYM_GETLOG,
     588              :   GFC_ISYM_GETPID,
     589              :   GFC_ISYM_GET_TEAM,
     590              :   GFC_ISYM_GETUID,
     591              :   GFC_ISYM_GMTIME,
     592              :   GFC_ISYM_HOSTNM,
     593              :   GFC_ISYM_HUGE,
     594              :   GFC_ISYM_HYPOT,
     595              :   GFC_ISYM_IACHAR,
     596              :   GFC_ISYM_IALL,
     597              :   GFC_ISYM_IAND,
     598              :   GFC_ISYM_IANY,
     599              :   GFC_ISYM_IARGC,
     600              :   GFC_ISYM_IBCLR,
     601              :   GFC_ISYM_IBITS,
     602              :   GFC_ISYM_IBSET,
     603              :   GFC_ISYM_ICHAR,
     604              :   GFC_ISYM_IDATE,
     605              :   GFC_ISYM_IEOR,
     606              :   GFC_ISYM_IERRNO,
     607              :   GFC_ISYM_IMAGE_INDEX,
     608              :   GFC_ISYM_IMAGE_STATUS,
     609              :   GFC_ISYM_INDEX,
     610              :   GFC_ISYM_INT,
     611              :   GFC_ISYM_INT2,
     612              :   GFC_ISYM_INT8,
     613              :   GFC_ISYM_IOR,
     614              :   GFC_ISYM_IPARITY,
     615              :   GFC_ISYM_IRAND,
     616              :   GFC_ISYM_ISATTY,
     617              :   GFC_ISYM_IS_CONTIGUOUS,
     618              :   GFC_ISYM_IS_IOSTAT_END,
     619              :   GFC_ISYM_IS_IOSTAT_EOR,
     620              :   GFC_ISYM_ISNAN,
     621              :   GFC_ISYM_ISHFT,
     622              :   GFC_ISYM_ISHFTC,
     623              :   GFC_ISYM_ITIME,
     624              :   GFC_ISYM_J0,
     625              :   GFC_ISYM_J1,
     626              :   GFC_ISYM_JN,
     627              :   GFC_ISYM_JN2,
     628              :   GFC_ISYM_KILL,
     629              :   GFC_ISYM_KIND,
     630              :   GFC_ISYM_LBOUND,
     631              :   GFC_ISYM_LCOBOUND,
     632              :   GFC_ISYM_LEADZ,
     633              :   GFC_ISYM_LEN,
     634              :   GFC_ISYM_LEN_TRIM,
     635              :   GFC_ISYM_LGAMMA,
     636              :   GFC_ISYM_LGE,
     637              :   GFC_ISYM_LGT,
     638              :   GFC_ISYM_LINK,
     639              :   GFC_ISYM_LLE,
     640              :   GFC_ISYM_LLT,
     641              :   GFC_ISYM_LOC,
     642              :   GFC_ISYM_LOG,
     643              :   GFC_ISYM_LOG10,
     644              :   GFC_ISYM_LOGICAL,
     645              :   GFC_ISYM_LONG,
     646              :   GFC_ISYM_LSHIFT,
     647              :   GFC_ISYM_LSTAT,
     648              :   GFC_ISYM_LTIME,
     649              :   GFC_ISYM_MALLOC,
     650              :   GFC_ISYM_MASKL,
     651              :   GFC_ISYM_MASKR,
     652              :   GFC_ISYM_MATMUL,
     653              :   GFC_ISYM_MAX,
     654              :   GFC_ISYM_MAXEXPONENT,
     655              :   GFC_ISYM_MAXLOC,
     656              :   GFC_ISYM_MAXVAL,
     657              :   GFC_ISYM_MCLOCK,
     658              :   GFC_ISYM_MCLOCK8,
     659              :   GFC_ISYM_MERGE,
     660              :   GFC_ISYM_MERGE_BITS,
     661              :   GFC_ISYM_MIN,
     662              :   GFC_ISYM_MINEXPONENT,
     663              :   GFC_ISYM_MINLOC,
     664              :   GFC_ISYM_MINVAL,
     665              :   GFC_ISYM_MOD,
     666              :   GFC_ISYM_MODULO,
     667              :   GFC_ISYM_MOVE_ALLOC,
     668              :   GFC_ISYM_MVBITS,
     669              :   GFC_ISYM_NEAREST,
     670              :   GFC_ISYM_NEW_LINE,
     671              :   GFC_ISYM_NINT,
     672              :   GFC_ISYM_NORM2,
     673              :   GFC_ISYM_NOT,
     674              :   GFC_ISYM_NULL,
     675              :   GFC_ISYM_NUM_IMAGES,
     676              :   GFC_ISYM_OR,
     677              :   GFC_ISYM_OUT_OF_RANGE,
     678              :   GFC_ISYM_PACK,
     679              :   GFC_ISYM_PARITY,
     680              :   GFC_ISYM_PERROR,
     681              :   GFC_ISYM_POPCNT,
     682              :   GFC_ISYM_POPPAR,
     683              :   GFC_ISYM_PRECISION,
     684              :   GFC_ISYM_PRESENT,
     685              :   GFC_ISYM_PRODUCT,
     686              :   GFC_ISYM_RADIX,
     687              :   GFC_ISYM_RAND,
     688              :   GFC_ISYM_RANDOM_INIT,
     689              :   GFC_ISYM_RANDOM_NUMBER,
     690              :   GFC_ISYM_RANDOM_SEED,
     691              :   GFC_ISYM_RANGE,
     692              :   GFC_ISYM_RANK,
     693              :   GFC_ISYM_REAL,
     694              :   GFC_ISYM_REALPART,
     695              :   GFC_ISYM_REDUCE,
     696              :   GFC_ISYM_RENAME,
     697              :   GFC_ISYM_REPEAT,
     698              :   GFC_ISYM_RESHAPE,
     699              :   GFC_ISYM_RRSPACING,
     700              :   GFC_ISYM_RSHIFT,
     701              :   GFC_ISYM_SAME_TYPE_AS,
     702              :   GFC_ISYM_SC_KIND,
     703              :   GFC_ISYM_SCALE,
     704              :   GFC_ISYM_SCAN,
     705              :   GFC_ISYM_SECNDS,
     706              :   GFC_ISYM_SECOND,
     707              :   GFC_ISYM_SET_EXPONENT,
     708              :   GFC_ISYM_SHAPE,
     709              :   GFC_ISYM_SHIFTA,
     710              :   GFC_ISYM_SHIFTL,
     711              :   GFC_ISYM_SHIFTR,
     712              :   GFC_ISYM_BACKTRACE,
     713              :   GFC_ISYM_SIGN,
     714              :   GFC_ISYM_SIGNAL,
     715              :   GFC_ISYM_SI_KIND,
     716              :   GFC_ISYM_SIN,
     717              :   GFC_ISYM_SIND,
     718              :   GFC_ISYM_SINH,
     719              :   GFC_ISYM_SIZE,
     720              :   GFC_ISYM_SL_KIND,
     721              :   GFC_ISYM_SLEEP,
     722              :   GFC_ISYM_SIZEOF,
     723              :   GFC_ISYM_SNGL,
     724              :   GFC_ISYM_SPACING,
     725              :   GFC_ISYM_SPREAD,
     726              :   GFC_ISYM_SQRT,
     727              :   GFC_ISYM_SRAND,
     728              :   GFC_ISYM_SR_KIND,
     729              :   GFC_ISYM_STAT,
     730              :   GFC_ISYM_STOPPED_IMAGES,
     731              :   GFC_ISYM_STORAGE_SIZE,
     732              :   GFC_ISYM_STRIDE,
     733              :   GFC_ISYM_SUM,
     734              :   GFC_ISYM_SYMLINK,
     735              :   GFC_ISYM_SYMLNK,
     736              :   GFC_ISYM_SYSTEM,
     737              :   GFC_ISYM_SYSTEM_CLOCK,
     738              :   GFC_ISYM_TAN,
     739              :   GFC_ISYM_TAND,
     740              :   GFC_ISYM_TANH,
     741              :   GFC_ISYM_TEAM_NUMBER,
     742              :   GFC_ISYM_THIS_IMAGE,
     743              :   GFC_ISYM_TIME,
     744              :   GFC_ISYM_TIME8,
     745              :   GFC_ISYM_TINY,
     746              :   GFC_ISYM_TRAILZ,
     747              :   GFC_ISYM_TRANSFER,
     748              :   GFC_ISYM_TRANSPOSE,
     749              :   GFC_ISYM_TRIM,
     750              :   GFC_ISYM_TTYNAM,
     751              :   GFC_ISYM_UBOUND,
     752              :   GFC_ISYM_UCOBOUND,
     753              :   GFC_ISYM_UMASK,
     754              :   GFC_ISYM_UMASKL,
     755              :   GFC_ISYM_UMASKR,
     756              :   GFC_ISYM_UNLINK,
     757              :   GFC_ISYM_UNPACK,
     758              :   GFC_ISYM_VERIFY,
     759              :   GFC_ISYM_XOR,
     760              :   GFC_ISYM_Y0,
     761              :   GFC_ISYM_Y1,
     762              :   GFC_ISYM_YN,
     763              :   GFC_ISYM_YN2,
     764              : 
     765              :   /* Add this at the end, so maybe the module format
     766              :      remains compatible.  */
     767              :   GFC_ISYM_SU_KIND,
     768              :   GFC_ISYM_UINT,
     769              : 
     770              :   GFC_ISYM_ACOSPI,
     771              :   GFC_ISYM_ASINPI,
     772              :   GFC_ISYM_ATANPI,
     773              :   GFC_ISYM_ATAN2PI,
     774              :   GFC_ISYM_COSPI,
     775              :   GFC_ISYM_SINPI,
     776              :   GFC_ISYM_TANPI,
     777              : 
     778              :   GFC_ISYM_SPLIT,
     779              : };
     780              : 
     781              : enum init_local_logical
     782              : {
     783              :   GFC_INIT_LOGICAL_OFF = 0,
     784              :   GFC_INIT_LOGICAL_FALSE,
     785              :   GFC_INIT_LOGICAL_TRUE
     786              : };
     787              : 
     788              : enum init_local_character
     789              : {
     790              :   GFC_INIT_CHARACTER_OFF = 0,
     791              :   GFC_INIT_CHARACTER_ON
     792              : };
     793              : 
     794              : enum init_local_integer
     795              : {
     796              :   GFC_INIT_INTEGER_OFF = 0,
     797              :   GFC_INIT_INTEGER_ON
     798              : };
     799              : 
     800              : enum gfc_reverse
     801              : {
     802              :   GFC_ENABLE_REVERSE,
     803              :   GFC_FORWARD_SET,
     804              :   GFC_REVERSE_SET,
     805              :   GFC_INHIBIT_REVERSE
     806              : };
     807              : 
     808              : enum gfc_param_spec_type
     809              : {
     810              :   SPEC_EXPLICIT,
     811              :   SPEC_ASSUMED,
     812              :   SPEC_DEFERRED
     813              : };
     814              : 
     815              : /************************* Structures *****************************/
     816              : 
     817              : /* Used for keeping things in balanced binary trees.  */
     818              : #define BBT_HEADER(self) int priority; struct self *left, *right
     819              : 
     820              : #define NAMED_INTCST(a,b,c,d) a,
     821              : #define NAMED_UINTCST(a,b,c,d) a,
     822              : #define NAMED_KINDARRAY(a,b,c,d) a,
     823              : #define NAMED_FUNCTION(a,b,c,d) a,
     824              : #define NAMED_SUBROUTINE(a,b,c,d) a,
     825              : #define NAMED_DERIVED_TYPE(a,b,c,d) a,
     826              : enum iso_fortran_env_symbol
     827              : {
     828              :   ISOFORTRANENV_INVALID = -1,
     829              : #include "iso-fortran-env.def"
     830              :   ISOFORTRANENV_LAST, ISOFORTRANENV_NUMBER = ISOFORTRANENV_LAST
     831              : };
     832              : #undef NAMED_INTCST
     833              : #undef NANED_UINTCST
     834              : #undef NAMED_KINDARRAY
     835              : #undef NAMED_FUNCTION
     836              : #undef NAMED_SUBROUTINE
     837              : #undef NAMED_DERIVED_TYPE
     838              : 
     839              : #define NAMED_INTCST(a,b,c,d) a,
     840              : #define NAMED_REALCST(a,b,c,d) a,
     841              : #define NAMED_CMPXCST(a,b,c,d) a,
     842              : #define NAMED_LOGCST(a,b,c) a,
     843              : #define NAMED_CHARKNDCST(a,b,c) a,
     844              : #define NAMED_CHARCST(a,b,c) a,
     845              : #define DERIVED_TYPE(a,b,c) a,
     846              : #define NAMED_FUNCTION(a,b,c,d) a,
     847              : #define NAMED_SUBROUTINE(a,b,c,d) a,
     848              : #define NAMED_UINTCST(a,b,c,d) a,
     849              : enum iso_c_binding_symbol
     850              : {
     851              :   ISOCBINDING_INVALID = -1,
     852              : #include "iso-c-binding.def"
     853              :   ISOCBINDING_LAST,
     854              :   ISOCBINDING_NUMBER = ISOCBINDING_LAST
     855              : };
     856              : #undef NAMED_INTCST
     857              : #undef NAMED_REALCST
     858              : #undef NAMED_CMPXCST
     859              : #undef NAMED_LOGCST
     860              : #undef NAMED_CHARKNDCST
     861              : #undef NAMED_CHARCST
     862              : #undef DERIVED_TYPE
     863              : #undef NAMED_FUNCTION
     864              : #undef NAMED_SUBROUTINE
     865              : #undef NAMED_UINTCST
     866              : 
     867              : enum intmod_id
     868              : {
     869              :   INTMOD_NONE = 0, INTMOD_ISO_FORTRAN_ENV, INTMOD_ISO_C_BINDING,
     870              :   INTMOD_IEEE_FEATURES, INTMOD_IEEE_EXCEPTIONS, INTMOD_IEEE_ARITHMETIC
     871              : };
     872              : 
     873              : typedef struct
     874              : {
     875              :   char name[GFC_MAX_SYMBOL_LEN + 1];
     876              :   int value;  /* Used for both integer and character values.  */
     877              :   bt f90_type;
     878              : }
     879              : CInteropKind_t;
     880              : 
     881              : /* Array of structs, where the structs represent the C interop kinds.
     882              :    The list will be implemented based on a hash of the kind name since
     883              :    these could be accessed multiple times.
     884              :    Declared in trans-types.cc as a global, since it's in that file
     885              :    that the list is initialized.  */
     886              : extern CInteropKind_t c_interop_kinds_table[];
     887              : 
     888              : enum gfc_omp_device_type
     889              : {
     890              :   OMP_DEVICE_TYPE_UNSET,
     891              :   OMP_DEVICE_TYPE_HOST,
     892              :   OMP_DEVICE_TYPE_NOHOST,
     893              :   OMP_DEVICE_TYPE_ANY
     894              : };
     895              : 
     896              : enum gfc_omp_severity_type
     897              : {
     898              :   OMP_SEVERITY_UNSET,
     899              :   OMP_SEVERITY_WARNING,
     900              :   OMP_SEVERITY_FATAL
     901              : };
     902              : 
     903              : enum gfc_omp_at_type
     904              : {
     905              :   OMP_AT_UNSET,
     906              :   OMP_AT_COMPILATION,
     907              :   OMP_AT_EXECUTION
     908              : };
     909              : 
     910              : /* Structure and list of supported extension attributes.
     911              : 
     912              :    The bitmask formed from these values (symbol_attribute.ext_attr) is
     913              :    written to and read from module files, see mio_symbol_attribute.  New
     914              :    attributes must therefore be appended at the end (before EXT_ATTR_LAST)
     915              :    so that the existing bit positions, and thus module compatibility, are
     916              :    preserved.  */
     917              : typedef enum
     918              : {
     919              :   EXT_ATTR_DLLIMPORT = 0,
     920              :   EXT_ATTR_DLLEXPORT,
     921              :   EXT_ATTR_STDCALL,
     922              :   EXT_ATTR_CDECL,
     923              :   EXT_ATTR_FASTCALL,
     924              :   EXT_ATTR_NO_ARG_CHECK,
     925              :   EXT_ATTR_DEPRECATED,
     926              :   EXT_ATTR_NOINLINE,
     927              :   EXT_ATTR_NORETURN,
     928              :   EXT_ATTR_WEAK,
     929              :   EXT_ATTR_INLINE,
     930              :   EXT_ATTR_ALWAYS_INLINE,
     931              :   EXT_ATTR_LAST, EXT_ATTR_NUM = EXT_ATTR_LAST
     932              : }
     933              : ext_attr_id_t;
     934              : 
     935              : typedef struct
     936              : {
     937              :   const char *name;
     938              :   unsigned id;
     939              :   const char *middle_end_name;
     940              : }
     941              : ext_attr_t;
     942              : 
     943              : extern const ext_attr_t ext_attr_list[];
     944              : 
     945              : /* Symbol attribute structure.  */
     946              : typedef struct
     947              : {
     948              :   /* Variable attributes.  */
     949              :   unsigned allocatable:1, dimension:1, codimension:1, external:1, intrinsic:1,
     950              :     optional:1, pointer:1, target:1, value:1, volatile_:1, temporary:1,
     951              :     dummy:1, result:1, assign:1, threadprivate:1, not_always_present:1,
     952              :     implied_index:1, subref_array_pointer:1, proc_pointer:1, asynchronous:1,
     953              :     contiguous:1, fe_temp: 1, automatic: 1;
     954              : 
     955              :   /* For CLASS containers, the pointer attribute is sometimes set internally
     956              :      even though it was not directly specified.  In this case, keep the
     957              :      "real" (original) value here.  */
     958              :   unsigned class_pointer:1;
     959              : 
     960              :   ENUM_BITFIELD (save_state) save:2;
     961              : 
     962              :   unsigned data:1,              /* Symbol is named in a DATA statement.  */
     963              :     is_protected:1,             /* Symbol has been marked as protected.  */
     964              :     use_assoc:1,                /* Symbol has been use-associated.  */
     965              :     used_in_submodule:1,        /* Symbol has been use-associated in a
     966              :                                    submodule. Needed since these entities must
     967              :                                    be set host associated to be compliant.  */
     968              :     use_only:1,                 /* Symbol has been use-associated, with ONLY.  */
     969              :     use_rename:1,               /* Symbol has been use-associated and renamed.  */
     970              :     imported:1,                 /* Symbol has been associated by IMPORT.  */
     971              :     host_assoc:1;               /* Symbol has been host associated.  */
     972              : 
     973              :   unsigned in_namelist:1, in_common:1, in_equivalence:1;
     974              :   unsigned function:1, subroutine:1, procedure:1;
     975              :   unsigned generic:1, generic_copy:1;
     976              :   unsigned implicit_type:1;     /* Type defined via implicit rules.  */
     977              :   unsigned untyped:1;           /* No implicit type could be found.  */
     978              : 
     979              :   unsigned is_bind_c:1;         /* say if is bound to C.  */
     980              :   unsigned extension:8;         /* extension level of a derived type.  */
     981              :   unsigned is_class:1;          /* is a CLASS container.  */
     982              :   unsigned class_ok:1;          /* is a CLASS object with correct attributes.  */
     983              :   unsigned vtab:1;              /* is a derived type vtab, pointed to by CLASS objects.  */
     984              :   unsigned vtype:1;             /* is a derived type of a vtab.  */
     985              : 
     986              :   /* These flags are both in the typespec and attribute.  The attribute
     987              :      list is what gets read from/written to a module file.  The typespec
     988              :      is created from a decl being processed.  */
     989              :   unsigned is_c_interop:1;      /* It's c interoperable.  */
     990              :   unsigned is_iso_c:1;          /* Symbol is from iso_c_binding.  */
     991              : 
     992              :   /* Function/subroutine attributes */
     993              :   unsigned sequence:1, elemental:1, pure:1, recursive:1;
     994              :   unsigned unmaskable:1, masked:1, contained:1, mod_proc:1, abstract:1;
     995              : 
     996              :   /* Set if this is a module function or subroutine. Note that it is an
     997              :      attribute because it appears as a prefix in the declaration like
     998              :      PURE, etc..  */
     999              :   unsigned module_procedure:1;
    1000              : 
    1001              :   /* Set if a (public) symbol [e.g. generic name] exposes this symbol,
    1002              :      which is relevant for private module procedures.  */
    1003              :   unsigned public_used:1;
    1004              : 
    1005              :   /* This is set if a contained procedure could be declared pure.  This is
    1006              :      used for certain optimizations that require the result or arguments
    1007              :      cannot alias.  Note that this is zero for PURE procedures.  */
    1008              :   unsigned implicit_pure:1;
    1009              : 
    1010              :   /* This is set for a procedure that contains expressions referencing
    1011              :      arrays coming from outside its namespace.
    1012              :      This is used to force the creation of a temporary when the LHS of
    1013              :      an array assignment may be used by an elemental procedure appearing
    1014              :      on the RHS.  */
    1015              :   unsigned array_outer_dependency:1;
    1016              : 
    1017              :   /* This is set if the subroutine doesn't return.  Currently, this
    1018              :      is only possible for intrinsic subroutines.  */
    1019              :   unsigned noreturn:1;
    1020              : 
    1021              :   /* Set if this procedure is an alternate entry point.  These procedures
    1022              :      don't have any code associated, and the backend will turn them into
    1023              :      thunks to the master function.  */
    1024              :   unsigned entry:1;
    1025              : 
    1026              :   /* Set if this is the master function for a procedure with multiple
    1027              :      entry points.  */
    1028              :   unsigned entry_master:1;
    1029              : 
    1030              :   /* Set if this is the master function for a function with multiple
    1031              :      entry points where characteristics of the entry points differ.  */
    1032              :   unsigned mixed_entry_master:1;
    1033              : 
    1034              :   /* Set if a function must always be referenced by an explicit interface.  */
    1035              :   unsigned always_explicit:1;
    1036              : 
    1037              :   /* Set if the symbol is generated and, hence, standard violations
    1038              :      shouldn't be flagged.  */
    1039              :   unsigned artificial:1;
    1040              : 
    1041              :   /* Set if the symbol has been referenced in an expression.  No further
    1042              :      modification of type or type parameters is permitted.  */
    1043              :   unsigned referenced:1;
    1044              : 
    1045              :   /* Set if the value of the symbol has been assigned one way or another.  */
    1046              :   ENUM_BITFIELD (value_set) value_set:3;
    1047              : 
    1048              :   /* Set if the value of the symbol has been used.  */
    1049              :   ENUM_BITFIELD (value_used) value_used:3;
    1050              : 
    1051              :   /* Set if the symbol has been allocated in the current procedure.  */
    1052              :   ENUM_BITFIELD (var_allocated) allocated:2;
    1053              : 
    1054              :   /* Set if we already emitted a warning for this symbol and the
    1055              :      middle-end should not add additional ones.  */
    1056              :   unsigned warning_emitted:1;
    1057              : 
    1058              :   /* Set if this is the symbol for the main program.  */
    1059              :   unsigned is_main_program:1;
    1060              : 
    1061              :   /* Mutually exclusive multibit attributes.  */
    1062              :   ENUM_BITFIELD (gfc_access) access:2;
    1063              :   ENUM_BITFIELD (sym_intent) intent:2;
    1064              :   ENUM_BITFIELD (sym_flavor) flavor:4;
    1065              :   ENUM_BITFIELD (ifsrc) if_source:2;
    1066              : 
    1067              :   ENUM_BITFIELD (procedure_type) proc:3;
    1068              : 
    1069              :   /* Special attributes for Cray pointers, pointees.  */
    1070              :   unsigned cray_pointer:1, cray_pointee:1;
    1071              : 
    1072              :   /* The symbol is a derived type with allocatable components, pointer
    1073              :      components or private components, procedure pointer components,
    1074              :      possibly nested.  zero_comp is true if the derived type has no
    1075              :      component at all.  defined_assign_comp is true if the derived
    1076              :      type or a (sub-)component has a typebound defined assignment.
    1077              :      unlimited_polymorphic flags the type of the container for these
    1078              :      entities.  */
    1079              :   unsigned alloc_comp:1, pointer_comp:1, proc_pointer_comp:1,
    1080              :            private_comp:1, zero_comp:1, coarray_comp:1, lock_comp:1,
    1081              :            event_comp:1, defined_assign_comp:1, unlimited_polymorphic:1,
    1082              :            has_dtio_procs:1, caf_token:1;
    1083              : 
    1084              :   /* This is a temporary selector for SELECT TYPE/RANK or an associate
    1085              :      variable for SELECT TYPE/RANK or ASSOCIATE.  */
    1086              :   unsigned select_type_temporary:1, select_rank_temporary:1, associate_var:1;
    1087              : 
    1088              :   /* These are the attributes required for parameterized derived
    1089              :      types.  */
    1090              :   unsigned pdt_kind:1, pdt_len:1, pdt_type:1, pdt_template:1,
    1091              :            pdt_array:1, pdt_string:1, pdt_comp:1;
    1092              : 
    1093              :   /* This is omp_{out,in,priv,orig} artificial variable in
    1094              :      !$OMP DECLARE REDUCTION.  */
    1095              :   unsigned omp_udr_artificial_var:1;
    1096              : 
    1097              :   /* This is a placeholder variable used in an !$OMP DECLARE MAPPER
    1098              :      directive.  */
    1099              :   unsigned omp_udm_artificial_var:1;
    1100              : 
    1101              :   /* Mentioned in OMP DECLARE TARGET.  */
    1102              :   unsigned omp_declare_target:1;
    1103              :   unsigned omp_declare_target_link:1;
    1104              :   unsigned omp_declare_target_local:1;
    1105              :   unsigned omp_declare_target_indirect:1;
    1106              :   ENUM_BITFIELD (gfc_omp_device_type) omp_device_type:2;
    1107              :   unsigned omp_groupprivate:1;
    1108              :   unsigned omp_allocate:1;
    1109              : 
    1110              :   /* Mentioned in OACC DECLARE.  */
    1111              :   unsigned oacc_declare_create:1;
    1112              :   unsigned oacc_declare_copyin:1;
    1113              :   unsigned oacc_declare_deviceptr:1;
    1114              :   unsigned oacc_declare_device_resident:1;
    1115              :   unsigned oacc_declare_link:1;
    1116              : 
    1117              :   /* OpenACC 'routine' directive's level of parallelism.  */
    1118              :   ENUM_BITFIELD (oacc_routine_lop) oacc_routine_lop:3;
    1119              :   unsigned oacc_routine_nohost:1;
    1120              : 
    1121              :   /* Attributes set by compiler extensions (!GCC$ ATTRIBUTES).  */
    1122              :   unsigned ext_attr:EXT_ATTR_NUM;
    1123              : 
    1124              :   /* The namespace where the attribute has been set.  */
    1125              :   struct gfc_namespace *volatile_ns, *asynchronous_ns;
    1126              : }
    1127              : symbol_attribute;
    1128              : 
    1129              : 
    1130              : /* We need to store source lines as sequences of multibyte source
    1131              :    characters. We define here a type wide enough to hold any multibyte
    1132              :    source character, just like libcpp does.  A 32-bit type is enough.  */
    1133              : 
    1134              : #if HOST_BITS_PER_INT >= 32
    1135              : typedef unsigned int gfc_char_t;
    1136              : #elif HOST_BITS_PER_LONG >= 32
    1137              : typedef unsigned long gfc_char_t;
    1138              : #elif defined(HAVE_LONG_LONG) && (HOST_BITS_PER_LONGLONG >= 32)
    1139              : typedef unsigned long long gfc_char_t;
    1140              : #else
    1141              : # error "Cannot find an integer type with at least 32 bits"
    1142              : #endif
    1143              : 
    1144              : 
    1145              : /* The following three structures are used to identify a location in
    1146              :    the sources.
    1147              : 
    1148              :    gfc_file is used to maintain a tree of the source files and how
    1149              :    they include each other
    1150              : 
    1151              :    gfc_linebuf holds a single line of source code and information
    1152              :    which file it resides in
    1153              : 
    1154              :    locus point to the sourceline and the character in the source
    1155              :    line.
    1156              : */
    1157              : 
    1158              : typedef struct gfc_file
    1159              : {
    1160              :   struct gfc_file *next, *up;
    1161              :   int inclusion_line, line;
    1162              :   char *filename;
    1163              : } gfc_file;
    1164              : 
    1165              : typedef struct gfc_linebuf
    1166              : {
    1167              :   location_t location;
    1168              :   struct gfc_file *file;
    1169              :   struct gfc_linebuf *next;
    1170              : 
    1171              :   int truncated;
    1172              :   bool dbg_emitted;
    1173              : 
    1174              :   gfc_char_t line[1];
    1175              : } gfc_linebuf;
    1176              : 
    1177              : #define gfc_linebuf_header_size (offsetof (gfc_linebuf, line))
    1178              : 
    1179              : #define gfc_linebuf_linenum(LBUF) (LOCATION_LINE ((LBUF)->location))
    1180              : 
    1181              : /* If nextc = (gfc_char_t*) -1, 'location' is used.  */
    1182              : typedef struct
    1183              : {
    1184              :   gfc_char_t *nextc;
    1185              :   union
    1186              :     {
    1187              :       gfc_linebuf *lb;
    1188              :       location_t location;
    1189              :     } u;
    1190              : } locus;
    1191              : 
    1192              : #define GFC_LOCUS_IS_SET(loc) \
    1193              :   ((loc).nextc == (gfc_char_t *) -1 || (loc).u.lb != NULL)
    1194              : 
    1195              : /* In order for the "gfc" format checking to work correctly, you must
    1196              :    have declared a typedef locus first.  */
    1197              : #if GCC_VERSION >= 4001
    1198              : #define ATTRIBUTE_GCC_GFC(m, n) __attribute__ ((__format__ (__gcc_gfc__, m, n))) ATTRIBUTE_NONNULL(m)
    1199              : #else
    1200              : #define ATTRIBUTE_GCC_GFC(m, n) ATTRIBUTE_NONNULL(m)
    1201              : #endif
    1202              : 
    1203              : 
    1204              : /* Suppress error messages or re-enable them.  */
    1205              : 
    1206              : void gfc_push_suppress_errors (void);
    1207              : void gfc_pop_suppress_errors (void);
    1208              : bool gfc_query_suppress_errors (void);
    1209              : 
    1210              : 
    1211              : /* Character length structures hold the expression that gives the
    1212              :    length of a character variable.  We avoid putting these into
    1213              :    gfc_typespec because doing so prevents us from doing structure
    1214              :    copies and forces us to deallocate any typespecs we create, as well
    1215              :    as structures that contain typespecs.  They also can have multiple
    1216              :    character typespecs pointing to them.
    1217              : 
    1218              :    These structures form a singly linked list within the current
    1219              :    namespace and are deallocated with the namespace.  It is possible to
    1220              :    end up with gfc_charlen structures that have nothing pointing to them.  */
    1221              : 
    1222              : typedef struct gfc_charlen
    1223              : {
    1224              :   struct gfc_expr *length;
    1225              :   struct gfc_charlen *next;
    1226              :   bool length_from_typespec; /* Length from explicit array ctor typespec?  */
    1227              :   tree backend_decl;
    1228              :   tree passed_length; /* Length argument explicitly passed.  */
    1229              : 
    1230              :   int resolved;
    1231              : }
    1232              : gfc_charlen;
    1233              : 
    1234              : #define gfc_get_charlen() XCNEW (gfc_charlen)
    1235              : 
    1236              : /* Type specification structure.  */
    1237              : typedef struct
    1238              : {
    1239              :   bt type;
    1240              :   int kind;
    1241              : 
    1242              :   union
    1243              :   {
    1244              :     struct gfc_symbol *derived; /* For derived types only.  */
    1245              :     gfc_charlen *cl;            /* For character types only.  */
    1246              :     int pad;                    /* For hollerith types only.  */
    1247              :   }
    1248              :   u;
    1249              : 
    1250              :   struct gfc_symbol *interface; /* For PROCEDURE declarations.  */
    1251              :   int is_c_interop;
    1252              :   int is_iso_c;
    1253              :   bt f90_type;
    1254              :   bool deferred;
    1255              :   gfc_symbol *interop_kind;
    1256              : }
    1257              : gfc_typespec;
    1258              : 
    1259              : /* Array specification.  */
    1260              : typedef struct
    1261              : {
    1262              :   int rank;     /* A scalar has a rank of 0, an assumed-rank array has -1.  */
    1263              :   int corank;
    1264              :   array_type type, cotype;
    1265              :   struct gfc_expr *lower[GFC_MAX_DIMENSIONS], *upper[GFC_MAX_DIMENSIONS];
    1266              : 
    1267              :   /* These two fields are used with the Cray Pointer extension.  */
    1268              :   bool cray_pointee; /* True iff this spec belongs to a cray pointee.  */
    1269              :   bool cp_was_assumed; /* AS_ASSUMED_SIZE cp arrays are converted to
    1270              :                         AS_EXPLICIT, but we want to remember that we
    1271              :                         did this.  */
    1272              : 
    1273              :   bool resolved;
    1274              : }
    1275              : gfc_array_spec;
    1276              : 
    1277              : #define gfc_get_array_spec() XCNEW (gfc_array_spec)
    1278              : 
    1279              : 
    1280              : /* Components of derived types.  */
    1281              : typedef struct gfc_component
    1282              : {
    1283              :   const char *name;
    1284              :   gfc_typespec ts;
    1285              : 
    1286              :   symbol_attribute attr;
    1287              :   gfc_array_spec *as;
    1288              : 
    1289              :   tree backend_decl;
    1290              :   /* Used to cache a FIELD_DECL matching this same component
    1291              :      but applied to a different backend containing type that was
    1292              :      generated by gfc_nonrestricted_type.  */
    1293              :   tree norestrict_decl;
    1294              :   locus loc;
    1295              :   struct gfc_expr *initializer;
    1296              :   /* Used in parameterized derived type declarations to store parameterized
    1297              :      kind expressions.  */
    1298              :   struct gfc_expr *kind_expr;
    1299              :   struct gfc_actual_arglist *param_list;
    1300              : 
    1301              :   struct gfc_component *next;
    1302              : 
    1303              :   /* Needed for procedure pointer components.  */
    1304              :   struct gfc_typebound_proc *tb;
    1305              :   /* When allocatable/pointer and in a coarray the associated token.  */
    1306              :   struct gfc_component *caf_token;
    1307              : }
    1308              : gfc_component;
    1309              : 
    1310              : #define gfc_get_component() XCNEW (gfc_component)
    1311              : #define gfc_comp_caf_token(cm) (cm)->caf_token->backend_decl
    1312              : 
    1313              : /* Formal argument lists are lists of symbols.  */
    1314              : typedef struct gfc_formal_arglist
    1315              : {
    1316              :   /* Symbol representing the argument at this position in the arglist.  */
    1317              :   struct gfc_symbol *sym;
    1318              :   /* Points to the next formal argument.  */
    1319              :   struct gfc_formal_arglist *next;
    1320              : }
    1321              : gfc_formal_arglist;
    1322              : 
    1323              : #define gfc_get_formal_arglist() XCNEW (gfc_formal_arglist)
    1324              : 
    1325              : 
    1326              : struct gfc_dummy_arg;
    1327              : 
    1328              : 
    1329              : /* The gfc_actual_arglist structure is for actual arguments and
    1330              :    for type parameter specification lists.  */
    1331              : typedef struct gfc_actual_arglist
    1332              : {
    1333              :   const char *name;
    1334              :   /* Alternate return label when the expr member is null.  */
    1335              :   struct gfc_st_label *label;
    1336              : 
    1337              :   gfc_param_spec_type spec_type;
    1338              : 
    1339              :   struct gfc_expr *expr;
    1340              : 
    1341              :   /*  The dummy arg this actual arg is associated with, if the interface
    1342              :       is explicit.  NULL otherwise.  */
    1343              :   gfc_dummy_arg *associated_dummy;
    1344              : 
    1345              :   struct gfc_actual_arglist *next;
    1346              : }
    1347              : gfc_actual_arglist;
    1348              : 
    1349              : #define gfc_get_actual_arglist() XCNEW (gfc_actual_arglist)
    1350              : 
    1351              : 
    1352              : /* Because a symbol can belong to multiple namelists, they must be
    1353              :    linked externally to the symbol itself.  */
    1354              : typedef struct gfc_namelist
    1355              : {
    1356              :   struct gfc_symbol *sym;
    1357              :   struct gfc_namelist *next;
    1358              : }
    1359              : gfc_namelist;
    1360              : 
    1361              : #define gfc_get_namelist() XCNEW (gfc_namelist)
    1362              : 
    1363              : /* Likewise to gfc_namelist, but contains expressions.  */
    1364              : typedef struct gfc_expr_list
    1365              : {
    1366              :   struct gfc_expr *expr;
    1367              :   struct gfc_expr_list *next;
    1368              : }
    1369              : gfc_expr_list;
    1370              : 
    1371              : #define gfc_get_expr_list() XCNEW (gfc_expr_list)
    1372              : 
    1373              : enum gfc_omp_reduction_op
    1374              : {
    1375              :   OMP_REDUCTION_NONE = -1,
    1376              :   OMP_REDUCTION_PLUS = INTRINSIC_PLUS,
    1377              :   OMP_REDUCTION_MINUS = INTRINSIC_MINUS,
    1378              :   OMP_REDUCTION_TIMES = INTRINSIC_TIMES,
    1379              :   OMP_REDUCTION_AND = INTRINSIC_AND,
    1380              :   OMP_REDUCTION_OR = INTRINSIC_OR,
    1381              :   OMP_REDUCTION_EQV = INTRINSIC_EQV,
    1382              :   OMP_REDUCTION_NEQV = INTRINSIC_NEQV,
    1383              :   OMP_REDUCTION_MAX = GFC_INTRINSIC_END,
    1384              :   OMP_REDUCTION_MIN,
    1385              :   OMP_REDUCTION_IAND,
    1386              :   OMP_REDUCTION_IOR,
    1387              :   OMP_REDUCTION_IEOR,
    1388              :   OMP_REDUCTION_USER
    1389              : };
    1390              : 
    1391              : enum gfc_omp_depend_doacross_op
    1392              : {
    1393              :   OMP_DEPEND_UNSET,
    1394              :   OMP_DEPEND_IN,
    1395              :   OMP_DEPEND_OUT,
    1396              :   OMP_DEPEND_INOUT,
    1397              :   OMP_DEPEND_INOUTSET,
    1398              :   OMP_DEPEND_MUTEXINOUTSET,
    1399              :   OMP_DEPEND_DEPOBJ,
    1400              :   OMP_DEPEND_SINK_FIRST,
    1401              :   OMP_DOACROSS_SINK_FIRST,
    1402              :   OMP_DOACROSS_SINK
    1403              : };
    1404              : 
    1405              : enum gfc_omp_map_op
    1406              : {
    1407              :   OMP_MAP_ALLOC = 0,
    1408              :   OMP_MAP_TO = 1 << 0,
    1409              :   OMP_MAP_FROM = 1 << 1,
    1410              :   OMP_MAP_TOFROM = OMP_MAP_TO | OMP_MAP_FROM,
    1411              :   OMP_MAP_IF_PRESENT = 1 << 2,
    1412              :   OMP_MAP_ATTACH = 1 << 3,
    1413              :   OMP_MAP_DELETE = 1 << 4,
    1414              :   OMP_MAP_DETACH = 1 << 5,
    1415              :   OMP_MAP_FORCE_ALLOC = 1 << 6,
    1416              :   OMP_MAP_FORCE_TO = OMP_MAP_FORCE_ALLOC | OMP_MAP_TO,
    1417              :   OMP_MAP_FORCE_FROM = OMP_MAP_FORCE_ALLOC | OMP_MAP_FROM,
    1418              :   OMP_MAP_FORCE_TOFROM = OMP_MAP_FORCE_ALLOC | OMP_MAP_TOFROM,
    1419              :   OMP_MAP_FORCE_PRESENT = 1 << 7,
    1420              :   OMP_MAP_FORCE_DEVICEPTR = 1 << 8,
    1421              :   OMP_MAP_DEVICE_RESIDENT = 1 << 9,
    1422              :   OMP_MAP_LINK = 1 << 10,
    1423              :   OMP_MAP_RELEASE = 1 << 11,
    1424              :   OMP_MAP_ALWAYS_TO = (1 << 12) | OMP_MAP_TO,
    1425              :   OMP_MAP_ALWAYS_FROM = (1 << 12) | OMP_MAP_FROM,
    1426              :   OMP_MAP_ALWAYS_TOFROM = (1 << 12) | OMP_MAP_TOFROM,
    1427              :   OMP_MAP_PRESENT_ALLOC = 1 << 13,
    1428              :   OMP_MAP_PRESENT_TO = (1 << 13) | OMP_MAP_TO,
    1429              :   OMP_MAP_PRESENT_FROM = (1 << 13) | OMP_MAP_FROM,
    1430              :   OMP_MAP_PRESENT_TOFROM = (1 << 13) | OMP_MAP_TOFROM,
    1431              :   OMP_MAP_ALWAYS_PRESENT_TO = OMP_MAP_ALWAYS_TO | OMP_MAP_PRESENT_TO,
    1432              :   OMP_MAP_ALWAYS_PRESENT_FROM = OMP_MAP_ALWAYS_FROM | OMP_MAP_PRESENT_FROM,
    1433              :   OMP_MAP_ALWAYS_PRESENT_TOFROM = OMP_MAP_ALWAYS_TOFROM | OMP_MAP_PRESENT_TOFROM,
    1434              :   OMP_MAP_UNSET = 1 << 14
    1435              : };
    1436              : 
    1437              : enum gfc_omp_defaultmap
    1438              : {
    1439              :   OMP_DEFAULTMAP_UNSET,
    1440              :   OMP_DEFAULTMAP_ALLOC,
    1441              :   OMP_DEFAULTMAP_TO,
    1442              :   OMP_DEFAULTMAP_FROM,
    1443              :   OMP_DEFAULTMAP_TOFROM,
    1444              :   OMP_DEFAULTMAP_FIRSTPRIVATE,
    1445              :   OMP_DEFAULTMAP_NONE,
    1446              :   OMP_DEFAULTMAP_DEFAULT,
    1447              :   OMP_DEFAULTMAP_PRESENT
    1448              : };
    1449              : 
    1450              : enum gfc_omp_defaultmap_category
    1451              : {
    1452              :   OMP_DEFAULTMAP_CAT_UNCATEGORIZED,
    1453              :   OMP_DEFAULTMAP_CAT_ALL,
    1454              :   OMP_DEFAULTMAP_CAT_SCALAR,
    1455              :   OMP_DEFAULTMAP_CAT_AGGREGATE,
    1456              :   OMP_DEFAULTMAP_CAT_ALLOCATABLE,
    1457              :   OMP_DEFAULTMAP_CAT_POINTER,
    1458              :   OMP_DEFAULTMAP_CAT_NUM
    1459              : };
    1460              : 
    1461              : enum gfc_omp_linear_op
    1462              : {
    1463              :   OMP_LINEAR_DEFAULT,
    1464              :   OMP_LINEAR_REF,
    1465              :   OMP_LINEAR_VAL,
    1466              :   OMP_LINEAR_UVAL
    1467              : };
    1468              : 
    1469              : /* For use in OpenMP clauses in case we need extra information
    1470              :    (aligned clause alignment, linear clause step, etc.).  */
    1471              : 
    1472              : typedef struct gfc_omp_namelist
    1473              : {
    1474              :   struct gfc_symbol *sym;
    1475              :   struct gfc_expr *expr;
    1476              :   union
    1477              :     {
    1478              :       gfc_omp_reduction_op reduction_op;
    1479              :       gfc_omp_depend_doacross_op depend_doacross_op;
    1480              :       struct
    1481              :         {
    1482              :           ENUM_BITFIELD (gfc_omp_map_op) op : 16;
    1483              :           bool readonly;
    1484              :         } map;
    1485              :       gfc_expr *align;
    1486              :       struct
    1487              :         {
    1488              :           ENUM_BITFIELD (gfc_omp_linear_op) op:4;
    1489              :           bool old_modifier;
    1490              :         } linear;
    1491              :       struct gfc_common_head *common;
    1492              :       struct gfc_symbol *memspace_sym;
    1493              :       bool lastprivate_conditional;
    1494              :       bool present_modifier;
    1495              :       struct
    1496              :         {
    1497              :           int len;
    1498              :           bool target;
    1499              :           bool targetsync;
    1500              :         } init;
    1501              :       struct
    1502              :         {
    1503              :           bool need_ptr:1;
    1504              :           bool need_addr:1;
    1505              :           bool range_start:1;
    1506              :           bool omp_num_args_plus:1;
    1507              :           bool omp_num_args_minus:1;
    1508              :           bool error_p:1;
    1509              :         } adj_args;
    1510              :     } u;
    1511              :   union
    1512              :     {
    1513              :       struct gfc_omp_namelist_udr *udr;
    1514              :       gfc_namespace *ns;
    1515              :       gfc_expr *allocator;
    1516              :       struct gfc_symbol *traits_sym;
    1517              :       struct gfc_omp_namelist *duplicate_of;
    1518              :       char *init_interop;
    1519              :     } u2;
    1520              :   union
    1521              :     {
    1522              :       struct gfc_omp_namelist_udm *udm;
    1523              :     } u3;
    1524              :   struct gfc_omp_namelist *next;
    1525              :   locus where;
    1526              : }
    1527              : gfc_omp_namelist;
    1528              : 
    1529              : #define gfc_get_omp_namelist() XCNEW (gfc_omp_namelist)
    1530              : 
    1531              : enum gfc_omp_list_type
    1532              : {
    1533              :   OMP_LIST_FIRST,
    1534              :   OMP_LIST_PRIVATE = OMP_LIST_FIRST,
    1535              :   OMP_LIST_FIRSTPRIVATE,
    1536              :   OMP_LIST_LASTPRIVATE,
    1537              :   OMP_LIST_COPYPRIVATE,
    1538              :   OMP_LIST_SHARED,
    1539              :   OMP_LIST_COPYIN,
    1540              :   OMP_LIST_UNIFORM,
    1541              :   OMP_LIST_AFFINITY,
    1542              :   OMP_LIST_ALIGNED,
    1543              :   OMP_LIST_LINEAR,
    1544              :   OMP_LIST_DEPEND,
    1545              :   OMP_LIST_MAP,
    1546              :   OMP_LIST_TO,
    1547              :   OMP_LIST_FROM,
    1548              :   OMP_LIST_SCAN_IN,
    1549              :   OMP_LIST_SCAN_EX,
    1550              :   OMP_LIST_REDUCTION,
    1551              :   OMP_LIST_REDUCTION_INSCAN,
    1552              :   OMP_LIST_REDUCTION_TASK,
    1553              :   OMP_LIST_IN_REDUCTION,
    1554              :   OMP_LIST_TASK_REDUCTION,
    1555              :   OMP_LIST_DEVICE_RESIDENT,
    1556              :   OMP_LIST_LINK,
    1557              :   OMP_LIST_LOCAL,
    1558              :   OMP_LIST_USE_DEVICE,
    1559              :   OMP_LIST_CACHE,
    1560              :   OMP_LIST_IS_DEVICE_PTR,
    1561              :   OMP_LIST_USE_DEVICE_PTR,
    1562              :   OMP_LIST_USE_DEVICE_ADDR,
    1563              :   OMP_LIST_NONTEMPORAL,
    1564              :   OMP_LIST_ALLOCATE,
    1565              :   OMP_LIST_HAS_DEVICE_ADDR,
    1566              :   OMP_LIST_ENTER,
    1567              :   OMP_LIST_USES_ALLOCATORS,
    1568              :   OMP_LIST_INIT,
    1569              :   OMP_LIST_USE,
    1570              :   OMP_LIST_DESTROY,
    1571              :   OMP_LIST_INTEROP,
    1572              :   OMP_LIST_ADJUST_ARGS,
    1573              :   OMP_LIST_NUM, /* Must be the last (together with OMP_LIST_NONE).  */
    1574              :   OMP_LIST_NONE = OMP_LIST_NUM
    1575              : };
    1576              : 
    1577              : /* Because a symbol can belong to multiple namelists, they must be
    1578              :    linked externally to the symbol itself.  */
    1579              : 
    1580              : enum gfc_omp_sched_kind
    1581              : {
    1582              :   OMP_SCHED_NONE,
    1583              :   OMP_SCHED_STATIC,
    1584              :   OMP_SCHED_DYNAMIC,
    1585              :   OMP_SCHED_GUIDED,
    1586              :   OMP_SCHED_RUNTIME,
    1587              :   OMP_SCHED_AUTO
    1588              : };
    1589              : 
    1590              : enum gfc_omp_default_sharing
    1591              : {
    1592              :   OMP_DEFAULT_UNKNOWN,
    1593              :   OMP_DEFAULT_NONE,
    1594              :   OMP_DEFAULT_PRIVATE,
    1595              :   OMP_DEFAULT_SHARED,
    1596              :   OMP_DEFAULT_FIRSTPRIVATE,
    1597              :   OMP_DEFAULT_PRESENT
    1598              : };
    1599              : 
    1600              : enum gfc_omp_proc_bind_kind
    1601              : {
    1602              :   OMP_PROC_BIND_UNKNOWN,
    1603              :   OMP_PROC_BIND_PRIMARY,
    1604              :   OMP_PROC_BIND_MASTER,
    1605              :   OMP_PROC_BIND_SPREAD,
    1606              :   OMP_PROC_BIND_CLOSE
    1607              : };
    1608              : 
    1609              : enum gfc_omp_cancel_kind
    1610              : {
    1611              :   OMP_CANCEL_UNKNOWN,
    1612              :   OMP_CANCEL_PARALLEL,
    1613              :   OMP_CANCEL_SECTIONS,
    1614              :   OMP_CANCEL_DO,
    1615              :   OMP_CANCEL_TASKGROUP
    1616              : };
    1617              : 
    1618              : enum gfc_omp_if_kind
    1619              : {
    1620              :   OMP_IF_CANCEL,
    1621              :   OMP_IF_PARALLEL,
    1622              :   OMP_IF_SIMD,
    1623              :   OMP_IF_TASK,
    1624              :   OMP_IF_TASKLOOP,
    1625              :   OMP_IF_TARGET,
    1626              :   OMP_IF_TARGET_DATA,
    1627              :   OMP_IF_TARGET_UPDATE,
    1628              :   OMP_IF_TARGET_ENTER_DATA,
    1629              :   OMP_IF_TARGET_EXIT_DATA,
    1630              :   OMP_IF_LAST
    1631              : };
    1632              : 
    1633              : enum gfc_omp_atomic_op
    1634              : {
    1635              :   GFC_OMP_ATOMIC_UNSET = 0,
    1636              :   GFC_OMP_ATOMIC_UPDATE = 1,
    1637              :   GFC_OMP_ATOMIC_READ = 2,
    1638              :   GFC_OMP_ATOMIC_WRITE = 3,
    1639              :   GFC_OMP_ATOMIC_MASK = 3,
    1640              :   GFC_OMP_ATOMIC_SWAP = 16
    1641              : };
    1642              : 
    1643              : enum gfc_omp_requires_kind
    1644              : {
    1645              :   /* Keep gfc_namespace's omp_requires bitfield size in sync.  */
    1646              :   OMP_REQ_ATOMIC_MEM_ORDER_SEQ_CST = 1,  /* 001 */
    1647              :   OMP_REQ_ATOMIC_MEM_ORDER_ACQ_REL = 2,  /* 010 */
    1648              :   OMP_REQ_ATOMIC_MEM_ORDER_RELAXED = 3,  /* 011 */
    1649              :   OMP_REQ_ATOMIC_MEM_ORDER_ACQUIRE = 4,  /* 100 */
    1650              :   OMP_REQ_ATOMIC_MEM_ORDER_RELEASE = 5,  /* 101 */
    1651              :   OMP_REQ_REVERSE_OFFLOAD = (1 << 3),
    1652              :   OMP_REQ_UNIFIED_ADDRESS = (1 << 4),
    1653              :   OMP_REQ_UNIFIED_SHARED_MEMORY = (1 << 5),
    1654              :   OMP_REQ_SELF_MAPS = (1 << 6),
    1655              :   OMP_REQ_DYNAMIC_ALLOCATORS = (1 << 7),
    1656              :   OMP_REQ_TARGET_MASK = (OMP_REQ_REVERSE_OFFLOAD
    1657              :                          | OMP_REQ_UNIFIED_ADDRESS
    1658              :                          | OMP_REQ_UNIFIED_SHARED_MEMORY
    1659              :                          | OMP_REQ_SELF_MAPS),
    1660              :   OMP_REQ_ATOMIC_MEM_ORDER_MASK = (OMP_REQ_ATOMIC_MEM_ORDER_SEQ_CST
    1661              :                                    | OMP_REQ_ATOMIC_MEM_ORDER_ACQ_REL
    1662              :                                    | OMP_REQ_ATOMIC_MEM_ORDER_RELAXED
    1663              :                                    | OMP_REQ_ATOMIC_MEM_ORDER_ACQUIRE
    1664              :                                    | OMP_REQ_ATOMIC_MEM_ORDER_RELEASE)
    1665              : };
    1666              : 
    1667              : enum gfc_omp_memorder
    1668              : {
    1669              :   OMP_MEMORDER_UNSET,
    1670              :   OMP_MEMORDER_SEQ_CST,
    1671              :   OMP_MEMORDER_ACQ_REL,
    1672              :   OMP_MEMORDER_RELEASE,
    1673              :   OMP_MEMORDER_ACQUIRE,
    1674              :   OMP_MEMORDER_RELAXED
    1675              : };
    1676              : 
    1677              : enum gfc_omp_bind_type
    1678              : {
    1679              :   OMP_BIND_UNSET,
    1680              :   OMP_BIND_TEAMS,
    1681              :   OMP_BIND_PARALLEL,
    1682              :   OMP_BIND_THREAD
    1683              : };
    1684              : 
    1685              : enum gfc_omp_fallback
    1686              : {
    1687              :   OMP_FALLBACK_NONE,
    1688              :   OMP_FALLBACK_ABORT,
    1689              :   OMP_FALLBACK_DEFAULT_MEM,
    1690              :   OMP_FALLBACK_NULL
    1691              : };
    1692              : 
    1693              : typedef struct gfc_omp_assumptions
    1694              : {
    1695              :   int n_absent, n_contains;
    1696              :   enum gfc_statement *absent, *contains;
    1697              :   gfc_expr_list *holds;
    1698              :   bool no_openmp:1, no_openmp_routines:1, no_openmp_constructs:1;
    1699              :   bool no_parallelism:1;
    1700              : }
    1701              : gfc_omp_assumptions;
    1702              : 
    1703              : #define gfc_get_omp_assumptions() XCNEW (gfc_omp_assumptions)
    1704              : 
    1705              : 
    1706              : typedef struct gfc_omp_clauses
    1707              : {
    1708              :   gfc_omp_namelist *lists[OMP_LIST_NUM];
    1709              :   struct gfc_expr *if_expr;
    1710              :   struct gfc_expr *if_exprs[OMP_IF_LAST];
    1711              :   struct gfc_expr *self_expr;
    1712              :   struct gfc_expr *final_expr;
    1713              :   struct gfc_expr_list *num_threads_list;
    1714              :   struct gfc_expr *chunk_size;
    1715              :   struct gfc_expr *safelen_expr;
    1716              :   struct gfc_expr *simdlen_expr;
    1717              :   struct gfc_expr_list *num_teams_list;
    1718              :   struct gfc_expr *device;
    1719              :   struct gfc_expr_list *thread_limit_list;
    1720              :   struct gfc_expr *grainsize;
    1721              :   struct gfc_expr *filter;
    1722              :   struct gfc_expr *hint;
    1723              :   struct gfc_expr *num_tasks;
    1724              :   struct gfc_expr *priority;
    1725              :   struct gfc_expr *detach;
    1726              :   struct gfc_expr *depobj;
    1727              :   struct gfc_expr *dist_chunk_size;
    1728              :   struct gfc_expr *dyn_groupprivate;
    1729              :   struct gfc_expr *message;
    1730              :   struct gfc_expr *novariants;
    1731              :   struct gfc_expr *nocontext;
    1732              :   struct gfc_omp_assumptions *assume;
    1733              :   struct gfc_expr_list *sizes_list;
    1734              :   const char *critical_name;
    1735              :   enum gfc_omp_default_sharing default_sharing;
    1736              :   enum gfc_omp_atomic_op atomic_op;
    1737              :   enum gfc_omp_defaultmap defaultmap[OMP_DEFAULTMAP_CAT_NUM];
    1738              :   int collapse, orderedc;
    1739              :   int partial;
    1740              :   unsigned nowait:1, ordered:1, untied:1, mergeable:1, ancestor:1;
    1741              :   unsigned inbranch:1, notinbranch:1, nogroup:1;
    1742              :   unsigned sched_simd:1, sched_monotonic:1, sched_nonmonotonic:1;
    1743              :   unsigned simd:1, threads:1, doacross_source:1, depend_source:1, destroy:1;
    1744              :   unsigned order_unconstrained:1, order_reproducible:1, capture:1;
    1745              :   unsigned grainsize_strict:1, num_tasks_strict:1, compare:1, weak:1;
    1746              :   unsigned non_rectangular:1, order_concurrent:1;
    1747              :   unsigned contains_teams_construct:1, target_first_st_is_teams_or_meta:1;
    1748              :   unsigned contained_in_target_construct:1, indirect:1;
    1749              :   unsigned full:1, erroneous:1;
    1750              :   unsigned thread_limit_strict:1, num_threads_strict:1;
    1751              :   unsigned num_teams_dims:1, thread_limit_dims:1, num_threads_dims:1;
    1752              :   ENUM_BITFIELD (gfc_omp_sched_kind) sched_kind:3;
    1753              :   ENUM_BITFIELD (gfc_omp_device_type) device_type:2;
    1754              :   ENUM_BITFIELD (gfc_omp_memorder) memorder:3;
    1755              :   ENUM_BITFIELD (gfc_omp_memorder) fail:3;
    1756              :   ENUM_BITFIELD (gfc_omp_cancel_kind) cancel:3;
    1757              :   ENUM_BITFIELD (gfc_omp_proc_bind_kind) proc_bind:3;
    1758              :   ENUM_BITFIELD (gfc_omp_depend_doacross_op) depobj_update:4;
    1759              :   ENUM_BITFIELD (gfc_omp_bind_type) bind:2;
    1760              :   ENUM_BITFIELD (gfc_omp_at_type) at:2;
    1761              :   ENUM_BITFIELD (gfc_omp_severity_type) severity:2;
    1762              :   ENUM_BITFIELD (gfc_omp_sched_kind) dist_sched_kind:3;
    1763              :   ENUM_BITFIELD (gfc_omp_fallback) fallback:2;
    1764              : 
    1765              :   /* OpenACC. */
    1766              :   struct gfc_expr *async_expr;
    1767              :   struct gfc_expr *gang_static_expr;
    1768              :   struct gfc_expr *gang_num_expr;
    1769              :   struct gfc_expr *worker_expr;
    1770              :   struct gfc_expr *vector_expr;
    1771              :   struct gfc_expr *num_gangs_expr;
    1772              :   struct gfc_expr *num_workers_expr;
    1773              :   struct gfc_expr *vector_length_expr;
    1774              :   struct gfc_expr *device_num_expr;
    1775              :   gfc_expr_list *wait_list;
    1776              :   gfc_expr_list *tile_list;
    1777              :   unsigned async:1, gang:1, worker:1, vector:1, seq:1, independent:1;
    1778              :   unsigned par_auto:1, gang_static:1;
    1779              :   unsigned if_present:1, finalize:1;
    1780              :   unsigned nohost:1;
    1781              :   unsigned oacc_device_type:4, oacc_device_type_present:1;
    1782              :   locus loc;
    1783              : }
    1784              : gfc_omp_clauses;
    1785              : 
    1786              : #define gfc_get_omp_clauses() XCNEW (gfc_omp_clauses)
    1787              : 
    1788              : 
    1789              : /* Node in the linked list used for storing !$oacc declare constructs.  */
    1790              : 
    1791              : typedef struct gfc_oacc_declare
    1792              : {
    1793              :   struct gfc_oacc_declare *next;
    1794              :   bool module_var;
    1795              :   gfc_omp_clauses *clauses;
    1796              :   locus loc;
    1797              : }
    1798              : gfc_oacc_declare;
    1799              : 
    1800              : #define gfc_get_oacc_declare() XCNEW (gfc_oacc_declare)
    1801              : 
    1802              : 
    1803              : /* Node in the linked list used for storing !$omp declare simd constructs.  */
    1804              : 
    1805              : typedef struct gfc_omp_declare_simd
    1806              : {
    1807              :   struct gfc_omp_declare_simd *next;
    1808              :   locus where; /* Where the !$omp declare simd construct occurred.  */
    1809              : 
    1810              :   gfc_symbol *proc_name;
    1811              : 
    1812              :   gfc_omp_clauses *clauses;
    1813              : }
    1814              : gfc_omp_declare_simd;
    1815              : #define gfc_get_omp_declare_simd() XCNEW (gfc_omp_declare_simd)
    1816              : 
    1817              : /* For OpenMP trait selector enum types and tables.  */
    1818              : #include "omp-selectors.h"
    1819              : 
    1820              : typedef struct gfc_omp_trait_property
    1821              : {
    1822              :   struct gfc_omp_trait_property *next;
    1823              :   enum omp_tp_type property_kind;
    1824              :   bool is_name : 1;
    1825              : 
    1826              :   union
    1827              :     {
    1828              :       gfc_expr *expr;
    1829              :       gfc_symbol *sym;
    1830              :       gfc_omp_clauses *clauses;
    1831              :       char *name;
    1832              :     };
    1833              : } gfc_omp_trait_property;
    1834              : #define gfc_get_omp_trait_property() XCNEW (gfc_omp_trait_property)
    1835              : 
    1836              : typedef struct gfc_omp_selector
    1837              : {
    1838              :   struct gfc_omp_selector *next;
    1839              :   enum omp_ts_code code;
    1840              :   gfc_expr *score;
    1841              :   struct gfc_omp_trait_property *properties;
    1842              : } gfc_omp_selector;
    1843              : #define gfc_get_omp_selector() XCNEW (gfc_omp_selector)
    1844              : 
    1845              : typedef struct gfc_omp_set_selector
    1846              : {
    1847              :   struct gfc_omp_set_selector *next;
    1848              :   enum omp_tss_code code;
    1849              :   struct gfc_omp_selector *trait_selectors;
    1850              : } gfc_omp_set_selector;
    1851              : #define gfc_get_omp_set_selector() XCNEW (gfc_omp_set_selector)
    1852              : 
    1853              : 
    1854              : /* Node in the linked list used for storing !$omp declare variant
    1855              :    constructs.  */
    1856              : 
    1857              : typedef struct gfc_omp_declare_variant
    1858              : {
    1859              :   struct gfc_omp_declare_variant *next;
    1860              :   locus where; /* Where the !$omp declare variant construct occurred.  */
    1861              : 
    1862              :   struct gfc_symtree *base_proc_symtree;
    1863              :   struct gfc_symtree *variant_proc_symtree;
    1864              : 
    1865              :   gfc_omp_set_selector *set_selectors;
    1866              :   gfc_omp_namelist *adjust_args_list;
    1867              :   gfc_omp_namelist *append_args_list;
    1868              : 
    1869              :   bool checked_p : 1; /* Set if previously checked for errors.  */
    1870              :   bool error_p : 1; /* Set if error found in directive.  */
    1871              : }
    1872              : gfc_omp_declare_variant;
    1873              : #define gfc_get_omp_declare_variant() XCNEW (gfc_omp_declare_variant)
    1874              : 
    1875              : typedef struct gfc_omp_variant
    1876              : {
    1877              :   struct gfc_omp_variant *next;
    1878              :   locus where; /* Where the metadirective clause occurred.  */
    1879              : 
    1880              :   gfc_omp_set_selector *selectors;
    1881              :   enum gfc_statement stmt;
    1882              :   struct gfc_code *code;
    1883              : 
    1884              : } gfc_omp_variant;
    1885              : #define gfc_get_omp_variant() XCNEW (gfc_omp_variant)
    1886              : 
    1887              : typedef struct gfc_omp_udr
    1888              : {
    1889              :   struct gfc_omp_udr *next;
    1890              :   locus where; /* Where the !$omp declare reduction construct occurred.  */
    1891              : 
    1892              :   const char *name;
    1893              :   gfc_typespec ts;
    1894              :   gfc_omp_reduction_op rop;
    1895              : 
    1896              :   struct gfc_symbol *omp_out;
    1897              :   struct gfc_symbol *omp_in;
    1898              :   struct gfc_namespace *combiner_ns;
    1899              : 
    1900              :   struct gfc_symbol *omp_priv;
    1901              :   struct gfc_symbol *omp_orig;
    1902              :   struct gfc_namespace *initializer_ns;
    1903              : }
    1904              : gfc_omp_udr;
    1905              : #define gfc_get_omp_udr() XCNEW (gfc_omp_udr)
    1906              : 
    1907              : typedef struct gfc_omp_namelist_udr
    1908              : {
    1909              :   struct gfc_omp_udr *udr;
    1910              :   struct gfc_code *combiner;
    1911              :   struct gfc_code *initializer;
    1912              : }
    1913              : gfc_omp_namelist_udr;
    1914              : #define gfc_get_omp_namelist_udr() XCNEW (gfc_omp_namelist_udr)
    1915              : 
    1916              : /* Store list of user-defined mapper (created by 'omp declare mapper').  */
    1917              : typedef struct gfc_omp_udm
    1918              : {
    1919              :   struct gfc_omp_udm *next;
    1920              :   locus where; /* Where the !$omp declare mapper construct occurred.  */
    1921              : 
    1922              :   const char *mapper_id;
    1923              :   gfc_typespec ts;
    1924              : 
    1925              :   struct gfc_symbol *var_sym;
    1926              :   struct gfc_namespace *mapper_ns;
    1927              : 
    1928              :   /* FIXME: We don't need a whole gfc_omp_clauses here.  We only use the
    1929              :      OMP_LIST_MAP clause list; however, the used resolve_omp_clauses
    1930              :      requires the full set.  */
    1931              :   gfc_omp_clauses *clauses;
    1932              : 
    1933              :   tree backend_decl;
    1934              : }
    1935              : gfc_omp_udm;
    1936              : #define gfc_get_omp_udm() XCNEW (gfc_omp_udm)
    1937              : 
    1938              : /* Mapper data for a MAP or TO/FROM list item.  */
    1939              : typedef struct gfc_omp_namelist_udm
    1940              : {
    1941              :   const char *requested_mapper_id;
    1942              :   struct gfc_omp_udm *resolved_udm;
    1943              : }
    1944              : gfc_omp_namelist_udm;
    1945              : #define gfc_get_omp_namelist_udm() XCNEW (gfc_omp_namelist_udm)
    1946              : 
    1947              : 
    1948              : /* The gfc_st_label structure is a BBT attached to a namespace that
    1949              :    records the usage of statement labels within that space.  */
    1950              : 
    1951              : typedef struct gfc_st_label
    1952              : {
    1953              :   BBT_HEADER(gfc_st_label);
    1954              : 
    1955              :   int value;
    1956              : 
    1957              :   gfc_sl_type defined, referenced;
    1958              : 
    1959              :   struct gfc_expr *format;
    1960              : 
    1961              :   tree backend_decl;
    1962              : 
    1963              :   locus where;
    1964              : 
    1965              :   gfc_namespace *ns;
    1966              :   int omp_region;
    1967              : }
    1968              : gfc_st_label;
    1969              : 
    1970              : 
    1971              : /* gfc_interface()-- Interfaces are lists of symbols strung together.  */
    1972              : typedef struct gfc_interface
    1973              : {
    1974              :   struct gfc_symbol *sym;
    1975              :   locus where;
    1976              :   struct gfc_interface *next;
    1977              : }
    1978              : gfc_interface;
    1979              : 
    1980              : #define gfc_get_interface() XCNEW (gfc_interface)
    1981              : 
    1982              : /* User operator nodes.  These are like stripped down symbols.  */
    1983              : typedef struct
    1984              : {
    1985              :   const char *name;
    1986              : 
    1987              :   gfc_interface *op;
    1988              :   struct gfc_namespace *ns;
    1989              :   gfc_access access;
    1990              : }
    1991              : gfc_user_op;
    1992              : 
    1993              : 
    1994              : /* A list of specific bindings that are associated with a generic spec.  */
    1995              : typedef struct gfc_tbp_generic
    1996              : {
    1997              :   /* The parser sets specific_st, upon resolution we look for the corresponding
    1998              :      gfc_typebound_proc and set specific for further use.  */
    1999              :   struct gfc_symtree* specific_st;
    2000              :   struct gfc_typebound_proc* specific;
    2001              : 
    2002              :   struct gfc_tbp_generic* next;
    2003              :   bool is_operator;
    2004              : }
    2005              : gfc_tbp_generic;
    2006              : 
    2007              : #define gfc_get_tbp_generic() XCNEW (gfc_tbp_generic)
    2008              : 
    2009              : 
    2010              : /* Data needed for type-bound procedures.  */
    2011              : typedef struct gfc_typebound_proc
    2012              : {
    2013              :   locus where; /* Where the PROCEDURE/GENERIC definition was.  */
    2014              : 
    2015              :   union
    2016              :   {
    2017              :     struct gfc_symtree* specific; /* The interface if DEFERRED.  */
    2018              :     gfc_tbp_generic* generic;
    2019              :   }
    2020              :   u;
    2021              : 
    2022              :   gfc_access access;
    2023              :   const char* pass_arg; /* Argument-name for PASS.  NULL if not specified.  */
    2024              : 
    2025              :   /* The overridden type-bound proc (or GENERIC with this name in the
    2026              :      parent-type) or NULL if non.  */
    2027              :   struct gfc_typebound_proc* overridden;
    2028              : 
    2029              :   /* Once resolved, we use the position of pass_arg in the formal arglist of
    2030              :      the binding-target procedure to identify it.  The first argument has
    2031              :      number 1 here, the second 2, and so on.  */
    2032              :   unsigned pass_arg_num;
    2033              : 
    2034              :   unsigned nopass:1; /* Whether we have NOPASS (PASS otherwise).  */
    2035              :   unsigned non_overridable:1;
    2036              :   unsigned deferred:1;
    2037              :   unsigned is_generic:1;
    2038              :   unsigned function:1, subroutine:1;
    2039              :   unsigned error:1; /* Ignore it, when an error occurred during resolution.  */
    2040              :   unsigned ppc:1;
    2041              : }
    2042              : gfc_typebound_proc;
    2043              : 
    2044              : #define gfc_get_tbp() XCNEW (gfc_typebound_proc)
    2045              : 
    2046              : /* Symbol nodes.  These are important things.  They are what the
    2047              :    standard refers to as "entities".  The possibly multiple names that
    2048              :    refer to the same entity are accomplished by a binary tree of
    2049              :    symtree structures that is balanced by the red-black method-- more
    2050              :    than one symtree node can point to any given symbol.  */
    2051              : 
    2052              : typedef struct gfc_symbol
    2053              : {
    2054              :   const char *name;     /* Primary name, before renaming */
    2055              :   const char *module;   /* Module this symbol came from */
    2056              :   locus declared_at;
    2057              : 
    2058              :   gfc_typespec ts;
    2059              :   symbol_attribute attr;
    2060              : 
    2061              :   /* The formal member points to the formal argument list if the
    2062              :      symbol is a function or subroutine name.  If the symbol is a
    2063              :      generic name, the generic member points to the list of
    2064              :      interfaces.  */
    2065              : 
    2066              :   gfc_interface *generic;
    2067              :   gfc_access component_access;
    2068              : 
    2069              :   gfc_formal_arglist *formal;
    2070              :   struct gfc_namespace *formal_ns;
    2071              :   struct gfc_namespace *f2k_derived;
    2072              : 
    2073              :   /* List of PDT parameter expressions  */
    2074              :   struct gfc_actual_arglist *param_list;
    2075              :   struct gfc_symbol *template_sym;
    2076              : 
    2077              :   struct gfc_expr *value;       /* Parameter/Initializer value */
    2078              :   gfc_array_spec *as;
    2079              :   struct gfc_symbol *result;    /* function result symbol */
    2080              :   gfc_component *components;    /* Derived type components */
    2081              : 
    2082              :   /* Defined only for Cray pointees; points to their pointer.  */
    2083              :   struct gfc_symbol *cp_pointer;
    2084              : 
    2085              :   int entry_id;                 /* Used in resolve.cc for entries.  */
    2086              : 
    2087              :   /* CLASS hashed name for declared and dynamic types in the class.  */
    2088              :   int hash_value;
    2089              : 
    2090              :   struct gfc_symbol *common_next;       /* Links for COMMON syms */
    2091              : 
    2092              :   /* This is only used for pointer comparisons to check if symbols
    2093              :      are in the same common block.
    2094              :      In opposition to common_block, the common_head pointer takes into account
    2095              :      equivalences: if A is in a common block C and A and B are in equivalence,
    2096              :      then both A and B have common_head pointing to C, while A's common_block
    2097              :      points to C and B's is NULL.  */
    2098              :   struct gfc_common_head* common_head;
    2099              : 
    2100              :   /* Make sure initialization code is generated in the correct order.  */
    2101              :   int decl_order;
    2102              : 
    2103              :   gfc_namelist *namelist, *namelist_tail;
    2104              : 
    2105              :   /* The tlink field is used in the front end to carry the module
    2106              :      declaration of separate module procedures so that the characteristics
    2107              :      can be compared with the corresponding declaration in a submodule. In
    2108              :      translation this field carries a linked list of symbols that require
    2109              :      deferred initialization.  */
    2110              :   struct gfc_symbol *tlink;
    2111              : 
    2112              :   /* Change management fields.  Symbols that might be modified by the
    2113              :      current statement have the mark member nonzero.  Of these symbols,
    2114              :      symbols with old_symbol equal to NULL are symbols created within
    2115              :      the current statement.  Otherwise, old_symbol points to a copy of
    2116              :      the old symbol. gfc_new is used in symbol.cc to flag new symbols.
    2117              :      comp_mark is used to indicate variables which have component accesses
    2118              :      in OpenMP/OpenACC directive clauses (cf. c-typeck.cc:c_finish_omp_clauses,
    2119              :      map_field_head).
    2120              :      data_mark is used to check duplicate mappings for OpenMP data-sharing
    2121              :      clauses (see firstprivate_head/lastprivate_head in the above function).
    2122              :      dev_mark is used to check duplicate mappings for OpenMP
    2123              :      is_device_ptr/has_device_addr clauses (see is_on_device_head in above
    2124              :      function).
    2125              :      gen_mark is used to check duplicate mappings for OpenMP
    2126              :      use_device_ptr/use_device_addr/private/shared clauses (see generic_head in
    2127              :      above function).
    2128              :      reduc_mark is used to check duplicate mappings for OpenMP reduction
    2129              :      clauses.  */
    2130              :   struct gfc_symbol *old_symbol;
    2131              :   unsigned mark:1, comp_mark:1, data_mark:1, dev_mark:1, gen_mark:1;
    2132              :   unsigned reduc_mark:1, gfc_new:1;
    2133              : 
    2134              :   /* Nonzero if all equivalences associated with this symbol have been
    2135              :      processed.  */
    2136              :   unsigned equiv_built:1;
    2137              :   /* Set if this variable is used as an index name in a FORALL.  */
    2138              :   unsigned forall_index:1;
    2139              :   /* Set if the symbol is used in a function result specification .  */
    2140              :   unsigned fn_result_spec:1;
    2141              :   /* Set if the symbol spec. depends on an old-style function result.  */
    2142              :   unsigned fn_result_dep:1;
    2143              :   /* Used to avoid multiple resolutions of a single symbol.  */
    2144              :   /* = 2 if this has already been resolved as an intrinsic,
    2145              :        in gfc_resolve_intrinsic,
    2146              :      = 1 if it has been resolved in resolve_symbol.  */
    2147              :   unsigned resolve_symbol_called:2;
    2148              :   /* Set if this is a module function or subroutine with the
    2149              :      abbreviated declaration in a submodule.  */
    2150              :   unsigned abr_modproc_decl:1;
    2151              :   /* Set if a previous error or warning has occurred and no other
    2152              :      should be reported.  */
    2153              :   unsigned error:1;
    2154              :   /* Set if the dummy argument of a procedure could be an array despite
    2155              :      being called with a scalar actual argument. */
    2156              :   unsigned maybe_array:1;
    2157              :   /* Set if this should be passed by value, but is not a VALUE argument
    2158              :      according to the Fortran standard.  */
    2159              :   unsigned pass_as_value:1;
    2160              :   /* Set if an external dummy argument is called with different argument lists.
    2161              :      This is legal in Fortran, but can cause problems with autogenerated
    2162              :      C prototypes for C23.  */
    2163              :   unsigned ext_dummy_arglist_mismatch:1;
    2164              :   /* Set if the formal arglist has already been resolved, to avoid
    2165              :      trying to generate it again from actual arguments.  */
    2166              :   unsigned formal_resolved:1;
    2167              : 
    2168              :   /* Reference counter, used for memory management.
    2169              : 
    2170              :      Some symbols may be present in more than one namespace, for example
    2171              :      function and subroutine symbols are present both in the outer namespace and
    2172              :      the procedure body namespace.  Freeing symbols with the namespaces they are
    2173              :      in would result in double free for those symbols.  This field counts
    2174              :      references and is used to delay the memory release until the last reference
    2175              :      to the symbol is removed.
    2176              : 
    2177              :      Not every symbol pointer is accounted for reference counting.  Fields
    2178              :      gfc_symtree::n::sym are, and gfc_finalizer::proc_sym as well.  But most of
    2179              :      them (dummy arguments, generic list elements, etc) are "weak" pointers;
    2180              :      the reference count isn't updated when they are assigned, and they are
    2181              :      ignored when the surrounding structure memory is released.  This is not a
    2182              :      problem because there is always a namespace as surrounding context and
    2183              :      symbols have a name they can be referred with in that context, so the
    2184              :      namespace keeps the symbol from being freed, keeping the pointer valid.
    2185              :      When the namespace ceases to exist, and the symbols with it, the other
    2186              :      structures referencing symbols cease to exist as well.  */
    2187              :   int refs;
    2188              : 
    2189              :   struct gfc_namespace *ns;     /* namespace containing this symbol */
    2190              : 
    2191              :   tree backend_decl;
    2192              : 
    2193              :   /* Identity of the intrinsic module the symbol comes from, or
    2194              :      INTMOD_NONE if it's not imported from a intrinsic module.  */
    2195              :   intmod_id from_intmod;
    2196              :   /* Identity of the symbol from intrinsic modules, from enums maintained
    2197              :      separately by each intrinsic module.  Used together with from_intmod,
    2198              :      it uniquely identifies a symbol from an intrinsic module.  */
    2199              :   int intmod_sym_id;
    2200              : 
    2201              :   /* This may be repetitive, since the typespec now has a binding
    2202              :      label field.  */
    2203              :   const char* binding_label;
    2204              :   /* Store a reference to the common_block, if this symbol is in one.  */
    2205              :   struct gfc_common_head *common_block;
    2206              : 
    2207              :   /* Link to corresponding association-list if this is an associate name.  */
    2208              :   struct gfc_association_list *assoc;
    2209              : 
    2210              :   /* Link to next entry in derived type list */
    2211              :   struct gfc_symbol *dt_next;
    2212              : 
    2213              :   /* For when we would like an additional location in an error message.  */
    2214              :   locus other_loc;
    2215              : 
    2216              :   /* For when we would like even one more location. Currently used to store
    2217              :      where a variable is allocated.  */
    2218              :   locus extra_loc;
    2219              : }
    2220              : gfc_symbol;
    2221              : 
    2222              : 
    2223              : struct gfc_undo_change_set
    2224              : {
    2225              :   vec<gfc_symbol *> syms;
    2226              :   vec<gfc_typebound_proc *> tbps;
    2227              :   gfc_undo_change_set *previous;
    2228              : };
    2229              : 
    2230              : 
    2231              : /* This structure is used to keep track of symbols in common blocks.  */
    2232              : typedef struct gfc_common_head
    2233              : {
    2234              :   locus where;
    2235              :   char use_assoc, saved, threadprivate;
    2236              :   unsigned char omp_declare_target : 1;
    2237              :   unsigned char omp_declare_target_link : 1;
    2238              :   unsigned char omp_declare_target_local : 1;
    2239              :   unsigned char omp_groupprivate : 1;
    2240              :   ENUM_BITFIELD (gfc_omp_device_type) omp_device_type:2;
    2241              :   /* Provide sufficient space to hold "symbol.symbol.eq.1234567890".  */
    2242              :   char name[2*GFC_MAX_SYMBOL_LEN + 1 + 14 + 1];
    2243              :   struct gfc_symbol *head;
    2244              :   const char* binding_label;
    2245              :   int is_bind_c;
    2246              :   int refs;
    2247              : }
    2248              : gfc_common_head;
    2249              : 
    2250              : #define gfc_get_common_head() XCNEW (gfc_common_head)
    2251              : 
    2252              : 
    2253              : /* A list of all the alternate entry points for a procedure.  */
    2254              : 
    2255              : typedef struct gfc_entry_list
    2256              : {
    2257              :   /* The symbol for this entry point.  */
    2258              :   gfc_symbol *sym;
    2259              :   /* The zero-based id of this entry point.  */
    2260              :   int id;
    2261              :   /* The LABEL_EXPR marking this entry point.  */
    2262              :   tree label;
    2263              :   /* The next item in the list.  */
    2264              :   struct gfc_entry_list *next;
    2265              : }
    2266              : gfc_entry_list;
    2267              : 
    2268              : #define gfc_get_entry_list() XCNEW (gfc_entry_list)
    2269              : 
    2270              : /* Lists of rename info for the USE statement.  */
    2271              : 
    2272              : typedef struct gfc_use_rename
    2273              : {
    2274              :   char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
    2275              :   struct gfc_use_rename *next;
    2276              :   int found;
    2277              :   gfc_intrinsic_op op;
    2278              :   locus where;
    2279              : }
    2280              : gfc_use_rename;
    2281              : 
    2282              : #define gfc_get_use_rename() XCNEW (gfc_use_rename);
    2283              : 
    2284              : /* A list of all USE statements in a namespace.  */
    2285              : 
    2286              : typedef struct gfc_use_list
    2287              : {
    2288              :   const char *module_name;
    2289              :   const char *submodule_name;
    2290              :   bool intrinsic;
    2291              :   bool non_intrinsic;
    2292              :   bool only_flag;
    2293              :   struct gfc_use_rename *rename;
    2294              :   locus where;
    2295              :   /* Next USE statement.  */
    2296              :   struct gfc_use_list *next;
    2297              : }
    2298              : gfc_use_list;
    2299              : 
    2300              : #define gfc_get_use_list() XCNEW (gfc_use_list)
    2301              : 
    2302              : /* Within a namespace, symbols are pointed to by symtree nodes that
    2303              :    are linked together in a balanced binary tree.  There can be
    2304              :    several symtrees pointing to the same symbol node via USE
    2305              :    statements.  */
    2306              : 
    2307              : typedef struct gfc_symtree
    2308              : {
    2309              :   BBT_HEADER (gfc_symtree);
    2310              :   const char *name;
    2311              :   int ambiguous;
    2312              :   union
    2313              :   {
    2314              :     gfc_symbol *sym;            /* Symbol associated with this node */
    2315              :     gfc_user_op *uop;
    2316              :     gfc_common_head *common;
    2317              :     gfc_typebound_proc *tb;
    2318              :     gfc_omp_udr *omp_udr;
    2319              :     gfc_omp_udm *omp_udm;
    2320              :   }
    2321              :   n;
    2322              :   unsigned import_only:1;
    2323              : }
    2324              : gfc_symtree;
    2325              : 
    2326              : /* A list of all derived types.  */
    2327              : extern gfc_symbol *gfc_derived_types;
    2328              : 
    2329              : typedef struct gfc_oacc_routine_name
    2330              : {
    2331              :   struct gfc_symbol *sym;
    2332              :   struct gfc_omp_clauses *clauses;
    2333              :   struct gfc_oacc_routine_name *next;
    2334              :   locus loc;
    2335              : }
    2336              : gfc_oacc_routine_name;
    2337              : 
    2338              : #define gfc_get_oacc_routine_name() XCNEW (gfc_oacc_routine_name)
    2339              : 
    2340              : /* Node in linked list to see what has already been finalized
    2341              :    earlier.  */
    2342              : 
    2343              : typedef struct gfc_was_finalized {
    2344              :   gfc_expr *e;
    2345              :   gfc_component *c;
    2346              :   struct gfc_was_finalized *next;
    2347              : }
    2348              : gfc_was_finalized;
    2349              : 
    2350              : 
    2351              :   /* Flag F2018 import status */
    2352              : enum importstate
    2353              : { IMPORT_NOT_SET = 0,   /* Default condition.  */
    2354              :   IMPORT_F2008,         /* Old style IMPORT.  */
    2355              :   IMPORT_ONLY,          /* Import list used.  */
    2356              :   IMPORT_NONE,          /* No host association.  Unique in scoping unit.  */
    2357              :   IMPORT_ALL            /* Must be unique in the scoping unit.  */
    2358              : };
    2359              : 
    2360              : 
    2361              : /* A namespace describes the contents of procedure, module, interface block
    2362              :    or BLOCK construct.  */
    2363              : /* ??? Anything else use these?  */
    2364              : 
    2365              : typedef struct gfc_namespace
    2366              : {
    2367              :   /* Tree containing all the symbols in this namespace.  */
    2368              :   gfc_symtree *sym_root;
    2369              :   /* Tree containing all the user-defined operators in the namespace.  */
    2370              :   gfc_symtree *uop_root;
    2371              :   /* Tree containing all the common blocks.  */
    2372              :   gfc_symtree *common_root;
    2373              :   /* Tree containing all the OpenMP user defined reductions.  */
    2374              :   gfc_symtree *omp_udr_root;
    2375              :   /* Tree containing all the OpenMP user defined mappers.  */
    2376              :   gfc_symtree *omp_udm_root;
    2377              : 
    2378              :   /* Tree containing type-bound procedures.  */
    2379              :   gfc_symtree *tb_sym_root;
    2380              :   /* Type-bound user operators.  */
    2381              :   gfc_symtree *tb_uop_root;
    2382              :   /* For derived-types, store type-bound intrinsic operators here.  */
    2383              :   gfc_typebound_proc *tb_op[GFC_INTRINSIC_OPS];
    2384              :   /* Linked list of finalizer procedures.  */
    2385              :   struct gfc_finalizer *finalizers;
    2386              : 
    2387              :   /* If set_flag[letter] is set, an implicit type has been set for letter.  */
    2388              :   int set_flag[GFC_LETTERS];
    2389              :   /* Keeps track of the implicit types associated with the letters.  */
    2390              :   gfc_typespec default_type[GFC_LETTERS];
    2391              :   /* Store the positions of IMPLICIT statements.  */
    2392              :   locus implicit_loc[GFC_LETTERS];
    2393              : 
    2394              :   /* If this is a namespace of a procedure, this points to the procedure.  */
    2395              :   struct gfc_symbol *proc_name;
    2396              :   /* If this is the namespace of a unit which contains executable
    2397              :      code, this points to it.  */
    2398              :   struct gfc_code *code;
    2399              : 
    2400              :   /* Points to the equivalences set up in this namespace.  */
    2401              :   struct gfc_equiv *equiv, *old_equiv;
    2402              : 
    2403              :   /* Points to the equivalence groups produced by trans_common.  */
    2404              :   struct gfc_equiv_list *equiv_lists;
    2405              : 
    2406              :   gfc_interface *op[GFC_INTRINSIC_OPS];
    2407              : 
    2408              :   /* Points to the parent namespace, i.e. the namespace of a module or
    2409              :      procedure in which the procedure belonging to this namespace is
    2410              :      contained. The parent namespace points to this namespace either
    2411              :      directly via CONTAINED, or indirectly via the chain built by
    2412              :      SIBLING.  */
    2413              :   struct gfc_namespace *parent;
    2414              :   /* CONTAINED points to the first contained namespace. Sibling
    2415              :      namespaces are chained via SIBLING.  */
    2416              :   struct gfc_namespace  *contained, *sibling;
    2417              : 
    2418              :   gfc_common_head blank_common;
    2419              :   gfc_access default_access, operator_access[GFC_INTRINSIC_OPS];
    2420              : 
    2421              :   gfc_st_label *st_labels;
    2422              :   /* This list holds information about all the data initializers in
    2423              :      this namespace.  */
    2424              :   struct gfc_data *data, *old_data;
    2425              : 
    2426              :   /* !$ACC DECLARE.  */
    2427              :   gfc_oacc_declare *oacc_declare;
    2428              : 
    2429              :   /* !$ACC ROUTINE clauses.  */
    2430              :   gfc_omp_clauses *oacc_routine_clauses;
    2431              : 
    2432              :   /* !$ACC TASK AFFINITY iterator symbols.  */
    2433              :   gfc_symbol *omp_affinity_iterators;
    2434              : 
    2435              :   /* !$ACC ROUTINE names.  */
    2436              :   gfc_oacc_routine_name *oacc_routine_names;
    2437              : 
    2438              :   gfc_charlen *cl_list;
    2439              : 
    2440              :   gfc_symbol *derived_types;
    2441              : 
    2442              :   int save_all, seen_save, seen_implicit_none;
    2443              : 
    2444              :   /* Normally we don't need to refcount namespaces.  However when we read
    2445              :      a module containing a function with multiple entry points, this
    2446              :      will appear as several functions with the same formal namespace.  */
    2447              :   int refs;
    2448              : 
    2449              :   /* A list of all alternate entry points to this procedure (or NULL).  */
    2450              :   gfc_entry_list *entries;
    2451              : 
    2452              :   /* A list of USE statements in this namespace.  */
    2453              :   gfc_use_list *use_stmts;
    2454              : 
    2455              :   /* Linked list of !$omp declare simd constructs.  */
    2456              :   struct gfc_omp_declare_simd *omp_declare_simd;
    2457              : 
    2458              :   /* Linked list of !$omp declare variant constructs.  */
    2459              :   struct gfc_omp_declare_variant *omp_declare_variant;
    2460              : 
    2461              :   /* OpenMP assumptions and allocate for static/stack vars.  */
    2462              :   struct gfc_omp_assumptions *omp_assumes;
    2463              :   struct gfc_omp_namelist *omp_allocate;
    2464              : 
    2465              :   /* A hash set for the gfc expressions that have already
    2466              :      been finalized in this namespace.  */
    2467              : 
    2468              :   gfc_was_finalized *was_finalized;
    2469              : 
    2470              :   /* Set to 1 if namespace is a BLOCK DATA program unit.  */
    2471              :   unsigned is_block_data:1;
    2472              : 
    2473              :   /* Set to 1 if namespace is an interface body with "IMPORT" used.  */
    2474              :   unsigned has_import_set:1;
    2475              : 
    2476              :   /* Flag F2018 import status */
    2477              :   ENUM_BITFIELD (importstate) import_state :3;
    2478              : 
    2479              : 
    2480              :   /* Set to 1 if the namespace uses "IMPLICIT NONE (export)".  */
    2481              :   unsigned has_implicit_none_export:1;
    2482              : 
    2483              :   /* Set to 1 if resolved has been called for this namespace.
    2484              :      Holds -1 during resolution.  */
    2485              :   signed resolved:2;
    2486              : 
    2487              :   /* Set when resolve_types has been called for this namespace.  */
    2488              :   unsigned types_resolved:1;
    2489              : 
    2490              :   /* Set if the associate_name in a select type statement is an
    2491              :      inferred type.  */
    2492              :   unsigned assoc_name_inferred:1;
    2493              : 
    2494              :   /* Set to 1 if code has been generated for this namespace.  */
    2495              :   unsigned translated:1;
    2496              : 
    2497              :   /* Set to 1 if symbols in this namespace should be 'construct entities',
    2498              :      i.e. for BLOCK local variables.  */
    2499              :   unsigned construct_entities:1;
    2500              : 
    2501              :   /* Set to 1 for !$OMP DECLARE REDUCTION namespaces.  */
    2502              :   unsigned omp_udr_ns:1;
    2503              : 
    2504              :   /* Set to 1 for !$OMP DECLARE MAPPER namespaces.  */
    2505              :   unsigned omp_udm_ns:1;
    2506              : 
    2507              :   /* Set to 1 for !$ACC ROUTINE namespaces.  */
    2508              :   unsigned oacc_routine:1;
    2509              : 
    2510              :   /* Set to 1 if there are any calls to procedures with implicit interface.  */
    2511              :   unsigned implicit_interface_calls:1;
    2512              : 
    2513              :   /* OpenMP requires. */
    2514              :   unsigned omp_requires:8;
    2515              :   unsigned omp_target_seen:1;
    2516              : 
    2517              :   /* Set to 1 if this is an implicit OMP structured block.  */
    2518              :   unsigned omp_structured_block:1;
    2519              : }
    2520              : gfc_namespace;
    2521              : 
    2522              : extern gfc_namespace *gfc_current_ns;
    2523              : extern gfc_namespace *gfc_global_ns_list;
    2524              : 
    2525              : /* Global symbols are symbols of global scope. Currently we only use
    2526              :    this to detect collisions already when parsing.
    2527              :    TODO: Extend to verify procedure calls.  */
    2528              : 
    2529              : enum gfc_symbol_type
    2530              : {
    2531              :   GSYM_UNKNOWN=1, GSYM_PROGRAM, GSYM_FUNCTION, GSYM_SUBROUTINE,
    2532              :   GSYM_MODULE, GSYM_COMMON, GSYM_BLOCK_DATA
    2533              : };
    2534              : 
    2535              : typedef struct gfc_gsymbol
    2536              : {
    2537              :   BBT_HEADER(gfc_gsymbol);
    2538              : 
    2539              :   const char *name;
    2540              :   const char *sym_name;
    2541              :   const char *mod_name;
    2542              :   const char *binding_label;
    2543              :   enum gfc_symbol_type type;
    2544              : 
    2545              :   int defined, used;
    2546              :   bool bind_c;
    2547              :   locus where;
    2548              :   gfc_namespace *ns;
    2549              : }
    2550              : gfc_gsymbol;
    2551              : 
    2552              : extern gfc_gsymbol *gfc_gsym_root;
    2553              : 
    2554              : /* Information on interfaces being built.  */
    2555              : typedef struct
    2556              : {
    2557              :   interface_type type;
    2558              :   gfc_symbol *sym;
    2559              :   gfc_namespace *ns;
    2560              :   gfc_user_op *uop;
    2561              :   gfc_intrinsic_op op;
    2562              : }
    2563              : gfc_interface_info;
    2564              : 
    2565              : extern gfc_interface_info current_interface;
    2566              : 
    2567              : 
    2568              : /* Array reference.  */
    2569              : 
    2570              : enum gfc_array_ref_dimen_type
    2571              : {
    2572              :   DIMEN_ELEMENT = 1, DIMEN_RANGE, DIMEN_VECTOR, DIMEN_STAR, DIMEN_THIS_IMAGE, DIMEN_UNKNOWN
    2573              : };
    2574              : 
    2575              : enum gfc_array_ref_team_type
    2576              : {
    2577              :   TEAM_UNKNOWN = 0, TEAM_UNSET, TEAM_TEAM, TEAM_NUMBER
    2578              : };
    2579              : 
    2580              : typedef struct gfc_array_ref
    2581              : {
    2582              :   ar_type type;
    2583              :   int dimen;                    /* # of components in the reference */
    2584              :   int codimen;
    2585              :   bool in_allocate;             /* For coarray checks. */
    2586              :   enum gfc_array_ref_team_type team_type : 2;
    2587              :   gfc_expr *team;
    2588              :   gfc_expr *stat;
    2589              :   locus where;
    2590              :   gfc_array_spec *as;
    2591              : 
    2592              :   locus c_where[GFC_MAX_DIMENSIONS];    /* All expressions can be NULL */
    2593              :   struct gfc_expr *start[GFC_MAX_DIMENSIONS], *end[GFC_MAX_DIMENSIONS],
    2594              :     *stride[GFC_MAX_DIMENSIONS];
    2595              : 
    2596              :   enum gfc_array_ref_dimen_type dimen_type[GFC_MAX_DIMENSIONS];
    2597              : }
    2598              : gfc_array_ref;
    2599              : 
    2600              : #define gfc_get_array_ref() XCNEW (gfc_array_ref)
    2601              : 
    2602              : 
    2603              : /* Component reference nodes.  A variable is stored as an expression
    2604              :    node that points to the base symbol.  After that, a singly linked
    2605              :    list of component reference nodes gives the variable's complete
    2606              :    resolution.  The array_ref component may be present and comes
    2607              :    before the component component.  */
    2608              : 
    2609              : enum ref_type
    2610              :   { REF_ARRAY, REF_COMPONENT, REF_SUBSTRING, REF_INQUIRY };
    2611              : 
    2612              : enum inquiry_type
    2613              :   { INQUIRY_RE, INQUIRY_IM, INQUIRY_KIND, INQUIRY_LEN };
    2614              : 
    2615              : typedef struct gfc_ref
    2616              : {
    2617              :   ref_type type;
    2618              : 
    2619              :   union
    2620              :   {
    2621              :     struct gfc_array_ref ar;
    2622              : 
    2623              :     struct
    2624              :     {
    2625              :       gfc_component *component;
    2626              :       gfc_symbol *sym;
    2627              :     }
    2628              :     c;
    2629              : 
    2630              :     struct
    2631              :     {
    2632              :       struct gfc_expr *start, *end;     /* Substring */
    2633              :       gfc_charlen *length;
    2634              :     }
    2635              :     ss;
    2636              : 
    2637              :     inquiry_type i;
    2638              : 
    2639              :   }
    2640              :   u;
    2641              : 
    2642              :   struct gfc_ref *next;
    2643              : }
    2644              : gfc_ref;
    2645              : 
    2646              : #define gfc_get_ref() XCNEW (gfc_ref)
    2647              : 
    2648              : 
    2649              : /* Structures representing intrinsic symbols and their arguments lists.  */
    2650              : typedef struct gfc_intrinsic_arg
    2651              : {
    2652              :   char name[GFC_MAX_SYMBOL_LEN + 1];
    2653              : 
    2654              :   gfc_typespec ts;
    2655              :   unsigned optional:1, value:1;
    2656              :   ENUM_BITFIELD (sym_intent) intent:2;
    2657              : 
    2658              :   struct gfc_intrinsic_arg *next;
    2659              : }
    2660              : gfc_intrinsic_arg;
    2661              : 
    2662              : 
    2663              : typedef enum {
    2664              :   GFC_UNDEFINED_DUMMY_ARG = 0,
    2665              :   GFC_INTRINSIC_DUMMY_ARG,
    2666              :   GFC_NON_INTRINSIC_DUMMY_ARG
    2667              : }
    2668              : gfc_dummy_arg_intrinsicness;
    2669              : 
    2670              : /* dummy arg of either an intrinsic or a user-defined procedure.  */
    2671              : struct gfc_dummy_arg
    2672              : {
    2673              :   gfc_dummy_arg_intrinsicness intrinsicness;
    2674              : 
    2675              :   union {
    2676              :     gfc_intrinsic_arg *intrinsic;
    2677              :     gfc_formal_arglist *non_intrinsic;
    2678              :   } u;
    2679              : };
    2680              : 
    2681              : #define gfc_get_dummy_arg() XCNEW (gfc_dummy_arg)
    2682              : 
    2683              : 
    2684              : const char * gfc_dummy_arg_get_name (gfc_dummy_arg &);
    2685              : const gfc_typespec & gfc_dummy_arg_get_typespec (gfc_dummy_arg &);
    2686              : bool gfc_dummy_arg_is_optional (gfc_dummy_arg &);
    2687              : 
    2688              : 
    2689              : /* Specifies the various kinds of check functions used to verify the
    2690              :    argument lists of intrinsic functions. fX with X an integer refer
    2691              :    to check functions of intrinsics with X arguments. f1m is used for
    2692              :    the MAX and MIN intrinsics which can have an arbitrary number of
    2693              :    arguments, f4ml is used for the MINLOC and MAXLOC intrinsics as
    2694              :    these have special semantics.  */
    2695              : 
    2696              : typedef union
    2697              : {
    2698              :   bool (*f0)(void);
    2699              :   bool (*f1)(struct gfc_expr *);
    2700              :   bool (*f1m)(gfc_actual_arglist *);
    2701              :   bool (*f2)(struct gfc_expr *, struct gfc_expr *);
    2702              :   bool (*f3)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
    2703              :   bool (*f5ml)(gfc_actual_arglist *);
    2704              :   bool (*f6fl)(gfc_actual_arglist *);
    2705              :   bool (*f3red)(gfc_actual_arglist *);
    2706              :   bool (*f4)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2707              :             struct gfc_expr *);
    2708              :   bool (*f5)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2709              :             struct gfc_expr *, struct gfc_expr *);
    2710              :   bool (*f6)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2711              :             struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
    2712              : }
    2713              : gfc_check_f;
    2714              : 
    2715              : /* Like gfc_check_f, these specify the type of the simplification
    2716              :    function associated with an intrinsic. The fX are just like in
    2717              :    gfc_check_f. cc is used for type conversion functions.  */
    2718              : 
    2719              : typedef union
    2720              : {
    2721              :   struct gfc_expr *(*f0)(void);
    2722              :   struct gfc_expr *(*f1)(struct gfc_expr *);
    2723              :   struct gfc_expr *(*f2)(struct gfc_expr *, struct gfc_expr *);
    2724              :   struct gfc_expr *(*f3)(struct gfc_expr *, struct gfc_expr *,
    2725              :                          struct gfc_expr *);
    2726              :   struct gfc_expr *(*f4)(struct gfc_expr *, struct gfc_expr *,
    2727              :                          struct gfc_expr *, struct gfc_expr *);
    2728              :   struct gfc_expr *(*f5)(struct gfc_expr *, struct gfc_expr *,
    2729              :                          struct gfc_expr *, struct gfc_expr *,
    2730              :                          struct gfc_expr *);
    2731              :   struct gfc_expr *(*f6)(struct gfc_expr *, struct gfc_expr *,
    2732              :                          struct gfc_expr *, struct gfc_expr *,
    2733              :                          struct gfc_expr *, struct gfc_expr *);
    2734              :   struct gfc_expr *(*cc)(struct gfc_expr *, bt, int);
    2735              : }
    2736              : gfc_simplify_f;
    2737              : 
    2738              : /* Again like gfc_check_f, these specify the type of the resolution
    2739              :    function associated with an intrinsic. The fX are just like in
    2740              :    gfc_check_f. f1m is used for MIN and MAX, s1 is used for abort().  */
    2741              : 
    2742              : typedef union
    2743              : {
    2744              :   void (*f0)(struct gfc_expr *);
    2745              :   void (*f1)(struct gfc_expr *, struct gfc_expr *);
    2746              :   void (*f1m)(struct gfc_expr *, struct gfc_actual_arglist *);
    2747              :   void (*f2)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
    2748              :   void (*f3)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2749              :              struct gfc_expr *);
    2750              :   void (*f4)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2751              :              struct gfc_expr *, struct gfc_expr *);
    2752              :   void (*f5)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2753              :              struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
    2754              :   void (*f6)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2755              :              struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
    2756              :              struct gfc_expr *);
    2757              :   void (*s1)(struct gfc_code *);
    2758              : }
    2759              : gfc_resolve_f;
    2760              : 
    2761              : 
    2762              : typedef struct gfc_intrinsic_sym
    2763              : {
    2764              :   const char *name, *lib_name;
    2765              :   gfc_intrinsic_arg *formal;
    2766              :   gfc_typespec ts;
    2767              :   unsigned elemental:1, inquiry:1, transformational:1, pure:1,
    2768              :     generic:1, specific:1, actual_ok:1, noreturn:1, conversion:1,
    2769              :     from_module:1, vararg:1;
    2770              : 
    2771              :   int standard;
    2772              : 
    2773              :   gfc_simplify_f simplify;
    2774              :   gfc_check_f check;
    2775              :   gfc_resolve_f resolve;
    2776              :   struct gfc_intrinsic_sym *specific_head, *next;
    2777              :   gfc_isym_id id;
    2778              : 
    2779              : }
    2780              : gfc_intrinsic_sym;
    2781              : 
    2782              : 
    2783              : /* Expression nodes.  The expression node types deserve explanations,
    2784              :    since the last couple can be easily misconstrued:
    2785              : 
    2786              :    EXPR_OP         Operator node pointing to one or two other nodes
    2787              :    EXPR_FUNCTION   Function call, symbol points to function's name
    2788              :    EXPR_CONSTANT   A scalar constant: Logical, String, Real, Int or Complex
    2789              :    EXPR_VARIABLE   An Lvalue with a root symbol and possible reference list
    2790              :                    which expresses structure, array and substring refs.
    2791              :    EXPR_NULL       The NULL pointer value (which also has a basic type).
    2792              :    EXPR_SUBSTRING  A substring of a constant string
    2793              :    EXPR_STRUCTURE  A structure constructor
    2794              :    EXPR_ARRAY      An array constructor.
    2795              :    EXPR_COMPCALL   Function (or subroutine) call of a procedure pointer
    2796              :                    component or type-bound procedure.  */
    2797              : 
    2798              : #include <mpfr.h>
    2799              : #include <mpc.h>
    2800              : #define GFC_RND_MODE MPFR_RNDN
    2801              : #define GFC_MPC_RND_MODE MPC_RNDNN
    2802              : 
    2803              : typedef splay_tree gfc_constructor_base;
    2804              : 
    2805              : 
    2806              : /* This should be an unsigned variable of type size_t.  But to handle
    2807              :    compiling to a 64-bit target from a 32-bit host, we need to use a
    2808              :    HOST_WIDE_INT.  Also, occasionally the string length field is used
    2809              :    as a flag with values -1 and -2, see e.g. gfc_add_assign_aux_vars.
    2810              :    So it needs to be signed.  */
    2811              : typedef HOST_WIDE_INT gfc_charlen_t;
    2812              : 
    2813              : typedef struct gfc_expr
    2814              : {
    2815              :   expr_t expr_type;
    2816              : 
    2817              :   gfc_typespec ts;      /* These two refer to the overall expression */
    2818              : 
    2819              :   int rank;             /* 0 indicates a scalar, -1 an assumed-rank array.  */
    2820              :   int corank;           /* same as rank, but for coarrays.  */
    2821              :   mpz_t *shape;         /* Can be NULL if shape is unknown at compile time */
    2822              : 
    2823              :   /* Nonnull for functions and structure constructors, may also used to hold the
    2824              :      base-object for component calls.  */
    2825              :   gfc_symtree *symtree;
    2826              : 
    2827              :   gfc_ref *ref;
    2828              : 
    2829              :   locus where;
    2830              : 
    2831              :   /* Used to store the base expression in component calls, when the expression
    2832              :      is not a variable.  */
    2833              :   struct gfc_expr *base_expr;
    2834              : 
    2835              :   /* is_snan denotes a signalling not-a-number.  */
    2836              :   unsigned int is_snan : 1;
    2837              : 
    2838              :   /* Sometimes, when an error has been emitted, it is necessary to prevent
    2839              :       it from recurring.  */
    2840              :   unsigned int error : 1;
    2841              : 
    2842              :   /* Mark an expression where a user operator has been substituted by
    2843              :      a function call in interface.cc(gfc_extend_expr).  */
    2844              :   unsigned int user_operator : 1;
    2845              : 
    2846              :   /* Mark an expression as being a MOLD argument of ALLOCATE.  */
    2847              :   unsigned int mold : 1;
    2848              : 
    2849              :   /* Will require finalization after use.  */
    2850              :   unsigned int must_finalize : 1;
    2851              : 
    2852              :   /* Set this if no range check should be performed on this expression.  */
    2853              : 
    2854              :   unsigned int no_bounds_check : 1;
    2855              : 
    2856              :   /* Set this if a matmul expression has already been evaluated for conversion
    2857              :      to a BLAS call.  */
    2858              : 
    2859              :   unsigned int external_blas : 1;
    2860              : 
    2861              :   /* Set this if resolution has already happened. It could be harmful
    2862              :      if done again.  */
    2863              : 
    2864              :   unsigned int do_not_resolve_again : 1;
    2865              : 
    2866              :   /* Set this if no warning should be given somewhere in a lower level.  */
    2867              : 
    2868              :   unsigned int do_not_warn : 1;
    2869              : 
    2870              :   /* Set this if the expression came from expanding an array constructor.  */
    2871              :   unsigned int from_constructor : 1;
    2872              : 
    2873              :   /* If an expression comes from a Hollerith constant or compile-time
    2874              :      evaluation of a transfer statement, it may have a prescribed target-
    2875              :      memory representation, and these cannot always be backformed from
    2876              :      the value.  */
    2877              :   struct
    2878              :   {
    2879              :     gfc_charlen_t length;
    2880              :     char *string;
    2881              :   }
    2882              :   representation;
    2883              : 
    2884              :   struct
    2885              :   {
    2886              :     int len;    /* Length of BOZ string without terminating NULL.  */
    2887              :     int rdx;    /* Radix of BOZ.  */
    2888              :     char *str;  /* BOZ string with NULL terminating character.  */
    2889              :   }
    2890              :   boz;
    2891              : 
    2892              :   union
    2893              :   {
    2894              :     int logical;
    2895              : 
    2896              :     io_kind iokind;
    2897              : 
    2898              :     mpz_t integer;
    2899              : 
    2900              :     mpfr_t real;
    2901              : 
    2902              :     mpc_t complex;
    2903              : 
    2904              :     struct
    2905              :     {
    2906              :       gfc_intrinsic_op op;
    2907              :       gfc_user_op *uop;
    2908              :       struct gfc_expr *op1, *op2;
    2909              :     }
    2910              :     op;
    2911              : 
    2912              :     struct
    2913              :     {
    2914              :       gfc_actual_arglist *actual;
    2915              :       const char *name; /* Points to the ultimate name of the function */
    2916              :       gfc_intrinsic_sym *isym;
    2917              :       gfc_symbol *esym;
    2918              :     }
    2919              :     function;
    2920              : 
    2921              :     struct
    2922              :     {
    2923              :       gfc_actual_arglist* actual;
    2924              :       const char* name;
    2925              :       /* Base-object, whose component was called.  NULL means that it should
    2926              :          be taken from symtree/ref.  */
    2927              :       struct gfc_expr* base_object;
    2928              :       gfc_typebound_proc* tbp; /* Should overlap with esym.  */
    2929              : 
    2930              :       /* For type-bound operators, we want to call PASS procedures but already
    2931              :          have the full arglist; mark this, so that it is not extended by the
    2932              :          PASS argument.  */
    2933              :       unsigned ignore_pass:1;
    2934              : 
    2935              :       /* Do assign-calls rather than calls, that is appropriate dependency
    2936              :          checking.  */
    2937              :       unsigned assign:1;
    2938              :     }
    2939              :     compcall;
    2940              : 
    2941              :     struct
    2942              :     {
    2943              :       gfc_charlen_t length;
    2944              :       gfc_char_t *string;
    2945              :     }
    2946              :     character;
    2947              : 
    2948              :     gfc_constructor_base constructor;
    2949              : 
    2950              :     struct
    2951              :     {
    2952              :       struct gfc_expr *condition;
    2953              :       struct gfc_expr *true_expr;
    2954              :       struct gfc_expr *false_expr;
    2955              :     } conditional;
    2956              :   } value;
    2957              : 
    2958              :   /* Used to store PDT expression lists associated with expressions.  */
    2959              :   gfc_actual_arglist *param_list;
    2960              : 
    2961              : }
    2962              : gfc_expr;
    2963              : 
    2964              : 
    2965              : #define gfc_get_shape(rank) (XCNEWVEC (mpz_t, (rank)))
    2966              : 
    2967              : /* Structures for information associated with different kinds of
    2968              :    numbers.  The first set of integer parameters define all there is
    2969              :    to know about a particular kind.  The rest of the elements are
    2970              :    computed from the first elements.  */
    2971              : 
    2972              : typedef struct
    2973              : {
    2974              :   /* Values really representable by the target.  */
    2975              :   mpz_t huge, pedantic_min_int, min_int;
    2976              : 
    2977              :   int kind, radix, digits, bit_size, range;
    2978              : 
    2979              :   /* True if the C type of the given name maps to this precision.
    2980              :      Note that more than one bit can be set.  */
    2981              :   unsigned int c_char : 1;
    2982              :   unsigned int c_short : 1;
    2983              :   unsigned int c_int : 1;
    2984              :   unsigned int c_long : 1;
    2985              :   unsigned int c_long_long : 1;
    2986              : }
    2987              : gfc_integer_info;
    2988              : 
    2989              : extern gfc_integer_info gfc_integer_kinds[];
    2990              : 
    2991              : /* Unsigned numbers, experimental.  */
    2992              : 
    2993              : typedef struct
    2994              : {
    2995              :   mpz_t huge, int_min;
    2996              : 
    2997              :   int kind, radix, digits, bit_size, range;
    2998              : 
    2999              :   /* True if the C type of the given name maps to this precision.  Note that
    3000              :      more than one bit can be set.  We will use this later on.  */
    3001              :   unsigned int c_unsigned_char : 1;
    3002              :   unsigned int c_unsigned_short : 1;
    3003              :   unsigned int c_unsigned_int : 1;
    3004              :   unsigned int c_unsigned_long : 1;
    3005              :   unsigned int c_unsigned_long_long : 1;
    3006              : }
    3007              : gfc_unsigned_info;
    3008              : 
    3009              : extern gfc_unsigned_info gfc_unsigned_kinds[];
    3010              : 
    3011              : typedef struct
    3012              : {
    3013              :   int kind, bit_size;
    3014              : 
    3015              :   /* True if the C++ type bool, C99 type _Bool, maps to this precision.  */
    3016              :   unsigned int c_bool : 1;
    3017              : }
    3018              : gfc_logical_info;
    3019              : 
    3020              : extern gfc_logical_info gfc_logical_kinds[];
    3021              : 
    3022              : 
    3023              : typedef struct
    3024              : {
    3025              :   mpfr_t epsilon, huge, tiny, subnormal;
    3026              :   int kind, abi_kind, radix, digits, min_exponent, max_exponent;
    3027              :   int range, precision;
    3028              : 
    3029              :   /* The precision of the type as reported by GET_MODE_PRECISION.  */
    3030              :   int mode_precision;
    3031              : 
    3032              :   /* True if the C type of the given name maps to this precision.
    3033              :      Note that more than one bit can be set.  */
    3034              :   unsigned int c_float : 1;
    3035              :   unsigned int c_double : 1;
    3036              :   unsigned int c_long_double : 1;
    3037              :   unsigned int c_float128 : 1;
    3038              :   /* True if for _Float128 C23 IEC 60559 *f128 APIs should be used
    3039              :      instead of libquadmath *q APIs.  */
    3040              :   unsigned int use_iec_60559 : 1;
    3041              : }
    3042              : gfc_real_info;
    3043              : 
    3044              : extern gfc_real_info gfc_real_kinds[];
    3045              : 
    3046              : typedef struct
    3047              : {
    3048              :   int kind, bit_size;
    3049              :   const char *name;
    3050              : }
    3051              : gfc_character_info;
    3052              : 
    3053              : extern gfc_character_info gfc_character_kinds[];
    3054              : 
    3055              : 
    3056              : /* Equivalence structures.  Equivalent lvalues are linked along the
    3057              :    *eq pointer, equivalence sets are strung along the *next node.  */
    3058              : typedef struct gfc_equiv
    3059              : {
    3060              :   struct gfc_equiv *next, *eq;
    3061              :   gfc_expr *expr;
    3062              :   const char *module;
    3063              :   int used;
    3064              : }
    3065              : gfc_equiv;
    3066              : 
    3067              : #define gfc_get_equiv() XCNEW (gfc_equiv)
    3068              : 
    3069              : /* Holds a single equivalence member after processing.  */
    3070              : typedef struct gfc_equiv_info
    3071              : {
    3072              :   gfc_symbol *sym;
    3073              :   HOST_WIDE_INT offset;
    3074              :   HOST_WIDE_INT length;
    3075              :   struct gfc_equiv_info *next;
    3076              : } gfc_equiv_info;
    3077              : 
    3078              : /* Holds equivalence groups, after they have been processed.  */
    3079              : typedef struct gfc_equiv_list
    3080              : {
    3081              :   gfc_equiv_info *equiv;
    3082              :   struct gfc_equiv_list *next;
    3083              : } gfc_equiv_list;
    3084              : 
    3085              : /* gfc_case stores the selector list of a case statement.  The *low
    3086              :    and *high pointers can point to the same expression in the case of
    3087              :    a single value.  If *high is NULL, the selection is from *low
    3088              :    upwards, if *low is NULL the selection is *high downwards.
    3089              : 
    3090              :    This structure has separate fields to allow single and double linked
    3091              :    lists of CASEs at the same time.  The single linked list along the NEXT
    3092              :    field is a list of cases for a single CASE label.  The double linked
    3093              :    list along the LEFT/RIGHT fields is used to detect overlap and to
    3094              :    build a table of the cases for SELECT constructs with a CHARACTER
    3095              :    case expression.  */
    3096              : 
    3097              : typedef struct gfc_case
    3098              : {
    3099              :   /* Where we saw this case.  */
    3100              :   locus where;
    3101              :   int n;
    3102              : 
    3103              :   /* Case range values.  If (low == high), it's a single value.  If one of
    3104              :      the labels is NULL, it's an unbounded case.  If both are NULL, this
    3105              :      represents the default case.  */
    3106              :   gfc_expr *low, *high;
    3107              : 
    3108              :   /* Only used for SELECT TYPE.  */
    3109              :   gfc_typespec ts;
    3110              : 
    3111              :   /* Next case label in the list of cases for a single CASE label.  */
    3112              :   struct gfc_case *next;
    3113              : 
    3114              :   /* Used for detecting overlap, and for code generation.  */
    3115              :   struct gfc_case *left, *right;
    3116              : 
    3117              :   /* True if this case label can never be matched.  */
    3118              :   int unreachable;
    3119              : }
    3120              : gfc_case;
    3121              : 
    3122              : #define gfc_get_case() XCNEW (gfc_case)
    3123              : 
    3124              : 
    3125              : /* Annotations for loop constructs.  */
    3126              : typedef struct
    3127              : {
    3128              :   unsigned short unroll;
    3129              :   bool ivdep;
    3130              :   bool vector;
    3131              :   bool novector;
    3132              : }
    3133              : gfc_loop_annot;
    3134              : 
    3135              : 
    3136              : typedef struct
    3137              : {
    3138              :   gfc_expr *var, *start, *end, *step;
    3139              :   gfc_loop_annot annot;
    3140              : }
    3141              : gfc_iterator;
    3142              : 
    3143              : #define gfc_get_iterator() XCNEW (gfc_iterator)
    3144              : 
    3145              : 
    3146              : /* Allocation structure for ALLOCATE, DEALLOCATE and NULLIFY statements.  */
    3147              : 
    3148              : typedef struct gfc_alloc
    3149              : {
    3150              :   gfc_expr *expr;
    3151              :   struct gfc_alloc *next;
    3152              : }
    3153              : gfc_alloc;
    3154              : 
    3155              : #define gfc_get_alloc() XCNEW (gfc_alloc)
    3156              : 
    3157              : 
    3158              : typedef struct
    3159              : {
    3160              :   gfc_expr *unit, *file, *status, *access, *form, *recl,
    3161              :     *blank, *position, *action, *delim, *pad, *iostat, *iomsg, *convert,
    3162              :     *decimal, *encoding, *round, *sign, *asynchronous, *id, *newunit,
    3163              :     *share, *cc;
    3164              :   char readonly;
    3165              :   gfc_st_label *err;
    3166              : }
    3167              : gfc_open;
    3168              : 
    3169              : 
    3170              : typedef struct
    3171              : {
    3172              :   gfc_expr *unit, *status, *iostat, *iomsg;
    3173              :   gfc_st_label *err;
    3174              : }
    3175              : gfc_close;
    3176              : 
    3177              : 
    3178              : typedef struct
    3179              : {
    3180              :   gfc_expr *unit, *iostat, *iomsg;
    3181              :   gfc_st_label *err;
    3182              : }
    3183              : gfc_filepos;
    3184              : 
    3185              : 
    3186              : typedef struct
    3187              : {
    3188              :   gfc_expr *unit, *file, *iostat, *exist, *opened, *number, *named,
    3189              :     *name, *access, *sequential, *direct, *form, *formatted,
    3190              :     *unformatted, *recl, *nextrec, *blank, *position, *action, *read,
    3191              :     *write, *readwrite, *delim, *pad, *iolength, *iomsg, *convert, *strm_pos,
    3192              :     *asynchronous, *decimal, *encoding, *pending, *round, *sign, *size, *id,
    3193              :     *iqstream, *share, *cc;
    3194              : 
    3195              :   gfc_st_label *err;
    3196              : 
    3197              : }
    3198              : gfc_inquire;
    3199              : 
    3200              : 
    3201              : typedef struct
    3202              : {
    3203              :   gfc_expr *unit, *iostat, *iomsg, *id;
    3204              :   gfc_st_label *err, *end, *eor;
    3205              : }
    3206              : gfc_wait;
    3207              : 
    3208              : 
    3209              : typedef struct
    3210              : {
    3211              :   gfc_expr *io_unit, *format_expr, *rec, *advance, *iostat, *size, *iomsg,
    3212              :            *id, *pos, *asynchronous, *blank, *decimal, *delim, *pad, *round,
    3213              :            *sign, *extra_comma, *dt_io_kind, *udtio;
    3214              :   char dec_ext;
    3215              : 
    3216              :   gfc_symbol *namelist;
    3217              :   /* A format_label of `format_asterisk' indicates the "*" format */
    3218              :   gfc_st_label *format_label;
    3219              :   gfc_st_label *err, *end, *eor;
    3220              : 
    3221              :   locus eor_where, end_where, err_where, nml_where;
    3222              : }
    3223              : gfc_dt;
    3224              : 
    3225              : 
    3226              : typedef struct gfc_forall_iterator
    3227              : {
    3228              :   gfc_expr *var, *start, *end, *stride;
    3229              :   gfc_loop_annot annot;
    3230              :   /* index-name shadows a variable from outer scope.  */
    3231              :   bool shadow;
    3232              :   struct gfc_forall_iterator *next;
    3233              : }
    3234              : gfc_forall_iterator;
    3235              : 
    3236              : 
    3237              : /* Linked list to store associations in an ASSOCIATE statement.  */
    3238              : 
    3239              : typedef struct gfc_association_list
    3240              : {
    3241              :   struct gfc_association_list *next;
    3242              : 
    3243              :   /* Whether this is association to a variable that can be changed; otherwise,
    3244              :      it's association to an expression and the name may not be used as
    3245              :      lvalue.  */
    3246              :   unsigned variable:1;
    3247              : 
    3248              :   /* True if this struct is currently only linked to from a gfc_symbol rather
    3249              :      than as part of a real list in gfc_code->ext.block.assoc.  This may
    3250              :      happen for SELECT TYPE temporaries and must be considered
    3251              :      for memory handling.  */
    3252              :   unsigned dangling:1;
    3253              : 
    3254              :   char name[GFC_MAX_SYMBOL_LEN + 1];
    3255              :   gfc_symtree *st; /* Symtree corresponding to name.  */
    3256              :   locus where;
    3257              : 
    3258              :   gfc_expr *target;
    3259              : 
    3260              :   gfc_array_ref *ar;
    3261              : 
    3262              :   /* Used for inferring the derived type of an associate name, whose selector
    3263              :      is a sibling derived type function that has not yet been parsed.  */
    3264              :   gfc_symbol *derived_types;
    3265              :   unsigned inferred_type:1;
    3266              : }
    3267              : gfc_association_list;
    3268              : #define gfc_get_association_list() XCNEW (gfc_association_list)
    3269              : 
    3270              : 
    3271              : /* Executable statements that fill gfc_code structures.  */
    3272              : enum gfc_exec_op
    3273              : {
    3274              :   EXEC_NOP = 1, EXEC_END_NESTED_BLOCK, EXEC_END_BLOCK, EXEC_ASSIGN,
    3275              :   EXEC_LABEL_ASSIGN, EXEC_POINTER_ASSIGN, EXEC_CRITICAL, EXEC_ERROR_STOP,
    3276              :   EXEC_GOTO, EXEC_CALL, EXEC_COMPCALL, EXEC_ASSIGN_CALL, EXEC_RETURN,
    3277              :   EXEC_ENTRY, EXEC_PAUSE, EXEC_STOP, EXEC_CONTINUE, EXEC_INIT_ASSIGN,
    3278              :   EXEC_IF, EXEC_ARITHMETIC_IF, EXEC_DO, EXEC_DO_CONCURRENT, EXEC_DO_WHILE,
    3279              :   EXEC_SELECT, EXEC_BLOCK, EXEC_FORALL, EXEC_WHERE, EXEC_CYCLE, EXEC_EXIT,
    3280              :   EXEC_CALL_PPC, EXEC_ALLOCATE, EXEC_DEALLOCATE, EXEC_END_PROCEDURE,
    3281              :   EXEC_SELECT_TYPE, EXEC_SELECT_RANK, EXEC_SYNC_ALL, EXEC_SYNC_MEMORY,
    3282              :   EXEC_SYNC_IMAGES, EXEC_OPEN, EXEC_CLOSE, EXEC_WAIT,
    3283              :   EXEC_READ, EXEC_WRITE, EXEC_IOLENGTH, EXEC_TRANSFER, EXEC_DT_END,
    3284              :   EXEC_BACKSPACE, EXEC_ENDFILE, EXEC_INQUIRE, EXEC_REWIND, EXEC_FLUSH,
    3285              :   EXEC_FORM_TEAM, EXEC_CHANGE_TEAM, EXEC_END_TEAM, EXEC_SYNC_TEAM,
    3286              :   EXEC_LOCK, EXEC_UNLOCK, EXEC_EVENT_POST, EXEC_EVENT_WAIT, EXEC_FAIL_IMAGE,
    3287              :   EXEC_OACC_KERNELS_LOOP, EXEC_OACC_PARALLEL_LOOP, EXEC_OACC_SERIAL_LOOP,
    3288              :   EXEC_OACC_ROUTINE, EXEC_OACC_PARALLEL, EXEC_OACC_KERNELS, EXEC_OACC_SERIAL,
    3289              :   EXEC_OACC_DATA, EXEC_OACC_HOST_DATA, EXEC_OACC_LOOP, EXEC_OACC_UPDATE,
    3290              :   EXEC_OACC_WAIT, EXEC_OACC_CACHE, EXEC_OACC_ENTER_DATA, EXEC_OACC_EXIT_DATA,
    3291              :   EXEC_OACC_ATOMIC, EXEC_OACC_DECLARE,
    3292              :   EXEC_OACC_INIT, EXEC_OACC_SHUTDOWN, EXEC_OACC_SET,
    3293              :   EXEC_OMP_CRITICAL, EXEC_OMP_FIRST_OPENMP_EXEC = EXEC_OMP_CRITICAL,
    3294              :   EXEC_OMP_DO, EXEC_OMP_FLUSH, EXEC_OMP_MASTER,
    3295              :   EXEC_OMP_ORDERED, EXEC_OMP_PARALLEL, EXEC_OMP_PARALLEL_DO,
    3296              :   EXEC_OMP_PARALLEL_SECTIONS, EXEC_OMP_PARALLEL_WORKSHARE,
    3297              :   EXEC_OMP_SECTIONS, EXEC_OMP_SINGLE, EXEC_OMP_WORKSHARE,
    3298              :   EXEC_OMP_ASSUME, EXEC_OMP_ATOMIC, EXEC_OMP_BARRIER, EXEC_OMP_END_NOWAIT,
    3299              :   EXEC_OMP_END_SINGLE, EXEC_OMP_TASK, EXEC_OMP_TASKWAIT,
    3300              :   EXEC_OMP_TASKYIELD, EXEC_OMP_CANCEL, EXEC_OMP_CANCELLATION_POINT,
    3301              :   EXEC_OMP_TASKGROUP, EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD,
    3302              :   EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_TARGET, EXEC_OMP_TARGET_DATA,
    3303              :   EXEC_OMP_TEAMS, EXEC_OMP_DISTRIBUTE, EXEC_OMP_DISTRIBUTE_SIMD,
    3304              :   EXEC_OMP_DISTRIBUTE_PARALLEL_DO, EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD,
    3305              :   EXEC_OMP_TARGET_TEAMS, EXEC_OMP_TEAMS_DISTRIBUTE,
    3306              :   EXEC_OMP_TEAMS_DISTRIBUTE_SIMD, EXEC_OMP_TARGET_TEAMS_DISTRIBUTE,
    3307              :   EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
    3308              :   EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
    3309              :   EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
    3310              :   EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
    3311              :   EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
    3312              :   EXEC_OMP_TARGET_UPDATE, EXEC_OMP_END_CRITICAL,
    3313              :   EXEC_OMP_TARGET_ENTER_DATA, EXEC_OMP_TARGET_EXIT_DATA,
    3314              :   EXEC_OMP_TARGET_PARALLEL, EXEC_OMP_TARGET_PARALLEL_DO,
    3315              :   EXEC_OMP_TARGET_PARALLEL_DO_SIMD, EXEC_OMP_TARGET_SIMD,
    3316              :   EXEC_OMP_TASKLOOP, EXEC_OMP_TASKLOOP_SIMD, EXEC_OMP_SCAN, EXEC_OMP_DEPOBJ,
    3317              :   EXEC_OMP_PARALLEL_MASTER, EXEC_OMP_PARALLEL_MASTER_TASKLOOP,
    3318              :   EXEC_OMP_PARALLEL_MASTER_TASKLOOP_SIMD, EXEC_OMP_MASTER_TASKLOOP,
    3319              :   EXEC_OMP_MASTER_TASKLOOP_SIMD, EXEC_OMP_LOOP, EXEC_OMP_PARALLEL_LOOP,
    3320              :   EXEC_OMP_TEAMS_LOOP, EXEC_OMP_TARGET_PARALLEL_LOOP,
    3321              :   EXEC_OMP_TARGET_TEAMS_LOOP, EXEC_OMP_MASKED, EXEC_OMP_PARALLEL_MASKED,
    3322              :   EXEC_OMP_PARALLEL_MASKED_TASKLOOP, EXEC_OMP_PARALLEL_MASKED_TASKLOOP_SIMD,
    3323              :   EXEC_OMP_MASKED_TASKLOOP, EXEC_OMP_MASKED_TASKLOOP_SIMD, EXEC_OMP_SCOPE,
    3324              :   EXEC_OMP_UNROLL, EXEC_OMP_TILE, EXEC_OMP_INTEROP, EXEC_OMP_METADIRECTIVE,
    3325              :   EXEC_OMP_ERROR, EXEC_OMP_ALLOCATE, EXEC_OMP_ALLOCATORS, EXEC_OMP_DISPATCH,
    3326              :   EXEC_OMP_LAST_OPENMP_EXEC = EXEC_OMP_DISPATCH
    3327              : };
    3328              : 
    3329              : /* Enum Definition for locality types.  */
    3330              : enum locality_type
    3331              : {
    3332              :   LOCALITY_LOCAL = 0,
    3333              :   LOCALITY_LOCAL_INIT,
    3334              :   LOCALITY_SHARED,
    3335              :   LOCALITY_REDUCE,
    3336              :   LOCALITY_NUM
    3337              : };
    3338              : 
    3339              : struct sync_stat
    3340              : {
    3341              :   gfc_expr *stat, *errmsg;
    3342              : };
    3343              : 
    3344              : typedef struct gfc_code
    3345              : {
    3346              :   gfc_exec_op op;
    3347              : 
    3348              :   struct gfc_code *block, *next;
    3349              :   locus loc;
    3350              : 
    3351              :   gfc_st_label *here, *label1, *label2, *label3;
    3352              :   gfc_symtree *symtree;
    3353              :   gfc_expr *expr1, *expr2, *expr3, *expr4;
    3354              :   /* A name isn't sufficient to identify a subroutine, we need the actual
    3355              :      symbol for the interface definition.
    3356              :   const char *sub_name;  */
    3357              :   gfc_symbol *resolved_sym;
    3358              :   gfc_intrinsic_sym *resolved_isym;
    3359              : 
    3360              :   union
    3361              :   {
    3362              :     gfc_actual_arglist *actual;
    3363              :     gfc_iterator *iterator;
    3364              :     gfc_open *open;
    3365              :     gfc_close *close;
    3366              :     gfc_filepos *filepos;
    3367              :     gfc_inquire *inquire;
    3368              :     gfc_wait *wait;
    3369              :     gfc_dt *dt;
    3370              :     struct gfc_code *which_construct;
    3371              :     gfc_entry_list *entry;
    3372              :     gfc_oacc_declare *oacc_declare;
    3373              :     gfc_omp_clauses *omp_clauses;
    3374              :     const char *omp_name;
    3375              :     gfc_omp_namelist *omp_namelist;
    3376              :     gfc_omp_variant *omp_variants;
    3377              :     bool omp_bool;
    3378              :     int stop_code;
    3379              :     struct sync_stat sync_stat;
    3380              : 
    3381              :     struct
    3382              :     {
    3383              :       gfc_typespec ts;
    3384              :       gfc_alloc *list;
    3385              :       /* Take the array specification from expr3 to allocate arrays
    3386              :          without an explicit array specification.  */
    3387              :       unsigned arr_spec_from_expr3:1;
    3388              :       /* expr3 is not explicit  */
    3389              :       unsigned expr3_not_explicit:1;
    3390              :       struct sync_stat sync_stat;
    3391              :     }
    3392              :     alloc;
    3393              : 
    3394              :     struct
    3395              :     {
    3396              :       gfc_namespace *ns;
    3397              :       gfc_association_list *assoc;
    3398              :       gfc_case *case_list;
    3399              :       struct sync_stat sync_stat;
    3400              :     }
    3401              :     block;
    3402              : 
    3403              :     struct
    3404              :     {
    3405              :       gfc_forall_iterator *forall_iterator;
    3406              :       gfc_expr_list *locality[LOCALITY_NUM];
    3407              :       bool default_none;
    3408              :     }
    3409              :     concur;
    3410              :   }
    3411              :   ext;          /* Points to additional structures required by statement */
    3412              : 
    3413              :   /* Cycle and break labels in constructs.  */
    3414              :   tree cycle_label;
    3415              :   tree exit_label;
    3416              : }
    3417              : gfc_code;
    3418              : 
    3419              : 
    3420              : /* Storage for DATA statements.  */
    3421              : typedef struct gfc_data_variable
    3422              : {
    3423              :   gfc_expr *expr;
    3424              :   gfc_iterator iter;
    3425              :   struct gfc_data_variable *list, *next;
    3426              : }
    3427              : gfc_data_variable;
    3428              : 
    3429              : 
    3430              : typedef struct gfc_data_value
    3431              : {
    3432              :   mpz_t repeat;
    3433              :   gfc_expr *expr;
    3434              :   struct gfc_data_value *next;
    3435              : }
    3436              : gfc_data_value;
    3437              : 
    3438              : 
    3439              : typedef struct gfc_data
    3440              : {
    3441              :   gfc_data_variable *var;
    3442              :   gfc_data_value *value;
    3443              :   locus where;
    3444              : 
    3445              :   struct gfc_data *next;
    3446              : }
    3447              : gfc_data;
    3448              : 
    3449              : 
    3450              : /* Structure for holding compile options */
    3451              : typedef struct
    3452              : {
    3453              :   char *module_dir;
    3454              :   gfc_source_form source_form;
    3455              :   int max_continue_fixed;
    3456              :   int max_continue_free;
    3457              :   int max_identifier_length;
    3458              : 
    3459              :   int max_errors;
    3460              : 
    3461              :   int flag_preprocessed;
    3462              :   int flag_d_lines;
    3463              :   int flag_init_integer;
    3464              :   long flag_init_integer_value;
    3465              :   int flag_init_logical;
    3466              :   int flag_init_character;
    3467              :   char flag_init_character_value;
    3468              :   bool disable_omp_is_initial_device:1;
    3469              :   bool disable_omp_get_initial_device:1;
    3470              :   bool disable_omp_get_num_devices:1;
    3471              :   bool disable_acc_on_device:1;
    3472              : 
    3473              :   int fpe;
    3474              :   int fpe_summary;
    3475              :   int rtcheck;
    3476              : 
    3477              :   int warn_std;
    3478              :   int allow_std;
    3479              : }
    3480              : gfc_option_t;
    3481              : 
    3482              : extern gfc_option_t gfc_option;
    3483              : 
    3484              : /* Constructor nodes for array and structure constructors.  */
    3485              : typedef struct gfc_constructor
    3486              : {
    3487              :   gfc_constructor_base base;
    3488              :   mpz_t offset;               /* Offset within a constructor, used as
    3489              :                                  key within base. */
    3490              : 
    3491              :   gfc_expr *expr;
    3492              :   gfc_iterator *iterator;
    3493              :   locus where;
    3494              : 
    3495              :   union
    3496              :   {
    3497              :      gfc_component *component; /* Record the component being initialized.  */
    3498              :   }
    3499              :   n;
    3500              :   mpz_t repeat; /* Record the repeat number of initial values in data
    3501              :                   statement like "data a/5*10/".  */
    3502              : }
    3503              : gfc_constructor;
    3504              : 
    3505              : 
    3506              : typedef struct iterator_stack
    3507              : {
    3508              :   gfc_symtree *variable;
    3509              :   mpz_t value;
    3510              :   struct iterator_stack *prev;
    3511              : }
    3512              : iterator_stack;
    3513              : extern iterator_stack *iter_stack;
    3514              : 
    3515              : 
    3516              : /* Used for (possibly nested) SELECT TYPE statements.  */
    3517              : typedef struct gfc_select_type_stack
    3518              : {
    3519              :   gfc_symbol *selector;                 /* Current selector variable.  */
    3520              :   gfc_symtree *tmp;                     /* Current temporary variable.  */
    3521              :   struct gfc_select_type_stack *prev;   /* Previous element on stack.  */
    3522              : }
    3523              : gfc_select_type_stack;
    3524              : extern gfc_select_type_stack *select_type_stack;
    3525              : #define gfc_get_select_type_stack() XCNEW (gfc_select_type_stack)
    3526              : 
    3527              : 
    3528              : /* Node in the linked list used for storing finalizer procedures.  */
    3529              : 
    3530              : typedef struct gfc_finalizer
    3531              : {
    3532              :   struct gfc_finalizer* next;
    3533              :   locus where; /* Where the FINAL declaration occurred.  */
    3534              : 
    3535              :   /* Up to resolution, we want the gfc_symbol, there we lookup the corresponding
    3536              :      symtree and later need only that.  This way, we can access and call the
    3537              :      finalizers from every context as they should be "always accessible".  I
    3538              :      don't make this a union because we need the information whether proc_sym is
    3539              :      still referenced or not for dereferencing it on deleting a gfc_finalizer
    3540              :      structure.  */
    3541              :   gfc_symbol*  proc_sym;
    3542              :   gfc_symtree* proc_tree;
    3543              : }
    3544              : gfc_finalizer;
    3545              : #define gfc_get_finalizer() XCNEW (gfc_finalizer)
    3546              : 
    3547              : 
    3548              : /************************ Function prototypes *************************/
    3549              : 
    3550              : 
    3551              : /* Returns true if the type specified in TS is a character type whose length
    3552              :    is the constant one.  Otherwise returns false.  */
    3553              : 
    3554              : inline bool
    3555        22428 : gfc_length_one_character_type_p (gfc_typespec *ts)
    3556              : {
    3557        22428 :   return ts->type == BT_CHARACTER
    3558          763 :          && ts->u.cl
    3559          763 :          && ts->u.cl->length
    3560          762 :          && ts->u.cl->length->expr_type == EXPR_CONSTANT
    3561          762 :          && ts->u.cl->length->ts.type == BT_INTEGER
    3562        23190 :          && mpz_cmp_ui (ts->u.cl->length->value.integer, 1) == 0;
    3563              : }
    3564              : 
    3565              : /* decl.cc */
    3566              : bool gfc_in_match_data (void);
    3567              : match gfc_match_char_spec (gfc_typespec *);
    3568              : extern int directive_unroll;
    3569              : extern bool directive_ivdep;
    3570              : extern bool directive_vector;
    3571              : extern bool directive_novector;
    3572              : 
    3573              : /* SIMD clause enum.  */
    3574              : enum gfc_simd_clause
    3575              : {
    3576              :   SIMD_NONE = (1 << 0),
    3577              :   SIMD_INBRANCH = (1 << 1),
    3578              :   SIMD_NOTINBRANCH = (1 << 2)
    3579              : };
    3580              : 
    3581              : /* Tuple for parsing of vectorized built-ins.  */
    3582              : struct gfc_vect_builtin_tuple
    3583              : {
    3584              :   gfc_vect_builtin_tuple (const char *n, gfc_simd_clause t)
    3585              :     : name (n), simd_type (t) {}
    3586              : 
    3587              :   const char *name;
    3588              :   gfc_simd_clause simd_type;
    3589              : };
    3590              : 
    3591              : /* Map of middle-end built-ins that should be vectorized.  */
    3592              : extern hash_map<nofree_string_hash, int> *gfc_vectorized_builtins;
    3593              : 
    3594              : /* Handling Parameterized Derived Types  */
    3595              : bool gfc_insert_parameter_exprs (gfc_expr *, gfc_actual_arglist *);
    3596              : void gfc_correct_parm_expr (gfc_symbol *, gfc_expr **);
    3597              : match gfc_get_pdt_instance (gfc_actual_arglist *, gfc_symbol **,
    3598              :                             gfc_actual_arglist **);
    3599              : 
    3600              : 
    3601              : /* Given a symbol, test whether it is a module procedure in a submodule */
    3602              : #define gfc_submodule_procedure(attr)                                \
    3603              :   (gfc_state_stack->previous && gfc_state_stack->previous->previous  \
    3604              :    && gfc_state_stack->previous->previous->state == COMP_SUBMODULE   \
    3605              :    && attr->module_procedure)
    3606              : 
    3607              : /* scanner.cc */
    3608              : void gfc_scanner_done_1 (void);
    3609              : void gfc_scanner_init_1 (void);
    3610              : 
    3611              : void gfc_add_include_path (const char *, bool, bool, bool, bool);
    3612              : void gfc_add_intrinsic_modules_path (const char *);
    3613              : void gfc_release_include_path (void);
    3614              : void gfc_check_include_dirs (bool);
    3615              : FILE *gfc_open_included_file (const char *, bool, bool);
    3616              : 
    3617              : bool gfc_at_end (void);
    3618              : bool gfc_at_eof (void);
    3619              : bool gfc_at_bol (void);
    3620              : bool gfc_at_eol (void);
    3621              : void gfc_advance_line (void);
    3622              : bool gfc_define_undef_line (void);
    3623              : 
    3624              : bool gfc_wide_is_printable (gfc_char_t);
    3625              : bool gfc_wide_is_digit (gfc_char_t);
    3626              : bool gfc_wide_fits_in_byte (gfc_char_t);
    3627              : gfc_char_t gfc_wide_tolower (gfc_char_t);
    3628              : gfc_char_t gfc_wide_toupper (gfc_char_t);
    3629              : size_t gfc_wide_strlen (const gfc_char_t *);
    3630              : int gfc_wide_strncasecmp (const gfc_char_t *, const char *, size_t);
    3631              : gfc_char_t *gfc_wide_memset (gfc_char_t *, gfc_char_t, size_t);
    3632              : char *gfc_widechar_to_char (const gfc_char_t *, int);
    3633              : gfc_char_t *gfc_char_to_widechar (const char *);
    3634              : 
    3635              : #define gfc_get_wide_string(n) XCNEWVEC (gfc_char_t, n)
    3636              : 
    3637              : void gfc_skip_comments (void);
    3638              : gfc_char_t gfc_next_char_literal (gfc_instring);
    3639              : gfc_char_t gfc_next_char (void);
    3640              : char gfc_next_ascii_char (void);
    3641              : gfc_char_t gfc_peek_char (void);
    3642              : char gfc_peek_ascii_char (void);
    3643              : void gfc_error_recovery (void);
    3644              : void gfc_gobble_whitespace (void);
    3645              : void gfc_new_file (void);
    3646              : const char * gfc_read_orig_filename (const char *, const char **);
    3647              : 
    3648              : extern gfc_source_form gfc_current_form;
    3649              : extern const char *gfc_source_file;
    3650              : extern locus gfc_current_locus;
    3651              : 
    3652              : void gfc_start_source_files (void);
    3653              : void gfc_end_source_files (void);
    3654              : 
    3655              : /* misc.cc */
    3656              : void gfc_clear_ts (gfc_typespec *);
    3657              : FILE *gfc_open_file (const char *);
    3658              : const char *gfc_basic_typename (bt);
    3659              : const char *gfc_dummy_typename (gfc_typespec *);
    3660              : const char *gfc_typename (gfc_typespec *, bool for_hash = false);
    3661              : const char *gfc_typename (gfc_expr *);
    3662              : const char *gfc_op2string (gfc_intrinsic_op);
    3663              : const char *gfc_code2string (const mstring *, int);
    3664              : int gfc_string2code (const mstring *, const char *);
    3665              : const char *gfc_intent_string (sym_intent);
    3666              : 
    3667              : void gfc_init_1 (void);
    3668              : void gfc_init_2 (void);
    3669              : void gfc_done_1 (void);
    3670              : void gfc_done_2 (void);
    3671              : 
    3672              : int get_c_kind (const char *, CInteropKind_t *);
    3673              : 
    3674              : const char * gfc_var_name_for_select_type_temp (gfc_expr *);
    3675              : 
    3676              : const char *gfc_closest_fuzzy_match (const char *, char **);
    3677              : inline void
    3678         1249 : vec_push (char **&optr, size_t &osz, const char *elt)
    3679              : {
    3680              :   /* {auto,}vec.safe_push () replacement.  Don't ask..  */
    3681              :   // if (strlen (elt) < 4) return; premature optimization: eliminated by cutoff
    3682         1249 :   optr = XRESIZEVEC (char *, optr, osz + 2);
    3683         1249 :   optr[osz] =
    3684              : #ifdef __cplusplus
    3685              :     const_cast<char *> (elt);
    3686              : #else
    3687              :     (__extension__ (union {const char *_q; const char *_nq;})(elt))._nq;
    3688              : #endif
    3689         1249 :   optr[++osz] = NULL;
    3690         1249 : }
    3691              : 
    3692              : HOST_WIDE_INT gfc_mpz_get_hwi (mpz_t);
    3693              : void gfc_mpz_set_hwi (mpz_t, const HOST_WIDE_INT);
    3694              : 
    3695              : /* options.cc */
    3696              : unsigned int gfc_option_lang_mask (void);
    3697              : void gfc_init_options_struct (struct gcc_options *);
    3698              : void gfc_init_options (unsigned int,
    3699              :                        struct cl_decoded_option *);
    3700              : bool gfc_handle_option (size_t, const char *, HOST_WIDE_INT, int, location_t,
    3701              :                         const struct cl_option_handlers *);
    3702              : bool gfc_post_options (const char **);
    3703              : char *gfc_get_option_string (void);
    3704              : 
    3705              : /* f95-lang.cc */
    3706              : void gfc_maybe_initialize_eh (void);
    3707              : 
    3708              : /* iresolve.cc */
    3709              : const char * gfc_get_string (const char *, ...) ATTRIBUTE_PRINTF_1;
    3710              : bool gfc_find_sym_in_expr (gfc_symbol *, gfc_expr *);
    3711              : 
    3712              : /* error.cc */
    3713              : locus gfc_get_location_range (locus *, unsigned, locus *, unsigned, locus *);
    3714              : location_t gfc_get_location_with_offset (locus *, unsigned);
    3715              : inline location_t
    3716      3842709 : gfc_get_location (locus *loc)
    3717              : {
    3718      3842638 :   return gfc_get_location_with_offset (loc, 0);
    3719              : }
    3720              : 
    3721              : void gfc_error_init_1 (void);
    3722              : void gfc_diagnostics_init (void);
    3723              : void gfc_diagnostics_finish (void);
    3724              : void gfc_buffer_error (bool);
    3725              : 
    3726              : const char *gfc_print_wide_char (gfc_char_t);
    3727              : 
    3728              : bool gfc_warning (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
    3729              : bool gfc_warning_now (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
    3730              : bool gfc_warning_internal (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
    3731              : bool gfc_warning_now_at (location_t loc, int opt, const char *gmsgid, ...)
    3732              :   ATTRIBUTE_GCC_GFC(3,4);
    3733              : 
    3734              : void gfc_clear_warning (void);
    3735              : void gfc_warning_check (void);
    3736              : 
    3737              : void gfc_error_opt (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
    3738              : void gfc_error (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
    3739              : void gfc_error_now (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
    3740              : void gfc_fatal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);
    3741              : void gfc_internal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);
    3742              : void gfc_clear_error (void);
    3743              : bool gfc_error_check (void);
    3744              : bool gfc_error_flag_test (void);
    3745              : bool gfc_buffered_p (void);
    3746              : 
    3747              : notification gfc_notification_std (int);
    3748              : bool gfc_notify_std (int, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
    3749              : 
    3750              : /* A general purpose syntax error.  */
    3751              : #define gfc_syntax_error(ST)    \
    3752              :   gfc_error ("Syntax error in %s statement at %C", gfc_ascii_statement (ST));
    3753              : 
    3754              : #include "diagnostics/buffering.h"  /* For diagnostics::buffer.  */
    3755      8665424 : struct gfc_error_buffer
    3756              : {
    3757              :   bool flag;
    3758              :   diagnostics::buffer buffer;
    3759              : 
    3760              :   gfc_error_buffer();
    3761              : };
    3762              : 
    3763              : void gfc_push_error (gfc_error_buffer *);
    3764              : void gfc_pop_error (gfc_error_buffer *);
    3765              : void gfc_free_error (gfc_error_buffer *);
    3766              : 
    3767              : void gfc_get_errors (int *, int *);
    3768              : void gfc_errors_to_warnings (bool);
    3769              : 
    3770              : /* arith.cc */
    3771              : void gfc_arith_init_1 (void);
    3772              : void gfc_arith_done_1 (void);
    3773              : arith gfc_check_integer_range (mpz_t p, int kind);
    3774              : arith gfc_check_unsigned_range (mpz_t p, int kind);
    3775              : bool gfc_check_character_range (gfc_char_t, int);
    3776              : const char *gfc_arith_error (arith);
    3777              : void gfc_reduce_unsigned (gfc_expr *e);
    3778              : 
    3779              : extern bool gfc_seen_div0;
    3780              : 
    3781              : /* trans-types.cc */
    3782              : int gfc_validate_kind (bt, int, bool);
    3783              : int gfc_get_int_kind_from_width_isofortranenv (int size);
    3784              : int gfc_get_uint_kind_from_width_isofortranenv (int size);
    3785              : int gfc_get_real_kind_from_width_isofortranenv (int size);
    3786              : tree gfc_get_union_type (gfc_symbol *);
    3787              : tree gfc_get_derived_type (gfc_symbol * derived, int codimen = 0);
    3788              : extern int gfc_index_integer_kind;
    3789              : extern int gfc_default_integer_kind;
    3790              : extern int gfc_default_unsigned_kind;
    3791              : extern int gfc_max_integer_kind;
    3792              : extern int gfc_default_real_kind;
    3793              : extern int gfc_default_double_kind;
    3794              : extern int gfc_default_character_kind;
    3795              : extern int gfc_default_logical_kind;
    3796              : extern int gfc_default_complex_kind;
    3797              : extern int gfc_c_int_kind;
    3798              : extern int gfc_c_uint_kind;
    3799              : extern int gfc_c_intptr_kind;
    3800              : extern int gfc_atomic_int_kind;
    3801              : extern int gfc_atomic_logical_kind;
    3802              : extern int gfc_intio_kind;
    3803              : extern int gfc_charlen_int_kind;
    3804              : extern int gfc_size_kind;
    3805              : extern int gfc_numeric_storage_size;
    3806              : extern int gfc_character_storage_size;
    3807              : 
    3808              : #define gfc_logical_4_kind 4
    3809              : #define gfc_integer_4_kind 4
    3810              : #define gfc_real_4_kind 4
    3811              : 
    3812              : #define gfc_integer_8_kind 8
    3813              : 
    3814              : /* symbol.cc */
    3815              : void gfc_clear_new_implicit (void);
    3816              : bool gfc_add_new_implicit_range (int, int);
    3817              : bool gfc_merge_new_implicit (gfc_typespec *);
    3818              : void gfc_set_implicit_none (bool, bool, locus *);
    3819              : void gfc_check_function_type (gfc_namespace *);
    3820              : bool gfc_is_intrinsic_typename (const char *);
    3821              : bool gfc_check_conflict (symbol_attribute *, const char *, locus *);
    3822              : 
    3823              : gfc_typespec *gfc_get_default_type (const char *, gfc_namespace *);
    3824              : bool gfc_set_default_type (gfc_symbol *, int, gfc_namespace *);
    3825              : 
    3826              : void gfc_set_sym_referenced (gfc_symbol *);
    3827              : 
    3828              : bool gfc_add_attribute (symbol_attribute *, locus *);
    3829              : bool gfc_add_ext_attribute (symbol_attribute *, ext_attr_id_t, locus *);
    3830              : bool gfc_add_allocatable (symbol_attribute *, locus *);
    3831              : bool gfc_add_codimension (symbol_attribute *, const char *, locus *);
    3832              : bool gfc_add_contiguous (symbol_attribute *, const char *, locus *);
    3833              : bool gfc_add_dimension (symbol_attribute *, const char *, locus *);
    3834              : bool gfc_add_external (symbol_attribute *, locus *);
    3835              : bool gfc_add_intrinsic (symbol_attribute *, locus *);
    3836              : bool gfc_add_optional (symbol_attribute *, locus *);
    3837              : bool gfc_add_kind (symbol_attribute *, locus *);
    3838              : bool gfc_add_len (symbol_attribute *, locus *);
    3839              : bool gfc_add_pointer (symbol_attribute *, locus *);
    3840              : bool gfc_add_cray_pointer (symbol_attribute *, locus *);
    3841              : bool gfc_add_cray_pointee (symbol_attribute *, locus *);
    3842              : match gfc_mod_pointee_as (gfc_array_spec *);
    3843              : bool gfc_add_protected (symbol_attribute *, const char *, locus *);
    3844              : bool gfc_add_result (symbol_attribute *, const char *, locus *);
    3845              : bool gfc_add_automatic (symbol_attribute *, const char *, locus *);
    3846              : bool gfc_add_save (symbol_attribute *, save_state, const char *, locus *);
    3847              : bool gfc_add_threadprivate (symbol_attribute *, const char *, locus *);
    3848              : bool gfc_add_omp_declare_target (symbol_attribute *, const char *, locus *);
    3849              : bool gfc_add_omp_declare_target_link (symbol_attribute *, const char *,
    3850              :                                       locus *);
    3851              : bool gfc_add_omp_declare_target_local (symbol_attribute *, const char *,
    3852              :                                        locus *);
    3853              : bool gfc_add_omp_groupprivate (symbol_attribute *, const char *, locus *);
    3854              : bool gfc_add_target (symbol_attribute *, locus *);
    3855              : bool gfc_add_dummy (symbol_attribute *, const char *, locus *);
    3856              : bool gfc_add_generic (symbol_attribute *, const char *, locus *);
    3857              : bool gfc_add_in_common (symbol_attribute *, const char *, locus *);
    3858              : bool gfc_add_in_equivalence (symbol_attribute *, const char *, locus *);
    3859              : bool gfc_add_data (symbol_attribute *, const char *, locus *);
    3860              : bool gfc_add_in_namelist (symbol_attribute *, const char *, locus *);
    3861              : bool gfc_add_sequence (symbol_attribute *, const char *, locus *);
    3862              : bool gfc_add_elemental (symbol_attribute *, locus *);
    3863              : bool gfc_add_pure (symbol_attribute *, locus *);
    3864              : bool gfc_add_recursive (symbol_attribute *, locus *);
    3865              : bool gfc_add_function (symbol_attribute *, const char *, locus *);
    3866              : bool gfc_add_subroutine (symbol_attribute *, const char *, locus *);
    3867              : bool gfc_add_volatile (symbol_attribute *, const char *, locus *);
    3868              : bool gfc_add_asynchronous (symbol_attribute *, const char *, locus *);
    3869              : bool gfc_add_proc (symbol_attribute *attr, const char *name, locus *where);
    3870              : bool gfc_add_abstract (symbol_attribute* attr, locus* where);
    3871              : 
    3872              : bool gfc_add_access (symbol_attribute *, gfc_access, const char *, locus *);
    3873              : bool gfc_add_is_bind_c (symbol_attribute *, const char *, locus *, int);
    3874              : bool gfc_add_extension (symbol_attribute *, locus *);
    3875              : bool gfc_add_value (symbol_attribute *, const char *, locus *);
    3876              : bool gfc_add_flavor (symbol_attribute *, sym_flavor, const char *, locus *);
    3877              : bool gfc_add_entry (symbol_attribute *, const char *, locus *);
    3878              : bool gfc_add_procedure (symbol_attribute *, procedure_type,
    3879              :                        const char *, locus *);
    3880              : bool gfc_add_intent (symbol_attribute *, sym_intent, locus *);
    3881              : bool gfc_add_explicit_interface (gfc_symbol *, ifsrc,
    3882              :                                 gfc_formal_arglist *, locus *);
    3883              : bool gfc_add_type (gfc_symbol *, gfc_typespec *, locus *);
    3884              : 
    3885              : void gfc_clear_attr (symbol_attribute *);
    3886              : bool gfc_missing_attr (symbol_attribute *, locus *);
    3887              : bool gfc_copy_attr (symbol_attribute *, symbol_attribute *, locus *);
    3888              : int gfc_copy_dummy_sym (gfc_symbol **, gfc_symbol *, int);
    3889              : bool gfc_add_component (gfc_symbol *, const char *, gfc_component **);
    3890              : void gfc_free_component (gfc_component *);
    3891              : gfc_symbol *gfc_use_derived (gfc_symbol *);
    3892              : gfc_component *gfc_find_component (gfc_symbol *, const char *, bool, bool,
    3893              :                                    gfc_ref **);
    3894              : int gfc_find_derived_types (gfc_symbol *, gfc_namespace *, const char *,
    3895              :                             bool stash = false);
    3896              : 
    3897              : gfc_st_label *gfc_get_st_label (int);
    3898              : void gfc_free_st_label (gfc_st_label *);
    3899              : void gfc_define_st_label (gfc_st_label *, gfc_sl_type, locus *);
    3900              : bool gfc_reference_st_label (gfc_st_label *, gfc_sl_type);
    3901              : gfc_st_label *gfc_rebind_label (gfc_st_label *, int);
    3902              : 
    3903              : gfc_namespace *gfc_get_namespace (gfc_namespace *, int);
    3904              : gfc_symtree *gfc_new_symtree (gfc_symtree **, const char *);
    3905              : void gfc_delete_symtree (gfc_symtree **, const char *);
    3906              : gfc_symtree *gfc_find_symtree (gfc_symtree *, const char *);
    3907              : gfc_symtree *gfc_get_unique_symtree (gfc_namespace *);
    3908              : gfc_user_op *gfc_get_uop (const char *);
    3909              : gfc_user_op *gfc_find_uop (const char *, gfc_namespace *);
    3910              : void gfc_free_symbol (gfc_symbol *&);
    3911              : bool gfc_release_symbol (gfc_symbol *&);
    3912              : gfc_symbol *gfc_new_symbol (const char *, gfc_namespace *, locus * = NULL);
    3913              : gfc_symtree* gfc_find_symtree_in_proc (const char *, gfc_namespace *);
    3914              : int gfc_find_symbol (const char *, gfc_namespace *, int, gfc_symbol **);
    3915              : bool gfc_find_sym_tree (const char *, gfc_namespace *, int, gfc_symtree **);
    3916              : int gfc_get_symbol (const char *, gfc_namespace *, gfc_symbol **,
    3917              :                     locus * = NULL);
    3918              : bool gfc_find_symbol_by_name (const char *, gfc_namespace *,
    3919              :                                     gfc_symbol **);
    3920              : bool gfc_verify_c_interop (gfc_typespec *);
    3921              : bool gfc_verify_c_interop_param (gfc_symbol *);
    3922              : bool verify_bind_c_sym (gfc_symbol *, gfc_typespec *, int, gfc_common_head *);
    3923              : bool verify_bind_c_derived_type (gfc_symbol *);
    3924              : bool verify_com_block_vars_c_interop (gfc_common_head *);
    3925              : gfc_symtree *generate_isocbinding_symbol (const char *, iso_c_binding_symbol,
    3926              :                                           const char *, gfc_symtree *, bool);
    3927              : void gfc_save_symbol_data (gfc_symbol *);
    3928              : int gfc_get_sym_tree (const char *, gfc_namespace *, gfc_symtree **, bool,
    3929              :                      locus * = NULL);
    3930              : int gfc_get_ha_symbol (const char *, gfc_symbol **, locus * = NULL);
    3931              : int gfc_get_ha_sym_tree (const char *, gfc_symtree **, locus * = NULL);
    3932              : 
    3933              : void gfc_drop_last_undo_checkpoint (void);
    3934              : void gfc_restore_last_undo_checkpoint (void);
    3935              : void gfc_undo_symbols (void);
    3936              : void gfc_commit_symbols (void);
    3937              : void gfc_commit_symbol (gfc_symbol *);
    3938              : gfc_charlen *gfc_new_charlen (gfc_namespace *, gfc_charlen *);
    3939              : void gfc_free_namespace (gfc_namespace *&);
    3940              : 
    3941              : void gfc_symbol_init_2 (void);
    3942              : void gfc_symbol_done_2 (void);
    3943              : 
    3944              : void gfc_traverse_symtree (gfc_symtree *, void (*)(gfc_symtree *));
    3945              : void gfc_traverse_ns (gfc_namespace *, void (*)(gfc_symbol *));
    3946              : void gfc_traverse_user_op (gfc_namespace *, void (*)(gfc_user_op *));
    3947              : void gfc_save_all (gfc_namespace *);
    3948              : 
    3949              : void gfc_enforce_clean_symbol_state (void);
    3950              : 
    3951              : gfc_gsymbol *gfc_get_gsymbol (const char *, bool bind_c);
    3952              : gfc_gsymbol *gfc_find_gsymbol (gfc_gsymbol *, const char *);
    3953              : gfc_gsymbol *gfc_find_case_gsymbol (gfc_gsymbol *, const char *);
    3954              : void gfc_traverse_gsymbol (gfc_gsymbol *, void (*)(gfc_gsymbol *, void *), void *);
    3955              : 
    3956              : gfc_typebound_proc* gfc_get_typebound_proc (gfc_typebound_proc*);
    3957              : gfc_symbol* gfc_get_derived_super_type (gfc_symbol*);
    3958              : bool gfc_type_is_extension_of (gfc_symbol *, gfc_symbol *);
    3959              : bool gfc_pdt_is_instance_of (gfc_symbol *, gfc_symbol *);
    3960              : bool gfc_type_compatible (gfc_typespec *, gfc_typespec *);
    3961              : 
    3962              : void gfc_copy_formal_args_intr (gfc_symbol *, gfc_intrinsic_sym *,
    3963              :                                 gfc_actual_arglist *, bool copy_type = false);
    3964              : 
    3965              : void gfc_free_finalizer (gfc_finalizer *el); /* Needed in resolve.cc, too  */
    3966              : 
    3967              : bool gfc_check_symbol_typed (gfc_symbol*, gfc_namespace*, bool, locus);
    3968              : gfc_namespace* gfc_find_proc_namespace (gfc_namespace*);
    3969              : 
    3970              : bool gfc_is_associate_pointer (gfc_symbol*);
    3971              : gfc_symbol * gfc_find_dt_in_generic (gfc_symbol *);
    3972              : gfc_formal_arglist *gfc_sym_get_dummy_args (gfc_symbol *);
    3973              : 
    3974              : gfc_namespace * gfc_get_procedure_ns (gfc_symbol *);
    3975              : gfc_namespace * gfc_get_spec_ns (gfc_symbol *);
    3976              : 
    3977              : /* intrinsic.cc -- true if working in an init-expr, false otherwise.  */
    3978              : extern bool gfc_init_expr_flag;
    3979              : 
    3980              : /* Given a symbol that we have decided is intrinsic, mark it as such
    3981              :    by placing it into a special module that is otherwise impossible to
    3982              :    read or write.  */
    3983              : 
    3984              : #define gfc_intrinsic_symbol(SYM) SYM->module = gfc_get_string ("(intrinsic)")
    3985              : 
    3986              : void gfc_intrinsic_init_1 (void);
    3987              : void gfc_intrinsic_done_1 (void);
    3988              : 
    3989              : char gfc_type_letter (bt, bool logical_equals_int = false);
    3990              : int gfc_type_abi_kind (bt, int);
    3991              : inline int
    3992     16150163 : gfc_type_abi_kind (gfc_typespec *ts)
    3993              : {
    3994     16150163 :   return gfc_type_abi_kind (ts->type, ts->kind);
    3995              : }
    3996              : gfc_symbol * gfc_get_intrinsic_sub_symbol (const char *);
    3997              : gfc_symbol *gfc_get_intrinsic_function_symbol (gfc_expr *);
    3998              : gfc_symbol *gfc_find_intrinsic_symbol (gfc_expr *);
    3999              : bool gfc_convert_type (gfc_expr *, gfc_typespec *, int);
    4000              : bool gfc_convert_type_warn (gfc_expr *, gfc_typespec *, int, int,
    4001              :                             bool array = false);
    4002              : bool gfc_convert_chartype (gfc_expr *, gfc_typespec *);
    4003              : bool gfc_generic_intrinsic (const char *);
    4004              : bool gfc_specific_intrinsic (const char *);
    4005              : bool gfc_is_intrinsic (gfc_symbol*, int, locus);
    4006              : bool gfc_intrinsic_actual_ok (const char *, const bool);
    4007              : gfc_intrinsic_sym *gfc_find_function (const char *);
    4008              : gfc_intrinsic_sym *gfc_find_subroutine (const char *);
    4009              : gfc_intrinsic_sym *gfc_intrinsic_function_by_id (gfc_isym_id);
    4010              : gfc_intrinsic_sym *gfc_intrinsic_subroutine_by_id (gfc_isym_id);
    4011              : gfc_isym_id gfc_isym_id_by_intmod (intmod_id, int);
    4012              : gfc_isym_id gfc_isym_id_by_intmod_sym (gfc_symbol *);
    4013              : 
    4014              : 
    4015              : match gfc_intrinsic_func_interface (gfc_expr *, int);
    4016              : match gfc_intrinsic_sub_interface (gfc_code *, int);
    4017              : 
    4018              : void gfc_warn_intrinsic_shadow (const gfc_symbol*, bool, bool);
    4019              : bool gfc_check_intrinsic_standard (const gfc_intrinsic_sym*, const char**,
    4020              :                                       bool, locus);
    4021              : 
    4022              : bool gfc_value_set_at (gfc_symbol *, locus *loc,
    4023              :                        enum value_set);
    4024              : bool gfc_lvalue_allocated_at (gfc_symbol *, locus *);
    4025              : void gfc_mark_lhs_as_used (gfc_expr *, locus *);
    4026              : 
    4027              : void gfc_value_used_expr (gfc_expr *, enum value_used);
    4028              : void gfc_value_set_and_used (gfc_expr *, locus *loc,
    4029              :                              enum value_set, enum value_used);
    4030              : void gfc_used_in_allocate_expr (gfc_expr *, locus *loc, enum var_allocated);
    4031              : void gfc_expr_set_at (gfc_expr *, locus *loc, enum value_set);
    4032              : 
    4033              : 
    4034              : /* match.cc -- FIXME */
    4035              : void gfc_free_iterator (gfc_iterator *, int);
    4036              : void gfc_free_forall_iterator (gfc_forall_iterator *);
    4037              : void gfc_free_alloc_list (gfc_alloc *);
    4038              : void gfc_free_namelist (gfc_namelist *);
    4039              : void gfc_free_omp_namelist (gfc_omp_namelist *, enum gfc_omp_list_type);
    4040              : void gfc_free_equiv (gfc_equiv *);
    4041              : void gfc_free_equiv_until (gfc_equiv *, gfc_equiv *);
    4042              : void gfc_free_data (gfc_data *);
    4043              : void gfc_reject_data (gfc_namespace *);
    4044              : void gfc_free_case_list (gfc_case *);
    4045              : 
    4046              : /* matchexp.cc -- FIXME too?  */
    4047              : gfc_expr *gfc_get_parentheses (gfc_expr *);
    4048              : 
    4049              : /* openmp.cc */
    4050              : struct gfc_omp_saved_state { void *ptrs[2]; int ints[1]; };
    4051              : bool gfc_omp_requires_add_clause (gfc_omp_requires_kind, const char *,
    4052              :                                   locus *, const char *);
    4053              : void gfc_check_omp_requires (gfc_namespace *, int);
    4054              : void gfc_free_omp_clauses (gfc_omp_clauses *);
    4055              : void gfc_free_oacc_declare_clauses (struct gfc_oacc_declare *);
    4056              : void gfc_free_omp_declare_variant_list (gfc_omp_declare_variant *list);
    4057              : void gfc_free_omp_declare_simd (gfc_omp_declare_simd *);
    4058              : void gfc_free_omp_declare_simd_list (gfc_omp_declare_simd *);
    4059              : void gfc_free_omp_udr (gfc_omp_udr *);
    4060              : void gfc_free_omp_udm (gfc_omp_udm *);
    4061              : void gfc_free_omp_variants (gfc_omp_variant *);
    4062              : gfc_omp_udr *gfc_omp_udr_find (gfc_symtree *, gfc_typespec *);
    4063              : gfc_omp_udm *gfc_omp_udm_find (gfc_symtree *, gfc_typespec *);
    4064              : gfc_omp_udm *gfc_find_omp_udm (gfc_namespace *ns, const char *mapper_id,
    4065              :                                gfc_typespec *ts);
    4066              : void gfc_resolve_omp_allocate (gfc_namespace *, gfc_omp_namelist *);
    4067              : void gfc_resolve_omp_assumptions (gfc_omp_assumptions *);
    4068              : void gfc_resolve_omp_directive (gfc_code *, gfc_namespace *);
    4069              : void gfc_resolve_do_iterator (gfc_code *, gfc_symbol *, bool);
    4070              : void gfc_resolve_omp_local_vars (gfc_namespace *);
    4071              : void gfc_resolve_omp_parallel_blocks (gfc_code *, gfc_namespace *);
    4072              : void gfc_resolve_omp_do_blocks (gfc_code *, gfc_namespace *);
    4073              : void gfc_resolve_omp_declare (gfc_namespace *);
    4074              : void gfc_resolve_omp_udrs (gfc_symtree *);
    4075              : void gfc_resolve_omp_udms (gfc_symtree *);
    4076              : void gfc_omp_save_and_clear_state (struct gfc_omp_saved_state *);
    4077              : void gfc_omp_restore_state (struct gfc_omp_saved_state *);
    4078              : void gfc_free_expr_list (gfc_expr_list *);
    4079              : void gfc_resolve_oacc_directive (gfc_code *, gfc_namespace *);
    4080              : void gfc_resolve_oacc_declare (gfc_namespace *);
    4081              : void gfc_resolve_oacc_blocks (gfc_code *, gfc_namespace *);
    4082              : void gfc_resolve_oacc_routines (gfc_namespace *);
    4083              : 
    4084              : /* expr.cc */
    4085              : void gfc_free_actual_arglist (gfc_actual_arglist *);
    4086              : gfc_actual_arglist *gfc_copy_actual_arglist (gfc_actual_arglist *);
    4087              : 
    4088              : bool gfc_extract_int (gfc_expr *, int *, int = 0);
    4089              : bool gfc_extract_hwi (gfc_expr *, HOST_WIDE_INT *, int = 0);
    4090              : 
    4091              : bool is_CFI_desc (gfc_symbol *, gfc_expr *);
    4092              : bool is_subref_array (gfc_expr *);
    4093              : bool gfc_is_simply_contiguous (gfc_expr *, bool, bool);
    4094              : bool gfc_is_not_contiguous (gfc_expr *);
    4095              : bool gfc_check_init_expr (gfc_expr *);
    4096              : 
    4097              : gfc_expr *gfc_build_conversion (gfc_expr *);
    4098              : void gfc_free_ref_list (gfc_ref *);
    4099              : void gfc_type_convert_binary (gfc_expr *, int);
    4100              : bool gfc_is_constant_expr (gfc_expr *);
    4101              : bool gfc_simplify_expr (gfc_expr *, int);
    4102              : bool gfc_try_simplify_expr (gfc_expr *, int);
    4103              : bool gfc_has_vector_index (gfc_expr *);
    4104              : bool gfc_is_ptr_fcn (gfc_expr *);
    4105              : 
    4106              : gfc_expr *gfc_get_expr (void);
    4107              : gfc_expr *gfc_get_array_expr (bt type, int kind, locus *);
    4108              : gfc_expr *gfc_get_null_expr (locus *);
    4109              : gfc_expr *gfc_get_operator_expr (locus *, gfc_intrinsic_op, gfc_expr *,
    4110              :                                  gfc_expr *);
    4111              : gfc_expr *gfc_get_conditional_expr (locus *, gfc_expr *, gfc_expr *,
    4112              :                                     gfc_expr *);
    4113              : gfc_expr *gfc_get_structure_constructor_expr (bt, int, locus *);
    4114              : gfc_expr *gfc_get_constant_expr (bt, int, locus *);
    4115              : gfc_expr *gfc_get_character_expr (int, locus *, const char *, gfc_charlen_t len);
    4116              : gfc_expr *gfc_get_int_expr (int, locus *, HOST_WIDE_INT);
    4117              : gfc_expr *gfc_get_unsigned_expr (int, locus *, HOST_WIDE_INT);
    4118              : gfc_expr *gfc_get_logical_expr (int, locus *, bool);
    4119              : gfc_expr *gfc_get_iokind_expr (locus *, io_kind);
    4120              : 
    4121              : void gfc_clear_shape (mpz_t *shape, int rank);
    4122              : void gfc_free_shape (mpz_t **shape, int rank);
    4123              : void gfc_free_expr (gfc_expr *);
    4124              : void gfc_replace_expr (gfc_expr *, gfc_expr *);
    4125              : mpz_t *gfc_copy_shape (mpz_t *, int);
    4126              : mpz_t *gfc_copy_shape_excluding (mpz_t *, int, gfc_expr *);
    4127              : gfc_expr *gfc_copy_expr (gfc_expr *);
    4128              : gfc_ref* gfc_copy_ref (gfc_ref*);
    4129              : 
    4130              : bool gfc_specification_expr (gfc_expr *);
    4131              : 
    4132              : bool gfc_numeric_ts (gfc_typespec *);
    4133              : int gfc_kind_max (gfc_expr *, gfc_expr *);
    4134              : 
    4135              : bool gfc_check_conformance (gfc_expr *, gfc_expr *, const char *, ...) ATTRIBUTE_PRINTF_3;
    4136              : bool gfc_check_type_spec_parms (gfc_expr *, gfc_expr *, const char *);
    4137              : bool gfc_check_assign (gfc_expr *, gfc_expr *, int, bool c = true);
    4138              : bool gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue,
    4139              :                                bool suppres_type_test = false,
    4140              :                                bool is_init_expr = false);
    4141              : bool gfc_check_assign_symbol (gfc_symbol *, gfc_component *, gfc_expr *);
    4142              : 
    4143              : gfc_expr *gfc_build_default_init_expr (gfc_typespec *, locus *);
    4144              : void gfc_apply_init (gfc_typespec *, symbol_attribute *, gfc_expr *);
    4145              : bool gfc_has_default_initializer (gfc_symbol *);
    4146              : gfc_expr *gfc_default_initializer (gfc_typespec *);
    4147              : gfc_expr *gfc_generate_initializer (gfc_typespec *, bool);
    4148              : gfc_expr *gfc_get_variable_expr (gfc_symtree *);
    4149              : void gfc_add_full_array_ref (gfc_expr *, gfc_array_spec *);
    4150              : gfc_expr * gfc_lval_expr_from_sym (gfc_symbol *);
    4151              : 
    4152              : gfc_array_spec *gfc_get_full_arrayspec_from_expr (gfc_expr *expr);
    4153              : 
    4154              : bool gfc_traverse_expr (gfc_expr *, gfc_symbol *,
    4155              :                         bool (*)(gfc_expr *, gfc_symbol *, int*),
    4156              :                         int);
    4157              : void gfc_expr_set_symbols_referenced (gfc_expr *);
    4158              : bool gfc_expr_check_typed (gfc_expr*, gfc_namespace*, bool);
    4159              : bool gfc_derived_parameter_expr (gfc_expr *);
    4160              : gfc_param_spec_type gfc_spec_list_type (gfc_actual_arglist *, gfc_symbol *);
    4161              : gfc_component * gfc_get_proc_ptr_comp (gfc_expr *);
    4162              : bool gfc_is_proc_ptr_comp (gfc_expr *);
    4163              : bool gfc_is_alloc_class_scalar_function (gfc_expr *);
    4164              : bool gfc_is_class_array_function (gfc_expr *);
    4165              : 
    4166              : bool gfc_ref_this_image (gfc_ref *ref);
    4167              : bool gfc_is_coindexed (gfc_expr *);
    4168              : bool gfc_is_coarray (gfc_expr *);
    4169              : bool gfc_has_ultimate_allocatable (gfc_expr *);
    4170              : bool gfc_has_ultimate_pointer (gfc_expr *);
    4171              : gfc_expr *gfc_find_team_co (gfc_expr *,
    4172              :                             gfc_array_ref_team_type req_team_type = TEAM_TEAM);
    4173              : gfc_expr* gfc_find_stat_co (gfc_expr *);
    4174              : gfc_expr* gfc_build_intrinsic_call (gfc_namespace *, gfc_isym_id, const char*,
    4175              :                                     locus, unsigned, ...);
    4176              : bool gfc_check_vardef_context (gfc_expr*, bool, bool, bool, const char*);
    4177              : gfc_expr* gfc_pdt_find_component_copy_initializer (gfc_symbol *, const char *);
    4178              : bool has_parameterized_comps (gfc_symbol *);
    4179              : 
    4180              : /* st.cc */
    4181              : extern gfc_code new_st;
    4182              : void gfc_clear_new_st (void);
    4183              : gfc_code *gfc_get_code (gfc_exec_op);
    4184              : gfc_code *gfc_append_code (gfc_code *, gfc_code *);
    4185              : void gfc_free_statement (gfc_code *);
    4186              : void gfc_free_statements (gfc_code *);
    4187              : void gfc_free_association_list (gfc_association_list *);
    4188              : void deallocate_allocated_coarrays (vec<gfc_expr *> *);
    4189              : 
    4190              : /* resolve.cc */
    4191              : void gfc_resolve_symbol (gfc_symbol *);
    4192              : void gfc_expression_rank (gfc_expr *);
    4193              : bool gfc_op_rank_conformable (gfc_expr *, gfc_expr *);
    4194              : bool gfc_resolve_ref (gfc_expr *);
    4195              : void gfc_fixup_inferred_type_refs (gfc_expr *);
    4196              : bool gfc_resolve_expr (gfc_expr *);
    4197              : void gfc_resolve (gfc_namespace *);
    4198              : void gfc_resolve_code (gfc_code *, gfc_namespace *);
    4199              : void gfc_resolve_blocks (gfc_code *, gfc_namespace *);
    4200              : void gfc_resolve_formal_arglist (gfc_symbol *);
    4201              : bool gfc_impure_variable (gfc_symbol *);
    4202              : bool gfc_pure (gfc_symbol *);
    4203              : bool gfc_implicit_pure (gfc_symbol *);
    4204              : void gfc_unset_implicit_pure (gfc_symbol *);
    4205              : bool gfc_elemental (gfc_symbol *);
    4206              : bool gfc_resolve_iterator (gfc_iterator *, bool, bool);
    4207              : bool find_forall_index (gfc_expr *, gfc_symbol *, int);
    4208              : bool gfc_resolve_index (gfc_expr *, int);
    4209              : bool gfc_resolve_dim_arg (gfc_expr *);
    4210              : bool gfc_resolve_substring (gfc_ref *, bool *);
    4211              : void gfc_resolve_substring_charlen (gfc_expr *);
    4212              : void gfc_resolve_sync_stat (struct sync_stat *);
    4213              : gfc_expr *gfc_expr_to_initialize (gfc_expr *);
    4214              : bool gfc_type_is_extensible (gfc_symbol *);
    4215              : bool gfc_resolve_intrinsic (gfc_symbol *, locus *);
    4216              : bool gfc_explicit_interface_required (gfc_symbol *, char *, int);
    4217              : extern int gfc_do_concurrent_flag;
    4218              : const char* gfc_lookup_function_fuzzy (const char *, gfc_symtree *);
    4219              : bool gfc_pure_function (gfc_expr *e, const char **name);
    4220              : bool gfc_implicit_pure_function (gfc_expr *e);
    4221              : 
    4222              : /* coarray.cc */
    4223              : void gfc_coarray_rewrite (gfc_namespace *);
    4224              : 
    4225              : /* array.cc */
    4226              : gfc_iterator *gfc_copy_iterator (gfc_iterator *);
    4227              : 
    4228              : void gfc_free_array_spec (gfc_array_spec *);
    4229              : gfc_array_ref *gfc_copy_array_ref (gfc_array_ref *);
    4230              : 
    4231              : bool gfc_set_array_spec (gfc_symbol *, gfc_array_spec *, locus *);
    4232              : gfc_array_spec *gfc_copy_array_spec (gfc_array_spec *);
    4233              : bool gfc_resolve_array_spec (gfc_array_spec *, int);
    4234              : 
    4235              : bool gfc_compare_array_spec (gfc_array_spec *, gfc_array_spec *);
    4236              : 
    4237              : void gfc_simplify_iterator_var (gfc_expr *);
    4238              : bool gfc_expand_constructor (gfc_expr *, bool);
    4239              : bool gfc_constant_ac (gfc_expr *);
    4240              : bool gfc_expanded_ac (gfc_expr *);
    4241              : bool gfc_resolve_character_array_constructor (gfc_expr *);
    4242              : bool gfc_resolve_array_constructor (gfc_expr *);
    4243              : bool gfc_check_constructor_type (gfc_expr *);
    4244              : bool gfc_check_iter_variable (gfc_expr *);
    4245              : bool gfc_check_constructor (gfc_expr *, bool (*)(gfc_expr *));
    4246              : bool gfc_array_size (gfc_expr *, mpz_t *);
    4247              : bool gfc_array_dimen_size (gfc_expr *, int, mpz_t *);
    4248              : bool gfc_array_ref_shape (gfc_array_ref *, mpz_t *);
    4249              : gfc_array_ref *gfc_find_array_ref (gfc_expr *, bool a = false);
    4250              : tree gfc_conv_array_initializer (tree type, gfc_expr *);
    4251              : bool spec_size (gfc_array_spec *, mpz_t *);
    4252              : bool spec_dimen_size (gfc_array_spec *, int, mpz_t *);
    4253              : bool gfc_is_compile_time_shape (gfc_array_spec *);
    4254              : 
    4255              : bool gfc_ref_dimen_size (gfc_array_ref *, int dimen, mpz_t *, mpz_t *);
    4256              : 
    4257              : /* interface.cc -- FIXME: some of these should be in symbol.cc */
    4258              : void gfc_free_interface (gfc_interface *);
    4259              : void gfc_drop_interface_elements_before (gfc_interface **, gfc_interface *);
    4260              : bool gfc_compare_derived_types (gfc_symbol *, gfc_symbol *);
    4261              : bool gfc_compare_types (gfc_typespec *, gfc_typespec *);
    4262              : int gfc_symbol_rank (gfc_symbol *);
    4263              : bool gfc_check_dummy_characteristics (gfc_symbol *, gfc_symbol *,
    4264              :                                       bool, char *, int);
    4265              : bool gfc_check_result_characteristics (gfc_symbol *, gfc_symbol *,
    4266              :                                        char *, int);
    4267              : bool gfc_compare_interfaces (gfc_symbol*, gfc_symbol*, const char *, int, int,
    4268              :                              char *, int, const char *, const char *,
    4269              :                              bool *bad_result_characteristics = NULL);
    4270              : void gfc_check_interfaces (gfc_namespace *);
    4271              : bool gfc_procedure_use (gfc_symbol *, gfc_actual_arglist **, locus *);
    4272              : void gfc_ppc_use (gfc_component *, gfc_actual_arglist **, locus *);
    4273              : gfc_symbol *gfc_search_interface (gfc_interface *, int,
    4274              :                                   gfc_actual_arglist **);
    4275              : match gfc_extend_expr (gfc_expr *);
    4276              : void gfc_free_formal_arglist (gfc_formal_arglist *);
    4277              : bool gfc_extend_assign (gfc_code *, gfc_namespace *);
    4278              : bool gfc_check_new_interface (gfc_interface *, gfc_symbol *, locus);
    4279              : bool gfc_add_interface (gfc_symbol *);
    4280              : gfc_interface *&gfc_current_interface_head (void);
    4281              : void gfc_set_current_interface_head (gfc_interface *);
    4282              : gfc_symtree* gfc_find_sym_in_symtree (gfc_symbol*);
    4283              : bool gfc_arglist_matches_symbol (gfc_actual_arglist**, gfc_symbol*);
    4284              : bool gfc_check_operator_interface (gfc_symbol*, gfc_intrinsic_op, locus);
    4285              : bool gfc_has_vector_subscript (gfc_expr*);
    4286              : gfc_intrinsic_op gfc_equivalent_op (gfc_intrinsic_op);
    4287              : bool gfc_check_typebound_override (gfc_symtree*, gfc_symtree*);
    4288              : void gfc_check_dtio_interfaces (gfc_symbol*);
    4289              : gfc_symtree* gfc_find_typebound_dtio_proc (gfc_symbol *, bool, bool);
    4290              : gfc_symbol* gfc_find_specific_dtio_proc (gfc_symbol*, bool, bool);
    4291              : void gfc_get_formal_from_actual_arglist (gfc_symbol *, gfc_actual_arglist *);
    4292              : bool gfc_compare_actual_formal (gfc_actual_arglist **, gfc_formal_arglist *,
    4293              :                                 int, int, bool, locus *);
    4294              : 
    4295              : 
    4296              : /* io.cc */
    4297              : extern gfc_st_label format_asterisk;
    4298              : 
    4299              : void gfc_free_open (gfc_open *);
    4300              : bool gfc_resolve_open (gfc_open *, locus *);
    4301              : void gfc_free_close (gfc_close *);
    4302              : bool gfc_resolve_close (gfc_close *, locus *);
    4303              : void gfc_free_filepos (gfc_filepos *);
    4304              : bool gfc_resolve_filepos (gfc_filepos *, locus *);
    4305              : void gfc_free_inquire (gfc_inquire *);
    4306              : bool gfc_resolve_inquire (gfc_inquire *);
    4307              : void gfc_free_dt (gfc_dt *);
    4308              : bool gfc_resolve_dt (gfc_code *, gfc_dt *, locus *);
    4309              : void gfc_free_wait (gfc_wait *);
    4310              : bool gfc_resolve_wait (gfc_wait *);
    4311              : 
    4312              : /* module.cc */
    4313              : void gfc_module_init_2 (void);
    4314              : void gfc_module_done_2 (void);
    4315              : void gfc_dump_module (const char *, int);
    4316              : bool gfc_check_symbol_access (gfc_symbol *);
    4317              : void gfc_free_use_stmts (gfc_use_list *);
    4318              : void gfc_save_module_list ();
    4319              : void gfc_restore_old_module_list ();
    4320              : const char *gfc_dt_lower_string (const char *);
    4321              : const char *gfc_dt_upper_string (const char *);
    4322              : 
    4323              : /* primary.cc */
    4324              : symbol_attribute gfc_variable_attr (gfc_expr *, gfc_typespec *);
    4325              : symbol_attribute gfc_expr_attr (gfc_expr *);
    4326              : symbol_attribute gfc_caf_attr (gfc_expr *, bool i = false, bool *r = NULL);
    4327              : bool is_inquiry_ref (const char *, gfc_ref **);
    4328              : match gfc_match_rvalue (gfc_expr **);
    4329              : match gfc_match_varspec (gfc_expr*, int, bool, bool);
    4330              : bool gfc_check_digit (char, int);
    4331              : bool gfc_is_function_return_value (gfc_symbol *, gfc_namespace *);
    4332              : bool gfc_convert_to_structure_constructor (gfc_expr *, gfc_symbol *,
    4333              :                                               gfc_expr **,
    4334              :                                               gfc_actual_arglist **, bool);
    4335              : 
    4336              : /* trans.cc */
    4337              : void gfc_generate_code (gfc_namespace *);
    4338              : void gfc_generate_module_code (gfc_namespace *);
    4339              : 
    4340              : /* trans-intrinsic.cc */
    4341              : bool gfc_inline_intrinsic_function_p (gfc_expr *);
    4342              : 
    4343              : /* trans-openmp.cc */
    4344              : int gfc_expr_list_len (gfc_expr_list *);
    4345              : 
    4346              : /* bbt.cc */
    4347              : typedef int (*compare_fn) (void *, void *);
    4348              : void gfc_insert_bbt (void *, void *, compare_fn);
    4349              : void * gfc_delete_bbt (void *, void *, compare_fn);
    4350              : 
    4351              : /* dump-parse-tree.cc */
    4352              : void gfc_dump_parse_tree (gfc_namespace *, FILE *);
    4353              : void gfc_dump_c_prototypes (FILE *);
    4354              : void gfc_dump_external_c_prototypes (FILE *);
    4355              : void gfc_dump_global_symbols (FILE *);
    4356              : void debug (gfc_symbol *);
    4357              : void debug (gfc_expr *);
    4358              : 
    4359              : /* parse.cc */
    4360              : bool gfc_parse_file (void);
    4361              : void gfc_global_used (gfc_gsymbol *, locus *);
    4362              : gfc_namespace* gfc_build_block_ns (gfc_namespace *);
    4363              : gfc_statement match_omp_directive (void);
    4364              : bool is_omp_declarative_stmt (gfc_statement);
    4365              : extern hash_map<gfc_namespace *, vec<gfc_expr *>> team_allocated_coarrays;
    4366              : extern vec<gfc_namespace *> team_context_stack;
    4367              : gfc_namespace *get_current_team_context (void);
    4368              : 
    4369              : /* dependency.cc */
    4370              : int gfc_dep_compare_functions (gfc_expr *, gfc_expr *, bool);
    4371              : int gfc_dep_compare_expr (gfc_expr *, gfc_expr *);
    4372              : bool gfc_dep_difference (gfc_expr *, gfc_expr *, mpz_t *);
    4373              : 
    4374              : /* check.cc */
    4375              : bool gfc_check_same_strlen (const gfc_expr*, const gfc_expr*, const char*);
    4376              : bool gfc_calculate_transfer_sizes (gfc_expr*, gfc_expr*, gfc_expr*,
    4377              :                                       size_t*, size_t*, size_t*);
    4378              : bool gfc_boz2int (gfc_expr *, int);
    4379              : bool gfc_boz2uint (gfc_expr *, int);
    4380              : bool gfc_boz2real (gfc_expr *, int);
    4381              : bool gfc_invalid_boz (const char *, locus *);
    4382              : bool gfc_invalid_null_arg (gfc_expr *);
    4383              : 
    4384              : bool gfc_invalid_unsigned_ops (gfc_expr *, gfc_expr *);
    4385              : 
    4386              : /* class.cc */
    4387              : void gfc_fix_class_refs (gfc_expr *e);
    4388              : void gfc_add_component_ref (gfc_expr *, const char *);
    4389              : void gfc_add_class_array_ref (gfc_expr *);
    4390              : #define gfc_add_data_component(e)     gfc_add_component_ref(e,"_data")
    4391              : #define gfc_add_vptr_component(e)     gfc_add_component_ref(e,"_vptr")
    4392              : #define gfc_add_len_component(e)      gfc_add_component_ref(e,"_len")
    4393              : #define gfc_add_hash_component(e)     gfc_add_component_ref(e,"_hash")
    4394              : #define gfc_add_size_component(e)     gfc_add_component_ref(e,"_size")
    4395              : #define gfc_add_def_init_component(e) gfc_add_component_ref(e,"_def_init")
    4396              : #define gfc_add_final_component(e)    gfc_add_component_ref(e,"_final")
    4397              : bool gfc_is_class_array_ref (gfc_expr *, bool *);
    4398              : bool gfc_is_class_scalar_expr (gfc_expr *);
    4399              : bool gfc_is_class_container_ref (gfc_expr *e);
    4400              : gfc_expr *gfc_class_initializer (gfc_typespec *, gfc_expr *);
    4401              : unsigned int gfc_hash_value (gfc_symbol *);
    4402              : gfc_expr *gfc_get_len_component (gfc_expr *e, int);
    4403              : bool gfc_build_class_symbol (gfc_typespec *, symbol_attribute *,
    4404              :                              gfc_array_spec **);
    4405              : void gfc_change_class (gfc_typespec *, symbol_attribute *,
    4406              :                        gfc_array_spec *, int, int);
    4407              : gfc_symbol *gfc_find_derived_vtab (gfc_symbol *);
    4408              : gfc_symbol *gfc_find_vtab (gfc_typespec *);
    4409              : gfc_symtree* gfc_find_typebound_proc (gfc_symbol*, bool*,
    4410              :                                       const char*, bool, locus*);
    4411              : gfc_symtree* gfc_find_typebound_user_op (gfc_symbol*, bool*,
    4412              :                                          const char*, bool, locus*);
    4413              : gfc_typebound_proc* gfc_find_typebound_intrinsic_op (gfc_symbol*, bool*,
    4414              :                                                      gfc_intrinsic_op, bool,
    4415              :                                                      locus*);
    4416              : gfc_symtree* gfc_get_tbp_symtree (gfc_symtree**, const char*);
    4417              : bool gfc_is_finalizable (gfc_symbol *, gfc_expr **);
    4418              : bool gfc_may_be_finalized (gfc_typespec);
    4419              : 
    4420              : #define CLASS_DATA(sym) sym->ts.u.derived->components
    4421              : #define UNLIMITED_POLY(sym) \
    4422              :         (sym != NULL && sym->ts.type == BT_CLASS \
    4423              :          && CLASS_DATA (sym) \
    4424              :          && CLASS_DATA (sym)->ts.u.derived \
    4425              :          && CLASS_DATA (sym)->ts.u.derived->attr.unlimited_polymorphic)
    4426              : #define IS_CLASS_ARRAY(sym) \
    4427              :         (sym->ts.type == BT_CLASS \
    4428              :          && CLASS_DATA (sym) \
    4429              :          && CLASS_DATA (sym)->attr.dimension \
    4430              :          && !CLASS_DATA (sym)->attr.class_pointer)
    4431              : #define IS_CLASS_COARRAY_OR_ARRAY(sym) \
    4432              :         (sym->ts.type == BT_CLASS && CLASS_DATA (sym) \
    4433              :          && (CLASS_DATA (sym)->attr.dimension \
    4434              :              || CLASS_DATA (sym)->attr.codimension) \
    4435              :          && !CLASS_DATA (sym)->attr.class_pointer)
    4436              : #define IS_POINTER(sym) \
    4437              :         (sym->ts.type == BT_CLASS && sym->attr.class_ok && CLASS_DATA (sym) \
    4438              :          ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer)
    4439              : #define IS_PROC_POINTER(sym) \
    4440              :         (sym->ts.type == BT_CLASS && sym->attr.class_ok && CLASS_DATA (sym) \
    4441              :          ? CLASS_DATA (sym)->attr.proc_pointer : sym->attr.proc_pointer)
    4442              : #define IS_INFERRED_TYPE(expr) \
    4443              :         (expr && expr->expr_type == EXPR_VARIABLE \
    4444              :          && expr->symtree->n.sym->assoc \
    4445              :          && expr->symtree->n.sym->assoc->inferred_type)
    4446              : #define PDT_PREFIX "PDT"
    4447              : #define PDT_PREFIX_LEN 3
    4448              : #define IS_PDT(sym) \
    4449              :         (sym != NULL && sym->ts.type == BT_DERIVED \
    4450              :          && sym->ts.u.derived \
    4451              :          && sym->ts.u.derived->attr.pdt_type)
    4452              : #define IS_CLASS_PDT(sym) \
    4453              :         (sym != NULL && sym->ts.type == BT_CLASS \
    4454              :          && CLASS_DATA (sym) \
    4455              :          && CLASS_DATA (sym)->ts.u.derived \
    4456              :          && CLASS_DATA (sym)->ts.u.derived->attr.pdt_type)
    4457              : 
    4458              : /* frontend-passes.cc */
    4459              : 
    4460              : void gfc_run_passes (gfc_namespace *);
    4461              : 
    4462              : typedef int (*walk_code_fn_t) (gfc_code **, int *, void *);
    4463              : typedef int (*walk_expr_fn_t) (gfc_expr **, int *, void *);
    4464              : 
    4465              : int gfc_dummy_code_callback (gfc_code **, int *, void *);
    4466              : int gfc_expr_walker (gfc_expr **, walk_expr_fn_t, void *);
    4467              : int gfc_code_walker (gfc_code **, walk_code_fn_t, walk_expr_fn_t, void *);
    4468              : bool gfc_has_dimen_vector_ref (gfc_expr *e);
    4469              : void gfc_check_externals (gfc_namespace *);
    4470              : bool gfc_fix_implicit_pure (gfc_namespace *);
    4471              : 
    4472              : /* simplify.cc */
    4473              : 
    4474              : void gfc_convert_mpz_to_signed (mpz_t, int);
    4475              : gfc_expr *gfc_simplify_ieee_functions (gfc_expr *);
    4476              : bool gfc_is_constant_array_expr (gfc_expr *);
    4477              : bool gfc_is_size_zero_array (gfc_expr *);
    4478              : void gfc_convert_mpz_to_unsigned (mpz_t, int, bool sign = true);
    4479              : 
    4480              : /* trans-array.cc  */
    4481              : 
    4482              : bool gfc_is_reallocatable_lhs (gfc_expr *);
    4483              : 
    4484              : /* trans-decl.cc */
    4485              : 
    4486              : void finish_oacc_declare (gfc_namespace *, gfc_symbol *, bool);
    4487              : void gfc_adjust_builtins (void);
    4488              : void gfc_add_caf_accessor (gfc_expr *, gfc_expr *);
    4489              : 
    4490              : #endif /* GCC_GFORTRAN_H  */
        

Generated by: LCOV version 2.4-beta

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,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.