]> gcc.gnu.org Git - gcc.git/blame - gcc/fortran/match.c
re PR fortran/15481 ([meta-bugs] frontend adds superfluous symbols to namespaces)
[gcc.git] / gcc / fortran / match.c
CommitLineData
6de9cd9a 1/* Matching subroutines in all sizes, shapes and colors.
9fc4d79b
TS
2 Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation,
3 Inc.
6de9cd9a
DN
4 Contributed by Andy Vaught
5
9fc4d79b 6This file is part of GCC.
6de9cd9a 7
9fc4d79b
TS
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 2, or (at your option) any later
11version.
6de9cd9a 12
9fc4d79b
TS
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
6de9cd9a
DN
17
18You should have received a copy of the GNU General Public License
9fc4d79b
TS
19along with GCC; see the file COPYING. If not, write to the Free
20Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2102111-1307, USA. */
6de9cd9a
DN
22
23
24#include "config.h"
25#include "system.h"
26#include "flags.h"
27
28#include <stdarg.h>
29#include <string.h>
30
31#include "gfortran.h"
32#include "match.h"
33#include "parse.h"
34
35/* For matching and debugging purposes. Order matters here! The
36 unary operators /must/ precede the binary plus and minus, or
37 the expression parser breaks. */
38
39mstring intrinsic_operators[] = {
40 minit ("+", INTRINSIC_UPLUS),
41 minit ("-", INTRINSIC_UMINUS),
42 minit ("+", INTRINSIC_PLUS),
43 minit ("-", INTRINSIC_MINUS),
44 minit ("**", INTRINSIC_POWER),
45 minit ("//", INTRINSIC_CONCAT),
46 minit ("*", INTRINSIC_TIMES),
47 minit ("/", INTRINSIC_DIVIDE),
48 minit (".and.", INTRINSIC_AND),
49 minit (".or.", INTRINSIC_OR),
50 minit (".eqv.", INTRINSIC_EQV),
51 minit (".neqv.", INTRINSIC_NEQV),
52 minit (".eq.", INTRINSIC_EQ),
53 minit ("==", INTRINSIC_EQ),
54 minit (".ne.", INTRINSIC_NE),
55 minit ("/=", INTRINSIC_NE),
56 minit (".ge.", INTRINSIC_GE),
57 minit (">=", INTRINSIC_GE),
58 minit (".le.", INTRINSIC_LE),
59 minit ("<=", INTRINSIC_LE),
60 minit (".lt.", INTRINSIC_LT),
61 minit ("<", INTRINSIC_LT),
62 minit (".gt.", INTRINSIC_GT),
63 minit (">", INTRINSIC_GT),
64 minit (".not.", INTRINSIC_NOT),
65 minit (NULL, INTRINSIC_NONE)
66};
67
68
69/******************** Generic matching subroutines ************************/
70
71/* In free form, match at least one space. Always matches in fixed
72 form. */
73
74match
75gfc_match_space (void)
76{
77 locus old_loc;
78 int c;
79
d4fa05b9 80 if (gfc_current_form == FORM_FIXED)
6de9cd9a
DN
81 return MATCH_YES;
82
63645982 83 old_loc = gfc_current_locus;
6de9cd9a
DN
84
85 c = gfc_next_char ();
86 if (!gfc_is_whitespace (c))
87 {
63645982 88 gfc_current_locus = old_loc;
6de9cd9a
DN
89 return MATCH_NO;
90 }
91
92 gfc_gobble_whitespace ();
93
94 return MATCH_YES;
95}
96
97
98/* Match an end of statement. End of statement is optional
99 whitespace, followed by a ';' or '\n' or comment '!'. If a
100 semicolon is found, we continue to eat whitespace and semicolons. */
101
102match
103gfc_match_eos (void)
104{
105 locus old_loc;
106 int flag, c;
107
108 flag = 0;
109
110 for (;;)
111 {
63645982 112 old_loc = gfc_current_locus;
6de9cd9a
DN
113 gfc_gobble_whitespace ();
114
115 c = gfc_next_char ();
116 switch (c)
117 {
118 case '!':
119 do
120 {
121 c = gfc_next_char ();
122 }
123 while (c != '\n');
124
125 /* Fall through */
126
127 case '\n':
128 return MATCH_YES;
129
130 case ';':
131 flag = 1;
132 continue;
133 }
134
135 break;
136 }
137
63645982 138 gfc_current_locus = old_loc;
6de9cd9a
DN
139 return (flag) ? MATCH_YES : MATCH_NO;
140}
141
142
143/* Match a literal integer on the input, setting the value on
144 MATCH_YES. Literal ints occur in kind-parameters as well as
145 old-style character length specifications. */
146
147match
148gfc_match_small_literal_int (int *value)
149{
150 locus old_loc;
151 char c;
152 int i;
153
63645982 154 old_loc = gfc_current_locus;
6de9cd9a
DN
155
156 gfc_gobble_whitespace ();
157 c = gfc_next_char ();
158
159 if (!ISDIGIT (c))
160 {
63645982 161 gfc_current_locus = old_loc;
6de9cd9a
DN
162 return MATCH_NO;
163 }
164
165 i = c - '0';
166
167 for (;;)
168 {
63645982 169 old_loc = gfc_current_locus;
6de9cd9a
DN
170 c = gfc_next_char ();
171
172 if (!ISDIGIT (c))
173 break;
174
175 i = 10 * i + c - '0';
176
177 if (i > 99999999)
178 {
179 gfc_error ("Integer too large at %C");
180 return MATCH_ERROR;
181 }
182 }
183
63645982 184 gfc_current_locus = old_loc;
6de9cd9a
DN
185
186 *value = i;
187 return MATCH_YES;
188}
189
190
191/* Match a small, constant integer expression, like in a kind
192 statement. On MATCH_YES, 'value' is set. */
193
194match
195gfc_match_small_int (int *value)
196{
197 gfc_expr *expr;
198 const char *p;
199 match m;
200 int i;
201
202 m = gfc_match_expr (&expr);
203 if (m != MATCH_YES)
204 return m;
205
206 p = gfc_extract_int (expr, &i);
207 gfc_free_expr (expr);
208
209 if (p != NULL)
210 {
211 gfc_error (p);
212 m = MATCH_ERROR;
213 }
214
215 *value = i;
216 return m;
217}
218
219
220/* Matches a statement label. Uses gfc_match_small_literal_int() to
221 do most of the work. */
222
223match
224gfc_match_st_label (gfc_st_label ** label, int allow_zero)
225{
226 locus old_loc;
227 match m;
228 int i;
229
63645982 230 old_loc = gfc_current_locus;
6de9cd9a
DN
231
232 m = gfc_match_small_literal_int (&i);
233 if (m != MATCH_YES)
234 return m;
235
236 if (((i == 0) && allow_zero) || i <= 99999)
237 {
238 *label = gfc_get_st_label (i);
239 return MATCH_YES;
240 }
241
242 gfc_error ("Statement label at %C is out of range");
63645982 243 gfc_current_locus = old_loc;
6de9cd9a
DN
244 return MATCH_ERROR;
245}
246
247
248/* Match and validate a label associated with a named IF, DO or SELECT
249 statement. If the symbol does not have the label attribute, we add
250 it. We also make sure the symbol does not refer to another
251 (active) block. A matched label is pointed to by gfc_new_block. */
252
253match
254gfc_match_label (void)
255{
256 char name[GFC_MAX_SYMBOL_LEN + 1];
257 gfc_state_data *p;
258 match m;
259
260 gfc_new_block = NULL;
261
262 m = gfc_match (" %n :", name);
263 if (m != MATCH_YES)
264 return m;
265
266 if (gfc_get_symbol (name, NULL, &gfc_new_block))
267 {
268 gfc_error ("Label name '%s' at %C is ambiguous", name);
269 return MATCH_ERROR;
270 }
271
272 if (gfc_new_block->attr.flavor != FL_LABEL
273 && gfc_add_flavor (&gfc_new_block->attr, FL_LABEL, NULL) == FAILURE)
274 return MATCH_ERROR;
275
276 for (p = gfc_state_stack; p; p = p->previous)
277 if (p->sym == gfc_new_block)
278 {
279 gfc_error ("Label %s at %C already in use by a parent block",
280 gfc_new_block->name);
281 return MATCH_ERROR;
282 }
283
284 return MATCH_YES;
285}
286
287
288/* Try and match the input against an array of possibilities. If one
289 potential matching string is a substring of another, the longest
290 match takes precedence. Spaces in the target strings are optional
291 spaces that do not necessarily have to be found in the input
292 stream. In fixed mode, spaces never appear. If whitespace is
293 matched, it matches unlimited whitespace in the input. For this
294 reason, the 'mp' member of the mstring structure is used to track
295 the progress of each potential match.
296
297 If there is no match we return the tag associated with the
298 terminating NULL mstring structure and leave the locus pointer
299 where it started. If there is a match we return the tag member of
300 the matched mstring and leave the locus pointer after the matched
301 character.
302
303 A '%' character is a mandatory space. */
304
305int
306gfc_match_strings (mstring * a)
307{
308 mstring *p, *best_match;
309 int no_match, c, possibles;
310 locus match_loc;
311
312 possibles = 0;
313
314 for (p = a; p->string != NULL; p++)
315 {
316 p->mp = p->string;
317 possibles++;
318 }
319
320 no_match = p->tag;
321
322 best_match = NULL;
63645982 323 match_loc = gfc_current_locus;
6de9cd9a
DN
324
325 gfc_gobble_whitespace ();
326
327 while (possibles > 0)
328 {
329 c = gfc_next_char ();
330
331 /* Apply the next character to the current possibilities. */
332 for (p = a; p->string != NULL; p++)
333 {
334 if (p->mp == NULL)
335 continue;
336
337 if (*p->mp == ' ')
338 {
339 /* Space matches 1+ whitespace(s). */
d4fa05b9 340 if ((gfc_current_form == FORM_FREE)
6de9cd9a
DN
341 && gfc_is_whitespace (c))
342 continue;
343
344 p->mp++;
345 }
346
347 if (*p->mp != c)
348 {
349 /* Match failed. */
350 p->mp = NULL;
351 possibles--;
352 continue;
353 }
354
355 p->mp++;
356 if (*p->mp == '\0')
357 {
358 /* Found a match. */
63645982 359 match_loc = gfc_current_locus;
6de9cd9a
DN
360 best_match = p;
361 possibles--;
362 p->mp = NULL;
363 }
364 }
365 }
366
63645982 367 gfc_current_locus = match_loc;
6de9cd9a
DN
368
369 return (best_match == NULL) ? no_match : best_match->tag;
370}
371
372
373/* See if the current input looks like a name of some sort. Modifies
374 the passed buffer which must be GFC_MAX_SYMBOL_LEN+1 bytes long. */
375
376match
377gfc_match_name (char *buffer)
378{
379 locus old_loc;
380 int i, c;
381
63645982 382 old_loc = gfc_current_locus;
6de9cd9a
DN
383 gfc_gobble_whitespace ();
384
385 c = gfc_next_char ();
386 if (!ISALPHA (c))
387 {
63645982 388 gfc_current_locus = old_loc;
6de9cd9a
DN
389 return MATCH_NO;
390 }
391
392 i = 0;
393
394 do
395 {
396 buffer[i++] = c;
397
398 if (i > gfc_option.max_identifier_length)
399 {
400 gfc_error ("Name at %C is too long");
401 return MATCH_ERROR;
402 }
403
63645982 404 old_loc = gfc_current_locus;
6de9cd9a
DN
405 c = gfc_next_char ();
406 }
407 while (ISALNUM (c)
408 || c == '_'
409 || (gfc_option.flag_dollar_ok && c == '$'));
410
411 buffer[i] = '\0';
63645982 412 gfc_current_locus = old_loc;
6de9cd9a
DN
413
414 return MATCH_YES;
415}
416
417
418/* Match a symbol on the input. Modifies the pointer to the symbol
419 pointer if successful. */
420
421match
422gfc_match_sym_tree (gfc_symtree ** matched_symbol, int host_assoc)
423{
424 char buffer[GFC_MAX_SYMBOL_LEN + 1];
425 match m;
426
427 m = gfc_match_name (buffer);
428 if (m != MATCH_YES)
429 return m;
430
431 if (host_assoc)
432 return (gfc_get_ha_sym_tree (buffer, matched_symbol))
433 ? MATCH_ERROR : MATCH_YES;
434
435 if (gfc_get_sym_tree (buffer, NULL, matched_symbol))
436 return MATCH_ERROR;
437
438 return MATCH_YES;
439}
440
441
442match
443gfc_match_symbol (gfc_symbol ** matched_symbol, int host_assoc)
444{
445 gfc_symtree *st;
446 match m;
447
448 m = gfc_match_sym_tree (&st, host_assoc);
449
450 if (m == MATCH_YES)
451 {
452 if (st)
453 *matched_symbol = st->n.sym;
454 else
455 *matched_symbol = NULL;
456 }
457 return m;
458}
459
460/* Match an intrinsic operator. Returns an INTRINSIC enum. While matching,
461 we always find INTRINSIC_PLUS before INTRINSIC_UPLUS. We work around this
462 in matchexp.c. */
463
464match
465gfc_match_intrinsic_op (gfc_intrinsic_op * result)
466{
467 gfc_intrinsic_op op;
468
469 op = (gfc_intrinsic_op) gfc_match_strings (intrinsic_operators);
470
471 if (op == INTRINSIC_NONE)
472 return MATCH_NO;
473
474 *result = op;
475 return MATCH_YES;
476}
477
478
479/* Match a loop control phrase:
480
481 <LVALUE> = <EXPR>, <EXPR> [, <EXPR> ]
482
483 If the final integer expression is not present, a constant unity
484 expression is returned. We don't return MATCH_ERROR until after
485 the equals sign is seen. */
486
487match
488gfc_match_iterator (gfc_iterator * iter, int init_flag)
489{
490 char name[GFC_MAX_SYMBOL_LEN + 1];
491 gfc_expr *var, *e1, *e2, *e3;
492 locus start;
493 match m;
494
495 /* Match the start of an iterator without affecting the symbol
496 table. */
497
63645982 498 start = gfc_current_locus;
6de9cd9a 499 m = gfc_match (" %n =", name);
63645982 500 gfc_current_locus = start;
6de9cd9a
DN
501
502 if (m != MATCH_YES)
503 return MATCH_NO;
504
505 m = gfc_match_variable (&var, 0);
506 if (m != MATCH_YES)
507 return MATCH_NO;
508
509 gfc_match_char ('=');
510
511 e1 = e2 = e3 = NULL;
512
513 if (var->ref != NULL)
514 {
515 gfc_error ("Loop variable at %C cannot be a sub-component");
516 goto cleanup;
517 }
518
519 if (var->symtree->n.sym->attr.intent == INTENT_IN)
520 {
521 gfc_error ("Loop variable '%s' at %C cannot be INTENT(IN)",
522 var->symtree->n.sym->name);
523 goto cleanup;
524 }
525
526 if (var->symtree->n.sym->attr.pointer)
527 {
528 gfc_error ("Loop variable at %C cannot have the POINTER attribute");
529 goto cleanup;
530 }
531
532 m = init_flag ? gfc_match_init_expr (&e1) : gfc_match_expr (&e1);
533 if (m == MATCH_NO)
534 goto syntax;
535 if (m == MATCH_ERROR)
536 goto cleanup;
537
538 if (gfc_match_char (',') != MATCH_YES)
539 goto syntax;
540
541 m = init_flag ? gfc_match_init_expr (&e2) : gfc_match_expr (&e2);
542 if (m == MATCH_NO)
543 goto syntax;
544 if (m == MATCH_ERROR)
545 goto cleanup;
546
547 if (gfc_match_char (',') != MATCH_YES)
548 {
549 e3 = gfc_int_expr (1);
550 goto done;
551 }
552
553 m = init_flag ? gfc_match_init_expr (&e3) : gfc_match_expr (&e3);
554 if (m == MATCH_ERROR)
555 goto cleanup;
556 if (m == MATCH_NO)
557 {
558 gfc_error ("Expected a step value in iterator at %C");
559 goto cleanup;
560 }
561
562done:
563 iter->var = var;
564 iter->start = e1;
565 iter->end = e2;
566 iter->step = e3;
567 return MATCH_YES;
568
569syntax:
570 gfc_error ("Syntax error in iterator at %C");
571
572cleanup:
573 gfc_free_expr (e1);
574 gfc_free_expr (e2);
575 gfc_free_expr (e3);
576
577 return MATCH_ERROR;
578}
579
580
581/* Tries to match the next non-whitespace character on the input.
582 This subroutine does not return MATCH_ERROR. */
583
584match
585gfc_match_char (char c)
586{
587 locus where;
588
63645982 589 where = gfc_current_locus;
6de9cd9a
DN
590 gfc_gobble_whitespace ();
591
592 if (gfc_next_char () == c)
593 return MATCH_YES;
594
63645982 595 gfc_current_locus = where;
6de9cd9a
DN
596 return MATCH_NO;
597}
598
599
600/* General purpose matching subroutine. The target string is a
601 scanf-like format string in which spaces correspond to arbitrary
602 whitespace (including no whitespace), characters correspond to
603 themselves. The %-codes are:
604
605 %% Literal percent sign
606 %e Expression, pointer to a pointer is set
607 %s Symbol, pointer to the symbol is set
608 %n Name, character buffer is set to name
609 %t Matches end of statement.
610 %o Matches an intrinsic operator, returned as an INTRINSIC enum.
611 %l Matches a statement label
612 %v Matches a variable expression (an lvalue)
613 % Matches a required space (in free form) and optional spaces. */
614
615match
616gfc_match (const char *target, ...)
617{
618 gfc_st_label **label;
619 int matches, *ip;
620 locus old_loc;
621 va_list argp;
622 char c, *np;
623 match m, n;
624 void **vp;
625 const char *p;
626
63645982 627 old_loc = gfc_current_locus;
6de9cd9a
DN
628 va_start (argp, target);
629 m = MATCH_NO;
630 matches = 0;
631 p = target;
632
633loop:
634 c = *p++;
635 switch (c)
636 {
637 case ' ':
638 gfc_gobble_whitespace ();
639 goto loop;
640 case '\0':
641 m = MATCH_YES;
642 break;
643
644 case '%':
645 c = *p++;
646 switch (c)
647 {
648 case 'e':
649 vp = va_arg (argp, void **);
650 n = gfc_match_expr ((gfc_expr **) vp);
651 if (n != MATCH_YES)
652 {
653 m = n;
654 goto not_yes;
655 }
656
657 matches++;
658 goto loop;
659
660 case 'v':
661 vp = va_arg (argp, void **);
662 n = gfc_match_variable ((gfc_expr **) vp, 0);
663 if (n != MATCH_YES)
664 {
665 m = n;
666 goto not_yes;
667 }
668
669 matches++;
670 goto loop;
671
672 case 's':
673 vp = va_arg (argp, void **);
674 n = gfc_match_symbol ((gfc_symbol **) vp, 0);
675 if (n != MATCH_YES)
676 {
677 m = n;
678 goto not_yes;
679 }
680
681 matches++;
682 goto loop;
683
684 case 'n':
685 np = va_arg (argp, char *);
686 n = gfc_match_name (np);
687 if (n != MATCH_YES)
688 {
689 m = n;
690 goto not_yes;
691 }
692
693 matches++;
694 goto loop;
695
696 case 'l':
697 label = va_arg (argp, gfc_st_label **);
698 n = gfc_match_st_label (label, 0);
699 if (n != MATCH_YES)
700 {
701 m = n;
702 goto not_yes;
703 }
704
705 matches++;
706 goto loop;
707
708 case 'o':
709 ip = va_arg (argp, int *);
710 n = gfc_match_intrinsic_op ((gfc_intrinsic_op *) ip);
711 if (n != MATCH_YES)
712 {
713 m = n;
714 goto not_yes;
715 }
716
717 matches++;
718 goto loop;
719
720 case 't':
721 if (gfc_match_eos () != MATCH_YES)
722 {
723 m = MATCH_NO;
724 goto not_yes;
725 }
726 goto loop;
727
728 case ' ':
729 if (gfc_match_space () == MATCH_YES)
730 goto loop;
731 m = MATCH_NO;
732 goto not_yes;
733
734 case '%':
735 break; /* Fall through to character matcher */
736
737 default:
738 gfc_internal_error ("gfc_match(): Bad match code %c", c);
739 }
740
741 default:
742 if (c == gfc_next_char ())
743 goto loop;
744 break;
745 }
746
747not_yes:
748 va_end (argp);
749
750 if (m != MATCH_YES)
751 {
752 /* Clean up after a failed match. */
63645982 753 gfc_current_locus = old_loc;
6de9cd9a
DN
754 va_start (argp, target);
755
756 p = target;
757 for (; matches > 0; matches--)
758 {
759 while (*p++ != '%');
760
761 switch (*p++)
762 {
763 case '%':
764 matches++;
765 break; /* Skip */
766
6de9cd9a
DN
767 /* Matches that don't have to be undone */
768 case 'o':
769 case 'l':
770 case 'n':
771 case 's':
772 (void)va_arg (argp, void **);
773 break;
774
775 case 'e':
6de9cd9a 776 case 'v':
6de9cd9a
DN
777 vp = va_arg (argp, void **);
778 gfc_free_expr (*vp);
779 *vp = NULL;
780 break;
781 }
782 }
783
784 va_end (argp);
785 }
786
787 return m;
788}
789
790
791/*********************** Statement level matching **********************/
792
793/* Matches the start of a program unit, which is the program keyword
794 followed by an optional symbol. */
795
796match
797gfc_match_program (void)
798{
799 gfc_symbol *sym;
800 match m;
801
802 m = gfc_match_eos ();
803 if (m == MATCH_YES)
804 return m;
805
806 m = gfc_match ("% %s%t", &sym);
807
808 if (m == MATCH_NO)
809 {
810 gfc_error ("Invalid form of PROGRAM statement at %C");
811 m = MATCH_ERROR;
812 }
813
814 if (m == MATCH_ERROR)
815 return m;
816
817 if (gfc_add_flavor (&sym->attr, FL_PROGRAM, NULL) == FAILURE)
818 return MATCH_ERROR;
819
820 gfc_new_block = sym;
821
822 return MATCH_YES;
823}
824
825
826/* Match a simple assignment statement. */
827
828match
829gfc_match_assignment (void)
830{
831 gfc_expr *lvalue, *rvalue;
832 locus old_loc;
833 match m;
834
63645982 835 old_loc = gfc_current_locus;
6de9cd9a
DN
836
837 lvalue = rvalue = NULL;
838 m = gfc_match (" %v =", &lvalue);
839 if (m != MATCH_YES)
840 goto cleanup;
841
842 m = gfc_match (" %e%t", &rvalue);
843 if (m != MATCH_YES)
844 goto cleanup;
845
846 gfc_set_sym_referenced (lvalue->symtree->n.sym);
847
848 new_st.op = EXEC_ASSIGN;
849 new_st.expr = lvalue;
850 new_st.expr2 = rvalue;
851
852 return MATCH_YES;
853
854cleanup:
63645982 855 gfc_current_locus = old_loc;
6de9cd9a
DN
856 gfc_free_expr (lvalue);
857 gfc_free_expr (rvalue);
858 return m;
859}
860
861
862/* Match a pointer assignment statement. */
863
864match
865gfc_match_pointer_assignment (void)
866{
867 gfc_expr *lvalue, *rvalue;
868 locus old_loc;
869 match m;
870
63645982 871 old_loc = gfc_current_locus;
6de9cd9a
DN
872
873 lvalue = rvalue = NULL;
874
875 m = gfc_match (" %v =>", &lvalue);
876 if (m != MATCH_YES)
877 {
878 m = MATCH_NO;
879 goto cleanup;
880 }
881
882 m = gfc_match (" %e%t", &rvalue);
883 if (m != MATCH_YES)
884 goto cleanup;
885
886 new_st.op = EXEC_POINTER_ASSIGN;
887 new_st.expr = lvalue;
888 new_st.expr2 = rvalue;
889
890 return MATCH_YES;
891
892cleanup:
63645982 893 gfc_current_locus = old_loc;
6de9cd9a
DN
894 gfc_free_expr (lvalue);
895 gfc_free_expr (rvalue);
896 return m;
897}
898
899
900/* The IF statement is a bit of a pain. First of all, there are three
901 forms of it, the simple IF, the IF that starts a block and the
902 arithmetic IF.
903
904 There is a problem with the simple IF and that is the fact that we
905 only have a single level of undo information on symbols. What this
906 means is for a simple IF, we must re-match the whole IF statement
907 multiple times in order to guarantee that the symbol table ends up
908 in the proper state. */
909
910match
911gfc_match_if (gfc_statement * if_type)
912{
913 gfc_expr *expr;
914 gfc_st_label *l1, *l2, *l3;
915 locus old_loc;
916 gfc_code *p;
917 match m, n;
918
919 n = gfc_match_label ();
920 if (n == MATCH_ERROR)
921 return n;
922
63645982 923 old_loc = gfc_current_locus;
6de9cd9a
DN
924
925 m = gfc_match (" if ( %e", &expr);
926 if (m != MATCH_YES)
927 return m;
928
929 if (gfc_match_char (')') != MATCH_YES)
930 {
931 gfc_error ("Syntax error in IF-expression at %C");
932 gfc_free_expr (expr);
933 return MATCH_ERROR;
934 }
935
936 m = gfc_match (" %l , %l , %l%t", &l1, &l2, &l3);
937
938 if (m == MATCH_YES)
939 {
940 if (n == MATCH_YES)
941 {
942 gfc_error
943 ("Block label not appropriate for arithmetic IF statement "
944 "at %C");
945
946 gfc_free_expr (expr);
947 return MATCH_ERROR;
948 }
949
950 if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
951 || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
952 || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
953 {
954
955 gfc_free_expr (expr);
956 return MATCH_ERROR;
957 }
958
959 new_st.op = EXEC_ARITHMETIC_IF;
960 new_st.expr = expr;
961 new_st.label = l1;
962 new_st.label2 = l2;
963 new_st.label3 = l3;
964
965 *if_type = ST_ARITHMETIC_IF;
966 return MATCH_YES;
967 }
968
969 if (gfc_match (" then %t") == MATCH_YES)
970 {
971 new_st.op = EXEC_IF;
972 new_st.expr = expr;
973
974 *if_type = ST_IF_BLOCK;
975 return MATCH_YES;
976 }
977
978 if (n == MATCH_YES)
979 {
980 gfc_error ("Block label is not appropriate IF statement at %C");
981
982 gfc_free_expr (expr);
983 return MATCH_ERROR;
984 }
985
986 /* At this point the only thing left is a simple IF statement. At
987 this point, n has to be MATCH_NO, so we don't have to worry about
988 re-matching a block label. From what we've got so far, try
989 matching an assignment. */
990
991 *if_type = ST_SIMPLE_IF;
992
993 m = gfc_match_assignment ();
994 if (m == MATCH_YES)
995 goto got_match;
996
997 gfc_free_expr (expr);
998 gfc_undo_symbols ();
63645982 999 gfc_current_locus = old_loc;
6de9cd9a
DN
1000
1001 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match */
1002
1003 m = gfc_match_pointer_assignment ();
1004 if (m == MATCH_YES)
1005 goto got_match;
1006
1007 gfc_free_expr (expr);
1008 gfc_undo_symbols ();
63645982 1009 gfc_current_locus = old_loc;
6de9cd9a
DN
1010
1011 gfc_match (" if ( %e ) ", &expr); /* Guaranteed to match */
1012
1013 /* Look at the next keyword to see which matcher to call. Matching
1014 the keyword doesn't affect the symbol table, so we don't have to
1015 restore between tries. */
1016
1017#define match(string, subr, statement) \
1018 if (gfc_match(string) == MATCH_YES) { m = subr(); goto got_match; }
1019
1020 gfc_clear_error ();
1021
1022 match ("allocate", gfc_match_allocate, ST_ALLOCATE)
1023 match ("backspace", gfc_match_backspace, ST_BACKSPACE)
1024 match ("call", gfc_match_call, ST_CALL)
1025 match ("close", gfc_match_close, ST_CLOSE)
1026 match ("continue", gfc_match_continue, ST_CONTINUE)
1027 match ("cycle", gfc_match_cycle, ST_CYCLE)
1028 match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE)
1029 match ("end file", gfc_match_endfile, ST_END_FILE)
1030 match ("exit", gfc_match_exit, ST_EXIT)
1031 match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT)
1032 match ("go to", gfc_match_goto, ST_GOTO)
1033 match ("inquire", gfc_match_inquire, ST_INQUIRE)
1034 match ("nullify", gfc_match_nullify, ST_NULLIFY)
1035 match ("open", gfc_match_open, ST_OPEN)
1036 match ("pause", gfc_match_pause, ST_NONE)
1037 match ("print", gfc_match_print, ST_WRITE)
1038 match ("read", gfc_match_read, ST_READ)
1039 match ("return", gfc_match_return, ST_RETURN)
1040 match ("rewind", gfc_match_rewind, ST_REWIND)
1041 match ("pause", gfc_match_stop, ST_PAUSE)
1042 match ("stop", gfc_match_stop, ST_STOP)
1043 match ("write", gfc_match_write, ST_WRITE)
1044
1045 /* All else has failed, so give up. See if any of the matchers has
1046 stored an error message of some sort. */
1047 if (gfc_error_check () == 0)
1048 gfc_error ("Unclassifiable statement in IF-clause at %C");
1049
1050 gfc_free_expr (expr);
1051 return MATCH_ERROR;
1052
1053got_match:
1054 if (m == MATCH_NO)
1055 gfc_error ("Syntax error in IF-clause at %C");
1056 if (m != MATCH_YES)
1057 {
1058 gfc_free_expr (expr);
1059 return MATCH_ERROR;
1060 }
1061
1062 /* At this point, we've matched the single IF and the action clause
1063 is in new_st. Rearrange things so that the IF statement appears
1064 in new_st. */
1065
1066 p = gfc_get_code ();
1067 p->next = gfc_get_code ();
1068 *p->next = new_st;
63645982 1069 p->next->loc = gfc_current_locus;
6de9cd9a
DN
1070
1071 p->expr = expr;
1072 p->op = EXEC_IF;
1073
1074 gfc_clear_new_st ();
1075
1076 new_st.op = EXEC_IF;
1077 new_st.block = p;
1078
1079 return MATCH_YES;
1080}
1081
1082#undef match
1083
1084
1085/* Match an ELSE statement. */
1086
1087match
1088gfc_match_else (void)
1089{
1090 char name[GFC_MAX_SYMBOL_LEN + 1];
1091
1092 if (gfc_match_eos () == MATCH_YES)
1093 return MATCH_YES;
1094
1095 if (gfc_match_name (name) != MATCH_YES
1096 || gfc_current_block () == NULL
1097 || gfc_match_eos () != MATCH_YES)
1098 {
1099 gfc_error ("Unexpected junk after ELSE statement at %C");
1100 return MATCH_ERROR;
1101 }
1102
1103 if (strcmp (name, gfc_current_block ()->name) != 0)
1104 {
1105 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1106 name, gfc_current_block ()->name);
1107 return MATCH_ERROR;
1108 }
1109
1110 return MATCH_YES;
1111}
1112
1113
1114/* Match an ELSE IF statement. */
1115
1116match
1117gfc_match_elseif (void)
1118{
1119 char name[GFC_MAX_SYMBOL_LEN + 1];
1120 gfc_expr *expr;
1121 match m;
1122
1123 m = gfc_match (" ( %e ) then", &expr);
1124 if (m != MATCH_YES)
1125 return m;
1126
1127 if (gfc_match_eos () == MATCH_YES)
1128 goto done;
1129
1130 if (gfc_match_name (name) != MATCH_YES
1131 || gfc_current_block () == NULL
1132 || gfc_match_eos () != MATCH_YES)
1133 {
1134 gfc_error ("Unexpected junk after ELSE IF statement at %C");
1135 goto cleanup;
1136 }
1137
1138 if (strcmp (name, gfc_current_block ()->name) != 0)
1139 {
1140 gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1141 name, gfc_current_block ()->name);
1142 goto cleanup;
1143 }
1144
1145done:
1146 new_st.op = EXEC_IF;
1147 new_st.expr = expr;
1148 return MATCH_YES;
1149
1150cleanup:
1151 gfc_free_expr (expr);
1152 return MATCH_ERROR;
1153}
1154
1155
1156/* Free a gfc_iterator structure. */
1157
1158void
1159gfc_free_iterator (gfc_iterator * iter, int flag)
1160{
1161
1162 if (iter == NULL)
1163 return;
1164
1165 gfc_free_expr (iter->var);
1166 gfc_free_expr (iter->start);
1167 gfc_free_expr (iter->end);
1168 gfc_free_expr (iter->step);
1169
1170 if (flag)
1171 gfc_free (iter);
1172}
1173
1174
1175/* Match a DO statement. */
1176
1177match
1178gfc_match_do (void)
1179{
1180 gfc_iterator iter, *ip;
1181 locus old_loc;
1182 gfc_st_label *label;
1183 match m;
1184
63645982 1185 old_loc = gfc_current_locus;
6de9cd9a
DN
1186
1187 label = NULL;
1188 iter.var = iter.start = iter.end = iter.step = NULL;
1189
1190 m = gfc_match_label ();
1191 if (m == MATCH_ERROR)
1192 return m;
1193
1194 if (gfc_match (" do") != MATCH_YES)
1195 return MATCH_NO;
1196
9b089e05
TS
1197 m = gfc_match_st_label (&label, 0);
1198 if (m == MATCH_ERROR)
1199 goto cleanup;
1200
6de9cd9a
DN
1201/* Match an infinite DO, make it like a DO WHILE(.TRUE.) */
1202
1203 if (gfc_match_eos () == MATCH_YES)
1204 {
1205 iter.end = gfc_logical_expr (1, NULL);
1206 new_st.op = EXEC_DO_WHILE;
1207 goto done;
1208 }
1209
9b089e05
TS
1210 /* match an optional comma, if no comma is found a space is obligatory. */
1211 if (gfc_match_char(',') != MATCH_YES
1212 && gfc_match ("% ") != MATCH_YES)
6de9cd9a
DN
1213 return MATCH_NO;
1214
1215 /* See if we have a DO WHILE. */
1216 if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES)
1217 {
1218 new_st.op = EXEC_DO_WHILE;
1219 goto done;
1220 }
1221
1222 /* The abortive DO WHILE may have done something to the symbol
1223 table, so we start over: */
1224 gfc_undo_symbols ();
63645982 1225 gfc_current_locus = old_loc;
6de9cd9a
DN
1226
1227 gfc_match_label (); /* This won't error */
1228 gfc_match (" do "); /* This will work */
1229
1230 gfc_match_st_label (&label, 0); /* Can't error out */
1231 gfc_match_char (','); /* Optional comma */
1232
1233 m = gfc_match_iterator (&iter, 0);
1234 if (m == MATCH_NO)
1235 return MATCH_NO;
1236 if (m == MATCH_ERROR)
1237 goto cleanup;
1238
1239 if (gfc_match_eos () != MATCH_YES)
1240 {
1241 gfc_syntax_error (ST_DO);
1242 goto cleanup;
1243 }
1244
1245 new_st.op = EXEC_DO;
1246
1247done:
1248 if (label != NULL
1249 && gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1250 goto cleanup;
1251
1252 new_st.label = label;
1253
1254 if (new_st.op == EXEC_DO_WHILE)
1255 new_st.expr = iter.end;
1256 else
1257 {
1258 new_st.ext.iterator = ip = gfc_get_iterator ();
1259 *ip = iter;
1260 }
1261
1262 return MATCH_YES;
1263
1264cleanup:
1265 gfc_free_iterator (&iter, 0);
1266
1267 return MATCH_ERROR;
1268}
1269
1270
1271/* Match an EXIT or CYCLE statement. */
1272
1273static match
1274match_exit_cycle (gfc_statement st, gfc_exec_op op)
1275{
1276 gfc_state_data *p;
1277 gfc_symbol *sym;
1278 match m;
1279
1280 if (gfc_match_eos () == MATCH_YES)
1281 sym = NULL;
1282 else
1283 {
1284 m = gfc_match ("% %s%t", &sym);
1285 if (m == MATCH_ERROR)
1286 return MATCH_ERROR;
1287 if (m == MATCH_NO)
1288 {
1289 gfc_syntax_error (st);
1290 return MATCH_ERROR;
1291 }
1292
1293 if (sym->attr.flavor != FL_LABEL)
1294 {
1295 gfc_error ("Name '%s' in %s statement at %C is not a loop name",
1296 sym->name, gfc_ascii_statement (st));
1297 return MATCH_ERROR;
1298 }
1299 }
1300
1301 /* Find the loop mentioned specified by the label (or lack of a
1302 label). */
1303 for (p = gfc_state_stack; p; p = p->previous)
1304 if (p->state == COMP_DO && (sym == NULL || sym == p->sym))
1305 break;
1306
1307 if (p == NULL)
1308 {
1309 if (sym == NULL)
1310 gfc_error ("%s statement at %C is not within a loop",
1311 gfc_ascii_statement (st));
1312 else
1313 gfc_error ("%s statement at %C is not within loop '%s'",
1314 gfc_ascii_statement (st), sym->name);
1315
1316 return MATCH_ERROR;
1317 }
1318
1319 /* Save the first statement in the loop - needed by the backend. */
1320 new_st.ext.whichloop = p->head;
1321
1322 new_st.op = op;
1323/* new_st.sym = sym;*/
1324
1325 return MATCH_YES;
1326}
1327
1328
1329/* Match the EXIT statement. */
1330
1331match
1332gfc_match_exit (void)
1333{
1334
1335 return match_exit_cycle (ST_EXIT, EXEC_EXIT);
1336}
1337
1338
1339/* Match the CYCLE statement. */
1340
1341match
1342gfc_match_cycle (void)
1343{
1344
1345 return match_exit_cycle (ST_CYCLE, EXEC_CYCLE);
1346}
1347
1348
1349/* Match a number or character constant after a STOP or PAUSE statement. */
1350
1351static match
1352gfc_match_stopcode (gfc_statement st)
1353{
1354 int stop_code;
1355 gfc_expr *e;
1356 match m;
1357
1358 stop_code = 0;
1359 e = NULL;
1360
1361 if (gfc_match_eos () != MATCH_YES)
1362 {
1363 m = gfc_match_small_literal_int (&stop_code);
1364 if (m == MATCH_ERROR)
1365 goto cleanup;
1366
1367 if (m == MATCH_YES && stop_code > 99999)
1368 {
1369 gfc_error ("STOP code out of range at %C");
1370 goto cleanup;
1371 }
1372
1373 if (m == MATCH_NO)
1374 {
1375 /* Try a character constant. */
1376 m = gfc_match_expr (&e);
1377 if (m == MATCH_ERROR)
1378 goto cleanup;
1379 if (m == MATCH_NO)
1380 goto syntax;
1381 if (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1382 goto syntax;
1383 }
1384
1385 if (gfc_match_eos () != MATCH_YES)
1386 goto syntax;
1387 }
1388
1389 if (gfc_pure (NULL))
1390 {
1391 gfc_error ("%s statement not allowed in PURE procedure at %C",
1392 gfc_ascii_statement (st));
1393 goto cleanup;
1394 }
1395
1396 new_st.op = st == ST_STOP ? EXEC_STOP : EXEC_PAUSE;
1397 new_st.expr = e;
1398 new_st.ext.stop_code = stop_code;
1399
1400 return MATCH_YES;
1401
1402syntax:
1403 gfc_syntax_error (st);
1404
1405cleanup:
1406
1407 gfc_free_expr (e);
1408 return MATCH_ERROR;
1409}
1410
1411/* Match the (deprecated) PAUSE statement. */
1412
1413match
1414gfc_match_pause (void)
1415{
1416 match m;
1417
1418 m = gfc_match_stopcode (ST_PAUSE);
1419 if (m == MATCH_YES)
1420 {
1421 if (gfc_notify_std (GFC_STD_F95_DEL,
1422 "Obsolete: PAUSE statement at %C")
1423 == FAILURE)
1424 m = MATCH_ERROR;
1425 }
1426 return m;
1427}
1428
1429
1430/* Match the STOP statement. */
1431
1432match
1433gfc_match_stop (void)
1434{
1435 return gfc_match_stopcode (ST_STOP);
1436}
1437
1438
1439/* Match a CONTINUE statement. */
1440
1441match
1442gfc_match_continue (void)
1443{
1444
1445 if (gfc_match_eos () != MATCH_YES)
1446 {
1447 gfc_syntax_error (ST_CONTINUE);
1448 return MATCH_ERROR;
1449 }
1450
1451 new_st.op = EXEC_CONTINUE;
1452 return MATCH_YES;
1453}
1454
1455
1456/* Match the (deprecated) ASSIGN statement. */
1457
1458match
1459gfc_match_assign (void)
1460{
1461 gfc_expr *expr;
1462 gfc_st_label *label;
1463
1464 if (gfc_match (" %l", &label) == MATCH_YES)
1465 {
1466 if (gfc_reference_st_label (label, ST_LABEL_UNKNOWN) == FAILURE)
1467 return MATCH_ERROR;
1468 if (gfc_match (" to %v%t", &expr) == MATCH_YES)
1469 {
1470 if (gfc_notify_std (GFC_STD_F95_DEL,
1471 "Obsolete: ASSIGN statement at %C")
1472 == FAILURE)
1473 return MATCH_ERROR;
1474
1475 expr->symtree->n.sym->attr.assign = 1;
1476
1477 new_st.op = EXEC_LABEL_ASSIGN;
1478 new_st.label = label;
1479 new_st.expr = expr;
1480 return MATCH_YES;
1481 }
1482 }
1483 return MATCH_NO;
1484}
1485
1486
1487/* Match the GO TO statement. As a computed GOTO statement is
1488 matched, it is transformed into an equivalent SELECT block. No
1489 tree is necessary, and the resulting jumps-to-jumps are
1490 specifically optimized away by the back end. */
1491
1492match
1493gfc_match_goto (void)
1494{
1495 gfc_code *head, *tail;
1496 gfc_expr *expr;
1497 gfc_case *cp;
1498 gfc_st_label *label;
1499 int i;
1500 match m;
1501
1502 if (gfc_match (" %l%t", &label) == MATCH_YES)
1503 {
1504 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1505 return MATCH_ERROR;
1506
1507 new_st.op = EXEC_GOTO;
1508 new_st.label = label;
1509 return MATCH_YES;
1510 }
1511
1512 /* The assigned GO TO statement. */
1513
1514 if (gfc_match_variable (&expr, 0) == MATCH_YES)
1515 {
1516 if (gfc_notify_std (GFC_STD_F95_DEL,
1517 "Obsolete: Assigned GOTO statement at %C")
1518 == FAILURE)
1519 return MATCH_ERROR;
1520
1521 expr->symtree->n.sym->attr.assign = 1;
1522 new_st.op = EXEC_GOTO;
1523 new_st.expr = expr;
1524
1525 if (gfc_match_eos () == MATCH_YES)
1526 return MATCH_YES;
1527
1528 /* Match label list. */
1529 gfc_match_char (',');
1530 if (gfc_match_char ('(') != MATCH_YES)
1531 {
1532 gfc_syntax_error (ST_GOTO);
1533 return MATCH_ERROR;
1534 }
1535 head = tail = NULL;
1536
1537 do
1538 {
1539 m = gfc_match_st_label (&label, 0);
1540 if (m != MATCH_YES)
1541 goto syntax;
1542
1543 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1544 goto cleanup;
1545
1546 if (head == NULL)
1547 head = tail = gfc_get_code ();
1548 else
1549 {
1550 tail->block = gfc_get_code ();
1551 tail = tail->block;
1552 }
1553
1554 tail->label = label;
1555 tail->op = EXEC_GOTO;
1556 }
1557 while (gfc_match_char (',') == MATCH_YES);
1558
1559 if (gfc_match (")%t") != MATCH_YES)
1560 goto syntax;
1561
1562 if (head == NULL)
1563 {
1564 gfc_error (
1565 "Statement label list in GOTO at %C cannot be empty");
1566 goto syntax;
1567 }
1568 new_st.block = head;
1569
1570 return MATCH_YES;
1571 }
1572
1573 /* Last chance is a computed GO TO statement. */
1574 if (gfc_match_char ('(') != MATCH_YES)
1575 {
1576 gfc_syntax_error (ST_GOTO);
1577 return MATCH_ERROR;
1578 }
1579
1580 head = tail = NULL;
1581 i = 1;
1582
1583 do
1584 {
1585 m = gfc_match_st_label (&label, 0);
1586 if (m != MATCH_YES)
1587 goto syntax;
1588
1589 if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1590 goto cleanup;
1591
1592 if (head == NULL)
1593 head = tail = gfc_get_code ();
1594 else
1595 {
1596 tail->block = gfc_get_code ();
1597 tail = tail->block;
1598 }
1599
1600 cp = gfc_get_case ();
1601 cp->low = cp->high = gfc_int_expr (i++);
1602
1603 tail->op = EXEC_SELECT;
1604 tail->ext.case_list = cp;
1605
1606 tail->next = gfc_get_code ();
1607 tail->next->op = EXEC_GOTO;
1608 tail->next->label = label;
1609 }
1610 while (gfc_match_char (',') == MATCH_YES);
1611
1612 if (gfc_match_char (')') != MATCH_YES)
1613 goto syntax;
1614
1615 if (head == NULL)
1616 {
1617 gfc_error ("Statement label list in GOTO at %C cannot be empty");
1618 goto syntax;
1619 }
1620
1621 /* Get the rest of the statement. */
1622 gfc_match_char (',');
1623
1624 if (gfc_match (" %e%t", &expr) != MATCH_YES)
1625 goto syntax;
1626
1627 /* At this point, a computed GOTO has been fully matched and an
1628 equivalent SELECT statement constructed. */
1629
1630 new_st.op = EXEC_SELECT;
1631 new_st.expr = NULL;
1632
1633 /* Hack: For a "real" SELECT, the expression is in expr. We put
1634 it in expr2 so we can distinguish then and produce the correct
1635 diagnostics. */
1636 new_st.expr2 = expr;
1637 new_st.block = head;
1638 return MATCH_YES;
1639
1640syntax:
1641 gfc_syntax_error (ST_GOTO);
1642cleanup:
1643 gfc_free_statements (head);
1644 return MATCH_ERROR;
1645}
1646
1647
1648/* Frees a list of gfc_alloc structures. */
1649
1650void
1651gfc_free_alloc_list (gfc_alloc * p)
1652{
1653 gfc_alloc *q;
1654
1655 for (; p; p = q)
1656 {
1657 q = p->next;
1658 gfc_free_expr (p->expr);
1659 gfc_free (p);
1660 }
1661}
1662
1663
1664/* Match an ALLOCATE statement. */
1665
1666match
1667gfc_match_allocate (void)
1668{
1669 gfc_alloc *head, *tail;
1670 gfc_expr *stat;
1671 match m;
1672
1673 head = tail = NULL;
1674 stat = NULL;
1675
1676 if (gfc_match_char ('(') != MATCH_YES)
1677 goto syntax;
1678
1679 for (;;)
1680 {
1681 if (head == NULL)
1682 head = tail = gfc_get_alloc ();
1683 else
1684 {
1685 tail->next = gfc_get_alloc ();
1686 tail = tail->next;
1687 }
1688
1689 m = gfc_match_variable (&tail->expr, 0);
1690 if (m == MATCH_NO)
1691 goto syntax;
1692 if (m == MATCH_ERROR)
1693 goto cleanup;
1694
1695 if (gfc_pure (NULL)
1696 && gfc_impure_variable (tail->expr->symtree->n.sym))
1697 {
1698 gfc_error ("Bad allocate-object in ALLOCATE statement at %C for a "
1699 "PURE procedure");
1700 goto cleanup;
1701 }
1702
1703 if (gfc_match_char (',') != MATCH_YES)
1704 break;
1705
1706 m = gfc_match (" stat = %v", &stat);
1707 if (m == MATCH_ERROR)
1708 goto cleanup;
1709 if (m == MATCH_YES)
1710 break;
1711 }
1712
1713 if (stat != NULL)
1714 {
1715 if (stat->symtree->n.sym->attr.intent == INTENT_IN)
1716 {
1717 gfc_error
1718 ("STAT variable '%s' of ALLOCATE statement at %C cannot be "
1719 "INTENT(IN)", stat->symtree->n.sym->name);
1720 goto cleanup;
1721 }
1722
1723 if (gfc_pure (NULL) && gfc_impure_variable (stat->symtree->n.sym))
1724 {
1725 gfc_error
1726 ("Illegal STAT variable in ALLOCATE statement at %C for a PURE "
1727 "procedure");
1728 goto cleanup;
1729 }
1730 }
1731
1732 if (gfc_match (" )%t") != MATCH_YES)
1733 goto syntax;
1734
1735 new_st.op = EXEC_ALLOCATE;
1736 new_st.expr = stat;
1737 new_st.ext.alloc_list = head;
1738
1739 return MATCH_YES;
1740
1741syntax:
1742 gfc_syntax_error (ST_ALLOCATE);
1743
1744cleanup:
1745 gfc_free_expr (stat);
1746 gfc_free_alloc_list (head);
1747 return MATCH_ERROR;
1748}
1749
1750
1751/* Match a NULLIFY statement. A NULLIFY statement is transformed into
1752 a set of pointer assignments to intrinsic NULL(). */
1753
1754match
1755gfc_match_nullify (void)
1756{
1757 gfc_code *tail;
1758 gfc_expr *e, *p;
1759 match m;
1760
1761 tail = NULL;
1762
1763 if (gfc_match_char ('(') != MATCH_YES)
1764 goto syntax;
1765
1766 for (;;)
1767 {
1768 m = gfc_match_variable (&p, 0);
1769 if (m == MATCH_ERROR)
1770 goto cleanup;
1771 if (m == MATCH_NO)
1772 goto syntax;
1773
1774 if (gfc_pure (NULL) && gfc_impure_variable (p->symtree->n.sym))
1775 {
1776 gfc_error
1777 ("Illegal variable in NULLIFY at %C for a PURE procedure");
1778 goto cleanup;
1779 }
1780
1781 /* build ' => NULL() ' */
1782 e = gfc_get_expr ();
63645982 1783 e->where = gfc_current_locus;
6de9cd9a
DN
1784 e->expr_type = EXPR_NULL;
1785 e->ts.type = BT_UNKNOWN;
1786
1787 /* Chain to list */
1788 if (tail == NULL)
1789 tail = &new_st;
1790 else
1791 {
1792 tail->next = gfc_get_code ();
1793 tail = tail->next;
1794 }
1795
1796 tail->op = EXEC_POINTER_ASSIGN;
1797 tail->expr = p;
1798 tail->expr2 = e;
1799
1800 if (gfc_match_char (')') == MATCH_YES)
1801 break;
1802 if (gfc_match_char (',') != MATCH_YES)
1803 goto syntax;
1804 }
1805
1806 return MATCH_YES;
1807
1808syntax:
1809 gfc_syntax_error (ST_NULLIFY);
1810
1811cleanup:
1812 gfc_free_statements (tail);
1813 return MATCH_ERROR;
1814}
1815
1816
1817/* Match a DEALLOCATE statement. */
1818
1819match
1820gfc_match_deallocate (void)
1821{
1822 gfc_alloc *head, *tail;
1823 gfc_expr *stat;
1824 match m;
1825
1826 head = tail = NULL;
1827 stat = NULL;
1828
1829 if (gfc_match_char ('(') != MATCH_YES)
1830 goto syntax;
1831
1832 for (;;)
1833 {
1834 if (head == NULL)
1835 head = tail = gfc_get_alloc ();
1836 else
1837 {
1838 tail->next = gfc_get_alloc ();
1839 tail = tail->next;
1840 }
1841
1842 m = gfc_match_variable (&tail->expr, 0);
1843 if (m == MATCH_ERROR)
1844 goto cleanup;
1845 if (m == MATCH_NO)
1846 goto syntax;
1847
1848 if (gfc_pure (NULL)
1849 && gfc_impure_variable (tail->expr->symtree->n.sym))
1850 {
1851 gfc_error
1852 ("Illegal deallocate-expression in DEALLOCATE at %C for a PURE "
1853 "procedure");
1854 goto cleanup;
1855 }
1856
1857 if (gfc_match_char (',') != MATCH_YES)
1858 break;
1859
1860 m = gfc_match (" stat = %v", &stat);
1861 if (m == MATCH_ERROR)
1862 goto cleanup;
1863 if (m == MATCH_YES)
1864 break;
1865 }
1866
1867 if (stat != NULL && stat->symtree->n.sym->attr.intent == INTENT_IN)
1868 {
1869 gfc_error ("STAT variable '%s' of DEALLOCATE statement at %C cannot be "
1870 "INTENT(IN)", stat->symtree->n.sym->name);
1871 goto cleanup;
1872 }
1873
1874 if (gfc_match (" )%t") != MATCH_YES)
1875 goto syntax;
1876
1877 new_st.op = EXEC_DEALLOCATE;
1878 new_st.expr = stat;
1879 new_st.ext.alloc_list = head;
1880
1881 return MATCH_YES;
1882
1883syntax:
1884 gfc_syntax_error (ST_DEALLOCATE);
1885
1886cleanup:
1887 gfc_free_expr (stat);
1888 gfc_free_alloc_list (head);
1889 return MATCH_ERROR;
1890}
1891
1892
1893/* Match a RETURN statement. */
1894
1895match
1896gfc_match_return (void)
1897{
1898 gfc_expr *e;
1899 match m;
1900
1901 e = NULL;
1902 if (gfc_match_eos () == MATCH_YES)
1903 goto done;
1904
1905 if (gfc_find_state (COMP_SUBROUTINE) == FAILURE)
1906 {
1907 gfc_error ("Alternate RETURN statement at %C is only allowed within "
1908 "a SUBROUTINE");
1909 goto cleanup;
1910 }
1911
1912 m = gfc_match ("% %e%t", &e);
1913 if (m == MATCH_YES)
1914 goto done;
1915 if (m == MATCH_ERROR)
1916 goto cleanup;
1917
1918 gfc_syntax_error (ST_RETURN);
1919
1920cleanup:
1921 gfc_free_expr (e);
1922 return MATCH_ERROR;
1923
1924done:
1925 new_st.op = EXEC_RETURN;
1926 new_st.expr = e;
1927
1928 return MATCH_YES;
1929}
1930
1931
1932/* Match a CALL statement. The tricky part here are possible
1933 alternate return specifiers. We handle these by having all
1934 "subroutines" actually return an integer via a register that gives
1935 the return number. If the call specifies alternate returns, we
1936 generate code for a SELECT statement whose case clauses contain
1937 GOTOs to the various labels. */
1938
1939match
1940gfc_match_call (void)
1941{
1942 char name[GFC_MAX_SYMBOL_LEN + 1];
1943 gfc_actual_arglist *a, *arglist;
1944 gfc_case *new_case;
1945 gfc_symbol *sym;
1946 gfc_symtree *st;
1947 gfc_code *c;
1948 match m;
1949 int i;
1950
1951 arglist = NULL;
1952
1953 m = gfc_match ("% %n", name);
1954 if (m == MATCH_NO)
1955 goto syntax;
1956 if (m != MATCH_YES)
1957 return m;
1958
1959 if (gfc_get_ha_sym_tree (name, &st))
1960 return MATCH_ERROR;
1961
1962 sym = st->n.sym;
1963 gfc_set_sym_referenced (sym);
1964
1965 if (!sym->attr.generic
1966 && !sym->attr.subroutine
1967 && gfc_add_subroutine (&sym->attr, NULL) == FAILURE)
1968 return MATCH_ERROR;
1969
1970 if (gfc_match_eos () != MATCH_YES)
1971 {
1972 m = gfc_match_actual_arglist (1, &arglist);
1973 if (m == MATCH_NO)
1974 goto syntax;
1975 if (m == MATCH_ERROR)
1976 goto cleanup;
1977
1978 if (gfc_match_eos () != MATCH_YES)
1979 goto syntax;
1980 }
1981
1982 /* If any alternate return labels were found, construct a SELECT
1983 statement that will jump to the right place. */
1984
1985 i = 0;
1986 for (a = arglist; a; a = a->next)
1987 if (a->expr == NULL)
63645982 1988 i = 1;
6de9cd9a
DN
1989
1990 if (i)
1991 {
1992 gfc_symtree *select_st;
1993 gfc_symbol *select_sym;
1994 char name[GFC_MAX_SYMBOL_LEN + 1];
1995
1996 new_st.next = c = gfc_get_code ();
1997 c->op = EXEC_SELECT;
1998 sprintf (name, "_result_%s",sym->name);
1999 gfc_get_ha_sym_tree (name, &select_st); /* Can't fail */
2000
2001 select_sym = select_st->n.sym;
2002 select_sym->ts.type = BT_INTEGER;
2003 select_sym->ts.kind = gfc_default_integer_kind ();
2004 gfc_set_sym_referenced (select_sym);
2005 c->expr = gfc_get_expr ();
2006 c->expr->expr_type = EXPR_VARIABLE;
2007 c->expr->symtree = select_st;
2008 c->expr->ts = select_sym->ts;
63645982 2009 c->expr->where = gfc_current_locus;
6de9cd9a
DN
2010
2011 i = 0;
2012 for (a = arglist; a; a = a->next)
2013 {
2014 if (a->expr != NULL)
2015 continue;
2016
2017 if (gfc_reference_st_label (a->label, ST_LABEL_TARGET) == FAILURE)
2018 continue;
2019
2020 i++;
2021
2022 c->block = gfc_get_code ();
2023 c = c->block;
2024 c->op = EXEC_SELECT;
2025
2026 new_case = gfc_get_case ();
2027 new_case->high = new_case->low = gfc_int_expr (i);
2028 c->ext.case_list = new_case;
2029
2030 c->next = gfc_get_code ();
2031 c->next->op = EXEC_GOTO;
2032 c->next->label = a->label;
2033 }
2034 }
2035
2036 new_st.op = EXEC_CALL;
2037 new_st.symtree = st;
2038 new_st.ext.actual = arglist;
2039
2040 return MATCH_YES;
2041
2042syntax:
2043 gfc_syntax_error (ST_CALL);
2044
2045cleanup:
2046 gfc_free_actual_arglist (arglist);
2047 return MATCH_ERROR;
2048}
2049
2050
9056bd70
TS
2051/* Given a name, return a pointer to the common head structure,
2052 creating it if it does not exist.
2053 TODO: Add to global symbol tree. */
2054
2055gfc_common_head *
2056gfc_get_common (char *name)
2057{
2058 gfc_symtree *st;
2059
2060 st = gfc_find_symtree (gfc_current_ns->common_root, name);
2061 if (st == NULL)
2062 st = gfc_new_symtree (&gfc_current_ns->common_root, name);
2063
2064 if (st->n.common == NULL)
2065 {
2066 st->n.common = gfc_get_common_head ();
2067 st->n.common->where = gfc_current_locus;
2068 }
2069
2070 return st->n.common;
2071}
2072
2073
6de9cd9a
DN
2074/* Match a common block name. */
2075
2076static match
9056bd70 2077match_common_name (char *name)
6de9cd9a
DN
2078{
2079 match m;
2080
2081 if (gfc_match_char ('/') == MATCH_NO)
9056bd70
TS
2082 {
2083 name[0] = '\0';
2084 return MATCH_YES;
2085 }
6de9cd9a
DN
2086
2087 if (gfc_match_char ('/') == MATCH_YES)
2088 {
9056bd70 2089 name[0] = '\0';
6de9cd9a
DN
2090 return MATCH_YES;
2091 }
2092
9056bd70 2093 m = gfc_match_name (name);
6de9cd9a
DN
2094
2095 if (m == MATCH_ERROR)
2096 return MATCH_ERROR;
2097 if (m == MATCH_YES && gfc_match_char ('/') == MATCH_YES)
2098 return MATCH_YES;
2099
2100 gfc_error ("Syntax error in common block name at %C");
2101 return MATCH_ERROR;
2102}
2103
2104
2105/* Match a COMMON statement. */
2106
2107match
2108gfc_match_common (void)
2109{
9056bd70
TS
2110 gfc_symbol *sym, **head, *tail, *old_blank_common;
2111 char name[GFC_MAX_SYMBOL_LEN+1];
2112 gfc_common_head *t;
6de9cd9a
DN
2113 gfc_array_spec *as;
2114 match m;
2115
9056bd70 2116 old_blank_common = gfc_current_ns->blank_common.head;
6de9cd9a
DN
2117 if (old_blank_common)
2118 {
2119 while (old_blank_common->common_next)
2120 old_blank_common = old_blank_common->common_next;
2121 }
2122
6de9cd9a
DN
2123 as = NULL;
2124
2125 if (gfc_match_eos () == MATCH_YES)
2126 goto syntax;
2127
2128 for (;;)
2129 {
9056bd70 2130 m = match_common_name (name);
6de9cd9a
DN
2131 if (m == MATCH_ERROR)
2132 goto cleanup;
2133
9056bd70
TS
2134 if (name[0] == '\0')
2135 {
2136 t = &gfc_current_ns->blank_common;
2137 if (t->head == NULL)
2138 t->where = gfc_current_locus;
2139 head = &t->head;
2140 }
6de9cd9a
DN
2141 else
2142 {
9056bd70
TS
2143 t = gfc_get_common (name);
2144 head = &t->head;
6de9cd9a 2145
9056bd70
TS
2146 if (t->use_assoc)
2147 {
2148 gfc_error ("COMMON block '%s' at %C has already "
794ba78b 2149 "been USE-associated", name);
9056bd70
TS
2150 goto cleanup;
2151 }
6de9cd9a
DN
2152 }
2153
2154 if (*head == NULL)
2155 tail = NULL;
2156 else
2157 {
2158 tail = *head;
2159 while (tail->common_next)
2160 tail = tail->common_next;
2161 }
2162
2163 /* Grab the list of symbols. */
9056bd70
TS
2164 if (gfc_match_eos () == MATCH_YES)
2165 goto done;
2166
6de9cd9a
DN
2167 for (;;)
2168 {
2169 m = gfc_match_symbol (&sym, 0);
2170 if (m == MATCH_ERROR)
2171 goto cleanup;
2172 if (m == MATCH_NO)
2173 goto syntax;
2174
2175 if (sym->attr.in_common)
2176 {
2177 gfc_error ("Symbol '%s' at %C is already in a COMMON block",
2178 sym->name);
2179 goto cleanup;
2180 }
2181
9056bd70
TS
2182 if (gfc_add_in_common (&sym->attr, NULL) == FAILURE)
2183 goto cleanup;
2184
c8e20bd0 2185 if (sym->value != NULL
9056bd70 2186 && (name[0] == '\0' || !sym->attr.data))
c8e20bd0 2187 {
9056bd70 2188 if (name[0] == '\0')
c8e20bd0
TS
2189 gfc_error ("Previously initialized symbol '%s' in "
2190 "blank COMMON block at %C", sym->name);
2191 else
2192 gfc_error ("Previously initialized symbol '%s' in "
9056bd70 2193 "COMMON block '%s' at %C", sym->name, name);
c8e20bd0
TS
2194 goto cleanup;
2195 }
2196
6de9cd9a
DN
2197 if (gfc_add_in_common (&sym->attr, NULL) == FAILURE)
2198 goto cleanup;
2199
2200 /* Derived type names must have the SEQUENCE attribute. */
2201 if (sym->ts.type == BT_DERIVED && !sym->ts.derived->attr.sequence)
2202 {
2203 gfc_error
2204 ("Derived type variable in COMMON at %C does not have the "
2205 "SEQUENCE attribute");
2206 goto cleanup;
2207 }
2208
2209 if (tail != NULL)
2210 tail->common_next = sym;
2211 else
2212 *head = sym;
2213
2214 tail = sym;
2215
2216 /* Deal with an optional array specification after the
2217 symbol name. */
2218 m = gfc_match_array_spec (&as);
2219 if (m == MATCH_ERROR)
2220 goto cleanup;
2221
2222 if (m == MATCH_YES)
2223 {
2224 if (as->type != AS_EXPLICIT)
2225 {
2226 gfc_error
2227 ("Array specification for symbol '%s' in COMMON at %C "
2228 "must be explicit", sym->name);
2229 goto cleanup;
2230 }
2231
2232 if (gfc_add_dimension (&sym->attr, NULL) == FAILURE)
2233 goto cleanup;
2234
2235 if (sym->attr.pointer)
2236 {
2237 gfc_error
2238 ("Symbol '%s' in COMMON at %C cannot be a POINTER array",
2239 sym->name);
2240 goto cleanup;
2241 }
2242
2243 sym->as = as;
2244 as = NULL;
2245 }
2246
2247 if (gfc_match_eos () == MATCH_YES)
2248 goto done;
2249 if (gfc_peek_char () == '/')
2250 break;
2251 if (gfc_match_char (',') != MATCH_YES)
2252 goto syntax;
2253 if (gfc_peek_char () == '/')
2254 break;
2255 }
2256 }
2257
2258done:
2259 return MATCH_YES;
2260
2261syntax:
2262 gfc_syntax_error (ST_COMMON);
2263
2264cleanup:
2265 if (old_blank_common)
2266 old_blank_common->common_next = NULL;
2267 else
9056bd70 2268 gfc_current_ns->blank_common.head = NULL;
6de9cd9a
DN
2269 gfc_free_array_spec (as);
2270 return MATCH_ERROR;
2271}
2272
2273
2274/* Match a BLOCK DATA program unit. */
2275
2276match
2277gfc_match_block_data (void)
2278{
2279 char name[GFC_MAX_SYMBOL_LEN + 1];
2280 gfc_symbol *sym;
2281 match m;
2282
2283 if (gfc_match_eos () == MATCH_YES)
2284 {
2285 gfc_new_block = NULL;
2286 return MATCH_YES;
2287 }
2288
2289 m = gfc_match (" %n%t", name);
2290 if (m != MATCH_YES)
2291 return MATCH_ERROR;
2292
2293 if (gfc_get_symbol (name, NULL, &sym))
2294 return MATCH_ERROR;
2295
2296 if (gfc_add_flavor (&sym->attr, FL_BLOCK_DATA, NULL) == FAILURE)
2297 return MATCH_ERROR;
2298
2299 gfc_new_block = sym;
2300
2301 return MATCH_YES;
2302}
2303
2304
2305/* Free a namelist structure. */
2306
2307void
2308gfc_free_namelist (gfc_namelist * name)
2309{
2310 gfc_namelist *n;
2311
2312 for (; name; name = n)
2313 {
2314 n = name->next;
2315 gfc_free (name);
2316 }
2317}
2318
2319
2320/* Match a NAMELIST statement. */
2321
2322match
2323gfc_match_namelist (void)
2324{
2325 gfc_symbol *group_name, *sym;
2326 gfc_namelist *nl;
2327 match m, m2;
2328
2329 m = gfc_match (" / %s /", &group_name);
2330 if (m == MATCH_NO)
2331 goto syntax;
2332 if (m == MATCH_ERROR)
2333 goto error;
2334
2335 for (;;)
2336 {
2337 if (group_name->ts.type != BT_UNKNOWN)
2338 {
2339 gfc_error
2340 ("Namelist group name '%s' at %C already has a basic type "
2341 "of %s", group_name->name, gfc_typename (&group_name->ts));
2342 return MATCH_ERROR;
2343 }
2344
2345 if (group_name->attr.flavor != FL_NAMELIST
2346 && gfc_add_flavor (&group_name->attr, FL_NAMELIST, NULL) == FAILURE)
2347 return MATCH_ERROR;
2348
2349 for (;;)
2350 {
2351 m = gfc_match_symbol (&sym, 1);
2352 if (m == MATCH_NO)
2353 goto syntax;
2354 if (m == MATCH_ERROR)
2355 goto error;
2356
2357 if (sym->attr.in_namelist == 0
2358 && gfc_add_in_namelist (&sym->attr, NULL) == FAILURE)
2359 goto error;
2360
2361 /* TODO: worry about PRIVATE members of a PUBLIC namelist
2362 group. */
2363
2364 nl = gfc_get_namelist ();
2365 nl->sym = sym;
2366
2367 if (group_name->namelist == NULL)
2368 group_name->namelist = group_name->namelist_tail = nl;
2369 else
2370 {
2371 group_name->namelist_tail->next = nl;
2372 group_name->namelist_tail = nl;
2373 }
2374
2375 if (gfc_match_eos () == MATCH_YES)
2376 goto done;
2377
2378 m = gfc_match_char (',');
2379
2380 if (gfc_match_char ('/') == MATCH_YES)
2381 {
2382 m2 = gfc_match (" %s /", &group_name);
2383 if (m2 == MATCH_YES)
2384 break;
2385 if (m2 == MATCH_ERROR)
2386 goto error;
2387 goto syntax;
2388 }
2389
2390 if (m != MATCH_YES)
2391 goto syntax;
2392 }
2393 }
2394
2395done:
2396 return MATCH_YES;
2397
2398syntax:
2399 gfc_syntax_error (ST_NAMELIST);
2400
2401error:
2402 return MATCH_ERROR;
2403}
2404
2405
2406/* Match a MODULE statement. */
2407
2408match
2409gfc_match_module (void)
2410{
2411 match m;
2412
2413 m = gfc_match (" %s%t", &gfc_new_block);
2414 if (m != MATCH_YES)
2415 return m;
2416
2417 if (gfc_add_flavor (&gfc_new_block->attr, FL_MODULE, NULL) == FAILURE)
2418 return MATCH_ERROR;
2419
2420 return MATCH_YES;
2421}
2422
2423
2424/* Free equivalence sets and lists. Recursively is the easiest way to
2425 do this. */
2426
2427void
2428gfc_free_equiv (gfc_equiv * eq)
2429{
2430
2431 if (eq == NULL)
2432 return;
2433
2434 gfc_free_equiv (eq->eq);
2435 gfc_free_equiv (eq->next);
2436
2437 gfc_free_expr (eq->expr);
2438 gfc_free (eq);
2439}
2440
2441
2442/* Match an EQUIVALENCE statement. */
2443
2444match
2445gfc_match_equivalence (void)
2446{
2447 gfc_equiv *eq, *set, *tail;
2448 gfc_ref *ref;
2449 match m;
2450
2451 tail = NULL;
2452
2453 for (;;)
2454 {
2455 eq = gfc_get_equiv ();
2456 if (tail == NULL)
2457 tail = eq;
2458
2459 eq->next = gfc_current_ns->equiv;
2460 gfc_current_ns->equiv = eq;
2461
2462 if (gfc_match_char ('(') != MATCH_YES)
2463 goto syntax;
2464
2465 set = eq;
2466
2467 for (;;)
2468 {
2469 m = gfc_match_variable (&set->expr, 1);
2470 if (m == MATCH_ERROR)
2471 goto cleanup;
2472 if (m == MATCH_NO)
2473 goto syntax;
2474
2475 for (ref = set->expr->ref; ref; ref = ref->next)
2476 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2477 {
2478 gfc_error
2479 ("Array reference in EQUIVALENCE at %C cannot be an "
2480 "array section");
2481 goto cleanup;
2482 }
2483
2484 if (gfc_match_char (')') == MATCH_YES)
2485 break;
2486 if (gfc_match_char (',') != MATCH_YES)
2487 goto syntax;
2488
2489 set->eq = gfc_get_equiv ();
2490 set = set->eq;
2491 }
2492
2493 if (gfc_match_eos () == MATCH_YES)
2494 break;
2495 if (gfc_match_char (',') != MATCH_YES)
2496 goto syntax;
2497 }
2498
2499 return MATCH_YES;
2500
2501syntax:
2502 gfc_syntax_error (ST_EQUIVALENCE);
2503
2504cleanup:
2505 eq = tail->next;
2506 tail->next = NULL;
2507
2508 gfc_free_equiv (gfc_current_ns->equiv);
2509 gfc_current_ns->equiv = eq;
2510
2511 return MATCH_ERROR;
2512}
2513
2514
2515/* Match a statement function declaration. It is so easy to match
2516 non-statement function statements with a MATCH_ERROR as opposed to
2517 MATCH_NO that we suppress error message in most cases. */
2518
2519match
2520gfc_match_st_function (void)
2521{
2522 gfc_error_buf old_error;
2523 gfc_symbol *sym;
2524 gfc_expr *expr;
2525 match m;
2526
2527 m = gfc_match_symbol (&sym, 0);
2528 if (m != MATCH_YES)
2529 return m;
2530
2531 gfc_push_error (&old_error);
2532
2533 if (gfc_add_procedure (&sym->attr, PROC_ST_FUNCTION, NULL) == FAILURE)
2534 goto undo_error;
2535
2536 if (gfc_match_formal_arglist (sym, 1, 0) != MATCH_YES)
2537 goto undo_error;
2538
2539 m = gfc_match (" = %e%t", &expr);
2540 if (m == MATCH_NO)
2541 goto undo_error;
2542 if (m == MATCH_ERROR)
2543 return m;
2544
2545 sym->value = expr;
2546
2547 return MATCH_YES;
2548
2549undo_error:
2550 gfc_pop_error (&old_error);
2551 return MATCH_NO;
2552}
2553
2554
2555/********************* DATA statement subroutines *********************/
2556
2557/* Free a gfc_data_variable structure and everything beneath it. */
2558
2559static void
2560free_variable (gfc_data_variable * p)
2561{
2562 gfc_data_variable *q;
2563
2564 for (; p; p = q)
2565 {
2566 q = p->next;
2567 gfc_free_expr (p->expr);
2568 gfc_free_iterator (&p->iter, 0);
2569 free_variable (p->list);
2570
2571 gfc_free (p);
2572 }
2573}
2574
2575
2576/* Free a gfc_data_value structure and everything beneath it. */
2577
2578static void
2579free_value (gfc_data_value * p)
2580{
2581 gfc_data_value *q;
2582
2583 for (; p; p = q)
2584 {
2585 q = p->next;
2586 gfc_free_expr (p->expr);
2587 gfc_free (p);
2588 }
2589}
2590
2591
2592/* Free a list of gfc_data structures. */
2593
2594void
2595gfc_free_data (gfc_data * p)
2596{
2597 gfc_data *q;
2598
2599 for (; p; p = q)
2600 {
2601 q = p->next;
2602
2603 free_variable (p->var);
2604 free_value (p->value);
2605
2606 gfc_free (p);
2607 }
2608}
2609
2610
2611static match var_element (gfc_data_variable *);
2612
2613/* Match a list of variables terminated by an iterator and a right
2614 parenthesis. */
2615
2616static match
2617var_list (gfc_data_variable * parent)
2618{
2619 gfc_data_variable *tail, var;
2620 match m;
2621
2622 m = var_element (&var);
2623 if (m == MATCH_ERROR)
2624 return MATCH_ERROR;
2625 if (m == MATCH_NO)
2626 goto syntax;
2627
2628 tail = gfc_get_data_variable ();
2629 *tail = var;
2630
2631 parent->list = tail;
2632
2633 for (;;)
2634 {
2635 if (gfc_match_char (',') != MATCH_YES)
2636 goto syntax;
2637
2638 m = gfc_match_iterator (&parent->iter, 1);
2639 if (m == MATCH_YES)
2640 break;
2641 if (m == MATCH_ERROR)
2642 return MATCH_ERROR;
2643
2644 m = var_element (&var);
2645 if (m == MATCH_ERROR)
2646 return MATCH_ERROR;
2647 if (m == MATCH_NO)
2648 goto syntax;
2649
2650 tail->next = gfc_get_data_variable ();
2651 tail = tail->next;
2652
2653 *tail = var;
2654 }
2655
2656 if (gfc_match_char (')') != MATCH_YES)
2657 goto syntax;
2658 return MATCH_YES;
2659
2660syntax:
2661 gfc_syntax_error (ST_DATA);
2662 return MATCH_ERROR;
2663}
2664
2665
2666/* Match a single element in a data variable list, which can be a
2667 variable-iterator list. */
2668
2669static match
2670var_element (gfc_data_variable * new)
2671{
2672 match m;
9056bd70 2673 gfc_symbol *sym;
6de9cd9a
DN
2674
2675 memset (new, '\0', sizeof (gfc_data_variable));
2676
2677 if (gfc_match_char ('(') == MATCH_YES)
2678 return var_list (new);
2679
2680 m = gfc_match_variable (&new->expr, 0);
2681 if (m != MATCH_YES)
2682 return m;
2683
c8e20bd0
TS
2684 sym = new->expr->symtree->n.sym;
2685
2686 if(sym->value != NULL)
6de9cd9a
DN
2687 {
2688 gfc_error ("Variable '%s' at %C already has an initialization",
c8e20bd0 2689 sym->name);
6de9cd9a
DN
2690 return MATCH_ERROR;
2691 }
2692
9056bd70 2693#if 0 // TODO: Find out where to move this message
c8e20bd0
TS
2694 if (sym->attr.in_common)
2695 /* See if sym is in the blank common block. */
9056bd70
TS
2696 for (t = &sym->ns->blank_common; t; t = t->common_next)
2697 if (sym == t->head)
c8e20bd0
TS
2698 {
2699 gfc_error ("DATA statement at %C may not initialize variable "
2700 "'%s' from blank COMMON", sym->name);
2701 return MATCH_ERROR;
2702 }
9056bd70 2703#endif
c8e20bd0 2704
9056bd70
TS
2705 if (gfc_add_data (&sym->attr, &new->expr->where) == FAILURE)
2706 return MATCH_ERROR;
c8e20bd0 2707
6de9cd9a
DN
2708 return MATCH_YES;
2709}
2710
2711
2712/* Match the top-level list of data variables. */
2713
2714static match
2715top_var_list (gfc_data * d)
2716{
2717 gfc_data_variable var, *tail, *new;
2718 match m;
2719
2720 tail = NULL;
2721
2722 for (;;)
2723 {
2724 m = var_element (&var);
2725 if (m == MATCH_NO)
2726 goto syntax;
2727 if (m == MATCH_ERROR)
2728 return MATCH_ERROR;
2729
2730 new = gfc_get_data_variable ();
2731 *new = var;
2732
2733 if (tail == NULL)
2734 d->var = new;
2735 else
2736 tail->next = new;
2737
2738 tail = new;
2739
2740 if (gfc_match_char ('/') == MATCH_YES)
2741 break;
2742 if (gfc_match_char (',') != MATCH_YES)
2743 goto syntax;
2744 }
2745
2746 return MATCH_YES;
2747
2748syntax:
2749 gfc_syntax_error (ST_DATA);
2750 return MATCH_ERROR;
2751}
2752
2753
2754static match
2755match_data_constant (gfc_expr ** result)
2756{
2757 char name[GFC_MAX_SYMBOL_LEN + 1];
2758 gfc_symbol *sym;
2759 gfc_expr *expr;
2760 match m;
2761
2762 m = gfc_match_literal_constant (&expr, 1);
2763 if (m == MATCH_YES)
2764 {
2765 *result = expr;
2766 return MATCH_YES;
2767 }
2768
2769 if (m == MATCH_ERROR)
2770 return MATCH_ERROR;
2771
2772 m = gfc_match_null (result);
2773 if (m != MATCH_NO)
2774 return m;
2775
2776 m = gfc_match_name (name);
2777 if (m != MATCH_YES)
2778 return m;
2779
2780 if (gfc_find_symbol (name, NULL, 1, &sym))
2781 return MATCH_ERROR;
2782
d663434b
TS
2783 if (sym == NULL
2784 || (sym->attr.flavor != FL_PARAMETER && sym->attr.flavor != FL_DERIVED))
6de9cd9a
DN
2785 {
2786 gfc_error ("Symbol '%s' must be a PARAMETER in DATA statement at %C",
2787 name);
2788 return MATCH_ERROR;
2789 }
d663434b
TS
2790 else if (sym->attr.flavor == FL_DERIVED)
2791 return gfc_match_structure_constructor (sym, result);
6de9cd9a
DN
2792
2793 *result = gfc_copy_expr (sym->value);
2794 return MATCH_YES;
2795}
2796
2797
2798/* Match a list of values in a DATA statement. The leading '/' has
2799 already been seen at this point. */
2800
2801static match
2802top_val_list (gfc_data * data)
2803{
2804 gfc_data_value *new, *tail;
2805 gfc_expr *expr;
2806 const char *msg;
2807 match m;
2808
2809 tail = NULL;
2810
2811 for (;;)
2812 {
2813 m = match_data_constant (&expr);
2814 if (m == MATCH_NO)
2815 goto syntax;
2816 if (m == MATCH_ERROR)
2817 return MATCH_ERROR;
2818
2819 new = gfc_get_data_value ();
2820
2821 if (tail == NULL)
2822 data->value = new;
2823 else
2824 tail->next = new;
2825
2826 tail = new;
2827
2828 if (expr->ts.type != BT_INTEGER || gfc_match_char ('*') != MATCH_YES)
2829 {
2830 tail->expr = expr;
2831 tail->repeat = 1;
2832 }
2833 else
2834 {
2835 msg = gfc_extract_int (expr, &tail->repeat);
2836 gfc_free_expr (expr);
2837 if (msg != NULL)
2838 {
2839 gfc_error (msg);
2840 return MATCH_ERROR;
2841 }
2842
2843 m = match_data_constant (&tail->expr);
2844 if (m == MATCH_NO)
2845 goto syntax;
2846 if (m == MATCH_ERROR)
2847 return MATCH_ERROR;
2848 }
2849
2850 if (gfc_match_char ('/') == MATCH_YES)
2851 break;
2852 if (gfc_match_char (',') == MATCH_NO)
2853 goto syntax;
2854 }
2855
2856 return MATCH_YES;
2857
2858syntax:
2859 gfc_syntax_error (ST_DATA);
2860 return MATCH_ERROR;
2861}
2862
2863
2864/* Match a DATA statement. */
2865
2866match
2867gfc_match_data (void)
2868{
2869 gfc_data *new;
2870 match m;
2871
2872 for (;;)
2873 {
2874 new = gfc_get_data ();
63645982 2875 new->where = gfc_current_locus;
6de9cd9a
DN
2876
2877 m = top_var_list (new);
2878 if (m != MATCH_YES)
2879 goto cleanup;
2880
2881 m = top_val_list (new);
2882 if (m != MATCH_YES)
2883 goto cleanup;
2884
2885 new->next = gfc_current_ns->data;
2886 gfc_current_ns->data = new;
2887
2888 if (gfc_match_eos () == MATCH_YES)
2889 break;
2890
2891 gfc_match_char (','); /* Optional comma */
2892 }
2893
2894 if (gfc_pure (NULL))
2895 {
2896 gfc_error ("DATA statement at %C is not allowed in a PURE procedure");
2897 return MATCH_ERROR;
2898 }
2899
2900 return MATCH_YES;
2901
2902cleanup:
2903 gfc_free_data (new);
2904 return MATCH_ERROR;
2905}
2906
2907
2908/***************** SELECT CASE subroutines ******************/
2909
2910/* Free a single case structure. */
2911
2912static void
2913free_case (gfc_case * p)
2914{
2915 if (p->low == p->high)
2916 p->high = NULL;
2917 gfc_free_expr (p->low);
2918 gfc_free_expr (p->high);
2919 gfc_free (p);
2920}
2921
2922
2923/* Free a list of case structures. */
2924
2925void
2926gfc_free_case_list (gfc_case * p)
2927{
2928 gfc_case *q;
2929
2930 for (; p; p = q)
2931 {
2932 q = p->next;
2933 free_case (p);
2934 }
2935}
2936
2937
2938/* Match a single case selector. */
2939
2940static match
2941match_case_selector (gfc_case ** cp)
2942{
2943 gfc_case *c;
2944 match m;
2945
2946 c = gfc_get_case ();
63645982 2947 c->where = gfc_current_locus;
6de9cd9a
DN
2948
2949 if (gfc_match_char (':') == MATCH_YES)
2950 {
6ef42154 2951 m = gfc_match_init_expr (&c->high);
6de9cd9a
DN
2952 if (m == MATCH_NO)
2953 goto need_expr;
2954 if (m == MATCH_ERROR)
2955 goto cleanup;
2956 }
2957
2958 else
2959 {
6ef42154 2960 m = gfc_match_init_expr (&c->low);
6de9cd9a
DN
2961 if (m == MATCH_ERROR)
2962 goto cleanup;
2963 if (m == MATCH_NO)
2964 goto need_expr;
2965
2966 /* If we're not looking at a ':' now, make a range out of a single
2967 target. Else get the upper bound for the case range. */
2968 if (gfc_match_char (':') != MATCH_YES)
2969 c->high = c->low;
2970 else
2971 {
6ef42154 2972 m = gfc_match_init_expr (&c->high);
6de9cd9a
DN
2973 if (m == MATCH_ERROR)
2974 goto cleanup;
2975 /* MATCH_NO is fine. It's OK if nothing is there! */
2976 }
2977 }
2978
2979 *cp = c;
2980 return MATCH_YES;
2981
2982need_expr:
6ef42154 2983 gfc_error ("Expected initialization expression in CASE at %C");
6de9cd9a
DN
2984
2985cleanup:
2986 free_case (c);
2987 return MATCH_ERROR;
2988}
2989
2990
2991/* Match the end of a case statement. */
2992
2993static match
2994match_case_eos (void)
2995{
2996 char name[GFC_MAX_SYMBOL_LEN + 1];
2997 match m;
2998
2999 if (gfc_match_eos () == MATCH_YES)
3000 return MATCH_YES;
3001
3002 gfc_gobble_whitespace ();
3003
3004 m = gfc_match_name (name);
3005 if (m != MATCH_YES)
3006 return m;
3007
3008 if (strcmp (name, gfc_current_block ()->name) != 0)
3009 {
3010 gfc_error ("Expected case name of '%s' at %C",
3011 gfc_current_block ()->name);
3012 return MATCH_ERROR;
3013 }
3014
3015 return gfc_match_eos ();
3016}
3017
3018
3019/* Match a SELECT statement. */
3020
3021match
3022gfc_match_select (void)
3023{
3024 gfc_expr *expr;
3025 match m;
3026
3027 m = gfc_match_label ();
3028 if (m == MATCH_ERROR)
3029 return m;
3030
3031 m = gfc_match (" select case ( %e )%t", &expr);
3032 if (m != MATCH_YES)
3033 return m;
3034
3035 new_st.op = EXEC_SELECT;
3036 new_st.expr = expr;
3037
3038 return MATCH_YES;
3039}
3040
3041
3042/* Match a CASE statement. */
3043
3044match
3045gfc_match_case (void)
3046{
3047 gfc_case *c, *head, *tail;
3048 match m;
3049
3050 head = tail = NULL;
3051
3052 if (gfc_current_state () != COMP_SELECT)
3053 {
3054 gfc_error ("Unexpected CASE statement at %C");
3055 return MATCH_ERROR;
3056 }
3057
3058 if (gfc_match ("% default") == MATCH_YES)
3059 {
3060 m = match_case_eos ();
3061 if (m == MATCH_NO)
3062 goto syntax;
3063 if (m == MATCH_ERROR)
3064 goto cleanup;
3065
3066 new_st.op = EXEC_SELECT;
3067 c = gfc_get_case ();
63645982 3068 c->where = gfc_current_locus;
6de9cd9a
DN
3069 new_st.ext.case_list = c;
3070 return MATCH_YES;
3071 }
3072
3073 if (gfc_match_char ('(') != MATCH_YES)
3074 goto syntax;
3075
3076 for (;;)
3077 {
3078 if (match_case_selector (&c) == MATCH_ERROR)
3079 goto cleanup;
3080
3081 if (head == NULL)
3082 head = c;
3083 else
3084 tail->next = c;
3085
3086 tail = c;
3087
3088 if (gfc_match_char (')') == MATCH_YES)
3089 break;
3090 if (gfc_match_char (',') != MATCH_YES)
3091 goto syntax;
3092 }
3093
3094 m = match_case_eos ();
3095 if (m == MATCH_NO)
3096 goto syntax;
3097 if (m == MATCH_ERROR)
3098 goto cleanup;
3099
3100 new_st.op = EXEC_SELECT;
3101 new_st.ext.case_list = head;
3102
3103 return MATCH_YES;
3104
3105syntax:
3106 gfc_error ("Syntax error in CASE-specification at %C");
3107
3108cleanup:
3109 gfc_free_case_list (head); /* new_st is cleaned up in parse.c. */
3110 return MATCH_ERROR;
3111}
3112
3113/********************* WHERE subroutines ********************/
3114
3115/* Match a WHERE statement. */
3116
3117match
3118gfc_match_where (gfc_statement * st)
3119{
3120 gfc_expr *expr;
3121 match m0, m;
3122 gfc_code *c;
3123
3124 m0 = gfc_match_label ();
3125 if (m0 == MATCH_ERROR)
3126 return m0;
3127
3128 m = gfc_match (" where ( %e )", &expr);
3129 if (m != MATCH_YES)
3130 return m;
3131
3132 if (gfc_match_eos () == MATCH_YES)
3133 {
3134 *st = ST_WHERE_BLOCK;
3135
3136 new_st.op = EXEC_WHERE;
3137 new_st.expr = expr;
3138 return MATCH_YES;
3139 }
3140
3141 m = gfc_match_assignment ();
3142 if (m == MATCH_NO)
3143 gfc_syntax_error (ST_WHERE);
3144
3145 if (m != MATCH_YES)
3146 {
3147 gfc_free_expr (expr);
3148 return MATCH_ERROR;
3149 }
3150
3151 /* We've got a simple WHERE statement. */
3152 *st = ST_WHERE;
3153 c = gfc_get_code ();
3154
3155 c->op = EXEC_WHERE;
3156 c->expr = expr;
3157 c->next = gfc_get_code ();
3158
3159 *c->next = new_st;
3160 gfc_clear_new_st ();
3161
3162 new_st.op = EXEC_WHERE;
3163 new_st.block = c;
3164
3165 return MATCH_YES;
3166}
3167
3168
3169/* Match an ELSEWHERE statement. We leave behind a WHERE node in
3170 new_st if successful. */
3171
3172match
3173gfc_match_elsewhere (void)
3174{
3175 char name[GFC_MAX_SYMBOL_LEN + 1];
3176 gfc_expr *expr;
3177 match m;
3178
3179 if (gfc_current_state () != COMP_WHERE)
3180 {
3181 gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
3182 return MATCH_ERROR;
3183 }
3184
3185 expr = NULL;
3186
3187 if (gfc_match_char ('(') == MATCH_YES)
3188 {
3189 m = gfc_match_expr (&expr);
3190 if (m == MATCH_NO)
3191 goto syntax;
3192 if (m == MATCH_ERROR)
3193 return MATCH_ERROR;
3194
3195 if (gfc_match_char (')') != MATCH_YES)
3196 goto syntax;
3197 }
3198
3199 if (gfc_match_eos () != MATCH_YES)
3200 { /* Better be a name at this point */
3201 m = gfc_match_name (name);
3202 if (m == MATCH_NO)
3203 goto syntax;
3204 if (m == MATCH_ERROR)
3205 goto cleanup;
3206
3207 if (gfc_match_eos () != MATCH_YES)
3208 goto syntax;
3209
3210 if (strcmp (name, gfc_current_block ()->name) != 0)
3211 {
3212 gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
3213 name, gfc_current_block ()->name);
3214 goto cleanup;
3215 }
3216 }
3217
3218 new_st.op = EXEC_WHERE;
3219 new_st.expr = expr;
3220 return MATCH_YES;
3221
3222syntax:
3223 gfc_syntax_error (ST_ELSEWHERE);
3224
3225cleanup:
3226 gfc_free_expr (expr);
3227 return MATCH_ERROR;
3228}
3229
3230
3231/******************** FORALL subroutines ********************/
3232
3233/* Free a list of FORALL iterators. */
3234
3235void
3236gfc_free_forall_iterator (gfc_forall_iterator * iter)
3237{
3238 gfc_forall_iterator *next;
3239
3240 while (iter)
3241 {
3242 next = iter->next;
3243
3244 gfc_free_expr (iter->var);
3245 gfc_free_expr (iter->start);
3246 gfc_free_expr (iter->end);
3247 gfc_free_expr (iter->stride);
3248
3249 gfc_free (iter);
3250 iter = next;
3251 }
3252}
3253
3254
3255/* Match an iterator as part of a FORALL statement. The format is:
3256
3257 <var> = <start>:<end>[:<stride>][, <scalar mask>] */
3258
3259static match
3260match_forall_iterator (gfc_forall_iterator ** result)
3261{
3262 gfc_forall_iterator *iter;
3263 locus where;
3264 match m;
3265
63645982 3266 where = gfc_current_locus;
6de9cd9a
DN
3267 iter = gfc_getmem (sizeof (gfc_forall_iterator));
3268
3269 m = gfc_match_variable (&iter->var, 0);
3270 if (m != MATCH_YES)
3271 goto cleanup;
3272
3273 if (gfc_match_char ('=') != MATCH_YES)
3274 {
3275 m = MATCH_NO;
3276 goto cleanup;
3277 }
3278
3279 m = gfc_match_expr (&iter->start);
3280 if (m == MATCH_NO)
3281 goto syntax;
3282 if (m == MATCH_ERROR)
3283 goto cleanup;
3284
3285 if (gfc_match_char (':') != MATCH_YES)
3286 goto syntax;
3287
3288 m = gfc_match_expr (&iter->end);
3289 if (m == MATCH_NO)
3290 goto syntax;
3291 if (m == MATCH_ERROR)
3292 goto cleanup;
3293
3294 if (gfc_match_char (':') == MATCH_NO)
3295 iter->stride = gfc_int_expr (1);
3296 else
3297 {
3298 m = gfc_match_expr (&iter->stride);
3299 if (m == MATCH_NO)
3300 goto syntax;
3301 if (m == MATCH_ERROR)
3302 goto cleanup;
3303 }
3304
3305 *result = iter;
3306 return MATCH_YES;
3307
3308syntax:
3309 gfc_error ("Syntax error in FORALL iterator at %C");
3310 m = MATCH_ERROR;
3311
3312cleanup:
63645982 3313 gfc_current_locus = where;
6de9cd9a
DN
3314 gfc_free_forall_iterator (iter);
3315 return m;
3316}
3317
3318
3319/* Match a FORALL statement. */
3320
3321match
3322gfc_match_forall (gfc_statement * st)
3323{
3324 gfc_forall_iterator *head, *tail, *new;
3325 gfc_expr *mask;
3326 gfc_code *c;
3327 match m0, m;
3328
3329 head = tail = NULL;
3330 mask = NULL;
3331 c = NULL;
3332
3333 m0 = gfc_match_label ();
3334 if (m0 == MATCH_ERROR)
3335 return MATCH_ERROR;
3336
3337 m = gfc_match (" forall (");
3338 if (m != MATCH_YES)
3339 return m;
3340
3341 m = match_forall_iterator (&new);
3342 if (m == MATCH_ERROR)
3343 goto cleanup;
3344 if (m == MATCH_NO)
3345 goto syntax;
3346
3347 head = tail = new;
3348
3349 for (;;)
3350 {
3351 if (gfc_match_char (',') != MATCH_YES)
3352 break;
3353
3354 m = match_forall_iterator (&new);
3355 if (m == MATCH_ERROR)
3356 goto cleanup;
3357 if (m == MATCH_YES)
3358 {
3359 tail->next = new;
3360 tail = new;
3361 continue;
3362 }
3363
3364 /* Have to have a mask expression. */
3365 m = gfc_match_expr (&mask);
3366 if (m == MATCH_NO)
3367 goto syntax;
3368 if (m == MATCH_ERROR)
3369 goto cleanup;
3370
3371 break;
3372 }
3373
3374 if (gfc_match_char (')') == MATCH_NO)
3375 goto syntax;
3376
3377 if (gfc_match_eos () == MATCH_YES)
3378 {
3379 *st = ST_FORALL_BLOCK;
3380
3381 new_st.op = EXEC_FORALL;
3382 new_st.expr = mask;
3383 new_st.ext.forall_iterator = head;
3384
3385 return MATCH_YES;
3386 }
3387
3388 m = gfc_match_assignment ();
3389 if (m == MATCH_ERROR)
3390 goto cleanup;
3391 if (m == MATCH_NO)
3392 {
3393 m = gfc_match_pointer_assignment ();
3394 if (m == MATCH_ERROR)
3395 goto cleanup;
3396 if (m == MATCH_NO)
3397 goto syntax;
3398 }
3399
3400 c = gfc_get_code ();
3401 *c = new_st;
3402
3403 if (gfc_match_eos () != MATCH_YES)
3404 goto syntax;
3405
3406 gfc_clear_new_st ();
3407 new_st.op = EXEC_FORALL;
3408 new_st.expr = mask;
3409 new_st.ext.forall_iterator = head;
3410 new_st.block = gfc_get_code ();
3411
3412 new_st.block->op = EXEC_FORALL;
3413 new_st.block->next = c;
3414
3415 *st = ST_FORALL;
3416 return MATCH_YES;
3417
3418syntax:
3419 gfc_syntax_error (ST_FORALL);
3420
3421cleanup:
3422 gfc_free_forall_iterator (head);
3423 gfc_free_expr (mask);
3424 gfc_free_statements (c);
3425 return MATCH_NO;
3426}
This page took 0.418423 seconds and 5 git commands to generate.