2018-10-09 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / fortran / gfortran.h
blob8e50e4d654a45da578b438f8c9f32fb31557ec40
1 /* gfortran header file
2 Copyright (C) 2000-2018 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;
110 /*************************** Enums *****************************/
112 /* Used when matching and resolving data I/O transfer statements. */
114 enum io_kind
115 { M_READ, M_WRITE, M_PRINT, M_INQUIRE };
118 /* These are flags for identifying whether we are reading a character literal
119 between quotes or normal source code. */
121 enum gfc_instring
122 { NONSTRING = 0, INSTRING_WARN, INSTRING_NOWARN };
124 /* This is returned by gfc_notification_std to know if, given the flags
125 that were given (-std=, -pedantic) we should issue an error, a warning
126 or nothing. */
128 enum notification
129 { SILENT, WARNING, ERROR };
131 /* Matchers return one of these three values. The difference between
132 MATCH_NO and MATCH_ERROR is that MATCH_ERROR means that a match was
133 successful, but that something non-syntactic is wrong and an error
134 has already been issued. */
136 enum match
137 { MATCH_NO = 1, MATCH_YES, MATCH_ERROR };
139 /* Used for different Fortran source forms in places like scanner.c. */
140 enum gfc_source_form
141 { FORM_FREE, FORM_FIXED, FORM_UNKNOWN };
143 /* Expression node types. */
144 enum expr_t
145 { EXPR_OP = 1, EXPR_FUNCTION, EXPR_CONSTANT, EXPR_VARIABLE,
146 EXPR_SUBSTRING, EXPR_STRUCTURE, EXPR_ARRAY, EXPR_NULL, EXPR_COMPCALL, EXPR_PPC
149 /* Array types. */
150 enum array_type
151 { AS_EXPLICIT = 1, AS_ASSUMED_SHAPE, AS_DEFERRED,
152 AS_ASSUMED_SIZE, AS_IMPLIED_SHAPE, AS_ASSUMED_RANK,
153 AS_UNKNOWN
156 enum ar_type
157 { AR_FULL = 1, AR_ELEMENT, AR_SECTION, AR_UNKNOWN };
159 /* Statement label types. ST_LABEL_DO_TARGET is used for obsolescent warnings
160 related to shared DO terminations and DO targets which are neither END DO
161 nor CONTINUE; otherwise it is identical to ST_LABEL_TARGET. */
162 enum gfc_sl_type
163 { ST_LABEL_UNKNOWN = 1, ST_LABEL_TARGET, ST_LABEL_DO_TARGET,
164 ST_LABEL_BAD_TARGET, ST_LABEL_FORMAT
167 /* Intrinsic operators. */
168 enum gfc_intrinsic_op
169 { GFC_INTRINSIC_BEGIN = 0,
170 INTRINSIC_NONE = -1, INTRINSIC_UPLUS = GFC_INTRINSIC_BEGIN,
171 INTRINSIC_UMINUS, INTRINSIC_PLUS, INTRINSIC_MINUS, INTRINSIC_TIMES,
172 INTRINSIC_DIVIDE, INTRINSIC_POWER, INTRINSIC_CONCAT,
173 INTRINSIC_AND, INTRINSIC_OR, INTRINSIC_EQV, INTRINSIC_NEQV,
174 /* ==, /=, >, >=, <, <= */
175 INTRINSIC_EQ, INTRINSIC_NE, INTRINSIC_GT, INTRINSIC_GE,
176 INTRINSIC_LT, INTRINSIC_LE,
177 /* .EQ., .NE., .GT., .GE., .LT., .LE. (OS = Old-Style) */
178 INTRINSIC_EQ_OS, INTRINSIC_NE_OS, INTRINSIC_GT_OS, INTRINSIC_GE_OS,
179 INTRINSIC_LT_OS, INTRINSIC_LE_OS,
180 INTRINSIC_NOT, INTRINSIC_USER, INTRINSIC_ASSIGN, INTRINSIC_PARENTHESES,
181 GFC_INTRINSIC_END, /* Sentinel */
182 /* User defined derived type pseudo operators. These are set beyond the
183 sentinel so that they are excluded from module_read and module_write. */
184 INTRINSIC_FORMATTED, INTRINSIC_UNFORMATTED
187 /* This macro is the number of intrinsic operators that exist.
188 Assumptions are made about the numbering of the interface_op enums. */
189 #define GFC_INTRINSIC_OPS GFC_INTRINSIC_END
191 /* Arithmetic results. */
192 enum arith
193 { ARITH_OK = 1, ARITH_OVERFLOW, ARITH_UNDERFLOW, ARITH_NAN,
194 ARITH_DIV0, ARITH_INCOMMENSURATE, ARITH_ASYMMETRIC, ARITH_PROHIBIT,
195 ARITH_WRONGCONCAT
198 /* Statements. */
199 enum gfc_statement
201 ST_ARITHMETIC_IF, ST_ALLOCATE, ST_ATTR_DECL, ST_ASSOCIATE,
202 ST_BACKSPACE, ST_BLOCK, ST_BLOCK_DATA,
203 ST_CALL, ST_CASE, ST_CLOSE, ST_COMMON, ST_CONTINUE, ST_CONTAINS, ST_CYCLE,
204 ST_DATA, ST_DATA_DECL, ST_DEALLOCATE, ST_DO, ST_ELSE, ST_ELSEIF,
205 ST_ELSEWHERE, ST_END_ASSOCIATE, ST_END_BLOCK, ST_END_BLOCK_DATA,
206 ST_ENDDO, ST_IMPLIED_ENDDO, ST_END_FILE, ST_FINAL, ST_FLUSH, ST_END_FORALL,
207 ST_END_FUNCTION, ST_ENDIF, ST_END_INTERFACE, ST_END_MODULE, ST_END_SUBMODULE,
208 ST_END_PROGRAM, ST_END_SELECT, ST_END_SUBROUTINE, ST_END_WHERE, ST_END_TYPE,
209 ST_ENTRY, ST_EQUIVALENCE, ST_ERROR_STOP, ST_EXIT, ST_FORALL, ST_FORALL_BLOCK,
210 ST_FORMAT, ST_FUNCTION, ST_GOTO, ST_IF_BLOCK, ST_IMPLICIT, ST_IMPLICIT_NONE,
211 ST_IMPORT, ST_INQUIRE, ST_INTERFACE, ST_SYNC_ALL, ST_SYNC_MEMORY,
212 ST_SYNC_IMAGES, ST_PARAMETER, ST_MODULE, ST_SUBMODULE, ST_MODULE_PROC,
213 ST_NAMELIST, ST_NULLIFY, ST_OPEN, ST_PAUSE, ST_PRIVATE, ST_PROGRAM, ST_PUBLIC,
214 ST_READ, ST_RETURN, ST_REWIND, ST_STOP, ST_SUBROUTINE, ST_TYPE, ST_USE,
215 ST_WHERE_BLOCK, ST_WHERE, ST_WAIT, ST_WRITE, ST_ASSIGNMENT,
216 ST_POINTER_ASSIGNMENT, ST_SELECT_CASE, ST_SEQUENCE, ST_SIMPLE_IF,
217 ST_STATEMENT_FUNCTION, ST_DERIVED_DECL, ST_LABEL_ASSIGNMENT, ST_ENUM,
218 ST_ENUMERATOR, ST_END_ENUM, ST_SELECT_TYPE, ST_TYPE_IS, ST_CLASS_IS,
219 ST_STRUCTURE_DECL, ST_END_STRUCTURE,
220 ST_UNION, ST_END_UNION, ST_MAP, ST_END_MAP,
221 ST_OACC_PARALLEL_LOOP, ST_OACC_END_PARALLEL_LOOP, ST_OACC_PARALLEL,
222 ST_OACC_END_PARALLEL, ST_OACC_KERNELS, ST_OACC_END_KERNELS, ST_OACC_DATA,
223 ST_OACC_END_DATA, ST_OACC_HOST_DATA, ST_OACC_END_HOST_DATA, ST_OACC_LOOP,
224 ST_OACC_END_LOOP, ST_OACC_DECLARE, ST_OACC_UPDATE, ST_OACC_WAIT,
225 ST_OACC_CACHE, ST_OACC_KERNELS_LOOP, ST_OACC_END_KERNELS_LOOP,
226 ST_OACC_ENTER_DATA, ST_OACC_EXIT_DATA, ST_OACC_ROUTINE,
227 ST_OACC_ATOMIC, ST_OACC_END_ATOMIC,
228 ST_OMP_ATOMIC, ST_OMP_BARRIER, ST_OMP_CRITICAL, ST_OMP_END_ATOMIC,
229 ST_OMP_END_CRITICAL, ST_OMP_END_DO, ST_OMP_END_MASTER, ST_OMP_END_ORDERED,
230 ST_OMP_END_PARALLEL, ST_OMP_END_PARALLEL_DO, ST_OMP_END_PARALLEL_SECTIONS,
231 ST_OMP_END_PARALLEL_WORKSHARE, ST_OMP_END_SECTIONS, ST_OMP_END_SINGLE,
232 ST_OMP_END_WORKSHARE, ST_OMP_DO, ST_OMP_FLUSH, ST_OMP_MASTER, ST_OMP_ORDERED,
233 ST_OMP_PARALLEL, ST_OMP_PARALLEL_DO, ST_OMP_PARALLEL_SECTIONS,
234 ST_OMP_PARALLEL_WORKSHARE, ST_OMP_SECTIONS, ST_OMP_SECTION, ST_OMP_SINGLE,
235 ST_OMP_THREADPRIVATE, ST_OMP_WORKSHARE, ST_OMP_TASK, ST_OMP_END_TASK,
236 ST_OMP_TASKWAIT, ST_OMP_TASKYIELD, ST_OMP_CANCEL, ST_OMP_CANCELLATION_POINT,
237 ST_OMP_TASKGROUP, ST_OMP_END_TASKGROUP, ST_OMP_SIMD, ST_OMP_END_SIMD,
238 ST_OMP_DO_SIMD, ST_OMP_END_DO_SIMD, ST_OMP_PARALLEL_DO_SIMD,
239 ST_OMP_END_PARALLEL_DO_SIMD, ST_OMP_DECLARE_SIMD, ST_OMP_DECLARE_REDUCTION,
240 ST_OMP_TARGET, ST_OMP_END_TARGET, ST_OMP_TARGET_DATA, ST_OMP_END_TARGET_DATA,
241 ST_OMP_TARGET_UPDATE, ST_OMP_DECLARE_TARGET,
242 ST_OMP_TEAMS, ST_OMP_END_TEAMS, ST_OMP_DISTRIBUTE, ST_OMP_END_DISTRIBUTE,
243 ST_OMP_DISTRIBUTE_SIMD, ST_OMP_END_DISTRIBUTE_SIMD,
244 ST_OMP_DISTRIBUTE_PARALLEL_DO, ST_OMP_END_DISTRIBUTE_PARALLEL_DO,
245 ST_OMP_DISTRIBUTE_PARALLEL_DO_SIMD, ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD,
246 ST_OMP_TARGET_TEAMS, ST_OMP_END_TARGET_TEAMS, ST_OMP_TEAMS_DISTRIBUTE,
247 ST_OMP_END_TEAMS_DISTRIBUTE, ST_OMP_TEAMS_DISTRIBUTE_SIMD,
248 ST_OMP_END_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TARGET_TEAMS_DISTRIBUTE,
249 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE, ST_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
250 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD, ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
251 ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO,
252 ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
253 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
254 ST_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
255 ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
256 ST_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
257 ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
258 ST_OMP_TARGET_PARALLEL, ST_OMP_END_TARGET_PARALLEL,
259 ST_OMP_TARGET_PARALLEL_DO, ST_OMP_END_TARGET_PARALLEL_DO,
260 ST_OMP_TARGET_PARALLEL_DO_SIMD, ST_OMP_END_TARGET_PARALLEL_DO_SIMD,
261 ST_OMP_TARGET_ENTER_DATA, ST_OMP_TARGET_EXIT_DATA,
262 ST_OMP_TARGET_SIMD, ST_OMP_END_TARGET_SIMD,
263 ST_OMP_TASKLOOP, ST_OMP_END_TASKLOOP,
264 ST_OMP_TASKLOOP_SIMD, ST_OMP_END_TASKLOOP_SIMD, ST_OMP_ORDERED_DEPEND,
265 ST_PROCEDURE, ST_GENERIC, ST_CRITICAL, ST_END_CRITICAL,
266 ST_GET_FCN_CHARACTERISTICS, ST_LOCK, ST_UNLOCK, ST_EVENT_POST,
267 ST_EVENT_WAIT, ST_FAIL_IMAGE, ST_FORM_TEAM, ST_CHANGE_TEAM,
268 ST_END_TEAM, ST_SYNC_TEAM, ST_NONE
271 /* Types of interfaces that we can have. Assignment interfaces are
272 considered to be intrinsic operators. */
273 enum interface_type
275 INTERFACE_NAMELESS = 1, INTERFACE_GENERIC,
276 INTERFACE_INTRINSIC_OP, INTERFACE_USER_OP, INTERFACE_ABSTRACT,
277 INTERFACE_DTIO
280 /* Symbol flavors: these are all mutually exclusive.
281 12 elements = 4 bits. */
282 enum sym_flavor
284 FL_UNKNOWN = 0, FL_PROGRAM, FL_BLOCK_DATA, FL_MODULE, FL_VARIABLE,
285 FL_PARAMETER, FL_LABEL, FL_PROCEDURE, FL_DERIVED, FL_NAMELIST,
286 FL_UNION, FL_STRUCT, FL_VOID
289 /* Procedure types. 7 elements = 3 bits. */
290 enum procedure_type
291 { PROC_UNKNOWN, PROC_MODULE, PROC_INTERNAL, PROC_DUMMY,
292 PROC_INTRINSIC, PROC_ST_FUNCTION, PROC_EXTERNAL
295 /* Intent types. Note that these values are also used in another enum in
296 decl.c (match_attr_spec). */
297 enum sym_intent
298 { INTENT_UNKNOWN = 0, INTENT_IN, INTENT_OUT, INTENT_INOUT
301 /* Access types. */
302 enum gfc_access
303 { ACCESS_UNKNOWN = 0, ACCESS_PUBLIC, ACCESS_PRIVATE
306 /* Flags to keep track of where an interface came from.
307 3 elements = 2 bits. */
308 enum ifsrc
309 { IFSRC_UNKNOWN = 0, /* Interface unknown, only return type may be known. */
310 IFSRC_DECL, /* FUNCTION or SUBROUTINE declaration. */
311 IFSRC_IFBODY /* INTERFACE statement or PROCEDURE statement
312 with explicit interface. */
315 /* Whether a SAVE attribute was set explicitly or implicitly. */
316 enum save_state
317 { SAVE_NONE = 0, SAVE_EXPLICIT, SAVE_IMPLICIT
320 /* Strings for all symbol attributes. We use these for dumping the
321 parse tree, in error messages, and also when reading and writing
322 modules. In symbol.c. */
323 extern const mstring flavors[];
324 extern const mstring procedures[];
325 extern const mstring intents[];
326 extern const mstring access_types[];
327 extern const mstring ifsrc_types[];
328 extern const mstring save_status[];
330 /* Strings for DTIO procedure names. In symbol.c. */
331 extern const mstring dtio_procs[];
333 enum dtio_codes
334 { DTIO_RF = 0, DTIO_WF, DTIO_RUF, DTIO_WUF };
336 /* Enumeration of all the generic intrinsic functions. Used by the
337 backend for identification of a function. */
339 enum gfc_isym_id
341 /* GFC_ISYM_NONE is used for intrinsics which will never be seen by
342 the backend (e.g. KIND). */
343 GFC_ISYM_NONE = 0,
344 GFC_ISYM_ABORT,
345 GFC_ISYM_ABS,
346 GFC_ISYM_ACCESS,
347 GFC_ISYM_ACHAR,
348 GFC_ISYM_ACOS,
349 GFC_ISYM_ACOSH,
350 GFC_ISYM_ADJUSTL,
351 GFC_ISYM_ADJUSTR,
352 GFC_ISYM_AIMAG,
353 GFC_ISYM_AINT,
354 GFC_ISYM_ALARM,
355 GFC_ISYM_ALL,
356 GFC_ISYM_ALLOCATED,
357 GFC_ISYM_AND,
358 GFC_ISYM_ANINT,
359 GFC_ISYM_ANY,
360 GFC_ISYM_ASIN,
361 GFC_ISYM_ASINH,
362 GFC_ISYM_ASSOCIATED,
363 GFC_ISYM_ATAN,
364 GFC_ISYM_ATAN2,
365 GFC_ISYM_ATANH,
366 GFC_ISYM_ATOMIC_ADD,
367 GFC_ISYM_ATOMIC_AND,
368 GFC_ISYM_ATOMIC_CAS,
369 GFC_ISYM_ATOMIC_DEF,
370 GFC_ISYM_ATOMIC_FETCH_ADD,
371 GFC_ISYM_ATOMIC_FETCH_AND,
372 GFC_ISYM_ATOMIC_FETCH_OR,
373 GFC_ISYM_ATOMIC_FETCH_XOR,
374 GFC_ISYM_ATOMIC_OR,
375 GFC_ISYM_ATOMIC_REF,
376 GFC_ISYM_ATOMIC_XOR,
377 GFC_ISYM_BGE,
378 GFC_ISYM_BGT,
379 GFC_ISYM_BIT_SIZE,
380 GFC_ISYM_BLE,
381 GFC_ISYM_BLT,
382 GFC_ISYM_BTEST,
383 GFC_ISYM_CAF_GET,
384 GFC_ISYM_CAF_SEND,
385 GFC_ISYM_CEILING,
386 GFC_ISYM_CHAR,
387 GFC_ISYM_CHDIR,
388 GFC_ISYM_CHMOD,
389 GFC_ISYM_CMPLX,
390 GFC_ISYM_CO_BROADCAST,
391 GFC_ISYM_CO_MAX,
392 GFC_ISYM_CO_MIN,
393 GFC_ISYM_CO_REDUCE,
394 GFC_ISYM_CO_SUM,
395 GFC_ISYM_COMMAND_ARGUMENT_COUNT,
396 GFC_ISYM_COMPILER_OPTIONS,
397 GFC_ISYM_COMPILER_VERSION,
398 GFC_ISYM_COMPLEX,
399 GFC_ISYM_CONJG,
400 GFC_ISYM_CONVERSION,
401 GFC_ISYM_COS,
402 GFC_ISYM_COSH,
403 GFC_ISYM_COTAN,
404 GFC_ISYM_COUNT,
405 GFC_ISYM_CPU_TIME,
406 GFC_ISYM_CSHIFT,
407 GFC_ISYM_CTIME,
408 GFC_ISYM_C_ASSOCIATED,
409 GFC_ISYM_C_F_POINTER,
410 GFC_ISYM_C_F_PROCPOINTER,
411 GFC_ISYM_C_FUNLOC,
412 GFC_ISYM_C_LOC,
413 GFC_ISYM_C_SIZEOF,
414 GFC_ISYM_DATE_AND_TIME,
415 GFC_ISYM_DBLE,
416 GFC_ISYM_DIGITS,
417 GFC_ISYM_DIM,
418 GFC_ISYM_DOT_PRODUCT,
419 GFC_ISYM_DPROD,
420 GFC_ISYM_DSHIFTL,
421 GFC_ISYM_DSHIFTR,
422 GFC_ISYM_DTIME,
423 GFC_ISYM_EOSHIFT,
424 GFC_ISYM_EPSILON,
425 GFC_ISYM_ERF,
426 GFC_ISYM_ERFC,
427 GFC_ISYM_ERFC_SCALED,
428 GFC_ISYM_ETIME,
429 GFC_ISYM_EVENT_QUERY,
430 GFC_ISYM_EXECUTE_COMMAND_LINE,
431 GFC_ISYM_EXIT,
432 GFC_ISYM_EXP,
433 GFC_ISYM_EXPONENT,
434 GFC_ISYM_EXTENDS_TYPE_OF,
435 GFC_ISYM_FAILED_IMAGES,
436 GFC_ISYM_FDATE,
437 GFC_ISYM_FE_RUNTIME_ERROR,
438 GFC_ISYM_FGET,
439 GFC_ISYM_FGETC,
440 GFC_ISYM_FLOOR,
441 GFC_ISYM_FLUSH,
442 GFC_ISYM_FNUM,
443 GFC_ISYM_FPUT,
444 GFC_ISYM_FPUTC,
445 GFC_ISYM_FRACTION,
446 GFC_ISYM_FREE,
447 GFC_ISYM_FSEEK,
448 GFC_ISYM_FSTAT,
449 GFC_ISYM_FTELL,
450 GFC_ISYM_TGAMMA,
451 GFC_ISYM_GERROR,
452 GFC_ISYM_GETARG,
453 GFC_ISYM_GET_COMMAND,
454 GFC_ISYM_GET_COMMAND_ARGUMENT,
455 GFC_ISYM_GETCWD,
456 GFC_ISYM_GETENV,
457 GFC_ISYM_GET_ENVIRONMENT_VARIABLE,
458 GFC_ISYM_GETGID,
459 GFC_ISYM_GETLOG,
460 GFC_ISYM_GETPID,
461 GFC_ISYM_GET_TEAM,
462 GFC_ISYM_GETUID,
463 GFC_ISYM_GMTIME,
464 GFC_ISYM_HOSTNM,
465 GFC_ISYM_HUGE,
466 GFC_ISYM_HYPOT,
467 GFC_ISYM_IACHAR,
468 GFC_ISYM_IALL,
469 GFC_ISYM_IAND,
470 GFC_ISYM_IANY,
471 GFC_ISYM_IARGC,
472 GFC_ISYM_IBCLR,
473 GFC_ISYM_IBITS,
474 GFC_ISYM_IBSET,
475 GFC_ISYM_ICHAR,
476 GFC_ISYM_IDATE,
477 GFC_ISYM_IEOR,
478 GFC_ISYM_IERRNO,
479 GFC_ISYM_IMAGE_INDEX,
480 GFC_ISYM_IMAGE_STATUS,
481 GFC_ISYM_INDEX,
482 GFC_ISYM_INT,
483 GFC_ISYM_INT2,
484 GFC_ISYM_INT8,
485 GFC_ISYM_IOR,
486 GFC_ISYM_IPARITY,
487 GFC_ISYM_IRAND,
488 GFC_ISYM_ISATTY,
489 GFC_ISYM_IS_IOSTAT_END,
490 GFC_ISYM_IS_IOSTAT_EOR,
491 GFC_ISYM_ISNAN,
492 GFC_ISYM_ISHFT,
493 GFC_ISYM_ISHFTC,
494 GFC_ISYM_ITIME,
495 GFC_ISYM_J0,
496 GFC_ISYM_J1,
497 GFC_ISYM_JN,
498 GFC_ISYM_JN2,
499 GFC_ISYM_KILL,
500 GFC_ISYM_KIND,
501 GFC_ISYM_LBOUND,
502 GFC_ISYM_LCOBOUND,
503 GFC_ISYM_LEADZ,
504 GFC_ISYM_LEN,
505 GFC_ISYM_LEN_TRIM,
506 GFC_ISYM_LGAMMA,
507 GFC_ISYM_LGE,
508 GFC_ISYM_LGT,
509 GFC_ISYM_LINK,
510 GFC_ISYM_LLE,
511 GFC_ISYM_LLT,
512 GFC_ISYM_LOC,
513 GFC_ISYM_LOG,
514 GFC_ISYM_LOG10,
515 GFC_ISYM_LOGICAL,
516 GFC_ISYM_LONG,
517 GFC_ISYM_LSHIFT,
518 GFC_ISYM_LSTAT,
519 GFC_ISYM_LTIME,
520 GFC_ISYM_MALLOC,
521 GFC_ISYM_MASKL,
522 GFC_ISYM_MASKR,
523 GFC_ISYM_MATMUL,
524 GFC_ISYM_MAX,
525 GFC_ISYM_MAXEXPONENT,
526 GFC_ISYM_MAXLOC,
527 GFC_ISYM_MAXVAL,
528 GFC_ISYM_MCLOCK,
529 GFC_ISYM_MCLOCK8,
530 GFC_ISYM_MERGE,
531 GFC_ISYM_MERGE_BITS,
532 GFC_ISYM_MIN,
533 GFC_ISYM_MINEXPONENT,
534 GFC_ISYM_MINLOC,
535 GFC_ISYM_MINVAL,
536 GFC_ISYM_MOD,
537 GFC_ISYM_MODULO,
538 GFC_ISYM_MOVE_ALLOC,
539 GFC_ISYM_MVBITS,
540 GFC_ISYM_NEAREST,
541 GFC_ISYM_NEW_LINE,
542 GFC_ISYM_NINT,
543 GFC_ISYM_NORM2,
544 GFC_ISYM_NOT,
545 GFC_ISYM_NULL,
546 GFC_ISYM_NUM_IMAGES,
547 GFC_ISYM_OR,
548 GFC_ISYM_PACK,
549 GFC_ISYM_PARITY,
550 GFC_ISYM_PERROR,
551 GFC_ISYM_POPCNT,
552 GFC_ISYM_POPPAR,
553 GFC_ISYM_PRECISION,
554 GFC_ISYM_PRESENT,
555 GFC_ISYM_PRODUCT,
556 GFC_ISYM_RADIX,
557 GFC_ISYM_RAND,
558 GFC_ISYM_RANDOM_INIT,
559 GFC_ISYM_RANDOM_NUMBER,
560 GFC_ISYM_RANDOM_SEED,
561 GFC_ISYM_RANGE,
562 GFC_ISYM_RANK,
563 GFC_ISYM_REAL,
564 GFC_ISYM_RENAME,
565 GFC_ISYM_REPEAT,
566 GFC_ISYM_RESHAPE,
567 GFC_ISYM_RRSPACING,
568 GFC_ISYM_RSHIFT,
569 GFC_ISYM_SAME_TYPE_AS,
570 GFC_ISYM_SC_KIND,
571 GFC_ISYM_SCALE,
572 GFC_ISYM_SCAN,
573 GFC_ISYM_SECNDS,
574 GFC_ISYM_SECOND,
575 GFC_ISYM_SET_EXPONENT,
576 GFC_ISYM_SHAPE,
577 GFC_ISYM_SHIFTA,
578 GFC_ISYM_SHIFTL,
579 GFC_ISYM_SHIFTR,
580 GFC_ISYM_BACKTRACE,
581 GFC_ISYM_SIGN,
582 GFC_ISYM_SIGNAL,
583 GFC_ISYM_SI_KIND,
584 GFC_ISYM_SIN,
585 GFC_ISYM_SINH,
586 GFC_ISYM_SIZE,
587 GFC_ISYM_SLEEP,
588 GFC_ISYM_SIZEOF,
589 GFC_ISYM_SPACING,
590 GFC_ISYM_SPREAD,
591 GFC_ISYM_SQRT,
592 GFC_ISYM_SRAND,
593 GFC_ISYM_SR_KIND,
594 GFC_ISYM_STAT,
595 GFC_ISYM_STOPPED_IMAGES,
596 GFC_ISYM_STORAGE_SIZE,
597 GFC_ISYM_STRIDE,
598 GFC_ISYM_SUM,
599 GFC_ISYM_SYMLINK,
600 GFC_ISYM_SYMLNK,
601 GFC_ISYM_SYSTEM,
602 GFC_ISYM_SYSTEM_CLOCK,
603 GFC_ISYM_TAN,
604 GFC_ISYM_TANH,
605 GFC_ISYM_TEAM_NUMBER,
606 GFC_ISYM_THIS_IMAGE,
607 GFC_ISYM_TIME,
608 GFC_ISYM_TIME8,
609 GFC_ISYM_TINY,
610 GFC_ISYM_TRAILZ,
611 GFC_ISYM_TRANSFER,
612 GFC_ISYM_TRANSPOSE,
613 GFC_ISYM_TRIM,
614 GFC_ISYM_TTYNAM,
615 GFC_ISYM_UBOUND,
616 GFC_ISYM_UCOBOUND,
617 GFC_ISYM_UMASK,
618 GFC_ISYM_UNLINK,
619 GFC_ISYM_UNPACK,
620 GFC_ISYM_VERIFY,
621 GFC_ISYM_XOR,
622 GFC_ISYM_Y0,
623 GFC_ISYM_Y1,
624 GFC_ISYM_YN,
625 GFC_ISYM_YN2
628 enum init_local_logical
630 GFC_INIT_LOGICAL_OFF = 0,
631 GFC_INIT_LOGICAL_FALSE,
632 GFC_INIT_LOGICAL_TRUE
635 enum init_local_character
637 GFC_INIT_CHARACTER_OFF = 0,
638 GFC_INIT_CHARACTER_ON
641 enum init_local_integer
643 GFC_INIT_INTEGER_OFF = 0,
644 GFC_INIT_INTEGER_ON
647 enum gfc_reverse
649 GFC_ENABLE_REVERSE,
650 GFC_FORWARD_SET,
651 GFC_REVERSE_SET,
652 GFC_INHIBIT_REVERSE
655 enum gfc_param_spec_type
657 SPEC_EXPLICIT,
658 SPEC_ASSUMED,
659 SPEC_DEFERRED
662 /************************* Structures *****************************/
664 /* Used for keeping things in balanced binary trees. */
665 #define BBT_HEADER(self) int priority; struct self *left, *right
667 #define NAMED_INTCST(a,b,c,d) a,
668 #define NAMED_KINDARRAY(a,b,c,d) a,
669 #define NAMED_FUNCTION(a,b,c,d) a,
670 #define NAMED_SUBROUTINE(a,b,c,d) a,
671 #define NAMED_DERIVED_TYPE(a,b,c,d) a,
672 enum iso_fortran_env_symbol
674 ISOFORTRANENV_INVALID = -1,
675 #include "iso-fortran-env.def"
676 ISOFORTRANENV_LAST, ISOFORTRANENV_NUMBER = ISOFORTRANENV_LAST
678 #undef NAMED_INTCST
679 #undef NAMED_KINDARRAY
680 #undef NAMED_FUNCTION
681 #undef NAMED_SUBROUTINE
682 #undef NAMED_DERIVED_TYPE
684 #define NAMED_INTCST(a,b,c,d) a,
685 #define NAMED_REALCST(a,b,c,d) a,
686 #define NAMED_CMPXCST(a,b,c,d) a,
687 #define NAMED_LOGCST(a,b,c) a,
688 #define NAMED_CHARKNDCST(a,b,c) a,
689 #define NAMED_CHARCST(a,b,c) a,
690 #define DERIVED_TYPE(a,b,c) a,
691 #define NAMED_FUNCTION(a,b,c,d) a,
692 #define NAMED_SUBROUTINE(a,b,c,d) a,
693 enum iso_c_binding_symbol
695 ISOCBINDING_INVALID = -1,
696 #include "iso-c-binding.def"
697 ISOCBINDING_LAST,
698 ISOCBINDING_NUMBER = ISOCBINDING_LAST
700 #undef NAMED_INTCST
701 #undef NAMED_REALCST
702 #undef NAMED_CMPXCST
703 #undef NAMED_LOGCST
704 #undef NAMED_CHARKNDCST
705 #undef NAMED_CHARCST
706 #undef DERIVED_TYPE
707 #undef NAMED_FUNCTION
708 #undef NAMED_SUBROUTINE
710 enum intmod_id
712 INTMOD_NONE = 0, INTMOD_ISO_FORTRAN_ENV, INTMOD_ISO_C_BINDING,
713 INTMOD_IEEE_FEATURES, INTMOD_IEEE_EXCEPTIONS, INTMOD_IEEE_ARITHMETIC
716 typedef struct
718 char name[GFC_MAX_SYMBOL_LEN + 1];
719 int value; /* Used for both integer and character values. */
720 bt f90_type;
722 CInteropKind_t;
724 /* Array of structs, where the structs represent the C interop kinds.
725 The list will be implemented based on a hash of the kind name since
726 these could be accessed multiple times.
727 Declared in trans-types.c as a global, since it's in that file
728 that the list is initialized. */
729 extern CInteropKind_t c_interop_kinds_table[];
732 /* Structure and list of supported extension attributes. */
733 typedef enum
735 EXT_ATTR_DLLIMPORT = 0,
736 EXT_ATTR_DLLEXPORT,
737 EXT_ATTR_STDCALL,
738 EXT_ATTR_CDECL,
739 EXT_ATTR_FASTCALL,
740 EXT_ATTR_NO_ARG_CHECK,
741 EXT_ATTR_LAST, EXT_ATTR_NUM = EXT_ATTR_LAST
743 ext_attr_id_t;
745 typedef struct
747 const char *name;
748 unsigned id;
749 const char *middle_end_name;
751 ext_attr_t;
753 extern const ext_attr_t ext_attr_list[];
755 /* Symbol attribute structure. */
756 typedef struct
758 /* Variable attributes. */
759 unsigned allocatable:1, dimension:1, codimension:1, external:1, intrinsic:1,
760 optional:1, pointer:1, target:1, value:1, volatile_:1, temporary:1,
761 dummy:1, result:1, assign:1, threadprivate:1, not_always_present:1,
762 implied_index:1, subref_array_pointer:1, proc_pointer:1, asynchronous:1,
763 contiguous:1, fe_temp: 1, automatic: 1;
765 /* For CLASS containers, the pointer attribute is sometimes set internally
766 even though it was not directly specified. In this case, keep the
767 "real" (original) value here. */
768 unsigned class_pointer:1;
770 ENUM_BITFIELD (save_state) save:2;
772 unsigned data:1, /* Symbol is named in a DATA statement. */
773 is_protected:1, /* Symbol has been marked as protected. */
774 use_assoc:1, /* Symbol has been use-associated. */
775 used_in_submodule:1, /* Symbol has been use-associated in a
776 submodule. Needed since these entities must
777 be set host associated to be compliant. */
778 use_only:1, /* Symbol has been use-associated, with ONLY. */
779 use_rename:1, /* Symbol has been use-associated and renamed. */
780 imported:1, /* Symbol has been associated by IMPORT. */
781 host_assoc:1; /* Symbol has been host associated. */
783 unsigned in_namelist:1, in_common:1, in_equivalence:1;
784 unsigned function:1, subroutine:1, procedure:1;
785 unsigned generic:1, generic_copy:1;
786 unsigned implicit_type:1; /* Type defined via implicit rules. */
787 unsigned untyped:1; /* No implicit type could be found. */
789 unsigned is_bind_c:1; /* say if is bound to C. */
790 unsigned extension:8; /* extension level of a derived type. */
791 unsigned is_class:1; /* is a CLASS container. */
792 unsigned class_ok:1; /* is a CLASS object with correct attributes. */
793 unsigned vtab:1; /* is a derived type vtab, pointed to by CLASS objects. */
794 unsigned vtype:1; /* is a derived type of a vtab. */
796 /* These flags are both in the typespec and attribute. The attribute
797 list is what gets read from/written to a module file. The typespec
798 is created from a decl being processed. */
799 unsigned is_c_interop:1; /* It's c interoperable. */
800 unsigned is_iso_c:1; /* Symbol is from iso_c_binding. */
802 /* Function/subroutine attributes */
803 unsigned sequence:1, elemental:1, pure:1, recursive:1;
804 unsigned unmaskable:1, masked:1, contained:1, mod_proc:1, abstract:1;
806 /* Set if this is a module function or subroutine. Note that it is an
807 attribute because it appears as a prefix in the declaration like
808 PURE, etc.. */
809 unsigned module_procedure:1;
811 /* Set if a (public) symbol [e.g. generic name] exposes this symbol,
812 which is relevant for private module procedures. */
813 unsigned public_used:1;
815 /* This is set if a contained procedure could be declared pure. This is
816 used for certain optimizations that require the result or arguments
817 cannot alias. Note that this is zero for PURE procedures. */
818 unsigned implicit_pure:1;
820 /* This is set for a procedure that contains expressions referencing
821 arrays coming from outside its namespace.
822 This is used to force the creation of a temporary when the LHS of
823 an array assignment may be used by an elemental procedure appearing
824 on the RHS. */
825 unsigned array_outer_dependency:1;
827 /* This is set if the subroutine doesn't return. Currently, this
828 is only possible for intrinsic subroutines. */
829 unsigned noreturn:1;
831 /* Set if this procedure is an alternate entry point. These procedures
832 don't have any code associated, and the backend will turn them into
833 thunks to the master function. */
834 unsigned entry:1;
836 /* Set if this is the master function for a procedure with multiple
837 entry points. */
838 unsigned entry_master:1;
840 /* Set if this is the master function for a function with multiple
841 entry points where characteristics of the entry points differ. */
842 unsigned mixed_entry_master:1;
844 /* Set if a function must always be referenced by an explicit interface. */
845 unsigned always_explicit:1;
847 /* Set if the symbol is generated and, hence, standard violations
848 shouldn't be flaged. */
849 unsigned artificial:1;
851 /* Set if the symbol has been referenced in an expression. No further
852 modification of type or type parameters is permitted. */
853 unsigned referenced:1;
855 /* Set if this is the symbol for the main program. */
856 unsigned is_main_program:1;
858 /* Mutually exclusive multibit attributes. */
859 ENUM_BITFIELD (gfc_access) access:2;
860 ENUM_BITFIELD (sym_intent) intent:2;
861 ENUM_BITFIELD (sym_flavor) flavor:4;
862 ENUM_BITFIELD (ifsrc) if_source:2;
864 ENUM_BITFIELD (procedure_type) proc:3;
866 /* Special attributes for Cray pointers, pointees. */
867 unsigned cray_pointer:1, cray_pointee:1;
869 /* The symbol is a derived type with allocatable components, pointer
870 components or private components, procedure pointer components,
871 possibly nested. zero_comp is true if the derived type has no
872 component at all. defined_assign_comp is true if the derived
873 type or a (sub-)component has a typebound defined assignment.
874 unlimited_polymorphic flags the type of the container for these
875 entities. */
876 unsigned alloc_comp:1, pointer_comp:1, proc_pointer_comp:1,
877 private_comp:1, zero_comp:1, coarray_comp:1, lock_comp:1,
878 event_comp:1, defined_assign_comp:1, unlimited_polymorphic:1,
879 has_dtio_procs:1, caf_token:1;
881 /* This is a temporary selector for SELECT TYPE or an associate
882 variable for SELECT_TYPE or ASSOCIATE. */
883 unsigned select_type_temporary:1, associate_var:1;
885 /* These are the attributes required for parameterized derived
886 types. */
887 unsigned pdt_kind:1, pdt_len:1, pdt_type:1, pdt_template:1,
888 pdt_array:1, pdt_string:1;
890 /* This is omp_{out,in,priv,orig} artificial variable in
891 !$OMP DECLARE REDUCTION. */
892 unsigned omp_udr_artificial_var:1;
894 /* Mentioned in OMP DECLARE TARGET. */
895 unsigned omp_declare_target:1;
896 unsigned omp_declare_target_link:1;
898 /* Mentioned in OACC DECLARE. */
899 unsigned oacc_declare_create:1;
900 unsigned oacc_declare_copyin:1;
901 unsigned oacc_declare_deviceptr:1;
902 unsigned oacc_declare_device_resident:1;
903 unsigned oacc_declare_link:1;
905 /* This is an OpenACC acclerator function at level N - 1 */
906 unsigned oacc_function:3;
908 /* Attributes set by compiler extensions (!GCC$ ATTRIBUTES). */
909 unsigned ext_attr:EXT_ATTR_NUM;
911 /* The namespace where the attribute has been set. */
912 struct gfc_namespace *volatile_ns, *asynchronous_ns;
914 symbol_attribute;
917 /* We need to store source lines as sequences of multibyte source
918 characters. We define here a type wide enough to hold any multibyte
919 source character, just like libcpp does. A 32-bit type is enough. */
921 #if HOST_BITS_PER_INT >= 32
922 typedef unsigned int gfc_char_t;
923 #elif HOST_BITS_PER_LONG >= 32
924 typedef unsigned long gfc_char_t;
925 #elif defined(HAVE_LONG_LONG) && (HOST_BITS_PER_LONGLONG >= 32)
926 typedef unsigned long long gfc_char_t;
927 #else
928 # error "Cannot find an integer type with at least 32 bits"
929 #endif
932 /* The following three structures are used to identify a location in
933 the sources.
935 gfc_file is used to maintain a tree of the source files and how
936 they include each other
938 gfc_linebuf holds a single line of source code and information
939 which file it resides in
941 locus point to the sourceline and the character in the source
942 line.
945 typedef struct gfc_file
947 struct gfc_file *next, *up;
948 int inclusion_line, line;
949 char *filename;
950 } gfc_file;
952 typedef struct gfc_linebuf
954 source_location location;
955 struct gfc_file *file;
956 struct gfc_linebuf *next;
958 int truncated;
959 bool dbg_emitted;
961 gfc_char_t line[1];
962 } gfc_linebuf;
964 #define gfc_linebuf_header_size (offsetof (gfc_linebuf, line))
966 #define gfc_linebuf_linenum(LBUF) (LOCATION_LINE ((LBUF)->location))
968 typedef struct
970 gfc_char_t *nextc;
971 gfc_linebuf *lb;
972 } locus;
974 /* In order for the "gfc" format checking to work correctly, you must
975 have declared a typedef locus first. */
976 #if GCC_VERSION >= 4001
977 #define ATTRIBUTE_GCC_GFC(m, n) __attribute__ ((__format__ (__gcc_gfc__, m, n))) ATTRIBUTE_NONNULL(m)
978 #else
979 #define ATTRIBUTE_GCC_GFC(m, n) ATTRIBUTE_NONNULL(m)
980 #endif
983 /* Suppress error messages or re-enable them. */
985 void gfc_push_suppress_errors (void);
986 void gfc_pop_suppress_errors (void);
989 /* Character length structures hold the expression that gives the
990 length of a character variable. We avoid putting these into
991 gfc_typespec because doing so prevents us from doing structure
992 copies and forces us to deallocate any typespecs we create, as well
993 as structures that contain typespecs. They also can have multiple
994 character typespecs pointing to them.
996 These structures form a singly linked list within the current
997 namespace and are deallocated with the namespace. It is possible to
998 end up with gfc_charlen structures that have nothing pointing to them. */
1000 typedef struct gfc_charlen
1002 struct gfc_expr *length;
1003 struct gfc_charlen *next;
1004 bool length_from_typespec; /* Length from explicit array ctor typespec? */
1005 tree backend_decl;
1006 tree passed_length; /* Length argument explicitly passed. */
1008 int resolved;
1010 gfc_charlen;
1012 #define gfc_get_charlen() XCNEW (gfc_charlen)
1014 /* Type specification structure. */
1015 typedef struct
1017 bt type;
1018 int kind;
1020 union
1022 struct gfc_symbol *derived; /* For derived types only. */
1023 gfc_charlen *cl; /* For character types only. */
1024 int pad; /* For hollerith types only. */
1028 struct gfc_symbol *interface; /* For PROCEDURE declarations. */
1029 int is_c_interop;
1030 int is_iso_c;
1031 bt f90_type;
1032 bool deferred;
1033 gfc_symbol *interop_kind;
1035 gfc_typespec;
1037 /* Array specification. */
1038 typedef struct
1040 int rank; /* A scalar has a rank of 0, an assumed-rank array has -1. */
1041 int corank;
1042 array_type type, cotype;
1043 struct gfc_expr *lower[GFC_MAX_DIMENSIONS], *upper[GFC_MAX_DIMENSIONS];
1045 /* These two fields are used with the Cray Pointer extension. */
1046 bool cray_pointee; /* True iff this spec belongs to a cray pointee. */
1047 bool cp_was_assumed; /* AS_ASSUMED_SIZE cp arrays are converted to
1048 AS_EXPLICIT, but we want to remember that we
1049 did this. */
1051 bool resolved;
1053 gfc_array_spec;
1055 #define gfc_get_array_spec() XCNEW (gfc_array_spec)
1058 /* Components of derived types. */
1059 typedef struct gfc_component
1061 const char *name;
1062 gfc_typespec ts;
1064 symbol_attribute attr;
1065 gfc_array_spec *as;
1067 tree backend_decl;
1068 /* Used to cache a FIELD_DECL matching this same component
1069 but applied to a different backend containing type that was
1070 generated by gfc_nonrestricted_type. */
1071 tree norestrict_decl;
1072 locus loc;
1073 struct gfc_expr *initializer;
1074 /* Used in parameterized derived type declarations to store parameterized
1075 kind expressions. */
1076 struct gfc_expr *kind_expr;
1077 struct gfc_actual_arglist *param_list;
1079 struct gfc_component *next;
1081 /* Needed for procedure pointer components. */
1082 struct gfc_typebound_proc *tb;
1083 /* When allocatable/pointer and in a coarray the associated token. */
1084 tree caf_token;
1086 gfc_component;
1088 #define gfc_get_component() XCNEW (gfc_component)
1090 /* Formal argument lists are lists of symbols. */
1091 typedef struct gfc_formal_arglist
1093 /* Symbol representing the argument at this position in the arglist. */
1094 struct gfc_symbol *sym;
1095 /* Points to the next formal argument. */
1096 struct gfc_formal_arglist *next;
1098 gfc_formal_arglist;
1100 #define gfc_get_formal_arglist() XCNEW (gfc_formal_arglist)
1103 /* The gfc_actual_arglist structure is for actual arguments and
1104 for type parameter specification lists. */
1105 typedef struct gfc_actual_arglist
1107 const char *name;
1108 /* Alternate return label when the expr member is null. */
1109 struct gfc_st_label *label;
1111 /* This is set to the type of an eventual omitted optional
1112 argument. This is used to determine if a hidden string length
1113 argument has to be added to a function call. */
1114 bt missing_arg_type;
1116 gfc_param_spec_type spec_type;
1118 struct gfc_expr *expr;
1119 struct gfc_actual_arglist *next;
1121 gfc_actual_arglist;
1123 #define gfc_get_actual_arglist() XCNEW (gfc_actual_arglist)
1126 /* Because a symbol can belong to multiple namelists, they must be
1127 linked externally to the symbol itself. */
1128 typedef struct gfc_namelist
1130 struct gfc_symbol *sym;
1131 struct gfc_namelist *next;
1133 gfc_namelist;
1135 #define gfc_get_namelist() XCNEW (gfc_namelist)
1137 /* Likewise to gfc_namelist, but contains expressions. */
1138 typedef struct gfc_expr_list
1140 struct gfc_expr *expr;
1141 struct gfc_expr_list *next;
1143 gfc_expr_list;
1145 #define gfc_get_expr_list() XCNEW (gfc_expr_list)
1147 enum gfc_omp_reduction_op
1149 OMP_REDUCTION_NONE = -1,
1150 OMP_REDUCTION_PLUS = INTRINSIC_PLUS,
1151 OMP_REDUCTION_MINUS = INTRINSIC_MINUS,
1152 OMP_REDUCTION_TIMES = INTRINSIC_TIMES,
1153 OMP_REDUCTION_AND = INTRINSIC_AND,
1154 OMP_REDUCTION_OR = INTRINSIC_OR,
1155 OMP_REDUCTION_EQV = INTRINSIC_EQV,
1156 OMP_REDUCTION_NEQV = INTRINSIC_NEQV,
1157 OMP_REDUCTION_MAX = GFC_INTRINSIC_END,
1158 OMP_REDUCTION_MIN,
1159 OMP_REDUCTION_IAND,
1160 OMP_REDUCTION_IOR,
1161 OMP_REDUCTION_IEOR,
1162 OMP_REDUCTION_USER
1165 enum gfc_omp_depend_op
1167 OMP_DEPEND_IN,
1168 OMP_DEPEND_OUT,
1169 OMP_DEPEND_INOUT,
1170 OMP_DEPEND_SINK_FIRST,
1171 OMP_DEPEND_SINK
1174 enum gfc_omp_map_op
1176 OMP_MAP_ALLOC,
1177 OMP_MAP_TO,
1178 OMP_MAP_FROM,
1179 OMP_MAP_TOFROM,
1180 OMP_MAP_DELETE,
1181 OMP_MAP_FORCE_ALLOC,
1182 OMP_MAP_FORCE_TO,
1183 OMP_MAP_FORCE_FROM,
1184 OMP_MAP_FORCE_TOFROM,
1185 OMP_MAP_FORCE_PRESENT,
1186 OMP_MAP_FORCE_DEVICEPTR,
1187 OMP_MAP_DEVICE_RESIDENT,
1188 OMP_MAP_LINK,
1189 OMP_MAP_RELEASE,
1190 OMP_MAP_ALWAYS_TO,
1191 OMP_MAP_ALWAYS_FROM,
1192 OMP_MAP_ALWAYS_TOFROM
1195 enum gfc_omp_linear_op
1197 OMP_LINEAR_DEFAULT,
1198 OMP_LINEAR_REF,
1199 OMP_LINEAR_VAL,
1200 OMP_LINEAR_UVAL
1203 /* For use in OpenMP clauses in case we need extra information
1204 (aligned clause alignment, linear clause step, etc.). */
1206 typedef struct gfc_omp_namelist
1208 struct gfc_symbol *sym;
1209 struct gfc_expr *expr;
1210 union
1212 gfc_omp_reduction_op reduction_op;
1213 gfc_omp_depend_op depend_op;
1214 gfc_omp_map_op map_op;
1215 gfc_omp_linear_op linear_op;
1216 struct gfc_common_head *common;
1217 } u;
1218 struct gfc_omp_namelist_udr *udr;
1219 struct gfc_omp_namelist *next;
1220 locus where;
1222 gfc_omp_namelist;
1224 #define gfc_get_omp_namelist() XCNEW (gfc_omp_namelist)
1226 enum
1228 OMP_LIST_FIRST,
1229 OMP_LIST_PRIVATE = OMP_LIST_FIRST,
1230 OMP_LIST_FIRSTPRIVATE,
1231 OMP_LIST_LASTPRIVATE,
1232 OMP_LIST_COPYPRIVATE,
1233 OMP_LIST_SHARED,
1234 OMP_LIST_COPYIN,
1235 OMP_LIST_UNIFORM,
1236 OMP_LIST_ALIGNED,
1237 OMP_LIST_LINEAR,
1238 OMP_LIST_DEPEND,
1239 OMP_LIST_MAP,
1240 OMP_LIST_TO,
1241 OMP_LIST_FROM,
1242 OMP_LIST_REDUCTION,
1243 OMP_LIST_DEVICE_RESIDENT,
1244 OMP_LIST_LINK,
1245 OMP_LIST_USE_DEVICE,
1246 OMP_LIST_CACHE,
1247 OMP_LIST_IS_DEVICE_PTR,
1248 OMP_LIST_USE_DEVICE_PTR,
1249 OMP_LIST_NUM
1252 /* Because a symbol can belong to multiple namelists, they must be
1253 linked externally to the symbol itself. */
1255 enum gfc_omp_sched_kind
1257 OMP_SCHED_NONE,
1258 OMP_SCHED_STATIC,
1259 OMP_SCHED_DYNAMIC,
1260 OMP_SCHED_GUIDED,
1261 OMP_SCHED_RUNTIME,
1262 OMP_SCHED_AUTO
1265 enum gfc_omp_default_sharing
1267 OMP_DEFAULT_UNKNOWN,
1268 OMP_DEFAULT_NONE,
1269 OMP_DEFAULT_PRIVATE,
1270 OMP_DEFAULT_SHARED,
1271 OMP_DEFAULT_FIRSTPRIVATE,
1272 OMP_DEFAULT_PRESENT
1275 enum gfc_omp_proc_bind_kind
1277 OMP_PROC_BIND_UNKNOWN,
1278 OMP_PROC_BIND_MASTER,
1279 OMP_PROC_BIND_SPREAD,
1280 OMP_PROC_BIND_CLOSE
1283 enum gfc_omp_cancel_kind
1285 OMP_CANCEL_UNKNOWN,
1286 OMP_CANCEL_PARALLEL,
1287 OMP_CANCEL_SECTIONS,
1288 OMP_CANCEL_DO,
1289 OMP_CANCEL_TASKGROUP
1292 enum gfc_omp_if_kind
1294 OMP_IF_PARALLEL,
1295 OMP_IF_TASK,
1296 OMP_IF_TASKLOOP,
1297 OMP_IF_TARGET,
1298 OMP_IF_TARGET_DATA,
1299 OMP_IF_TARGET_UPDATE,
1300 OMP_IF_TARGET_ENTER_DATA,
1301 OMP_IF_TARGET_EXIT_DATA,
1302 OMP_IF_LAST
1305 typedef struct gfc_omp_clauses
1307 struct gfc_expr *if_expr;
1308 struct gfc_expr *final_expr;
1309 struct gfc_expr *num_threads;
1310 gfc_omp_namelist *lists[OMP_LIST_NUM];
1311 enum gfc_omp_sched_kind sched_kind;
1312 struct gfc_expr *chunk_size;
1313 enum gfc_omp_default_sharing default_sharing;
1314 int collapse, orderedc;
1315 bool nowait, ordered, untied, mergeable;
1316 bool inbranch, notinbranch, defaultmap, nogroup;
1317 bool sched_simd, sched_monotonic, sched_nonmonotonic;
1318 bool simd, threads, depend_source;
1319 enum gfc_omp_cancel_kind cancel;
1320 enum gfc_omp_proc_bind_kind proc_bind;
1321 struct gfc_expr *safelen_expr;
1322 struct gfc_expr *simdlen_expr;
1323 struct gfc_expr *num_teams;
1324 struct gfc_expr *device;
1325 struct gfc_expr *thread_limit;
1326 struct gfc_expr *grainsize;
1327 struct gfc_expr *hint;
1328 struct gfc_expr *num_tasks;
1329 struct gfc_expr *priority;
1330 struct gfc_expr *if_exprs[OMP_IF_LAST];
1331 enum gfc_omp_sched_kind dist_sched_kind;
1332 struct gfc_expr *dist_chunk_size;
1333 const char *critical_name;
1335 /* OpenACC. */
1336 struct gfc_expr *async_expr;
1337 struct gfc_expr *gang_static_expr;
1338 struct gfc_expr *gang_num_expr;
1339 struct gfc_expr *worker_expr;
1340 struct gfc_expr *vector_expr;
1341 struct gfc_expr *num_gangs_expr;
1342 struct gfc_expr *num_workers_expr;
1343 struct gfc_expr *vector_length_expr;
1344 gfc_expr_list *wait_list;
1345 gfc_expr_list *tile_list;
1346 unsigned async:1, gang:1, worker:1, vector:1, seq:1, independent:1;
1347 unsigned wait:1, par_auto:1, gang_static:1;
1348 unsigned if_present:1, finalize:1;
1349 locus loc;
1352 gfc_omp_clauses;
1354 #define gfc_get_omp_clauses() XCNEW (gfc_omp_clauses)
1357 /* Node in the linked list used for storing !$oacc declare constructs. */
1359 typedef struct gfc_oacc_declare
1361 struct gfc_oacc_declare *next;
1362 bool module_var;
1363 gfc_omp_clauses *clauses;
1364 locus loc;
1366 gfc_oacc_declare;
1368 #define gfc_get_oacc_declare() XCNEW (gfc_oacc_declare)
1371 /* Node in the linked list used for storing !$omp declare simd constructs. */
1373 typedef struct gfc_omp_declare_simd
1375 struct gfc_omp_declare_simd *next;
1376 locus where; /* Where the !$omp declare simd construct occurred. */
1378 gfc_symbol *proc_name;
1380 gfc_omp_clauses *clauses;
1382 gfc_omp_declare_simd;
1383 #define gfc_get_omp_declare_simd() XCNEW (gfc_omp_declare_simd)
1385 typedef struct gfc_omp_udr
1387 struct gfc_omp_udr *next;
1388 locus where; /* Where the !$omp declare reduction construct occurred. */
1390 const char *name;
1391 gfc_typespec ts;
1392 gfc_omp_reduction_op rop;
1394 struct gfc_symbol *omp_out;
1395 struct gfc_symbol *omp_in;
1396 struct gfc_namespace *combiner_ns;
1398 struct gfc_symbol *omp_priv;
1399 struct gfc_symbol *omp_orig;
1400 struct gfc_namespace *initializer_ns;
1402 gfc_omp_udr;
1403 #define gfc_get_omp_udr() XCNEW (gfc_omp_udr)
1405 typedef struct gfc_omp_namelist_udr
1407 struct gfc_omp_udr *udr;
1408 struct gfc_code *combiner;
1409 struct gfc_code *initializer;
1411 gfc_omp_namelist_udr;
1412 #define gfc_get_omp_namelist_udr() XCNEW (gfc_omp_namelist_udr)
1414 /* The gfc_st_label structure is a BBT attached to a namespace that
1415 records the usage of statement labels within that space. */
1417 typedef struct gfc_st_label
1419 BBT_HEADER(gfc_st_label);
1421 int value;
1423 gfc_sl_type defined, referenced;
1425 struct gfc_expr *format;
1427 tree backend_decl;
1429 locus where;
1431 gfc_namespace *ns;
1433 gfc_st_label;
1436 /* gfc_interface()-- Interfaces are lists of symbols strung together. */
1437 typedef struct gfc_interface
1439 struct gfc_symbol *sym;
1440 locus where;
1441 struct gfc_interface *next;
1443 gfc_interface;
1445 #define gfc_get_interface() XCNEW (gfc_interface)
1447 /* User operator nodes. These are like stripped down symbols. */
1448 typedef struct
1450 const char *name;
1452 gfc_interface *op;
1453 struct gfc_namespace *ns;
1454 gfc_access access;
1456 gfc_user_op;
1459 /* A list of specific bindings that are associated with a generic spec. */
1460 typedef struct gfc_tbp_generic
1462 /* The parser sets specific_st, upon resolution we look for the corresponding
1463 gfc_typebound_proc and set specific for further use. */
1464 struct gfc_symtree* specific_st;
1465 struct gfc_typebound_proc* specific;
1467 struct gfc_tbp_generic* next;
1468 bool is_operator;
1470 gfc_tbp_generic;
1472 #define gfc_get_tbp_generic() XCNEW (gfc_tbp_generic)
1475 /* Data needed for type-bound procedures. */
1476 typedef struct gfc_typebound_proc
1478 locus where; /* Where the PROCEDURE/GENERIC definition was. */
1480 union
1482 struct gfc_symtree* specific; /* The interface if DEFERRED. */
1483 gfc_tbp_generic* generic;
1487 gfc_access access;
1488 const char* pass_arg; /* Argument-name for PASS. NULL if not specified. */
1490 /* The overridden type-bound proc (or GENERIC with this name in the
1491 parent-type) or NULL if non. */
1492 struct gfc_typebound_proc* overridden;
1494 /* Once resolved, we use the position of pass_arg in the formal arglist of
1495 the binding-target procedure to identify it. The first argument has
1496 number 1 here, the second 2, and so on. */
1497 unsigned pass_arg_num;
1499 unsigned nopass:1; /* Whether we have NOPASS (PASS otherwise). */
1500 unsigned non_overridable:1;
1501 unsigned deferred:1;
1502 unsigned is_generic:1;
1503 unsigned function:1, subroutine:1;
1504 unsigned error:1; /* Ignore it, when an error occurred during resolution. */
1505 unsigned ppc:1;
1507 gfc_typebound_proc;
1510 /* Symbol nodes. These are important things. They are what the
1511 standard refers to as "entities". The possibly multiple names that
1512 refer to the same entity are accomplished by a binary tree of
1513 symtree structures that is balanced by the red-black method-- more
1514 than one symtree node can point to any given symbol. */
1516 typedef struct gfc_symbol
1518 const char *name; /* Primary name, before renaming */
1519 const char *module; /* Module this symbol came from */
1520 locus declared_at;
1522 gfc_typespec ts;
1523 symbol_attribute attr;
1525 /* The formal member points to the formal argument list if the
1526 symbol is a function or subroutine name. If the symbol is a
1527 generic name, the generic member points to the list of
1528 interfaces. */
1530 gfc_interface *generic;
1531 gfc_access component_access;
1533 gfc_formal_arglist *formal;
1534 struct gfc_namespace *formal_ns;
1535 struct gfc_namespace *f2k_derived;
1537 /* List of PDT parameter expressions */
1538 struct gfc_actual_arglist *param_list;
1540 struct gfc_expr *value; /* Parameter/Initializer value */
1541 gfc_array_spec *as;
1542 struct gfc_symbol *result; /* function result symbol */
1543 gfc_component *components; /* Derived type components */
1545 /* Defined only for Cray pointees; points to their pointer. */
1546 struct gfc_symbol *cp_pointer;
1548 int entry_id; /* Used in resolve.c for entries. */
1550 /* CLASS hashed name for declared and dynamic types in the class. */
1551 int hash_value;
1553 struct gfc_symbol *common_next; /* Links for COMMON syms */
1555 /* This is only used for pointer comparisons to check if symbols
1556 are in the same common block.
1557 In opposition to common_block, the common_head pointer takes into account
1558 equivalences: if A is in a common block C and A and B are in equivalence,
1559 then both A and B have common_head pointing to C, while A's common_block
1560 points to C and B's is NULL. */
1561 struct gfc_common_head* common_head;
1563 /* Make sure setup code for dummy arguments is generated in the correct
1564 order. */
1565 int dummy_order;
1567 gfc_namelist *namelist, *namelist_tail;
1569 /* Change management fields. Symbols that might be modified by the
1570 current statement have the mark member nonzero. Of these symbols,
1571 symbols with old_symbol equal to NULL are symbols created within
1572 the current statement. Otherwise, old_symbol points to a copy of
1573 the old symbol. gfc_new is used in symbol.c to flag new symbols. */
1574 struct gfc_symbol *old_symbol;
1575 unsigned mark:1, gfc_new:1;
1577 /* The tlink field is used in the front end to carry the module
1578 declaration of separate module procedures so that the characteristics
1579 can be compared with the corresponding declaration in a submodule. In
1580 translation this field carries a linked list of symbols that require
1581 deferred initialization. */
1582 struct gfc_symbol *tlink;
1584 /* Nonzero if all equivalences associated with this symbol have been
1585 processed. */
1586 unsigned equiv_built:1;
1587 /* Set if this variable is used as an index name in a FORALL. */
1588 unsigned forall_index:1;
1589 /* Set if the symbol is used in a function result specification . */
1590 unsigned fn_result_spec:1;
1591 /* Used to avoid multiple resolutions of a single symbol. */
1592 unsigned resolved:1;
1593 /* Set if this is a module function or subroutine with the
1594 abreviated declaration in a submodule. */
1595 unsigned abr_modproc_decl:1;
1597 int refs;
1598 struct gfc_namespace *ns; /* namespace containing this symbol */
1600 tree backend_decl;
1602 /* Identity of the intrinsic module the symbol comes from, or
1603 INTMOD_NONE if it's not imported from a intrinsic module. */
1604 intmod_id from_intmod;
1605 /* Identity of the symbol from intrinsic modules, from enums maintained
1606 separately by each intrinsic module. Used together with from_intmod,
1607 it uniquely identifies a symbol from an intrinsic module. */
1608 int intmod_sym_id;
1610 /* This may be repetitive, since the typespec now has a binding
1611 label field. */
1612 const char* binding_label;
1613 /* Store a reference to the common_block, if this symbol is in one. */
1614 struct gfc_common_head *common_block;
1616 /* Link to corresponding association-list if this is an associate name. */
1617 struct gfc_association_list *assoc;
1619 /* Link to next entry in derived type list */
1620 struct gfc_symbol *dt_next;
1622 gfc_symbol;
1625 struct gfc_undo_change_set
1627 vec<gfc_symbol *> syms;
1628 vec<gfc_typebound_proc *> tbps;
1629 gfc_undo_change_set *previous;
1633 /* This structure is used to keep track of symbols in common blocks. */
1634 typedef struct gfc_common_head
1636 locus where;
1637 char use_assoc, saved, threadprivate;
1638 unsigned char omp_declare_target : 1;
1639 unsigned char omp_declare_target_link : 1;
1640 char name[GFC_MAX_SYMBOL_LEN + 1];
1641 struct gfc_symbol *head;
1642 const char* binding_label;
1643 int is_bind_c;
1644 int refs;
1646 gfc_common_head;
1648 #define gfc_get_common_head() XCNEW (gfc_common_head)
1651 /* A list of all the alternate entry points for a procedure. */
1653 typedef struct gfc_entry_list
1655 /* The symbol for this entry point. */
1656 gfc_symbol *sym;
1657 /* The zero-based id of this entry point. */
1658 int id;
1659 /* The LABEL_EXPR marking this entry point. */
1660 tree label;
1661 /* The next item in the list. */
1662 struct gfc_entry_list *next;
1664 gfc_entry_list;
1666 #define gfc_get_entry_list() XCNEW (gfc_entry_list)
1668 /* Lists of rename info for the USE statement. */
1670 typedef struct gfc_use_rename
1672 char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
1673 struct gfc_use_rename *next;
1674 int found;
1675 gfc_intrinsic_op op;
1676 locus where;
1678 gfc_use_rename;
1680 #define gfc_get_use_rename() XCNEW (gfc_use_rename);
1682 /* A list of all USE statements in a namespace. */
1684 typedef struct gfc_use_list
1686 const char *module_name;
1687 const char *submodule_name;
1688 bool intrinsic;
1689 bool non_intrinsic;
1690 bool only_flag;
1691 struct gfc_use_rename *rename;
1692 locus where;
1693 /* Next USE statement. */
1694 struct gfc_use_list *next;
1696 gfc_use_list;
1698 #define gfc_get_use_list() XCNEW (gfc_use_list)
1700 /* Within a namespace, symbols are pointed to by symtree nodes that
1701 are linked together in a balanced binary tree. There can be
1702 several symtrees pointing to the same symbol node via USE
1703 statements. */
1705 typedef struct gfc_symtree
1707 BBT_HEADER (gfc_symtree);
1708 const char *name;
1709 int ambiguous;
1710 union
1712 gfc_symbol *sym; /* Symbol associated with this node */
1713 gfc_user_op *uop;
1714 gfc_common_head *common;
1715 gfc_typebound_proc *tb;
1716 gfc_omp_udr *omp_udr;
1720 gfc_symtree;
1722 /* A list of all derived types. */
1723 extern gfc_symbol *gfc_derived_types;
1725 typedef struct gfc_oacc_routine_name
1727 struct gfc_symbol *sym;
1728 struct gfc_omp_clauses *clauses;
1729 struct gfc_oacc_routine_name *next;
1731 gfc_oacc_routine_name;
1733 #define gfc_get_oacc_routine_name() XCNEW (gfc_oacc_routine_name)
1735 /* A namespace describes the contents of procedure, module, interface block
1736 or BLOCK construct. */
1737 /* ??? Anything else use these? */
1739 typedef struct gfc_namespace
1741 /* Tree containing all the symbols in this namespace. */
1742 gfc_symtree *sym_root;
1743 /* Tree containing all the user-defined operators in the namespace. */
1744 gfc_symtree *uop_root;
1745 /* Tree containing all the common blocks. */
1746 gfc_symtree *common_root;
1747 /* Tree containing all the OpenMP user defined reductions. */
1748 gfc_symtree *omp_udr_root;
1750 /* Tree containing type-bound procedures. */
1751 gfc_symtree *tb_sym_root;
1752 /* Type-bound user operators. */
1753 gfc_symtree *tb_uop_root;
1754 /* For derived-types, store type-bound intrinsic operators here. */
1755 gfc_typebound_proc *tb_op[GFC_INTRINSIC_OPS];
1756 /* Linked list of finalizer procedures. */
1757 struct gfc_finalizer *finalizers;
1759 /* If set_flag[letter] is set, an implicit type has been set for letter. */
1760 int set_flag[GFC_LETTERS];
1761 /* Keeps track of the implicit types associated with the letters. */
1762 gfc_typespec default_type[GFC_LETTERS];
1763 /* Store the positions of IMPLICIT statements. */
1764 locus implicit_loc[GFC_LETTERS];
1766 /* If this is a namespace of a procedure, this points to the procedure. */
1767 struct gfc_symbol *proc_name;
1768 /* If this is the namespace of a unit which contains executable
1769 code, this points to it. */
1770 struct gfc_code *code;
1772 /* Points to the equivalences set up in this namespace. */
1773 struct gfc_equiv *equiv, *old_equiv;
1775 /* Points to the equivalence groups produced by trans_common. */
1776 struct gfc_equiv_list *equiv_lists;
1778 gfc_interface *op[GFC_INTRINSIC_OPS];
1780 /* Points to the parent namespace, i.e. the namespace of a module or
1781 procedure in which the procedure belonging to this namespace is
1782 contained. The parent namespace points to this namespace either
1783 directly via CONTAINED, or indirectly via the chain built by
1784 SIBLING. */
1785 struct gfc_namespace *parent;
1786 /* CONTAINED points to the first contained namespace. Sibling
1787 namespaces are chained via SIBLING. */
1788 struct gfc_namespace *contained, *sibling;
1790 gfc_common_head blank_common;
1791 gfc_access default_access, operator_access[GFC_INTRINSIC_OPS];
1793 gfc_st_label *st_labels;
1794 /* This list holds information about all the data initializers in
1795 this namespace. */
1796 struct gfc_data *data, *old_data;
1798 /* !$ACC DECLARE. */
1799 gfc_oacc_declare *oacc_declare;
1801 /* !$ACC ROUTINE clauses. */
1802 gfc_omp_clauses *oacc_routine_clauses;
1804 /* !$ACC ROUTINE names. */
1805 gfc_oacc_routine_name *oacc_routine_names;
1807 gfc_charlen *cl_list;
1809 gfc_symbol *derived_types;
1811 int save_all, seen_save, seen_implicit_none;
1813 /* Normally we don't need to refcount namespaces. However when we read
1814 a module containing a function with multiple entry points, this
1815 will appear as several functions with the same formal namespace. */
1816 int refs;
1818 /* A list of all alternate entry points to this procedure (or NULL). */
1819 gfc_entry_list *entries;
1821 /* A list of USE statements in this namespace. */
1822 gfc_use_list *use_stmts;
1824 /* Linked list of !$omp declare simd constructs. */
1825 struct gfc_omp_declare_simd *omp_declare_simd;
1827 /* Set to 1 if namespace is a BLOCK DATA program unit. */
1828 unsigned is_block_data:1;
1830 /* Set to 1 if namespace is an interface body with "IMPORT" used. */
1831 unsigned has_import_set:1;
1833 /* Set to 1 if the namespace uses "IMPLICT NONE (export)". */
1834 unsigned has_implicit_none_export:1;
1836 /* Set to 1 if resolved has been called for this namespace.
1837 Holds -1 during resolution. */
1838 signed resolved:2;
1840 /* Set when resolve_types has been called for this namespace. */
1841 unsigned types_resolved:1;
1843 /* Set to 1 if code has been generated for this namespace. */
1844 unsigned translated:1;
1846 /* Set to 1 if symbols in this namespace should be 'construct entities',
1847 i.e. for BLOCK local variables. */
1848 unsigned construct_entities:1;
1850 /* Set to 1 for !$OMP DECLARE REDUCTION namespaces. */
1851 unsigned omp_udr_ns:1;
1853 /* Set to 1 for !$ACC ROUTINE namespaces. */
1854 unsigned oacc_routine:1;
1856 gfc_namespace;
1858 extern gfc_namespace *gfc_current_ns;
1859 extern gfc_namespace *gfc_global_ns_list;
1861 /* Global symbols are symbols of global scope. Currently we only use
1862 this to detect collisions already when parsing.
1863 TODO: Extend to verify procedure calls. */
1865 enum gfc_symbol_type
1867 GSYM_UNKNOWN=1, GSYM_PROGRAM, GSYM_FUNCTION, GSYM_SUBROUTINE,
1868 GSYM_MODULE, GSYM_COMMON, GSYM_BLOCK_DATA
1871 typedef struct gfc_gsymbol
1873 BBT_HEADER(gfc_gsymbol);
1875 const char *name;
1876 const char *sym_name;
1877 const char *mod_name;
1878 const char *binding_label;
1879 enum gfc_symbol_type type;
1881 int defined, used;
1882 locus where;
1883 gfc_namespace *ns;
1885 gfc_gsymbol;
1887 extern gfc_gsymbol *gfc_gsym_root;
1889 /* Information on interfaces being built. */
1890 typedef struct
1892 interface_type type;
1893 gfc_symbol *sym;
1894 gfc_namespace *ns;
1895 gfc_user_op *uop;
1896 gfc_intrinsic_op op;
1898 gfc_interface_info;
1900 extern gfc_interface_info current_interface;
1903 /* Array reference. */
1905 enum gfc_array_ref_dimen_type
1907 DIMEN_ELEMENT = 1, DIMEN_RANGE, DIMEN_VECTOR, DIMEN_STAR, DIMEN_THIS_IMAGE, DIMEN_UNKNOWN
1910 typedef struct gfc_array_ref
1912 ar_type type;
1913 int dimen; /* # of components in the reference */
1914 int codimen;
1915 bool in_allocate; /* For coarray checks. */
1916 gfc_expr *team;
1917 gfc_expr *stat;
1918 locus where;
1919 gfc_array_spec *as;
1921 locus c_where[GFC_MAX_DIMENSIONS]; /* All expressions can be NULL */
1922 struct gfc_expr *start[GFC_MAX_DIMENSIONS], *end[GFC_MAX_DIMENSIONS],
1923 *stride[GFC_MAX_DIMENSIONS];
1925 enum gfc_array_ref_dimen_type dimen_type[GFC_MAX_DIMENSIONS];
1927 gfc_array_ref;
1929 #define gfc_get_array_ref() XCNEW (gfc_array_ref)
1932 /* Component reference nodes. A variable is stored as an expression
1933 node that points to the base symbol. After that, a singly linked
1934 list of component reference nodes gives the variable's complete
1935 resolution. The array_ref component may be present and comes
1936 before the component component. */
1938 enum ref_type
1939 { REF_ARRAY, REF_COMPONENT, REF_SUBSTRING };
1941 typedef struct gfc_ref
1943 ref_type type;
1945 union
1947 struct gfc_array_ref ar;
1949 struct
1951 gfc_component *component;
1952 gfc_symbol *sym;
1956 struct
1958 struct gfc_expr *start, *end; /* Substring */
1959 gfc_charlen *length;
1966 struct gfc_ref *next;
1968 gfc_ref;
1970 #define gfc_get_ref() XCNEW (gfc_ref)
1973 /* Structures representing intrinsic symbols and their arguments lists. */
1974 typedef struct gfc_intrinsic_arg
1976 char name[GFC_MAX_SYMBOL_LEN + 1];
1978 gfc_typespec ts;
1979 unsigned optional:1, value:1;
1980 ENUM_BITFIELD (sym_intent) intent:2;
1981 gfc_actual_arglist *actual;
1983 struct gfc_intrinsic_arg *next;
1986 gfc_intrinsic_arg;
1989 /* Specifies the various kinds of check functions used to verify the
1990 argument lists of intrinsic functions. fX with X an integer refer
1991 to check functions of intrinsics with X arguments. f1m is used for
1992 the MAX and MIN intrinsics which can have an arbitrary number of
1993 arguments, f4ml is used for the MINLOC and MAXLOC intrinsics as
1994 these have special semantics. */
1996 typedef union
1998 bool (*f0)(void);
1999 bool (*f1)(struct gfc_expr *);
2000 bool (*f1m)(gfc_actual_arglist *);
2001 bool (*f2)(struct gfc_expr *, struct gfc_expr *);
2002 bool (*f3)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
2003 bool (*f5ml)(gfc_actual_arglist *);
2004 bool (*f3red)(gfc_actual_arglist *);
2005 bool (*f4)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
2006 struct gfc_expr *);
2007 bool (*f5)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
2008 struct gfc_expr *, struct gfc_expr *);
2010 gfc_check_f;
2012 /* Like gfc_check_f, these specify the type of the simplification
2013 function associated with an intrinsic. The fX are just like in
2014 gfc_check_f. cc is used for type conversion functions. */
2016 typedef union
2018 struct gfc_expr *(*f0)(void);
2019 struct gfc_expr *(*f1)(struct gfc_expr *);
2020 struct gfc_expr *(*f2)(struct gfc_expr *, struct gfc_expr *);
2021 struct gfc_expr *(*f3)(struct gfc_expr *, struct gfc_expr *,
2022 struct gfc_expr *);
2023 struct gfc_expr *(*f4)(struct gfc_expr *, struct gfc_expr *,
2024 struct gfc_expr *, struct gfc_expr *);
2025 struct gfc_expr *(*f5)(struct gfc_expr *, struct gfc_expr *,
2026 struct gfc_expr *, struct gfc_expr *,
2027 struct gfc_expr *);
2028 struct gfc_expr *(*cc)(struct gfc_expr *, bt, int);
2030 gfc_simplify_f;
2032 /* Again like gfc_check_f, these specify the type of the resolution
2033 function associated with an intrinsic. The fX are just like in
2034 gfc_check_f. f1m is used for MIN and MAX, s1 is used for abort(). */
2036 typedef union
2038 void (*f0)(struct gfc_expr *);
2039 void (*f1)(struct gfc_expr *, struct gfc_expr *);
2040 void (*f1m)(struct gfc_expr *, struct gfc_actual_arglist *);
2041 void (*f2)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
2042 void (*f3)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
2043 struct gfc_expr *);
2044 void (*f4)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
2045 struct gfc_expr *, struct gfc_expr *);
2046 void (*f5)(struct gfc_expr *, struct gfc_expr *, struct gfc_expr *,
2047 struct gfc_expr *, struct gfc_expr *, struct gfc_expr *);
2048 void (*s1)(struct gfc_code *);
2050 gfc_resolve_f;
2053 typedef struct gfc_intrinsic_sym
2055 const char *name, *lib_name;
2056 gfc_intrinsic_arg *formal;
2057 gfc_typespec ts;
2058 unsigned elemental:1, inquiry:1, transformational:1, pure:1,
2059 generic:1, specific:1, actual_ok:1, noreturn:1, conversion:1,
2060 from_module:1, vararg:1;
2062 int standard;
2064 gfc_simplify_f simplify;
2065 gfc_check_f check;
2066 gfc_resolve_f resolve;
2067 struct gfc_intrinsic_sym *specific_head, *next;
2068 gfc_isym_id id;
2071 gfc_intrinsic_sym;
2074 /* Expression nodes. The expression node types deserve explanations,
2075 since the last couple can be easily misconstrued:
2077 EXPR_OP Operator node pointing to one or two other nodes
2078 EXPR_FUNCTION Function call, symbol points to function's name
2079 EXPR_CONSTANT A scalar constant: Logical, String, Real, Int or Complex
2080 EXPR_VARIABLE An Lvalue with a root symbol and possible reference list
2081 which expresses structure, array and substring refs.
2082 EXPR_NULL The NULL pointer value (which also has a basic type).
2083 EXPR_SUBSTRING A substring of a constant string
2084 EXPR_STRUCTURE A structure constructor
2085 EXPR_ARRAY An array constructor.
2086 EXPR_COMPCALL Function (or subroutine) call of a procedure pointer
2087 component or type-bound procedure. */
2089 #include <mpfr.h>
2090 #include <mpc.h>
2091 #define GFC_RND_MODE GMP_RNDN
2092 #define GFC_MPC_RND_MODE MPC_RNDNN
2094 typedef splay_tree gfc_constructor_base;
2097 /* This should be an unsigned variable of type size_t. But to handle
2098 compiling to a 64-bit target from a 32-bit host, we need to use a
2099 HOST_WIDE_INT. Also, occasionally the string length field is used
2100 as a flag with values -1 and -2, see e.g. gfc_add_assign_aux_vars.
2101 So it needs to be signed. */
2102 typedef HOST_WIDE_INT gfc_charlen_t;
2104 typedef struct gfc_expr
2106 expr_t expr_type;
2108 gfc_typespec ts; /* These two refer to the overall expression */
2110 int rank; /* 0 indicates a scalar, -1 an assumed-rank array. */
2111 mpz_t *shape; /* Can be NULL if shape is unknown at compile time */
2113 /* Nonnull for functions and structure constructors, may also used to hold the
2114 base-object for component calls. */
2115 gfc_symtree *symtree;
2117 gfc_ref *ref;
2119 locus where;
2121 /* Used to store the base expression in component calls, when the expression
2122 is not a variable. */
2123 struct gfc_expr *base_expr;
2125 /* is_boz is true if the integer is regarded as BOZ bit pattern and is_snan
2126 denotes a signalling not-a-number. */
2127 unsigned int is_boz : 1, is_snan : 1;
2129 /* Sometimes, when an error has been emitted, it is necessary to prevent
2130 it from recurring. */
2131 unsigned int error : 1;
2133 /* Mark an expression where a user operator has been substituted by
2134 a function call in interface.c(gfc_extend_expr). */
2135 unsigned int user_operator : 1;
2137 /* Mark an expression as being a MOLD argument of ALLOCATE. */
2138 unsigned int mold : 1;
2140 /* Will require finalization after use. */
2141 unsigned int must_finalize : 1;
2143 /* Set this if no range check should be performed on this expression. */
2145 unsigned int no_bounds_check : 1;
2147 /* Set this if a matmul expression has already been evaluated for conversion
2148 to a BLAS call. */
2150 unsigned int external_blas : 1;
2152 /* If an expression comes from a Hollerith constant or compile-time
2153 evaluation of a transfer statement, it may have a prescribed target-
2154 memory representation, and these cannot always be backformed from
2155 the value. */
2156 struct
2158 gfc_charlen_t length;
2159 char *string;
2161 representation;
2163 union
2165 int logical;
2167 io_kind iokind;
2169 mpz_t integer;
2171 mpfr_t real;
2173 mpc_t complex;
2175 struct
2177 gfc_intrinsic_op op;
2178 gfc_user_op *uop;
2179 struct gfc_expr *op1, *op2;
2183 struct
2185 gfc_actual_arglist *actual;
2186 const char *name; /* Points to the ultimate name of the function */
2187 gfc_intrinsic_sym *isym;
2188 gfc_symbol *esym;
2190 function;
2192 struct
2194 gfc_actual_arglist* actual;
2195 const char* name;
2196 /* Base-object, whose component was called. NULL means that it should
2197 be taken from symtree/ref. */
2198 struct gfc_expr* base_object;
2199 gfc_typebound_proc* tbp; /* Should overlap with esym. */
2201 /* For type-bound operators, we want to call PASS procedures but already
2202 have the full arglist; mark this, so that it is not extended by the
2203 PASS argument. */
2204 unsigned ignore_pass:1;
2206 /* Do assign-calls rather than calls, that is appropriate dependency
2207 checking. */
2208 unsigned assign:1;
2210 compcall;
2212 struct
2214 gfc_charlen_t length;
2215 gfc_char_t *string;
2217 character;
2219 gfc_constructor_base constructor;
2221 value;
2223 /* Used to store PDT expression lists associated with expressions. */
2224 gfc_actual_arglist *param_list;
2227 gfc_expr;
2230 #define gfc_get_shape(rank) (XCNEWVEC (mpz_t, (rank)))
2232 /* Structures for information associated with different kinds of
2233 numbers. The first set of integer parameters define all there is
2234 to know about a particular kind. The rest of the elements are
2235 computed from the first elements. */
2237 typedef struct
2239 /* Values really representable by the target. */
2240 mpz_t huge, pedantic_min_int, min_int;
2242 int kind, radix, digits, bit_size, range;
2244 /* True if the C type of the given name maps to this precision.
2245 Note that more than one bit can be set. */
2246 unsigned int c_char : 1;
2247 unsigned int c_short : 1;
2248 unsigned int c_int : 1;
2249 unsigned int c_long : 1;
2250 unsigned int c_long_long : 1;
2252 gfc_integer_info;
2254 extern gfc_integer_info gfc_integer_kinds[];
2257 typedef struct
2259 int kind, bit_size;
2261 /* True if the C++ type bool, C99 type _Bool, maps to this precision. */
2262 unsigned int c_bool : 1;
2264 gfc_logical_info;
2266 extern gfc_logical_info gfc_logical_kinds[];
2269 typedef struct
2271 mpfr_t epsilon, huge, tiny, subnormal;
2272 int kind, radix, digits, min_exponent, max_exponent;
2273 int range, precision;
2275 /* The precision of the type as reported by GET_MODE_PRECISION. */
2276 int mode_precision;
2278 /* True if the C type of the given name maps to this precision.
2279 Note that more than one bit can be set. */
2280 unsigned int c_float : 1;
2281 unsigned int c_double : 1;
2282 unsigned int c_long_double : 1;
2283 unsigned int c_float128 : 1;
2285 gfc_real_info;
2287 extern gfc_real_info gfc_real_kinds[];
2289 typedef struct
2291 int kind, bit_size;
2292 const char *name;
2294 gfc_character_info;
2296 extern gfc_character_info gfc_character_kinds[];
2299 /* Equivalence structures. Equivalent lvalues are linked along the
2300 *eq pointer, equivalence sets are strung along the *next node. */
2301 typedef struct gfc_equiv
2303 struct gfc_equiv *next, *eq;
2304 gfc_expr *expr;
2305 const char *module;
2306 int used;
2308 gfc_equiv;
2310 #define gfc_get_equiv() XCNEW (gfc_equiv)
2312 /* Holds a single equivalence member after processing. */
2313 typedef struct gfc_equiv_info
2315 gfc_symbol *sym;
2316 HOST_WIDE_INT offset;
2317 HOST_WIDE_INT length;
2318 struct gfc_equiv_info *next;
2319 } gfc_equiv_info;
2321 /* Holds equivalence groups, after they have been processed. */
2322 typedef struct gfc_equiv_list
2324 gfc_equiv_info *equiv;
2325 struct gfc_equiv_list *next;
2326 } gfc_equiv_list;
2328 /* gfc_case stores the selector list of a case statement. The *low
2329 and *high pointers can point to the same expression in the case of
2330 a single value. If *high is NULL, the selection is from *low
2331 upwards, if *low is NULL the selection is *high downwards.
2333 This structure has separate fields to allow single and double linked
2334 lists of CASEs at the same time. The singe linked list along the NEXT
2335 field is a list of cases for a single CASE label. The double linked
2336 list along the LEFT/RIGHT fields is used to detect overlap and to
2337 build a table of the cases for SELECT constructs with a CHARACTER
2338 case expression. */
2340 typedef struct gfc_case
2342 /* Where we saw this case. */
2343 locus where;
2344 int n;
2346 /* Case range values. If (low == high), it's a single value. If one of
2347 the labels is NULL, it's an unbounded case. If both are NULL, this
2348 represents the default case. */
2349 gfc_expr *low, *high;
2351 /* Only used for SELECT TYPE. */
2352 gfc_typespec ts;
2354 /* Next case label in the list of cases for a single CASE label. */
2355 struct gfc_case *next;
2357 /* Used for detecting overlap, and for code generation. */
2358 struct gfc_case *left, *right;
2360 /* True if this case label can never be matched. */
2361 int unreachable;
2363 gfc_case;
2365 #define gfc_get_case() XCNEW (gfc_case)
2368 typedef struct
2370 gfc_expr *var, *start, *end, *step;
2371 unsigned short unroll;
2373 gfc_iterator;
2375 #define gfc_get_iterator() XCNEW (gfc_iterator)
2378 /* Allocation structure for ALLOCATE, DEALLOCATE and NULLIFY statements. */
2380 typedef struct gfc_alloc
2382 gfc_expr *expr;
2383 struct gfc_alloc *next;
2385 gfc_alloc;
2387 #define gfc_get_alloc() XCNEW (gfc_alloc)
2390 typedef struct
2392 gfc_expr *unit, *file, *status, *access, *form, *recl,
2393 *blank, *position, *action, *delim, *pad, *iostat, *iomsg, *convert,
2394 *decimal, *encoding, *round, *sign, *asynchronous, *id, *newunit,
2395 *share, *cc;
2396 char readonly;
2397 gfc_st_label *err;
2399 gfc_open;
2402 typedef struct
2404 gfc_expr *unit, *status, *iostat, *iomsg;
2405 gfc_st_label *err;
2407 gfc_close;
2410 typedef struct
2412 gfc_expr *unit, *iostat, *iomsg;
2413 gfc_st_label *err;
2415 gfc_filepos;
2418 typedef struct
2420 gfc_expr *unit, *file, *iostat, *exist, *opened, *number, *named,
2421 *name, *access, *sequential, *direct, *form, *formatted,
2422 *unformatted, *recl, *nextrec, *blank, *position, *action, *read,
2423 *write, *readwrite, *delim, *pad, *iolength, *iomsg, *convert, *strm_pos,
2424 *asynchronous, *decimal, *encoding, *pending, *round, *sign, *size, *id,
2425 *iqstream, *share, *cc;
2427 gfc_st_label *err;
2430 gfc_inquire;
2433 typedef struct
2435 gfc_expr *unit, *iostat, *iomsg, *id;
2436 gfc_st_label *err, *end, *eor;
2438 gfc_wait;
2441 typedef struct
2443 gfc_expr *io_unit, *format_expr, *rec, *advance, *iostat, *size, *iomsg,
2444 *id, *pos, *asynchronous, *blank, *decimal, *delim, *pad, *round,
2445 *sign, *extra_comma, *dt_io_kind, *udtio;
2446 char dec_ext;
2448 gfc_symbol *namelist;
2449 /* A format_label of `format_asterisk' indicates the "*" format */
2450 gfc_st_label *format_label;
2451 gfc_st_label *err, *end, *eor;
2453 locus eor_where, end_where, err_where;
2455 gfc_dt;
2458 typedef struct gfc_forall_iterator
2460 gfc_expr *var, *start, *end, *stride;
2461 struct gfc_forall_iterator *next;
2463 gfc_forall_iterator;
2466 /* Linked list to store associations in an ASSOCIATE statement. */
2468 typedef struct gfc_association_list
2470 struct gfc_association_list *next;
2472 /* Whether this is association to a variable that can be changed; otherwise,
2473 it's association to an expression and the name may not be used as
2474 lvalue. */
2475 unsigned variable:1;
2477 /* True if this struct is currently only linked to from a gfc_symbol rather
2478 than as part of a real list in gfc_code->ext.block.assoc. This may
2479 happen for SELECT TYPE temporaries and must be considered
2480 for memory handling. */
2481 unsigned dangling:1;
2483 /* True when the rank of the target expression is guessed during parsing. */
2484 unsigned rankguessed:1;
2486 char name[GFC_MAX_SYMBOL_LEN + 1];
2487 gfc_symtree *st; /* Symtree corresponding to name. */
2488 locus where;
2490 gfc_expr *target;
2492 gfc_association_list;
2493 #define gfc_get_association_list() XCNEW (gfc_association_list)
2496 /* Executable statements that fill gfc_code structures. */
2497 enum gfc_exec_op
2499 EXEC_NOP = 1, EXEC_END_NESTED_BLOCK, EXEC_END_BLOCK, EXEC_ASSIGN,
2500 EXEC_LABEL_ASSIGN, EXEC_POINTER_ASSIGN, EXEC_CRITICAL, EXEC_ERROR_STOP,
2501 EXEC_GOTO, EXEC_CALL, EXEC_COMPCALL, EXEC_ASSIGN_CALL, EXEC_RETURN,
2502 EXEC_ENTRY, EXEC_PAUSE, EXEC_STOP, EXEC_CONTINUE, EXEC_INIT_ASSIGN,
2503 EXEC_IF, EXEC_ARITHMETIC_IF, EXEC_DO, EXEC_DO_CONCURRENT, EXEC_DO_WHILE,
2504 EXEC_SELECT, EXEC_BLOCK, EXEC_FORALL, EXEC_WHERE, EXEC_CYCLE, EXEC_EXIT,
2505 EXEC_CALL_PPC, EXEC_ALLOCATE, EXEC_DEALLOCATE, EXEC_END_PROCEDURE,
2506 EXEC_SELECT_TYPE, EXEC_SYNC_ALL, EXEC_SYNC_MEMORY, EXEC_SYNC_IMAGES,
2507 EXEC_OPEN, EXEC_CLOSE, EXEC_WAIT,
2508 EXEC_READ, EXEC_WRITE, EXEC_IOLENGTH, EXEC_TRANSFER, EXEC_DT_END,
2509 EXEC_BACKSPACE, EXEC_ENDFILE, EXEC_INQUIRE, EXEC_REWIND, EXEC_FLUSH,
2510 EXEC_FORM_TEAM, EXEC_CHANGE_TEAM, EXEC_END_TEAM, EXEC_SYNC_TEAM,
2511 EXEC_LOCK, EXEC_UNLOCK, EXEC_EVENT_POST, EXEC_EVENT_WAIT, EXEC_FAIL_IMAGE,
2512 EXEC_OACC_KERNELS_LOOP, EXEC_OACC_PARALLEL_LOOP, EXEC_OACC_ROUTINE,
2513 EXEC_OACC_PARALLEL, EXEC_OACC_KERNELS, EXEC_OACC_DATA, EXEC_OACC_HOST_DATA,
2514 EXEC_OACC_LOOP, EXEC_OACC_UPDATE, EXEC_OACC_WAIT, EXEC_OACC_CACHE,
2515 EXEC_OACC_ENTER_DATA, EXEC_OACC_EXIT_DATA, EXEC_OACC_ATOMIC,
2516 EXEC_OACC_DECLARE,
2517 EXEC_OMP_CRITICAL, EXEC_OMP_DO, EXEC_OMP_FLUSH, EXEC_OMP_MASTER,
2518 EXEC_OMP_ORDERED, EXEC_OMP_PARALLEL, EXEC_OMP_PARALLEL_DO,
2519 EXEC_OMP_PARALLEL_SECTIONS, EXEC_OMP_PARALLEL_WORKSHARE,
2520 EXEC_OMP_SECTIONS, EXEC_OMP_SINGLE, EXEC_OMP_WORKSHARE,
2521 EXEC_OMP_ATOMIC, EXEC_OMP_BARRIER, EXEC_OMP_END_NOWAIT,
2522 EXEC_OMP_END_SINGLE, EXEC_OMP_TASK, EXEC_OMP_TASKWAIT,
2523 EXEC_OMP_TASKYIELD, EXEC_OMP_CANCEL, EXEC_OMP_CANCELLATION_POINT,
2524 EXEC_OMP_TASKGROUP, EXEC_OMP_SIMD, EXEC_OMP_DO_SIMD,
2525 EXEC_OMP_PARALLEL_DO_SIMD, EXEC_OMP_TARGET, EXEC_OMP_TARGET_DATA,
2526 EXEC_OMP_TEAMS, EXEC_OMP_DISTRIBUTE, EXEC_OMP_DISTRIBUTE_SIMD,
2527 EXEC_OMP_DISTRIBUTE_PARALLEL_DO, EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD,
2528 EXEC_OMP_TARGET_TEAMS, EXEC_OMP_TEAMS_DISTRIBUTE,
2529 EXEC_OMP_TEAMS_DISTRIBUTE_SIMD, EXEC_OMP_TARGET_TEAMS_DISTRIBUTE,
2530 EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD,
2531 EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO,
2532 EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO,
2533 EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
2534 EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD,
2535 EXEC_OMP_TARGET_UPDATE, EXEC_OMP_END_CRITICAL,
2536 EXEC_OMP_TARGET_ENTER_DATA, EXEC_OMP_TARGET_EXIT_DATA,
2537 EXEC_OMP_TARGET_PARALLEL, EXEC_OMP_TARGET_PARALLEL_DO,
2538 EXEC_OMP_TARGET_PARALLEL_DO_SIMD, EXEC_OMP_TARGET_SIMD,
2539 EXEC_OMP_TASKLOOP, EXEC_OMP_TASKLOOP_SIMD
2542 enum gfc_omp_atomic_op
2544 GFC_OMP_ATOMIC_UPDATE = 0,
2545 GFC_OMP_ATOMIC_READ = 1,
2546 GFC_OMP_ATOMIC_WRITE = 2,
2547 GFC_OMP_ATOMIC_CAPTURE = 3,
2548 GFC_OMP_ATOMIC_MASK = 3,
2549 GFC_OMP_ATOMIC_SEQ_CST = 4,
2550 GFC_OMP_ATOMIC_SWAP = 8
2553 typedef struct gfc_code
2555 gfc_exec_op op;
2557 struct gfc_code *block, *next;
2558 locus loc;
2560 gfc_st_label *here, *label1, *label2, *label3;
2561 gfc_symtree *symtree;
2562 gfc_expr *expr1, *expr2, *expr3, *expr4;
2563 /* A name isn't sufficient to identify a subroutine, we need the actual
2564 symbol for the interface definition.
2565 const char *sub_name; */
2566 gfc_symbol *resolved_sym;
2567 gfc_intrinsic_sym *resolved_isym;
2569 union
2571 gfc_actual_arglist *actual;
2572 gfc_iterator *iterator;
2574 struct
2576 gfc_typespec ts;
2577 gfc_alloc *list;
2578 /* Take the array specification from expr3 to allocate arrays
2579 without an explicit array specification. */
2580 unsigned arr_spec_from_expr3:1;
2582 alloc;
2584 struct
2586 gfc_namespace *ns;
2587 gfc_association_list *assoc;
2588 gfc_case *case_list;
2590 block;
2592 gfc_open *open;
2593 gfc_close *close;
2594 gfc_filepos *filepos;
2595 gfc_inquire *inquire;
2596 gfc_wait *wait;
2597 gfc_dt *dt;
2598 gfc_forall_iterator *forall_iterator;
2599 struct gfc_code *which_construct;
2600 int stop_code;
2601 gfc_entry_list *entry;
2602 gfc_oacc_declare *oacc_declare;
2603 gfc_omp_clauses *omp_clauses;
2604 const char *omp_name;
2605 gfc_omp_namelist *omp_namelist;
2606 bool omp_bool;
2607 gfc_omp_atomic_op omp_atomic;
2609 ext; /* Points to additional structures required by statement */
2611 /* Cycle and break labels in constructs. */
2612 tree cycle_label;
2613 tree exit_label;
2615 gfc_code;
2618 /* Storage for DATA statements. */
2619 typedef struct gfc_data_variable
2621 gfc_expr *expr;
2622 gfc_iterator iter;
2623 struct gfc_data_variable *list, *next;
2625 gfc_data_variable;
2628 typedef struct gfc_data_value
2630 mpz_t repeat;
2631 gfc_expr *expr;
2632 struct gfc_data_value *next;
2634 gfc_data_value;
2637 typedef struct gfc_data
2639 gfc_data_variable *var;
2640 gfc_data_value *value;
2641 locus where;
2643 struct gfc_data *next;
2645 gfc_data;
2648 /* Structure for holding compile options */
2649 typedef struct
2651 char *module_dir;
2652 gfc_source_form source_form;
2653 int max_continue_fixed;
2654 int max_continue_free;
2655 int max_identifier_length;
2657 int max_errors;
2659 int flag_preprocessed;
2660 int flag_d_lines;
2661 int flag_init_integer;
2662 int flag_init_integer_value;
2663 int flag_init_logical;
2664 int flag_init_character;
2665 char flag_init_character_value;
2667 int fpe;
2668 int fpe_summary;
2669 int rtcheck;
2671 int warn_std;
2672 int allow_std;
2674 gfc_option_t;
2676 extern gfc_option_t gfc_option;
2678 /* Constructor nodes for array and structure constructors. */
2679 typedef struct gfc_constructor
2681 gfc_constructor_base base;
2682 mpz_t offset; /* Offset within a constructor, used as
2683 key within base. */
2685 gfc_expr *expr;
2686 gfc_iterator *iterator;
2687 locus where;
2689 union
2691 gfc_component *component; /* Record the component being initialized. */
2694 mpz_t repeat; /* Record the repeat number of initial values in data
2695 statement like "data a/5*10/". */
2697 gfc_constructor;
2700 typedef struct iterator_stack
2702 gfc_symtree *variable;
2703 mpz_t value;
2704 struct iterator_stack *prev;
2706 iterator_stack;
2707 extern iterator_stack *iter_stack;
2710 /* Used for (possibly nested) SELECT TYPE statements. */
2711 typedef struct gfc_select_type_stack
2713 gfc_symbol *selector; /* Current selector variable. */
2714 gfc_symtree *tmp; /* Current temporary variable. */
2715 struct gfc_select_type_stack *prev; /* Previous element on stack. */
2717 gfc_select_type_stack;
2718 extern gfc_select_type_stack *select_type_stack;
2719 #define gfc_get_select_type_stack() XCNEW (gfc_select_type_stack)
2722 /* Node in the linked list used for storing finalizer procedures. */
2724 typedef struct gfc_finalizer
2726 struct gfc_finalizer* next;
2727 locus where; /* Where the FINAL declaration occurred. */
2729 /* Up to resolution, we want the gfc_symbol, there we lookup the corresponding
2730 symtree and later need only that. This way, we can access and call the
2731 finalizers from every context as they should be "always accessible". I
2732 don't make this a union because we need the information whether proc_sym is
2733 still referenced or not for dereferencing it on deleting a gfc_finalizer
2734 structure. */
2735 gfc_symbol* proc_sym;
2736 gfc_symtree* proc_tree;
2738 gfc_finalizer;
2739 #define gfc_get_finalizer() XCNEW (gfc_finalizer)
2742 /************************ Function prototypes *************************/
2744 /* decl.c */
2745 bool gfc_in_match_data (void);
2746 match gfc_match_char_spec (gfc_typespec *);
2747 extern int directive_unroll;
2749 /* Handling Parameterized Derived Types */
2750 bool gfc_insert_kind_parameter_exprs (gfc_expr *);
2751 bool gfc_insert_parameter_exprs (gfc_expr *, gfc_actual_arglist *);
2752 match gfc_get_pdt_instance (gfc_actual_arglist *, gfc_symbol **,
2753 gfc_actual_arglist **);
2755 /* scanner.c */
2756 void gfc_scanner_done_1 (void);
2757 void gfc_scanner_init_1 (void);
2759 void gfc_add_include_path (const char *, bool, bool, bool);
2760 void gfc_add_intrinsic_modules_path (const char *);
2761 void gfc_release_include_path (void);
2762 FILE *gfc_open_included_file (const char *, bool, bool);
2764 int gfc_at_end (void);
2765 int gfc_at_eof (void);
2766 int gfc_at_bol (void);
2767 int gfc_at_eol (void);
2768 void gfc_advance_line (void);
2769 int gfc_check_include (void);
2770 int gfc_define_undef_line (void);
2772 int gfc_wide_is_printable (gfc_char_t);
2773 int gfc_wide_is_digit (gfc_char_t);
2774 int gfc_wide_fits_in_byte (gfc_char_t);
2775 gfc_char_t gfc_wide_tolower (gfc_char_t);
2776 gfc_char_t gfc_wide_toupper (gfc_char_t);
2777 size_t gfc_wide_strlen (const gfc_char_t *);
2778 int gfc_wide_strncasecmp (const gfc_char_t *, const char *, size_t);
2779 gfc_char_t *gfc_wide_memset (gfc_char_t *, gfc_char_t, size_t);
2780 char *gfc_widechar_to_char (const gfc_char_t *, int);
2781 gfc_char_t *gfc_char_to_widechar (const char *);
2783 #define gfc_get_wide_string(n) XCNEWVEC (gfc_char_t, n)
2785 void gfc_skip_comments (void);
2786 gfc_char_t gfc_next_char_literal (gfc_instring);
2787 gfc_char_t gfc_next_char (void);
2788 char gfc_next_ascii_char (void);
2789 gfc_char_t gfc_peek_char (void);
2790 char gfc_peek_ascii_char (void);
2791 void gfc_error_recovery (void);
2792 void gfc_gobble_whitespace (void);
2793 bool gfc_new_file (void);
2794 const char * gfc_read_orig_filename (const char *, const char **);
2796 extern gfc_source_form gfc_current_form;
2797 extern const char *gfc_source_file;
2798 extern locus gfc_current_locus;
2800 void gfc_start_source_files (void);
2801 void gfc_end_source_files (void);
2803 /* misc.c */
2804 void gfc_clear_ts (gfc_typespec *);
2805 FILE *gfc_open_file (const char *);
2806 const char *gfc_basic_typename (bt);
2807 const char *gfc_typename (gfc_typespec *);
2808 const char *gfc_op2string (gfc_intrinsic_op);
2809 const char *gfc_code2string (const mstring *, int);
2810 int gfc_string2code (const mstring *, const char *);
2811 const char *gfc_intent_string (sym_intent);
2813 void gfc_init_1 (void);
2814 void gfc_init_2 (void);
2815 void gfc_done_1 (void);
2816 void gfc_done_2 (void);
2818 int get_c_kind (const char *, CInteropKind_t *);
2820 const char *gfc_closest_fuzzy_match (const char *, char **);
2821 static inline void
2822 vec_push (char **&optr, size_t &osz, const char *elt)
2824 /* {auto,}vec.safe_push () replacement. Don't ask.. */
2825 // if (strlen (elt) < 4) return; premature optimization: eliminated by cutoff
2826 optr = XRESIZEVEC (char *, optr, osz + 2);
2827 optr[osz] = CONST_CAST (char *, elt);
2828 optr[++osz] = NULL;
2831 HOST_WIDE_INT gfc_mpz_get_hwi (mpz_t);
2832 void gfc_mpz_set_hwi (mpz_t, const HOST_WIDE_INT);
2834 /* options.c */
2835 unsigned int gfc_option_lang_mask (void);
2836 void gfc_init_options_struct (struct gcc_options *);
2837 void gfc_init_options (unsigned int,
2838 struct cl_decoded_option *);
2839 bool gfc_handle_option (size_t, const char *, HOST_WIDE_INT, int, location_t,
2840 const struct cl_option_handlers *);
2841 bool gfc_post_options (const char **);
2842 char *gfc_get_option_string (void);
2844 /* f95-lang.c */
2845 void gfc_maybe_initialize_eh (void);
2847 /* iresolve.c */
2848 const char * gfc_get_string (const char *, ...) ATTRIBUTE_PRINTF_1;
2849 bool gfc_find_sym_in_expr (gfc_symbol *, gfc_expr *);
2851 /* error.c */
2852 void gfc_error_init_1 (void);
2853 void gfc_diagnostics_init (void);
2854 void gfc_diagnostics_finish (void);
2855 void gfc_buffer_error (bool);
2857 const char *gfc_print_wide_char (gfc_char_t);
2859 bool gfc_warning (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
2860 bool gfc_warning_now (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
2861 bool gfc_warning_internal (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
2862 bool gfc_warning_now_at (location_t loc, int opt, const char *gmsgid, ...)
2863 ATTRIBUTE_GCC_GFC(3,4);
2865 void gfc_clear_warning (void);
2866 void gfc_warning_check (void);
2868 void gfc_error_opt (int opt, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
2869 void gfc_error (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
2870 void gfc_error_now (const char *, ...) ATTRIBUTE_GCC_GFC(1,2);
2871 void gfc_fatal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);
2872 void gfc_internal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_GCC_GFC(1,2);
2873 void gfc_clear_error (void);
2874 bool gfc_error_check (void);
2875 bool gfc_error_flag_test (void);
2877 notification gfc_notification_std (int);
2878 bool gfc_notify_std (int, const char *, ...) ATTRIBUTE_GCC_GFC(2,3);
2880 /* A general purpose syntax error. */
2881 #define gfc_syntax_error(ST) \
2882 gfc_error ("Syntax error in %s statement at %C", gfc_ascii_statement (ST));
2884 #include "pretty-print.h" /* For output_buffer. */
2885 struct gfc_error_buffer
2887 bool flag;
2888 output_buffer buffer;
2889 gfc_error_buffer(void) : flag(false), buffer() {}
2892 void gfc_push_error (gfc_error_buffer *);
2893 void gfc_pop_error (gfc_error_buffer *);
2894 void gfc_free_error (gfc_error_buffer *);
2896 void gfc_get_errors (int *, int *);
2897 void gfc_errors_to_warnings (bool);
2899 /* arith.c */
2900 void gfc_arith_init_1 (void);
2901 void gfc_arith_done_1 (void);
2902 arith gfc_check_integer_range (mpz_t p, int kind);
2903 bool gfc_check_character_range (gfc_char_t, int);
2905 /* trans-types.c */
2906 bool gfc_check_any_c_kind (gfc_typespec *);
2907 int gfc_validate_kind (bt, int, bool);
2908 int gfc_get_int_kind_from_width_isofortranenv (int size);
2909 int gfc_get_real_kind_from_width_isofortranenv (int size);
2910 tree gfc_get_union_type (gfc_symbol *);
2911 tree gfc_get_derived_type (gfc_symbol * derived, int codimen = 0);
2912 extern int gfc_index_integer_kind;
2913 extern int gfc_default_integer_kind;
2914 extern int gfc_max_integer_kind;
2915 extern int gfc_default_real_kind;
2916 extern int gfc_default_double_kind;
2917 extern int gfc_default_character_kind;
2918 extern int gfc_default_logical_kind;
2919 extern int gfc_default_complex_kind;
2920 extern int gfc_c_int_kind;
2921 extern int gfc_atomic_int_kind;
2922 extern int gfc_atomic_logical_kind;
2923 extern int gfc_intio_kind;
2924 extern int gfc_charlen_int_kind;
2925 extern int gfc_size_kind;
2926 extern int gfc_numeric_storage_size;
2927 extern int gfc_character_storage_size;
2929 #define gfc_logical_4_kind 4
2930 #define gfc_integer_4_kind 4
2932 /* symbol.c */
2933 void gfc_clear_new_implicit (void);
2934 bool gfc_add_new_implicit_range (int, int);
2935 bool gfc_merge_new_implicit (gfc_typespec *);
2936 void gfc_set_implicit_none (bool, bool, locus *);
2937 void gfc_check_function_type (gfc_namespace *);
2938 bool gfc_is_intrinsic_typename (const char *);
2940 gfc_typespec *gfc_get_default_type (const char *, gfc_namespace *);
2941 bool gfc_set_default_type (gfc_symbol *, int, gfc_namespace *);
2943 void gfc_set_sym_referenced (gfc_symbol *);
2945 bool gfc_add_attribute (symbol_attribute *, locus *);
2946 bool gfc_add_ext_attribute (symbol_attribute *, ext_attr_id_t, locus *);
2947 bool gfc_add_allocatable (symbol_attribute *, locus *);
2948 bool gfc_add_codimension (symbol_attribute *, const char *, locus *);
2949 bool gfc_add_contiguous (symbol_attribute *, const char *, locus *);
2950 bool gfc_add_dimension (symbol_attribute *, const char *, locus *);
2951 bool gfc_add_external (symbol_attribute *, locus *);
2952 bool gfc_add_intrinsic (symbol_attribute *, locus *);
2953 bool gfc_add_optional (symbol_attribute *, locus *);
2954 bool gfc_add_kind (symbol_attribute *, locus *);
2955 bool gfc_add_len (symbol_attribute *, locus *);
2956 bool gfc_add_pointer (symbol_attribute *, locus *);
2957 bool gfc_add_cray_pointer (symbol_attribute *, locus *);
2958 bool gfc_add_cray_pointee (symbol_attribute *, locus *);
2959 match gfc_mod_pointee_as (gfc_array_spec *);
2960 bool gfc_add_protected (symbol_attribute *, const char *, locus *);
2961 bool gfc_add_result (symbol_attribute *, const char *, locus *);
2962 bool gfc_add_automatic (symbol_attribute *, const char *, locus *);
2963 bool gfc_add_save (symbol_attribute *, save_state, const char *, locus *);
2964 bool gfc_add_threadprivate (symbol_attribute *, const char *, locus *);
2965 bool gfc_add_omp_declare_target (symbol_attribute *, const char *, locus *);
2966 bool gfc_add_omp_declare_target_link (symbol_attribute *, const char *,
2967 locus *);
2968 bool gfc_add_saved_common (symbol_attribute *, locus *);
2969 bool gfc_add_target (symbol_attribute *, locus *);
2970 bool gfc_add_dummy (symbol_attribute *, const char *, locus *);
2971 bool gfc_add_generic (symbol_attribute *, const char *, locus *);
2972 bool gfc_add_common (symbol_attribute *, locus *);
2973 bool gfc_add_in_common (symbol_attribute *, const char *, locus *);
2974 bool gfc_add_in_equivalence (symbol_attribute *, const char *, locus *);
2975 bool gfc_add_data (symbol_attribute *, const char *, locus *);
2976 bool gfc_add_in_namelist (symbol_attribute *, const char *, locus *);
2977 bool gfc_add_sequence (symbol_attribute *, const char *, locus *);
2978 bool gfc_add_elemental (symbol_attribute *, locus *);
2979 bool gfc_add_pure (symbol_attribute *, locus *);
2980 bool gfc_add_recursive (symbol_attribute *, locus *);
2981 bool gfc_add_function (symbol_attribute *, const char *, locus *);
2982 bool gfc_add_subroutine (symbol_attribute *, const char *, locus *);
2983 bool gfc_add_volatile (symbol_attribute *, const char *, locus *);
2984 bool gfc_add_asynchronous (symbol_attribute *, const char *, locus *);
2985 bool gfc_add_proc (symbol_attribute *attr, const char *name, locus *where);
2986 bool gfc_add_abstract (symbol_attribute* attr, locus* where);
2988 bool gfc_add_access (symbol_attribute *, gfc_access, const char *, locus *);
2989 bool gfc_add_is_bind_c (symbol_attribute *, const char *, locus *, int);
2990 bool gfc_add_extension (symbol_attribute *, locus *);
2991 bool gfc_add_value (symbol_attribute *, const char *, locus *);
2992 bool gfc_add_flavor (symbol_attribute *, sym_flavor, const char *, locus *);
2993 bool gfc_add_entry (symbol_attribute *, const char *, locus *);
2994 bool gfc_add_procedure (symbol_attribute *, procedure_type,
2995 const char *, locus *);
2996 bool gfc_add_intent (symbol_attribute *, sym_intent, locus *);
2997 bool gfc_add_explicit_interface (gfc_symbol *, ifsrc,
2998 gfc_formal_arglist *, locus *);
2999 bool gfc_add_type (gfc_symbol *, gfc_typespec *, locus *);
3001 void gfc_clear_attr (symbol_attribute *);
3002 bool gfc_missing_attr (symbol_attribute *, locus *);
3003 bool gfc_copy_attr (symbol_attribute *, symbol_attribute *, locus *);
3004 int gfc_copy_dummy_sym (gfc_symbol **, gfc_symbol *, int);
3005 bool gfc_add_component (gfc_symbol *, const char *, gfc_component **);
3006 gfc_symbol *gfc_use_derived (gfc_symbol *);
3007 gfc_symtree *gfc_use_derived_tree (gfc_symtree *);
3008 gfc_component *gfc_find_component (gfc_symbol *, const char *, bool, bool,
3009 gfc_ref **);
3011 gfc_st_label *gfc_get_st_label (int);
3012 void gfc_free_st_label (gfc_st_label *);
3013 void gfc_define_st_label (gfc_st_label *, gfc_sl_type, locus *);
3014 bool gfc_reference_st_label (gfc_st_label *, gfc_sl_type);
3016 gfc_namespace *gfc_get_namespace (gfc_namespace *, int);
3017 gfc_symtree *gfc_new_symtree (gfc_symtree **, const char *);
3018 gfc_symtree *gfc_find_symtree (gfc_symtree *, const char *);
3019 void gfc_delete_symtree (gfc_symtree **, const char *);
3020 gfc_symtree *gfc_get_unique_symtree (gfc_namespace *);
3021 gfc_user_op *gfc_get_uop (const char *);
3022 gfc_user_op *gfc_find_uop (const char *, gfc_namespace *);
3023 void gfc_free_symbol (gfc_symbol *);
3024 void gfc_release_symbol (gfc_symbol *);
3025 gfc_symbol *gfc_new_symbol (const char *, gfc_namespace *);
3026 gfc_symtree* gfc_find_symtree_in_proc (const char *, gfc_namespace *);
3027 int gfc_find_symbol (const char *, gfc_namespace *, int, gfc_symbol **);
3028 int gfc_find_sym_tree (const char *, gfc_namespace *, int, gfc_symtree **);
3029 int gfc_get_symbol (const char *, gfc_namespace *, gfc_symbol **);
3030 bool gfc_verify_c_interop (gfc_typespec *);
3031 bool gfc_verify_c_interop_param (gfc_symbol *);
3032 bool verify_bind_c_sym (gfc_symbol *, gfc_typespec *, int, gfc_common_head *);
3033 bool verify_bind_c_derived_type (gfc_symbol *);
3034 bool verify_com_block_vars_c_interop (gfc_common_head *);
3035 gfc_symtree *generate_isocbinding_symbol (const char *, iso_c_binding_symbol,
3036 const char *, gfc_symtree *, bool);
3037 void gfc_save_symbol_data (gfc_symbol *);
3038 int gfc_get_sym_tree (const char *, gfc_namespace *, gfc_symtree **, bool);
3039 int gfc_get_ha_symbol (const char *, gfc_symbol **);
3040 int gfc_get_ha_sym_tree (const char *, gfc_symtree **);
3042 void gfc_drop_last_undo_checkpoint (void);
3043 void gfc_restore_last_undo_checkpoint (void);
3044 void gfc_undo_symbols (void);
3045 void gfc_commit_symbols (void);
3046 void gfc_commit_symbol (gfc_symbol *);
3047 gfc_charlen *gfc_new_charlen (gfc_namespace *, gfc_charlen *);
3048 void gfc_free_charlen (gfc_charlen *, gfc_charlen *);
3049 void gfc_free_namespace (gfc_namespace *);
3051 void gfc_symbol_init_2 (void);
3052 void gfc_symbol_done_2 (void);
3054 void gfc_traverse_symtree (gfc_symtree *, void (*)(gfc_symtree *));
3055 void gfc_traverse_ns (gfc_namespace *, void (*)(gfc_symbol *));
3056 void gfc_traverse_user_op (gfc_namespace *, void (*)(gfc_user_op *));
3057 void gfc_save_all (gfc_namespace *);
3059 void gfc_enforce_clean_symbol_state (void);
3060 void gfc_free_dt_list (void);
3063 gfc_gsymbol *gfc_get_gsymbol (const char *);
3064 gfc_gsymbol *gfc_find_gsymbol (gfc_gsymbol *, const char *);
3065 gfc_gsymbol *gfc_find_case_gsymbol (gfc_gsymbol *, const char *);
3067 gfc_typebound_proc* gfc_get_typebound_proc (gfc_typebound_proc*);
3068 gfc_symbol* gfc_get_derived_super_type (gfc_symbol*);
3069 gfc_symbol* gfc_get_ultimate_derived_super_type (gfc_symbol*);
3070 bool gfc_type_is_extension_of (gfc_symbol *, gfc_symbol *);
3071 bool gfc_type_compatible (gfc_typespec *, gfc_typespec *);
3073 void gfc_copy_formal_args_intr (gfc_symbol *, gfc_intrinsic_sym *,
3074 gfc_actual_arglist *);
3076 void gfc_free_finalizer (gfc_finalizer *el); /* Needed in resolve.c, too */
3078 bool gfc_check_symbol_typed (gfc_symbol*, gfc_namespace*, bool, locus);
3079 gfc_namespace* gfc_find_proc_namespace (gfc_namespace*);
3081 bool gfc_is_associate_pointer (gfc_symbol*);
3082 gfc_symbol * gfc_find_dt_in_generic (gfc_symbol *);
3083 gfc_formal_arglist *gfc_sym_get_dummy_args (gfc_symbol *);
3085 /* intrinsic.c -- true if working in an init-expr, false otherwise. */
3086 extern bool gfc_init_expr_flag;
3088 /* Given a symbol that we have decided is intrinsic, mark it as such
3089 by placing it into a special module that is otherwise impossible to
3090 read or write. */
3092 #define gfc_intrinsic_symbol(SYM) SYM->module = gfc_get_string ("(intrinsic)")
3094 void gfc_intrinsic_init_1 (void);
3095 void gfc_intrinsic_done_1 (void);
3097 char gfc_type_letter (bt);
3098 gfc_symbol * gfc_get_intrinsic_sub_symbol (const char *);
3099 bool gfc_convert_type (gfc_expr *, gfc_typespec *, int);
3100 bool gfc_convert_type_warn (gfc_expr *, gfc_typespec *, int, int);
3101 bool gfc_convert_chartype (gfc_expr *, gfc_typespec *);
3102 int gfc_generic_intrinsic (const char *);
3103 int gfc_specific_intrinsic (const char *);
3104 bool gfc_is_intrinsic (gfc_symbol*, int, locus);
3105 int gfc_intrinsic_actual_ok (const char *, const bool);
3106 gfc_intrinsic_sym *gfc_find_function (const char *);
3107 gfc_intrinsic_sym *gfc_find_subroutine (const char *);
3108 gfc_intrinsic_sym *gfc_intrinsic_function_by_id (gfc_isym_id);
3109 gfc_intrinsic_sym *gfc_intrinsic_subroutine_by_id (gfc_isym_id);
3110 gfc_isym_id gfc_isym_id_by_intmod (intmod_id, int);
3111 gfc_isym_id gfc_isym_id_by_intmod_sym (gfc_symbol *);
3114 match gfc_intrinsic_func_interface (gfc_expr *, int);
3115 match gfc_intrinsic_sub_interface (gfc_code *, int);
3117 void gfc_warn_intrinsic_shadow (const gfc_symbol*, bool, bool);
3118 bool gfc_check_intrinsic_standard (const gfc_intrinsic_sym*, const char**,
3119 bool, locus);
3121 /* match.c -- FIXME */
3122 void gfc_free_iterator (gfc_iterator *, int);
3123 void gfc_free_forall_iterator (gfc_forall_iterator *);
3124 void gfc_free_alloc_list (gfc_alloc *);
3125 void gfc_free_namelist (gfc_namelist *);
3126 void gfc_free_omp_namelist (gfc_omp_namelist *);
3127 void gfc_free_equiv (gfc_equiv *);
3128 void gfc_free_equiv_until (gfc_equiv *, gfc_equiv *);
3129 void gfc_free_data (gfc_data *);
3130 void gfc_reject_data (gfc_namespace *);
3131 void gfc_free_case_list (gfc_case *);
3133 /* matchexp.c -- FIXME too? */
3134 gfc_expr *gfc_get_parentheses (gfc_expr *);
3136 /* openmp.c */
3137 struct gfc_omp_saved_state { void *ptrs[2]; int ints[1]; };
3138 void gfc_free_omp_clauses (gfc_omp_clauses *);
3139 void gfc_free_oacc_declare_clauses (struct gfc_oacc_declare *);
3140 void gfc_free_omp_declare_simd (gfc_omp_declare_simd *);
3141 void gfc_free_omp_declare_simd_list (gfc_omp_declare_simd *);
3142 void gfc_free_omp_udr (gfc_omp_udr *);
3143 gfc_omp_udr *gfc_omp_udr_find (gfc_symtree *, gfc_typespec *);
3144 void gfc_resolve_omp_directive (gfc_code *, gfc_namespace *);
3145 void gfc_resolve_do_iterator (gfc_code *, gfc_symbol *, bool);
3146 void gfc_resolve_omp_local_vars (gfc_namespace *);
3147 void gfc_resolve_omp_parallel_blocks (gfc_code *, gfc_namespace *);
3148 void gfc_resolve_omp_do_blocks (gfc_code *, gfc_namespace *);
3149 void gfc_resolve_omp_declare_simd (gfc_namespace *);
3150 void gfc_resolve_omp_udrs (gfc_symtree *);
3151 void gfc_omp_save_and_clear_state (struct gfc_omp_saved_state *);
3152 void gfc_omp_restore_state (struct gfc_omp_saved_state *);
3153 void gfc_free_expr_list (gfc_expr_list *);
3154 void gfc_resolve_oacc_directive (gfc_code *, gfc_namespace *);
3155 void gfc_resolve_oacc_declare (gfc_namespace *);
3156 void gfc_resolve_oacc_parallel_loop_blocks (gfc_code *, gfc_namespace *);
3157 void gfc_resolve_oacc_blocks (gfc_code *, gfc_namespace *);
3159 /* expr.c */
3160 void gfc_free_actual_arglist (gfc_actual_arglist *);
3161 gfc_actual_arglist *gfc_copy_actual_arglist (gfc_actual_arglist *);
3163 bool gfc_extract_int (gfc_expr *, int *, int = 0);
3164 bool gfc_extract_hwi (gfc_expr *, HOST_WIDE_INT *, int = 0);
3166 bool is_subref_array (gfc_expr *);
3167 bool gfc_is_simply_contiguous (gfc_expr *, bool, bool);
3168 bool gfc_check_init_expr (gfc_expr *);
3170 gfc_expr *gfc_build_conversion (gfc_expr *);
3171 void gfc_free_ref_list (gfc_ref *);
3172 void gfc_type_convert_binary (gfc_expr *, int);
3173 bool gfc_is_constant_expr (gfc_expr *);
3174 bool gfc_simplify_expr (gfc_expr *, int);
3175 int gfc_has_vector_index (gfc_expr *);
3177 gfc_expr *gfc_get_expr (void);
3178 gfc_expr *gfc_get_array_expr (bt type, int kind, locus *);
3179 gfc_expr *gfc_get_null_expr (locus *);
3180 gfc_expr *gfc_get_operator_expr (locus *, gfc_intrinsic_op,gfc_expr *, gfc_expr *);
3181 gfc_expr *gfc_get_structure_constructor_expr (bt, int, locus *);
3182 gfc_expr *gfc_get_constant_expr (bt, int, locus *);
3183 gfc_expr *gfc_get_character_expr (int, locus *, const char *, gfc_charlen_t len);
3184 gfc_expr *gfc_get_int_expr (int, locus *, HOST_WIDE_INT);
3185 gfc_expr *gfc_get_logical_expr (int, locus *, bool);
3186 gfc_expr *gfc_get_iokind_expr (locus *, io_kind);
3188 void gfc_clear_shape (mpz_t *shape, int rank);
3189 void gfc_free_shape (mpz_t **shape, int rank);
3190 void gfc_free_expr (gfc_expr *);
3191 void gfc_replace_expr (gfc_expr *, gfc_expr *);
3192 mpz_t *gfc_copy_shape (mpz_t *, int);
3193 mpz_t *gfc_copy_shape_excluding (mpz_t *, int, gfc_expr *);
3194 gfc_expr *gfc_copy_expr (gfc_expr *);
3195 gfc_ref* gfc_copy_ref (gfc_ref*);
3197 bool gfc_specification_expr (gfc_expr *);
3199 int gfc_numeric_ts (gfc_typespec *);
3200 int gfc_kind_max (gfc_expr *, gfc_expr *);
3202 bool gfc_check_conformance (gfc_expr *, gfc_expr *, const char *, ...) ATTRIBUTE_PRINTF_3;
3203 bool gfc_check_assign (gfc_expr *, gfc_expr *, int, bool c = true);
3204 bool gfc_check_pointer_assign (gfc_expr *, gfc_expr *);
3205 bool gfc_check_assign_symbol (gfc_symbol *, gfc_component *, gfc_expr *);
3207 gfc_expr *gfc_build_default_init_expr (gfc_typespec *, locus *);
3208 gfc_expr *gfc_build_init_expr (gfc_typespec *, locus *, bool);
3209 void gfc_apply_init (gfc_typespec *, symbol_attribute *, gfc_expr *);
3210 bool gfc_has_default_initializer (gfc_symbol *);
3211 gfc_expr *gfc_default_initializer (gfc_typespec *);
3212 gfc_expr *gfc_generate_initializer (gfc_typespec *, bool);
3213 gfc_expr *gfc_get_variable_expr (gfc_symtree *);
3214 void gfc_add_full_array_ref (gfc_expr *, gfc_array_spec *);
3215 gfc_expr * gfc_lval_expr_from_sym (gfc_symbol *);
3217 gfc_array_spec *gfc_get_full_arrayspec_from_expr (gfc_expr *expr);
3219 bool gfc_traverse_expr (gfc_expr *, gfc_symbol *,
3220 bool (*)(gfc_expr *, gfc_symbol *, int*),
3221 int);
3222 void gfc_expr_set_symbols_referenced (gfc_expr *);
3223 bool gfc_expr_check_typed (gfc_expr*, gfc_namespace*, bool);
3224 bool gfc_derived_parameter_expr (gfc_expr *);
3225 gfc_param_spec_type gfc_spec_list_type (gfc_actual_arglist *, gfc_symbol *);
3226 gfc_component * gfc_get_proc_ptr_comp (gfc_expr *);
3227 bool gfc_is_proc_ptr_comp (gfc_expr *);
3228 bool gfc_is_alloc_class_scalar_function (gfc_expr *);
3229 bool gfc_is_class_array_function (gfc_expr *);
3231 bool gfc_ref_this_image (gfc_ref *ref);
3232 bool gfc_is_coindexed (gfc_expr *);
3233 bool gfc_is_coarray (gfc_expr *);
3234 int gfc_get_corank (gfc_expr *);
3235 bool gfc_has_ultimate_allocatable (gfc_expr *);
3236 bool gfc_has_ultimate_pointer (gfc_expr *);
3237 gfc_expr* gfc_find_team_co (gfc_expr *);
3238 gfc_expr* gfc_find_stat_co (gfc_expr *);
3239 gfc_expr* gfc_build_intrinsic_call (gfc_namespace *, gfc_isym_id, const char*,
3240 locus, unsigned, ...);
3241 bool gfc_check_vardef_context (gfc_expr*, bool, bool, bool, const char*);
3244 /* st.c */
3245 extern gfc_code new_st;
3247 void gfc_clear_new_st (void);
3248 gfc_code *gfc_get_code (gfc_exec_op);
3249 gfc_code *gfc_append_code (gfc_code *, gfc_code *);
3250 void gfc_free_statement (gfc_code *);
3251 void gfc_free_statements (gfc_code *);
3252 void gfc_free_association_list (gfc_association_list *);
3254 /* resolve.c */
3255 bool gfc_resolve_expr (gfc_expr *);
3256 void gfc_resolve (gfc_namespace *);
3257 void gfc_resolve_code (gfc_code *, gfc_namespace *);
3258 void gfc_resolve_blocks (gfc_code *, gfc_namespace *);
3259 int gfc_impure_variable (gfc_symbol *);
3260 int gfc_pure (gfc_symbol *);
3261 int gfc_implicit_pure (gfc_symbol *);
3262 void gfc_unset_implicit_pure (gfc_symbol *);
3263 int gfc_elemental (gfc_symbol *);
3264 bool gfc_resolve_iterator (gfc_iterator *, bool, bool);
3265 bool find_forall_index (gfc_expr *, gfc_symbol *, int);
3266 bool gfc_resolve_index (gfc_expr *, int);
3267 bool gfc_resolve_dim_arg (gfc_expr *);
3268 bool gfc_is_formal_arg (void);
3269 void gfc_resolve_substring_charlen (gfc_expr *);
3270 match gfc_iso_c_sub_interface(gfc_code *, gfc_symbol *);
3271 gfc_expr *gfc_expr_to_initialize (gfc_expr *);
3272 bool gfc_type_is_extensible (gfc_symbol *);
3273 bool gfc_resolve_intrinsic (gfc_symbol *, locus *);
3274 bool gfc_explicit_interface_required (gfc_symbol *, char *, int);
3275 extern int gfc_do_concurrent_flag;
3276 const char* gfc_lookup_function_fuzzy (const char *, gfc_symtree *);
3277 int gfc_pure_function (gfc_expr *e, const char **name);
3278 int gfc_implicit_pure_function (gfc_expr *e);
3281 /* array.c */
3282 gfc_iterator *gfc_copy_iterator (gfc_iterator *);
3284 void gfc_free_array_spec (gfc_array_spec *);
3285 gfc_array_ref *gfc_copy_array_ref (gfc_array_ref *);
3287 bool gfc_set_array_spec (gfc_symbol *, gfc_array_spec *, locus *);
3288 gfc_array_spec *gfc_copy_array_spec (gfc_array_spec *);
3289 bool gfc_resolve_array_spec (gfc_array_spec *, int);
3291 int gfc_compare_array_spec (gfc_array_spec *, gfc_array_spec *);
3293 void gfc_simplify_iterator_var (gfc_expr *);
3294 bool gfc_expand_constructor (gfc_expr *, bool);
3295 int gfc_constant_ac (gfc_expr *);
3296 int gfc_expanded_ac (gfc_expr *);
3297 bool gfc_resolve_character_array_constructor (gfc_expr *);
3298 bool gfc_resolve_array_constructor (gfc_expr *);
3299 bool gfc_check_constructor_type (gfc_expr *);
3300 bool gfc_check_iter_variable (gfc_expr *);
3301 bool gfc_check_constructor (gfc_expr *, bool (*)(gfc_expr *));
3302 bool gfc_array_size (gfc_expr *, mpz_t *);
3303 bool gfc_array_dimen_size (gfc_expr *, int, mpz_t *);
3304 bool gfc_array_ref_shape (gfc_array_ref *, mpz_t *);
3305 gfc_array_ref *gfc_find_array_ref (gfc_expr *, bool a = false);
3306 tree gfc_conv_array_initializer (tree type, gfc_expr *);
3307 bool spec_size (gfc_array_spec *, mpz_t *);
3308 bool spec_dimen_size (gfc_array_spec *, int, mpz_t *);
3309 bool gfc_is_compile_time_shape (gfc_array_spec *);
3311 bool gfc_ref_dimen_size (gfc_array_ref *, int dimen, mpz_t *, mpz_t *);
3314 #define gfc_str_startswith(str, pref) \
3315 (strncmp ((str), (pref), strlen (pref)) == 0)
3317 /* interface.c -- FIXME: some of these should be in symbol.c */
3318 void gfc_free_interface (gfc_interface *);
3319 bool gfc_compare_derived_types (gfc_symbol *, gfc_symbol *);
3320 bool gfc_compare_types (gfc_typespec *, gfc_typespec *);
3321 bool gfc_check_dummy_characteristics (gfc_symbol *, gfc_symbol *,
3322 bool, char *, int);
3323 bool gfc_check_result_characteristics (gfc_symbol *, gfc_symbol *,
3324 char *, int);
3325 bool gfc_compare_interfaces (gfc_symbol*, gfc_symbol*, const char *, int, int,
3326 char *, int, const char *, const char *);
3327 void gfc_check_interfaces (gfc_namespace *);
3328 bool gfc_procedure_use (gfc_symbol *, gfc_actual_arglist **, locus *);
3329 void gfc_ppc_use (gfc_component *, gfc_actual_arglist **, locus *);
3330 gfc_symbol *gfc_search_interface (gfc_interface *, int,
3331 gfc_actual_arglist **);
3332 match gfc_extend_expr (gfc_expr *);
3333 void gfc_free_formal_arglist (gfc_formal_arglist *);
3334 bool gfc_extend_assign (gfc_code *, gfc_namespace *);
3335 bool gfc_check_new_interface (gfc_interface *, gfc_symbol *, locus);
3336 bool gfc_add_interface (gfc_symbol *);
3337 gfc_interface *gfc_current_interface_head (void);
3338 void gfc_set_current_interface_head (gfc_interface *);
3339 gfc_symtree* gfc_find_sym_in_symtree (gfc_symbol*);
3340 bool gfc_arglist_matches_symbol (gfc_actual_arglist**, gfc_symbol*);
3341 bool gfc_check_operator_interface (gfc_symbol*, gfc_intrinsic_op, locus);
3342 bool gfc_has_vector_subscript (gfc_expr*);
3343 gfc_intrinsic_op gfc_equivalent_op (gfc_intrinsic_op);
3344 bool gfc_check_typebound_override (gfc_symtree*, gfc_symtree*);
3345 void gfc_check_dtio_interfaces (gfc_symbol*);
3346 gfc_symtree* gfc_find_typebound_dtio_proc (gfc_symbol *, bool, bool);
3347 gfc_symbol* gfc_find_specific_dtio_proc (gfc_symbol*, bool, bool);
3350 /* io.c */
3351 extern gfc_st_label format_asterisk;
3353 void gfc_free_open (gfc_open *);
3354 bool gfc_resolve_open (gfc_open *);
3355 void gfc_free_close (gfc_close *);
3356 bool gfc_resolve_close (gfc_close *);
3357 void gfc_free_filepos (gfc_filepos *);
3358 bool gfc_resolve_filepos (gfc_filepos *);
3359 void gfc_free_inquire (gfc_inquire *);
3360 bool gfc_resolve_inquire (gfc_inquire *);
3361 void gfc_free_dt (gfc_dt *);
3362 bool gfc_resolve_dt (gfc_dt *, locus *);
3363 void gfc_free_wait (gfc_wait *);
3364 bool gfc_resolve_wait (gfc_wait *);
3365 extern bool async_io_dt;
3367 /* module.c */
3368 void gfc_module_init_2 (void);
3369 void gfc_module_done_2 (void);
3370 void gfc_dump_module (const char *, int);
3371 bool gfc_check_symbol_access (gfc_symbol *);
3372 void gfc_free_use_stmts (gfc_use_list *);
3373 const char *gfc_dt_lower_string (const char *);
3374 const char *gfc_dt_upper_string (const char *);
3376 /* primary.c */
3377 symbol_attribute gfc_variable_attr (gfc_expr *, gfc_typespec *);
3378 symbol_attribute gfc_expr_attr (gfc_expr *);
3379 symbol_attribute gfc_caf_attr (gfc_expr *, bool i = false, bool *r = NULL);
3380 match gfc_match_rvalue (gfc_expr **);
3381 match gfc_match_varspec (gfc_expr*, int, bool, bool);
3382 int gfc_check_digit (char, int);
3383 bool gfc_is_function_return_value (gfc_symbol *, gfc_namespace *);
3384 bool gfc_convert_to_structure_constructor (gfc_expr *, gfc_symbol *,
3385 gfc_expr **,
3386 gfc_actual_arglist **, bool);
3388 /* trans.c */
3389 void gfc_generate_code (gfc_namespace *);
3390 void gfc_generate_module_code (gfc_namespace *);
3392 /* trans-intrinsic.c */
3393 bool gfc_inline_intrinsic_function_p (gfc_expr *);
3395 /* bbt.c */
3396 typedef int (*compare_fn) (void *, void *);
3397 void gfc_insert_bbt (void *, void *, compare_fn);
3398 void gfc_delete_bbt (void *, void *, compare_fn);
3400 /* dump-parse-tree.c */
3401 void gfc_dump_parse_tree (gfc_namespace *, FILE *);
3402 void gfc_dump_c_prototypes (gfc_namespace *, FILE *);
3404 /* parse.c */
3405 bool gfc_parse_file (void);
3406 void gfc_global_used (gfc_gsymbol *, locus *);
3407 gfc_namespace* gfc_build_block_ns (gfc_namespace *);
3409 /* dependency.c */
3410 int gfc_dep_compare_functions (gfc_expr *, gfc_expr *, bool);
3411 int gfc_dep_compare_expr (gfc_expr *, gfc_expr *);
3412 bool gfc_dep_difference (gfc_expr *, gfc_expr *, mpz_t *);
3414 /* check.c */
3415 bool gfc_check_same_strlen (const gfc_expr*, const gfc_expr*, const char*);
3416 bool gfc_calculate_transfer_sizes (gfc_expr*, gfc_expr*, gfc_expr*,
3417 size_t*, size_t*, size_t*);
3419 /* class.c */
3420 void gfc_fix_class_refs (gfc_expr *e);
3421 void gfc_add_component_ref (gfc_expr *, const char *);
3422 void gfc_add_class_array_ref (gfc_expr *);
3423 #define gfc_add_data_component(e) gfc_add_component_ref(e,"_data")
3424 #define gfc_add_vptr_component(e) gfc_add_component_ref(e,"_vptr")
3425 #define gfc_add_len_component(e) gfc_add_component_ref(e,"_len")
3426 #define gfc_add_hash_component(e) gfc_add_component_ref(e,"_hash")
3427 #define gfc_add_size_component(e) gfc_add_component_ref(e,"_size")
3428 #define gfc_add_def_init_component(e) gfc_add_component_ref(e,"_def_init")
3429 #define gfc_add_final_component(e) gfc_add_component_ref(e,"_final")
3430 bool gfc_is_class_array_ref (gfc_expr *, bool *);
3431 bool gfc_is_class_scalar_expr (gfc_expr *);
3432 bool gfc_is_class_container_ref (gfc_expr *e);
3433 gfc_expr *gfc_class_initializer (gfc_typespec *, gfc_expr *);
3434 unsigned int gfc_hash_value (gfc_symbol *);
3435 gfc_expr *gfc_get_len_component (gfc_expr *e);
3436 bool gfc_build_class_symbol (gfc_typespec *, symbol_attribute *,
3437 gfc_array_spec **);
3438 gfc_symbol *gfc_find_derived_vtab (gfc_symbol *);
3439 gfc_symbol *gfc_find_vtab (gfc_typespec *);
3440 gfc_symtree* gfc_find_typebound_proc (gfc_symbol*, bool*,
3441 const char*, bool, locus*);
3442 gfc_symtree* gfc_find_typebound_user_op (gfc_symbol*, bool*,
3443 const char*, bool, locus*);
3444 gfc_typebound_proc* gfc_find_typebound_intrinsic_op (gfc_symbol*, bool*,
3445 gfc_intrinsic_op, bool,
3446 locus*);
3447 gfc_symtree* gfc_get_tbp_symtree (gfc_symtree**, const char*);
3448 bool gfc_is_finalizable (gfc_symbol *, gfc_expr **);
3450 #define CLASS_DATA(sym) sym->ts.u.derived->components
3451 #define UNLIMITED_POLY(sym) \
3452 (sym != NULL && sym->ts.type == BT_CLASS \
3453 && CLASS_DATA (sym) \
3454 && CLASS_DATA (sym)->ts.u.derived \
3455 && CLASS_DATA (sym)->ts.u.derived->attr.unlimited_polymorphic)
3456 #define IS_CLASS_ARRAY(sym) \
3457 (sym->ts.type == BT_CLASS \
3458 && CLASS_DATA (sym) \
3459 && CLASS_DATA (sym)->attr.dimension \
3460 && !CLASS_DATA (sym)->attr.class_pointer)
3462 /* frontend-passes.c */
3464 void gfc_run_passes (gfc_namespace *);
3466 typedef int (*walk_code_fn_t) (gfc_code **, int *, void *);
3467 typedef int (*walk_expr_fn_t) (gfc_expr **, int *, void *);
3469 int gfc_dummy_code_callback (gfc_code **, int *, void *);
3470 int gfc_expr_walker (gfc_expr **, walk_expr_fn_t, void *);
3471 int gfc_code_walker (gfc_code **, walk_code_fn_t, walk_expr_fn_t, void *);
3473 /* simplify.c */
3475 void gfc_convert_mpz_to_signed (mpz_t, int);
3476 gfc_expr *gfc_simplify_ieee_functions (gfc_expr *);
3477 bool gfc_is_size_zero_array (gfc_expr *);
3479 /* trans-array.c */
3481 bool gfc_is_reallocatable_lhs (gfc_expr *);
3483 /* trans-decl.c */
3485 void finish_oacc_declare (gfc_namespace *, gfc_symbol *, bool);
3487 #endif /* GCC_GFORTRAN_H */