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