1 /* Matching subroutines in all sizes, shapes and colors.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4 Free Software Foundation, Inc.
5 Contributed by Andy Vaught
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
30 int gfc_matching_ptr_assignment
= 0;
31 int gfc_matching_procptr_assignment
= 0;
32 bool gfc_matching_prefix
= false;
34 /* Stack of SELECT TYPE statements. */
35 gfc_select_type_stack
*select_type_stack
= NULL
;
37 /* For debugging and diagnostic purposes. Return the textual representation
38 of the intrinsic operator OP. */
40 gfc_op2string (gfc_intrinsic_op op
)
48 case INTRINSIC_UMINUS
:
54 case INTRINSIC_CONCAT
:
58 case INTRINSIC_DIVIDE
:
97 case INTRINSIC_ASSIGN
:
100 case INTRINSIC_PARENTHESES
:
107 gfc_internal_error ("gfc_op2string(): Bad code");
112 /******************** Generic matching subroutines ************************/
114 /* This function scans the current statement counting the opened and closed
115 parenthesis to make sure they are balanced. */
118 gfc_match_parens (void)
120 locus old_loc
, where
;
122 gfc_instring instring
;
125 old_loc
= gfc_current_locus
;
127 instring
= NONSTRING
;
132 c
= gfc_next_char_literal (instring
);
135 if (quote
== ' ' && ((c
== '\'') || (c
== '"')))
138 instring
= INSTRING_WARN
;
141 if (quote
!= ' ' && c
== quote
)
144 instring
= NONSTRING
;
148 if (c
== '(' && quote
== ' ')
151 where
= gfc_current_locus
;
153 if (c
== ')' && quote
== ' ')
156 where
= gfc_current_locus
;
160 gfc_current_locus
= old_loc
;
164 gfc_error ("Missing ')' in statement at or before %L", &where
);
169 gfc_error ("Missing '(' in statement at or before %L", &where
);
177 /* See if the next character is a special character that has
178 escaped by a \ via the -fbackslash option. */
181 gfc_match_special_char (gfc_char_t
*res
)
189 switch ((c
= gfc_next_char_literal (INSTRING_WARN
)))
222 /* Hexadecimal form of wide characters. */
223 len
= (c
== 'x' ? 2 : (c
== 'u' ? 4 : 8));
225 for (i
= 0; i
< len
; i
++)
227 char buf
[2] = { '\0', '\0' };
229 c
= gfc_next_char_literal (INSTRING_WARN
);
230 if (!gfc_wide_fits_in_byte (c
)
231 || !gfc_check_digit ((unsigned char) c
, 16))
234 buf
[0] = (unsigned char) c
;
236 n
+= strtol (buf
, NULL
, 16);
242 /* Unknown backslash codes are simply not expanded. */
251 /* In free form, match at least one space. Always matches in fixed
255 gfc_match_space (void)
260 if (gfc_current_form
== FORM_FIXED
)
263 old_loc
= gfc_current_locus
;
265 c
= gfc_next_ascii_char ();
266 if (!gfc_is_whitespace (c
))
268 gfc_current_locus
= old_loc
;
272 gfc_gobble_whitespace ();
278 /* Match an end of statement. End of statement is optional
279 whitespace, followed by a ';' or '\n' or comment '!'. If a
280 semicolon is found, we continue to eat whitespace and semicolons. */
293 old_loc
= gfc_current_locus
;
294 gfc_gobble_whitespace ();
296 c
= gfc_next_ascii_char ();
302 c
= gfc_next_ascii_char ();
319 gfc_current_locus
= old_loc
;
320 return (flag
) ? MATCH_YES
: MATCH_NO
;
324 /* Match a literal integer on the input, setting the value on
325 MATCH_YES. Literal ints occur in kind-parameters as well as
326 old-style character length specifications. If cnt is non-NULL it
327 will be set to the number of digits. */
330 gfc_match_small_literal_int (int *value
, int *cnt
)
336 old_loc
= gfc_current_locus
;
339 gfc_gobble_whitespace ();
340 c
= gfc_next_ascii_char ();
346 gfc_current_locus
= old_loc
;
355 old_loc
= gfc_current_locus
;
356 c
= gfc_next_ascii_char ();
361 i
= 10 * i
+ c
- '0';
366 gfc_error ("Integer too large at %C");
371 gfc_current_locus
= old_loc
;
380 /* Match a small, constant integer expression, like in a kind
381 statement. On MATCH_YES, 'value' is set. */
384 gfc_match_small_int (int *value
)
391 m
= gfc_match_expr (&expr
);
395 p
= gfc_extract_int (expr
, &i
);
396 gfc_free_expr (expr
);
409 /* This function is the same as the gfc_match_small_int, except that
410 we're keeping the pointer to the expr. This function could just be
411 removed and the previously mentioned one modified, though all calls
412 to it would have to be modified then (and there were a number of
413 them). Return MATCH_ERROR if fail to extract the int; otherwise,
414 return the result of gfc_match_expr(). The expr (if any) that was
415 matched is returned in the parameter expr. */
418 gfc_match_small_int_expr (int *value
, gfc_expr
**expr
)
424 m
= gfc_match_expr (expr
);
428 p
= gfc_extract_int (*expr
, &i
);
441 /* Matches a statement label. Uses gfc_match_small_literal_int() to
442 do most of the work. */
445 gfc_match_st_label (gfc_st_label
**label
)
451 old_loc
= gfc_current_locus
;
453 m
= gfc_match_small_literal_int (&i
, &cnt
);
459 gfc_error ("Too many digits in statement label at %C");
465 gfc_error ("Statement label at %C is zero");
469 *label
= gfc_get_st_label (i
);
474 gfc_current_locus
= old_loc
;
479 /* Match and validate a label associated with a named IF, DO or SELECT
480 statement. If the symbol does not have the label attribute, we add
481 it. We also make sure the symbol does not refer to another
482 (active) block. A matched label is pointed to by gfc_new_block. */
485 gfc_match_label (void)
487 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
490 gfc_new_block
= NULL
;
492 m
= gfc_match (" %n :", name
);
496 if (gfc_get_symbol (name
, NULL
, &gfc_new_block
))
498 gfc_error ("Label name '%s' at %C is ambiguous", name
);
502 if (gfc_new_block
->attr
.flavor
== FL_LABEL
)
504 gfc_error ("Duplicate construct label '%s' at %C", name
);
508 if (gfc_add_flavor (&gfc_new_block
->attr
, FL_LABEL
,
509 gfc_new_block
->name
, NULL
) == FAILURE
)
516 /* See if the current input looks like a name of some sort. Modifies
517 the passed buffer which must be GFC_MAX_SYMBOL_LEN+1 bytes long.
518 Note that options.c restricts max_identifier_length to not more
519 than GFC_MAX_SYMBOL_LEN. */
522 gfc_match_name (char *buffer
)
528 old_loc
= gfc_current_locus
;
529 gfc_gobble_whitespace ();
531 c
= gfc_next_ascii_char ();
532 if (!(ISALPHA (c
) || (c
== '_' && gfc_option
.flag_allow_leading_underscore
)))
534 if (gfc_error_flag_test() == 0 && c
!= '(')
535 gfc_error ("Invalid character in name at %C");
536 gfc_current_locus
= old_loc
;
546 if (i
> gfc_option
.max_identifier_length
)
548 gfc_error ("Name at %C is too long");
552 old_loc
= gfc_current_locus
;
553 c
= gfc_next_ascii_char ();
555 while (ISALNUM (c
) || c
== '_' || (gfc_option
.flag_dollar_ok
&& c
== '$'));
557 if (c
== '$' && !gfc_option
.flag_dollar_ok
)
559 gfc_error ("Invalid character '$' at %C. Use -fdollar-ok to allow it "
565 gfc_current_locus
= old_loc
;
571 /* Match a valid name for C, which is almost the same as for Fortran,
572 except that you can start with an underscore, etc.. It could have
573 been done by modifying the gfc_match_name, but this way other
574 things C allows can be added, such as no limits on the length.
575 Right now, the length is limited to the same thing as Fortran..
576 Also, by rewriting it, we use the gfc_next_char_C() to prevent the
577 input characters from being automatically lower cased, since C is
578 case sensitive. The parameter, buffer, is used to return the name
579 that is matched. Return MATCH_ERROR if the name is too long
580 (though this is a self-imposed limit), MATCH_NO if what we're
581 seeing isn't a name, and MATCH_YES if we successfully match a C
585 gfc_match_name_C (char *buffer
)
591 old_loc
= gfc_current_locus
;
592 gfc_gobble_whitespace ();
594 /* Get the next char (first possible char of name) and see if
595 it's valid for C (either a letter or an underscore). */
596 c
= gfc_next_char_literal (INSTRING_WARN
);
598 /* If the user put nothing expect spaces between the quotes, it is valid
599 and simply means there is no name= specifier and the name is the fortran
600 symbol name, all lowercase. */
601 if (c
== '"' || c
== '\'')
604 gfc_current_locus
= old_loc
;
608 if (!ISALPHA (c
) && c
!= '_')
610 gfc_error ("Invalid C name in NAME= specifier at %C");
614 /* Continue to read valid variable name characters. */
617 gcc_assert (gfc_wide_fits_in_byte (c
));
619 buffer
[i
++] = (unsigned char) c
;
621 /* C does not define a maximum length of variable names, to my
622 knowledge, but the compiler typically places a limit on them.
623 For now, i'll use the same as the fortran limit for simplicity,
624 but this may need to be changed to a dynamic buffer that can
625 be realloc'ed here if necessary, or more likely, a larger
627 if (i
> gfc_option
.max_identifier_length
)
629 gfc_error ("Name at %C is too long");
633 old_loc
= gfc_current_locus
;
635 /* Get next char; param means we're in a string. */
636 c
= gfc_next_char_literal (INSTRING_WARN
);
637 } while (ISALNUM (c
) || c
== '_');
640 gfc_current_locus
= old_loc
;
642 /* See if we stopped because of whitespace. */
645 gfc_gobble_whitespace ();
646 c
= gfc_peek_ascii_char ();
647 if (c
!= '"' && c
!= '\'')
649 gfc_error ("Embedded space in NAME= specifier at %C");
654 /* If we stopped because we had an invalid character for a C name, report
655 that to the user by returning MATCH_NO. */
656 if (c
!= '"' && c
!= '\'')
658 gfc_error ("Invalid C name in NAME= specifier at %C");
666 /* Match a symbol on the input. Modifies the pointer to the symbol
667 pointer if successful. */
670 gfc_match_sym_tree (gfc_symtree
**matched_symbol
, int host_assoc
)
672 char buffer
[GFC_MAX_SYMBOL_LEN
+ 1];
675 m
= gfc_match_name (buffer
);
680 return (gfc_get_ha_sym_tree (buffer
, matched_symbol
))
681 ? MATCH_ERROR
: MATCH_YES
;
683 if (gfc_get_sym_tree (buffer
, NULL
, matched_symbol
, false))
691 gfc_match_symbol (gfc_symbol
**matched_symbol
, int host_assoc
)
696 m
= gfc_match_sym_tree (&st
, host_assoc
);
701 *matched_symbol
= st
->n
.sym
;
703 *matched_symbol
= NULL
;
706 *matched_symbol
= NULL
;
711 /* Match an intrinsic operator. Returns an INTRINSIC enum. While matching,
712 we always find INTRINSIC_PLUS before INTRINSIC_UPLUS. We work around this
716 gfc_match_intrinsic_op (gfc_intrinsic_op
*result
)
718 locus orig_loc
= gfc_current_locus
;
721 gfc_gobble_whitespace ();
722 ch
= gfc_next_ascii_char ();
727 *result
= INTRINSIC_PLUS
;
732 *result
= INTRINSIC_MINUS
;
736 if (gfc_next_ascii_char () == '=')
739 *result
= INTRINSIC_EQ
;
745 if (gfc_peek_ascii_char () == '=')
748 gfc_next_ascii_char ();
749 *result
= INTRINSIC_LE
;
753 *result
= INTRINSIC_LT
;
757 if (gfc_peek_ascii_char () == '=')
760 gfc_next_ascii_char ();
761 *result
= INTRINSIC_GE
;
765 *result
= INTRINSIC_GT
;
769 if (gfc_peek_ascii_char () == '*')
772 gfc_next_ascii_char ();
773 *result
= INTRINSIC_POWER
;
777 *result
= INTRINSIC_TIMES
;
781 ch
= gfc_peek_ascii_char ();
785 gfc_next_ascii_char ();
786 *result
= INTRINSIC_NE
;
792 gfc_next_ascii_char ();
793 *result
= INTRINSIC_CONCAT
;
797 *result
= INTRINSIC_DIVIDE
;
801 ch
= gfc_next_ascii_char ();
805 if (gfc_next_ascii_char () == 'n'
806 && gfc_next_ascii_char () == 'd'
807 && gfc_next_ascii_char () == '.')
809 /* Matched ".and.". */
810 *result
= INTRINSIC_AND
;
816 if (gfc_next_ascii_char () == 'q')
818 ch
= gfc_next_ascii_char ();
821 /* Matched ".eq.". */
822 *result
= INTRINSIC_EQ_OS
;
827 if (gfc_next_ascii_char () == '.')
829 /* Matched ".eqv.". */
830 *result
= INTRINSIC_EQV
;
838 ch
= gfc_next_ascii_char ();
841 if (gfc_next_ascii_char () == '.')
843 /* Matched ".ge.". */
844 *result
= INTRINSIC_GE_OS
;
850 if (gfc_next_ascii_char () == '.')
852 /* Matched ".gt.". */
853 *result
= INTRINSIC_GT_OS
;
860 ch
= gfc_next_ascii_char ();
863 if (gfc_next_ascii_char () == '.')
865 /* Matched ".le.". */
866 *result
= INTRINSIC_LE_OS
;
872 if (gfc_next_ascii_char () == '.')
874 /* Matched ".lt.". */
875 *result
= INTRINSIC_LT_OS
;
882 ch
= gfc_next_ascii_char ();
885 ch
= gfc_next_ascii_char ();
888 /* Matched ".ne.". */
889 *result
= INTRINSIC_NE_OS
;
894 if (gfc_next_ascii_char () == 'v'
895 && gfc_next_ascii_char () == '.')
897 /* Matched ".neqv.". */
898 *result
= INTRINSIC_NEQV
;
905 if (gfc_next_ascii_char () == 't'
906 && gfc_next_ascii_char () == '.')
908 /* Matched ".not.". */
909 *result
= INTRINSIC_NOT
;
916 if (gfc_next_ascii_char () == 'r'
917 && gfc_next_ascii_char () == '.')
919 /* Matched ".or.". */
920 *result
= INTRINSIC_OR
;
934 gfc_current_locus
= orig_loc
;
939 /* Match a loop control phrase:
941 <LVALUE> = <EXPR>, <EXPR> [, <EXPR> ]
943 If the final integer expression is not present, a constant unity
944 expression is returned. We don't return MATCH_ERROR until after
945 the equals sign is seen. */
948 gfc_match_iterator (gfc_iterator
*iter
, int init_flag
)
950 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
951 gfc_expr
*var
, *e1
, *e2
, *e3
;
957 /* Match the start of an iterator without affecting the symbol table. */
959 start
= gfc_current_locus
;
960 m
= gfc_match (" %n =", name
);
961 gfc_current_locus
= start
;
966 m
= gfc_match_variable (&var
, 0);
970 /* F2008, C617 & C565. */
971 if (var
->symtree
->n
.sym
->attr
.codimension
)
973 gfc_error ("Loop variable at %C cannot be a coarray");
977 if (var
->ref
!= NULL
)
979 gfc_error ("Loop variable at %C cannot be a sub-component");
983 gfc_match_char ('=');
985 var
->symtree
->n
.sym
->attr
.implied_index
= 1;
987 m
= init_flag
? gfc_match_init_expr (&e1
) : gfc_match_expr (&e1
);
990 if (m
== MATCH_ERROR
)
993 if (gfc_match_char (',') != MATCH_YES
)
996 m
= init_flag
? gfc_match_init_expr (&e2
) : gfc_match_expr (&e2
);
999 if (m
== MATCH_ERROR
)
1002 if (gfc_match_char (',') != MATCH_YES
)
1004 e3
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, 1);
1008 m
= init_flag
? gfc_match_init_expr (&e3
) : gfc_match_expr (&e3
);
1009 if (m
== MATCH_ERROR
)
1013 gfc_error ("Expected a step value in iterator at %C");
1025 gfc_error ("Syntax error in iterator at %C");
1036 /* Tries to match the next non-whitespace character on the input.
1037 This subroutine does not return MATCH_ERROR. */
1040 gfc_match_char (char c
)
1044 where
= gfc_current_locus
;
1045 gfc_gobble_whitespace ();
1047 if (gfc_next_ascii_char () == c
)
1050 gfc_current_locus
= where
;
1055 /* General purpose matching subroutine. The target string is a
1056 scanf-like format string in which spaces correspond to arbitrary
1057 whitespace (including no whitespace), characters correspond to
1058 themselves. The %-codes are:
1060 %% Literal percent sign
1061 %e Expression, pointer to a pointer is set
1062 %s Symbol, pointer to the symbol is set
1063 %n Name, character buffer is set to name
1064 %t Matches end of statement.
1065 %o Matches an intrinsic operator, returned as an INTRINSIC enum.
1066 %l Matches a statement label
1067 %v Matches a variable expression (an lvalue)
1068 % Matches a required space (in free form) and optional spaces. */
1071 gfc_match (const char *target
, ...)
1073 gfc_st_label
**label
;
1082 old_loc
= gfc_current_locus
;
1083 va_start (argp
, target
);
1093 gfc_gobble_whitespace ();
1104 vp
= va_arg (argp
, void **);
1105 n
= gfc_match_expr ((gfc_expr
**) vp
);
1116 vp
= va_arg (argp
, void **);
1117 n
= gfc_match_variable ((gfc_expr
**) vp
, 0);
1128 vp
= va_arg (argp
, void **);
1129 n
= gfc_match_symbol ((gfc_symbol
**) vp
, 0);
1140 np
= va_arg (argp
, char *);
1141 n
= gfc_match_name (np
);
1152 label
= va_arg (argp
, gfc_st_label
**);
1153 n
= gfc_match_st_label (label
);
1164 ip
= va_arg (argp
, int *);
1165 n
= gfc_match_intrinsic_op ((gfc_intrinsic_op
*) ip
);
1176 if (gfc_match_eos () != MATCH_YES
)
1184 if (gfc_match_space () == MATCH_YES
)
1190 break; /* Fall through to character matcher. */
1193 gfc_internal_error ("gfc_match(): Bad match code %c", c
);
1198 /* gfc_next_ascii_char converts characters to lower-case, so we shouldn't
1199 expect an upper case character here! */
1200 gcc_assert (TOLOWER (c
) == c
);
1202 if (c
== gfc_next_ascii_char ())
1212 /* Clean up after a failed match. */
1213 gfc_current_locus
= old_loc
;
1214 va_start (argp
, target
);
1217 for (; matches
> 0; matches
--)
1219 while (*p
++ != '%');
1227 /* Matches that don't have to be undone */
1232 (void) va_arg (argp
, void **);
1237 vp
= va_arg (argp
, void **);
1238 gfc_free_expr ((struct gfc_expr
*)*vp
);
1251 /*********************** Statement level matching **********************/
1253 /* Matches the start of a program unit, which is the program keyword
1254 followed by an obligatory symbol. */
1257 gfc_match_program (void)
1262 m
= gfc_match ("% %s%t", &sym
);
1266 gfc_error ("Invalid form of PROGRAM statement at %C");
1270 if (m
== MATCH_ERROR
)
1273 if (gfc_add_flavor (&sym
->attr
, FL_PROGRAM
, sym
->name
, NULL
) == FAILURE
)
1276 gfc_new_block
= sym
;
1282 /* Match a simple assignment statement. */
1285 gfc_match_assignment (void)
1287 gfc_expr
*lvalue
, *rvalue
;
1291 old_loc
= gfc_current_locus
;
1294 m
= gfc_match (" %v =", &lvalue
);
1297 gfc_current_locus
= old_loc
;
1298 gfc_free_expr (lvalue
);
1303 m
= gfc_match (" %e%t", &rvalue
);
1306 gfc_current_locus
= old_loc
;
1307 gfc_free_expr (lvalue
);
1308 gfc_free_expr (rvalue
);
1312 gfc_set_sym_referenced (lvalue
->symtree
->n
.sym
);
1314 new_st
.op
= EXEC_ASSIGN
;
1315 new_st
.expr1
= lvalue
;
1316 new_st
.expr2
= rvalue
;
1318 gfc_check_do_variable (lvalue
->symtree
);
1324 /* Match a pointer assignment statement. */
1327 gfc_match_pointer_assignment (void)
1329 gfc_expr
*lvalue
, *rvalue
;
1333 old_loc
= gfc_current_locus
;
1335 lvalue
= rvalue
= NULL
;
1336 gfc_matching_ptr_assignment
= 0;
1337 gfc_matching_procptr_assignment
= 0;
1339 m
= gfc_match (" %v =>", &lvalue
);
1346 if (lvalue
->symtree
->n
.sym
->attr
.proc_pointer
1347 || gfc_is_proc_ptr_comp (lvalue
, NULL
))
1348 gfc_matching_procptr_assignment
= 1;
1350 gfc_matching_ptr_assignment
= 1;
1352 m
= gfc_match (" %e%t", &rvalue
);
1353 gfc_matching_ptr_assignment
= 0;
1354 gfc_matching_procptr_assignment
= 0;
1358 new_st
.op
= EXEC_POINTER_ASSIGN
;
1359 new_st
.expr1
= lvalue
;
1360 new_st
.expr2
= rvalue
;
1365 gfc_current_locus
= old_loc
;
1366 gfc_free_expr (lvalue
);
1367 gfc_free_expr (rvalue
);
1372 /* We try to match an easy arithmetic IF statement. This only happens
1373 when just after having encountered a simple IF statement. This code
1374 is really duplicate with parts of the gfc_match_if code, but this is
1378 match_arithmetic_if (void)
1380 gfc_st_label
*l1
, *l2
, *l3
;
1384 m
= gfc_match (" ( %e ) %l , %l , %l%t", &expr
, &l1
, &l2
, &l3
);
1388 if (gfc_reference_st_label (l1
, ST_LABEL_TARGET
) == FAILURE
1389 || gfc_reference_st_label (l2
, ST_LABEL_TARGET
) == FAILURE
1390 || gfc_reference_st_label (l3
, ST_LABEL_TARGET
) == FAILURE
)
1392 gfc_free_expr (expr
);
1396 if (gfc_notify_std (GFC_STD_F95_OBS
, "Obsolescent feature: Arithmetic IF "
1397 "statement at %C") == FAILURE
)
1400 new_st
.op
= EXEC_ARITHMETIC_IF
;
1401 new_st
.expr1
= expr
;
1410 /* The IF statement is a bit of a pain. First of all, there are three
1411 forms of it, the simple IF, the IF that starts a block and the
1414 There is a problem with the simple IF and that is the fact that we
1415 only have a single level of undo information on symbols. What this
1416 means is for a simple IF, we must re-match the whole IF statement
1417 multiple times in order to guarantee that the symbol table ends up
1418 in the proper state. */
1420 static match
match_simple_forall (void);
1421 static match
match_simple_where (void);
1424 gfc_match_if (gfc_statement
*if_type
)
1427 gfc_st_label
*l1
, *l2
, *l3
;
1428 locus old_loc
, old_loc2
;
1432 n
= gfc_match_label ();
1433 if (n
== MATCH_ERROR
)
1436 old_loc
= gfc_current_locus
;
1438 m
= gfc_match (" if ( %e", &expr
);
1442 old_loc2
= gfc_current_locus
;
1443 gfc_current_locus
= old_loc
;
1445 if (gfc_match_parens () == MATCH_ERROR
)
1448 gfc_current_locus
= old_loc2
;
1450 if (gfc_match_char (')') != MATCH_YES
)
1452 gfc_error ("Syntax error in IF-expression at %C");
1453 gfc_free_expr (expr
);
1457 m
= gfc_match (" %l , %l , %l%t", &l1
, &l2
, &l3
);
1463 gfc_error ("Block label not appropriate for arithmetic IF "
1465 gfc_free_expr (expr
);
1469 if (gfc_reference_st_label (l1
, ST_LABEL_TARGET
) == FAILURE
1470 || gfc_reference_st_label (l2
, ST_LABEL_TARGET
) == FAILURE
1471 || gfc_reference_st_label (l3
, ST_LABEL_TARGET
) == FAILURE
)
1473 gfc_free_expr (expr
);
1477 if (gfc_notify_std (GFC_STD_F95_OBS
, "Obsolescent feature: Arithmetic IF "
1478 "statement at %C") == FAILURE
)
1481 new_st
.op
= EXEC_ARITHMETIC_IF
;
1482 new_st
.expr1
= expr
;
1487 *if_type
= ST_ARITHMETIC_IF
;
1491 if (gfc_match (" then%t") == MATCH_YES
)
1493 new_st
.op
= EXEC_IF
;
1494 new_st
.expr1
= expr
;
1495 *if_type
= ST_IF_BLOCK
;
1501 gfc_error ("Block label is not appropriate for IF statement at %C");
1502 gfc_free_expr (expr
);
1506 /* At this point the only thing left is a simple IF statement. At
1507 this point, n has to be MATCH_NO, so we don't have to worry about
1508 re-matching a block label. From what we've got so far, try
1509 matching an assignment. */
1511 *if_type
= ST_SIMPLE_IF
;
1513 m
= gfc_match_assignment ();
1517 gfc_free_expr (expr
);
1518 gfc_undo_symbols ();
1519 gfc_current_locus
= old_loc
;
1521 /* m can be MATCH_NO or MATCH_ERROR, here. For MATCH_ERROR, a mangled
1522 assignment was found. For MATCH_NO, continue to call the various
1524 if (m
== MATCH_ERROR
)
1527 gfc_match (" if ( %e ) ", &expr
); /* Guaranteed to match. */
1529 m
= gfc_match_pointer_assignment ();
1533 gfc_free_expr (expr
);
1534 gfc_undo_symbols ();
1535 gfc_current_locus
= old_loc
;
1537 gfc_match (" if ( %e ) ", &expr
); /* Guaranteed to match. */
1539 /* Look at the next keyword to see which matcher to call. Matching
1540 the keyword doesn't affect the symbol table, so we don't have to
1541 restore between tries. */
1543 #define match(string, subr, statement) \
1544 if (gfc_match(string) == MATCH_YES) { m = subr(); goto got_match; }
1548 match ("allocate", gfc_match_allocate
, ST_ALLOCATE
)
1549 match ("assign", gfc_match_assign
, ST_LABEL_ASSIGNMENT
)
1550 match ("backspace", gfc_match_backspace
, ST_BACKSPACE
)
1551 match ("call", gfc_match_call
, ST_CALL
)
1552 match ("close", gfc_match_close
, ST_CLOSE
)
1553 match ("continue", gfc_match_continue
, ST_CONTINUE
)
1554 match ("cycle", gfc_match_cycle
, ST_CYCLE
)
1555 match ("deallocate", gfc_match_deallocate
, ST_DEALLOCATE
)
1556 match ("end file", gfc_match_endfile
, ST_END_FILE
)
1557 match ("error stop", gfc_match_error_stop
, ST_ERROR_STOP
)
1558 match ("exit", gfc_match_exit
, ST_EXIT
)
1559 match ("flush", gfc_match_flush
, ST_FLUSH
)
1560 match ("forall", match_simple_forall
, ST_FORALL
)
1561 match ("go to", gfc_match_goto
, ST_GOTO
)
1562 match ("if", match_arithmetic_if
, ST_ARITHMETIC_IF
)
1563 match ("inquire", gfc_match_inquire
, ST_INQUIRE
)
1564 match ("lock", gfc_match_lock
, ST_LOCK
)
1565 match ("nullify", gfc_match_nullify
, ST_NULLIFY
)
1566 match ("open", gfc_match_open
, ST_OPEN
)
1567 match ("pause", gfc_match_pause
, ST_NONE
)
1568 match ("print", gfc_match_print
, ST_WRITE
)
1569 match ("read", gfc_match_read
, ST_READ
)
1570 match ("return", gfc_match_return
, ST_RETURN
)
1571 match ("rewind", gfc_match_rewind
, ST_REWIND
)
1572 match ("stop", gfc_match_stop
, ST_STOP
)
1573 match ("wait", gfc_match_wait
, ST_WAIT
)
1574 match ("sync all", gfc_match_sync_all
, ST_SYNC_CALL
);
1575 match ("sync images", gfc_match_sync_images
, ST_SYNC_IMAGES
);
1576 match ("sync memory", gfc_match_sync_memory
, ST_SYNC_MEMORY
);
1577 match ("unlock", gfc_match_unlock
, ST_UNLOCK
)
1578 match ("where", match_simple_where
, ST_WHERE
)
1579 match ("write", gfc_match_write
, ST_WRITE
)
1581 /* The gfc_match_assignment() above may have returned a MATCH_NO
1582 where the assignment was to a named constant. Check that
1583 special case here. */
1584 m
= gfc_match_assignment ();
1587 gfc_error ("Cannot assign to a named constant at %C");
1588 gfc_free_expr (expr
);
1589 gfc_undo_symbols ();
1590 gfc_current_locus
= old_loc
;
1594 /* All else has failed, so give up. See if any of the matchers has
1595 stored an error message of some sort. */
1596 if (gfc_error_check () == 0)
1597 gfc_error ("Unclassifiable statement in IF-clause at %C");
1599 gfc_free_expr (expr
);
1604 gfc_error ("Syntax error in IF-clause at %C");
1607 gfc_free_expr (expr
);
1611 /* At this point, we've matched the single IF and the action clause
1612 is in new_st. Rearrange things so that the IF statement appears
1615 p
= gfc_get_code ();
1616 p
->next
= gfc_get_code ();
1618 p
->next
->loc
= gfc_current_locus
;
1623 gfc_clear_new_st ();
1625 new_st
.op
= EXEC_IF
;
1634 /* Match an ELSE statement. */
1637 gfc_match_else (void)
1639 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
1641 if (gfc_match_eos () == MATCH_YES
)
1644 if (gfc_match_name (name
) != MATCH_YES
1645 || gfc_current_block () == NULL
1646 || gfc_match_eos () != MATCH_YES
)
1648 gfc_error ("Unexpected junk after ELSE statement at %C");
1652 if (strcmp (name
, gfc_current_block ()->name
) != 0)
1654 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1655 name
, gfc_current_block ()->name
);
1663 /* Match an ELSE IF statement. */
1666 gfc_match_elseif (void)
1668 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
1672 m
= gfc_match (" ( %e ) then", &expr
);
1676 if (gfc_match_eos () == MATCH_YES
)
1679 if (gfc_match_name (name
) != MATCH_YES
1680 || gfc_current_block () == NULL
1681 || gfc_match_eos () != MATCH_YES
)
1683 gfc_error ("Unexpected junk after ELSE IF statement at %C");
1687 if (strcmp (name
, gfc_current_block ()->name
) != 0)
1689 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1690 name
, gfc_current_block ()->name
);
1695 new_st
.op
= EXEC_IF
;
1696 new_st
.expr1
= expr
;
1700 gfc_free_expr (expr
);
1705 /* Free a gfc_iterator structure. */
1708 gfc_free_iterator (gfc_iterator
*iter
, int flag
)
1714 gfc_free_expr (iter
->var
);
1715 gfc_free_expr (iter
->start
);
1716 gfc_free_expr (iter
->end
);
1717 gfc_free_expr (iter
->step
);
1724 /* Match a CRITICAL statement. */
1726 gfc_match_critical (void)
1728 gfc_st_label
*label
= NULL
;
1730 if (gfc_match_label () == MATCH_ERROR
)
1733 if (gfc_match (" critical") != MATCH_YES
)
1736 if (gfc_match_st_label (&label
) == MATCH_ERROR
)
1739 if (gfc_match_eos () != MATCH_YES
)
1741 gfc_syntax_error (ST_CRITICAL
);
1745 if (gfc_pure (NULL
))
1747 gfc_error ("Image control statement CRITICAL at %C in PURE procedure");
1751 if (gfc_find_state (COMP_DO_CONCURRENT
) == SUCCESS
)
1753 gfc_error ("Image control statement CRITICAL at %C in DO CONCURRENT "
1758 if (gfc_implicit_pure (NULL
))
1759 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
1761 if (gfc_notify_std (GFC_STD_F2008
, "Fortran 2008: CRITICAL statement at %C")
1765 if (gfc_option
.coarray
== GFC_FCOARRAY_NONE
)
1767 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
1771 if (gfc_find_state (COMP_CRITICAL
) == SUCCESS
)
1773 gfc_error ("Nested CRITICAL block at %C");
1777 new_st
.op
= EXEC_CRITICAL
;
1780 && gfc_reference_st_label (label
, ST_LABEL_TARGET
) == FAILURE
)
1787 /* Match a BLOCK statement. */
1790 gfc_match_block (void)
1794 if (gfc_match_label () == MATCH_ERROR
)
1797 if (gfc_match (" block") != MATCH_YES
)
1800 /* For this to be a correct BLOCK statement, the line must end now. */
1801 m
= gfc_match_eos ();
1802 if (m
== MATCH_ERROR
)
1811 /* Match an ASSOCIATE statement. */
1814 gfc_match_associate (void)
1816 if (gfc_match_label () == MATCH_ERROR
)
1819 if (gfc_match (" associate") != MATCH_YES
)
1822 /* Match the association list. */
1823 if (gfc_match_char ('(') != MATCH_YES
)
1825 gfc_error ("Expected association list at %C");
1828 new_st
.ext
.block
.assoc
= NULL
;
1831 gfc_association_list
* newAssoc
= gfc_get_association_list ();
1832 gfc_association_list
* a
;
1834 /* Match the next association. */
1835 if (gfc_match (" %n => %e", newAssoc
->name
, &newAssoc
->target
)
1838 gfc_error ("Expected association at %C");
1839 goto assocListError
;
1841 newAssoc
->where
= gfc_current_locus
;
1843 /* Check that the current name is not yet in the list. */
1844 for (a
= new_st
.ext
.block
.assoc
; a
; a
= a
->next
)
1845 if (!strcmp (a
->name
, newAssoc
->name
))
1847 gfc_error ("Duplicate name '%s' in association at %C",
1849 goto assocListError
;
1852 /* The target expression must not be coindexed. */
1853 if (gfc_is_coindexed (newAssoc
->target
))
1855 gfc_error ("Association target at %C must not be coindexed");
1856 goto assocListError
;
1859 /* The `variable' field is left blank for now; because the target is not
1860 yet resolved, we can't use gfc_has_vector_subscript to determine it
1861 for now. This is set during resolution. */
1863 /* Put it into the list. */
1864 newAssoc
->next
= new_st
.ext
.block
.assoc
;
1865 new_st
.ext
.block
.assoc
= newAssoc
;
1867 /* Try next one or end if closing parenthesis is found. */
1868 gfc_gobble_whitespace ();
1869 if (gfc_peek_char () == ')')
1871 if (gfc_match_char (',') != MATCH_YES
)
1873 gfc_error ("Expected ')' or ',' at %C");
1883 if (gfc_match_char (')') != MATCH_YES
)
1885 /* This should never happen as we peek above. */
1889 if (gfc_match_eos () != MATCH_YES
)
1891 gfc_error ("Junk after ASSOCIATE statement at %C");
1898 gfc_free_association_list (new_st
.ext
.block
.assoc
);
1903 /* Match a Fortran 2003 derived-type-spec (F03:R455), which is just the name of
1904 an accessible derived type. */
1907 match_derived_type_spec (gfc_typespec
*ts
)
1909 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
1911 gfc_symbol
*derived
;
1913 old_locus
= gfc_current_locus
;
1915 if (gfc_match ("%n", name
) != MATCH_YES
)
1917 gfc_current_locus
= old_locus
;
1921 gfc_find_symbol (name
, NULL
, 1, &derived
);
1923 if (derived
&& derived
->attr
.flavor
== FL_DERIVED
)
1925 ts
->type
= BT_DERIVED
;
1926 ts
->u
.derived
= derived
;
1930 gfc_current_locus
= old_locus
;
1935 /* Match a Fortran 2003 type-spec (F03:R401). This is similar to
1936 gfc_match_decl_type_spec() from decl.c, with the following exceptions:
1937 It only includes the intrinsic types from the Fortran 2003 standard
1938 (thus, neither BYTE nor forms like REAL*4 are allowed). Additionally,
1939 the implicit_flag is not needed, so it was removed. Derived types are
1940 identified by their name alone. */
1943 match_type_spec (gfc_typespec
*ts
)
1949 gfc_gobble_whitespace ();
1950 old_locus
= gfc_current_locus
;
1952 if (match_derived_type_spec (ts
) == MATCH_YES
)
1954 /* Enforce F03:C401. */
1955 if (ts
->u
.derived
->attr
.abstract
)
1957 gfc_error ("Derived type '%s' at %L may not be ABSTRACT",
1958 ts
->u
.derived
->name
, &old_locus
);
1964 if (gfc_match ("integer") == MATCH_YES
)
1966 ts
->type
= BT_INTEGER
;
1967 ts
->kind
= gfc_default_integer_kind
;
1971 if (gfc_match ("real") == MATCH_YES
)
1974 ts
->kind
= gfc_default_real_kind
;
1978 if (gfc_match ("double precision") == MATCH_YES
)
1981 ts
->kind
= gfc_default_double_kind
;
1985 if (gfc_match ("complex") == MATCH_YES
)
1987 ts
->type
= BT_COMPLEX
;
1988 ts
->kind
= gfc_default_complex_kind
;
1992 if (gfc_match ("character") == MATCH_YES
)
1994 ts
->type
= BT_CHARACTER
;
1996 m
= gfc_match_char_spec (ts
);
2004 if (gfc_match ("logical") == MATCH_YES
)
2006 ts
->type
= BT_LOGICAL
;
2007 ts
->kind
= gfc_default_logical_kind
;
2011 /* If a type is not matched, simply return MATCH_NO. */
2012 gfc_current_locus
= old_locus
;
2017 gfc_gobble_whitespace ();
2018 if (gfc_peek_ascii_char () == '*')
2020 gfc_error ("Invalid type-spec at %C");
2024 m
= gfc_match_kind_spec (ts
, false);
2027 m
= MATCH_YES
; /* No kind specifier found. */
2033 /******************** FORALL subroutines ********************/
2035 /* Free a list of FORALL iterators. */
2038 gfc_free_forall_iterator (gfc_forall_iterator
*iter
)
2040 gfc_forall_iterator
*next
;
2045 gfc_free_expr (iter
->var
);
2046 gfc_free_expr (iter
->start
);
2047 gfc_free_expr (iter
->end
);
2048 gfc_free_expr (iter
->stride
);
2055 /* Match an iterator as part of a FORALL statement. The format is:
2057 <var> = <start>:<end>[:<stride>]
2059 On MATCH_NO, the caller tests for the possibility that there is a
2060 scalar mask expression. */
2063 match_forall_iterator (gfc_forall_iterator
**result
)
2065 gfc_forall_iterator
*iter
;
2069 where
= gfc_current_locus
;
2070 iter
= XCNEW (gfc_forall_iterator
);
2072 m
= gfc_match_expr (&iter
->var
);
2076 if (gfc_match_char ('=') != MATCH_YES
2077 || iter
->var
->expr_type
!= EXPR_VARIABLE
)
2083 m
= gfc_match_expr (&iter
->start
);
2087 if (gfc_match_char (':') != MATCH_YES
)
2090 m
= gfc_match_expr (&iter
->end
);
2093 if (m
== MATCH_ERROR
)
2096 if (gfc_match_char (':') == MATCH_NO
)
2097 iter
->stride
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, 1);
2100 m
= gfc_match_expr (&iter
->stride
);
2103 if (m
== MATCH_ERROR
)
2107 /* Mark the iteration variable's symbol as used as a FORALL index. */
2108 iter
->var
->symtree
->n
.sym
->forall_index
= true;
2114 gfc_error ("Syntax error in FORALL iterator at %C");
2119 gfc_current_locus
= where
;
2120 gfc_free_forall_iterator (iter
);
2125 /* Match the header of a FORALL statement. */
2128 match_forall_header (gfc_forall_iterator
**phead
, gfc_expr
**mask
)
2130 gfc_forall_iterator
*head
, *tail
, *new_iter
;
2134 gfc_gobble_whitespace ();
2139 if (gfc_match_char ('(') != MATCH_YES
)
2142 m
= match_forall_iterator (&new_iter
);
2143 if (m
== MATCH_ERROR
)
2148 head
= tail
= new_iter
;
2152 if (gfc_match_char (',') != MATCH_YES
)
2155 m
= match_forall_iterator (&new_iter
);
2156 if (m
== MATCH_ERROR
)
2161 tail
->next
= new_iter
;
2166 /* Have to have a mask expression. */
2168 m
= gfc_match_expr (&msk
);
2171 if (m
== MATCH_ERROR
)
2177 if (gfc_match_char (')') == MATCH_NO
)
2185 gfc_syntax_error (ST_FORALL
);
2188 gfc_free_expr (msk
);
2189 gfc_free_forall_iterator (head
);
2194 /* Match the rest of a simple FORALL statement that follows an
2198 match_simple_forall (void)
2200 gfc_forall_iterator
*head
;
2209 m
= match_forall_header (&head
, &mask
);
2216 m
= gfc_match_assignment ();
2218 if (m
== MATCH_ERROR
)
2222 m
= gfc_match_pointer_assignment ();
2223 if (m
== MATCH_ERROR
)
2229 c
= gfc_get_code ();
2231 c
->loc
= gfc_current_locus
;
2233 if (gfc_match_eos () != MATCH_YES
)
2236 gfc_clear_new_st ();
2237 new_st
.op
= EXEC_FORALL
;
2238 new_st
.expr1
= mask
;
2239 new_st
.ext
.forall_iterator
= head
;
2240 new_st
.block
= gfc_get_code ();
2242 new_st
.block
->op
= EXEC_FORALL
;
2243 new_st
.block
->next
= c
;
2248 gfc_syntax_error (ST_FORALL
);
2251 gfc_free_forall_iterator (head
);
2252 gfc_free_expr (mask
);
2258 /* Match a FORALL statement. */
2261 gfc_match_forall (gfc_statement
*st
)
2263 gfc_forall_iterator
*head
;
2272 m0
= gfc_match_label ();
2273 if (m0
== MATCH_ERROR
)
2276 m
= gfc_match (" forall");
2280 m
= match_forall_header (&head
, &mask
);
2281 if (m
== MATCH_ERROR
)
2286 if (gfc_match_eos () == MATCH_YES
)
2288 *st
= ST_FORALL_BLOCK
;
2289 new_st
.op
= EXEC_FORALL
;
2290 new_st
.expr1
= mask
;
2291 new_st
.ext
.forall_iterator
= head
;
2295 m
= gfc_match_assignment ();
2296 if (m
== MATCH_ERROR
)
2300 m
= gfc_match_pointer_assignment ();
2301 if (m
== MATCH_ERROR
)
2307 c
= gfc_get_code ();
2309 c
->loc
= gfc_current_locus
;
2311 gfc_clear_new_st ();
2312 new_st
.op
= EXEC_FORALL
;
2313 new_st
.expr1
= mask
;
2314 new_st
.ext
.forall_iterator
= head
;
2315 new_st
.block
= gfc_get_code ();
2316 new_st
.block
->op
= EXEC_FORALL
;
2317 new_st
.block
->next
= c
;
2323 gfc_syntax_error (ST_FORALL
);
2326 gfc_free_forall_iterator (head
);
2327 gfc_free_expr (mask
);
2328 gfc_free_statements (c
);
2333 /* Match a DO statement. */
2338 gfc_iterator iter
, *ip
;
2340 gfc_st_label
*label
;
2343 old_loc
= gfc_current_locus
;
2346 iter
.var
= iter
.start
= iter
.end
= iter
.step
= NULL
;
2348 m
= gfc_match_label ();
2349 if (m
== MATCH_ERROR
)
2352 if (gfc_match (" do") != MATCH_YES
)
2355 m
= gfc_match_st_label (&label
);
2356 if (m
== MATCH_ERROR
)
2359 /* Match an infinite DO, make it like a DO WHILE(.TRUE.). */
2361 if (gfc_match_eos () == MATCH_YES
)
2363 iter
.end
= gfc_get_logical_expr (gfc_default_logical_kind
, NULL
, true);
2364 new_st
.op
= EXEC_DO_WHILE
;
2368 /* Match an optional comma, if no comma is found, a space is obligatory. */
2369 if (gfc_match_char (',') != MATCH_YES
&& gfc_match ("% ") != MATCH_YES
)
2372 /* Check for balanced parens. */
2374 if (gfc_match_parens () == MATCH_ERROR
)
2377 if (gfc_match (" concurrent") == MATCH_YES
)
2379 gfc_forall_iterator
*head
;
2382 if (gfc_notify_std (GFC_STD_F2008
, "Fortran 2008: DO CONCURRENT "
2383 "construct at %C") == FAILURE
)
2389 m
= match_forall_header (&head
, &mask
);
2393 if (m
== MATCH_ERROR
)
2394 goto concurr_cleanup
;
2396 if (gfc_match_eos () != MATCH_YES
)
2397 goto concurr_cleanup
;
2400 && gfc_reference_st_label (label
, ST_LABEL_TARGET
) == FAILURE
)
2401 goto concurr_cleanup
;
2403 new_st
.label1
= label
;
2404 new_st
.op
= EXEC_DO_CONCURRENT
;
2405 new_st
.expr1
= mask
;
2406 new_st
.ext
.forall_iterator
= head
;
2411 gfc_syntax_error (ST_DO
);
2412 gfc_free_expr (mask
);
2413 gfc_free_forall_iterator (head
);
2417 /* See if we have a DO WHILE. */
2418 if (gfc_match (" while ( %e )%t", &iter
.end
) == MATCH_YES
)
2420 new_st
.op
= EXEC_DO_WHILE
;
2424 /* The abortive DO WHILE may have done something to the symbol
2425 table, so we start over. */
2426 gfc_undo_symbols ();
2427 gfc_current_locus
= old_loc
;
2429 gfc_match_label (); /* This won't error. */
2430 gfc_match (" do "); /* This will work. */
2432 gfc_match_st_label (&label
); /* Can't error out. */
2433 gfc_match_char (','); /* Optional comma. */
2435 m
= gfc_match_iterator (&iter
, 0);
2438 if (m
== MATCH_ERROR
)
2441 iter
.var
->symtree
->n
.sym
->attr
.implied_index
= 0;
2442 gfc_check_do_variable (iter
.var
->symtree
);
2444 if (gfc_match_eos () != MATCH_YES
)
2446 gfc_syntax_error (ST_DO
);
2450 new_st
.op
= EXEC_DO
;
2454 && gfc_reference_st_label (label
, ST_LABEL_TARGET
) == FAILURE
)
2457 new_st
.label1
= label
;
2459 if (new_st
.op
== EXEC_DO_WHILE
)
2460 new_st
.expr1
= iter
.end
;
2463 new_st
.ext
.iterator
= ip
= gfc_get_iterator ();
2470 gfc_free_iterator (&iter
, 0);
2476 /* Match an EXIT or CYCLE statement. */
2479 match_exit_cycle (gfc_statement st
, gfc_exec_op op
)
2481 gfc_state_data
*p
, *o
;
2486 if (gfc_match_eos () == MATCH_YES
)
2490 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
2493 m
= gfc_match ("% %n%t", name
);
2494 if (m
== MATCH_ERROR
)
2498 gfc_syntax_error (st
);
2502 /* Find the corresponding symbol. If there's a BLOCK statement
2503 between here and the label, it is not in gfc_current_ns but a parent
2505 stree
= gfc_find_symtree_in_proc (name
, gfc_current_ns
);
2508 gfc_error ("Name '%s' in %s statement at %C is unknown",
2509 name
, gfc_ascii_statement (st
));
2514 if (sym
->attr
.flavor
!= FL_LABEL
)
2516 gfc_error ("Name '%s' in %s statement at %C is not a construct name",
2517 name
, gfc_ascii_statement (st
));
2522 /* Find the loop specified by the label (or lack of a label). */
2523 for (o
= NULL
, p
= gfc_state_stack
; p
; p
= p
->previous
)
2524 if (o
== NULL
&& p
->state
== COMP_OMP_STRUCTURED_BLOCK
)
2526 else if (p
->state
== COMP_CRITICAL
)
2528 gfc_error("%s statement at %C leaves CRITICAL construct",
2529 gfc_ascii_statement (st
));
2532 else if (p
->state
== COMP_DO_CONCURRENT
2533 && (op
== EXEC_EXIT
|| (sym
&& sym
!= p
->sym
)))
2535 /* F2008, C821 & C845. */
2536 gfc_error("%s statement at %C leaves DO CONCURRENT construct",
2537 gfc_ascii_statement (st
));
2540 else if ((sym
&& sym
== p
->sym
)
2541 || (!sym
&& (p
->state
== COMP_DO
2542 || p
->state
== COMP_DO_CONCURRENT
)))
2548 gfc_error ("%s statement at %C is not within a construct",
2549 gfc_ascii_statement (st
));
2551 gfc_error ("%s statement at %C is not within construct '%s'",
2552 gfc_ascii_statement (st
), sym
->name
);
2557 /* Special checks for EXIT from non-loop constructs. */
2561 case COMP_DO_CONCURRENT
:
2565 /* This is already handled above. */
2568 case COMP_ASSOCIATE
:
2572 case COMP_SELECT_TYPE
:
2574 if (op
== EXEC_CYCLE
)
2576 gfc_error ("CYCLE statement at %C is not applicable to non-loop"
2577 " construct '%s'", sym
->name
);
2580 gcc_assert (op
== EXEC_EXIT
);
2581 if (gfc_notify_std (GFC_STD_F2008
, "Fortran 2008: EXIT statement with no"
2582 " do-construct-name at %C") == FAILURE
)
2587 gfc_error ("%s statement at %C is not applicable to construct '%s'",
2588 gfc_ascii_statement (st
), sym
->name
);
2594 gfc_error ("%s statement at %C leaving OpenMP structured block",
2595 gfc_ascii_statement (st
));
2599 for (o
= p
, cnt
= 0; o
->state
== COMP_DO
&& o
->previous
!= NULL
; cnt
++)
2603 && o
->state
== COMP_OMP_STRUCTURED_BLOCK
2604 && (o
->head
->op
== EXEC_OMP_DO
2605 || o
->head
->op
== EXEC_OMP_PARALLEL_DO
))
2608 gcc_assert (o
->head
->next
!= NULL
2609 && (o
->head
->next
->op
== EXEC_DO
2610 || o
->head
->next
->op
== EXEC_DO_WHILE
)
2611 && o
->previous
!= NULL
2612 && o
->previous
->tail
->op
== o
->head
->op
);
2613 if (o
->previous
->tail
->ext
.omp_clauses
!= NULL
2614 && o
->previous
->tail
->ext
.omp_clauses
->collapse
> 1)
2615 collapse
= o
->previous
->tail
->ext
.omp_clauses
->collapse
;
2616 if (st
== ST_EXIT
&& cnt
<= collapse
)
2618 gfc_error ("EXIT statement at %C terminating !$OMP DO loop");
2621 if (st
== ST_CYCLE
&& cnt
< collapse
)
2623 gfc_error ("CYCLE statement at %C to non-innermost collapsed"
2629 /* Save the first statement in the construct - needed by the backend. */
2630 new_st
.ext
.which_construct
= p
->construct
;
2638 /* Match the EXIT statement. */
2641 gfc_match_exit (void)
2643 return match_exit_cycle (ST_EXIT
, EXEC_EXIT
);
2647 /* Match the CYCLE statement. */
2650 gfc_match_cycle (void)
2652 return match_exit_cycle (ST_CYCLE
, EXEC_CYCLE
);
2656 /* Match a number or character constant after an (ALL) STOP or PAUSE statement. */
2659 gfc_match_stopcode (gfc_statement st
)
2666 if (gfc_match_eos () != MATCH_YES
)
2668 m
= gfc_match_init_expr (&e
);
2669 if (m
== MATCH_ERROR
)
2674 if (gfc_match_eos () != MATCH_YES
)
2678 if (gfc_pure (NULL
))
2680 gfc_error ("%s statement not allowed in PURE procedure at %C",
2681 gfc_ascii_statement (st
));
2685 if (gfc_implicit_pure (NULL
))
2686 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
2688 if (st
== ST_STOP
&& gfc_find_state (COMP_CRITICAL
) == SUCCESS
)
2690 gfc_error ("Image control statement STOP at %C in CRITICAL block");
2693 if (st
== ST_STOP
&& gfc_find_state (COMP_DO_CONCURRENT
) == SUCCESS
)
2695 gfc_error ("Image control statement STOP at %C in DO CONCURRENT block");
2701 if (!(e
->ts
.type
== BT_CHARACTER
|| e
->ts
.type
== BT_INTEGER
))
2703 gfc_error ("STOP code at %L must be either INTEGER or CHARACTER type",
2710 gfc_error ("STOP code at %L must be scalar",
2715 if (e
->ts
.type
== BT_CHARACTER
2716 && e
->ts
.kind
!= gfc_default_character_kind
)
2718 gfc_error ("STOP code at %L must be default character KIND=%d",
2719 &e
->where
, (int) gfc_default_character_kind
);
2723 if (e
->ts
.type
== BT_INTEGER
2724 && e
->ts
.kind
!= gfc_default_integer_kind
)
2726 gfc_error ("STOP code at %L must be default integer KIND=%d",
2727 &e
->where
, (int) gfc_default_integer_kind
);
2735 new_st
.op
= EXEC_STOP
;
2738 new_st
.op
= EXEC_ERROR_STOP
;
2741 new_st
.op
= EXEC_PAUSE
;
2748 new_st
.ext
.stop_code
= -1;
2753 gfc_syntax_error (st
);
2762 /* Match the (deprecated) PAUSE statement. */
2765 gfc_match_pause (void)
2769 m
= gfc_match_stopcode (ST_PAUSE
);
2772 if (gfc_notify_std (GFC_STD_F95_DEL
, "Deleted feature: PAUSE statement"
2781 /* Match the STOP statement. */
2784 gfc_match_stop (void)
2786 return gfc_match_stopcode (ST_STOP
);
2790 /* Match the ERROR STOP statement. */
2793 gfc_match_error_stop (void)
2795 if (gfc_notify_std (GFC_STD_F2008
, "Fortran 2008: ERROR STOP statement at %C")
2799 return gfc_match_stopcode (ST_ERROR_STOP
);
2803 /* Match LOCK/UNLOCK statement. Syntax:
2804 LOCK ( lock-variable [ , lock-stat-list ] )
2805 UNLOCK ( lock-variable [ , sync-stat-list ] )
2806 where lock-stat is ACQUIRED_LOCK or sync-stat
2807 and sync-stat is STAT= or ERRMSG=. */
2810 lock_unlock_statement (gfc_statement st
)
2813 gfc_expr
*tmp
, *lockvar
, *acq_lock
, *stat
, *errmsg
;
2814 bool saw_acq_lock
, saw_stat
, saw_errmsg
;
2816 tmp
= lockvar
= acq_lock
= stat
= errmsg
= NULL
;
2817 saw_acq_lock
= saw_stat
= saw_errmsg
= false;
2819 if (gfc_pure (NULL
))
2821 gfc_error ("Image control statement %s at %C in PURE procedure",
2822 st
== ST_LOCK
? "LOCK" : "UNLOCK");
2826 if (gfc_implicit_pure (NULL
))
2827 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
2829 if (gfc_option
.coarray
== GFC_FCOARRAY_NONE
)
2831 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
2835 if (gfc_find_state (COMP_CRITICAL
) == SUCCESS
)
2837 gfc_error ("Image control statement %s at %C in CRITICAL block",
2838 st
== ST_LOCK
? "LOCK" : "UNLOCK");
2842 if (gfc_find_state (COMP_DO_CONCURRENT
) == SUCCESS
)
2844 gfc_error ("Image control statement %s at %C in DO CONCURRENT block",
2845 st
== ST_LOCK
? "LOCK" : "UNLOCK");
2849 if (gfc_match_char ('(') != MATCH_YES
)
2852 if (gfc_match ("%e", &lockvar
) != MATCH_YES
)
2854 m
= gfc_match_char (',');
2855 if (m
== MATCH_ERROR
)
2859 m
= gfc_match_char (')');
2867 m
= gfc_match (" stat = %v", &tmp
);
2868 if (m
== MATCH_ERROR
)
2874 gfc_error ("Redundant STAT tag found at %L ", &tmp
->where
);
2880 m
= gfc_match_char (',');
2888 m
= gfc_match (" errmsg = %v", &tmp
);
2889 if (m
== MATCH_ERROR
)
2895 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp
->where
);
2901 m
= gfc_match_char (',');
2909 m
= gfc_match (" acquired_lock = %v", &tmp
);
2910 if (m
== MATCH_ERROR
|| st
== ST_UNLOCK
)
2916 gfc_error ("Redundant ACQUIRED_LOCK tag found at %L ",
2921 saw_acq_lock
= true;
2923 m
= gfc_match_char (',');
2934 if (m
== MATCH_ERROR
)
2937 if (gfc_match (" )%t") != MATCH_YES
)
2944 new_st
.op
= EXEC_LOCK
;
2947 new_st
.op
= EXEC_UNLOCK
;
2953 new_st
.expr1
= lockvar
;
2954 new_st
.expr2
= stat
;
2955 new_st
.expr3
= errmsg
;
2956 new_st
.expr4
= acq_lock
;
2961 gfc_syntax_error (st
);
2964 gfc_free_expr (tmp
);
2965 gfc_free_expr (lockvar
);
2966 gfc_free_expr (acq_lock
);
2967 gfc_free_expr (stat
);
2968 gfc_free_expr (errmsg
);
2975 gfc_match_lock (void)
2977 if (gfc_notify_std (GFC_STD_F2008
, "Fortran 2008: LOCK statement at %C")
2981 return lock_unlock_statement (ST_LOCK
);
2986 gfc_match_unlock (void)
2988 if (gfc_notify_std (GFC_STD_F2008
, "Fortran 2008: UNLOCK statement at %C")
2992 return lock_unlock_statement (ST_UNLOCK
);
2996 /* Match SYNC ALL/IMAGES/MEMORY statement. Syntax:
2997 SYNC ALL [(sync-stat-list)]
2998 SYNC MEMORY [(sync-stat-list)]
2999 SYNC IMAGES (image-set [, sync-stat-list] )
3000 with sync-stat is int-expr or *. */
3003 sync_statement (gfc_statement st
)
3006 gfc_expr
*tmp
, *imageset
, *stat
, *errmsg
;
3007 bool saw_stat
, saw_errmsg
;
3009 tmp
= imageset
= stat
= errmsg
= NULL
;
3010 saw_stat
= saw_errmsg
= false;
3012 if (gfc_pure (NULL
))
3014 gfc_error ("Image control statement SYNC at %C in PURE procedure");
3018 if (gfc_implicit_pure (NULL
))
3019 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
3021 if (gfc_notify_std (GFC_STD_F2008
, "Fortran 2008: SYNC statement at %C")
3025 if (gfc_option
.coarray
== GFC_FCOARRAY_NONE
)
3027 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
3031 if (gfc_find_state (COMP_CRITICAL
) == SUCCESS
)
3033 gfc_error ("Image control statement SYNC at %C in CRITICAL block");
3037 if (gfc_find_state (COMP_DO_CONCURRENT
) == SUCCESS
)
3039 gfc_error ("Image control statement SYNC at %C in DO CONCURRENT block");
3043 if (gfc_match_eos () == MATCH_YES
)
3045 if (st
== ST_SYNC_IMAGES
)
3050 if (gfc_match_char ('(') != MATCH_YES
)
3053 if (st
== ST_SYNC_IMAGES
)
3055 /* Denote '*' as imageset == NULL. */
3056 m
= gfc_match_char ('*');
3057 if (m
== MATCH_ERROR
)
3061 if (gfc_match ("%e", &imageset
) != MATCH_YES
)
3064 m
= gfc_match_char (',');
3065 if (m
== MATCH_ERROR
)
3069 m
= gfc_match_char (')');
3078 m
= gfc_match (" stat = %v", &tmp
);
3079 if (m
== MATCH_ERROR
)
3085 gfc_error ("Redundant STAT tag found at %L ", &tmp
->where
);
3091 if (gfc_match_char (',') == MATCH_YES
)
3098 m
= gfc_match (" errmsg = %v", &tmp
);
3099 if (m
== MATCH_ERROR
)
3105 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp
->where
);
3111 if (gfc_match_char (',') == MATCH_YES
)
3121 if (m
== MATCH_ERROR
)
3124 if (gfc_match (" )%t") != MATCH_YES
)
3131 new_st
.op
= EXEC_SYNC_ALL
;
3133 case ST_SYNC_IMAGES
:
3134 new_st
.op
= EXEC_SYNC_IMAGES
;
3136 case ST_SYNC_MEMORY
:
3137 new_st
.op
= EXEC_SYNC_MEMORY
;
3143 new_st
.expr1
= imageset
;
3144 new_st
.expr2
= stat
;
3145 new_st
.expr3
= errmsg
;
3150 gfc_syntax_error (st
);
3153 gfc_free_expr (tmp
);
3154 gfc_free_expr (imageset
);
3155 gfc_free_expr (stat
);
3156 gfc_free_expr (errmsg
);
3162 /* Match SYNC ALL statement. */
3165 gfc_match_sync_all (void)
3167 return sync_statement (ST_SYNC_ALL
);
3171 /* Match SYNC IMAGES statement. */
3174 gfc_match_sync_images (void)
3176 return sync_statement (ST_SYNC_IMAGES
);
3180 /* Match SYNC MEMORY statement. */
3183 gfc_match_sync_memory (void)
3185 return sync_statement (ST_SYNC_MEMORY
);
3189 /* Match a CONTINUE statement. */
3192 gfc_match_continue (void)
3194 if (gfc_match_eos () != MATCH_YES
)
3196 gfc_syntax_error (ST_CONTINUE
);
3200 new_st
.op
= EXEC_CONTINUE
;
3205 /* Match the (deprecated) ASSIGN statement. */
3208 gfc_match_assign (void)
3211 gfc_st_label
*label
;
3213 if (gfc_match (" %l", &label
) == MATCH_YES
)
3215 if (gfc_reference_st_label (label
, ST_LABEL_UNKNOWN
) == FAILURE
)
3217 if (gfc_match (" to %v%t", &expr
) == MATCH_YES
)
3219 if (gfc_notify_std (GFC_STD_F95_DEL
, "Deleted feature: ASSIGN "
3224 expr
->symtree
->n
.sym
->attr
.assign
= 1;
3226 new_st
.op
= EXEC_LABEL_ASSIGN
;
3227 new_st
.label1
= label
;
3228 new_st
.expr1
= expr
;
3236 /* Match the GO TO statement. As a computed GOTO statement is
3237 matched, it is transformed into an equivalent SELECT block. No
3238 tree is necessary, and the resulting jumps-to-jumps are
3239 specifically optimized away by the back end. */
3242 gfc_match_goto (void)
3244 gfc_code
*head
, *tail
;
3247 gfc_st_label
*label
;
3251 if (gfc_match (" %l%t", &label
) == MATCH_YES
)
3253 if (gfc_reference_st_label (label
, ST_LABEL_TARGET
) == FAILURE
)
3256 new_st
.op
= EXEC_GOTO
;
3257 new_st
.label1
= label
;
3261 /* The assigned GO TO statement. */
3263 if (gfc_match_variable (&expr
, 0) == MATCH_YES
)
3265 if (gfc_notify_std (GFC_STD_F95_DEL
, "Deleted feature: Assigned GOTO "
3270 new_st
.op
= EXEC_GOTO
;
3271 new_st
.expr1
= expr
;
3273 if (gfc_match_eos () == MATCH_YES
)
3276 /* Match label list. */
3277 gfc_match_char (',');
3278 if (gfc_match_char ('(') != MATCH_YES
)
3280 gfc_syntax_error (ST_GOTO
);
3287 m
= gfc_match_st_label (&label
);
3291 if (gfc_reference_st_label (label
, ST_LABEL_TARGET
) == FAILURE
)
3295 head
= tail
= gfc_get_code ();
3298 tail
->block
= gfc_get_code ();
3302 tail
->label1
= label
;
3303 tail
->op
= EXEC_GOTO
;
3305 while (gfc_match_char (',') == MATCH_YES
);
3307 if (gfc_match (")%t") != MATCH_YES
)
3312 gfc_error ("Statement label list in GOTO at %C cannot be empty");
3315 new_st
.block
= head
;
3320 /* Last chance is a computed GO TO statement. */
3321 if (gfc_match_char ('(') != MATCH_YES
)
3323 gfc_syntax_error (ST_GOTO
);
3332 m
= gfc_match_st_label (&label
);
3336 if (gfc_reference_st_label (label
, ST_LABEL_TARGET
) == FAILURE
)
3340 head
= tail
= gfc_get_code ();
3343 tail
->block
= gfc_get_code ();
3347 cp
= gfc_get_case ();
3348 cp
->low
= cp
->high
= gfc_get_int_expr (gfc_default_integer_kind
,
3351 tail
->op
= EXEC_SELECT
;
3352 tail
->ext
.block
.case_list
= cp
;
3354 tail
->next
= gfc_get_code ();
3355 tail
->next
->op
= EXEC_GOTO
;
3356 tail
->next
->label1
= label
;
3358 while (gfc_match_char (',') == MATCH_YES
);
3360 if (gfc_match_char (')') != MATCH_YES
)
3365 gfc_error ("Statement label list in GOTO at %C cannot be empty");
3369 /* Get the rest of the statement. */
3370 gfc_match_char (',');
3372 if (gfc_match (" %e%t", &expr
) != MATCH_YES
)
3375 if (gfc_notify_std (GFC_STD_F95_OBS
, "Obsolescent feature: Computed GOTO "
3376 "at %C") == FAILURE
)
3379 /* At this point, a computed GOTO has been fully matched and an
3380 equivalent SELECT statement constructed. */
3382 new_st
.op
= EXEC_SELECT
;
3383 new_st
.expr1
= NULL
;
3385 /* Hack: For a "real" SELECT, the expression is in expr. We put
3386 it in expr2 so we can distinguish then and produce the correct
3388 new_st
.expr2
= expr
;
3389 new_st
.block
= head
;
3393 gfc_syntax_error (ST_GOTO
);
3395 gfc_free_statements (head
);
3400 /* Frees a list of gfc_alloc structures. */
3403 gfc_free_alloc_list (gfc_alloc
*p
)
3410 gfc_free_expr (p
->expr
);
3416 /* Match an ALLOCATE statement. */
3419 gfc_match_allocate (void)
3421 gfc_alloc
*head
, *tail
;
3422 gfc_expr
*stat
, *errmsg
, *tmp
, *source
, *mold
;
3426 locus old_locus
, deferred_locus
;
3427 bool saw_stat
, saw_errmsg
, saw_source
, saw_mold
, saw_deferred
, b1
, b2
, b3
;
3430 stat
= errmsg
= source
= mold
= tmp
= NULL
;
3431 saw_stat
= saw_errmsg
= saw_source
= saw_mold
= saw_deferred
= false;
3433 if (gfc_match_char ('(') != MATCH_YES
)
3436 /* Match an optional type-spec. */
3437 old_locus
= gfc_current_locus
;
3438 m
= match_type_spec (&ts
);
3439 if (m
== MATCH_ERROR
)
3441 else if (m
== MATCH_NO
)
3443 char name
[GFC_MAX_SYMBOL_LEN
+ 3];
3445 if (gfc_match ("%n :: ", name
) == MATCH_YES
)
3447 gfc_error ("Error in type-spec at %L", &old_locus
);
3451 ts
.type
= BT_UNKNOWN
;
3455 if (gfc_match (" :: ") == MATCH_YES
)
3457 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: typespec in "
3458 "ALLOCATE at %L", &old_locus
) == FAILURE
)
3463 gfc_error ("Type-spec at %L cannot contain a deferred "
3464 "type parameter", &old_locus
);
3470 ts
.type
= BT_UNKNOWN
;
3471 gfc_current_locus
= old_locus
;
3478 head
= tail
= gfc_get_alloc ();
3481 tail
->next
= gfc_get_alloc ();
3485 m
= gfc_match_variable (&tail
->expr
, 0);
3488 if (m
== MATCH_ERROR
)
3491 if (gfc_check_do_variable (tail
->expr
->symtree
))
3494 if (gfc_pure (NULL
) && gfc_impure_variable (tail
->expr
->symtree
->n
.sym
))
3496 gfc_error ("Bad allocate-object at %C for a PURE procedure");
3500 if (gfc_implicit_pure (NULL
)
3501 && gfc_impure_variable (tail
->expr
->symtree
->n
.sym
))
3502 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
3504 if (tail
->expr
->ts
.deferred
)
3506 saw_deferred
= true;
3507 deferred_locus
= tail
->expr
->where
;
3510 if (gfc_find_state (COMP_DO_CONCURRENT
) == SUCCESS
3511 || gfc_find_state (COMP_CRITICAL
) == SUCCESS
)
3514 bool coarray
= tail
->expr
->symtree
->n
.sym
->attr
.codimension
;
3515 for (ref
= tail
->expr
->ref
; ref
; ref
= ref
->next
)
3516 if (ref
->type
== REF_COMPONENT
)
3517 coarray
= ref
->u
.c
.component
->attr
.codimension
;
3519 if (coarray
&& gfc_find_state (COMP_DO_CONCURRENT
) == SUCCESS
)
3521 gfc_error ("ALLOCATE of coarray at %C in DO CONCURRENT block");
3524 if (coarray
&& gfc_find_state (COMP_CRITICAL
) == SUCCESS
)
3526 gfc_error ("ALLOCATE of coarray at %C in CRITICAL block");
3531 /* The ALLOCATE statement had an optional typespec. Check the
3533 if (ts
.type
!= BT_UNKNOWN
)
3535 /* Enforce F03:C624. */
3536 if (!gfc_type_compatible (&tail
->expr
->ts
, &ts
))
3538 gfc_error ("Type of entity at %L is type incompatible with "
3539 "typespec", &tail
->expr
->where
);
3543 /* Enforce F03:C627. */
3544 if (ts
.kind
!= tail
->expr
->ts
.kind
)
3546 gfc_error ("Kind type parameter for entity at %L differs from "
3547 "the kind type parameter of the typespec",
3548 &tail
->expr
->where
);
3553 if (tail
->expr
->ts
.type
== BT_DERIVED
)
3554 tail
->expr
->ts
.u
.derived
= gfc_use_derived (tail
->expr
->ts
.u
.derived
);
3556 /* FIXME: disable the checking on derived types and arrays. */
3557 sym
= tail
->expr
->symtree
->n
.sym
;
3558 b1
= !(tail
->expr
->ref
3559 && (tail
->expr
->ref
->type
== REF_COMPONENT
3560 || tail
->expr
->ref
->type
== REF_ARRAY
));
3561 if (sym
&& sym
->ts
.type
== BT_CLASS
&& sym
->attr
.class_ok
)
3562 b2
= !(CLASS_DATA (sym
)->attr
.allocatable
3563 || CLASS_DATA (sym
)->attr
.class_pointer
);
3565 b2
= sym
&& !(sym
->attr
.allocatable
|| sym
->attr
.pointer
3566 || sym
->attr
.proc_pointer
);
3567 b3
= sym
&& sym
->ns
&& sym
->ns
->proc_name
3568 && (sym
->ns
->proc_name
->attr
.allocatable
3569 || sym
->ns
->proc_name
->attr
.pointer
3570 || sym
->ns
->proc_name
->attr
.proc_pointer
);
3571 if (b1
&& b2
&& !b3
)
3573 gfc_error ("Allocate-object at %L is not a nonprocedure pointer "
3574 "or an allocatable variable", &tail
->expr
->where
);
3578 if (gfc_peek_ascii_char () == '(' && !sym
->attr
.dimension
)
3580 gfc_error ("Shape specification for allocatable scalar at %C");
3584 if (gfc_match_char (',') != MATCH_YES
)
3589 m
= gfc_match (" stat = %v", &tmp
);
3590 if (m
== MATCH_ERROR
)
3597 gfc_error ("Redundant STAT tag found at %L ", &tmp
->where
);
3605 if (gfc_check_do_variable (stat
->symtree
))
3608 if (gfc_match_char (',') == MATCH_YES
)
3609 goto alloc_opt_list
;
3612 m
= gfc_match (" errmsg = %v", &tmp
);
3613 if (m
== MATCH_ERROR
)
3617 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: ERRMSG tag at %L",
3618 &tmp
->where
) == FAILURE
)
3624 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp
->where
);
3632 if (gfc_match_char (',') == MATCH_YES
)
3633 goto alloc_opt_list
;
3636 m
= gfc_match (" source = %e", &tmp
);
3637 if (m
== MATCH_ERROR
)
3641 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: SOURCE tag at %L",
3642 &tmp
->where
) == FAILURE
)
3648 gfc_error ("Redundant SOURCE tag found at %L ", &tmp
->where
);
3652 /* The next 2 conditionals check C631. */
3653 if (ts
.type
!= BT_UNKNOWN
)
3655 gfc_error ("SOURCE tag at %L conflicts with the typespec at %L",
3656 &tmp
->where
, &old_locus
);
3662 gfc_error ("SOURCE tag at %L requires only a single entity in "
3663 "the allocation-list", &tmp
->where
);
3671 if (gfc_match_char (',') == MATCH_YES
)
3672 goto alloc_opt_list
;
3675 m
= gfc_match (" mold = %e", &tmp
);
3676 if (m
== MATCH_ERROR
)
3680 if (gfc_notify_std (GFC_STD_F2008
, "Fortran 2008: MOLD tag at %L",
3681 &tmp
->where
) == FAILURE
)
3684 /* Check F08:C636. */
3687 gfc_error ("Redundant MOLD tag found at %L ", &tmp
->where
);
3691 /* Check F08:C637. */
3692 if (ts
.type
!= BT_UNKNOWN
)
3694 gfc_error ("MOLD tag at %L conflicts with the typespec at %L",
3695 &tmp
->where
, &old_locus
);
3704 if (gfc_match_char (',') == MATCH_YES
)
3705 goto alloc_opt_list
;
3708 gfc_gobble_whitespace ();
3710 if (gfc_peek_char () == ')')
3714 if (gfc_match (" )%t") != MATCH_YES
)
3717 /* Check F08:C637. */
3720 gfc_error ("MOLD tag at %L conflicts with SOURCE tag at %L",
3721 &mold
->where
, &source
->where
);
3725 /* Check F03:C623, */
3726 if (saw_deferred
&& ts
.type
== BT_UNKNOWN
&& !source
&& !mold
)
3728 gfc_error ("Allocate-object at %L with a deferred type parameter "
3729 "requires either a type-spec or SOURCE tag or a MOLD tag",
3734 new_st
.op
= EXEC_ALLOCATE
;
3735 new_st
.expr1
= stat
;
3736 new_st
.expr2
= errmsg
;
3738 new_st
.expr3
= source
;
3740 new_st
.expr3
= mold
;
3741 new_st
.ext
.alloc
.list
= head
;
3742 new_st
.ext
.alloc
.ts
= ts
;
3747 gfc_syntax_error (ST_ALLOCATE
);
3750 gfc_free_expr (errmsg
);
3751 gfc_free_expr (source
);
3752 gfc_free_expr (stat
);
3753 gfc_free_expr (mold
);
3754 if (tmp
&& tmp
->expr_type
) gfc_free_expr (tmp
);
3755 gfc_free_alloc_list (head
);
3760 /* Match a NULLIFY statement. A NULLIFY statement is transformed into
3761 a set of pointer assignments to intrinsic NULL(). */
3764 gfc_match_nullify (void)
3772 if (gfc_match_char ('(') != MATCH_YES
)
3777 m
= gfc_match_variable (&p
, 0);
3778 if (m
== MATCH_ERROR
)
3783 if (gfc_check_do_variable (p
->symtree
))
3787 if (gfc_is_coindexed (p
))
3789 gfc_error ("Pointer object at %C shall not be conindexed");
3793 /* build ' => NULL() '. */
3794 e
= gfc_get_null_expr (&gfc_current_locus
);
3796 /* Chain to list. */
3801 tail
->next
= gfc_get_code ();
3805 tail
->op
= EXEC_POINTER_ASSIGN
;
3809 if (gfc_match (" )%t") == MATCH_YES
)
3811 if (gfc_match_char (',') != MATCH_YES
)
3818 gfc_syntax_error (ST_NULLIFY
);
3821 gfc_free_statements (new_st
.next
);
3823 gfc_free_expr (new_st
.expr1
);
3824 new_st
.expr1
= NULL
;
3825 gfc_free_expr (new_st
.expr2
);
3826 new_st
.expr2
= NULL
;
3831 /* Match a DEALLOCATE statement. */
3834 gfc_match_deallocate (void)
3836 gfc_alloc
*head
, *tail
;
3837 gfc_expr
*stat
, *errmsg
, *tmp
;
3840 bool saw_stat
, saw_errmsg
, b1
, b2
;
3843 stat
= errmsg
= tmp
= NULL
;
3844 saw_stat
= saw_errmsg
= false;
3846 if (gfc_match_char ('(') != MATCH_YES
)
3852 head
= tail
= gfc_get_alloc ();
3855 tail
->next
= gfc_get_alloc ();
3859 m
= gfc_match_variable (&tail
->expr
, 0);
3860 if (m
== MATCH_ERROR
)
3865 if (gfc_check_do_variable (tail
->expr
->symtree
))
3868 sym
= tail
->expr
->symtree
->n
.sym
;
3870 if (gfc_pure (NULL
) && gfc_impure_variable (sym
))
3872 gfc_error ("Illegal allocate-object at %C for a PURE procedure");
3876 if (gfc_implicit_pure (NULL
) && gfc_impure_variable (sym
))
3877 gfc_current_ns
->proc_name
->attr
.implicit_pure
= 0;
3879 if (gfc_is_coarray (tail
->expr
)
3880 && gfc_find_state (COMP_DO_CONCURRENT
) == SUCCESS
)
3882 gfc_error ("DEALLOCATE of coarray at %C in DO CONCURRENT block");
3886 if (gfc_is_coarray (tail
->expr
)
3887 && gfc_find_state (COMP_CRITICAL
) == SUCCESS
)
3889 gfc_error ("DEALLOCATE of coarray at %C in CRITICAL block");
3893 /* FIXME: disable the checking on derived types. */
3894 b1
= !(tail
->expr
->ref
3895 && (tail
->expr
->ref
->type
== REF_COMPONENT
3896 || tail
->expr
->ref
->type
== REF_ARRAY
));
3897 if (sym
&& sym
->ts
.type
== BT_CLASS
)
3898 b2
= !(CLASS_DATA (sym
)->attr
.allocatable
3899 || CLASS_DATA (sym
)->attr
.class_pointer
);
3901 b2
= sym
&& !(sym
->attr
.allocatable
|| sym
->attr
.pointer
3902 || sym
->attr
.proc_pointer
);
3905 gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
3906 "or an allocatable variable");
3910 if (gfc_match_char (',') != MATCH_YES
)
3915 m
= gfc_match (" stat = %v", &tmp
);
3916 if (m
== MATCH_ERROR
)
3922 gfc_error ("Redundant STAT tag found at %L ", &tmp
->where
);
3923 gfc_free_expr (tmp
);
3930 if (gfc_check_do_variable (stat
->symtree
))
3933 if (gfc_match_char (',') == MATCH_YES
)
3934 goto dealloc_opt_list
;
3937 m
= gfc_match (" errmsg = %v", &tmp
);
3938 if (m
== MATCH_ERROR
)
3942 if (gfc_notify_std (GFC_STD_F2003
, "Fortran 2003: ERRMSG at %L",
3943 &tmp
->where
) == FAILURE
)
3948 gfc_error ("Redundant ERRMSG tag found at %L ", &tmp
->where
);
3949 gfc_free_expr (tmp
);
3956 if (gfc_match_char (',') == MATCH_YES
)
3957 goto dealloc_opt_list
;
3960 gfc_gobble_whitespace ();
3962 if (gfc_peek_char () == ')')
3966 if (gfc_match (" )%t") != MATCH_YES
)
3969 new_st
.op
= EXEC_DEALLOCATE
;
3970 new_st
.expr1
= stat
;
3971 new_st
.expr2
= errmsg
;
3972 new_st
.ext
.alloc
.list
= head
;
3977 gfc_syntax_error (ST_DEALLOCATE
);
3980 gfc_free_expr (errmsg
);
3981 gfc_free_expr (stat
);
3982 gfc_free_alloc_list (head
);
3987 /* Match a RETURN statement. */
3990 gfc_match_return (void)
3994 gfc_compile_state s
;
3998 if (gfc_find_state (COMP_CRITICAL
) == SUCCESS
)
4000 gfc_error ("Image control statement RETURN at %C in CRITICAL block");
4004 if (gfc_find_state (COMP_DO_CONCURRENT
) == SUCCESS
)
4006 gfc_error ("Image control statement RETURN at %C in DO CONCURRENT block");
4010 if (gfc_match_eos () == MATCH_YES
)
4013 if (gfc_find_state (COMP_SUBROUTINE
) == FAILURE
)
4015 gfc_error ("Alternate RETURN statement at %C is only allowed within "
4020 if (gfc_notify_std (GFC_STD_F95_OBS
, "Obsolescent feature: Alternate RETURN "
4021 "at %C") == FAILURE
)
4024 if (gfc_current_form
== FORM_FREE
)
4026 /* The following are valid, so we can't require a blank after the
4030 char c
= gfc_peek_ascii_char ();
4031 if (ISALPHA (c
) || ISDIGIT (c
))
4035 m
= gfc_match (" %e%t", &e
);
4038 if (m
== MATCH_ERROR
)
4041 gfc_syntax_error (ST_RETURN
);
4048 gfc_enclosing_unit (&s
);
4049 if (s
== COMP_PROGRAM
4050 && gfc_notify_std (GFC_STD_GNU
, "Extension: RETURN statement in "
4051 "main program at %C") == FAILURE
)
4054 new_st
.op
= EXEC_RETURN
;
4061 /* Match the call of a type-bound procedure, if CALL%var has already been
4062 matched and var found to be a derived-type variable. */
4065 match_typebound_call (gfc_symtree
* varst
)
4070 base
= gfc_get_expr ();
4071 base
->expr_type
= EXPR_VARIABLE
;
4072 base
->symtree
= varst
;
4073 base
->where
= gfc_current_locus
;
4074 gfc_set_sym_referenced (varst
->n
.sym
);
4076 m
= gfc_match_varspec (base
, 0, true, true);
4078 gfc_error ("Expected component reference at %C");
4082 if (gfc_match_eos () != MATCH_YES
)
4084 gfc_error ("Junk after CALL at %C");
4088 if (base
->expr_type
== EXPR_COMPCALL
)
4089 new_st
.op
= EXEC_COMPCALL
;
4090 else if (base
->expr_type
== EXPR_PPC
)
4091 new_st
.op
= EXEC_CALL_PPC
;
4094 gfc_error ("Expected type-bound procedure or procedure pointer component "
4098 new_st
.expr1
= base
;
4104 /* Match a CALL statement. The tricky part here are possible
4105 alternate return specifiers. We handle these by having all
4106 "subroutines" actually return an integer via a register that gives
4107 the return number. If the call specifies alternate returns, we
4108 generate code for a SELECT statement whose case clauses contain
4109 GOTOs to the various labels. */
4112 gfc_match_call (void)
4114 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4115 gfc_actual_arglist
*a
, *arglist
;
4125 m
= gfc_match ("% %n", name
);
4131 if (gfc_get_ha_sym_tree (name
, &st
))
4136 /* If this is a variable of derived-type, it probably starts a type-bound
4138 if ((sym
->attr
.flavor
!= FL_PROCEDURE
4139 || gfc_is_function_return_value (sym
, gfc_current_ns
))
4140 && (sym
->ts
.type
== BT_DERIVED
|| sym
->ts
.type
== BT_CLASS
))
4141 return match_typebound_call (st
);
4143 /* If it does not seem to be callable (include functions so that the
4144 right association is made. They are thrown out in resolution.)
4146 if (!sym
->attr
.generic
4147 && !sym
->attr
.subroutine
4148 && !sym
->attr
.function
)
4150 if (!(sym
->attr
.external
&& !sym
->attr
.referenced
))
4152 /* ...create a symbol in this scope... */
4153 if (sym
->ns
!= gfc_current_ns
4154 && gfc_get_sym_tree (name
, NULL
, &st
, false) == 1)
4157 if (sym
!= st
->n
.sym
)
4161 /* ...and then to try to make the symbol into a subroutine. */
4162 if (gfc_add_subroutine (&sym
->attr
, sym
->name
, NULL
) == FAILURE
)
4166 gfc_set_sym_referenced (sym
);
4168 if (gfc_match_eos () != MATCH_YES
)
4170 m
= gfc_match_actual_arglist (1, &arglist
);
4173 if (m
== MATCH_ERROR
)
4176 if (gfc_match_eos () != MATCH_YES
)
4180 /* If any alternate return labels were found, construct a SELECT
4181 statement that will jump to the right place. */
4184 for (a
= arglist
; a
; a
= a
->next
)
4185 if (a
->expr
== NULL
)
4190 gfc_symtree
*select_st
;
4191 gfc_symbol
*select_sym
;
4192 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4194 new_st
.next
= c
= gfc_get_code ();
4195 c
->op
= EXEC_SELECT
;
4196 sprintf (name
, "_result_%s", sym
->name
);
4197 gfc_get_ha_sym_tree (name
, &select_st
); /* Can't fail. */
4199 select_sym
= select_st
->n
.sym
;
4200 select_sym
->ts
.type
= BT_INTEGER
;
4201 select_sym
->ts
.kind
= gfc_default_integer_kind
;
4202 gfc_set_sym_referenced (select_sym
);
4203 c
->expr1
= gfc_get_expr ();
4204 c
->expr1
->expr_type
= EXPR_VARIABLE
;
4205 c
->expr1
->symtree
= select_st
;
4206 c
->expr1
->ts
= select_sym
->ts
;
4207 c
->expr1
->where
= gfc_current_locus
;
4210 for (a
= arglist
; a
; a
= a
->next
)
4212 if (a
->expr
!= NULL
)
4215 if (gfc_reference_st_label (a
->label
, ST_LABEL_TARGET
) == FAILURE
)
4220 c
->block
= gfc_get_code ();
4222 c
->op
= EXEC_SELECT
;
4224 new_case
= gfc_get_case ();
4225 new_case
->high
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, i
);
4226 new_case
->low
= new_case
->high
;
4227 c
->ext
.block
.case_list
= new_case
;
4229 c
->next
= gfc_get_code ();
4230 c
->next
->op
= EXEC_GOTO
;
4231 c
->next
->label1
= a
->label
;
4235 new_st
.op
= EXEC_CALL
;
4236 new_st
.symtree
= st
;
4237 new_st
.ext
.actual
= arglist
;
4242 gfc_syntax_error (ST_CALL
);
4245 gfc_free_actual_arglist (arglist
);
4250 /* Given a name, return a pointer to the common head structure,
4251 creating it if it does not exist. If FROM_MODULE is nonzero, we
4252 mangle the name so that it doesn't interfere with commons defined
4253 in the using namespace.
4254 TODO: Add to global symbol tree. */
4257 gfc_get_common (const char *name
, int from_module
)
4260 static int serial
= 0;
4261 char mangled_name
[GFC_MAX_SYMBOL_LEN
+ 1];
4265 /* A use associated common block is only needed to correctly layout
4266 the variables it contains. */
4267 snprintf (mangled_name
, GFC_MAX_SYMBOL_LEN
, "_%d_%s", serial
++, name
);
4268 st
= gfc_new_symtree (&gfc_current_ns
->common_root
, mangled_name
);
4272 st
= gfc_find_symtree (gfc_current_ns
->common_root
, name
);
4275 st
= gfc_new_symtree (&gfc_current_ns
->common_root
, name
);
4278 if (st
->n
.common
== NULL
)
4280 st
->n
.common
= gfc_get_common_head ();
4281 st
->n
.common
->where
= gfc_current_locus
;
4282 strcpy (st
->n
.common
->name
, name
);
4285 return st
->n
.common
;
4289 /* Match a common block name. */
4291 match
match_common_name (char *name
)
4295 if (gfc_match_char ('/') == MATCH_NO
)
4301 if (gfc_match_char ('/') == MATCH_YES
)
4307 m
= gfc_match_name (name
);
4309 if (m
== MATCH_ERROR
)
4311 if (m
== MATCH_YES
&& gfc_match_char ('/') == MATCH_YES
)
4314 gfc_error ("Syntax error in common block name at %C");
4319 /* Match a COMMON statement. */
4322 gfc_match_common (void)
4324 gfc_symbol
*sym
, **head
, *tail
, *other
, *old_blank_common
;
4325 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4332 old_blank_common
= gfc_current_ns
->blank_common
.head
;
4333 if (old_blank_common
)
4335 while (old_blank_common
->common_next
)
4336 old_blank_common
= old_blank_common
->common_next
;
4343 m
= match_common_name (name
);
4344 if (m
== MATCH_ERROR
)
4347 gsym
= gfc_get_gsymbol (name
);
4348 if (gsym
->type
!= GSYM_UNKNOWN
&& gsym
->type
!= GSYM_COMMON
)
4350 gfc_error ("Symbol '%s' at %C is already an external symbol that "
4351 "is not COMMON", name
);
4355 if (gsym
->type
== GSYM_UNKNOWN
)
4357 gsym
->type
= GSYM_COMMON
;
4358 gsym
->where
= gfc_current_locus
;
4364 if (name
[0] == '\0')
4366 t
= &gfc_current_ns
->blank_common
;
4367 if (t
->head
== NULL
)
4368 t
->where
= gfc_current_locus
;
4372 t
= gfc_get_common (name
, 0);
4381 while (tail
->common_next
)
4382 tail
= tail
->common_next
;
4385 /* Grab the list of symbols. */
4388 m
= gfc_match_symbol (&sym
, 0);
4389 if (m
== MATCH_ERROR
)
4394 /* Store a ref to the common block for error checking. */
4395 sym
->common_block
= t
;
4397 /* See if we know the current common block is bind(c), and if
4398 so, then see if we can check if the symbol is (which it'll
4399 need to be). This can happen if the bind(c) attr stmt was
4400 applied to the common block, and the variable(s) already
4401 defined, before declaring the common block. */
4402 if (t
->is_bind_c
== 1)
4404 if (sym
->ts
.type
!= BT_UNKNOWN
&& sym
->ts
.is_c_interop
!= 1)
4406 /* If we find an error, just print it and continue,
4407 cause it's just semantic, and we can see if there
4409 gfc_error_now ("Variable '%s' at %L in common block '%s' "
4410 "at %C must be declared with a C "
4411 "interoperable kind since common block "
4413 sym
->name
, &(sym
->declared_at
), t
->name
,
4417 if (sym
->attr
.is_bind_c
== 1)
4418 gfc_error_now ("Variable '%s' in common block "
4419 "'%s' at %C can not be bind(c) since "
4420 "it is not global", sym
->name
, t
->name
);
4423 if (sym
->attr
.in_common
)
4425 gfc_error ("Symbol '%s' at %C is already in a COMMON block",
4430 if (((sym
->value
!= NULL
&& sym
->value
->expr_type
!= EXPR_NULL
)
4431 || sym
->attr
.data
) && gfc_current_state () != COMP_BLOCK_DATA
)
4433 if (gfc_notify_std (GFC_STD_GNU
, "Initialized symbol '%s' at %C "
4434 "can only be COMMON in "
4435 "BLOCK DATA", sym
->name
)
4440 if (gfc_add_in_common (&sym
->attr
, sym
->name
, NULL
) == FAILURE
)
4444 tail
->common_next
= sym
;
4450 /* Deal with an optional array specification after the
4452 m
= gfc_match_array_spec (&as
, true, true);
4453 if (m
== MATCH_ERROR
)
4458 if (as
->type
!= AS_EXPLICIT
)
4460 gfc_error ("Array specification for symbol '%s' in COMMON "
4461 "at %C must be explicit", sym
->name
);
4465 if (gfc_add_dimension (&sym
->attr
, sym
->name
, NULL
) == FAILURE
)
4468 if (sym
->attr
.pointer
)
4470 gfc_error ("Symbol '%s' in COMMON at %C cannot be a "
4471 "POINTER array", sym
->name
);
4480 sym
->common_head
= t
;
4482 /* Check to see if the symbol is already in an equivalence group.
4483 If it is, set the other members as being in common. */
4484 if (sym
->attr
.in_equivalence
)
4486 for (e1
= gfc_current_ns
->equiv
; e1
; e1
= e1
->next
)
4488 for (e2
= e1
; e2
; e2
= e2
->eq
)
4489 if (e2
->expr
->symtree
->n
.sym
== sym
)
4496 for (e2
= e1
; e2
; e2
= e2
->eq
)
4498 other
= e2
->expr
->symtree
->n
.sym
;
4499 if (other
->common_head
4500 && other
->common_head
!= sym
->common_head
)
4502 gfc_error ("Symbol '%s', in COMMON block '%s' at "
4503 "%C is being indirectly equivalenced to "
4504 "another COMMON block '%s'",
4505 sym
->name
, sym
->common_head
->name
,
4506 other
->common_head
->name
);
4509 other
->attr
.in_common
= 1;
4510 other
->common_head
= t
;
4516 gfc_gobble_whitespace ();
4517 if (gfc_match_eos () == MATCH_YES
)
4519 if (gfc_peek_ascii_char () == '/')
4521 if (gfc_match_char (',') != MATCH_YES
)
4523 gfc_gobble_whitespace ();
4524 if (gfc_peek_ascii_char () == '/')
4533 gfc_syntax_error (ST_COMMON
);
4536 if (old_blank_common
)
4537 old_blank_common
->common_next
= NULL
;
4539 gfc_current_ns
->blank_common
.head
= NULL
;
4540 gfc_free_array_spec (as
);
4545 /* Match a BLOCK DATA program unit. */
4548 gfc_match_block_data (void)
4550 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
4554 if (gfc_match_eos () == MATCH_YES
)
4556 gfc_new_block
= NULL
;
4560 m
= gfc_match ("% %n%t", name
);
4564 if (gfc_get_symbol (name
, NULL
, &sym
))
4567 if (gfc_add_flavor (&sym
->attr
, FL_BLOCK_DATA
, sym
->name
, NULL
) == FAILURE
)
4570 gfc_new_block
= sym
;
4576 /* Free a namelist structure. */
4579 gfc_free_namelist (gfc_namelist
*name
)
4583 for (; name
; name
= n
)
4591 /* Match a NAMELIST statement. */
4594 gfc_match_namelist (void)
4596 gfc_symbol
*group_name
, *sym
;
4600 m
= gfc_match (" / %s /", &group_name
);
4603 if (m
== MATCH_ERROR
)
4608 if (group_name
->ts
.type
!= BT_UNKNOWN
)
4610 gfc_error ("Namelist group name '%s' at %C already has a basic "
4611 "type of %s", group_name
->name
,
4612 gfc_typename (&group_name
->ts
));
4616 if (group_name
->attr
.flavor
== FL_NAMELIST
4617 && group_name
->attr
.use_assoc
4618 && gfc_notify_std (GFC_STD_GNU
, "Namelist group name '%s' "
4619 "at %C already is USE associated and can"
4620 "not be respecified.", group_name
->name
)
4624 if (group_name
->attr
.flavor
!= FL_NAMELIST
4625 && gfc_add_flavor (&group_name
->attr
, FL_NAMELIST
,
4626 group_name
->name
, NULL
) == FAILURE
)
4631 m
= gfc_match_symbol (&sym
, 1);
4634 if (m
== MATCH_ERROR
)
4637 if (sym
->attr
.in_namelist
== 0
4638 && gfc_add_in_namelist (&sym
->attr
, sym
->name
, NULL
) == FAILURE
)
4641 /* Use gfc_error_check here, rather than goto error, so that
4642 these are the only errors for the next two lines. */
4643 if (sym
->as
&& sym
->as
->type
== AS_ASSUMED_SIZE
)
4645 gfc_error ("Assumed size array '%s' in namelist '%s' at "
4646 "%C is not allowed", sym
->name
, group_name
->name
);
4650 nl
= gfc_get_namelist ();
4654 if (group_name
->namelist
== NULL
)
4655 group_name
->namelist
= group_name
->namelist_tail
= nl
;
4658 group_name
->namelist_tail
->next
= nl
;
4659 group_name
->namelist_tail
= nl
;
4662 if (gfc_match_eos () == MATCH_YES
)
4665 m
= gfc_match_char (',');
4667 if (gfc_match_char ('/') == MATCH_YES
)
4669 m2
= gfc_match (" %s /", &group_name
);
4670 if (m2
== MATCH_YES
)
4672 if (m2
== MATCH_ERROR
)
4686 gfc_syntax_error (ST_NAMELIST
);
4693 /* Match a MODULE statement. */
4696 gfc_match_module (void)
4700 m
= gfc_match (" %s%t", &gfc_new_block
);
4704 if (gfc_add_flavor (&gfc_new_block
->attr
, FL_MODULE
,
4705 gfc_new_block
->name
, NULL
) == FAILURE
)
4712 /* Free equivalence sets and lists. Recursively is the easiest way to
4716 gfc_free_equiv_until (gfc_equiv
*eq
, gfc_equiv
*stop
)
4721 gfc_free_equiv (eq
->eq
);
4722 gfc_free_equiv_until (eq
->next
, stop
);
4723 gfc_free_expr (eq
->expr
);
4729 gfc_free_equiv (gfc_equiv
*eq
)
4731 gfc_free_equiv_until (eq
, NULL
);
4735 /* Match an EQUIVALENCE statement. */
4738 gfc_match_equivalence (void)
4740 gfc_equiv
*eq
, *set
, *tail
;
4744 gfc_common_head
*common_head
= NULL
;
4752 eq
= gfc_get_equiv ();
4756 eq
->next
= gfc_current_ns
->equiv
;
4757 gfc_current_ns
->equiv
= eq
;
4759 if (gfc_match_char ('(') != MATCH_YES
)
4763 common_flag
= FALSE
;
4768 m
= gfc_match_equiv_variable (&set
->expr
);
4769 if (m
== MATCH_ERROR
)
4774 /* count the number of objects. */
4777 if (gfc_match_char ('%') == MATCH_YES
)
4779 gfc_error ("Derived type component %C is not a "
4780 "permitted EQUIVALENCE member");
4784 for (ref
= set
->expr
->ref
; ref
; ref
= ref
->next
)
4785 if (ref
->type
== REF_ARRAY
&& ref
->u
.ar
.type
== AR_SECTION
)
4787 gfc_error ("Array reference in EQUIVALENCE at %C cannot "
4788 "be an array section");
4792 sym
= set
->expr
->symtree
->n
.sym
;
4794 if (gfc_add_in_equivalence (&sym
->attr
, sym
->name
, NULL
) == FAILURE
)
4797 if (sym
->attr
.in_common
)
4800 common_head
= sym
->common_head
;
4803 if (gfc_match_char (')') == MATCH_YES
)
4806 if (gfc_match_char (',') != MATCH_YES
)
4809 set
->eq
= gfc_get_equiv ();
4815 gfc_error ("EQUIVALENCE at %C requires two or more objects");
4819 /* If one of the members of an equivalence is in common, then
4820 mark them all as being in common. Before doing this, check
4821 that members of the equivalence group are not in different
4824 for (set
= eq
; set
; set
= set
->eq
)
4826 sym
= set
->expr
->symtree
->n
.sym
;
4827 if (sym
->common_head
&& sym
->common_head
!= common_head
)
4829 gfc_error ("Attempt to indirectly overlap COMMON "
4830 "blocks %s and %s by EQUIVALENCE at %C",
4831 sym
->common_head
->name
, common_head
->name
);
4834 sym
->attr
.in_common
= 1;
4835 sym
->common_head
= common_head
;
4838 if (gfc_match_eos () == MATCH_YES
)
4840 if (gfc_match_char (',') != MATCH_YES
)
4842 gfc_error ("Expecting a comma in EQUIVALENCE at %C");
4850 gfc_syntax_error (ST_EQUIVALENCE
);
4856 gfc_free_equiv (gfc_current_ns
->equiv
);
4857 gfc_current_ns
->equiv
= eq
;
4863 /* Check that a statement function is not recursive. This is done by looking
4864 for the statement function symbol(sym) by looking recursively through its
4865 expression(e). If a reference to sym is found, true is returned.
4866 12.5.4 requires that any variable of function that is implicitly typed
4867 shall have that type confirmed by any subsequent type declaration. The
4868 implicit typing is conveniently done here. */
4870 recursive_stmt_fcn (gfc_expr
*, gfc_symbol
*);
4873 check_stmt_fcn (gfc_expr
*e
, gfc_symbol
*sym
, int *f ATTRIBUTE_UNUSED
)
4879 switch (e
->expr_type
)
4882 if (e
->symtree
== NULL
)
4885 /* Check the name before testing for nested recursion! */
4886 if (sym
->name
== e
->symtree
->n
.sym
->name
)
4889 /* Catch recursion via other statement functions. */
4890 if (e
->symtree
->n
.sym
->attr
.proc
== PROC_ST_FUNCTION
4891 && e
->symtree
->n
.sym
->value
4892 && recursive_stmt_fcn (e
->symtree
->n
.sym
->value
, sym
))
4895 if (e
->symtree
->n
.sym
->ts
.type
== BT_UNKNOWN
)
4896 gfc_set_default_type (e
->symtree
->n
.sym
, 0, NULL
);
4901 if (e
->symtree
&& sym
->name
== e
->symtree
->n
.sym
->name
)
4904 if (e
->symtree
->n
.sym
->ts
.type
== BT_UNKNOWN
)
4905 gfc_set_default_type (e
->symtree
->n
.sym
, 0, NULL
);
4917 recursive_stmt_fcn (gfc_expr
*e
, gfc_symbol
*sym
)
4919 return gfc_traverse_expr (e
, sym
, check_stmt_fcn
, 0);
4923 /* Match a statement function declaration. It is so easy to match
4924 non-statement function statements with a MATCH_ERROR as opposed to
4925 MATCH_NO that we suppress error message in most cases. */
4928 gfc_match_st_function (void)
4930 gfc_error_buf old_error
;
4935 m
= gfc_match_symbol (&sym
, 0);
4939 gfc_push_error (&old_error
);
4941 if (gfc_add_procedure (&sym
->attr
, PROC_ST_FUNCTION
,
4942 sym
->name
, NULL
) == FAILURE
)
4945 if (gfc_match_formal_arglist (sym
, 1, 0) != MATCH_YES
)
4948 m
= gfc_match (" = %e%t", &expr
);
4952 gfc_free_error (&old_error
);
4953 if (m
== MATCH_ERROR
)
4956 if (recursive_stmt_fcn (expr
, sym
))
4958 gfc_error ("Statement function at %L is recursive", &expr
->where
);
4964 if (gfc_notify_std (GFC_STD_F95_OBS
, "Obsolescent feature: "
4965 "Statement function at %C") == FAILURE
)
4971 gfc_pop_error (&old_error
);
4976 /***************** SELECT CASE subroutines ******************/
4978 /* Free a single case structure. */
4981 free_case (gfc_case
*p
)
4983 if (p
->low
== p
->high
)
4985 gfc_free_expr (p
->low
);
4986 gfc_free_expr (p
->high
);
4991 /* Free a list of case structures. */
4994 gfc_free_case_list (gfc_case
*p
)
5006 /* Match a single case selector. */
5009 match_case_selector (gfc_case
**cp
)
5014 c
= gfc_get_case ();
5015 c
->where
= gfc_current_locus
;
5017 if (gfc_match_char (':') == MATCH_YES
)
5019 m
= gfc_match_init_expr (&c
->high
);
5022 if (m
== MATCH_ERROR
)
5027 m
= gfc_match_init_expr (&c
->low
);
5028 if (m
== MATCH_ERROR
)
5033 /* If we're not looking at a ':' now, make a range out of a single
5034 target. Else get the upper bound for the case range. */
5035 if (gfc_match_char (':') != MATCH_YES
)
5039 m
= gfc_match_init_expr (&c
->high
);
5040 if (m
== MATCH_ERROR
)
5042 /* MATCH_NO is fine. It's OK if nothing is there! */
5050 gfc_error ("Expected initialization expression in CASE at %C");
5058 /* Match the end of a case statement. */
5061 match_case_eos (void)
5063 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
5066 if (gfc_match_eos () == MATCH_YES
)
5069 /* If the case construct doesn't have a case-construct-name, we
5070 should have matched the EOS. */
5071 if (!gfc_current_block ())
5074 gfc_gobble_whitespace ();
5076 m
= gfc_match_name (name
);
5080 if (strcmp (name
, gfc_current_block ()->name
) != 0)
5082 gfc_error ("Expected block name '%s' of SELECT construct at %C",
5083 gfc_current_block ()->name
);
5087 return gfc_match_eos ();
5091 /* Match a SELECT statement. */
5094 gfc_match_select (void)
5099 m
= gfc_match_label ();
5100 if (m
== MATCH_ERROR
)
5103 m
= gfc_match (" select case ( %e )%t", &expr
);
5107 new_st
.op
= EXEC_SELECT
;
5108 new_st
.expr1
= expr
;
5114 /* Push the current selector onto the SELECT TYPE stack. */
5117 select_type_push (gfc_symbol
*sel
)
5119 gfc_select_type_stack
*top
= gfc_get_select_type_stack ();
5120 top
->selector
= sel
;
5122 top
->prev
= select_type_stack
;
5124 select_type_stack
= top
;
5128 /* Set the temporary for the current SELECT TYPE selector. */
5131 select_type_set_tmp (gfc_typespec
*ts
)
5133 char name
[GFC_MAX_SYMBOL_LEN
];
5138 select_type_stack
->tmp
= NULL
;
5142 if (!gfc_type_is_extensible (ts
->u
.derived
))
5145 if (ts
->type
== BT_CLASS
)
5146 sprintf (name
, "__tmp_class_%s", ts
->u
.derived
->name
);
5148 sprintf (name
, "__tmp_type_%s", ts
->u
.derived
->name
);
5149 gfc_get_sym_tree (name
, gfc_current_ns
, &tmp
, false);
5150 gfc_add_type (tmp
->n
.sym
, ts
, NULL
);
5151 gfc_set_sym_referenced (tmp
->n
.sym
);
5152 if (select_type_stack
->selector
->ts
.type
== BT_CLASS
&&
5153 CLASS_DATA (select_type_stack
->selector
)->attr
.allocatable
)
5154 gfc_add_allocatable (&tmp
->n
.sym
->attr
, NULL
);
5156 gfc_add_pointer (&tmp
->n
.sym
->attr
, NULL
);
5157 gfc_add_flavor (&tmp
->n
.sym
->attr
, FL_VARIABLE
, name
, NULL
);
5158 if (ts
->type
== BT_CLASS
)
5159 gfc_build_class_symbol (&tmp
->n
.sym
->ts
, &tmp
->n
.sym
->attr
,
5160 &tmp
->n
.sym
->as
, false);
5161 tmp
->n
.sym
->attr
.select_type_temporary
= 1;
5163 /* Add an association for it, so the rest of the parser knows it is
5164 an associate-name. The target will be set during resolution. */
5165 tmp
->n
.sym
->assoc
= gfc_get_association_list ();
5166 tmp
->n
.sym
->assoc
->dangling
= 1;
5167 tmp
->n
.sym
->assoc
->st
= tmp
;
5169 select_type_stack
->tmp
= tmp
;
5173 /* Match a SELECT TYPE statement. */
5176 gfc_match_select_type (void)
5178 gfc_expr
*expr1
, *expr2
= NULL
;
5180 char name
[GFC_MAX_SYMBOL_LEN
];
5182 m
= gfc_match_label ();
5183 if (m
== MATCH_ERROR
)
5186 m
= gfc_match (" select type ( ");
5190 gfc_current_ns
= gfc_build_block_ns (gfc_current_ns
);
5192 m
= gfc_match (" %n => %e", name
, &expr2
);
5195 expr1
= gfc_get_expr();
5196 expr1
->expr_type
= EXPR_VARIABLE
;
5197 if (gfc_get_sym_tree (name
, NULL
, &expr1
->symtree
, false))
5202 if (expr2
->ts
.type
== BT_UNKNOWN
)
5203 expr1
->symtree
->n
.sym
->attr
.untyped
= 1;
5205 expr1
->symtree
->n
.sym
->ts
= expr2
->ts
;
5206 expr1
->symtree
->n
.sym
->attr
.flavor
= FL_VARIABLE
;
5207 expr1
->symtree
->n
.sym
->attr
.referenced
= 1;
5208 expr1
->symtree
->n
.sym
->attr
.class_ok
= 1;
5212 m
= gfc_match (" %e ", &expr1
);
5217 m
= gfc_match (" )%t");
5221 /* Check for F03:C811. */
5222 if (!expr2
&& (expr1
->expr_type
!= EXPR_VARIABLE
|| expr1
->ref
!= NULL
))
5224 gfc_error ("Selector in SELECT TYPE at %C is not a named variable; "
5225 "use associate-name=>");
5230 new_st
.op
= EXEC_SELECT_TYPE
;
5231 new_st
.expr1
= expr1
;
5232 new_st
.expr2
= expr2
;
5233 new_st
.ext
.block
.ns
= gfc_current_ns
;
5235 select_type_push (expr1
->symtree
->n
.sym
);
5240 gfc_current_ns
= gfc_current_ns
->parent
;
5245 /* Match a CASE statement. */
5248 gfc_match_case (void)
5250 gfc_case
*c
, *head
, *tail
;
5255 if (gfc_current_state () != COMP_SELECT
)
5257 gfc_error ("Unexpected CASE statement at %C");
5261 if (gfc_match ("% default") == MATCH_YES
)
5263 m
= match_case_eos ();
5266 if (m
== MATCH_ERROR
)
5269 new_st
.op
= EXEC_SELECT
;
5270 c
= gfc_get_case ();
5271 c
->where
= gfc_current_locus
;
5272 new_st
.ext
.block
.case_list
= c
;
5276 if (gfc_match_char ('(') != MATCH_YES
)
5281 if (match_case_selector (&c
) == MATCH_ERROR
)
5291 if (gfc_match_char (')') == MATCH_YES
)
5293 if (gfc_match_char (',') != MATCH_YES
)
5297 m
= match_case_eos ();
5300 if (m
== MATCH_ERROR
)
5303 new_st
.op
= EXEC_SELECT
;
5304 new_st
.ext
.block
.case_list
= head
;
5309 gfc_error ("Syntax error in CASE specification at %C");
5312 gfc_free_case_list (head
); /* new_st is cleaned up in parse.c. */
5317 /* Match a TYPE IS statement. */
5320 gfc_match_type_is (void)
5325 if (gfc_current_state () != COMP_SELECT_TYPE
)
5327 gfc_error ("Unexpected TYPE IS statement at %C");
5331 if (gfc_match_char ('(') != MATCH_YES
)
5334 c
= gfc_get_case ();
5335 c
->where
= gfc_current_locus
;
5337 /* TODO: Once unlimited polymorphism is implemented, we will need to call
5338 match_type_spec here. */
5339 if (match_derived_type_spec (&c
->ts
) == MATCH_ERROR
)
5342 if (gfc_match_char (')') != MATCH_YES
)
5345 m
= match_case_eos ();
5348 if (m
== MATCH_ERROR
)
5351 new_st
.op
= EXEC_SELECT_TYPE
;
5352 new_st
.ext
.block
.case_list
= c
;
5354 /* Create temporary variable. */
5355 select_type_set_tmp (&c
->ts
);
5360 gfc_error ("Syntax error in TYPE IS specification at %C");
5364 gfc_free_case_list (c
); /* new_st is cleaned up in parse.c. */
5369 /* Match a CLASS IS or CLASS DEFAULT statement. */
5372 gfc_match_class_is (void)
5377 if (gfc_current_state () != COMP_SELECT_TYPE
)
5380 if (gfc_match ("% default") == MATCH_YES
)
5382 m
= match_case_eos ();
5385 if (m
== MATCH_ERROR
)
5388 new_st
.op
= EXEC_SELECT_TYPE
;
5389 c
= gfc_get_case ();
5390 c
->where
= gfc_current_locus
;
5391 c
->ts
.type
= BT_UNKNOWN
;
5392 new_st
.ext
.block
.case_list
= c
;
5393 select_type_set_tmp (NULL
);
5397 m
= gfc_match ("% is");
5400 if (m
== MATCH_ERROR
)
5403 if (gfc_match_char ('(') != MATCH_YES
)
5406 c
= gfc_get_case ();
5407 c
->where
= gfc_current_locus
;
5409 if (match_derived_type_spec (&c
->ts
) == MATCH_ERROR
)
5412 if (c
->ts
.type
== BT_DERIVED
)
5413 c
->ts
.type
= BT_CLASS
;
5415 if (gfc_match_char (')') != MATCH_YES
)
5418 m
= match_case_eos ();
5421 if (m
== MATCH_ERROR
)
5424 new_st
.op
= EXEC_SELECT_TYPE
;
5425 new_st
.ext
.block
.case_list
= c
;
5427 /* Create temporary variable. */
5428 select_type_set_tmp (&c
->ts
);
5433 gfc_error ("Syntax error in CLASS IS specification at %C");
5437 gfc_free_case_list (c
); /* new_st is cleaned up in parse.c. */
5442 /********************* WHERE subroutines ********************/
5444 /* Match the rest of a simple WHERE statement that follows an IF statement.
5448 match_simple_where (void)
5454 m
= gfc_match (" ( %e )", &expr
);
5458 m
= gfc_match_assignment ();
5461 if (m
== MATCH_ERROR
)
5464 if (gfc_match_eos () != MATCH_YES
)
5467 c
= gfc_get_code ();
5471 c
->next
= gfc_get_code ();
5474 gfc_clear_new_st ();
5476 new_st
.op
= EXEC_WHERE
;
5482 gfc_syntax_error (ST_WHERE
);
5485 gfc_free_expr (expr
);
5490 /* Match a WHERE statement. */
5493 gfc_match_where (gfc_statement
*st
)
5499 m0
= gfc_match_label ();
5500 if (m0
== MATCH_ERROR
)
5503 m
= gfc_match (" where ( %e )", &expr
);
5507 if (gfc_match_eos () == MATCH_YES
)
5509 *st
= ST_WHERE_BLOCK
;
5510 new_st
.op
= EXEC_WHERE
;
5511 new_st
.expr1
= expr
;
5515 m
= gfc_match_assignment ();
5517 gfc_syntax_error (ST_WHERE
);
5521 gfc_free_expr (expr
);
5525 /* We've got a simple WHERE statement. */
5527 c
= gfc_get_code ();
5531 c
->next
= gfc_get_code ();
5534 gfc_clear_new_st ();
5536 new_st
.op
= EXEC_WHERE
;
5543 /* Match an ELSEWHERE statement. We leave behind a WHERE node in
5544 new_st if successful. */
5547 gfc_match_elsewhere (void)
5549 char name
[GFC_MAX_SYMBOL_LEN
+ 1];
5553 if (gfc_current_state () != COMP_WHERE
)
5555 gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
5561 if (gfc_match_char ('(') == MATCH_YES
)
5563 m
= gfc_match_expr (&expr
);
5566 if (m
== MATCH_ERROR
)
5569 if (gfc_match_char (')') != MATCH_YES
)
5573 if (gfc_match_eos () != MATCH_YES
)
5575 /* Only makes sense if we have a where-construct-name. */
5576 if (!gfc_current_block ())
5581 /* Better be a name at this point. */
5582 m
= gfc_match_name (name
);
5585 if (m
== MATCH_ERROR
)
5588 if (gfc_match_eos () != MATCH_YES
)
5591 if (strcmp (name
, gfc_current_block ()->name
) != 0)
5593 gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
5594 name
, gfc_current_block ()->name
);
5599 new_st
.op
= EXEC_WHERE
;
5600 new_st
.expr1
= expr
;
5604 gfc_syntax_error (ST_ELSEWHERE
);
5607 gfc_free_expr (expr
);