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