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