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