| 1 | /* All matcher functions. |
| 2 | Copyright (C) 2003-2026 Free Software Foundation, Inc. |
| 3 | Contributed by Steven Bosscher |
| 4 | |
| 5 | This file is part of GCC. |
| 6 | |
| 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. |
| 11 | |
| 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. |
| 16 | |
| 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/>. */ |
| 20 | |
| 21 | |
| 22 | #ifndef GFC_MATCH_H |
| 23 | #define GFC_MATCH_H |
| 24 | |
| 25 | /* gfc_new_block points to the symbol of a newly matched block. */ |
| 26 | extern gfc_symbol *gfc_new_block; |
| 27 | |
| 28 | /* Current statement label. Zero means no statement label. Because |
| 29 | new_st can get wiped during statement matching, we have to keep it |
| 30 | separate. */ |
| 31 | extern gfc_st_label *gfc_statement_label; |
| 32 | |
| 33 | extern int gfc_matching_ptr_assignment; |
| 34 | extern int gfc_matching_procptr_assignment; |
| 35 | extern bool gfc_matching_prefix; |
| 36 | |
| 37 | /* Default access specifier while matching procedure bindings. */ |
| 38 | extern gfc_access gfc_typebound_default_access; |
| 39 | |
| 40 | /****************** All gfc_match* routines *****************/ |
| 41 | |
| 42 | /* match.cc. */ |
| 43 | |
| 44 | /* Generic match subroutines. */ |
| 45 | match gfc_match_special_char (gfc_char_t *); |
| 46 | match gfc_match_space (void); |
| 47 | match gfc_match_eos (void); |
| 48 | match gfc_match_small_literal_int (int *, int *, bool = true); |
| 49 | match gfc_match_st_label (gfc_st_label **); |
| 50 | match gfc_match_small_int (int *); |
| 51 | match gfc_match_name (char *, bool = true); |
| 52 | match gfc_match_symbol (gfc_symbol **, int); |
| 53 | match gfc_match_sym_tree (gfc_symtree **, int); |
| 54 | match gfc_match_intrinsic_op (gfc_intrinsic_op *); |
| 55 | match gfc_match_char (char, bool = true); |
| 56 | match gfc_match (const char *, ...); |
| 57 | match gfc_match_iterator (gfc_iterator *, int); |
| 58 | match gfc_match_parens (void); |
| 59 | match gfc_match_type_spec (gfc_typespec *); |
| 60 | match gfc_match_member_sep(gfc_symbol *); |
| 61 | |
| 62 | |
| 63 | /* Statement matchers. */ |
| 64 | match gfc_match_program (void); |
| 65 | match gfc_match_pointer_assignment (void); |
| 66 | match gfc_match_assignment (void); |
| 67 | match gfc_match_if (gfc_statement *); |
| 68 | match gfc_match_else (void); |
| 69 | match gfc_match_elseif (void); |
| 70 | match gfc_match_event_post (void); |
| 71 | match gfc_match_event_wait (void); |
| 72 | match gfc_match_critical (void); |
| 73 | match gfc_match_fail_image (void); |
| 74 | match gfc_match_change_team (void); |
| 75 | match gfc_match_end_team (void); |
| 76 | match gfc_match_form_team (void); |
| 77 | match gfc_match_sync_team (void); |
| 78 | match gfc_match_block (void); |
| 79 | match gfc_match_associate (void); |
| 80 | match gfc_match_do (void); |
| 81 | match gfc_match_cycle (void); |
| 82 | match gfc_match_exit (void); |
| 83 | match gfc_match_lock (void); |
| 84 | match gfc_match_pause (void); |
| 85 | match gfc_match_stop (void); |
| 86 | match gfc_match_error_stop (void); |
| 87 | match gfc_match_continue (void); |
| 88 | match gfc_match_assign (void); |
| 89 | match gfc_match_goto (void); |
| 90 | match gfc_match_sync_all (void); |
| 91 | match gfc_match_sync_images (void); |
| 92 | match gfc_match_sync_memory (void); |
| 93 | match gfc_match_unlock (void); |
| 94 | |
| 95 | match gfc_match_allocate (void); |
| 96 | match gfc_match_nullify (void); |
| 97 | match gfc_match_deallocate (void); |
| 98 | match gfc_match_return (void); |
| 99 | match gfc_match_call (void); |
| 100 | |
| 101 | /* We want to use this function to check for a common-block-name |
| 102 | that can exist in a bind statement, so removed the "static" |
| 103 | declaration of the function in match.cc. */ |
| 104 | |
| 105 | match gfc_match_common_name (char *name); |
| 106 | |
| 107 | match gfc_match_common (void); |
| 108 | match gfc_match_block_data (void); |
| 109 | match gfc_match_namelist (void); |
| 110 | match gfc_match_module (void); |
| 111 | match gfc_match_equivalence (void); |
| 112 | match gfc_match_st_function (void); |
| 113 | match gfc_match_ptr_fcn_assign (void); |
| 114 | match gfc_match_case (void); |
| 115 | match gfc_match_select (void); |
| 116 | match gfc_match_select_type (void); |
| 117 | match gfc_match_type_is (void); |
| 118 | match gfc_match_class_is (void); |
| 119 | match gfc_match_select_rank (void); |
| 120 | match gfc_match_rank_is (void); |
| 121 | match gfc_match_where (gfc_statement *); |
| 122 | match gfc_match_elsewhere (void); |
| 123 | match gfc_match_forall (gfc_statement *); |
| 124 | |
| 125 | /* Other functions. */ |
| 126 | |
| 127 | gfc_common_head *gfc_get_common (const char *, int); |
| 128 | |
| 129 | /* openmp.cc. */ |
| 130 | |
| 131 | /* OpenACC directive matchers. */ |
| 132 | match gfc_match_oacc_atomic (void); |
| 133 | match gfc_match_oacc_cache (void); |
| 134 | match gfc_match_oacc_wait (void); |
| 135 | match gfc_match_oacc_update (void); |
| 136 | match gfc_match_oacc_declare (void); |
| 137 | match gfc_match_oacc_loop (void); |
| 138 | match gfc_match_oacc_host_data (void); |
| 139 | match gfc_match_oacc_data (void); |
| 140 | match gfc_match_oacc_kernels (void); |
| 141 | match gfc_match_oacc_kernels_loop (void); |
| 142 | match gfc_match_oacc_parallel (void); |
| 143 | match gfc_match_oacc_parallel_loop (void); |
| 144 | match gfc_match_oacc_serial (void); |
| 145 | match gfc_match_oacc_serial_loop (void); |
| 146 | match gfc_match_oacc_enter_data (void); |
| 147 | match gfc_match_oacc_exit_data (void); |
| 148 | match gfc_match_oacc_routine (void); |
| 149 | |
| 150 | /* OpenMP directive matchers. */ |
| 151 | match gfc_match_omp_eos_error (void); |
| 152 | match gfc_match_omp_allocate (void); |
| 153 | match gfc_match_omp_allocators (void); |
| 154 | match gfc_match_omp_assume (void); |
| 155 | match gfc_match_omp_assumes (void); |
| 156 | match gfc_match_omp_atomic (void); |
| 157 | match gfc_match_omp_barrier (void); |
| 158 | match gfc_match_omp_begin_metadirective (void); |
| 159 | match gfc_match_omp_cancel (void); |
| 160 | match gfc_match_omp_cancellation_point (void); |
| 161 | match gfc_match_omp_critical (void); |
| 162 | match gfc_match_omp_declare_reduction (void); |
| 163 | match gfc_match_omp_declare_simd (void); |
| 164 | match gfc_match_omp_declare_target (void); |
| 165 | match gfc_match_omp_declare_variant (void); |
| 166 | match gfc_match_omp_depobj (void); |
| 167 | match gfc_match_omp_dispatch (void); |
| 168 | match gfc_match_omp_distribute (void); |
| 169 | match gfc_match_omp_distribute_parallel_do (void); |
| 170 | match gfc_match_omp_distribute_parallel_do_simd (void); |
| 171 | match gfc_match_omp_distribute_simd (void); |
| 172 | match gfc_match_omp_do (void); |
| 173 | match gfc_match_omp_do_simd (void); |
| 174 | match gfc_match_omp_loop (void); |
| 175 | match gfc_match_omp_error (void); |
| 176 | match gfc_match_omp_flush (void); |
| 177 | match gfc_match_omp_groupprivate (void); |
| 178 | match gfc_match_omp_interop (void); |
| 179 | match gfc_match_omp_masked (void); |
| 180 | match gfc_match_omp_masked_taskloop (void); |
| 181 | match gfc_match_omp_masked_taskloop_simd (void); |
| 182 | match gfc_match_omp_master (void); |
| 183 | match gfc_match_omp_master_taskloop (void); |
| 184 | match gfc_match_omp_master_taskloop_simd (void); |
| 185 | match gfc_match_omp_metadirective (void); |
| 186 | match gfc_match_omp_nothing (void); |
| 187 | match gfc_match_omp_ordered (void); |
| 188 | match gfc_match_omp_ordered_depend (void); |
| 189 | match gfc_match_omp_parallel (void); |
| 190 | match gfc_match_omp_parallel_do (void); |
| 191 | match gfc_match_omp_parallel_do_simd (void); |
| 192 | match gfc_match_omp_parallel_loop (void); |
| 193 | match gfc_match_omp_parallel_masked (void); |
| 194 | match gfc_match_omp_parallel_masked_taskloop (void); |
| 195 | match gfc_match_omp_parallel_masked_taskloop_simd (void); |
| 196 | match gfc_match_omp_parallel_master (void); |
| 197 | match gfc_match_omp_parallel_master_taskloop (void); |
| 198 | match gfc_match_omp_parallel_master_taskloop_simd (void); |
| 199 | match gfc_match_omp_parallel_sections (void); |
| 200 | match gfc_match_omp_parallel_workshare (void); |
| 201 | match gfc_match_omp_requires (void); |
| 202 | match gfc_match_omp_scope (void); |
| 203 | match gfc_match_omp_scan (void); |
| 204 | match gfc_match_omp_sections (void); |
| 205 | match gfc_match_omp_simd (void); |
| 206 | match gfc_match_omp_single (void); |
| 207 | match gfc_match_omp_target (void); |
| 208 | match gfc_match_omp_target_data (void); |
| 209 | match gfc_match_omp_target_enter_data (void); |
| 210 | match gfc_match_omp_target_exit_data (void); |
| 211 | match gfc_match_omp_target_parallel (void); |
| 212 | match gfc_match_omp_target_parallel_do (void); |
| 213 | match gfc_match_omp_target_parallel_do_simd (void); |
| 214 | match gfc_match_omp_target_parallel_loop (void); |
| 215 | match gfc_match_omp_target_simd (void); |
| 216 | match gfc_match_omp_target_teams (void); |
| 217 | match gfc_match_omp_target_teams_distribute (void); |
| 218 | match gfc_match_omp_target_teams_distribute_parallel_do (void); |
| 219 | match gfc_match_omp_target_teams_distribute_parallel_do_simd (void); |
| 220 | match gfc_match_omp_target_teams_distribute_simd (void); |
| 221 | match gfc_match_omp_target_teams_loop (void); |
| 222 | match gfc_match_omp_target_update (void); |
| 223 | match gfc_match_omp_task (void); |
| 224 | match gfc_match_omp_taskgroup (void); |
| 225 | match gfc_match_omp_taskloop (void); |
| 226 | match gfc_match_omp_taskloop_simd (void); |
| 227 | match gfc_match_omp_taskwait (void); |
| 228 | match gfc_match_omp_taskyield (void); |
| 229 | match gfc_match_omp_teams (void); |
| 230 | match gfc_match_omp_teams_distribute (void); |
| 231 | match gfc_match_omp_teams_distribute_parallel_do (void); |
| 232 | match gfc_match_omp_teams_distribute_parallel_do_simd (void); |
| 233 | match gfc_match_omp_teams_distribute_simd (void); |
| 234 | match gfc_match_omp_teams_loop (void); |
| 235 | match gfc_match_omp_threadprivate (void); |
| 236 | match gfc_match_omp_tile (void); |
| 237 | match gfc_match_omp_unroll (void); |
| 238 | match gfc_match_omp_workshare (void); |
| 239 | match gfc_match_omp_end_critical (void); |
| 240 | match gfc_match_omp_end_nowait (void); |
| 241 | match gfc_match_omp_end_single (void); |
| 242 | |
| 243 | /* decl.cc. */ |
| 244 | |
| 245 | match gfc_match_data (void); |
| 246 | match gfc_match_null (gfc_expr **); |
| 247 | match gfc_match_kind_spec (gfc_typespec *, bool); |
| 248 | match gfc_match_decl_type_spec (gfc_typespec *, int); |
| 249 | |
| 250 | match gfc_match_end (gfc_statement *); |
| 251 | match gfc_match_data_decl (void); |
| 252 | match gfc_match_formal_arglist (gfc_symbol *, int, int, bool = false); |
| 253 | match gfc_match_procedure (void); |
| 254 | match gfc_match_generic (void); |
| 255 | match gfc_match_function_decl (void); |
| 256 | match gfc_match_entry (void); |
| 257 | match gfc_match_subroutine (void); |
| 258 | match gfc_match_submod_proc (void); |
| 259 | match gfc_match_map (void); |
| 260 | match gfc_match_union (void); |
| 261 | match gfc_match_structure_decl (void); |
| 262 | match gfc_match_derived_decl (void); |
| 263 | match gfc_match_final_decl (void); |
| 264 | match gfc_match_type (gfc_statement *); |
| 265 | |
| 266 | match gfc_match_implicit_none (void); |
| 267 | match gfc_match_implicit (void); |
| 268 | |
| 269 | void gfc_set_constant_character_len (gfc_charlen_t, gfc_expr *, |
| 270 | gfc_charlen_t); |
| 271 | |
| 272 | /* Matchers for attribute declarations. */ |
| 273 | match gfc_match_allocatable (void); |
| 274 | match gfc_match_asynchronous (void); |
| 275 | match gfc_match_automatic (void); |
| 276 | match gfc_match_codimension (void); |
| 277 | match gfc_match_contiguous (void); |
| 278 | match gfc_match_dimension (void); |
| 279 | match gfc_match_external (void); |
| 280 | match gfc_match_gcc_attributes (void); |
| 281 | match gfc_match_gcc_builtin (void); |
| 282 | match gfc_match_gcc_ivdep (void); |
| 283 | match gfc_match_gcc_novector (void); |
| 284 | match gfc_match_gcc_unroll (void); |
| 285 | match gfc_match_gcc_vector (void); |
| 286 | match gfc_match_import (void); |
| 287 | match gfc_match_intent (void); |
| 288 | match gfc_match_intrinsic (void); |
| 289 | match gfc_match_optional (void); |
| 290 | match gfc_match_parameter (void); |
| 291 | match gfc_match_pointer (void); |
| 292 | match gfc_match_protected (void); |
| 293 | match gfc_match_private (gfc_statement *); |
| 294 | match gfc_match_public (gfc_statement *); |
| 295 | match gfc_match_save (void); |
| 296 | match gfc_match_static (void); |
| 297 | match gfc_match_modproc (void); |
| 298 | match gfc_match_target (void); |
| 299 | match gfc_match_value (void); |
| 300 | match gfc_match_volatile (void); |
| 301 | |
| 302 | /* decl.cc. */ |
| 303 | |
| 304 | /* Fortran 2003 c interop. |
| 305 | TODO: some of these should be moved to another file rather than decl.cc */ |
| 306 | match gfc_match_bind_c_stmt (void); |
| 307 | match gfc_match_bind_c (gfc_symbol *, bool); |
| 308 | |
| 309 | /* primary.cc. */ |
| 310 | match gfc_match_structure_constructor (gfc_symbol *, gfc_symtree *, gfc_expr **); |
| 311 | match gfc_match_variable (gfc_expr **, int); |
| 312 | match gfc_match_equiv_variable (gfc_expr **); |
| 313 | match gfc_match_actual_arglist (int, gfc_actual_arglist **, bool = false); |
| 314 | match gfc_match_literal_constant (gfc_expr **, int); |
| 315 | |
| 316 | /* expr.cc -- FIXME: this one should be eliminated by moving the |
| 317 | matcher to matchexp.cc and a call to a new function in expr.cc that |
| 318 | only makes sure the init expr. is valid. */ |
| 319 | bool gfc_reduce_init_expr (gfc_expr *expr); |
| 320 | match gfc_match_init_expr (gfc_expr **); |
| 321 | |
| 322 | /* array.cc. */ |
| 323 | match gfc_match_array_spec (gfc_array_spec **, bool, bool); |
| 324 | match gfc_match_array_ref (gfc_array_ref *, gfc_array_spec *, int, int, |
| 325 | bool = false); |
| 326 | match gfc_match_array_constructor (gfc_expr **); |
| 327 | |
| 328 | /* interface.cc. */ |
| 329 | match gfc_match_abstract_interface (void); |
| 330 | match gfc_match_generic_spec (interface_type *, char *, gfc_intrinsic_op *); |
| 331 | match gfc_match_interface (void); |
| 332 | match gfc_match_end_interface (void); |
| 333 | |
| 334 | /* io.cc. */ |
| 335 | match gfc_match_format (void); |
| 336 | match gfc_match_open (void); |
| 337 | match gfc_match_close (void); |
| 338 | match gfc_match_endfile (void); |
| 339 | match gfc_match_backspace (void); |
| 340 | match gfc_match_rewind (void); |
| 341 | match gfc_match_flush (void); |
| 342 | match gfc_match_inquire (void); |
| 343 | match gfc_match_read (void); |
| 344 | match gfc_match_wait (void); |
| 345 | match gfc_match_write (void); |
| 346 | match gfc_match_print (void); |
| 347 | |
| 348 | /* matchexp.cc. */ |
| 349 | match gfc_match_defined_op_name (char *, int); |
| 350 | match gfc_match_expr (gfc_expr **); |
| 351 | |
| 352 | /* module.cc. */ |
| 353 | match gfc_match_use (void); |
| 354 | match gfc_match_submodule (void); |
| 355 | void gfc_use_modules (void); |
| 356 | |
| 357 | #endif /* GFC_MATCH_H */ |
| 358 | |
| 359 | |