]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/gfortran.h
[Ada] Fix proof of runtime unit s-imageu
[thirdparty/gcc.git] / gcc / fortran / gfortran.h
CommitLineData
6de9cd9a 1/* gfortran header file
7adcbafe 2 Copyright (C) 2000-2022 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
e53b6e56 173/* Used for different Fortran source forms in places like scanner.cc. */
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 346/* Intent types. Note that these values are also used in another enum in
e53b6e56 347 decl.cc (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
e53b6e56 383 modules. In symbol.cc. */
6de9cd9a
DN
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
e53b6e56 391/* Strings for DTIO procedure names. In symbol.cc. */
e73d3ca6
PT
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.
e53b6e56 802 Declared in trans-types.cc as a global, since it's in that file
a8b3b0b6
CR
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);
85a3442c 1086bool gfc_query_suppress_errors (void);
6de9cd9a
DN
1087
1088
1089/* Character length structures hold the expression that gives the
1090 length of a character variable. We avoid putting these into
1091 gfc_typespec because doing so prevents us from doing structure
1092 copies and forces us to deallocate any typespecs we create, as well
1093 as structures that contain typespecs. They also can have multiple
1094 character typespecs pointing to them.
1095
1096 These structures form a singly linked list within the current
1097 namespace and are deallocated with the namespace. It is possible to
1098 end up with gfc_charlen structures that have nothing pointing to them. */
1099
1100typedef struct gfc_charlen
1101{
1102 struct gfc_expr *length;
1103 struct gfc_charlen *next;
c03fc95d 1104 bool length_from_typespec; /* Length from explicit array ctor typespec? */
6de9cd9a 1105 tree backend_decl;
e69afb29 1106 tree passed_length; /* Length argument explicitly passed. */
110eec24
TS
1107
1108 int resolved;
6de9cd9a
DN
1109}
1110gfc_charlen;
1111
ece3f663 1112#define gfc_get_charlen() XCNEW (gfc_charlen)
6de9cd9a 1113
bc21d315 1114/* Type specification structure. */
6de9cd9a
DN
1115typedef struct
1116{
1117 bt type;
1118 int kind;
bc21d315
JW
1119
1120 union
1121 {
1122 struct gfc_symbol *derived; /* For derived types only. */
1123 gfc_charlen *cl; /* For character types only. */
401fcd3b 1124 int pad; /* For hollerith types only. */
bc21d315
JW
1125 }
1126 u;
1127
32d99e68 1128 struct gfc_symbol *interface; /* For PROCEDURE declarations. */
a8b3b0b6
CR
1129 int is_c_interop;
1130 int is_iso_c;
e69afb29
SK
1131 bt f90_type;
1132 bool deferred;
e655a6cc 1133 gfc_symbol *interop_kind;
6de9cd9a
DN
1134}
1135gfc_typespec;
1136
1137/* Array specification. */
1138typedef struct
1139{
c62c6622 1140 int rank; /* A scalar has a rank of 0, an assumed-rank array has -1. */
be59db2d 1141 int corank;
178f9aa1 1142 array_type type, cotype;
6de9cd9a 1143 struct gfc_expr *lower[GFC_MAX_DIMENSIONS], *upper[GFC_MAX_DIMENSIONS];
83d890b9
AL
1144
1145 /* These two fields are used with the Cray Pointer extension. */
1146 bool cray_pointee; /* True iff this spec belongs to a cray pointee. */
1147 bool cp_was_assumed; /* AS_ASSUMED_SIZE cp arrays are converted to
1148 AS_EXPLICIT, but we want to remember that we
1149 did this. */
9b7df66f
TK
1150
1151 bool resolved;
6de9cd9a
DN
1152}
1153gfc_array_spec;
1154
ece3f663 1155#define gfc_get_array_spec() XCNEW (gfc_array_spec)
6de9cd9a
DN
1156
1157
1158/* Components of derived types. */
1159typedef struct gfc_component
1160{
cb9e4f55 1161 const char *name;
6de9cd9a
DN
1162 gfc_typespec ts;
1163
d4b7d0f0 1164 symbol_attribute attr;
6de9cd9a
DN
1165 gfc_array_spec *as;
1166
1167 tree backend_decl;
b3c1b8a1
MM
1168 /* Used to cache a FIELD_DECL matching this same component
1169 but applied to a different backend containing type that was
1170 generated by gfc_nonrestricted_type. */
1171 tree norestrict_decl;
6de9cd9a
DN
1172 locus loc;
1173 struct gfc_expr *initializer;
5bab4c96
PT
1174 /* Used in parameterized derived type declarations to store parameterized
1175 kind expressions. */
1176 struct gfc_expr *kind_expr;
1177 struct gfc_actual_arglist *param_list;
1178
6de9cd9a 1179 struct gfc_component *next;
713485cc 1180
90661f26 1181 /* Needed for procedure pointer components. */
90661f26 1182 struct gfc_typebound_proc *tb;
3c9f5092
AV
1183 /* When allocatable/pointer and in a coarray the associated token. */
1184 tree caf_token;
6de9cd9a
DN
1185}
1186gfc_component;
1187
ece3f663 1188#define gfc_get_component() XCNEW (gfc_component)
6de9cd9a
DN
1189
1190/* Formal argument lists are lists of symbols. */
1191typedef struct gfc_formal_arglist
1192{
4f613946 1193 /* Symbol representing the argument at this position in the arglist. */
6de9cd9a 1194 struct gfc_symbol *sym;
4f613946 1195 /* Points to the next formal argument. */
6de9cd9a
DN
1196 struct gfc_formal_arglist *next;
1197}
1198gfc_formal_arglist;
1199
ece3f663 1200#define gfc_get_formal_arglist() XCNEW (gfc_formal_arglist)
6de9cd9a
DN
1201
1202
5888512f
MM
1203struct gfc_dummy_arg;
1204
1205
5bab4c96
PT
1206/* The gfc_actual_arglist structure is for actual arguments and
1207 for type parameter specification lists. */
6de9cd9a
DN
1208typedef struct gfc_actual_arglist
1209{
cb9e4f55 1210 const char *name;
6de9cd9a
DN
1211 /* Alternate return label when the expr member is null. */
1212 struct gfc_st_label *label;
1213
5bab4c96
PT
1214 gfc_param_spec_type spec_type;
1215
6de9cd9a 1216 struct gfc_expr *expr;
5888512f
MM
1217
1218 /* The dummy arg this actual arg is associated with, if the interface
1219 is explicit. NULL otherwise. */
1220 gfc_dummy_arg *associated_dummy;
1221
6de9cd9a
DN
1222 struct gfc_actual_arglist *next;
1223}
1224gfc_actual_arglist;
1225
ece3f663 1226#define gfc_get_actual_arglist() XCNEW (gfc_actual_arglist)
6de9cd9a
DN
1227
1228
1229/* Because a symbol can belong to multiple namelists, they must be
1230 linked externally to the symbol itself. */
1231typedef struct gfc_namelist
1232{
1233 struct gfc_symbol *sym;
1234 struct gfc_namelist *next;
1235}
1236gfc_namelist;
1237
ece3f663 1238#define gfc_get_namelist() XCNEW (gfc_namelist)
6de9cd9a 1239
41dbbb37
TS
1240/* Likewise to gfc_namelist, but contains expressions. */
1241typedef struct gfc_expr_list
1242{
1243 struct gfc_expr *expr;
1244 struct gfc_expr_list *next;
1245}
1246gfc_expr_list;
1247
1248#define gfc_get_expr_list() XCNEW (gfc_expr_list)
1249
a79683d5 1250enum gfc_omp_reduction_op
5f23671d
JJ
1251{
1252 OMP_REDUCTION_NONE = -1,
1253 OMP_REDUCTION_PLUS = INTRINSIC_PLUS,
1254 OMP_REDUCTION_MINUS = INTRINSIC_MINUS,
1255 OMP_REDUCTION_TIMES = INTRINSIC_TIMES,
1256 OMP_REDUCTION_AND = INTRINSIC_AND,
1257 OMP_REDUCTION_OR = INTRINSIC_OR,
1258 OMP_REDUCTION_EQV = INTRINSIC_EQV,
1259 OMP_REDUCTION_NEQV = INTRINSIC_NEQV,
1260 OMP_REDUCTION_MAX = GFC_INTRINSIC_END,
1261 OMP_REDUCTION_MIN,
1262 OMP_REDUCTION_IAND,
1263 OMP_REDUCTION_IOR,
1264 OMP_REDUCTION_IEOR,
1265 OMP_REDUCTION_USER
a79683d5 1266};
5f23671d 1267
a79683d5 1268enum gfc_omp_depend_op
f014c653 1269{
a61c4964 1270 OMP_DEPEND_UNSET,
f014c653
JJ
1271 OMP_DEPEND_IN,
1272 OMP_DEPEND_OUT,
b4c3a85b 1273 OMP_DEPEND_INOUT,
a61c4964
TB
1274 OMP_DEPEND_MUTEXINOUTSET,
1275 OMP_DEPEND_DEPOBJ,
b4c3a85b
JJ
1276 OMP_DEPEND_SINK_FIRST,
1277 OMP_DEPEND_SINK
a79683d5 1278};
f014c653 1279
a79683d5 1280enum gfc_omp_map_op
f014c653
JJ
1281{
1282 OMP_MAP_ALLOC,
a6163563 1283 OMP_MAP_IF_PRESENT,
549188ea 1284 OMP_MAP_ATTACH,
f014c653
JJ
1285 OMP_MAP_TO,
1286 OMP_MAP_FROM,
41dbbb37 1287 OMP_MAP_TOFROM,
91106e84 1288 OMP_MAP_DELETE,
549188ea 1289 OMP_MAP_DETACH,
41dbbb37 1290 OMP_MAP_FORCE_ALLOC,
41dbbb37
TS
1291 OMP_MAP_FORCE_TO,
1292 OMP_MAP_FORCE_FROM,
1293 OMP_MAP_FORCE_TOFROM,
1294 OMP_MAP_FORCE_PRESENT,
dc7a8b4b
JN
1295 OMP_MAP_FORCE_DEVICEPTR,
1296 OMP_MAP_DEVICE_RESIDENT,
b4c3a85b
JJ
1297 OMP_MAP_LINK,
1298 OMP_MAP_RELEASE,
1299 OMP_MAP_ALWAYS_TO,
1300 OMP_MAP_ALWAYS_FROM,
1301 OMP_MAP_ALWAYS_TOFROM
1302};
1303
1de31913
TB
1304enum gfc_omp_defaultmap
1305{
1306 OMP_DEFAULTMAP_UNSET,
1307 OMP_DEFAULTMAP_ALLOC,
1308 OMP_DEFAULTMAP_TO,
1309 OMP_DEFAULTMAP_FROM,
1310 OMP_DEFAULTMAP_TOFROM,
1311 OMP_DEFAULTMAP_FIRSTPRIVATE,
1312 OMP_DEFAULTMAP_NONE,
1313 OMP_DEFAULTMAP_DEFAULT,
1314 OMP_DEFAULTMAP_PRESENT
1315};
1316
1317enum gfc_omp_defaultmap_category
1318{
1319 OMP_DEFAULTMAP_CAT_UNCATEGORIZED,
1320 OMP_DEFAULTMAP_CAT_SCALAR,
1321 OMP_DEFAULTMAP_CAT_AGGREGATE,
1322 OMP_DEFAULTMAP_CAT_ALLOCATABLE,
1323 OMP_DEFAULTMAP_CAT_POINTER,
1324 OMP_DEFAULTMAP_CAT_NUM
1325};
1326
b4c3a85b
JJ
1327enum gfc_omp_linear_op
1328{
1329 OMP_LINEAR_DEFAULT,
1330 OMP_LINEAR_REF,
1331 OMP_LINEAR_VAL,
1332 OMP_LINEAR_UVAL
a79683d5 1333};
f014c653 1334
dd2fc525
JJ
1335/* For use in OpenMP clauses in case we need extra information
1336 (aligned clause alignment, linear clause step, etc.). */
1337
1338typedef struct gfc_omp_namelist
1339{
1340 struct gfc_symbol *sym;
1341 struct gfc_expr *expr;
f014c653
JJ
1342 union
1343 {
1344 gfc_omp_reduction_op reduction_op;
1345 gfc_omp_depend_op depend_op;
1346 gfc_omp_map_op map_op;
b4c3a85b
JJ
1347 gfc_omp_linear_op linear_op;
1348 struct gfc_common_head *common;
084dc63a 1349 bool lastprivate_conditional;
f014c653 1350 } u;
9a5de4d5
TB
1351 union
1352 {
1353 struct gfc_omp_namelist_udr *udr;
1354 gfc_namespace *ns;
1355 } u2;
dd2fc525 1356 struct gfc_omp_namelist *next;
2ac33bca 1357 locus where;
dd2fc525
JJ
1358}
1359gfc_omp_namelist;
1360
1361#define gfc_get_omp_namelist() XCNEW (gfc_omp_namelist)
1362
6c7a4dfd
JJ
1363enum
1364{
41dbbb37
TS
1365 OMP_LIST_FIRST,
1366 OMP_LIST_PRIVATE = OMP_LIST_FIRST,
6c7a4dfd
JJ
1367 OMP_LIST_FIRSTPRIVATE,
1368 OMP_LIST_LASTPRIVATE,
1369 OMP_LIST_COPYPRIVATE,
1370 OMP_LIST_SHARED,
1371 OMP_LIST_COPYIN,
dd2fc525 1372 OMP_LIST_UNIFORM,
9a5de4d5 1373 OMP_LIST_AFFINITY,
dd2fc525
JJ
1374 OMP_LIST_ALIGNED,
1375 OMP_LIST_LINEAR,
f014c653
JJ
1376 OMP_LIST_DEPEND,
1377 OMP_LIST_MAP,
1378 OMP_LIST_TO,
1379 OMP_LIST_FROM,
005cff4e
TB
1380 OMP_LIST_SCAN_IN,
1381 OMP_LIST_SCAN_EX,
5f23671d 1382 OMP_LIST_REDUCTION,
e929ef53
TB
1383 OMP_LIST_REDUCTION_INSCAN,
1384 OMP_LIST_REDUCTION_TASK,
1385 OMP_LIST_IN_REDUCTION,
1386 OMP_LIST_TASK_REDUCTION,
41dbbb37 1387 OMP_LIST_DEVICE_RESIDENT,
dc7a8b4b 1388 OMP_LIST_LINK,
41dbbb37
TS
1389 OMP_LIST_USE_DEVICE,
1390 OMP_LIST_CACHE,
b4c3a85b
JJ
1391 OMP_LIST_IS_DEVICE_PTR,
1392 OMP_LIST_USE_DEVICE_PTR,
ef4add8e 1393 OMP_LIST_USE_DEVICE_ADDR,
21cfe724 1394 OMP_LIST_NONTEMPORAL,
69561fc7 1395 OMP_LIST_ALLOCATE,
bbb7f860
MV
1396 OMP_LIST_HAS_DEVICE_ADDR,
1397 OMP_LIST_NUM /* Must be the last. */
6c7a4dfd
JJ
1398};
1399
1400/* Because a symbol can belong to multiple namelists, they must be
1401 linked externally to the symbol itself. */
24b97832
ILT
1402
1403enum gfc_omp_sched_kind
1404{
1405 OMP_SCHED_NONE,
1406 OMP_SCHED_STATIC,
1407 OMP_SCHED_DYNAMIC,
1408 OMP_SCHED_GUIDED,
1409 OMP_SCHED_RUNTIME,
1410 OMP_SCHED_AUTO
1411};
1412
1413enum gfc_omp_default_sharing
1414{
1415 OMP_DEFAULT_UNKNOWN,
1416 OMP_DEFAULT_NONE,
1417 OMP_DEFAULT_PRIVATE,
1418 OMP_DEFAULT_SHARED,
7fd549d2
TS
1419 OMP_DEFAULT_FIRSTPRIVATE,
1420 OMP_DEFAULT_PRESENT
24b97832
ILT
1421};
1422
dd2fc525
JJ
1423enum gfc_omp_proc_bind_kind
1424{
1425 OMP_PROC_BIND_UNKNOWN,
432de084 1426 OMP_PROC_BIND_PRIMARY,
dd2fc525
JJ
1427 OMP_PROC_BIND_MASTER,
1428 OMP_PROC_BIND_SPREAD,
1429 OMP_PROC_BIND_CLOSE
1430};
1431
1432enum gfc_omp_cancel_kind
1433{
1434 OMP_CANCEL_UNKNOWN,
1435 OMP_CANCEL_PARALLEL,
1436 OMP_CANCEL_SECTIONS,
1437 OMP_CANCEL_DO,
1438 OMP_CANCEL_TASKGROUP
1439};
1440
b4c3a85b
JJ
1441enum gfc_omp_if_kind
1442{
e55ba804 1443 OMP_IF_CANCEL,
b4c3a85b 1444 OMP_IF_PARALLEL,
e55ba804 1445 OMP_IF_SIMD,
b4c3a85b
JJ
1446 OMP_IF_TASK,
1447 OMP_IF_TASKLOOP,
1448 OMP_IF_TARGET,
1449 OMP_IF_TARGET_DATA,
1450 OMP_IF_TARGET_UPDATE,
1451 OMP_IF_TARGET_ENTER_DATA,
1452 OMP_IF_TARGET_EXIT_DATA,
1453 OMP_IF_LAST
1454};
1455
1fc5e7ef
TB
1456enum gfc_omp_atomic_op
1457{
1458 GFC_OMP_ATOMIC_UNSET = 0,
1459 GFC_OMP_ATOMIC_UPDATE = 1,
1460 GFC_OMP_ATOMIC_READ = 2,
1461 GFC_OMP_ATOMIC_WRITE = 3,
1462 GFC_OMP_ATOMIC_MASK = 3,
1463 GFC_OMP_ATOMIC_SWAP = 16
1464};
1465
269322ec
TB
1466enum gfc_omp_requires_kind
1467{
1468 /* Keep in sync with gfc_namespace, esp. with omp_req_mem_order. */
1469 OMP_REQ_ATOMIC_MEM_ORDER_SEQ_CST = 1, /* 01 */
1470 OMP_REQ_ATOMIC_MEM_ORDER_ACQ_REL = 2, /* 10 */
1471 OMP_REQ_ATOMIC_MEM_ORDER_RELAXED = 3, /* 11 */
1472 OMP_REQ_REVERSE_OFFLOAD = (1 << 2),
1473 OMP_REQ_UNIFIED_ADDRESS = (1 << 3),
1474 OMP_REQ_UNIFIED_SHARED_MEMORY = (1 << 4),
1475 OMP_REQ_DYNAMIC_ALLOCATORS = (1 << 5),
1476 OMP_REQ_TARGET_MASK = (OMP_REQ_REVERSE_OFFLOAD
1477 | OMP_REQ_UNIFIED_ADDRESS
1478 | OMP_REQ_UNIFIED_SHARED_MEMORY),
1479 OMP_REQ_ATOMIC_MEM_ORDER_MASK = (OMP_REQ_ATOMIC_MEM_ORDER_SEQ_CST
1480 | OMP_REQ_ATOMIC_MEM_ORDER_ACQ_REL
1481 | OMP_REQ_ATOMIC_MEM_ORDER_RELAXED)
1482};
1483
c26d7df1
TB
1484enum gfc_omp_memorder
1485{
1fc5e7ef
TB
1486 OMP_MEMORDER_UNSET,
1487 OMP_MEMORDER_SEQ_CST,
c26d7df1
TB
1488 OMP_MEMORDER_ACQ_REL,
1489 OMP_MEMORDER_RELEASE,
1490 OMP_MEMORDER_ACQUIRE,
1fc5e7ef 1491 OMP_MEMORDER_RELAXED
c26d7df1
TB
1492};
1493
178191e1
TB
1494enum gfc_omp_bind_type
1495{
1496 OMP_BIND_UNSET,
1497 OMP_BIND_TEAMS,
1498 OMP_BIND_PARALLEL,
1499 OMP_BIND_THREAD
1500};
1501
6c7a4dfd
JJ
1502typedef struct gfc_omp_clauses
1503{
77167196 1504 gfc_omp_namelist *lists[OMP_LIST_NUM];
6c7a4dfd 1505 struct gfc_expr *if_expr;
20906c66 1506 struct gfc_expr *final_expr;
6c7a4dfd 1507 struct gfc_expr *num_threads;
6c7a4dfd 1508 struct gfc_expr *chunk_size;
dd2fc525
JJ
1509 struct gfc_expr *safelen_expr;
1510 struct gfc_expr *simdlen_expr;
407eaad2
TB
1511 struct gfc_expr *num_teams_lower;
1512 struct gfc_expr *num_teams_upper;
f014c653
JJ
1513 struct gfc_expr *device;
1514 struct gfc_expr *thread_limit;
b4c3a85b 1515 struct gfc_expr *grainsize;
53d5b59c 1516 struct gfc_expr *filter;
b4c3a85b
JJ
1517 struct gfc_expr *hint;
1518 struct gfc_expr *num_tasks;
1519 struct gfc_expr *priority;
a6d22fb2 1520 struct gfc_expr *detach;
a61c4964 1521 struct gfc_expr *depobj;
b4c3a85b 1522 struct gfc_expr *if_exprs[OMP_IF_LAST];
f014c653 1523 struct gfc_expr *dist_chunk_size;
77167196 1524 struct gfc_expr *message;
b4c3a85b 1525 const char *critical_name;
77167196
TB
1526 enum gfc_omp_default_sharing default_sharing;
1527 enum gfc_omp_atomic_op atomic_op;
1528 enum gfc_omp_defaultmap defaultmap[OMP_DEFAULTMAP_CAT_NUM];
1529 int collapse, orderedc;
77c7abe3 1530 unsigned nowait:1, ordered:1, untied:1, mergeable:1, ancestor:1;
77167196
TB
1531 unsigned inbranch:1, notinbranch:1, nogroup:1;
1532 unsigned sched_simd:1, sched_monotonic:1, sched_nonmonotonic:1;
1533 unsigned simd:1, threads:1, depend_source:1, destroy:1, order_concurrent:1;
e705b853 1534 unsigned order_unconstrained:1, order_reproducible:1, capture:1;
689407ef 1535 unsigned grainsize_strict:1, num_tasks_strict:1, compare:1, weak:1;
705bcedf 1536 unsigned non_rectangular:1;
77167196
TB
1537 ENUM_BITFIELD (gfc_omp_sched_kind) sched_kind:3;
1538 ENUM_BITFIELD (gfc_omp_device_type) device_type:2;
1539 ENUM_BITFIELD (gfc_omp_memorder) memorder:3;
689407ef 1540 ENUM_BITFIELD (gfc_omp_memorder) fail:3;
77167196
TB
1541 ENUM_BITFIELD (gfc_omp_cancel_kind) cancel:3;
1542 ENUM_BITFIELD (gfc_omp_proc_bind_kind) proc_bind:3;
1543 ENUM_BITFIELD (gfc_omp_depend_op) depobj_update:3;
1544 ENUM_BITFIELD (gfc_omp_bind_type) bind:2;
1545 ENUM_BITFIELD (gfc_omp_at_type) at:2;
1546 ENUM_BITFIELD (gfc_omp_severity_type) severity:2;
1547 ENUM_BITFIELD (gfc_omp_sched_kind) dist_sched_kind:3;
41dbbb37
TS
1548
1549 /* OpenACC. */
1550 struct gfc_expr *async_expr;
2a70708e
CP
1551 struct gfc_expr *gang_static_expr;
1552 struct gfc_expr *gang_num_expr;
41dbbb37
TS
1553 struct gfc_expr *worker_expr;
1554 struct gfc_expr *vector_expr;
1555 struct gfc_expr *num_gangs_expr;
1556 struct gfc_expr *num_workers_expr;
1557 struct gfc_expr *vector_length_expr;
1558 gfc_expr_list *wait_list;
1559 gfc_expr_list *tile_list;
1560 unsigned async:1, gang:1, worker:1, vector:1, seq:1, independent:1;
fc2a1f2f 1561 unsigned par_auto:1, gang_static:1;
829c6349 1562 unsigned if_present:1, finalize:1;
a61f6afb 1563 unsigned nohost:1;
41dbbb37 1564 locus loc;
6c7a4dfd
JJ
1565}
1566gfc_omp_clauses;
1567
ece3f663 1568#define gfc_get_omp_clauses() XCNEW (gfc_omp_clauses)
6c7a4dfd 1569
6de9cd9a 1570
dc7a8b4b
JN
1571/* Node in the linked list used for storing !$oacc declare constructs. */
1572
1573typedef struct gfc_oacc_declare
1574{
1575 struct gfc_oacc_declare *next;
1576 bool module_var;
1577 gfc_omp_clauses *clauses;
1578 locus loc;
1579}
1580gfc_oacc_declare;
1581
1582#define gfc_get_oacc_declare() XCNEW (gfc_oacc_declare)
1583
1584
dd2fc525
JJ
1585/* Node in the linked list used for storing !$omp declare simd constructs. */
1586
1587typedef struct gfc_omp_declare_simd
1588{
1589 struct gfc_omp_declare_simd *next;
1590 locus where; /* Where the !$omp declare simd construct occurred. */
1591
1592 gfc_symbol *proc_name;
1593
1594 gfc_omp_clauses *clauses;
1595}
1596gfc_omp_declare_simd;
1597#define gfc_get_omp_declare_simd() XCNEW (gfc_omp_declare_simd)
1598
724ee5a0
KCY
1599
1600enum gfc_omp_trait_property_kind
1601{
1602 CTX_PROPERTY_NONE,
1603 CTX_PROPERTY_USER,
1604 CTX_PROPERTY_NAME_LIST,
1605 CTX_PROPERTY_ID,
1606 CTX_PROPERTY_EXPR,
1607 CTX_PROPERTY_SIMD
1608};
1609
1610typedef struct gfc_omp_trait_property
1611{
1612 struct gfc_omp_trait_property *next;
1613 enum gfc_omp_trait_property_kind property_kind;
1614 bool is_name : 1;
1615
1616 union
1617 {
1618 gfc_expr *expr;
1619 gfc_symbol *sym;
1620 gfc_omp_clauses *clauses;
1621 char *name;
1622 };
1623} gfc_omp_trait_property;
1624#define gfc_get_omp_trait_property() XCNEW (gfc_omp_trait_property)
1625
1626typedef struct gfc_omp_selector
1627{
1628 struct gfc_omp_selector *next;
1629
1630 char *trait_selector_name;
1631 gfc_expr *score;
1632 struct gfc_omp_trait_property *properties;
1633} gfc_omp_selector;
1634#define gfc_get_omp_selector() XCNEW (gfc_omp_selector)
1635
1636typedef struct gfc_omp_set_selector
1637{
1638 struct gfc_omp_set_selector *next;
1639
1640 const char *trait_set_selector_name;
1641 struct gfc_omp_selector *trait_selectors;
1642} gfc_omp_set_selector;
1643#define gfc_get_omp_set_selector() XCNEW (gfc_omp_set_selector)
1644
1645
1646/* Node in the linked list used for storing !$omp declare variant
1647 constructs. */
1648
1649typedef struct gfc_omp_declare_variant
1650{
1651 struct gfc_omp_declare_variant *next;
1652 locus where; /* Where the !$omp declare variant construct occurred. */
1653
1654 struct gfc_symtree *base_proc_symtree;
1655 struct gfc_symtree *variant_proc_symtree;
1656
1657 gfc_omp_set_selector *set_selectors;
1658
1659 bool checked_p : 1; /* Set if previously checked for errors. */
1660 bool error_p : 1; /* Set if error found in directive. */
1661}
1662gfc_omp_declare_variant;
1663#define gfc_get_omp_declare_variant() XCNEW (gfc_omp_declare_variant)
1664
1665
5f23671d
JJ
1666typedef struct gfc_omp_udr
1667{
1668 struct gfc_omp_udr *next;
1669 locus where; /* Where the !$omp declare reduction construct occurred. */
1670
1671 const char *name;
1672 gfc_typespec ts;
1673 gfc_omp_reduction_op rop;
1674
1675 struct gfc_symbol *omp_out;
1676 struct gfc_symbol *omp_in;
1677 struct gfc_namespace *combiner_ns;
1678
1679 struct gfc_symbol *omp_priv;
1680 struct gfc_symbol *omp_orig;
1681 struct gfc_namespace *initializer_ns;
1682}
1683gfc_omp_udr;
1684#define gfc_get_omp_udr() XCNEW (gfc_omp_udr)
dd2fc525 1685
b46ebd6c
JJ
1686typedef struct gfc_omp_namelist_udr
1687{
1688 struct gfc_omp_udr *udr;
1689 struct gfc_code *combiner;
1690 struct gfc_code *initializer;
1691}
1692gfc_omp_namelist_udr;
1693#define gfc_get_omp_namelist_udr() XCNEW (gfc_omp_namelist_udr)
1694
d80c695f
TS
1695/* The gfc_st_label structure is a BBT attached to a namespace that
1696 records the usage of statement labels within that space. */
1697
6de9cd9a
DN
1698typedef struct gfc_st_label
1699{
5cf54585
TS
1700 BBT_HEADER(gfc_st_label);
1701
6de9cd9a
DN
1702 int value;
1703
1704 gfc_sl_type defined, referenced;
1705
1706 struct gfc_expr *format;
1707
1708 tree backend_decl;
1709
1710 locus where;
388902da
LK
1711
1712 gfc_namespace *ns;
6de9cd9a
DN
1713}
1714gfc_st_label;
1715
1716
1717/* gfc_interface()-- Interfaces are lists of symbols strung together. */
1718typedef struct gfc_interface
1719{
1720 struct gfc_symbol *sym;
1721 locus where;
1722 struct gfc_interface *next;
1723}
1724gfc_interface;
1725
ece3f663 1726#define gfc_get_interface() XCNEW (gfc_interface)
6de9cd9a 1727
6de9cd9a
DN
1728/* User operator nodes. These are like stripped down symbols. */
1729typedef struct
1730{
cb9e4f55 1731 const char *name;
6de9cd9a 1732
8b11b59f 1733 gfc_interface *op;
6de9cd9a
DN
1734 struct gfc_namespace *ns;
1735 gfc_access access;
1736}
1737gfc_user_op;
1738
30b608eb 1739
e157f736
DK
1740/* A list of specific bindings that are associated with a generic spec. */
1741typedef struct gfc_tbp_generic
1742{
1743 /* The parser sets specific_st, upon resolution we look for the corresponding
1744 gfc_typebound_proc and set specific for further use. */
1745 struct gfc_symtree* specific_st;
1746 struct gfc_typebound_proc* specific;
1747
1748 struct gfc_tbp_generic* next;
218e1228 1749 bool is_operator;
e157f736
DK
1750}
1751gfc_tbp_generic;
1752
1753#define gfc_get_tbp_generic() XCNEW (gfc_tbp_generic)
1754
1755
30b608eb 1756/* Data needed for type-bound procedures. */
e157f736 1757typedef struct gfc_typebound_proc
30b608eb 1758{
e157f736
DK
1759 locus where; /* Where the PROCEDURE/GENERIC definition was. */
1760
1761 union
1762 {
b0e5fa94 1763 struct gfc_symtree* specific; /* The interface if DEFERRED. */
e157f736
DK
1764 gfc_tbp_generic* generic;
1765 }
1766 u;
30b608eb
DK
1767
1768 gfc_access access;
90661f26 1769 const char* pass_arg; /* Argument-name for PASS. NULL if not specified. */
30b608eb 1770
e157f736
DK
1771 /* The overridden type-bound proc (or GENERIC with this name in the
1772 parent-type) or NULL if non. */
1773 struct gfc_typebound_proc* overridden;
1774
30b608eb
DK
1775 /* Once resolved, we use the position of pass_arg in the formal arglist of
1776 the binding-target procedure to identify it. The first argument has
8e1f752a 1777 number 1 here, the second 2, and so on. */
30b608eb
DK
1778 unsigned pass_arg_num;
1779
1780 unsigned nopass:1; /* Whether we have NOPASS (PASS otherwise). */
1781 unsigned non_overridable:1;
b0e5fa94 1782 unsigned deferred:1;
e157f736
DK
1783 unsigned is_generic:1;
1784 unsigned function:1, subroutine:1;
b82657f4 1785 unsigned error:1; /* Ignore it, when an error occurred during resolution. */
90661f26 1786 unsigned ppc:1;
30b608eb
DK
1787}
1788gfc_typebound_proc;
1789
1790
6de9cd9a
DN
1791/* Symbol nodes. These are important things. They are what the
1792 standard refers to as "entities". The possibly multiple names that
1793 refer to the same entity are accomplished by a binary tree of
1794 symtree structures that is balanced by the red-black method-- more
1795 than one symtree node can point to any given symbol. */
1796
1797typedef struct gfc_symbol
1798{
cb9e4f55
TS
1799 const char *name; /* Primary name, before renaming */
1800 const char *module; /* Module this symbol came from */
6de9cd9a
DN
1801 locus declared_at;
1802
1803 gfc_typespec ts;
1804 symbol_attribute attr;
1805
32d99e68 1806 /* The formal member points to the formal argument list if the
6de9cd9a
DN
1807 symbol is a function or subroutine name. If the symbol is a
1808 generic name, the generic member points to the list of
1809 interfaces. */
1810
1811 gfc_interface *generic;
1812 gfc_access component_access;
1813
1814 gfc_formal_arglist *formal;
1815 struct gfc_namespace *formal_ns;
34523524
DK
1816 struct gfc_namespace *f2k_derived;
1817
5bab4c96
PT
1818 /* List of PDT parameter expressions */
1819 struct gfc_actual_arglist *param_list;
1820
6de9cd9a
DN
1821 struct gfc_expr *value; /* Parameter/Initializer value */
1822 gfc_array_spec *as;
1823 struct gfc_symbol *result; /* function result symbol */
1824 gfc_component *components; /* Derived type components */
1825
83d890b9
AL
1826 /* Defined only for Cray pointees; points to their pointer. */
1827 struct gfc_symbol *cp_pointer;
1828
e53b6e56 1829 int entry_id; /* Used in resolve.cc for entries. */
cf2b3c22 1830
7c1dab0d
JW
1831 /* CLASS hashed name for declared and dynamic types in the class. */
1832 int hash_value;
cf2b3c22 1833
9056bd70 1834 struct gfc_symbol *common_next; /* Links for COMMON syms */
30aabb86 1835
a70ba41f
MM
1836 /* This is only used for pointer comparisons to check if symbols
1837 are in the same common block.
1838 In opposition to common_block, the common_head pointer takes into account
1839 equivalences: if A is in a common block C and A and B are in equivalence,
1840 then both A and B have common_head pointing to C, while A's common_block
1841 points to C and B's is NULL. */
30aabb86
PT
1842 struct gfc_common_head* common_head;
1843
6de9cd9a
DN
1844 /* Make sure setup code for dummy arguments is generated in the correct
1845 order. */
1846 int dummy_order;
1847
1848 gfc_namelist *namelist, *namelist_tail;
1849
1850 /* Change management fields. Symbols that might be modified by the
c064374d 1851 current statement have the mark member nonzero. Of these symbols,
6de9cd9a
DN
1852 symbols with old_symbol equal to NULL are symbols created within
1853 the current statement. Otherwise, old_symbol points to a copy of
e53b6e56 1854 the old symbol. gfc_new is used in symbol.cc to flag new symbols.
278c3214
JB
1855 comp_mark is used to indicate variables which have component accesses
1856 in OpenMP/OpenACC directive clauses. */
c064374d 1857 struct gfc_symbol *old_symbol;
278c3214 1858 unsigned mark:1, comp_mark:1, gfc_new:1;
c064374d
PT
1859
1860 /* The tlink field is used in the front end to carry the module
1861 declaration of separate module procedures so that the characteristics
1862 can be compared with the corresponding declaration in a submodule. In
1863 translation this field carries a linked list of symbols that require
1864 deferred initialization. */
1865 struct gfc_symbol *tlink;
1866
5291e69a
PB
1867 /* Nonzero if all equivalences associated with this symbol have been
1868 processed. */
1869 unsigned equiv_built:1;
31708dc6
RS
1870 /* Set if this variable is used as an index name in a FORALL. */
1871 unsigned forall_index:1;
345bd7eb
PT
1872 /* Set if the symbol is used in a function result specification . */
1873 unsigned fn_result_spec:1;
4af8d042 1874 /* Used to avoid multiple resolutions of a single symbol. */
dbeaa7ab
ME
1875 /* = 2 if this has already been resolved as an intrinsic,
1876 in gfc_resolve_intrinsic,
1877 = 1 if it has been resolved in resolve_symbol. */
1878 unsigned resolve_symbol_called:2;
4668d6f9
PT
1879 /* Set if this is a module function or subroutine with the
1880 abreviated declaration in a submodule. */
1881 unsigned abr_modproc_decl:1;
e0b9e5f9
TK
1882 /* Set if a previous error or warning has occurred and no other
1883 should be reported. */
1884 unsigned error:1;
4a4fc7fe
TK
1885 /* Set if the dummy argument of a procedure could be an array despite
1886 being called with a scalar actual argument. */
1887 unsigned maybe_array:1;
47d13acb
TK
1888 /* Set if this should be passed by value, but is not a VALUE argument
1889 according to the Fortran standard. */
1890 unsigned pass_as_value:1;
4af8d042 1891
6de9cd9a
DN
1892 int refs;
1893 struct gfc_namespace *ns; /* namespace containing this symbol */
1894
1895 tree backend_decl;
4d382327 1896
a8b3b0b6
CR
1897 /* Identity of the intrinsic module the symbol comes from, or
1898 INTMOD_NONE if it's not imported from a intrinsic module. */
1899 intmod_id from_intmod;
1900 /* Identity of the symbol from intrinsic modules, from enums maintained
1901 separately by each intrinsic module. Used together with from_intmod,
1902 it uniquely identifies a symbol from an intrinsic module. */
1903 int intmod_sym_id;
1904
1905 /* This may be repetitive, since the typespec now has a binding
1906 label field. */
9975a30b 1907 const char* binding_label;
a8b3b0b6
CR
1908 /* Store a reference to the common_block, if this symbol is in one. */
1909 struct gfc_common_head *common_block;
03af1e4c
DK
1910
1911 /* Link to corresponding association-list if this is an associate name. */
1912 struct gfc_association_list *assoc;
20e8ceae
AB
1913
1914 /* Link to next entry in derived type list */
1915 struct gfc_symbol *dt_next;
6de9cd9a
DN
1916}
1917gfc_symbol;
1918
dd355a42
MM
1919
1920struct gfc_undo_change_set
1921{
1922 vec<gfc_symbol *> syms;
1923 vec<gfc_typebound_proc *> tbps;
ab68a73e 1924 gfc_undo_change_set *previous;
dd355a42
MM
1925};
1926
1927
9056bd70 1928/* This structure is used to keep track of symbols in common blocks. */
30aabb86 1929typedef struct gfc_common_head
9056bd70
TS
1930{
1931 locus where;
b4c3a85b
JJ
1932 char use_assoc, saved, threadprivate;
1933 unsigned char omp_declare_target : 1;
1934 unsigned char omp_declare_target_link : 1;
d58e7173 1935 ENUM_BITFIELD (gfc_omp_device_type) omp_device_type:2;
3345e742
HA
1936 /* Provide sufficient space to hold "symbol.symbol.eq.1234567890". */
1937 char name[2*GFC_MAX_SYMBOL_LEN + 1 + 14 + 1];
30aabb86 1938 struct gfc_symbol *head;
9975a30b 1939 const char* binding_label;
a8b3b0b6 1940 int is_bind_c;
6f79f4d1 1941 int refs;
949446f5 1942}
9056bd70
TS
1943gfc_common_head;
1944
ece3f663 1945#define gfc_get_common_head() XCNEW (gfc_common_head)
9056bd70
TS
1946
1947
3d79abbd
PB
1948/* A list of all the alternate entry points for a procedure. */
1949
1950typedef struct gfc_entry_list
1951{
1952 /* The symbol for this entry point. */
1953 gfc_symbol *sym;
1954 /* The zero-based id of this entry point. */
1955 int id;
1956 /* The LABEL_EXPR marking this entry point. */
1957 tree label;
1933ba0f 1958 /* The next item in the list. */
3d79abbd
PB
1959 struct gfc_entry_list *next;
1960}
1961gfc_entry_list;
1962
93acb62c 1963#define gfc_get_entry_list() XCNEW (gfc_entry_list)
9056bd70 1964
a64f5186
JJ
1965/* Lists of rename info for the USE statement. */
1966
1967typedef struct gfc_use_rename
1968{
1969 char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
1970 struct gfc_use_rename *next;
1971 int found;
1972 gfc_intrinsic_op op;
1973 locus where;
1974}
1975gfc_use_rename;
1976
1977#define gfc_get_use_rename() XCNEW (gfc_use_rename);
1978
1979/* A list of all USE statements in a namespace. */
1980
1981typedef struct gfc_use_list
1982{
1983 const char *module_name;
3d5dc929 1984 const char *submodule_name;
e9078ebb
TB
1985 bool intrinsic;
1986 bool non_intrinsic;
1987 bool only_flag;
a64f5186 1988 struct gfc_use_rename *rename;
9268ba9a 1989 locus where;
a64f5186
JJ
1990 /* Next USE statement. */
1991 struct gfc_use_list *next;
1992}
1993gfc_use_list;
1994
93acb62c 1995#define gfc_get_use_list() XCNEW (gfc_use_list)
a64f5186 1996
6de9cd9a
DN
1997/* Within a namespace, symbols are pointed to by symtree nodes that
1998 are linked together in a balanced binary tree. There can be
1999 several symtrees pointing to the same symbol node via USE
2000 statements. */
2001
6de9cd9a
DN
2002typedef struct gfc_symtree
2003{
2004 BBT_HEADER (gfc_symtree);
cb9e4f55 2005 const char *name;
6de9cd9a
DN
2006 int ambiguous;
2007 union
2008 {
2009 gfc_symbol *sym; /* Symbol associated with this node */
2010 gfc_user_op *uop;
9056bd70 2011 gfc_common_head *common;
e34ccb4c 2012 gfc_typebound_proc *tb;
5f23671d 2013 gfc_omp_udr *omp_udr;
6de9cd9a
DN
2014 }
2015 n;
6de9cd9a
DN
2016}
2017gfc_symtree;
2018
20e8ceae
AB
2019/* A list of all derived types. */
2020extern gfc_symbol *gfc_derived_types;
6b887797 2021
db941d7e
CP
2022typedef struct gfc_oacc_routine_name
2023{
2024 struct gfc_symbol *sym;
2025 struct gfc_omp_clauses *clauses;
2026 struct gfc_oacc_routine_name *next;
f6bf4bc1 2027 locus loc;
db941d7e
CP
2028}
2029gfc_oacc_routine_name;
2030
2031#define gfc_get_oacc_routine_name() XCNEW (gfc_oacc_routine_name)
2032
1af22e45
TK
2033/* Node in linked list to see what has already been finalized
2034 earlier. */
2035
2036typedef struct gfc_was_finalized {
2037 gfc_expr *e;
2038 gfc_component *c;
2039 struct gfc_was_finalized *next;
2040}
2041gfc_was_finalized;
2042
9abe5e56
DK
2043/* A namespace describes the contents of procedure, module, interface block
2044 or BLOCK construct. */
3d79abbd
PB
2045/* ??? Anything else use these? */
2046
6de9cd9a
DN
2047typedef struct gfc_namespace
2048{
4f613946
TS
2049 /* Tree containing all the symbols in this namespace. */
2050 gfc_symtree *sym_root;
2051 /* Tree containing all the user-defined operators in the namespace. */
2052 gfc_symtree *uop_root;
2053 /* Tree containing all the common blocks. */
949446f5 2054 gfc_symtree *common_root;
5f23671d
JJ
2055 /* Tree containing all the OpenMP user defined reductions. */
2056 gfc_symtree *omp_udr_root;
e34ccb4c
DK
2057
2058 /* Tree containing type-bound procedures. */
2059 gfc_symtree *tb_sym_root;
94747289
DK
2060 /* Type-bound user operators. */
2061 gfc_symtree *tb_uop_root;
2062 /* For derived-types, store type-bound intrinsic operators here. */
2063 gfc_typebound_proc *tb_op[GFC_INTRINSIC_OPS];
34523524
DK
2064 /* Linked list of finalizer procedures. */
2065 struct gfc_finalizer *finalizers;
6de9cd9a 2066
4f613946 2067 /* If set_flag[letter] is set, an implicit type has been set for letter. */
6de9cd9a 2068 int set_flag[GFC_LETTERS];
4f613946
TS
2069 /* Keeps track of the implicit types associated with the letters. */
2070 gfc_typespec default_type[GFC_LETTERS];
52f49934
DK
2071 /* Store the positions of IMPLICIT statements. */
2072 locus implicit_loc[GFC_LETTERS];
6de9cd9a 2073
4f613946 2074 /* If this is a namespace of a procedure, this points to the procedure. */
6de9cd9a 2075 struct gfc_symbol *proc_name;
4f613946
TS
2076 /* If this is the namespace of a unit which contains executable
2077 code, this points to it. */
6de9cd9a 2078 struct gfc_code *code;
4f613946
TS
2079
2080 /* Points to the equivalences set up in this namespace. */
31fee91e 2081 struct gfc_equiv *equiv, *old_equiv;
61321991
PT
2082
2083 /* Points to the equivalence groups produced by trans_common. */
2084 struct gfc_equiv_list *equiv_lists;
2085
a1ee985f 2086 gfc_interface *op[GFC_INTRINSIC_OPS];
4f613946
TS
2087
2088 /* Points to the parent namespace, i.e. the namespace of a module or
2089 procedure in which the procedure belonging to this namespace is
2090 contained. The parent namespace points to this namespace either
2091 directly via CONTAINED, or indirectly via the chain built by
2092 SIBLING. */
2093 struct gfc_namespace *parent;
2094 /* CONTAINED points to the first contained namespace. Sibling
2095 namespaces are chained via SIBLING. */
2096 struct gfc_namespace *contained, *sibling;
2097
2098 gfc_common_head blank_common;
6de9cd9a
DN
2099 gfc_access default_access, operator_access[GFC_INTRINSIC_OPS];
2100
2101 gfc_st_label *st_labels;
294fbfc8
TS
2102 /* This list holds information about all the data initializers in
2103 this namespace. */
d5e2274d 2104 struct gfc_data *data, *old_data;
6de9cd9a 2105
dc7a8b4b
JN
2106 /* !$ACC DECLARE. */
2107 gfc_oacc_declare *oacc_declare;
41dbbb37 2108
db941d7e
CP
2109 /* !$ACC ROUTINE clauses. */
2110 gfc_omp_clauses *oacc_routine_clauses;
2111
d2ad748e
SL
2112 /* !$ACC TASK AFFINITY iterator symbols. */
2113 gfc_symbol *omp_affinity_iterators;
2114
db941d7e
CP
2115 /* !$ACC ROUTINE names. */
2116 gfc_oacc_routine_name *oacc_routine_names;
2117
d0803c0c 2118 gfc_charlen *cl_list;
6de9cd9a 2119
20e8ceae 2120 gfc_symbol *derived_types;
3af8d8cb 2121
4c1f4f52 2122 int save_all, seen_save, seen_implicit_none;
3d79abbd
PB
2123
2124 /* Normally we don't need to refcount namespaces. However when we read
2125 a module containing a function with multiple entry points, this
2126 will appear as several functions with the same formal namespace. */
2127 int refs;
2128
2129 /* A list of all alternate entry points to this procedure (or NULL). */
2130 gfc_entry_list *entries;
0de4325e 2131
a64f5186
JJ
2132 /* A list of USE statements in this namespace. */
2133 gfc_use_list *use_stmts;
2134
dd2fc525
JJ
2135 /* Linked list of !$omp declare simd constructs. */
2136 struct gfc_omp_declare_simd *omp_declare_simd;
2137
724ee5a0
KCY
2138 /* Linked list of !$omp declare variant constructs. */
2139 struct gfc_omp_declare_variant *omp_declare_variant;
2140
027e3041 2141 /* A hash set for the gfc expressions that have already
1af22e45
TK
2142 been finalized in this namespace. */
2143
2144 gfc_was_finalized *was_finalized;
2145
0de4325e 2146 /* Set to 1 if namespace is a BLOCK DATA program unit. */
9abe5e56 2147 unsigned is_block_data:1;
8998be20
TB
2148
2149 /* Set to 1 if namespace is an interface body with "IMPORT" used. */
9abe5e56 2150 unsigned has_import_set:1;
71a7778c 2151
8b7a967e
TB
2152 /* Set to 1 if the namespace uses "IMPLICT NONE (export)". */
2153 unsigned has_implicit_none_export:1;
2154
204803dc
JR
2155 /* Set to 1 if resolved has been called for this namespace.
2156 Holds -1 during resolution. */
2157 signed resolved:2;
3af8d8cb 2158
2b91aea8
MM
2159 /* Set when resolve_types has been called for this namespace. */
2160 unsigned types_resolved:1;
2161
3af8d8cb 2162 /* Set to 1 if code has been generated for this namespace. */
9abe5e56
DK
2163 unsigned translated:1;
2164
2165 /* Set to 1 if symbols in this namespace should be 'construct entities',
2166 i.e. for BLOCK local variables. */
2167 unsigned construct_entities:1;
5f23671d
JJ
2168
2169 /* Set to 1 for !$OMP DECLARE REDUCTION namespaces. */
2170 unsigned omp_udr_ns:1;
db941d7e
CP
2171
2172 /* Set to 1 for !$ACC ROUTINE namespaces. */
2173 unsigned oacc_routine:1;
ffeebc4f
JJ
2174
2175 /* Set to 1 if there are any calls to procedures with implicit interface. */
2176 unsigned implicit_interface_calls:1;
269322ec
TB
2177
2178 /* OpenMP requires. */
2179 unsigned omp_requires:6;
2180 unsigned omp_target_seen:1;
6de9cd9a
DN
2181}
2182gfc_namespace;
2183
2184extern gfc_namespace *gfc_current_ns;
71a7778c 2185extern gfc_namespace *gfc_global_ns_list;
6de9cd9a 2186
c9543002
TS
2187/* Global symbols are symbols of global scope. Currently we only use
2188 this to detect collisions already when parsing.
2189 TODO: Extend to verify procedure calls. */
2190
32e8bb8e
ILT
2191enum gfc_symbol_type
2192{
2193 GSYM_UNKNOWN=1, GSYM_PROGRAM, GSYM_FUNCTION, GSYM_SUBROUTINE,
2194 GSYM_MODULE, GSYM_COMMON, GSYM_BLOCK_DATA
2195};
2196
c9543002
TS
2197typedef struct gfc_gsymbol
2198{
2199 BBT_HEADER(gfc_gsymbol);
2200
973a384d 2201 const char *name;
a8b3b0b6
CR
2202 const char *sym_name;
2203 const char *mod_name;
2204 const char *binding_label;
32e8bb8e 2205 enum gfc_symbol_type type;
c9543002
TS
2206
2207 int defined, used;
55b9c612 2208 bool bind_c;
c9543002 2209 locus where;
71a7778c 2210 gfc_namespace *ns;
c9543002
TS
2211}
2212gfc_gsymbol;
2213
2214extern gfc_gsymbol *gfc_gsym_root;
6de9cd9a
DN
2215
2216/* Information on interfaces being built. */
2217typedef struct
2218{
2219 interface_type type;
2220 gfc_symbol *sym;
2221 gfc_namespace *ns;
2222 gfc_user_op *uop;
2223 gfc_intrinsic_op op;
2224}
2225gfc_interface_info;
2226
2227extern gfc_interface_info current_interface;
2228
2229
2230/* Array reference. */
32e8bb8e
ILT
2231
2232enum gfc_array_ref_dimen_type
2233{
a3935ffc 2234 DIMEN_ELEMENT = 1, DIMEN_RANGE, DIMEN_VECTOR, DIMEN_STAR, DIMEN_THIS_IMAGE, DIMEN_UNKNOWN
32e8bb8e
ILT
2235};
2236
6de9cd9a
DN
2237typedef struct gfc_array_ref
2238{
2239 ar_type type;
2240 int dimen; /* # of components in the reference */
d3a9eea2
TB
2241 int codimen;
2242 bool in_allocate; /* For coarray checks. */
f8862a1b 2243 gfc_expr *team;
20d0bfce 2244 gfc_expr *stat;
6de9cd9a
DN
2245 locus where;
2246 gfc_array_spec *as;
2247
2248 locus c_where[GFC_MAX_DIMENSIONS]; /* All expressions can be NULL */
2249 struct gfc_expr *start[GFC_MAX_DIMENSIONS], *end[GFC_MAX_DIMENSIONS],
2250 *stride[GFC_MAX_DIMENSIONS];
2251
32e8bb8e 2252 enum gfc_array_ref_dimen_type dimen_type[GFC_MAX_DIMENSIONS];
6de9cd9a
DN
2253}
2254gfc_array_ref;
2255
ece3f663 2256#define gfc_get_array_ref() XCNEW (gfc_array_ref)
6de9cd9a
DN
2257
2258
2259/* Component reference nodes. A variable is stored as an expression
2260 node that points to the base symbol. After that, a singly linked
2261 list of component reference nodes gives the variable's complete
2262 resolution. The array_ref component may be present and comes
2263 before the component component. */
2264
a79683d5 2265enum ref_type
a5fbc2f3
PT
2266 { REF_ARRAY, REF_COMPONENT, REF_SUBSTRING, REF_INQUIRY };
2267
2268enum inquiry_type
2269 { INQUIRY_RE, INQUIRY_IM, INQUIRY_KIND, INQUIRY_LEN };
6de9cd9a
DN
2270
2271typedef struct gfc_ref
2272{
2273 ref_type type;
2274
2275 union
2276 {
2277 struct gfc_array_ref ar;
2278
2279 struct
2280 {
2281 gfc_component *component;
2282 gfc_symbol *sym;
2283 }
2284 c;
2285
2286 struct
2287 {
2288 struct gfc_expr *start, *end; /* Substring */
2289 gfc_charlen *length;
2290 }
2291 ss;
2292
a5fbc2f3
PT
2293 inquiry_type i;
2294
6de9cd9a
DN
2295 }
2296 u;
2297
2298 struct gfc_ref *next;
2299}
2300gfc_ref;
2301
ece3f663 2302#define gfc_get_ref() XCNEW (gfc_ref)
6de9cd9a
DN
2303
2304
2305/* Structures representing intrinsic symbols and their arguments lists. */
2306typedef struct gfc_intrinsic_arg
2307{
2308 char name[GFC_MAX_SYMBOL_LEN + 1];
2309
2310 gfc_typespec ts;
47b99694 2311 unsigned optional:1, value:1;
23e38561 2312 ENUM_BITFIELD (sym_intent) intent:2;
6de9cd9a
DN
2313
2314 struct gfc_intrinsic_arg *next;
6de9cd9a
DN
2315}
2316gfc_intrinsic_arg;
2317
2318
5888512f
MM
2319typedef enum {
2320 GFC_UNDEFINED_DUMMY_ARG = 0,
2321 GFC_INTRINSIC_DUMMY_ARG,
2322 GFC_NON_INTRINSIC_DUMMY_ARG
2323}
2324gfc_dummy_arg_intrinsicness;
2325
2326/* dummy arg of either an intrinsic or a user-defined procedure. */
2327struct gfc_dummy_arg
2328{
2329 gfc_dummy_arg_intrinsicness intrinsicness;
2330
2331 union {
2332 gfc_intrinsic_arg *intrinsic;
2333 gfc_formal_arglist *non_intrinsic;
2334 } u;
2335};
2336
2337#define gfc_get_dummy_arg() XCNEW (gfc_dummy_arg)
2338
2339
48a8c5be 2340const char * gfc_dummy_arg_get_name (gfc_dummy_arg &);
5d9d16db
MM
2341const gfc_typespec & gfc_dummy_arg_get_typespec (gfc_dummy_arg &);
2342bool gfc_dummy_arg_is_optional (gfc_dummy_arg &);
2343
2344
4f613946
TS
2345/* Specifies the various kinds of check functions used to verify the
2346 argument lists of intrinsic functions. fX with X an integer refer
2347 to check functions of intrinsics with X arguments. f1m is used for
2348 the MAX and MIN intrinsics which can have an arbitrary number of
9a3d38f6 2349 arguments, f4ml is used for the MINLOC and MAXLOC intrinsics as
4f613946
TS
2350 these have special semantics. */
2351
6de9cd9a
DN
2352typedef union
2353{
524af0d6
JB
2354 bool (*f0)(void);
2355 bool (*f1)(struct gfc_expr *);
2356 bool (*f1m)(gfc_actual_arglist *);
2357 bool (*f2)(struct gfc_expr *, struct gfc_expr *);
2358 bool (*f3)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
64b1806b 2359 bool (*f5ml)(gfc_actual_arglist *);
01ce9e31 2360 bool (*f6fl)(gfc_actual_arglist *);
524af0d6
JB
2361 bool (*f3red)(gfc_actual_arglist *);
2362 bool (*f4)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
6de9cd9a 2363 struct gfc_expr *);
524af0d6 2364 bool (*f5)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
6de9cd9a
DN
2365 struct gfc_expr *, struct gfc_expr *);
2366}
2367gfc_check_f;
2368
4f613946
TS
2369/* Like gfc_check_f, these specify the type of the simplification
2370 function associated with an intrinsic. The fX are just like in
2371 gfc_check_f. cc is used for type conversion functions. */
6de9cd9a
DN
2372
2373typedef union
2374{
4c0c6b9f 2375 struct gfc_expr *(*f0)(void);
6de9cd9a
DN
2376 struct gfc_expr *(*f1)(struct gfc_expr *);
2377 struct gfc_expr *(*f2)(struct gfc_expr *, struct gfc_expr *);
2378 struct gfc_expr *(*f3)(struct gfc_expr *, struct gfc_expr *,
2379 struct gfc_expr *);
2380 struct gfc_expr *(*f4)(struct gfc_expr *, struct gfc_expr *,
2381 struct gfc_expr *, struct gfc_expr *);
2382 struct gfc_expr *(*f5)(struct gfc_expr *, struct gfc_expr *,
2383 struct gfc_expr *, struct gfc_expr *,
2384 struct gfc_expr *);
01ce9e31
TK
2385 struct gfc_expr *(*f6)(struct gfc_expr *, struct gfc_expr *,
2386 struct gfc_expr *, struct gfc_expr *,
2387 struct gfc_expr *, struct gfc_expr *);
6de9cd9a
DN
2388 struct gfc_expr *(*cc)(struct gfc_expr *, bt, int);
2389}
2390gfc_simplify_f;
2391
4f613946 2392/* Again like gfc_check_f, these specify the type of the resolution
13795658 2393 function associated with an intrinsic. The fX are just like in
66e4ab31 2394 gfc_check_f. f1m is used for MIN and MAX, s1 is used for abort(). */
6de9cd9a
DN
2395
2396typedef union
2397{
2398 void (*f0)(struct gfc_expr *);
2399 void (*f1)(struct gfc_expr *, struct gfc_expr *);
2400 void (*f1m)(struct gfc_expr *, struct gfc_actual_arglist *);
2401 void (*f2)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
2402 void (*f3)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
2403 struct gfc_expr *);
2404 void (*f4)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
2405 struct gfc_expr *, struct gfc_expr *);
2406 void (*f5)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
2407 struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
01ce9e31
TK
2408 void (*f6)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
2409 struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
2410 struct gfc_expr *);
6de9cd9a
DN
2411 void (*s1)(struct gfc_code *);
2412}
2413gfc_resolve_f;
2414
2415
2416typedef struct gfc_intrinsic_sym
2417{
cb9e4f55 2418 const char *name, *lib_name;
6de9cd9a
DN
2419 gfc_intrinsic_arg *formal;
2420 gfc_typespec ts;
4d382327 2421 unsigned elemental:1, inquiry:1, transformational:1, pure:1,
d000aa67 2422 generic:1, specific:1, actual_ok:1, noreturn:1, conversion:1,
f1abbf69 2423 from_module:1, vararg:1;
e1633d82
DF
2424
2425 int standard;
6de9cd9a
DN
2426
2427 gfc_simplify_f simplify;
2428 gfc_check_f check;
2429 gfc_resolve_f resolve;
2430 struct gfc_intrinsic_sym *specific_head, *next;
cd5ecab6 2431 gfc_isym_id id;
6de9cd9a
DN
2432
2433}
2434gfc_intrinsic_sym;
2435
2436
2437/* Expression nodes. The expression node types deserve explanations,
2438 since the last couple can be easily misconstrued:
2439
2440 EXPR_OP Operator node pointing to one or two other nodes
2441 EXPR_FUNCTION Function call, symbol points to function's name
2442 EXPR_CONSTANT A scalar constant: Logical, String, Real, Int or Complex
2443 EXPR_VARIABLE An Lvalue with a root symbol and possible reference list
8e1f752a 2444 which expresses structure, array and substring refs.
6de9cd9a
DN
2445 EXPR_NULL The NULL pointer value (which also has a basic type).
2446 EXPR_SUBSTRING A substring of a constant string
2447 EXPR_STRUCTURE A structure constructor
8e1f752a
DK
2448 EXPR_ARRAY An array constructor.
2449 EXPR_COMPCALL Function (or subroutine) call of a procedure pointer
2450 component or type-bound procedure. */
6de9cd9a 2451
f8e566e5 2452#include <mpfr.h>
eb6f9a86 2453#include <mpc.h>
c9d4cc5d 2454#define GFC_RND_MODE MPFR_RNDN
f6b855df 2455#define GFC_MPC_RND_MODE MPC_RNDNN
6de9cd9a 2456
b7e75771
JD
2457typedef splay_tree gfc_constructor_base;
2458
f622221a
JB
2459
2460/* This should be an unsigned variable of type size_t. But to handle
2461 compiling to a 64-bit target from a 32-bit host, we need to use a
2462 HOST_WIDE_INT. Also, occasionally the string length field is used
2463 as a flag with values -1 and -2, see e.g. gfc_add_assign_aux_vars.
2464 So it needs to be signed. */
2465typedef HOST_WIDE_INT gfc_charlen_t;
2466
6de9cd9a
DN
2467typedef struct gfc_expr
2468{
2469 expr_t expr_type;
2470
2471 gfc_typespec ts; /* These two refer to the overall expression */
2472
c62c6622 2473 int rank; /* 0 indicates a scalar, -1 an assumed-rank array. */
6de9cd9a
DN
2474 mpz_t *shape; /* Can be NULL if shape is unknown at compile time */
2475
4a44a72d
DK
2476 /* Nonnull for functions and structure constructors, may also used to hold the
2477 base-object for component calls. */
6de9cd9a
DN
2478 gfc_symtree *symtree;
2479
6de9cd9a
DN
2480 gfc_ref *ref;
2481
6de9cd9a
DN
2482 locus where;
2483
94fae14b
PT
2484 /* Used to store the base expression in component calls, when the expression
2485 is not a variable. */
32a9b8e0 2486 struct gfc_expr *base_expr;
94fae14b 2487
8dc63166
SK
2488 /* is_snan denotes a signalling not-a-number. */
2489 unsigned int is_snan : 1;
20585ad6 2490
ebb479cd
PT
2491 /* Sometimes, when an error has been emitted, it is necessary to prevent
2492 it from recurring. */
2493 unsigned int error : 1;
4d382327 2494
94bff632 2495 /* Mark an expression where a user operator has been substituted by
e53b6e56 2496 a function call in interface.cc(gfc_extend_expr). */
a1ab6660 2497 unsigned int user_operator : 1;
ebb479cd 2498
94bff632
JW
2499 /* Mark an expression as being a MOLD argument of ALLOCATE. */
2500 unsigned int mold : 1;
4d382327 2501
43a68a9d
PT
2502 /* Will require finalization after use. */
2503 unsigned int must_finalize : 1;
2504
980fa45e
TK
2505 /* Set this if no range check should be performed on this expression. */
2506
2507 unsigned int no_bounds_check : 1;
2508
998511a6
TK
2509 /* Set this if a matmul expression has already been evaluated for conversion
2510 to a BLAS call. */
2511
2512 unsigned int external_blas : 1;
2513
01ce9e31
TK
2514 /* Set this if resolution has already happened. It could be harmful
2515 if done again. */
2516
2517 unsigned int do_not_resolve_again : 1;
2518
5197d799
TK
2519 /* Set this if no warning should be given somewhere in a lower level. */
2520
2521 unsigned int do_not_warn : 1;
4a4fc7fe
TK
2522
2523 /* Set this if the expression came from expanding an array constructor. */
2524 unsigned int from_constructor : 1;
2525
20585ad6
BM
2526 /* If an expression comes from a Hollerith constant or compile-time
2527 evaluation of a transfer statement, it may have a prescribed target-
2528 memory representation, and these cannot always be backformed from
2529 the value. */
2530 struct
2531 {
f622221a 2532 gfc_charlen_t length;
20585ad6
BM
2533 char *string;
2534 }
2535 representation;
2536
8dc63166
SK
2537 struct
2538 {
2539 int len; /* Length of BOZ string without terminating NULL. */
2540 int rdx; /* Radix of BOZ. */
2541 char *str; /* BOZ string with NULL terminating character. */
2542 }
2543 boz;
2544
6de9cd9a
DN
2545 union
2546 {
6de9cd9a 2547 int logical;
20585ad6 2548
ad7ee6f8
JD
2549 io_kind iokind;
2550
f8e566e5
SK
2551 mpz_t integer;
2552
2553 mpfr_t real;
6de9cd9a 2554
d0d92baf 2555 mpc_t complex;
6de9cd9a 2556
58b03ab2
TS
2557 struct
2558 {
a1ee985f 2559 gfc_intrinsic_op op;
58b03ab2
TS
2560 gfc_user_op *uop;
2561 struct gfc_expr *op1, *op2;
2562 }
2563 op;
2564
6de9cd9a
DN
2565 struct
2566 {
2567 gfc_actual_arglist *actual;
6b25a558 2568 const char *name; /* Points to the ultimate name of the function */
6de9cd9a
DN
2569 gfc_intrinsic_sym *isym;
2570 gfc_symbol *esym;
2571 }
2572 function;
2573
8e1f752a
DK
2574 struct
2575 {
2576 gfc_actual_arglist* actual;
e157f736 2577 const char* name;
4a44a72d
DK
2578 /* Base-object, whose component was called. NULL means that it should
2579 be taken from symtree/ref. */
2580 struct gfc_expr* base_object;
2581 gfc_typebound_proc* tbp; /* Should overlap with esym. */
2582
2583 /* For type-bound operators, we want to call PASS procedures but already
2584 have the full arglist; mark this, so that it is not extended by the
2585 PASS argument. */
2586 unsigned ignore_pass:1;
2587
2588 /* Do assign-calls rather than calls, that is appropriate dependency
2589 checking. */
2590 unsigned assign:1;
8e1f752a
DK
2591 }
2592 compcall;
2593
6de9cd9a
DN
2594 struct
2595 {
f622221a 2596 gfc_charlen_t length;
00660189 2597 gfc_char_t *string;
6de9cd9a
DN
2598 }
2599 character;
2600
b7e75771 2601 gfc_constructor_base constructor;
6de9cd9a
DN
2602 }
2603 value;
2604
5bab4c96
PT
2605 /* Used to store PDT expression lists associated with expressions. */
2606 gfc_actual_arglist *param_list;
2607
6de9cd9a
DN
2608}
2609gfc_expr;
2610
2611
93acb62c 2612#define gfc_get_shape(rank) (XCNEWVEC (mpz_t, (rank)))
6de9cd9a
DN
2613
2614/* Structures for information associated with different kinds of
2615 numbers. The first set of integer parameters define all there is
2616 to know about a particular kind. The rest of the elements are
2617 computed from the first elements. */
2618
2619typedef struct
2620{
e2cad04b 2621 /* Values really representable by the target. */
7bee49dc 2622 mpz_t huge, pedantic_min_int, min_int;
e2cad04b
RH
2623
2624 int kind, radix, digits, bit_size, range;
2625
2626 /* True if the C type of the given name maps to this precision.
2627 Note that more than one bit can be set. */
2628 unsigned int c_char : 1;
2629 unsigned int c_short : 1;
2630 unsigned int c_int : 1;
2631 unsigned int c_long : 1;
2632 unsigned int c_long_long : 1;
6de9cd9a
DN
2633}
2634gfc_integer_info;
2635
2636extern gfc_integer_info gfc_integer_kinds[];
2637
2638
2639typedef struct
2640{
2641 int kind, bit_size;
2642
e2cad04b
RH
2643 /* True if the C++ type bool, C99 type _Bool, maps to this precision. */
2644 unsigned int c_bool : 1;
6de9cd9a
DN
2645}
2646gfc_logical_info;
2647
2648extern gfc_logical_info gfc_logical_kinds[];
2649
2650
2651typedef struct
2652{
2d0aa65f 2653 mpfr_t epsilon, huge, tiny, subnormal;
90d6f0c7 2654 int kind, abi_kind, radix, digits, min_exponent, max_exponent;
6de9cd9a 2655 int range, precision;
e2cad04b
RH
2656
2657 /* The precision of the type as reported by GET_MODE_PRECISION. */
2658 int mode_precision;
2659
2660 /* True if the C type of the given name maps to this precision.
2661 Note that more than one bit can be set. */
2662 unsigned int c_float : 1;
2663 unsigned int c_double : 1;
2664 unsigned int c_long_double : 1;
a3c85b74 2665 unsigned int c_float128 : 1;
6de9cd9a
DN
2666}
2667gfc_real_info;
2668
2669extern gfc_real_info gfc_real_kinds[];
2670
374929b2
FXC
2671typedef struct
2672{
2673 int kind, bit_size;
2674 const char *name;
2675}
2676gfc_character_info;
2677
2678extern gfc_character_info gfc_character_kinds[];
2679
6de9cd9a
DN
2680
2681/* Equivalence structures. Equivalent lvalues are linked along the
2682 *eq pointer, equivalence sets are strung along the *next node. */
2683typedef struct gfc_equiv
2684{
2685 struct gfc_equiv *next, *eq;
2686 gfc_expr *expr;
30aabb86 2687 const char *module;
6de9cd9a
DN
2688 int used;
2689}
2690gfc_equiv;
2691
ece3f663 2692#define gfc_get_equiv() XCNEW (gfc_equiv)
6de9cd9a 2693
61321991
PT
2694/* Holds a single equivalence member after processing. */
2695typedef struct gfc_equiv_info
2696{
2697 gfc_symbol *sym;
2698 HOST_WIDE_INT offset;
37311e71 2699 HOST_WIDE_INT length;
61321991
PT
2700 struct gfc_equiv_info *next;
2701} gfc_equiv_info;
2702
2703/* Holds equivalence groups, after they have been processed. */
2704typedef struct gfc_equiv_list
2705{
2706 gfc_equiv_info *equiv;
2707 struct gfc_equiv_list *next;
2708} gfc_equiv_list;
6de9cd9a
DN
2709
2710/* gfc_case stores the selector list of a case statement. The *low
2711 and *high pointers can point to the same expression in the case of
2712 a single value. If *high is NULL, the selection is from *low
2713 upwards, if *low is NULL the selection is *high downwards.
2714
410d1a45
SK
2715 This structure has separate fields to allow single and double linked
2716 lists of CASEs at the same time. The singe linked list along the NEXT
6de9cd9a
DN
2717 field is a list of cases for a single CASE label. The double linked
2718 list along the LEFT/RIGHT fields is used to detect overlap and to
2719 build a table of the cases for SELECT constructs with a CHARACTER
2720 case expression. */
2721
2722typedef struct gfc_case
2723{
2724 /* Where we saw this case. */
2725 locus where;
2726 int n;
2727
2728 /* Case range values. If (low == high), it's a single value. If one of
2729 the labels is NULL, it's an unbounded case. If both are NULL, this
2730 represents the default case. */
2731 gfc_expr *low, *high;
2732
cf2b3c22
TB
2733 /* Only used for SELECT TYPE. */
2734 gfc_typespec ts;
2735
6de9cd9a
DN
2736 /* Next case label in the list of cases for a single CASE label. */
2737 struct gfc_case *next;
2738
2739 /* Used for detecting overlap, and for code generation. */
2740 struct gfc_case *left, *right;
2741
2742 /* True if this case label can never be matched. */
2743 int unreachable;
2744}
2745gfc_case;
2746
ece3f663 2747#define gfc_get_case() XCNEW (gfc_case)
6de9cd9a
DN
2748
2749
2750typedef struct
2751{
2752 gfc_expr *var, *start, *end, *step;
170a8bd6 2753 unsigned short unroll;
2bd86b95
HA
2754 bool ivdep;
2755 bool vector;
2756 bool novector;
6de9cd9a
DN
2757}
2758gfc_iterator;
2759
ece3f663 2760#define gfc_get_iterator() XCNEW (gfc_iterator)
6de9cd9a
DN
2761
2762
f7b529fa 2763/* Allocation structure for ALLOCATE, DEALLOCATE and NULLIFY statements. */
6de9cd9a
DN
2764
2765typedef struct gfc_alloc
2766{
2767 gfc_expr *expr;
2768 struct gfc_alloc *next;
2769}
2770gfc_alloc;
2771
ece3f663 2772#define gfc_get_alloc() XCNEW (gfc_alloc)
6de9cd9a
DN
2773
2774
2775typedef struct
2776{
2777 gfc_expr *unit, *file, *status, *access, *form, *recl,
6f0f0b2e 2778 *blank, *position, *action, *delim, *pad, *iostat, *iomsg, *convert,
0ef33d44
FR
2779 *decimal, *encoding, *round, *sign, *asynchronous, *id, *newunit,
2780 *share, *cc;
2781 char readonly;
6de9cd9a
DN
2782 gfc_st_label *err;
2783}
2784gfc_open;
2785
2786
2787typedef struct
2788{
7aba8abe 2789 gfc_expr *unit, *status, *iostat, *iomsg;
6de9cd9a
DN
2790 gfc_st_label *err;
2791}
2792gfc_close;
2793
2794
2795typedef struct
2796{
7aba8abe 2797 gfc_expr *unit, *iostat, *iomsg;
6de9cd9a
DN
2798 gfc_st_label *err;
2799}
2800gfc_filepos;
2801
2802
2803typedef struct
2804{
2805 gfc_expr *unit, *file, *iostat, *exist, *opened, *number, *named,
2806 *name, *access, *sequential, *direct, *form, *formatted,
2807 *unformatted, *recl, *nextrec, *blank, *position, *action, *read,
6f0f0b2e 2808 *write, *readwrite, *delim, *pad, *iolength, *iomsg, *convert, *strm_pos,
93e8af19 2809 *asynchronous, *decimal, *encoding, *pending, *round, *sign, *size, *id,
0ef33d44 2810 *iqstream, *share, *cc;
6de9cd9a
DN
2811
2812 gfc_st_label *err;
2813
2814}
2815gfc_inquire;
2816
2817
2818typedef struct
2819{
6f0f0b2e
JD
2820 gfc_expr *unit, *iostat, *iomsg, *id;
2821 gfc_st_label *err, *end, *eor;
2822}
2823gfc_wait;
2824
2825
2826typedef struct
2827{
2828 gfc_expr *io_unit, *format_expr, *rec, *advance, *iostat, *size, *iomsg,
2829 *id, *pos, *asynchronous, *blank, *decimal, *delim, *pad, *round,
4a8d4422 2830 *sign, *extra_comma, *dt_io_kind, *udtio;
7ee4f6f3 2831 char dec_ext;
6de9cd9a
DN
2832
2833 gfc_symbol *namelist;
2834 /* A format_label of `format_asterisk' indicates the "*" format */
2835 gfc_st_label *format_label;
2836 gfc_st_label *err, *end, *eor;
2837
e0e85e06 2838 locus eor_where, end_where, err_where;
6de9cd9a
DN
2839}
2840gfc_dt;
2841
2842
2843typedef struct gfc_forall_iterator
2844{
2845 gfc_expr *var, *start, *end, *stride;
2846 struct gfc_forall_iterator *next;
2847}
2848gfc_forall_iterator;
2849
2850
03af1e4c
DK
2851/* Linked list to store associations in an ASSOCIATE statement. */
2852
2853typedef struct gfc_association_list
2854{
4d382327 2855 struct gfc_association_list *next;
03af1e4c
DK
2856
2857 /* Whether this is association to a variable that can be changed; otherwise,
2858 it's association to an expression and the name may not be used as
2859 lvalue. */
2860 unsigned variable:1;
2861
3e78238a
DK
2862 /* True if this struct is currently only linked to from a gfc_symbol rather
2863 than as part of a real list in gfc_code->ext.block.assoc. This may
2864 happen for SELECT TYPE temporaries and must be considered
2865 for memory handling. */
2866 unsigned dangling:1;
2867
76fe932b
AV
2868 /* True when the rank of the target expression is guessed during parsing. */
2869 unsigned rankguessed:1;
2870
03af1e4c
DK
2871 char name[GFC_MAX_SYMBOL_LEN + 1];
2872 gfc_symtree *st; /* Symtree corresponding to name. */
571d54de
DK
2873 locus where;
2874
03af1e4c
DK
2875 gfc_expr *target;
2876}
2877gfc_association_list;
2878#define gfc_get_association_list() XCNEW (gfc_association_list)
2879
2880
6de9cd9a 2881/* Executable statements that fill gfc_code structures. */
a79683d5 2882enum gfc_exec_op
6de9cd9a 2883{
df1a69f6
MM
2884 EXEC_NOP = 1, EXEC_END_NESTED_BLOCK, EXEC_END_BLOCK, EXEC_ASSIGN,
2885 EXEC_LABEL_ASSIGN, EXEC_POINTER_ASSIGN, EXEC_CRITICAL, EXEC_ERROR_STOP,
8e1f752a
DK
2886 EXEC_GOTO, EXEC_CALL, EXEC_COMPCALL, EXEC_ASSIGN_CALL, EXEC_RETURN,
2887 EXEC_ENTRY, EXEC_PAUSE, EXEC_STOP, EXEC_CONTINUE, EXEC_INIT_ASSIGN,
8c6a85e3
TB
2888 EXEC_IF, EXEC_ARITHMETIC_IF, EXEC_DO, EXEC_DO_CONCURRENT, EXEC_DO_WHILE,
2889 EXEC_SELECT, EXEC_BLOCK, EXEC_FORALL, EXEC_WHERE, EXEC_CYCLE, EXEC_EXIT,
2890 EXEC_CALL_PPC, EXEC_ALLOCATE, EXEC_DEALLOCATE, EXEC_END_PROCEDURE,
70570ec1
PT
2891 EXEC_SELECT_TYPE, EXEC_SELECT_RANK, EXEC_SYNC_ALL, EXEC_SYNC_MEMORY,
2892 EXEC_SYNC_IMAGES, EXEC_OPEN, EXEC_CLOSE, EXEC_WAIT,
6de9cd9a 2893 EXEC_READ, EXEC_WRITE, EXEC_IOLENGTH, EXEC_TRANSFER, EXEC_DT_END,
6c7a4dfd 2894 EXEC_BACKSPACE, EXEC_ENDFILE, EXEC_INQUIRE, EXEC_REWIND, EXEC_FLUSH,
f8862a1b 2895 EXEC_FORM_TEAM, EXEC_CHANGE_TEAM, EXEC_END_TEAM, EXEC_SYNC_TEAM,
ef78bc3c 2896 EXEC_LOCK, EXEC_UNLOCK, EXEC_EVENT_POST, EXEC_EVENT_WAIT, EXEC_FAIL_IMAGE,
62aee289
MR
2897 EXEC_OACC_KERNELS_LOOP, EXEC_OACC_PARALLEL_LOOP, EXEC_OACC_SERIAL_LOOP,
2898 EXEC_OACC_ROUTINE, EXEC_OACC_PARALLEL, EXEC_OACC_KERNELS, EXEC_OACC_SERIAL,
2899 EXEC_OACC_DATA, EXEC_OACC_HOST_DATA, EXEC_OACC_LOOP, EXEC_OACC_UPDATE,
2900 EXEC_OACC_WAIT, EXEC_OACC_CACHE, EXEC_OACC_ENTER_DATA, EXEC_OACC_EXIT_DATA,
2901 EXEC_OACC_ATOMIC, EXEC_OACC_DECLARE,
6c7a4dfd
JJ
2902 EXEC_OMP_CRITICAL, EXEC_OMP_DO, EXEC_OMP_FLUSH, EXEC_OMP_MASTER,
2903 EXEC_OMP_ORDERED, EXEC_OMP_PARALLEL, EXEC_OMP_PARALLEL_DO,
2904 EXEC_OMP_PARALLEL_SECTIONS, EXEC_OMP_PARALLEL_WORKSHARE,
2905 EXEC_OMP_SECTIONS, EXEC_OMP_SINGLE, EXEC_OMP_WORKSHARE,
2906 EXEC_OMP_ATOMIC, EXEC_OMP_BARRIER, EXEC_OMP_END_NOWAIT,
20906c66 2907 EXEC_OMP_END_SINGLE, EXEC_OMP_TASK, EXEC_OMP_TASKWAIT,
dd2fc525
JJ
2908 EXEC_OMP_TASKYIELD, EXEC_OMP_CANCEL, EXEC_OMP_CANCELLATION_POINT,
2909 EXEC_OMP_TASKGROUP, EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD,
f014c653
JJ
2910 EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_TARGET, EXEC_OMP_TARGET_DATA,
2911 EXEC_OMP_TEAMS, EXEC_OMP_DISTRIBUTE, EXEC_OMP_DISTRIBUTE_SIMD,
2912 EXEC_OMP_DISTRIBUTE_PARALLEL_DO, EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD,
2913 EXEC_OMP_TARGET_TEAMS, EXEC_OMP_TEAMS_DISTRIBUTE,
2914 EXEC_OMP_TEAMS_DISTRIBUTE_SIMD, EXEC_OMP_TARGET_TEAMS_DISTRIBUTE,
2915 EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
2916 EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
2917 EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
2918 EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
2919 EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
b4c3a85b
JJ
2920 EXEC_OMP_TARGET_UPDATE, EXEC_OMP_END_CRITICAL,
2921 EXEC_OMP_TARGET_ENTER_DATA, EXEC_OMP_TARGET_EXIT_DATA,
2922 EXEC_OMP_TARGET_PARALLEL, EXEC_OMP_TARGET_PARALLEL_DO,
2923 EXEC_OMP_TARGET_PARALLEL_DO_SIMD, EXEC_OMP_TARGET_SIMD,
0e3702f8 2924 EXEC_OMP_TASKLOOP, EXEC_OMP_TASKLOOP_SIMD, EXEC_OMP_SCAN, EXEC_OMP_DEPOBJ,
f6bf436d
TB
2925 EXEC_OMP_PARALLEL_MASTER, EXEC_OMP_PARALLEL_MASTER_TASKLOOP,
2926 EXEC_OMP_PARALLEL_MASTER_TASKLOOP_SIMD, EXEC_OMP_MASTER_TASKLOOP,
178191e1 2927 EXEC_OMP_MASTER_TASKLOOP_SIMD, EXEC_OMP_LOOP, EXEC_OMP_PARALLEL_LOOP,
53d5b59c
TB
2928 EXEC_OMP_TEAMS_LOOP, EXEC_OMP_TARGET_PARALLEL_LOOP,
2929 EXEC_OMP_TARGET_TEAMS_LOOP, EXEC_OMP_MASKED, EXEC_OMP_PARALLEL_MASKED,
2930 EXEC_OMP_PARALLEL_MASKED_TASKLOOP, EXEC_OMP_PARALLEL_MASKED_TASKLOOP_SIMD,
77167196
TB
2931 EXEC_OMP_MASKED_TASKLOOP, EXEC_OMP_MASKED_TASKLOOP_SIMD, EXEC_OMP_SCOPE,
2932 EXEC_OMP_ERROR
a79683d5 2933};
6de9cd9a
DN
2934
2935typedef struct gfc_code
2936{
2937 gfc_exec_op op;
2938
2939 struct gfc_code *block, *next;
2940 locus loc;
2941
79bd1948 2942 gfc_st_label *here, *label1, *label2, *label3;
6de9cd9a 2943 gfc_symtree *symtree;
5493aa17 2944 gfc_expr *expr1, *expr2, *expr3, *expr4;
6de9cd9a
DN
2945 /* A name isn't sufficient to identify a subroutine, we need the actual
2946 symbol for the interface definition.
2947 const char *sub_name; */
2948 gfc_symbol *resolved_sym;
12f681a0 2949 gfc_intrinsic_sym *resolved_isym;
6de9cd9a
DN
2950
2951 union
2952 {
2953 gfc_actual_arglist *actual;
6de9cd9a 2954 gfc_iterator *iterator;
cf2b3c22
TB
2955
2956 struct
2957 {
2958 gfc_typespec ts;
2959 gfc_alloc *list;
1792349b
AV
2960 /* Take the array specification from expr3 to allocate arrays
2961 without an explicit array specification. */
2962 unsigned arr_spec_from_expr3:1;
cf2b3c22
TB
2963 }
2964 alloc;
2965
03af1e4c
DK
2966 struct
2967 {
2968 gfc_namespace *ns;
2969 gfc_association_list *assoc;
29a63d67 2970 gfc_case *case_list;
03af1e4c
DK
2971 }
2972 block;
2973
6de9cd9a
DN
2974 gfc_open *open;
2975 gfc_close *close;
2976 gfc_filepos *filepos;
2977 gfc_inquire *inquire;
6f0f0b2e 2978 gfc_wait *wait;
6de9cd9a
DN
2979 gfc_dt *dt;
2980 gfc_forall_iterator *forall_iterator;
e5ca9693 2981 struct gfc_code *which_construct;
6de9cd9a 2982 int stop_code;
3d79abbd 2983 gfc_entry_list *entry;
dc7a8b4b 2984 gfc_oacc_declare *oacc_declare;
6c7a4dfd
JJ
2985 gfc_omp_clauses *omp_clauses;
2986 const char *omp_name;
dd2fc525 2987 gfc_omp_namelist *omp_namelist;
6c7a4dfd 2988 bool omp_bool;
6de9cd9a
DN
2989 }
2990 ext; /* Points to additional structures required by statement */
2991
e5ca9693 2992 /* Cycle and break labels in constructs. */
e7041633
NF
2993 tree cycle_label;
2994 tree exit_label;
6de9cd9a
DN
2995}
2996gfc_code;
2997
2998
2999/* Storage for DATA statements. */
3000typedef struct gfc_data_variable
3001{
3002 gfc_expr *expr;
3003 gfc_iterator iter;
3004 struct gfc_data_variable *list, *next;
3005}
3006gfc_data_variable;
3007
3008
3009typedef struct gfc_data_value
3010{
f2112868 3011 mpz_t repeat;
6de9cd9a 3012 gfc_expr *expr;
6de9cd9a
DN
3013 struct gfc_data_value *next;
3014}
3015gfc_data_value;
3016
3017
3018typedef struct gfc_data
3019{
3020 gfc_data_variable *var;
3021 gfc_data_value *value;
3022 locus where;
3023
3024 struct gfc_data *next;
3025}
3026gfc_data;
3027
6de9cd9a
DN
3028
3029/* Structure for holding compile options */
3030typedef struct
3031{
6de9cd9a
DN
3032 char *module_dir;
3033 gfc_source_form source_form;
5a06474c
JD
3034 int max_continue_fixed;
3035 int max_continue_free;
6de9cd9a 3036 int max_identifier_length;
6de9cd9a 3037
3f139fcf 3038 int max_errors;
6de9cd9a 3039
2d7c7df6 3040 int flag_preprocessed;
e0bcf78c 3041 int flag_d_lines;
51b09ce3 3042 int flag_init_integer;
66086032 3043 long flag_init_integer_value;
51b09ce3
AL
3044 int flag_init_logical;
3045 int flag_init_character;
3046 char flag_init_character_value;
6de9cd9a 3047
944b8b35 3048 int fpe;
fa86f4f9 3049 int fpe_summary;
d3d3011f 3050 int rtcheck;
944b8b35 3051
6de9cd9a
DN
3052 int warn_std;
3053 int allow_std;
3054}
3055gfc_option_t;
3056
3057extern gfc_option_t gfc_option;
3058
6de9cd9a
DN
3059/* Constructor nodes for array and structure constructors. */
3060typedef struct gfc_constructor
3061{
b7e75771
JD
3062 gfc_constructor_base base;
3063 mpz_t offset; /* Offset within a constructor, used as
3064 key within base. */
3065
6de9cd9a
DN
3066 gfc_expr *expr;
3067 gfc_iterator *iterator;
3068 locus where;
b7e75771
JD
3069
3070 union
6de9cd9a 3071 {
b7e75771 3072 gfc_component *component; /* Record the component being initialized. */
6de9cd9a
DN
3073 }
3074 n;
21ea4922
JJ
3075 mpz_t repeat; /* Record the repeat number of initial values in data
3076 statement like "data a/5*10/". */
6de9cd9a
DN
3077}
3078gfc_constructor;
3079
3080
3081typedef struct iterator_stack
3082{
3083 gfc_symtree *variable;
3084 mpz_t value;
3085 struct iterator_stack *prev;
3086}
3087iterator_stack;
3088extern iterator_stack *iter_stack;
3089
34523524 3090
7431bf06
JW
3091/* Used for (possibly nested) SELECT TYPE statements. */
3092typedef struct gfc_select_type_stack
3093{
3094 gfc_symbol *selector; /* Current selector variable. */
3095 gfc_symtree *tmp; /* Current temporary variable. */
3096 struct gfc_select_type_stack *prev; /* Previous element on stack. */
3097}
3098gfc_select_type_stack;
3099extern gfc_select_type_stack *select_type_stack;
3100#define gfc_get_select_type_stack() XCNEW (gfc_select_type_stack)
3101
3102
34523524
DK
3103/* Node in the linked list used for storing finalizer procedures. */
3104
3105typedef struct gfc_finalizer
3106{
3107 struct gfc_finalizer* next;
df2fba9e 3108 locus where; /* Where the FINAL declaration occurred. */
f6fad28e
DK
3109
3110 /* Up to resolution, we want the gfc_symbol, there we lookup the corresponding
3111 symtree and later need only that. This way, we can access and call the
3112 finalizers from every context as they should be "always accessible". I
3113 don't make this a union because we need the information whether proc_sym is
3114 still referenced or not for dereferencing it on deleting a gfc_finalizer
3115 structure. */
3116 gfc_symbol* proc_sym;
4d382327 3117 gfc_symtree* proc_tree;
34523524
DK
3118}
3119gfc_finalizer;
f6fad28e
DK
3120#define gfc_get_finalizer() XCNEW (gfc_finalizer)
3121
34523524 3122
6de9cd9a
DN
3123/************************ Function prototypes *************************/
3124
e53b6e56 3125/* decl.cc */
2220652d 3126bool gfc_in_match_data (void);
8234e5e0 3127match gfc_match_char_spec (gfc_typespec *);
170a8bd6 3128extern int directive_unroll;
2bd86b95
HA
3129extern bool directive_ivdep;
3130extern bool directive_vector;
3131extern bool directive_novector;
2220652d 3132
facf0354
ML
3133/* SIMD clause enum. */
3134enum gfc_simd_clause
3135{
3136 SIMD_NONE = (1 << 0),
3137 SIMD_INBRANCH = (1 << 1),
3138 SIMD_NOTINBRANCH = (1 << 2)
3139};
3140
3141/* Tuple for parsing of vectorized built-ins. */
3142struct gfc_vect_builtin_tuple
3143{
3144 gfc_vect_builtin_tuple (const char *n, gfc_simd_clause t)
3145 : name (n), simd_type (t) {}
3146
3147 const char *name;
3148 gfc_simd_clause simd_type;
3149};
3150
3151/* Map of middle-end built-ins that should be vectorized. */
3152extern hash_map<nofree_string_hash, int> *gfc_vectorized_builtins;
3153
5bab4c96 3154/* Handling Parameterized Derived Types */
5bab4c96
PT
3155bool gfc_insert_parameter_exprs (gfc_expr *, gfc_actual_arglist *);
3156match gfc_get_pdt_instance (gfc_actual_arglist *, gfc_symbol **,
3157 gfc_actual_arglist **);
3158
7848054c
AB
3159
3160/* Given a symbol, test whether it is a module procedure in a submodule */
3161#define gfc_submodule_procedure(attr) \
3162 (gfc_state_stack->previous && gfc_state_stack->previous->previous \
3163 && gfc_state_stack->previous->previous->state == COMP_SUBMODULE \
3164 && attr->module_procedure)
3165
e53b6e56 3166/* scanner.cc */
6de9cd9a
DN
3167void gfc_scanner_done_1 (void);
3168void gfc_scanner_init_1 (void);
3169
417ea5c0 3170void gfc_add_include_path (const char *, bool, bool, bool, bool);
31198773 3171void gfc_add_intrinsic_modules_path (const char *);
6de9cd9a 3172void gfc_release_include_path (void);
83aac698 3173void gfc_check_include_dirs (bool);
31198773 3174FILE *gfc_open_included_file (const char *, bool, bool);
6de9cd9a 3175
6de9cd9a
DN
3176int gfc_at_end (void);
3177int gfc_at_eof (void);
3178int gfc_at_bol (void);
3179int gfc_at_eol (void);
3180void gfc_advance_line (void);
3181int gfc_check_include (void);
9e8a6720 3182int gfc_define_undef_line (void);
6de9cd9a 3183
8fc541d3
FXC
3184int gfc_wide_is_printable (gfc_char_t);
3185int gfc_wide_is_digit (gfc_char_t);
3186int gfc_wide_fits_in_byte (gfc_char_t);
3187gfc_char_t gfc_wide_tolower (gfc_char_t);
00660189 3188gfc_char_t gfc_wide_toupper (gfc_char_t);
8fc541d3 3189size_t gfc_wide_strlen (const gfc_char_t *);
00660189
FXC
3190int gfc_wide_strncasecmp (const gfc_char_t *, const char *, size_t);
3191gfc_char_t *gfc_wide_memset (gfc_char_t *, gfc_char_t, size_t);
3192char *gfc_widechar_to_char (const gfc_char_t *, int);
3193gfc_char_t *gfc_char_to_widechar (const char *);
3194
ece3f663 3195#define gfc_get_wide_string(n) XCNEWVEC (gfc_char_t, n)
8fc541d3 3196
6de9cd9a 3197void gfc_skip_comments (void);
696abb30 3198gfc_char_t gfc_next_char_literal (gfc_instring);
8fc541d3
FXC
3199gfc_char_t gfc_next_char (void);
3200char gfc_next_ascii_char (void);
3201gfc_char_t gfc_peek_char (void);
3202char gfc_peek_ascii_char (void);
6de9cd9a
DN
3203void gfc_error_recovery (void);
3204void gfc_gobble_whitespace (void);
83aac698 3205void gfc_new_file (void);
2d7c7df6 3206const char * gfc_read_orig_filename (const char *, const char **);
6de9cd9a 3207
d4fa05b9 3208extern gfc_source_form gfc_current_form;
e0bcf78c 3209extern const char *gfc_source_file;
63645982 3210extern locus gfc_current_locus;
6de9cd9a 3211
60332588
JJ
3212void gfc_start_source_files (void);
3213void gfc_end_source_files (void);
3214
e53b6e56 3215/* misc.cc */
6de9cd9a
DN
3216void gfc_clear_ts (gfc_typespec *);
3217FILE *gfc_open_file (const char *);
6de9cd9a 3218const char *gfc_basic_typename (bt);
f61e54e5 3219const char *gfc_dummy_typename (gfc_typespec *);
5958b926 3220const char *gfc_typename (gfc_typespec *, bool for_hash = false);
f61e54e5 3221const char *gfc_typename (gfc_expr *);
ba3ba492 3222const char *gfc_op2string (gfc_intrinsic_op);
6de9cd9a
DN
3223const char *gfc_code2string (const mstring *, int);
3224int gfc_string2code (const mstring *, const char *);
3225const char *gfc_intent_string (sym_intent);
3226
3227void gfc_init_1 (void);
3228void gfc_init_2 (void);
3229void gfc_done_1 (void);
3230void gfc_done_2 (void);
3231
a8b3b0b6
CR
3232int get_c_kind (const char *, CInteropKind_t *);
3233
bcc478b9
BRF
3234const char *gfc_closest_fuzzy_match (const char *, char **);
3235static inline void
3236vec_push (char **&optr, size_t &osz, const char *elt)
3237{
3238 /* {auto,}vec.safe_push () replacement. Don't ask.. */
3239 // if (strlen (elt) < 4) return; premature optimization: eliminated by cutoff
3240 optr = XRESIZEVEC (char *, optr, osz + 2);
3241 optr[osz] = CONST_CAST (char *, elt);
3242 optr[++osz] = NULL;
3243}
3244
f622221a
JB
3245HOST_WIDE_INT gfc_mpz_get_hwi (mpz_t);
3246void gfc_mpz_set_hwi (mpz_t, const HOST_WIDE_INT);
3247
e53b6e56 3248/* options.cc */
7a9bf9a4 3249unsigned int gfc_option_lang_mask (void);
a75bfaa6 3250void gfc_init_options_struct (struct gcc_options *);
7a9bf9a4
JM
3251void gfc_init_options (unsigned int,
3252 struct cl_decoded_option *);
00abf86c 3253bool gfc_handle_option (size_t, const char *, HOST_WIDE_INT, int, location_t,
5f20c657 3254 const struct cl_option_handlers *);
6de9cd9a 3255bool gfc_post_options (const char **);
41804a5b 3256char *gfc_get_option_string (void);
6de9cd9a 3257
e53b6e56 3258/* f95-lang.cc */
602b8523
TB
3259void gfc_maybe_initialize_eh (void);
3260
e53b6e56 3261/* iresolve.cc */
6b25a558 3262const char * gfc_get_string (const char *, ...) ATTRIBUTE_PRINTF_1;
a68ab351 3263bool gfc_find_sym_in_expr (gfc_symbol *, gfc_expr *);
6de9cd9a 3264
e53b6e56 3265/* error.cc */
6de9cd9a 3266void gfc_error_init_1 (void);
3aa34c1d
MLI
3267void gfc_diagnostics_init (void);
3268void gfc_diagnostics_finish (void);
0f447a6e 3269void gfc_buffer_error (bool);
6de9cd9a 3270
00660189
FXC
3271const char *gfc_print_wide_char (gfc_char_t);
3272
48749dbc 3273bool gfc_warning (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
4daa149b 3274bool gfc_warning_now (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
be841e11 3275bool gfc_warning_internal (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
2a2703a2
MLI
3276bool gfc_warning_now_at (location_t loc, int opt, const char *gmsgid, ...)
3277 ATTRIBUTE_GCC_GFC(3,4);
8e54f6d3 3278
6de9cd9a
DN
3279void gfc_clear_warning (void);
3280void gfc_warning_check (void);
3281
2700d0e3 3282void gfc_error_opt (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
0ce0154c
KG
3283void gfc_error (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
3284void gfc_error_now (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
3285void gfc_fatal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);
3286void gfc_internal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);
6de9cd9a 3287void gfc_clear_error (void);
b5a9fd3e 3288bool gfc_error_check (void);
0f447a6e 3289bool gfc_error_flag_test (void);
6de9cd9a 3290
8f0d39a8 3291notification gfc_notification_std (int);
524af0d6 3292bool gfc_notify_std (int, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
6de9cd9a
DN
3293
3294/* A general purpose syntax error. */
3295#define gfc_syntax_error(ST) \
3296 gfc_error ("Syntax error in %s statement at %C", gfc_ascii_statement (ST));
3297
fea70c99
MLI
3298#include "pretty-print.h" /* For output_buffer. */
3299struct gfc_error_buffer
3300{
3301 bool flag;
3302 output_buffer buffer;
3303 gfc_error_buffer(void) : flag(false), buffer() {}
3304};
3305
3306void gfc_push_error (gfc_error_buffer *);
3307void gfc_pop_error (gfc_error_buffer *);
3308void gfc_free_error (gfc_error_buffer *);
6de9cd9a 3309
6de9cd9a 3310void gfc_get_errors (int *, int *);
f4031599 3311void gfc_errors_to_warnings (bool);
6de9cd9a 3312
e53b6e56 3313/* arith.cc */
6de9cd9a
DN
3314void gfc_arith_init_1 (void);
3315void gfc_arith_done_1 (void);
25d8f0a2 3316arith gfc_check_integer_range (mpz_t p, int kind);
d393bbd7 3317bool gfc_check_character_range (gfc_char_t, int);
6de9cd9a 3318
67251118
TK
3319extern bool gfc_seen_div0;
3320
e53b6e56 3321/* trans-types.cc */
e7a2d5fb 3322int gfc_validate_kind (bt, int, bool);
e0a6661b
FXC
3323int gfc_get_int_kind_from_width_isofortranenv (int size);
3324int gfc_get_real_kind_from_width_isofortranenv (int size);
f6288c24 3325tree gfc_get_union_type (gfc_symbol *);
de91486c 3326tree gfc_get_derived_type (gfc_symbol * derived, int codimen = 0);
6de9cd9a 3327extern int gfc_index_integer_kind;
9d64df18 3328extern int gfc_default_integer_kind;
f4e7375a 3329extern int gfc_max_integer_kind;
9d64df18
TS
3330extern int gfc_default_real_kind;
3331extern int gfc_default_double_kind;
3332extern int gfc_default_character_kind;
3333extern int gfc_default_logical_kind;
3334extern int gfc_default_complex_kind;
e8525382 3335extern int gfc_c_int_kind;
a6d22fb2 3336extern int gfc_c_intptr_kind;
da661a58
TB
3337extern int gfc_atomic_int_kind;
3338extern int gfc_atomic_logical_kind;
014ec6ee 3339extern int gfc_intio_kind;
f1412ca5 3340extern int gfc_charlen_int_kind;
f622221a 3341extern int gfc_size_kind;
39f87c03
FXC
3342extern int gfc_numeric_storage_size;
3343extern int gfc_character_storage_size;
6de9cd9a 3344
64b1806b 3345#define gfc_logical_4_kind 4
6ef1366a 3346#define gfc_integer_4_kind 4
13b1afe4 3347#define gfc_real_4_kind 4
64b1806b 3348
e53b6e56 3349/* symbol.cc */
6de9cd9a 3350void gfc_clear_new_implicit (void);
524af0d6
JB
3351bool gfc_add_new_implicit_range (int, int);
3352bool gfc_merge_new_implicit (gfc_typespec *);
a6c63173 3353void gfc_set_implicit_none (bool, bool, locus *);
e9bd9f7d 3354void gfc_check_function_type (gfc_namespace *);
e9c06563 3355bool gfc_is_intrinsic_typename (const char *);
b323be61 3356bool gfc_check_conflict (symbol_attribute *, const char *, locus *);
6de9cd9a 3357
713485cc 3358gfc_typespec *gfc_get_default_type (const char *, gfc_namespace *);
524af0d6 3359bool gfc_set_default_type (gfc_symbol *, int, gfc_namespace *);
6de9cd9a 3360
66e4ab31 3361void gfc_set_sym_referenced (gfc_symbol *);
6de9cd9a 3362
524af0d6
JB
3363bool gfc_add_attribute (symbol_attribute *, locus *);
3364bool gfc_add_ext_attribute (symbol_attribute *, ext_attr_id_t, locus *);
3365bool gfc_add_allocatable (symbol_attribute *, locus *);
3366bool gfc_add_codimension (symbol_attribute *, const char *, locus *);
3367bool gfc_add_contiguous (symbol_attribute *, const char *, locus *);
3368bool gfc_add_dimension (symbol_attribute *, const char *, locus *);
3369bool gfc_add_external (symbol_attribute *, locus *);
3370bool gfc_add_intrinsic (symbol_attribute *, locus *);
3371bool gfc_add_optional (symbol_attribute *, locus *);
5bab4c96
PT
3372bool gfc_add_kind (symbol_attribute *, locus *);
3373bool gfc_add_len (symbol_attribute *, locus *);
524af0d6
JB
3374bool gfc_add_pointer (symbol_attribute *, locus *);
3375bool gfc_add_cray_pointer (symbol_attribute *, locus *);
3376bool gfc_add_cray_pointee (symbol_attribute *, locus *);
32e8bb8e 3377match gfc_mod_pointee_as (gfc_array_spec *);
524af0d6
JB
3378bool gfc_add_protected (symbol_attribute *, const char *, locus *);
3379bool gfc_add_result (symbol_attribute *, const char *, locus *);
34d567d1 3380bool gfc_add_automatic (symbol_attribute *, const char *, locus *);
524af0d6
JB
3381bool gfc_add_save (symbol_attribute *, save_state, const char *, locus *);
3382bool gfc_add_threadprivate (symbol_attribute *, const char *, locus *);
f014c653 3383bool gfc_add_omp_declare_target (symbol_attribute *, const char *, locus *);
b4c3a85b
JJ
3384bool gfc_add_omp_declare_target_link (symbol_attribute *, const char *,
3385 locus *);
524af0d6
JB
3386bool gfc_add_target (symbol_attribute *, locus *);
3387bool gfc_add_dummy (symbol_attribute *, const char *, locus *);
3388bool gfc_add_generic (symbol_attribute *, const char *, locus *);
524af0d6
JB
3389bool gfc_add_in_common (symbol_attribute *, const char *, locus *);
3390bool gfc_add_in_equivalence (symbol_attribute *, const char *, locus *);
3391bool gfc_add_data (symbol_attribute *, const char *, locus *);
3392bool gfc_add_in_namelist (symbol_attribute *, const char *, locus *);
3393bool gfc_add_sequence (symbol_attribute *, const char *, locus *);
3394bool gfc_add_elemental (symbol_attribute *, locus *);
3395bool gfc_add_pure (symbol_attribute *, locus *);
3396bool gfc_add_recursive (symbol_attribute *, locus *);
3397bool gfc_add_function (symbol_attribute *, const char *, locus *);
3398bool gfc_add_subroutine (symbol_attribute *, const char *, locus *);
3399bool gfc_add_volatile (symbol_attribute *, const char *, locus *);
3400bool gfc_add_asynchronous (symbol_attribute *, const char *, locus *);
3401bool gfc_add_proc (symbol_attribute *attr, const char *name, locus *where);
3402bool gfc_add_abstract (symbol_attribute* attr, locus* where);
3403
3404bool gfc_add_access (symbol_attribute *, gfc_access, const char *, locus *);
3405bool gfc_add_is_bind_c (symbol_attribute *, const char *, locus *, int);
3406bool gfc_add_extension (symbol_attribute *, locus *);
3407bool gfc_add_value (symbol_attribute *, const char *, locus *);
3408bool gfc_add_flavor (symbol_attribute *, sym_flavor, const char *, locus *);
3409bool gfc_add_entry (symbol_attribute *, const char *, locus *);
3410bool gfc_add_procedure (symbol_attribute *, procedure_type,
231b2fcc 3411 const char *, locus *);
524af0d6
JB
3412bool gfc_add_intent (symbol_attribute *, sym_intent, locus *);
3413bool gfc_add_explicit_interface (gfc_symbol *, ifsrc,
6de9cd9a 3414 gfc_formal_arglist *, locus *);
524af0d6 3415bool gfc_add_type (gfc_symbol *, gfc_typespec *, locus *);
6de9cd9a
DN
3416
3417void gfc_clear_attr (symbol_attribute *);
524af0d6
JB
3418bool gfc_missing_attr (symbol_attribute *, locus *);
3419bool gfc_copy_attr (symbol_attribute *, symbol_attribute *, locus *);
4668d6f9 3420int gfc_copy_dummy_sym (gfc_symbol **, gfc_symbol *, int);
524af0d6 3421bool gfc_add_component (gfc_symbol *, const char *, gfc_component **);
6de9cd9a 3422gfc_symbol *gfc_use_derived (gfc_symbol *);
f6288c24
FR
3423gfc_component *gfc_find_component (gfc_symbol *, const char *, bool, bool,
3424 gfc_ref **);
6de9cd9a
DN
3425
3426gfc_st_label *gfc_get_st_label (int);
3427void gfc_free_st_label (gfc_st_label *);
3428void gfc_define_st_label (gfc_st_label *, gfc_sl_type, locus *);
524af0d6 3429bool gfc_reference_st_label (gfc_st_label *, gfc_sl_type);
6de9cd9a 3430
0366dfe9 3431gfc_namespace *gfc_get_namespace (gfc_namespace *, int);
6de9cd9a
DN
3432gfc_symtree *gfc_new_symtree (gfc_symtree **, const char *);
3433gfc_symtree *gfc_find_symtree (gfc_symtree *, const char *);
a99d95a2 3434void gfc_delete_symtree (gfc_symtree **, const char *);
aa84a9a5 3435gfc_symtree *gfc_get_unique_symtree (gfc_namespace *);
6de9cd9a
DN
3436gfc_user_op *gfc_get_uop (const char *);
3437gfc_user_op *gfc_find_uop (const char *, gfc_namespace *);
8875a92d
BRF
3438void gfc_free_symbol (gfc_symbol *&);
3439void gfc_release_symbol (gfc_symbol *&);
6de9cd9a 3440gfc_symbol *gfc_new_symbol (const char *, gfc_namespace *);
61b644c2 3441gfc_symtree* gfc_find_symtree_in_proc (const char *, gfc_namespace *);
6de9cd9a
DN
3442int gfc_find_symbol (const char *, gfc_namespace *, int, gfc_symbol **);
3443int gfc_find_sym_tree (const char *, gfc_namespace *, int, gfc_symtree **);
3444int gfc_get_symbol (const char *, gfc_namespace *, gfc_symbol **);
524af0d6
JB
3445bool gfc_verify_c_interop (gfc_typespec *);
3446bool gfc_verify_c_interop_param (gfc_symbol *);
3447bool verify_bind_c_sym (gfc_symbol *, gfc_typespec *, int, gfc_common_head *);
3448bool verify_bind_c_derived_type (gfc_symbol *);
3449bool verify_com_block_vars_c_interop (gfc_common_head *);
cadddfdd
TB
3450gfc_symtree *generate_isocbinding_symbol (const char *, iso_c_binding_symbol,
3451 const char *, gfc_symtree *, bool);
44c57c2f 3452void gfc_save_symbol_data (gfc_symbol *);
08a6b8e0 3453int gfc_get_sym_tree (const char *, gfc_namespace *, gfc_symtree **, bool);
6de9cd9a
DN
3454int gfc_get_ha_symbol (const char *, gfc_symbol **);
3455int gfc_get_ha_sym_tree (const char *, gfc_symtree **);
3456
ab68a73e
MM
3457void gfc_drop_last_undo_checkpoint (void);
3458void gfc_restore_last_undo_checkpoint (void);
6de9cd9a
DN
3459void gfc_undo_symbols (void);
3460void gfc_commit_symbols (void);
66e4ab31 3461void gfc_commit_symbol (gfc_symbol *);
b76e28c6 3462gfc_charlen *gfc_new_charlen (gfc_namespace *, gfc_charlen *);
8875a92d 3463void gfc_free_namespace (gfc_namespace *&);
6de9cd9a
DN
3464
3465void gfc_symbol_init_2 (void);
3466void gfc_symbol_done_2 (void);
3467
9056bd70 3468void gfc_traverse_symtree (gfc_symtree *, void (*)(gfc_symtree *));
6de9cd9a
DN
3469void gfc_traverse_ns (gfc_namespace *, void (*)(gfc_symbol *));
3470void gfc_traverse_user_op (gfc_namespace *, void (*)(gfc_user_op *));
3471void gfc_save_all (gfc_namespace *);
3472
4bc20f3a 3473void gfc_enforce_clean_symbol_state (void);
6de9cd9a 3474
55b9c612 3475gfc_gsymbol *gfc_get_gsymbol (const char *, bool bind_c);
cb9e4f55 3476gfc_gsymbol *gfc_find_gsymbol (gfc_gsymbol *, const char *);
98452460 3477gfc_gsymbol *gfc_find_case_gsymbol (gfc_gsymbol *, const char *);
5c6aa9a8 3478void gfc_traverse_gsymbol (gfc_gsymbol *, void (*)(gfc_gsymbol *, void *), void *);
c9543002 3479
3e15518b 3480gfc_typebound_proc* gfc_get_typebound_proc (gfc_typebound_proc*);
30b608eb 3481gfc_symbol* gfc_get_derived_super_type (gfc_symbol*);
cf2b3c22 3482bool gfc_type_is_extension_of (gfc_symbol *, gfc_symbol *);
e74f1cc8 3483bool gfc_type_compatible (gfc_typespec *, gfc_typespec *);
30b608eb 3484
8fdcb6a9 3485void gfc_copy_formal_args_intr (gfc_symbol *, gfc_intrinsic_sym *,
47d13acb 3486 gfc_actual_arglist *, bool copy_type = false);
69773742 3487
e53b6e56 3488void gfc_free_finalizer (gfc_finalizer *el); /* Needed in resolve.cc, too */
34523524 3489
524af0d6 3490bool gfc_check_symbol_typed (gfc_symbol*, gfc_namespace*, bool, locus);
52bf62f9 3491gfc_namespace* gfc_find_proc_namespace (gfc_namespace*);
f37e928c 3492
571d54de 3493bool gfc_is_associate_pointer (gfc_symbol*);
c3f34952 3494gfc_symbol * gfc_find_dt_in_generic (gfc_symbol *);
4cbc9039 3495gfc_formal_arglist *gfc_sym_get_dummy_args (gfc_symbol *);
571d54de 3496
e53b6e56 3497/* intrinsic.cc -- true if working in an init-expr, false otherwise. */
f2cbd86c 3498extern bool gfc_init_expr_flag;
6de9cd9a
DN
3499
3500/* Given a symbol that we have decided is intrinsic, mark it as such
3501 by placing it into a special module that is otherwise impossible to
3502 read or write. */
3503
cb9e4f55 3504#define gfc_intrinsic_symbol(SYM) SYM->module = gfc_get_string ("(intrinsic)")
6de9cd9a
DN
3505
3506void gfc_intrinsic_init_1 (void);
3507void gfc_intrinsic_done_1 (void);
3508
01ce9e31 3509char gfc_type_letter (bt, bool logical_equals_int = false);
90d6f0c7
JJ
3510int gfc_type_abi_kind (bt, int);
3511static inline int
3512gfc_type_abi_kind (gfc_typespec *ts)
3513{
3514 return gfc_type_abi_kind (ts->type, ts->kind);
3515}
6de9cd9a 3516gfc_symbol * gfc_get_intrinsic_sub_symbol (const char *);
47d13acb
TK
3517gfc_symbol *gfc_get_intrinsic_function_symbol (gfc_expr *);
3518gfc_symbol *gfc_find_intrinsic_symbol (gfc_expr *);
524af0d6 3519bool gfc_convert_type (gfc_expr *, gfc_typespec *, int);
8405874a
ME
3520bool gfc_convert_type_warn (gfc_expr *, gfc_typespec *, int, int,
3521 bool array = false);
524af0d6 3522bool gfc_convert_chartype (gfc_expr *, gfc_typespec *);
6de9cd9a
DN
3523int gfc_generic_intrinsic (const char *);
3524int gfc_specific_intrinsic (const char *);
c3005b0f 3525bool gfc_is_intrinsic (gfc_symbol*, int, locus);
0e7e7e6e 3526int gfc_intrinsic_actual_ok (const char *, const bool);
6de9cd9a 3527gfc_intrinsic_sym *gfc_find_function (const char *);
cd5ecab6 3528gfc_intrinsic_sym *gfc_find_subroutine (const char *);
d000aa67 3529gfc_intrinsic_sym *gfc_intrinsic_function_by_id (gfc_isym_id);
cadddfdd
TB
3530gfc_intrinsic_sym *gfc_intrinsic_subroutine_by_id (gfc_isym_id);
3531gfc_isym_id gfc_isym_id_by_intmod (intmod_id, int);
3532gfc_isym_id gfc_isym_id_by_intmod_sym (gfc_symbol *);
3533
6de9cd9a
DN
3534
3535match gfc_intrinsic_func_interface (gfc_expr *, int);
3536match gfc_intrinsic_sub_interface (gfc_code *, int);
3537
c3005b0f 3538void gfc_warn_intrinsic_shadow (const gfc_symbol*, bool, bool);
524af0d6 3539bool gfc_check_intrinsic_standard (const gfc_intrinsic_sym*, const char**,
17b1d2a0 3540 bool, locus);
c3005b0f 3541
e53b6e56 3542/* match.cc -- FIXME */
6de9cd9a
DN
3543void gfc_free_iterator (gfc_iterator *, int);
3544void gfc_free_forall_iterator (gfc_forall_iterator *);
3545void gfc_free_alloc_list (gfc_alloc *);
3546void gfc_free_namelist (gfc_namelist *);
9a5de4d5 3547void gfc_free_omp_namelist (gfc_omp_namelist *, bool);
6de9cd9a 3548void gfc_free_equiv (gfc_equiv *);
31fee91e 3549void gfc_free_equiv_until (gfc_equiv *, gfc_equiv *);
6de9cd9a 3550void gfc_free_data (gfc_data *);
d5e2274d 3551void gfc_reject_data (gfc_namespace *);
6de9cd9a
DN
3552void gfc_free_case_list (gfc_case *);
3553
e53b6e56 3554/* matchexp.cc -- FIXME too? */
b6398823
PT
3555gfc_expr *gfc_get_parentheses (gfc_expr *);
3556
e53b6e56 3557/* openmp.cc */
c7d3bb76 3558struct gfc_omp_saved_state { void *ptrs[2]; int ints[1]; };
269322ec
TB
3559bool gfc_omp_requires_add_clause (gfc_omp_requires_kind, const char *,
3560 locus *, const char *);
3561void gfc_check_omp_requires (gfc_namespace *, int);
6c7a4dfd 3562void gfc_free_omp_clauses (gfc_omp_clauses *);
dc7a8b4b 3563void gfc_free_oacc_declare_clauses (struct gfc_oacc_declare *);
724ee5a0 3564void gfc_free_omp_declare_variant_list (gfc_omp_declare_variant *list);
dd2fc525
JJ
3565void gfc_free_omp_declare_simd (gfc_omp_declare_simd *);
3566void gfc_free_omp_declare_simd_list (gfc_omp_declare_simd *);
5f23671d
JJ
3567void gfc_free_omp_udr (gfc_omp_udr *);
3568gfc_omp_udr *gfc_omp_udr_find (gfc_symtree *, gfc_typespec *);
6c7a4dfd 3569void gfc_resolve_omp_directive (gfc_code *, gfc_namespace *);
cd30a0b8
JJ
3570void gfc_resolve_do_iterator (gfc_code *, gfc_symbol *, bool);
3571void gfc_resolve_omp_local_vars (gfc_namespace *);
6c7a4dfd
JJ
3572void gfc_resolve_omp_parallel_blocks (gfc_code *, gfc_namespace *);
3573void gfc_resolve_omp_do_blocks (gfc_code *, gfc_namespace *);
dd2fc525 3574void gfc_resolve_omp_declare_simd (gfc_namespace *);
5f23671d 3575void gfc_resolve_omp_udrs (gfc_symtree *);
c7d3bb76
JJ
3576void gfc_omp_save_and_clear_state (struct gfc_omp_saved_state *);
3577void gfc_omp_restore_state (struct gfc_omp_saved_state *);
41dbbb37
TS
3578void gfc_free_expr_list (gfc_expr_list *);
3579void gfc_resolve_oacc_directive (gfc_code *, gfc_namespace *);
3580void gfc_resolve_oacc_declare (gfc_namespace *);
41dbbb37 3581void gfc_resolve_oacc_blocks (gfc_code *, gfc_namespace *);
f6bf4bc1 3582void gfc_resolve_oacc_routines (gfc_namespace *);
6c7a4dfd 3583
e53b6e56 3584/* expr.cc */
6de9cd9a
DN
3585void gfc_free_actual_arglist (gfc_actual_arglist *);
3586gfc_actual_arglist *gfc_copy_actual_arglist (gfc_actual_arglist *);
f622221a 3587
51f03c6b 3588bool gfc_extract_int (gfc_expr *, int *, int = 0);
f622221a
JB
3589bool gfc_extract_hwi (gfc_expr *, HOST_WIDE_INT *, int = 0);
3590
0d78e4aa 3591bool is_CFI_desc (gfc_symbol *, gfc_expr *);
1d6b7f39 3592bool is_subref_array (gfc_expr *);
460263d0 3593bool gfc_is_simply_contiguous (gfc_expr *, bool, bool);
419af57c 3594bool gfc_is_not_contiguous (gfc_expr *);
524af0d6 3595bool gfc_check_init_expr (gfc_expr *);
6de9cd9a
DN
3596
3597gfc_expr *gfc_build_conversion (gfc_expr *);
3598void gfc_free_ref_list (gfc_ref *);
dcea1b2f 3599void gfc_type_convert_binary (gfc_expr *, int);
7a28353e 3600bool gfc_is_constant_expr (gfc_expr *);
524af0d6 3601bool gfc_simplify_expr (gfc_expr *, int);
f46d32dd 3602bool gfc_try_simplify_expr (gfc_expr *, int);
4075a94e 3603int gfc_has_vector_index (gfc_expr *);
6de9cd9a
DN
3604
3605gfc_expr *gfc_get_expr (void);
b7e75771
JD
3606gfc_expr *gfc_get_array_expr (bt type, int kind, locus *);
3607gfc_expr *gfc_get_null_expr (locus *);
3608gfc_expr *gfc_get_operator_expr (locus *, gfc_intrinsic_op,gfc_expr *, gfc_expr *);
3609gfc_expr *gfc_get_structure_constructor_expr (bt, int, locus *);
3610gfc_expr *gfc_get_constant_expr (bt, int, locus *);
f622221a
JB
3611gfc_expr *gfc_get_character_expr (int, locus *, const char *, gfc_charlen_t len);
3612gfc_expr *gfc_get_int_expr (int, locus *, HOST_WIDE_INT);
b7e75771
JD
3613gfc_expr *gfc_get_logical_expr (int, locus *, bool);
3614gfc_expr *gfc_get_iokind_expr (locus *, io_kind);
3615
7d7212ec
MM
3616void gfc_clear_shape (mpz_t *shape, int rank);
3617void gfc_free_shape (mpz_t **shape, int rank);
6de9cd9a
DN
3618void gfc_free_expr (gfc_expr *);
3619void gfc_replace_expr (gfc_expr *, gfc_expr *);
6de9cd9a 3620mpz_t *gfc_copy_shape (mpz_t *, int);
94538bd1 3621mpz_t *gfc_copy_shape_excluding (mpz_t *, int, gfc_expr *);
6de9cd9a 3622gfc_expr *gfc_copy_expr (gfc_expr *);
8e1f752a 3623gfc_ref* gfc_copy_ref (gfc_ref*);
6de9cd9a 3624
524af0d6 3625bool gfc_specification_expr (gfc_expr *);
6de9cd9a
DN
3626
3627int gfc_numeric_ts (gfc_typespec *);
3628int gfc_kind_max (gfc_expr *, gfc_expr *);
3629
524af0d6 3630bool gfc_check_conformance (gfc_expr *, gfc_expr *, const char *, ...) ATTRIBUTE_PRINTF_3;
3c9f5092 3631bool gfc_check_assign (gfc_expr *, gfc_expr *, int, bool c = true);
83fad929 3632bool gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue,
cedf8d2e
TK
3633 bool suppres_type_test = false,
3634 bool is_init_expr = false);
524af0d6 3635bool gfc_check_assign_symbol (gfc_symbol *, gfc_component *, gfc_expr *);
6de9cd9a 3636
7fc61626
FR
3637gfc_expr *gfc_build_default_init_expr (gfc_typespec *, locus *);
3638void gfc_apply_init (gfc_typespec *, symbol_attribute *, gfc_expr *);
16e520b6 3639bool gfc_has_default_initializer (gfc_symbol *);
54b4ba60 3640gfc_expr *gfc_default_initializer (gfc_typespec *);
7fc61626 3641gfc_expr *gfc_generate_initializer (gfc_typespec *, bool);
294fbfc8 3642gfc_expr *gfc_get_variable_expr (gfc_symtree *);
4d382327 3643void gfc_add_full_array_ref (gfc_expr *, gfc_array_spec *);
0d87fa8c 3644gfc_expr * gfc_lval_expr_from_sym (gfc_symbol *);
294fbfc8 3645
b7d1d8b4
PT
3646gfc_array_spec *gfc_get_full_arrayspec_from_expr (gfc_expr *expr);
3647
640670c7
PT
3648bool gfc_traverse_expr (gfc_expr *, gfc_symbol *,
3649 bool (*)(gfc_expr *, gfc_symbol *, int*),
3650 int);
66e4ab31 3651void gfc_expr_set_symbols_referenced (gfc_expr *);
524af0d6 3652bool gfc_expr_check_typed (gfc_expr*, gfc_namespace*, bool);
5bab4c96
PT
3653bool gfc_derived_parameter_expr (gfc_expr *);
3654gfc_param_spec_type gfc_spec_list_type (gfc_actual_arglist *, gfc_symbol *);
2a573572
MM
3655gfc_component * gfc_get_proc_ptr_comp (gfc_expr *);
3656bool gfc_is_proc_ptr_comp (gfc_expr *);
43a68a9d 3657bool gfc_is_alloc_class_scalar_function (gfc_expr *);
a6b22eea 3658bool gfc_is_class_array_function (gfc_expr *);
713485cc 3659
badd9e69 3660bool gfc_ref_this_image (gfc_ref *ref);
d3a9eea2 3661bool gfc_is_coindexed (gfc_expr *);
394d3a2e 3662bool gfc_is_coarray (gfc_expr *);
4dc694b2 3663int gfc_get_corank (gfc_expr *);
d3a9eea2
TB
3664bool gfc_has_ultimate_allocatable (gfc_expr *);
3665bool gfc_has_ultimate_pointer (gfc_expr *);
f8862a1b 3666gfc_expr* gfc_find_team_co (gfc_expr *);
20d0bfce 3667gfc_expr* gfc_find_stat_co (gfc_expr *);
6838c137
TB
3668gfc_expr* gfc_build_intrinsic_call (gfc_namespace *, gfc_isym_id, const char*,
3669 locus, unsigned, ...);
524af0d6 3670bool gfc_check_vardef_context (gfc_expr*, bool, bool, bool, const char*);
69dcd06a 3671
d3a9eea2 3672
e53b6e56 3673/* st.cc */
6de9cd9a
DN
3674extern gfc_code new_st;
3675
3676void gfc_clear_new_st (void);
11e5274a 3677gfc_code *gfc_get_code (gfc_exec_op);
6de9cd9a
DN
3678gfc_code *gfc_append_code (gfc_code *, gfc_code *);
3679void gfc_free_statement (gfc_code *);
3680void gfc_free_statements (gfc_code *);
03af1e4c 3681void gfc_free_association_list (gfc_association_list *);
6de9cd9a 3682
e53b6e56 3683/* resolve.cc */
de89b574
TB
3684void gfc_expression_rank (gfc_expr *);
3685bool gfc_resolve_ref (gfc_expr *);
524af0d6 3686bool gfc_resolve_expr (gfc_expr *);
6de9cd9a 3687void gfc_resolve (gfc_namespace *);
b46ebd6c 3688void gfc_resolve_code (gfc_code *, gfc_namespace *);
6c7a4dfd 3689void gfc_resolve_blocks (gfc_code *, gfc_namespace *);
3ab216a4 3690void gfc_resolve_formal_arglist (gfc_symbol *);
6de9cd9a
DN
3691int gfc_impure_variable (gfc_symbol *);
3692int gfc_pure (gfc_symbol *);
f1f39033 3693int gfc_implicit_pure (gfc_symbol *);
ccd7751b 3694void gfc_unset_implicit_pure (gfc_symbol *);
6de9cd9a 3695int gfc_elemental (gfc_symbol *);
524af0d6
JB
3696bool gfc_resolve_iterator (gfc_iterator *, bool, bool);
3697bool find_forall_index (gfc_expr *, gfc_symbol *, int);
3698bool gfc_resolve_index (gfc_expr *, int);
3699bool gfc_resolve_dim_arg (gfc_expr *);
7a28353e 3700bool gfc_is_formal_arg (void);
bdd1b1f5 3701bool gfc_resolve_substring (gfc_ref *, bool *);
07368af0 3702void gfc_resolve_substring_charlen (gfc_expr *);
cf2b3c22 3703gfc_expr *gfc_expr_to_initialize (gfc_expr *);
2dda89a8 3704bool gfc_type_is_extensible (gfc_symbol *);
524af0d6 3705bool gfc_resolve_intrinsic (gfc_symbol *, locus *);
96486998 3706bool gfc_explicit_interface_required (gfc_symbol *, char *, int);
ce96d372 3707extern int gfc_do_concurrent_flag;
bcc478b9 3708const char* gfc_lookup_function_fuzzy (const char *, gfc_symtree *);
6457b1f0
JW
3709int gfc_pure_function (gfc_expr *e, const char **name);
3710int gfc_implicit_pure_function (gfc_expr *e);
a8b3b0b6 3711
6de9cd9a 3712
e53b6e56 3713/* array.cc */
b7e75771
JD
3714gfc_iterator *gfc_copy_iterator (gfc_iterator *);
3715
6de9cd9a
DN
3716void gfc_free_array_spec (gfc_array_spec *);
3717gfc_array_ref *gfc_copy_array_ref (gfc_array_ref *);
3718
524af0d6 3719bool gfc_set_array_spec (gfc_symbol *, gfc_array_spec *, locus *);
6de9cd9a 3720gfc_array_spec *gfc_copy_array_spec (gfc_array_spec *);
524af0d6 3721bool gfc_resolve_array_spec (gfc_array_spec *, int);
6de9cd9a
DN
3722
3723int gfc_compare_array_spec (gfc_array_spec *, gfc_array_spec *);
3724
6de9cd9a 3725void gfc_simplify_iterator_var (gfc_expr *);
524af0d6 3726bool gfc_expand_constructor (gfc_expr *, bool);
6de9cd9a
DN
3727int gfc_constant_ac (gfc_expr *);
3728int gfc_expanded_ac (gfc_expr *);
524af0d6
JB
3729bool gfc_resolve_character_array_constructor (gfc_expr *);
3730bool gfc_resolve_array_constructor (gfc_expr *);
3731bool gfc_check_constructor_type (gfc_expr *);
3732bool gfc_check_iter_variable (gfc_expr *);
3733bool gfc_check_constructor (gfc_expr *, bool (*)(gfc_expr *));
3734bool gfc_array_size (gfc_expr *, mpz_t *);
3735bool gfc_array_dimen_size (gfc_expr *, int, mpz_t *);
3736bool gfc_array_ref_shape (gfc_array_ref *, mpz_t *);
eb401400 3737gfc_array_ref *gfc_find_array_ref (gfc_expr *, bool a = false);
66e4ab31 3738tree gfc_conv_array_initializer (tree type, gfc_expr *);
524af0d6
JB
3739bool spec_size (gfc_array_spec *, mpz_t *);
3740bool spec_dimen_size (gfc_array_spec *, int, mpz_t *);
7a28353e 3741bool gfc_is_compile_time_shape (gfc_array_spec *);
6de9cd9a 3742
524af0d6 3743bool gfc_ref_dimen_size (gfc_array_ref *, int dimen, mpz_t *, mpz_t *);
543af7ab 3744
e53b6e56 3745/* interface.cc -- FIXME: some of these should be in symbol.cc */
6de9cd9a 3746void gfc_free_interface (gfc_interface *);
f3e1097b
JW
3747bool gfc_compare_derived_types (gfc_symbol *, gfc_symbol *);
3748bool gfc_compare_types (gfc_typespec *, gfc_typespec *);
4668d6f9
PT
3749bool gfc_check_dummy_characteristics (gfc_symbol *, gfc_symbol *,
3750 bool, char *, int);
3751bool gfc_check_result_characteristics (gfc_symbol *, gfc_symbol *,
3752 char *, int);
f3e1097b 3753bool gfc_compare_interfaces (gfc_symbol*, gfc_symbol*, const char *, int, int,
2298af08
TK
3754 char *, int, const char *, const char *,
3755 bool *bad_result_characteristics = NULL);
6de9cd9a 3756void gfc_check_interfaces (gfc_namespace *);
524af0d6 3757bool gfc_procedure_use (gfc_symbol *, gfc_actual_arglist **, locus *);
7e196f89 3758void gfc_ppc_use (gfc_component *, gfc_actual_arglist **, locus *);
6de9cd9a
DN
3759gfc_symbol *gfc_search_interface (gfc_interface *, int,
3760 gfc_actual_arglist **);
eaee02a5 3761match gfc_extend_expr (gfc_expr *);
6de9cd9a 3762void gfc_free_formal_arglist (gfc_formal_arglist *);
524af0d6
JB
3763bool gfc_extend_assign (gfc_code *, gfc_namespace *);
3764bool gfc_check_new_interface (gfc_interface *, gfc_symbol *, locus);
3765bool gfc_add_interface (gfc_symbol *);
2b77e908
FXC
3766gfc_interface *gfc_current_interface_head (void);
3767void gfc_set_current_interface_head (gfc_interface *);
f6fad28e 3768gfc_symtree* gfc_find_sym_in_symtree (gfc_symbol*);
f0ac18b7 3769bool gfc_arglist_matches_symbol (gfc_actual_arglist**, gfc_symbol*);
94747289 3770bool gfc_check_operator_interface (gfc_symbol*, gfc_intrinsic_op, locus);
f3e1097b 3771bool gfc_has_vector_subscript (gfc_expr*);
fb03a37e 3772gfc_intrinsic_op gfc_equivalent_op (gfc_intrinsic_op);
524af0d6 3773bool gfc_check_typebound_override (gfc_symtree*, gfc_symtree*);
e73d3ca6 3774void gfc_check_dtio_interfaces (gfc_symbol*);
e4e659b9 3775gfc_symtree* gfc_find_typebound_dtio_proc (gfc_symbol *, bool, bool);
e73d3ca6 3776gfc_symbol* gfc_find_specific_dtio_proc (gfc_symbol*, bool, bool);
e68a35ae
TK
3777void gfc_get_formal_from_actual_arglist (gfc_symbol *, gfc_actual_arglist *);
3778bool gfc_compare_actual_formal (gfc_actual_arglist **, gfc_formal_arglist *,
3779 int, int, bool, locus *);
e73d3ca6 3780
6de9cd9a 3781
e53b6e56 3782/* io.cc */
6de9cd9a
DN
3783extern gfc_st_label format_asterisk;
3784
3785void gfc_free_open (gfc_open *);
44facdb7 3786bool gfc_resolve_open (gfc_open *, locus *);
6de9cd9a 3787void gfc_free_close (gfc_close *);
44facdb7 3788bool gfc_resolve_close (gfc_close *, locus *);
6de9cd9a 3789void gfc_free_filepos (gfc_filepos *);
3d07fb21 3790bool gfc_resolve_filepos (gfc_filepos *, locus *);
6de9cd9a 3791void gfc_free_inquire (gfc_inquire *);
524af0d6 3792bool gfc_resolve_inquire (gfc_inquire *);
6de9cd9a 3793void gfc_free_dt (gfc_dt *);
44facdb7 3794bool gfc_resolve_dt (gfc_code *, gfc_dt *, locus *);
6f0f0b2e 3795void gfc_free_wait (gfc_wait *);
524af0d6 3796bool gfc_resolve_wait (gfc_wait *);
6de9cd9a 3797
e53b6e56 3798/* module.cc */
6de9cd9a
DN
3799void gfc_module_init_2 (void);
3800void gfc_module_done_2 (void);
3801void gfc_dump_module (const char *, int);
6e2062b0 3802bool gfc_check_symbol_access (gfc_symbol *);
a64f5186 3803void gfc_free_use_stmts (gfc_use_list *);
f6288c24
FR
3804const char *gfc_dt_lower_string (const char *);
3805const char *gfc_dt_upper_string (const char *);
6de9cd9a 3806
e53b6e56 3807/* primary.cc */
6de9cd9a
DN
3808symbol_attribute gfc_variable_attr (gfc_expr *, gfc_typespec *);
3809symbol_attribute gfc_expr_attr (gfc_expr *);
ba85c8c3 3810symbol_attribute gfc_caf_attr (gfc_expr *, bool i = false, bool *r = NULL);
eb77cddf 3811match gfc_match_rvalue (gfc_expr **);
713485cc 3812match gfc_match_varspec (gfc_expr*, int, bool, bool);
8fc541d3 3813int gfc_check_digit (char, int);
2d71b918 3814bool gfc_is_function_return_value (gfc_symbol *, gfc_namespace *);
524af0d6 3815bool gfc_convert_to_structure_constructor (gfc_expr *, gfc_symbol *,
c3f34952
TB
3816 gfc_expr **,
3817 gfc_actual_arglist **, bool);
6de9cd9a 3818
e53b6e56 3819/* trans.cc */
6de9cd9a
DN
3820void gfc_generate_code (gfc_namespace *);
3821void gfc_generate_module_code (gfc_namespace *);
3822
e53b6e56 3823/* trans-intrinsic.cc */
9645e798
MM
3824bool gfc_inline_intrinsic_function_p (gfc_expr *);
3825
e53b6e56 3826/* bbt.cc */
6de9cd9a
DN
3827typedef int (*compare_fn) (void *, void *);
3828void gfc_insert_bbt (void *, void *, compare_fn);
3829void gfc_delete_bbt (void *, void *, compare_fn);
3830
e53b6e56 3831/* dump-parse-tree.cc */
6c1abb5c 3832void gfc_dump_parse_tree (gfc_namespace *, FILE *);
e655a6cc 3833void gfc_dump_c_prototypes (gfc_namespace *, FILE *);
6328ce1f 3834void gfc_dump_external_c_prototypes (FILE *);
5c6aa9a8 3835void gfc_dump_global_symbols (FILE *);
fb078366
TK
3836void debug (gfc_symbol *);
3837void debug (gfc_expr *);
6de9cd9a 3838
e53b6e56 3839/* parse.cc */
524af0d6 3840bool gfc_parse_file (void);
ca39e6f2 3841void gfc_global_used (gfc_gsymbol *, locus *);
3e78238a 3842gfc_namespace* gfc_build_block_ns (gfc_namespace *);
6de9cd9a 3843
e53b6e56 3844/* dependency.cc */
2757d5ec 3845int gfc_dep_compare_functions (gfc_expr *, gfc_expr *, bool);
2990f854 3846int gfc_dep_compare_expr (gfc_expr *, gfc_expr *);
eab19a1a 3847bool gfc_dep_difference (gfc_expr *, gfc_expr *, mpz_t *);
2990f854 3848
e53b6e56 3849/* check.cc */
524af0d6
JB
3850bool gfc_check_same_strlen (const gfc_expr*, const gfc_expr*, const char*);
3851bool gfc_calculate_transfer_sizes (gfc_expr*, gfc_expr*, gfc_expr*,
86dbed7d 3852 size_t*, size_t*, size_t*);
8dc63166
SK
3853bool gfc_boz2int (gfc_expr *, int);
3854bool gfc_boz2real (gfc_expr *, int);
3855bool gfc_invalid_boz (const char *, locus *);
7fd614ee 3856bool gfc_invalid_null_arg (gfc_expr *);
8dc63166 3857
fb5bc08b 3858
e53b6e56 3859/* class.cc */
37da591f 3860void gfc_fix_class_refs (gfc_expr *e);
d15bac21 3861void gfc_add_component_ref (gfc_expr *, const char *);
c49ea23d 3862void gfc_add_class_array_ref (gfc_expr *);
b04533af
JW
3863#define gfc_add_data_component(e) gfc_add_component_ref(e,"_data")
3864#define gfc_add_vptr_component(e) gfc_add_component_ref(e,"_vptr")
34d9d749 3865#define gfc_add_len_component(e) gfc_add_component_ref(e,"_len")
b04533af
JW
3866#define gfc_add_hash_component(e) gfc_add_component_ref(e,"_hash")
3867#define gfc_add_size_component(e) gfc_add_component_ref(e,"_size")
3868#define gfc_add_def_init_component(e) gfc_add_component_ref(e,"_def_init")
86035eec 3869#define gfc_add_final_component(e) gfc_add_component_ref(e,"_final")
c49ea23d
PT
3870bool gfc_is_class_array_ref (gfc_expr *, bool *);
3871bool gfc_is_class_scalar_expr (gfc_expr *);
5bf5fa56 3872bool gfc_is_class_container_ref (gfc_expr *e);
2cc6320d 3873gfc_expr *gfc_class_initializer (gfc_typespec *, gfc_expr *);
4fa02692 3874unsigned int gfc_hash_value (gfc_symbol *);
9e6644c6 3875gfc_expr *gfc_get_len_component (gfc_expr *e, int);
524af0d6 3876bool gfc_build_class_symbol (gfc_typespec *, symbol_attribute *,
9b6da3c7 3877 gfc_array_spec **);
88ce8031 3878gfc_symbol *gfc_find_derived_vtab (gfc_symbol *);
7289d1c9 3879gfc_symbol *gfc_find_vtab (gfc_typespec *);
524af0d6 3880gfc_symtree* gfc_find_typebound_proc (gfc_symbol*, bool*,
d15bac21 3881 const char*, bool, locus*);
524af0d6 3882gfc_symtree* gfc_find_typebound_user_op (gfc_symbol*, bool*,
d15bac21 3883 const char*, bool, locus*);
524af0d6 3884gfc_typebound_proc* gfc_find_typebound_intrinsic_op (gfc_symbol*, bool*,
d15bac21
JW
3885 gfc_intrinsic_op, bool,
3886 locus*);
3887gfc_symtree* gfc_get_tbp_symtree (gfc_symtree**, const char*);
86035eec 3888bool gfc_is_finalizable (gfc_symbol *, gfc_expr **);
d15bac21 3889
7a08eda1 3890#define CLASS_DATA(sym) sym->ts.u.derived->components
8b704316
PT
3891#define UNLIMITED_POLY(sym) \
3892 (sym != NULL && sym->ts.type == BT_CLASS \
3893 && CLASS_DATA (sym) \
3894 && CLASS_DATA (sym)->ts.u.derived \
3895 && CLASS_DATA (sym)->ts.u.derived->attr.unlimited_polymorphic)
f3b0bb7a
AV
3896#define IS_CLASS_ARRAY(sym) \
3897 (sym->ts.type == BT_CLASS \
3898 && CLASS_DATA (sym) \
3899 && CLASS_DATA (sym)->attr.dimension \
3900 && !CLASS_DATA (sym)->attr.class_pointer)
e49508ac
HA
3901#define IS_POINTER(sym) \
3902 (sym->ts.type == BT_CLASS && sym->attr.class_ok && CLASS_DATA (sym) \
3903 ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer)
7a08eda1 3904
e53b6e56 3905/* frontend-passes.cc */
601d98be
TK
3906
3907void gfc_run_passes (gfc_namespace *);
3908
4d42b5cd
JJ
3909typedef int (*walk_code_fn_t) (gfc_code **, int *, void *);
3910typedef int (*walk_expr_fn_t) (gfc_expr **, int *, void *);
3911
5f23671d 3912int gfc_dummy_code_callback (gfc_code **, int *, void *);
4d42b5cd
JJ
3913int gfc_expr_walker (gfc_expr **, walk_expr_fn_t, void *);
3914int gfc_code_walker (gfc_code **, walk_code_fn_t, walk_expr_fn_t, void *);
1585b483 3915bool gfc_has_dimen_vector_ref (gfc_expr *e);
fb078366 3916void gfc_check_externals (gfc_namespace *);
3055d879 3917bool gfc_fix_implicit_pure (gfc_namespace *);
4d42b5cd 3918
e53b6e56 3919/* simplify.cc */
d01b2c21
TK
3920
3921void gfc_convert_mpz_to_signed (mpz_t, int);
0e360db9 3922gfc_expr *gfc_simplify_ieee_functions (gfc_expr *);
5867bb9a 3923bool gfc_is_size_zero_array (gfc_expr *);
d01b2c21 3924
e53b6e56 3925/* trans-array.cc */
f1abbf69
TK
3926
3927bool gfc_is_reallocatable_lhs (gfc_expr *);
3928
e53b6e56 3929/* trans-decl.cc */
dc7a8b4b
JN
3930
3931void finish_oacc_declare (gfc_namespace *, gfc_symbol *, bool);
facf0354 3932void gfc_adjust_builtins (void);
dc7a8b4b 3933
53814b8f 3934#endif /* GCC_GFORTRAN_H */