OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gcc-4.5.1/] [gcc/] [fortran/] [match.c] - Blame information for rev 859

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 285 jeremybenn
/* Matching subroutines in all sizes, shapes and colors.
2
   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3
   Free Software Foundation, Inc.
4
   Contributed by Andy Vaught
5
 
6
This file is part of GCC.
7
 
8
GCC is free software; you can redistribute it and/or modify it under
9
the terms of the GNU General Public License as published by the Free
10
Software Foundation; either version 3, or (at your option) any later
11
version.
12
 
13
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14
WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16
for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
21
 
22
#include "config.h"
23
#include "system.h"
24
#include "flags.h"
25
#include "gfortran.h"
26
#include "match.h"
27
#include "parse.h"
28
 
29
int gfc_matching_procptr_assignment = 0;
30
bool gfc_matching_prefix = false;
31
 
32
/* Stack of SELECT TYPE statements.  */
33
gfc_select_type_stack *select_type_stack = NULL;
34
 
35
/* For debugging and diagnostic purposes.  Return the textual representation
36
   of the intrinsic operator OP.  */
37
const char *
38
gfc_op2string (gfc_intrinsic_op op)
39
{
40
  switch (op)
41
    {
42
    case INTRINSIC_UPLUS:
43
    case INTRINSIC_PLUS:
44
      return "+";
45
 
46
    case INTRINSIC_UMINUS:
47
    case INTRINSIC_MINUS:
48
      return "-";
49
 
50
    case INTRINSIC_POWER:
51
      return "**";
52
    case INTRINSIC_CONCAT:
53
      return "//";
54
    case INTRINSIC_TIMES:
55
      return "*";
56
    case INTRINSIC_DIVIDE:
57
      return "/";
58
 
59
    case INTRINSIC_AND:
60
      return ".and.";
61
    case INTRINSIC_OR:
62
      return ".or.";
63
    case INTRINSIC_EQV:
64
      return ".eqv.";
65
    case INTRINSIC_NEQV:
66
      return ".neqv.";
67
 
68
    case INTRINSIC_EQ_OS:
69
      return ".eq.";
70
    case INTRINSIC_EQ:
71
      return "==";
72
    case INTRINSIC_NE_OS:
73
      return ".ne.";
74
    case INTRINSIC_NE:
75
      return "/=";
76
    case INTRINSIC_GE_OS:
77
      return ".ge.";
78
    case INTRINSIC_GE:
79
      return ">=";
80
    case INTRINSIC_LE_OS:
81
      return ".le.";
82
    case INTRINSIC_LE:
83
      return "<=";
84
    case INTRINSIC_LT_OS:
85
      return ".lt.";
86
    case INTRINSIC_LT:
87
      return "<";
88
    case INTRINSIC_GT_OS:
89
      return ".gt.";
90
    case INTRINSIC_GT:
91
      return ">";
92
    case INTRINSIC_NOT:
93
      return ".not.";
94
 
95
    case INTRINSIC_ASSIGN:
96
      return "=";
97
 
98
    case INTRINSIC_PARENTHESES:
99
      return "parens";
100
 
101
    default:
102
      break;
103
    }
104
 
105
  gfc_internal_error ("gfc_op2string(): Bad code");
106
  /* Not reached.  */
107
}
108
 
109
 
110
/******************** Generic matching subroutines ************************/
111
 
112
/* This function scans the current statement counting the opened and closed
113
   parenthesis to make sure they are balanced.  */
114
 
115
match
116
gfc_match_parens (void)
117
{
118
  locus old_loc, where;
119
  int count, instring;
120
  gfc_char_t c, quote;
121
 
122
  old_loc = gfc_current_locus;
123
  count = 0;
124
  instring = 0;
125
  quote = ' ';
126
 
127
  for (;;)
128
    {
129
      c = gfc_next_char_literal (instring);
130
      if (c == '\n')
131
        break;
132
      if (quote == ' ' && ((c == '\'') || (c == '"')))
133
        {
134
          quote = c;
135
          instring = 1;
136
          continue;
137
        }
138
      if (quote != ' ' && c == quote)
139
        {
140
          quote = ' ';
141
          instring = 0;
142
          continue;
143
        }
144
 
145
      if (c == '(' && quote == ' ')
146
        {
147
          count++;
148
          where = gfc_current_locus;
149
        }
150
      if (c == ')' && quote == ' ')
151
        {
152
          count--;
153
          where = gfc_current_locus;
154
        }
155
    }
156
 
157
  gfc_current_locus = old_loc;
158
 
159
  if (count > 0)
160
    {
161
      gfc_error ("Missing ')' in statement at or before %L", &where);
162
      return MATCH_ERROR;
163
    }
164
  if (count < 0)
165
    {
166
      gfc_error ("Missing '(' in statement at or before %L", &where);
167
      return MATCH_ERROR;
168
    }
169
 
170
  return MATCH_YES;
171
}
172
 
173
 
174
/* See if the next character is a special character that has
175
   escaped by a \ via the -fbackslash option.  */
176
 
177
match
178
gfc_match_special_char (gfc_char_t *res)
179
{
180
  int len, i;
181
  gfc_char_t c, n;
182
  match m;
183
 
184
  m = MATCH_YES;
185
 
186
  switch ((c = gfc_next_char_literal (1)))
187
    {
188
    case 'a':
189
      *res = '\a';
190
      break;
191
    case 'b':
192
      *res = '\b';
193
      break;
194
    case 't':
195
      *res = '\t';
196
      break;
197
    case 'f':
198
      *res = '\f';
199
      break;
200
    case 'n':
201
      *res = '\n';
202
      break;
203
    case 'r':
204
      *res = '\r';
205
      break;
206
    case 'v':
207
      *res = '\v';
208
      break;
209
    case '\\':
210
      *res = '\\';
211
      break;
212
    case '0':
213
      *res = '\0';
214
      break;
215
 
216
    case 'x':
217
    case 'u':
218
    case 'U':
219
      /* Hexadecimal form of wide characters.  */
220
      len = (c == 'x' ? 2 : (c == 'u' ? 4 : 8));
221
      n = 0;
222
      for (i = 0; i < len; i++)
223
        {
224
          char buf[2] = { '\0', '\0' };
225
 
226
          c = gfc_next_char_literal (1);
227
          if (!gfc_wide_fits_in_byte (c)
228
              || !gfc_check_digit ((unsigned char) c, 16))
229
            return MATCH_NO;
230
 
231
          buf[0] = (unsigned char) c;
232
          n = n << 4;
233
          n += strtol (buf, NULL, 16);
234
        }
235
      *res = n;
236
      break;
237
 
238
    default:
239
      /* Unknown backslash codes are simply not expanded.  */
240
      m = MATCH_NO;
241
      break;
242
    }
243
 
244
  return m;
245
}
246
 
247
 
248
/* In free form, match at least one space.  Always matches in fixed
249
   form.  */
250
 
251
match
252
gfc_match_space (void)
253
{
254
  locus old_loc;
255
  char c;
256
 
257
  if (gfc_current_form == FORM_FIXED)
258
    return MATCH_YES;
259
 
260
  old_loc = gfc_current_locus;
261
 
262
  c = gfc_next_ascii_char ();
263
  if (!gfc_is_whitespace (c))
264
    {
265
      gfc_current_locus = old_loc;
266
      return MATCH_NO;
267
    }
268
 
269
  gfc_gobble_whitespace ();
270
 
271
  return MATCH_YES;
272
}
273
 
274
 
275
/* Match an end of statement.  End of statement is optional
276
   whitespace, followed by a ';' or '\n' or comment '!'.  If a
277
   semicolon is found, we continue to eat whitespace and semicolons.  */
278
 
279
match
280
gfc_match_eos (void)
281
{
282
  locus old_loc;
283
  int flag;
284
  char c;
285
 
286
  flag = 0;
287
 
288
  for (;;)
289
    {
290
      old_loc = gfc_current_locus;
291
      gfc_gobble_whitespace ();
292
 
293
      c = gfc_next_ascii_char ();
294
      switch (c)
295
        {
296
        case '!':
297
          do
298
            {
299
              c = gfc_next_ascii_char ();
300
            }
301
          while (c != '\n');
302
 
303
          /* Fall through.  */
304
 
305
        case '\n':
306
          return MATCH_YES;
307
 
308
        case ';':
309
          flag = 1;
310
          continue;
311
        }
312
 
313
      break;
314
    }
315
 
316
  gfc_current_locus = old_loc;
317
  return (flag) ? MATCH_YES : MATCH_NO;
318
}
319
 
320
 
321
/* Match a literal integer on the input, setting the value on
322
   MATCH_YES.  Literal ints occur in kind-parameters as well as
323
   old-style character length specifications.  If cnt is non-NULL it
324
   will be set to the number of digits.  */
325
 
326
match
327
gfc_match_small_literal_int (int *value, int *cnt)
328
{
329
  locus old_loc;
330
  char c;
331
  int i, j;
332
 
333
  old_loc = gfc_current_locus;
334
 
335
  *value = -1;
336
  gfc_gobble_whitespace ();
337
  c = gfc_next_ascii_char ();
338
  if (cnt)
339
    *cnt = 0;
340
 
341
  if (!ISDIGIT (c))
342
    {
343
      gfc_current_locus = old_loc;
344
      return MATCH_NO;
345
    }
346
 
347
  i = c - '0';
348
  j = 1;
349
 
350
  for (;;)
351
    {
352
      old_loc = gfc_current_locus;
353
      c = gfc_next_ascii_char ();
354
 
355
      if (!ISDIGIT (c))
356
        break;
357
 
358
      i = 10 * i + c - '0';
359
      j++;
360
 
361
      if (i > 99999999)
362
        {
363
          gfc_error ("Integer too large at %C");
364
          return MATCH_ERROR;
365
        }
366
    }
367
 
368
  gfc_current_locus = old_loc;
369
 
370
  *value = i;
371
  if (cnt)
372
    *cnt = j;
373
  return MATCH_YES;
374
}
375
 
376
 
377
/* Match a small, constant integer expression, like in a kind
378
   statement.  On MATCH_YES, 'value' is set.  */
379
 
380
match
381
gfc_match_small_int (int *value)
382
{
383
  gfc_expr *expr;
384
  const char *p;
385
  match m;
386
  int i;
387
 
388
  m = gfc_match_expr (&expr);
389
  if (m != MATCH_YES)
390
    return m;
391
 
392
  p = gfc_extract_int (expr, &i);
393
  gfc_free_expr (expr);
394
 
395
  if (p != NULL)
396
    {
397
      gfc_error (p);
398
      m = MATCH_ERROR;
399
    }
400
 
401
  *value = i;
402
  return m;
403
}
404
 
405
 
406
/* This function is the same as the gfc_match_small_int, except that
407
   we're keeping the pointer to the expr.  This function could just be
408
   removed and the previously mentioned one modified, though all calls
409
   to it would have to be modified then (and there were a number of
410
   them).  Return MATCH_ERROR if fail to extract the int; otherwise,
411
   return the result of gfc_match_expr().  The expr (if any) that was
412
   matched is returned in the parameter expr.  */
413
 
414
match
415
gfc_match_small_int_expr (int *value, gfc_expr **expr)
416
{
417
  const char *p;
418
  match m;
419
  int i;
420
 
421
  m = gfc_match_expr (expr);
422
  if (m != MATCH_YES)
423
    return m;
424
 
425
  p = gfc_extract_int (*expr, &i);
426
 
427
  if (p != NULL)
428
    {
429
      gfc_error (p);
430
      m = MATCH_ERROR;
431
    }
432
 
433
  *value = i;
434
  return m;
435
}
436
 
437
 
438
/* Matches a statement label.  Uses gfc_match_small_literal_int() to
439
   do most of the work.  */
440
 
441
match
442
gfc_match_st_label (gfc_st_label **label)
443
{
444
  locus old_loc;
445
  match m;
446
  int i, cnt;
447
 
448
  old_loc = gfc_current_locus;
449
 
450
  m = gfc_match_small_literal_int (&i, &cnt);
451
  if (m != MATCH_YES)
452
    return m;
453
 
454
  if (cnt > 5)
455
    {
456
      gfc_error ("Too many digits in statement label at %C");
457
      goto cleanup;
458
    }
459
 
460
  if (i == 0)
461
    {
462
      gfc_error ("Statement label at %C is zero");
463
      goto cleanup;
464
    }
465
 
466
  *label = gfc_get_st_label (i);
467
  return MATCH_YES;
468
 
469
cleanup:
470
 
471
  gfc_current_locus = old_loc;
472
  return MATCH_ERROR;
473
}
474
 
475
 
476
/* Match and validate a label associated with a named IF, DO or SELECT
477
   statement.  If the symbol does not have the label attribute, we add
478
   it.  We also make sure the symbol does not refer to another
479
   (active) block.  A matched label is pointed to by gfc_new_block.  */
480
 
481
match
482
gfc_match_label (void)
483
{
484
  char name[GFC_MAX_SYMBOL_LEN + 1];
485
  match m;
486
 
487
  gfc_new_block = NULL;
488
 
489
  m = gfc_match (" %n :", name);
490
  if (m != MATCH_YES)
491
    return m;
492
 
493
  if (gfc_get_symbol (name, NULL, &gfc_new_block))
494
    {
495
      gfc_error ("Label name '%s' at %C is ambiguous", name);
496
      return MATCH_ERROR;
497
    }
498
 
499
  if (gfc_new_block->attr.flavor == FL_LABEL)
500
    {
501
      gfc_error ("Duplicate construct label '%s' at %C", name);
502
      return MATCH_ERROR;
503
    }
504
 
505
  if (gfc_add_flavor (&gfc_new_block->attr, FL_LABEL,
506
                      gfc_new_block->name, NULL) == FAILURE)
507
    return MATCH_ERROR;
508
 
509
  return MATCH_YES;
510
}
511
 
512
 
513
/* See if the current input looks like a name of some sort.  Modifies
514
   the passed buffer which must be GFC_MAX_SYMBOL_LEN+1 bytes long.
515
   Note that options.c restricts max_identifier_length to not more
516
   than GFC_MAX_SYMBOL_LEN.  */
517
 
518
match
519
gfc_match_name (char *buffer)
520
{
521
  locus old_loc;
522
  int i;
523
  char c;
524
 
525
  old_loc = gfc_current_locus;
526
  gfc_gobble_whitespace ();
527
 
528
  c = gfc_next_ascii_char ();
529
  if (!(ISALPHA (c) || (c == '_' && gfc_option.flag_allow_leading_underscore)))
530
    {
531
      if (gfc_error_flag_test() == 0 && c != '(')
532
        gfc_error ("Invalid character in name at %C");
533
      gfc_current_locus = old_loc;
534
      return MATCH_NO;
535
    }
536
 
537
  i = 0;
538
 
539
  do
540
    {
541
      buffer[i++] = c;
542
 
543
      if (i > gfc_option.max_identifier_length)
544
        {
545
          gfc_error ("Name at %C is too long");
546
          return MATCH_ERROR;
547
        }
548
 
549
      old_loc = gfc_current_locus;
550
      c = gfc_next_ascii_char ();
551
    }
552
  while (ISALNUM (c) || c == '_' || (gfc_option.flag_dollar_ok && c == '$'));
553
 
554
  if (c == '$' && !gfc_option.flag_dollar_ok)
555
    {
556
      gfc_error ("Invalid character '$' at %C. Use -fdollar-ok to allow it "
557
                 "as an extension");
558
      return MATCH_ERROR;
559
    }
560
 
561
  buffer[i] = '\0';
562
  gfc_current_locus = old_loc;
563
 
564
  return MATCH_YES;
565
}
566
 
567
 
568
/* Match a valid name for C, which is almost the same as for Fortran,
569
   except that you can start with an underscore, etc..  It could have
570
   been done by modifying the gfc_match_name, but this way other
571
   things C allows can be added, such as no limits on the length.
572
   Right now, the length is limited to the same thing as Fortran..
573
   Also, by rewriting it, we use the gfc_next_char_C() to prevent the
574
   input characters from being automatically lower cased, since C is
575
   case sensitive.  The parameter, buffer, is used to return the name
576
   that is matched.  Return MATCH_ERROR if the name is too long
577
   (though this is a self-imposed limit), MATCH_NO if what we're
578
   seeing isn't a name, and MATCH_YES if we successfully match a C
579
   name.  */
580
 
581
match
582
gfc_match_name_C (char *buffer)
583
{
584
  locus old_loc;
585
  int i = 0;
586
  gfc_char_t c;
587
 
588
  old_loc = gfc_current_locus;
589
  gfc_gobble_whitespace ();
590
 
591
  /* Get the next char (first possible char of name) and see if
592
     it's valid for C (either a letter or an underscore).  */
593
  c = gfc_next_char_literal (1);
594
 
595
  /* If the user put nothing expect spaces between the quotes, it is valid
596
     and simply means there is no name= specifier and the name is the fortran
597
     symbol name, all lowercase.  */
598
  if (c == '"' || c == '\'')
599
    {
600
      buffer[0] = '\0';
601
      gfc_current_locus = old_loc;
602
      return MATCH_YES;
603
    }
604
 
605
  if (!ISALPHA (c) && c != '_')
606
    {
607
      gfc_error ("Invalid C name in NAME= specifier at %C");
608
      return MATCH_ERROR;
609
    }
610
 
611
  /* Continue to read valid variable name characters.  */
612
  do
613
    {
614
      gcc_assert (gfc_wide_fits_in_byte (c));
615
 
616
      buffer[i++] = (unsigned char) c;
617
 
618
    /* C does not define a maximum length of variable names, to my
619
       knowledge, but the compiler typically places a limit on them.
620
       For now, i'll use the same as the fortran limit for simplicity,
621
       but this may need to be changed to a dynamic buffer that can
622
       be realloc'ed here if necessary, or more likely, a larger
623
       upper-bound set.  */
624
      if (i > gfc_option.max_identifier_length)
625
        {
626
          gfc_error ("Name at %C is too long");
627
          return MATCH_ERROR;
628
        }
629
 
630
      old_loc = gfc_current_locus;
631
 
632
      /* Get next char; param means we're in a string.  */
633
      c = gfc_next_char_literal (1);
634
    } while (ISALNUM (c) || c == '_');
635
 
636
  buffer[i] = '\0';
637
  gfc_current_locus = old_loc;
638
 
639
  /* See if we stopped because of whitespace.  */
640
  if (c == ' ')
641
    {
642
      gfc_gobble_whitespace ();
643
      c = gfc_peek_ascii_char ();
644
      if (c != '"' && c != '\'')
645
        {
646
          gfc_error ("Embedded space in NAME= specifier at %C");
647
          return MATCH_ERROR;
648
        }
649
    }
650
 
651
  /* If we stopped because we had an invalid character for a C name, report
652
     that to the user by returning MATCH_NO.  */
653
  if (c != '"' && c != '\'')
654
    {
655
      gfc_error ("Invalid C name in NAME= specifier at %C");
656
      return MATCH_ERROR;
657
    }
658
 
659
  return MATCH_YES;
660
}
661
 
662
 
663
/* Match a symbol on the input.  Modifies the pointer to the symbol
664
   pointer if successful.  */
665
 
666
match
667
gfc_match_sym_tree (gfc_symtree **matched_symbol, int host_assoc)
668
{
669
  char buffer[GFC_MAX_SYMBOL_LEN + 1];
670
  match m;
671
 
672
  m = gfc_match_name (buffer);
673
  if (m != MATCH_YES)
674
    return m;
675
 
676
  if (host_assoc)
677
    return (gfc_get_ha_sym_tree (buffer, matched_symbol))
678
            ? MATCH_ERROR : MATCH_YES;
679
 
680
  if (gfc_get_sym_tree (buffer, NULL, matched_symbol, false))
681
    return MATCH_ERROR;
682
 
683
  return MATCH_YES;
684
}
685
 
686
 
687
match
688
gfc_match_symbol (gfc_symbol **matched_symbol, int host_assoc)
689
{
690
  gfc_symtree *st;
691
  match m;
692
 
693
  m = gfc_match_sym_tree (&st, host_assoc);
694
 
695
  if (m == MATCH_YES)
696
    {
697
      if (st)
698
        *matched_symbol = st->n.sym;
699
      else
700
        *matched_symbol = NULL;
701
    }
702
  else
703
    *matched_symbol = NULL;
704
  return m;
705
}
706
 
707
 
708
/* Match an intrinsic operator.  Returns an INTRINSIC enum. While matching,
709
   we always find INTRINSIC_PLUS before INTRINSIC_UPLUS. We work around this
710
   in matchexp.c.  */
711
 
712
match
713
gfc_match_intrinsic_op (gfc_intrinsic_op *result)
714
{
715
  locus orig_loc = gfc_current_locus;
716
  char ch;
717
 
718
  gfc_gobble_whitespace ();
719
  ch = gfc_next_ascii_char ();
720
  switch (ch)
721
    {
722
    case '+':
723
      /* Matched "+".  */
724
      *result = INTRINSIC_PLUS;
725
      return MATCH_YES;
726
 
727
    case '-':
728
      /* Matched "-".  */
729
      *result = INTRINSIC_MINUS;
730
      return MATCH_YES;
731
 
732
    case '=':
733
      if (gfc_next_ascii_char () == '=')
734
        {
735
          /* Matched "==".  */
736
          *result = INTRINSIC_EQ;
737
          return MATCH_YES;
738
        }
739
      break;
740
 
741
    case '<':
742
      if (gfc_peek_ascii_char () == '=')
743
        {
744
          /* Matched "<=".  */
745
          gfc_next_ascii_char ();
746
          *result = INTRINSIC_LE;
747
          return MATCH_YES;
748
        }
749
      /* Matched "<".  */
750
      *result = INTRINSIC_LT;
751
      return MATCH_YES;
752
 
753
    case '>':
754
      if (gfc_peek_ascii_char () == '=')
755
        {
756
          /* Matched ">=".  */
757
          gfc_next_ascii_char ();
758
          *result = INTRINSIC_GE;
759
          return MATCH_YES;
760
        }
761
      /* Matched ">".  */
762
      *result = INTRINSIC_GT;
763
      return MATCH_YES;
764
 
765
    case '*':
766
      if (gfc_peek_ascii_char () == '*')
767
        {
768
          /* Matched "**".  */
769
          gfc_next_ascii_char ();
770
          *result = INTRINSIC_POWER;
771
          return MATCH_YES;
772
        }
773
      /* Matched "*".  */
774
      *result = INTRINSIC_TIMES;
775
      return MATCH_YES;
776
 
777
    case '/':
778
      ch = gfc_peek_ascii_char ();
779
      if (ch == '=')
780
        {
781
          /* Matched "/=".  */
782
          gfc_next_ascii_char ();
783
          *result = INTRINSIC_NE;
784
          return MATCH_YES;
785
        }
786
      else if (ch == '/')
787
        {
788
          /* Matched "//".  */
789
          gfc_next_ascii_char ();
790
          *result = INTRINSIC_CONCAT;
791
          return MATCH_YES;
792
        }
793
      /* Matched "/".  */
794
      *result = INTRINSIC_DIVIDE;
795
      return MATCH_YES;
796
 
797
    case '.':
798
      ch = gfc_next_ascii_char ();
799
      switch (ch)
800
        {
801
        case 'a':
802
          if (gfc_next_ascii_char () == 'n'
803
              && gfc_next_ascii_char () == 'd'
804
              && gfc_next_ascii_char () == '.')
805
            {
806
              /* Matched ".and.".  */
807
              *result = INTRINSIC_AND;
808
              return MATCH_YES;
809
            }
810
          break;
811
 
812
        case 'e':
813
          if (gfc_next_ascii_char () == 'q')
814
            {
815
              ch = gfc_next_ascii_char ();
816
              if (ch == '.')
817
                {
818
                  /* Matched ".eq.".  */
819
                  *result = INTRINSIC_EQ_OS;
820
                  return MATCH_YES;
821
                }
822
              else if (ch == 'v')
823
                {
824
                  if (gfc_next_ascii_char () == '.')
825
                    {
826
                      /* Matched ".eqv.".  */
827
                      *result = INTRINSIC_EQV;
828
                      return MATCH_YES;
829
                    }
830
                }
831
            }
832
          break;
833
 
834
        case 'g':
835
          ch = gfc_next_ascii_char ();
836
          if (ch == 'e')
837
            {
838
              if (gfc_next_ascii_char () == '.')
839
                {
840
                  /* Matched ".ge.".  */
841
                  *result = INTRINSIC_GE_OS;
842
                  return MATCH_YES;
843
                }
844
            }
845
          else if (ch == 't')
846
            {
847
              if (gfc_next_ascii_char () == '.')
848
                {
849
                  /* Matched ".gt.".  */
850
                  *result = INTRINSIC_GT_OS;
851
                  return MATCH_YES;
852
                }
853
            }
854
          break;
855
 
856
        case 'l':
857
          ch = gfc_next_ascii_char ();
858
          if (ch == 'e')
859
            {
860
              if (gfc_next_ascii_char () == '.')
861
                {
862
                  /* Matched ".le.".  */
863
                  *result = INTRINSIC_LE_OS;
864
                  return MATCH_YES;
865
                }
866
            }
867
          else if (ch == 't')
868
            {
869
              if (gfc_next_ascii_char () == '.')
870
                {
871
                  /* Matched ".lt.".  */
872
                  *result = INTRINSIC_LT_OS;
873
                  return MATCH_YES;
874
                }
875
            }
876
          break;
877
 
878
        case 'n':
879
          ch = gfc_next_ascii_char ();
880
          if (ch == 'e')
881
            {
882
              ch = gfc_next_ascii_char ();
883
              if (ch == '.')
884
                {
885
                  /* Matched ".ne.".  */
886
                  *result = INTRINSIC_NE_OS;
887
                  return MATCH_YES;
888
                }
889
              else if (ch == 'q')
890
                {
891
                  if (gfc_next_ascii_char () == 'v'
892
                      && gfc_next_ascii_char () == '.')
893
                    {
894
                      /* Matched ".neqv.".  */
895
                      *result = INTRINSIC_NEQV;
896
                      return MATCH_YES;
897
                    }
898
                }
899
            }
900
          else if (ch == 'o')
901
            {
902
              if (gfc_next_ascii_char () == 't'
903
                  && gfc_next_ascii_char () == '.')
904
                {
905
                  /* Matched ".not.".  */
906
                  *result = INTRINSIC_NOT;
907
                  return MATCH_YES;
908
                }
909
            }
910
          break;
911
 
912
        case 'o':
913
          if (gfc_next_ascii_char () == 'r'
914
              && gfc_next_ascii_char () == '.')
915
            {
916
              /* Matched ".or.".  */
917
              *result = INTRINSIC_OR;
918
              return MATCH_YES;
919
            }
920
          break;
921
 
922
        default:
923
          break;
924
        }
925
      break;
926
 
927
    default:
928
      break;
929
    }
930
 
931
  gfc_current_locus = orig_loc;
932
  return MATCH_NO;
933
}
934
 
935
 
936
/* Match a loop control phrase:
937
 
938
    <LVALUE> = <EXPR>, <EXPR> [, <EXPR> ]
939
 
940
   If the final integer expression is not present, a constant unity
941
   expression is returned.  We don't return MATCH_ERROR until after
942
   the equals sign is seen.  */
943
 
944
match
945
gfc_match_iterator (gfc_iterator *iter, int init_flag)
946
{
947
  char name[GFC_MAX_SYMBOL_LEN + 1];
948
  gfc_expr *var, *e1, *e2, *e3;
949
  locus start;
950
  match m;
951
 
952
  /* Match the start of an iterator without affecting the symbol table.  */
953
 
954
  start = gfc_current_locus;
955
  m = gfc_match (" %n =", name);
956
  gfc_current_locus = start;
957
 
958
  if (m != MATCH_YES)
959
    return MATCH_NO;
960
 
961
  m = gfc_match_variable (&var, 0);
962
  if (m != MATCH_YES)
963
    return MATCH_NO;
964
 
965
  gfc_match_char ('=');
966
 
967
  e1 = e2 = e3 = NULL;
968
 
969
  if (var->ref != NULL)
970
    {
971
      gfc_error ("Loop variable at %C cannot be a sub-component");
972
      goto cleanup;
973
    }
974
 
975
  if (var->symtree->n.sym->attr.intent == INTENT_IN)
976
    {
977
      gfc_error ("Loop variable '%s' at %C cannot be INTENT(IN)",
978
                 var->symtree->n.sym->name);
979
      goto cleanup;
980
    }
981
 
982
  var->symtree->n.sym->attr.implied_index = 1;
983
 
984
  m = init_flag ? gfc_match_init_expr (&e1) : gfc_match_expr (&e1);
985
  if (m == MATCH_NO)
986
    goto syntax;
987
  if (m == MATCH_ERROR)
988
    goto cleanup;
989
 
990
  if (gfc_match_char (',') != MATCH_YES)
991
    goto syntax;
992
 
993
  m = init_flag ? gfc_match_init_expr (&e2) : gfc_match_expr (&e2);
994
  if (m == MATCH_NO)
995
    goto syntax;
996
  if (m == MATCH_ERROR)
997
    goto cleanup;
998
 
999
  if (gfc_match_char (',') != MATCH_YES)
1000
    {
1001
      e3 = gfc_int_expr (1);
1002
      goto done;
1003
    }
1004
 
1005
  m = init_flag ? gfc_match_init_expr (&e3) : gfc_match_expr (&e3);
1006
  if (m == MATCH_ERROR)
1007
    goto cleanup;
1008
  if (m == MATCH_NO)
1009
    {
1010
      gfc_error ("Expected a step value in iterator at %C");
1011
      goto cleanup;
1012
    }
1013
 
1014
done:
1015
  iter->var = var;
1016
  iter->start = e1;
1017
  iter->end = e2;
1018
  iter->step = e3;
1019
  return MATCH_YES;
1020
 
1021
syntax:
1022
  gfc_error ("Syntax error in iterator at %C");
1023
 
1024
cleanup:
1025
  gfc_free_expr (e1);
1026
  gfc_free_expr (e2);
1027
  gfc_free_expr (e3);
1028
 
1029
  return MATCH_ERROR;
1030
}
1031
 
1032
 
1033
/* Tries to match the next non-whitespace character on the input.
1034
   This subroutine does not return MATCH_ERROR.  */
1035
 
1036
match
1037
gfc_match_char (char c)
1038
{
1039
  locus where;
1040
 
1041
  where = gfc_current_locus;
1042
  gfc_gobble_whitespace ();
1043
 
1044
  if (gfc_next_ascii_char () == c)
1045
    return MATCH_YES;
1046
 
1047
  gfc_current_locus = where;
1048
  return MATCH_NO;
1049
}
1050
 
1051
 
1052
/* General purpose matching subroutine.  The target string is a
1053
   scanf-like format string in which spaces correspond to arbitrary
1054
   whitespace (including no whitespace), characters correspond to
1055
   themselves.  The %-codes are:
1056
 
1057
   %%  Literal percent sign
1058
   %e  Expression, pointer to a pointer is set
1059
   %s  Symbol, pointer to the symbol is set
1060
   %n  Name, character buffer is set to name
1061
   %t  Matches end of statement.
1062
   %o  Matches an intrinsic operator, returned as an INTRINSIC enum.
1063
   %l  Matches a statement label
1064
   %v  Matches a variable expression (an lvalue)
1065
   %   Matches a required space (in free form) and optional spaces.  */
1066
 
1067
match
1068
gfc_match (const char *target, ...)
1069
{
1070
  gfc_st_label **label;
1071
  int matches, *ip;
1072
  locus old_loc;
1073
  va_list argp;
1074
  char c, *np;
1075
  match m, n;
1076
  void **vp;
1077
  const char *p;
1078
 
1079
  old_loc = gfc_current_locus;
1080
  va_start (argp, target);
1081
  m = MATCH_NO;
1082
  matches = 0;
1083
  p = target;
1084
 
1085
loop:
1086
  c = *p++;
1087
  switch (c)
1088
    {
1089
    case ' ':
1090
      gfc_gobble_whitespace ();
1091
      goto loop;
1092
    case '\0':
1093
      m = MATCH_YES;
1094
      break;
1095
 
1096
    case '%':
1097
      c = *p++;
1098
      switch (c)
1099
        {
1100
        case 'e':
1101
          vp = va_arg (argp, void **);
1102
          n = gfc_match_expr ((gfc_expr **) vp);
1103
          if (n != MATCH_YES)
1104
            {
1105
              m = n;
1106
              goto not_yes;
1107
            }
1108
 
1109
          matches++;
1110
          goto loop;
1111
 
1112
        case 'v':
1113
          vp = va_arg (argp, void **);
1114
          n = gfc_match_variable ((gfc_expr **) vp, 0);
1115
          if (n != MATCH_YES)
1116
            {
1117
              m = n;
1118
              goto not_yes;
1119
            }
1120
 
1121
          matches++;
1122
          goto loop;
1123
 
1124
        case 's':
1125
          vp = va_arg (argp, void **);
1126
          n = gfc_match_symbol ((gfc_symbol **) vp, 0);
1127
          if (n != MATCH_YES)
1128
            {
1129
              m = n;
1130
              goto not_yes;
1131
            }
1132
 
1133
          matches++;
1134
          goto loop;
1135
 
1136
        case 'n':
1137
          np = va_arg (argp, char *);
1138
          n = gfc_match_name (np);
1139
          if (n != MATCH_YES)
1140
            {
1141
              m = n;
1142
              goto not_yes;
1143
            }
1144
 
1145
          matches++;
1146
          goto loop;
1147
 
1148
        case 'l':
1149
          label = va_arg (argp, gfc_st_label **);
1150
          n = gfc_match_st_label (label);
1151
          if (n != MATCH_YES)
1152
            {
1153
              m = n;
1154
              goto not_yes;
1155
            }
1156
 
1157
          matches++;
1158
          goto loop;
1159
 
1160
        case 'o':
1161
          ip = va_arg (argp, int *);
1162
          n = gfc_match_intrinsic_op ((gfc_intrinsic_op *) ip);
1163
          if (n != MATCH_YES)
1164
            {
1165
              m = n;
1166
              goto not_yes;
1167
            }
1168
 
1169
          matches++;
1170
          goto loop;
1171
 
1172
        case 't':
1173
          if (gfc_match_eos () != MATCH_YES)
1174
            {
1175
              m = MATCH_NO;
1176
              goto not_yes;
1177
            }
1178
          goto loop;
1179
 
1180
        case ' ':
1181
          if (gfc_match_space () == MATCH_YES)
1182
            goto loop;
1183
          m = MATCH_NO;
1184
          goto not_yes;
1185
 
1186
        case '%':
1187
          break;        /* Fall through to character matcher.  */
1188
 
1189
        default:
1190
          gfc_internal_error ("gfc_match(): Bad match code %c", c);
1191
        }
1192
 
1193
    default:
1194
 
1195
      /* gfc_next_ascii_char converts characters to lower-case, so we shouldn't
1196
         expect an upper case character here!  */
1197
      gcc_assert (TOLOWER (c) == c);
1198
 
1199
      if (c == gfc_next_ascii_char ())
1200
        goto loop;
1201
      break;
1202
    }
1203
 
1204
not_yes:
1205
  va_end (argp);
1206
 
1207
  if (m != MATCH_YES)
1208
    {
1209
      /* Clean up after a failed match.  */
1210
      gfc_current_locus = old_loc;
1211
      va_start (argp, target);
1212
 
1213
      p = target;
1214
      for (; matches > 0; matches--)
1215
        {
1216
          while (*p++ != '%');
1217
 
1218
          switch (*p++)
1219
            {
1220
            case '%':
1221
              matches++;
1222
              break;            /* Skip.  */
1223
 
1224
            /* Matches that don't have to be undone */
1225
            case 'o':
1226
            case 'l':
1227
            case 'n':
1228
            case 's':
1229
              (void) va_arg (argp, void **);
1230
              break;
1231
 
1232
            case 'e':
1233
            case 'v':
1234
              vp = va_arg (argp, void **);
1235
              gfc_free_expr ((struct gfc_expr *)*vp);
1236
              *vp = NULL;
1237
              break;
1238
            }
1239
        }
1240
 
1241
      va_end (argp);
1242
    }
1243
 
1244
  return m;
1245
}
1246
 
1247
 
1248
/*********************** Statement level matching **********************/
1249
 
1250
/* Matches the start of a program unit, which is the program keyword
1251
   followed by an obligatory symbol.  */
1252
 
1253
match
1254
gfc_match_program (void)
1255
{
1256
  gfc_symbol *sym;
1257
  match m;
1258
 
1259
  m = gfc_match ("% %s%t", &sym);
1260
 
1261
  if (m == MATCH_NO)
1262
    {
1263
      gfc_error ("Invalid form of PROGRAM statement at %C");
1264
      m = MATCH_ERROR;
1265
    }
1266
 
1267
  if (m == MATCH_ERROR)
1268
    return m;
1269
 
1270
  if (gfc_add_flavor (&sym->attr, FL_PROGRAM, sym->name, NULL) == FAILURE)
1271
    return MATCH_ERROR;
1272
 
1273
  gfc_new_block = sym;
1274
 
1275
  return MATCH_YES;
1276
}
1277
 
1278
 
1279
/* Match a simple assignment statement.  */
1280
 
1281
match
1282
gfc_match_assignment (void)
1283
{
1284
  gfc_expr *lvalue, *rvalue;
1285
  locus old_loc;
1286
  match m;
1287
 
1288
  old_loc = gfc_current_locus;
1289
 
1290
  lvalue = NULL;
1291
  m = gfc_match (" %v =", &lvalue);
1292
  if (m != MATCH_YES)
1293
    {
1294
      gfc_current_locus = old_loc;
1295
      gfc_free_expr (lvalue);
1296
      return MATCH_NO;
1297
    }
1298
 
1299
  rvalue = NULL;
1300
  m = gfc_match (" %e%t", &rvalue);
1301
  if (m != MATCH_YES)
1302
    {
1303
      gfc_current_locus = old_loc;
1304
      gfc_free_expr (lvalue);
1305
      gfc_free_expr (rvalue);
1306
      return m;
1307
    }
1308
 
1309
  gfc_set_sym_referenced (lvalue->symtree->n.sym);
1310
 
1311
  new_st.op = EXEC_ASSIGN;
1312
  new_st.expr1 = lvalue;
1313
  new_st.expr2 = rvalue;
1314
 
1315
  gfc_check_do_variable (lvalue->symtree);
1316
 
1317
  return MATCH_YES;
1318
}
1319
 
1320
 
1321
/* Match a pointer assignment statement.  */
1322
 
1323
match
1324
gfc_match_pointer_assignment (void)
1325
{
1326
  gfc_expr *lvalue, *rvalue;
1327
  locus old_loc;
1328
  match m;
1329
 
1330
  old_loc = gfc_current_locus;
1331
 
1332
  lvalue = rvalue = NULL;
1333
  gfc_matching_procptr_assignment = 0;
1334
 
1335
  m = gfc_match (" %v =>", &lvalue);
1336
  if (m != MATCH_YES)
1337
    {
1338
      m = MATCH_NO;
1339
      goto cleanup;
1340
    }
1341
 
1342
  if (lvalue->symtree->n.sym->attr.proc_pointer
1343
      || gfc_is_proc_ptr_comp (lvalue, NULL))
1344
    gfc_matching_procptr_assignment = 1;
1345
 
1346
  m = gfc_match (" %e%t", &rvalue);
1347
  gfc_matching_procptr_assignment = 0;
1348
  if (m != MATCH_YES)
1349
    goto cleanup;
1350
 
1351
  new_st.op = EXEC_POINTER_ASSIGN;
1352
  new_st.expr1 = lvalue;
1353
  new_st.expr2 = rvalue;
1354
 
1355
  return MATCH_YES;
1356
 
1357
cleanup:
1358
  gfc_current_locus = old_loc;
1359
  gfc_free_expr (lvalue);
1360
  gfc_free_expr (rvalue);
1361
  return m;
1362
}
1363
 
1364
 
1365
/* We try to match an easy arithmetic IF statement. This only happens
1366
   when just after having encountered a simple IF statement. This code
1367
   is really duplicate with parts of the gfc_match_if code, but this is
1368
   *much* easier.  */
1369
 
1370
static match
1371
match_arithmetic_if (void)
1372
{
1373
  gfc_st_label *l1, *l2, *l3;
1374
  gfc_expr *expr;
1375
  match m;
1376
 
1377
  m = gfc_match (" ( %e ) %l , %l , %l%t", &expr, &l1, &l2, &l3);
1378
  if (m != MATCH_YES)
1379
    return m;
1380
 
1381
  if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1382
      || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1383
      || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1384
    {
1385
      gfc_free_expr (expr);
1386
      return MATCH_ERROR;
1387
    }
1388
 
1389
  if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Arithmetic IF "
1390
                      "statement at %C") == FAILURE)
1391
    return MATCH_ERROR;
1392
 
1393
  new_st.op = EXEC_ARITHMETIC_IF;
1394
  new_st.expr1 = expr;
1395
  new_st.label1 = l1;
1396
  new_st.label2 = l2;
1397
  new_st.label3 = l3;
1398
 
1399
  return MATCH_YES;
1400
}
1401
 
1402
 
1403
/* The IF statement is a bit of a pain.  First of all, there are three
1404
   forms of it, the simple IF, the IF that starts a block and the
1405
   arithmetic IF.
1406
 
1407
   There is a problem with the simple IF and that is the fact that we
1408
   only have a single level of undo information on symbols.  What this
1409
   means is for a simple IF, we must re-match the whole IF statement
1410
   multiple times in order to guarantee that the symbol table ends up
1411
   in the proper state.  */
1412
 
1413
static match match_simple_forall (void);
1414
static match match_simple_where (void);
1415
 
1416
match
1417
gfc_match_if (gfc_statement *if_type)
1418
{
1419
  gfc_expr *expr;
1420
  gfc_st_label *l1, *l2, *l3;
1421
  locus old_loc, old_loc2;
1422
  gfc_code *p;
1423
  match m, n;
1424
 
1425
  n = gfc_match_label ();
1426
  if (n == MATCH_ERROR)
1427
    return n;
1428
 
1429
  old_loc = gfc_current_locus;
1430
 
1431
  m = gfc_match (" if ( %e", &expr);
1432
  if (m != MATCH_YES)
1433
    return m;
1434
 
1435
  old_loc2 = gfc_current_locus;
1436
  gfc_current_locus = old_loc;
1437
 
1438
  if (gfc_match_parens () == MATCH_ERROR)
1439
    return MATCH_ERROR;
1440
 
1441
  gfc_current_locus = old_loc2;
1442
 
1443
  if (gfc_match_char (')') != MATCH_YES)
1444
    {
1445
      gfc_error ("Syntax error in IF-expression at %C");
1446
      gfc_free_expr (expr);
1447
      return MATCH_ERROR;
1448
    }
1449
 
1450
  m = gfc_match (" %l , %l , %l%t", &l1, &l2, &l3);
1451
 
1452
  if (m == MATCH_YES)
1453
    {
1454
      if (n == MATCH_YES)
1455
        {
1456
          gfc_error ("Block label not appropriate for arithmetic IF "
1457
                     "statement at %C");
1458
          gfc_free_expr (expr);
1459
          return MATCH_ERROR;
1460
        }
1461
 
1462
      if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1463
          || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1464
          || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1465
        {
1466
          gfc_free_expr (expr);
1467
          return MATCH_ERROR;
1468
        }
1469
 
1470
      if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Arithmetic IF "
1471
                          "statement at %C") == FAILURE)
1472
        return MATCH_ERROR;
1473
 
1474
      new_st.op = EXEC_ARITHMETIC_IF;
1475
      new_st.expr1 = expr;
1476
      new_st.label1 = l1;
1477
      new_st.label2 = l2;
1478
      new_st.label3 = l3;
1479
 
1480
      *if_type = ST_ARITHMETIC_IF;
1481
      return MATCH_YES;
1482
    }
1483
 
1484
  if (gfc_match (" then%t") == MATCH_YES)
1485
    {
1486
      new_st.op = EXEC_IF;
1487
      new_st.expr1 = expr;
1488
      *if_type = ST_IF_BLOCK;
1489
      return MATCH_YES;
1490
    }
1491
 
1492
  if (n == MATCH_YES)
1493
    {
1494
      gfc_error ("Block label is not appropriate for IF statement at %C");
1495
      gfc_free_expr (expr);
1496
      return MATCH_ERROR;
1497
    }
1498
 
1499
  /* At this point the only thing left is a simple IF statement.  At
1500
     this point, n has to be MATCH_NO, so we don't have to worry about
1501
     re-matching a block label.  From what we've got so far, try
1502
     matching an assignment.  */
1503
 
1504
  *if_type = ST_SIMPLE_IF;
1505
 
1506
  m = gfc_match_assignment ();
1507
  if (m == MATCH_YES)
1508
    goto got_match;
1509
 
1510
  gfc_free_expr (expr);
1511
  gfc_undo_symbols ();
1512
  gfc_current_locus = old_loc;
1513
 
1514
  /* m can be MATCH_NO or MATCH_ERROR, here.  For MATCH_ERROR, a mangled
1515
     assignment was found.  For MATCH_NO, continue to call the various
1516
     matchers.  */
1517
  if (m == MATCH_ERROR)
1518
    return MATCH_ERROR;
1519
 
1520
  gfc_match (" if ( %e ) ", &expr);     /* Guaranteed to match.  */
1521
 
1522
  m = gfc_match_pointer_assignment ();
1523
  if (m == MATCH_YES)
1524
    goto got_match;
1525
 
1526
  gfc_free_expr (expr);
1527
  gfc_undo_symbols ();
1528
  gfc_current_locus = old_loc;
1529
 
1530
  gfc_match (" if ( %e ) ", &expr);     /* Guaranteed to match.  */
1531
 
1532
  /* Look at the next keyword to see which matcher to call.  Matching
1533
     the keyword doesn't affect the symbol table, so we don't have to
1534
     restore between tries.  */
1535
 
1536
#define match(string, subr, statement) \
1537
  if (gfc_match(string) == MATCH_YES) { m = subr(); goto got_match; }
1538
 
1539
  gfc_clear_error ();
1540
 
1541
  match ("allocate", gfc_match_allocate, ST_ALLOCATE)
1542
  match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT)
1543
  match ("backspace", gfc_match_backspace, ST_BACKSPACE)
1544
  match ("call", gfc_match_call, ST_CALL)
1545
  match ("close", gfc_match_close, ST_CLOSE)
1546
  match ("continue", gfc_match_continue, ST_CONTINUE)
1547
  match ("cycle", gfc_match_cycle, ST_CYCLE)
1548
  match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE)
1549
  match ("end file", gfc_match_endfile, ST_END_FILE)
1550
  match ("exit", gfc_match_exit, ST_EXIT)
1551
  match ("flush", gfc_match_flush, ST_FLUSH)
1552
  match ("forall", match_simple_forall, ST_FORALL)
1553
  match ("go to", gfc_match_goto, ST_GOTO)
1554
  match ("if", match_arithmetic_if, ST_ARITHMETIC_IF)
1555
  match ("inquire", gfc_match_inquire, ST_INQUIRE)
1556
  match ("nullify", gfc_match_nullify, ST_NULLIFY)
1557
  match ("open", gfc_match_open, ST_OPEN)
1558
  match ("pause", gfc_match_pause, ST_NONE)
1559
  match ("print", gfc_match_print, ST_WRITE)
1560
  match ("read", gfc_match_read, ST_READ)
1561
  match ("return", gfc_match_return, ST_RETURN)
1562
  match ("rewind", gfc_match_rewind, ST_REWIND)
1563
  match ("stop", gfc_match_stop, ST_STOP)
1564
  match ("wait", gfc_match_wait, ST_WAIT)
1565
  match ("where", match_simple_where, ST_WHERE)
1566
  match ("write", gfc_match_write, ST_WRITE)
1567
 
1568
  /* The gfc_match_assignment() above may have returned a MATCH_NO
1569
     where the assignment was to a named constant.  Check that
1570
     special case here.  */
1571
  m = gfc_match_assignment ();
1572
  if (m == MATCH_NO)
1573
   {
1574
      gfc_error ("Cannot assign to a named constant at %C");
1575
      gfc_free_expr (expr);
1576
      gfc_undo_symbols ();
1577
      gfc_current_locus = old_loc;
1578
      return MATCH_ERROR;
1579
   }
1580
 
1581
  /* All else has failed, so give up.  See if any of the matchers has
1582
     stored an error message of some sort.  */
1583
  if (gfc_error_check () == 0)
1584
    gfc_error ("Unclassifiable statement in IF-clause at %C");
1585
 
1586
  gfc_free_expr (expr);
1587
  return MATCH_ERROR;
1588
 
1589
got_match:
1590
  if (m == MATCH_NO)
1591
    gfc_error ("Syntax error in IF-clause at %C");
1592
  if (m != MATCH_YES)
1593
    {
1594
      gfc_free_expr (expr);
1595
      return MATCH_ERROR;
1596
    }
1597
 
1598
  /* At this point, we've matched the single IF and the action clause
1599
     is in new_st.  Rearrange things so that the IF statement appears
1600
     in new_st.  */
1601
 
1602
  p = gfc_get_code ();
1603
  p->next = gfc_get_code ();
1604
  *p->next = new_st;
1605
  p->next->loc = gfc_current_locus;
1606
 
1607
  p->expr1 = expr;
1608
  p->op = EXEC_IF;
1609
 
1610
  gfc_clear_new_st ();
1611
 
1612
  new_st.op = EXEC_IF;
1613
  new_st.block = p;
1614
 
1615
  return MATCH_YES;
1616
}
1617
 
1618
#undef match
1619
 
1620
 
1621
/* Match an ELSE statement.  */
1622
 
1623
match
1624
gfc_match_else (void)
1625
{
1626
  char name[GFC_MAX_SYMBOL_LEN + 1];
1627
 
1628
  if (gfc_match_eos () == MATCH_YES)
1629
    return MATCH_YES;
1630
 
1631
  if (gfc_match_name (name) != MATCH_YES
1632
      || gfc_current_block () == NULL
1633
      || gfc_match_eos () != MATCH_YES)
1634
    {
1635
      gfc_error ("Unexpected junk after ELSE statement at %C");
1636
      return MATCH_ERROR;
1637
    }
1638
 
1639
  if (strcmp (name, gfc_current_block ()->name) != 0)
1640
    {
1641
      gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1642
                 name, gfc_current_block ()->name);
1643
      return MATCH_ERROR;
1644
    }
1645
 
1646
  return MATCH_YES;
1647
}
1648
 
1649
 
1650
/* Match an ELSE IF statement.  */
1651
 
1652
match
1653
gfc_match_elseif (void)
1654
{
1655
  char name[GFC_MAX_SYMBOL_LEN + 1];
1656
  gfc_expr *expr;
1657
  match m;
1658
 
1659
  m = gfc_match (" ( %e ) then", &expr);
1660
  if (m != MATCH_YES)
1661
    return m;
1662
 
1663
  if (gfc_match_eos () == MATCH_YES)
1664
    goto done;
1665
 
1666
  if (gfc_match_name (name) != MATCH_YES
1667
      || gfc_current_block () == NULL
1668
      || gfc_match_eos () != MATCH_YES)
1669
    {
1670
      gfc_error ("Unexpected junk after ELSE IF statement at %C");
1671
      goto cleanup;
1672
    }
1673
 
1674
  if (strcmp (name, gfc_current_block ()->name) != 0)
1675
    {
1676
      gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1677
                 name, gfc_current_block ()->name);
1678
      goto cleanup;
1679
    }
1680
 
1681
done:
1682
  new_st.op = EXEC_IF;
1683
  new_st.expr1 = expr;
1684
  return MATCH_YES;
1685
 
1686
cleanup:
1687
  gfc_free_expr (expr);
1688
  return MATCH_ERROR;
1689
}
1690
 
1691
 
1692
/* Free a gfc_iterator structure.  */
1693
 
1694
void
1695
gfc_free_iterator (gfc_iterator *iter, int flag)
1696
{
1697
 
1698
  if (iter == NULL)
1699
    return;
1700
 
1701
  gfc_free_expr (iter->var);
1702
  gfc_free_expr (iter->start);
1703
  gfc_free_expr (iter->end);
1704
  gfc_free_expr (iter->step);
1705
 
1706
  if (flag)
1707
    gfc_free (iter);
1708
}
1709
 
1710
 
1711
/* Match a BLOCK statement.  */
1712
 
1713
match
1714
gfc_match_block (void)
1715
{
1716
  match m;
1717
 
1718
  if (gfc_match_label () == MATCH_ERROR)
1719
    return MATCH_ERROR;
1720
 
1721
  if (gfc_match (" block") != MATCH_YES)
1722
    return MATCH_NO;
1723
 
1724
  /* For this to be a correct BLOCK statement, the line must end now.  */
1725
  m = gfc_match_eos ();
1726
  if (m == MATCH_ERROR)
1727
    return MATCH_ERROR;
1728
  if (m == MATCH_NO)
1729
    return MATCH_NO;
1730
 
1731
  return MATCH_YES;
1732
}
1733
 
1734
 
1735
/* Match a DO statement.  */
1736
 
1737
match
1738
gfc_match_do (void)
1739
{
1740
  gfc_iterator iter, *ip;
1741
  locus old_loc;
1742
  gfc_st_label *label;
1743
  match m;
1744
 
1745
  old_loc = gfc_current_locus;
1746
 
1747
  label = NULL;
1748
  iter.var = iter.start = iter.end = iter.step = NULL;
1749
 
1750
  m = gfc_match_label ();
1751
  if (m == MATCH_ERROR)
1752
    return m;
1753
 
1754
  if (gfc_match (" do") != MATCH_YES)
1755
    return MATCH_NO;
1756
 
1757
  m = gfc_match_st_label (&label);
1758
  if (m == MATCH_ERROR)
1759
    goto cleanup;
1760
 
1761
  /* Match an infinite DO, make it like a DO WHILE(.TRUE.).  */
1762
 
1763
  if (gfc_match_eos () == MATCH_YES)
1764
    {
1765
      iter.end = gfc_logical_expr (1, NULL);
1766
      new_st.op = EXEC_DO_WHILE;
1767
      goto done;
1768
    }
1769
 
1770
  /* Match an optional comma, if no comma is found, a space is obligatory.  */
1771
  if (gfc_match_char (',') != MATCH_YES && gfc_match ("% ") != MATCH_YES)
1772
    return MATCH_NO;
1773
 
1774
  /* Check for balanced parens.  */
1775
 
1776
  if (gfc_match_parens () == MATCH_ERROR)
1777
    return MATCH_ERROR;
1778
 
1779
  /* See if we have a DO WHILE.  */
1780
  if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES)
1781
    {
1782
      new_st.op = EXEC_DO_WHILE;
1783
      goto done;
1784
    }
1785
 
1786
  /* The abortive DO WHILE may have done something to the symbol
1787
     table, so we start over.  */
1788
  gfc_undo_symbols ();
1789
  gfc_current_locus = old_loc;
1790
 
1791
  gfc_match_label ();           /* This won't error.  */
1792
  gfc_match (" do ");           /* This will work.  */
1793
 
1794
  gfc_match_st_label (&label);  /* Can't error out.  */
1795
  gfc_match_char (',');         /* Optional comma.  */
1796
 
1797
  m = gfc_match_iterator (&iter, 0);
1798
  if (m == MATCH_NO)
1799
    return MATCH_NO;
1800
  if (m == MATCH_ERROR)
1801
    goto cleanup;
1802
 
1803
  iter.var->symtree->n.sym->attr.implied_index = 0;
1804
  gfc_check_do_variable (iter.var->symtree);
1805
 
1806
  if (gfc_match_eos () != MATCH_YES)
1807
    {
1808
      gfc_syntax_error (ST_DO);
1809
      goto cleanup;
1810
    }
1811
 
1812
  new_st.op = EXEC_DO;
1813
 
1814
done:
1815
  if (label != NULL
1816
      && gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1817
    goto cleanup;
1818
 
1819
  new_st.label1 = label;
1820
 
1821
  if (new_st.op == EXEC_DO_WHILE)
1822
    new_st.expr1 = iter.end;
1823
  else
1824
    {
1825
      new_st.ext.iterator = ip = gfc_get_iterator ();
1826
      *ip = iter;
1827
    }
1828
 
1829
  return MATCH_YES;
1830
 
1831
cleanup:
1832
  gfc_free_iterator (&iter, 0);
1833
 
1834
  return MATCH_ERROR;
1835
}
1836
 
1837
 
1838
/* Match an EXIT or CYCLE statement.  */
1839
 
1840
static match
1841
match_exit_cycle (gfc_statement st, gfc_exec_op op)
1842
{
1843
  gfc_state_data *p, *o;
1844
  gfc_symbol *sym;
1845
  match m;
1846
  int cnt;
1847
 
1848
  if (gfc_match_eos () == MATCH_YES)
1849
    sym = NULL;
1850
  else
1851
    {
1852
      m = gfc_match ("% %s%t", &sym);
1853
      if (m == MATCH_ERROR)
1854
        return MATCH_ERROR;
1855
      if (m == MATCH_NO)
1856
        {
1857
          gfc_syntax_error (st);
1858
          return MATCH_ERROR;
1859
        }
1860
 
1861
      if (sym->attr.flavor != FL_LABEL)
1862
        {
1863
          gfc_error ("Name '%s' in %s statement at %C is not a loop name",
1864
                     sym->name, gfc_ascii_statement (st));
1865
          return MATCH_ERROR;
1866
        }
1867
    }
1868
 
1869
  /* Find the loop specified by the label (or lack of a label).  */
1870
  for (o = NULL, p = gfc_state_stack; p; p = p->previous)
1871
    if (p->state == COMP_DO && (sym == NULL || sym == p->sym))
1872
      break;
1873
    else if (o == NULL && p->state == COMP_OMP_STRUCTURED_BLOCK)
1874
      o = p;
1875
 
1876
  if (p == NULL)
1877
    {
1878
      if (sym == NULL)
1879
        gfc_error ("%s statement at %C is not within a loop",
1880
                   gfc_ascii_statement (st));
1881
      else
1882
        gfc_error ("%s statement at %C is not within loop '%s'",
1883
                   gfc_ascii_statement (st), sym->name);
1884
 
1885
      return MATCH_ERROR;
1886
    }
1887
 
1888
  if (o != NULL)
1889
    {
1890
      gfc_error ("%s statement at %C leaving OpenMP structured block",
1891
                 gfc_ascii_statement (st));
1892
      return MATCH_ERROR;
1893
    }
1894
 
1895
  for (o = p, cnt = 0; o->state == COMP_DO && o->previous != NULL; cnt++)
1896
    o = o->previous;
1897
  if (cnt > 0
1898
      && o != NULL
1899
      && o->state == COMP_OMP_STRUCTURED_BLOCK
1900
      && (o->head->op == EXEC_OMP_DO
1901
          || o->head->op == EXEC_OMP_PARALLEL_DO))
1902
    {
1903
      int collapse = 1;
1904
      gcc_assert (o->head->next != NULL
1905
                  && (o->head->next->op == EXEC_DO
1906
                      || o->head->next->op == EXEC_DO_WHILE)
1907
                  && o->previous != NULL
1908
                  && o->previous->tail->op == o->head->op);
1909
      if (o->previous->tail->ext.omp_clauses != NULL
1910
          && o->previous->tail->ext.omp_clauses->collapse > 1)
1911
        collapse = o->previous->tail->ext.omp_clauses->collapse;
1912
      if (st == ST_EXIT && cnt <= collapse)
1913
        {
1914
          gfc_error ("EXIT statement at %C terminating !$OMP DO loop");
1915
          return MATCH_ERROR;
1916
        }
1917
      if (st == ST_CYCLE && cnt < collapse)
1918
        {
1919
          gfc_error ("CYCLE statement at %C to non-innermost collapsed !$OMP DO loop");
1920
          return MATCH_ERROR;
1921
        }
1922
    }
1923
 
1924
  /* Save the first statement in the loop - needed by the backend.  */
1925
  new_st.ext.whichloop = p->head;
1926
 
1927
  new_st.op = op;
1928
 
1929
  return MATCH_YES;
1930
}
1931
 
1932
 
1933
/* Match the EXIT statement.  */
1934
 
1935
match
1936
gfc_match_exit (void)
1937
{
1938
  return match_exit_cycle (ST_EXIT, EXEC_EXIT);
1939
}
1940
 
1941
 
1942
/* Match the CYCLE statement.  */
1943
 
1944
match
1945
gfc_match_cycle (void)
1946
{
1947
  return match_exit_cycle (ST_CYCLE, EXEC_CYCLE);
1948
}
1949
 
1950
 
1951
/* Match a number or character constant after a STOP or PAUSE statement.  */
1952
 
1953
static match
1954
gfc_match_stopcode (gfc_statement st)
1955
{
1956
  int stop_code;
1957
  gfc_expr *e;
1958
  match m;
1959
  int cnt;
1960
 
1961
  stop_code = -1;
1962
  e = NULL;
1963
 
1964
  if (gfc_match_eos () != MATCH_YES)
1965
    {
1966
      m = gfc_match_small_literal_int (&stop_code, &cnt);
1967
      if (m == MATCH_ERROR)
1968
        goto cleanup;
1969
 
1970
      if (m == MATCH_YES && cnt > 5)
1971
        {
1972
          gfc_error ("Too many digits in STOP code at %C");
1973
          goto cleanup;
1974
        }
1975
 
1976
      if (m == MATCH_NO)
1977
        {
1978
          /* Try a character constant.  */
1979
          m = gfc_match_expr (&e);
1980
          if (m == MATCH_ERROR)
1981
            goto cleanup;
1982
          if (m == MATCH_NO)
1983
            goto syntax;
1984
          if (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1985
            goto syntax;
1986
        }
1987
 
1988
      if (gfc_match_eos () != MATCH_YES)
1989
        goto syntax;
1990
    }
1991
 
1992
  if (gfc_pure (NULL))
1993
    {
1994
      gfc_error ("%s statement not allowed in PURE procedure at %C",
1995
                 gfc_ascii_statement (st));
1996
      goto cleanup;
1997
    }
1998
 
1999
  new_st.op = st == ST_STOP ? EXEC_STOP : EXEC_PAUSE;
2000
  new_st.expr1 = e;
2001
  new_st.ext.stop_code = stop_code;
2002
 
2003
  return MATCH_YES;
2004
 
2005
syntax:
2006
  gfc_syntax_error (st);
2007
 
2008
cleanup:
2009
 
2010
  gfc_free_expr (e);
2011
  return MATCH_ERROR;
2012
}
2013
 
2014
 
2015
/* Match the (deprecated) PAUSE statement.  */
2016
 
2017
match
2018
gfc_match_pause (void)
2019
{
2020
  match m;
2021
 
2022
  m = gfc_match_stopcode (ST_PAUSE);
2023
  if (m == MATCH_YES)
2024
    {
2025
      if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: PAUSE statement"
2026
          " at %C")
2027
          == FAILURE)
2028
        m = MATCH_ERROR;
2029
    }
2030
  return m;
2031
}
2032
 
2033
 
2034
/* Match the STOP statement.  */
2035
 
2036
match
2037
gfc_match_stop (void)
2038
{
2039
  return gfc_match_stopcode (ST_STOP);
2040
}
2041
 
2042
 
2043
/* Match a CONTINUE statement.  */
2044
 
2045
match
2046
gfc_match_continue (void)
2047
{
2048
  if (gfc_match_eos () != MATCH_YES)
2049
    {
2050
      gfc_syntax_error (ST_CONTINUE);
2051
      return MATCH_ERROR;
2052
    }
2053
 
2054
  new_st.op = EXEC_CONTINUE;
2055
  return MATCH_YES;
2056
}
2057
 
2058
 
2059
/* Match the (deprecated) ASSIGN statement.  */
2060
 
2061
match
2062
gfc_match_assign (void)
2063
{
2064
  gfc_expr *expr;
2065
  gfc_st_label *label;
2066
 
2067
  if (gfc_match (" %l", &label) == MATCH_YES)
2068
    {
2069
      if (gfc_reference_st_label (label, ST_LABEL_UNKNOWN) == FAILURE)
2070
        return MATCH_ERROR;
2071
      if (gfc_match (" to %v%t", &expr) == MATCH_YES)
2072
        {
2073
          if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: ASSIGN "
2074
                              "statement at %C")
2075
              == FAILURE)
2076
            return MATCH_ERROR;
2077
 
2078
          expr->symtree->n.sym->attr.assign = 1;
2079
 
2080
          new_st.op = EXEC_LABEL_ASSIGN;
2081
          new_st.label1 = label;
2082
          new_st.expr1 = expr;
2083
          return MATCH_YES;
2084
        }
2085
    }
2086
  return MATCH_NO;
2087
}
2088
 
2089
 
2090
/* Match the GO TO statement.  As a computed GOTO statement is
2091
   matched, it is transformed into an equivalent SELECT block.  No
2092
   tree is necessary, and the resulting jumps-to-jumps are
2093
   specifically optimized away by the back end.  */
2094
 
2095
match
2096
gfc_match_goto (void)
2097
{
2098
  gfc_code *head, *tail;
2099
  gfc_expr *expr;
2100
  gfc_case *cp;
2101
  gfc_st_label *label;
2102
  int i;
2103
  match m;
2104
 
2105
  if (gfc_match (" %l%t", &label) == MATCH_YES)
2106
    {
2107
      if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2108
        return MATCH_ERROR;
2109
 
2110
      new_st.op = EXEC_GOTO;
2111
      new_st.label1 = label;
2112
      return MATCH_YES;
2113
    }
2114
 
2115
  /* The assigned GO TO statement.  */
2116
 
2117
  if (gfc_match_variable (&expr, 0) == MATCH_YES)
2118
    {
2119
      if (gfc_notify_std (GFC_STD_F95_DEL, "Deleted feature: Assigned GOTO "
2120
                          "statement at %C")
2121
          == FAILURE)
2122
        return MATCH_ERROR;
2123
 
2124
      new_st.op = EXEC_GOTO;
2125
      new_st.expr1 = expr;
2126
 
2127
      if (gfc_match_eos () == MATCH_YES)
2128
        return MATCH_YES;
2129
 
2130
      /* Match label list.  */
2131
      gfc_match_char (',');
2132
      if (gfc_match_char ('(') != MATCH_YES)
2133
        {
2134
          gfc_syntax_error (ST_GOTO);
2135
          return MATCH_ERROR;
2136
        }
2137
      head = tail = NULL;
2138
 
2139
      do
2140
        {
2141
          m = gfc_match_st_label (&label);
2142
          if (m != MATCH_YES)
2143
            goto syntax;
2144
 
2145
          if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2146
            goto cleanup;
2147
 
2148
          if (head == NULL)
2149
            head = tail = gfc_get_code ();
2150
          else
2151
            {
2152
              tail->block = gfc_get_code ();
2153
              tail = tail->block;
2154
            }
2155
 
2156
          tail->label1 = label;
2157
          tail->op = EXEC_GOTO;
2158
        }
2159
      while (gfc_match_char (',') == MATCH_YES);
2160
 
2161
      if (gfc_match (")%t") != MATCH_YES)
2162
        goto syntax;
2163
 
2164
      if (head == NULL)
2165
        {
2166
           gfc_error ("Statement label list in GOTO at %C cannot be empty");
2167
           goto syntax;
2168
        }
2169
      new_st.block = head;
2170
 
2171
      return MATCH_YES;
2172
    }
2173
 
2174
  /* Last chance is a computed GO TO statement.  */
2175
  if (gfc_match_char ('(') != MATCH_YES)
2176
    {
2177
      gfc_syntax_error (ST_GOTO);
2178
      return MATCH_ERROR;
2179
    }
2180
 
2181
  head = tail = NULL;
2182
  i = 1;
2183
 
2184
  do
2185
    {
2186
      m = gfc_match_st_label (&label);
2187
      if (m != MATCH_YES)
2188
        goto syntax;
2189
 
2190
      if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
2191
        goto cleanup;
2192
 
2193
      if (head == NULL)
2194
        head = tail = gfc_get_code ();
2195
      else
2196
        {
2197
          tail->block = gfc_get_code ();
2198
          tail = tail->block;
2199
        }
2200
 
2201
      cp = gfc_get_case ();
2202
      cp->low = cp->high = gfc_int_expr (i++);
2203
 
2204
      tail->op = EXEC_SELECT;
2205
      tail->ext.case_list = cp;
2206
 
2207
      tail->next = gfc_get_code ();
2208
      tail->next->op = EXEC_GOTO;
2209
      tail->next->label1 = label;
2210
    }
2211
  while (gfc_match_char (',') == MATCH_YES);
2212
 
2213
  if (gfc_match_char (')') != MATCH_YES)
2214
    goto syntax;
2215
 
2216
  if (head == NULL)
2217
    {
2218
      gfc_error ("Statement label list in GOTO at %C cannot be empty");
2219
      goto syntax;
2220
    }
2221
 
2222
  /* Get the rest of the statement.  */
2223
  gfc_match_char (',');
2224
 
2225
  if (gfc_match (" %e%t", &expr) != MATCH_YES)
2226
    goto syntax;
2227
 
2228
  if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Computed GOTO "
2229
                      "at %C") == FAILURE)
2230
    return MATCH_ERROR;
2231
 
2232
  /* At this point, a computed GOTO has been fully matched and an
2233
     equivalent SELECT statement constructed.  */
2234
 
2235
  new_st.op = EXEC_SELECT;
2236
  new_st.expr1 = NULL;
2237
 
2238
  /* Hack: For a "real" SELECT, the expression is in expr. We put
2239
     it in expr2 so we can distinguish then and produce the correct
2240
     diagnostics.  */
2241
  new_st.expr2 = expr;
2242
  new_st.block = head;
2243
  return MATCH_YES;
2244
 
2245
syntax:
2246
  gfc_syntax_error (ST_GOTO);
2247
cleanup:
2248
  gfc_free_statements (head);
2249
  return MATCH_ERROR;
2250
}
2251
 
2252
 
2253
/* Frees a list of gfc_alloc structures.  */
2254
 
2255
void
2256
gfc_free_alloc_list (gfc_alloc *p)
2257
{
2258
  gfc_alloc *q;
2259
 
2260
  for (; p; p = q)
2261
    {
2262
      q = p->next;
2263
      gfc_free_expr (p->expr);
2264
      gfc_free (p);
2265
    }
2266
}
2267
 
2268
 
2269
/* Match a Fortran 2003 derived-type-spec (F03:R455), which is just the name of
2270
   an accessible derived type.  */
2271
 
2272
static match
2273
match_derived_type_spec (gfc_typespec *ts)
2274
{
2275
  locus old_locus;
2276
  gfc_symbol *derived;
2277
 
2278
  old_locus = gfc_current_locus;
2279
 
2280
  if (gfc_match_symbol (&derived, 1) == MATCH_YES)
2281
    {
2282
      if (derived->attr.flavor == FL_DERIVED)
2283
        {
2284
          ts->type = BT_DERIVED;
2285
          ts->u.derived = derived;
2286
          return MATCH_YES;
2287
        }
2288
      else
2289
        {
2290
          /* Enforce F03:C476.  */
2291
          gfc_error ("'%s' at %L is not an accessible derived type",
2292
                     derived->name, &gfc_current_locus);
2293
          return MATCH_ERROR;
2294
        }
2295
    }
2296
 
2297
  gfc_current_locus = old_locus;
2298
  return MATCH_NO;
2299
}
2300
 
2301
 
2302
/* Match a Fortran 2003 type-spec (F03:R401).  This is similar to
2303
   gfc_match_decl_type_spec() from decl.c, with the following exceptions:
2304
   It only includes the intrinsic types from the Fortran 2003 standard
2305
   (thus, neither BYTE nor forms like REAL*4 are allowed). Additionally,
2306 378 julius
   the implicit_flag is not needed, so it was removed. Derived types are
2307 285 jeremybenn
   identified by their name alone.  */
2308
 
2309
static match
2310
match_type_spec (gfc_typespec *ts)
2311
{
2312
  match m;
2313
  locus old_locus;
2314
 
2315
  gfc_clear_ts (ts);
2316 378 julius
  gfc_gobble_whitespace();
2317 285 jeremybenn
  old_locus = gfc_current_locus;
2318
 
2319 378 julius
  m = match_derived_type_spec (ts);
2320
  if (m == MATCH_YES)
2321
    {
2322
      old_locus = gfc_current_locus;
2323
      if (gfc_match (" :: ") != MATCH_YES)
2324
        return MATCH_ERROR;
2325
      gfc_current_locus = old_locus;
2326
      /* Enfore F03:C401.  */
2327
      if (ts->u.derived->attr.abstract)
2328
        {
2329
          gfc_error ("Derived type '%s' at %L may not be ABSTRACT",
2330
                     ts->u.derived->name, &old_locus);
2331
          return MATCH_ERROR;
2332
        }
2333
      return MATCH_YES;
2334
    }
2335
  else if (m == MATCH_ERROR && gfc_match (" :: ") == MATCH_YES)
2336
    return MATCH_ERROR;
2337
 
2338
  gfc_current_locus = old_locus;
2339
 
2340 285 jeremybenn
  if (gfc_match ("integer") == MATCH_YES)
2341
    {
2342
      ts->type = BT_INTEGER;
2343
      ts->kind = gfc_default_integer_kind;
2344
      goto kind_selector;
2345
    }
2346
 
2347
  if (gfc_match ("real") == MATCH_YES)
2348
    {
2349
      ts->type = BT_REAL;
2350
      ts->kind = gfc_default_real_kind;
2351
      goto kind_selector;
2352
    }
2353
 
2354
  if (gfc_match ("double precision") == MATCH_YES)
2355
    {
2356
      ts->type = BT_REAL;
2357
      ts->kind = gfc_default_double_kind;
2358
      return MATCH_YES;
2359
    }
2360
 
2361
  if (gfc_match ("complex") == MATCH_YES)
2362
    {
2363
      ts->type = BT_COMPLEX;
2364
      ts->kind = gfc_default_complex_kind;
2365
      goto kind_selector;
2366
    }
2367
 
2368
  if (gfc_match ("character") == MATCH_YES)
2369
    {
2370
      ts->type = BT_CHARACTER;
2371
      goto char_selector;
2372
    }
2373
 
2374
  if (gfc_match ("logical") == MATCH_YES)
2375
    {
2376
      ts->type = BT_LOGICAL;
2377
      ts->kind = gfc_default_logical_kind;
2378
      goto kind_selector;
2379
    }
2380
 
2381
  /* If a type is not matched, simply return MATCH_NO.  */
2382
  gfc_current_locus = old_locus;
2383
  return MATCH_NO;
2384
 
2385
kind_selector:
2386
 
2387
  gfc_gobble_whitespace ();
2388
  if (gfc_peek_ascii_char () == '*')
2389
    {
2390
      gfc_error ("Invalid type-spec at %C");
2391
      return MATCH_ERROR;
2392
    }
2393
 
2394
  m = gfc_match_kind_spec (ts, false);
2395
 
2396
  if (m == MATCH_NO)
2397
    m = MATCH_YES;              /* No kind specifier found.  */
2398
 
2399
  return m;
2400
 
2401
char_selector:
2402
 
2403
  m = gfc_match_char_spec (ts);
2404
 
2405
  if (m == MATCH_NO)
2406
    m = MATCH_YES;              /* No kind specifier found.  */
2407
 
2408
  return m;
2409
}
2410
 
2411
 
2412
/* Match an ALLOCATE statement.  */
2413
 
2414
match
2415
gfc_match_allocate (void)
2416
{
2417
  gfc_alloc *head, *tail;
2418
  gfc_expr *stat, *errmsg, *tmp, *source;
2419
  gfc_typespec ts;
2420
  gfc_symbol *sym;
2421
  match m;
2422
  locus old_locus;
2423
  bool saw_stat, saw_errmsg, saw_source, b1, b2, b3;
2424
 
2425
  head = tail = NULL;
2426
  stat = errmsg = source = tmp = NULL;
2427
  saw_stat = saw_errmsg = saw_source = false;
2428
 
2429
  if (gfc_match_char ('(') != MATCH_YES)
2430
    goto syntax;
2431
 
2432
  /* Match an optional type-spec.  */
2433
  old_locus = gfc_current_locus;
2434
  m = match_type_spec (&ts);
2435
  if (m == MATCH_ERROR)
2436
    goto cleanup;
2437
  else if (m == MATCH_NO)
2438
    ts.type = BT_UNKNOWN;
2439
  else
2440
    {
2441
      if (gfc_match (" :: ") == MATCH_YES)
2442
        {
2443
          if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: typespec in "
2444
                              "ALLOCATE at %L", &old_locus) == FAILURE)
2445
            goto cleanup;
2446
        }
2447
      else
2448
        {
2449
          ts.type = BT_UNKNOWN;
2450
          gfc_current_locus = old_locus;
2451
        }
2452
    }
2453
 
2454
  for (;;)
2455
    {
2456
      if (head == NULL)
2457
        head = tail = gfc_get_alloc ();
2458
      else
2459
        {
2460
          tail->next = gfc_get_alloc ();
2461
          tail = tail->next;
2462
        }
2463
 
2464
      m = gfc_match_variable (&tail->expr, 0);
2465
      if (m == MATCH_NO)
2466
        goto syntax;
2467
      if (m == MATCH_ERROR)
2468
        goto cleanup;
2469
 
2470
      if (gfc_check_do_variable (tail->expr->symtree))
2471
        goto cleanup;
2472
 
2473
      if (gfc_pure (NULL) && gfc_impure_variable (tail->expr->symtree->n.sym))
2474
        {
2475
          gfc_error ("Bad allocate-object at %C for a PURE procedure");
2476
          goto cleanup;
2477
        }
2478
 
2479
      /* The ALLOCATE statement had an optional typespec.  Check the
2480
         constraints.  */
2481
      if (ts.type != BT_UNKNOWN)
2482
        {
2483
          /* Enforce F03:C624.  */
2484
          if (!gfc_type_compatible (&tail->expr->ts, &ts))
2485
            {
2486
              gfc_error ("Type of entity at %L is type incompatible with "
2487
                         "typespec", &tail->expr->where);
2488
              goto cleanup;
2489
            }
2490
 
2491
          /* Enforce F03:C627.  */
2492
          if (ts.kind != tail->expr->ts.kind)
2493
            {
2494
              gfc_error ("Kind type parameter for entity at %L differs from "
2495
                         "the kind type parameter of the typespec",
2496
                         &tail->expr->where);
2497
              goto cleanup;
2498
            }
2499
        }
2500
 
2501
      if (tail->expr->ts.type == BT_DERIVED)
2502
        tail->expr->ts.u.derived = gfc_use_derived (tail->expr->ts.u.derived);
2503
 
2504
      /* FIXME: disable the checking on derived types and arrays.  */
2505
      sym = tail->expr->symtree->n.sym;
2506
      b1 = !(tail->expr->ref
2507
           && (tail->expr->ref->type == REF_COMPONENT
2508
                || tail->expr->ref->type == REF_ARRAY));
2509
      if (sym && sym->ts.type == BT_CLASS)
2510
        b2 = !(sym->ts.u.derived->components->attr.allocatable
2511
               || sym->ts.u.derived->components->attr.pointer);
2512
      else
2513
        b2 = sym && !(sym->attr.allocatable || sym->attr.pointer
2514
                      || sym->attr.proc_pointer);
2515
      b3 = sym && sym->ns && sym->ns->proc_name
2516
           && (sym->ns->proc_name->attr.allocatable
2517
                || sym->ns->proc_name->attr.pointer
2518
                || sym->ns->proc_name->attr.proc_pointer);
2519
      if (b1 && b2 && !b3)
2520
        {
2521
          gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
2522
                     "or an allocatable variable");
2523
          goto cleanup;
2524
        }
2525
 
2526
      if (gfc_peek_ascii_char () == '(' && !sym->attr.dimension)
2527
        {
2528
          gfc_error ("Shape specification for allocatable scalar at %C");
2529
          goto cleanup;
2530
        }
2531
 
2532
      if (gfc_match_char (',') != MATCH_YES)
2533
        break;
2534
 
2535
alloc_opt_list:
2536
 
2537
      m = gfc_match (" stat = %v", &tmp);
2538
      if (m == MATCH_ERROR)
2539
        goto cleanup;
2540
      if (m == MATCH_YES)
2541
        {
2542
          /* Enforce C630.  */
2543
          if (saw_stat)
2544
            {
2545
              gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2546
              goto cleanup;
2547
            }
2548
 
2549
          stat = tmp;
2550
          saw_stat = true;
2551
 
2552
          if (gfc_check_do_variable (stat->symtree))
2553
            goto cleanup;
2554
 
2555
          if (gfc_match_char (',') == MATCH_YES)
2556
            goto alloc_opt_list;
2557
        }
2558
 
2559
      m = gfc_match (" errmsg = %v", &tmp);
2560
      if (m == MATCH_ERROR)
2561
        goto cleanup;
2562
      if (m == MATCH_YES)
2563
        {
2564
          if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG tag at %L",
2565
                              &tmp->where) == FAILURE)
2566
            goto cleanup;
2567
 
2568
          /* Enforce C630.  */
2569
          if (saw_errmsg)
2570
            {
2571
              gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
2572
              goto cleanup;
2573
            }
2574
 
2575
          errmsg = tmp;
2576
          saw_errmsg = true;
2577
 
2578
          if (gfc_match_char (',') == MATCH_YES)
2579
            goto alloc_opt_list;
2580
        }
2581
 
2582
      m = gfc_match (" source = %e", &tmp);
2583
      if (m == MATCH_ERROR)
2584
        goto cleanup;
2585
      if (m == MATCH_YES)
2586
        {
2587
          if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: SOURCE tag at %L",
2588
                              &tmp->where) == FAILURE)
2589
            goto cleanup;
2590
 
2591
          /* Enforce C630.  */
2592
          if (saw_source)
2593
            {
2594
              gfc_error ("Redundant SOURCE tag found at %L ", &tmp->where);
2595
              goto cleanup;
2596
            }
2597
 
2598
          /* The next 2 conditionals check C631.  */
2599
          if (ts.type != BT_UNKNOWN)
2600
            {
2601
              gfc_error ("SOURCE tag at %L conflicts with the typespec at %L",
2602
                         &tmp->where, &old_locus);
2603
              goto cleanup;
2604
            }
2605
 
2606
          if (head->next)
2607
            {
2608
              gfc_error ("SOURCE tag at %L requires only a single entity in "
2609
                         "the allocation-list", &tmp->where);
2610
              goto cleanup;
2611
            }
2612
 
2613
          source = tmp;
2614
          saw_source = true;
2615
 
2616
          if (gfc_match_char (',') == MATCH_YES)
2617
            goto alloc_opt_list;
2618
        }
2619
 
2620
        gfc_gobble_whitespace ();
2621
 
2622
        if (gfc_peek_char () == ')')
2623
          break;
2624
    }
2625
 
2626
 
2627
  if (gfc_match (" )%t") != MATCH_YES)
2628
    goto syntax;
2629
 
2630
  new_st.op = EXEC_ALLOCATE;
2631
  new_st.expr1 = stat;
2632
  new_st.expr2 = errmsg;
2633
  new_st.expr3 = source;
2634
  new_st.ext.alloc.list = head;
2635
  new_st.ext.alloc.ts = ts;
2636
 
2637
  return MATCH_YES;
2638
 
2639
syntax:
2640
  gfc_syntax_error (ST_ALLOCATE);
2641
 
2642
cleanup:
2643
  gfc_free_expr (errmsg);
2644
  gfc_free_expr (source);
2645
  gfc_free_expr (stat);
2646
  gfc_free_expr (tmp);
2647
  gfc_free_alloc_list (head);
2648
  return MATCH_ERROR;
2649
}
2650
 
2651
 
2652
/* Match a NULLIFY statement. A NULLIFY statement is transformed into
2653
   a set of pointer assignments to intrinsic NULL().  */
2654
 
2655
match
2656
gfc_match_nullify (void)
2657
{
2658
  gfc_code *tail;
2659
  gfc_expr *e, *p;
2660
  match m;
2661
 
2662
  tail = NULL;
2663
 
2664
  if (gfc_match_char ('(') != MATCH_YES)
2665
    goto syntax;
2666
 
2667
  for (;;)
2668
    {
2669
      m = gfc_match_variable (&p, 0);
2670
      if (m == MATCH_ERROR)
2671
        goto cleanup;
2672
      if (m == MATCH_NO)
2673
        goto syntax;
2674
 
2675
      if (gfc_check_do_variable (p->symtree))
2676
        goto cleanup;
2677
 
2678
      if (gfc_pure (NULL) && gfc_impure_variable (p->symtree->n.sym))
2679
        {
2680
          gfc_error ("Illegal variable in NULLIFY at %C for a PURE procedure");
2681
          goto cleanup;
2682
        }
2683
 
2684
      /* build ' => NULL() '.  */
2685
      e = gfc_get_expr ();
2686
      e->where = gfc_current_locus;
2687
      e->expr_type = EXPR_NULL;
2688
      e->ts.type = BT_UNKNOWN;
2689
 
2690
      /* Chain to list.  */
2691
      if (tail == NULL)
2692
        tail = &new_st;
2693
      else
2694
        {
2695
          tail->next = gfc_get_code ();
2696
          tail = tail->next;
2697
        }
2698
 
2699
      tail->op = EXEC_POINTER_ASSIGN;
2700
      tail->expr1 = p;
2701
      tail->expr2 = e;
2702
 
2703
      if (gfc_match (" )%t") == MATCH_YES)
2704
        break;
2705
      if (gfc_match_char (',') != MATCH_YES)
2706
        goto syntax;
2707
    }
2708
 
2709
  return MATCH_YES;
2710
 
2711
syntax:
2712
  gfc_syntax_error (ST_NULLIFY);
2713
 
2714
cleanup:
2715
  gfc_free_statements (new_st.next);
2716
  new_st.next = NULL;
2717
  gfc_free_expr (new_st.expr1);
2718
  new_st.expr1 = NULL;
2719
  gfc_free_expr (new_st.expr2);
2720
  new_st.expr2 = NULL;
2721
  return MATCH_ERROR;
2722
}
2723
 
2724
 
2725
/* Match a DEALLOCATE statement.  */
2726
 
2727
match
2728
gfc_match_deallocate (void)
2729
{
2730
  gfc_alloc *head, *tail;
2731
  gfc_expr *stat, *errmsg, *tmp;
2732
  gfc_symbol *sym;
2733
  match m;
2734
  bool saw_stat, saw_errmsg, b1, b2;
2735
 
2736
  head = tail = NULL;
2737
  stat = errmsg = tmp = NULL;
2738
  saw_stat = saw_errmsg = false;
2739
 
2740
  if (gfc_match_char ('(') != MATCH_YES)
2741
    goto syntax;
2742
 
2743
  for (;;)
2744
    {
2745
      if (head == NULL)
2746
        head = tail = gfc_get_alloc ();
2747
      else
2748
        {
2749
          tail->next = gfc_get_alloc ();
2750
          tail = tail->next;
2751
        }
2752
 
2753
      m = gfc_match_variable (&tail->expr, 0);
2754
      if (m == MATCH_ERROR)
2755
        goto cleanup;
2756
      if (m == MATCH_NO)
2757
        goto syntax;
2758
 
2759
      if (gfc_check_do_variable (tail->expr->symtree))
2760
        goto cleanup;
2761
 
2762
      sym = tail->expr->symtree->n.sym;
2763
 
2764
      if (gfc_pure (NULL) && gfc_impure_variable (sym))
2765
        {
2766
          gfc_error ("Illegal allocate-object at %C for a PURE procedure");
2767
          goto cleanup;
2768
        }
2769
 
2770
      /* FIXME: disable the checking on derived types.  */
2771
      b1 = !(tail->expr->ref
2772
           && (tail->expr->ref->type == REF_COMPONENT
2773
               || tail->expr->ref->type == REF_ARRAY));
2774
      if (sym && sym->ts.type == BT_CLASS)
2775
        b2 = !(sym->ts.u.derived->components->attr.allocatable
2776
               || sym->ts.u.derived->components->attr.pointer);
2777
      else
2778
        b2 = sym && !(sym->attr.allocatable || sym->attr.pointer
2779
                      || sym->attr.proc_pointer);
2780
      if (b1 && b2)
2781
        {
2782
          gfc_error ("Allocate-object at %C is not a nonprocedure pointer "
2783
                     "or an allocatable variable");
2784
          goto cleanup;
2785
        }
2786
 
2787
      if (gfc_match_char (',') != MATCH_YES)
2788
        break;
2789
 
2790
dealloc_opt_list:
2791
 
2792
      m = gfc_match (" stat = %v", &tmp);
2793
      if (m == MATCH_ERROR)
2794
        goto cleanup;
2795
      if (m == MATCH_YES)
2796
        {
2797
          if (saw_stat)
2798
            {
2799
              gfc_error ("Redundant STAT tag found at %L ", &tmp->where);
2800
              gfc_free_expr (tmp);
2801
              goto cleanup;
2802
            }
2803
 
2804
          stat = tmp;
2805
          saw_stat = true;
2806
 
2807
          if (gfc_check_do_variable (stat->symtree))
2808
            goto cleanup;
2809
 
2810
          if (gfc_match_char (',') == MATCH_YES)
2811
            goto dealloc_opt_list;
2812
        }
2813
 
2814
      m = gfc_match (" errmsg = %v", &tmp);
2815
      if (m == MATCH_ERROR)
2816
        goto cleanup;
2817
      if (m == MATCH_YES)
2818
        {
2819
          if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ERRMSG at %L",
2820
                              &tmp->where) == FAILURE)
2821
            goto cleanup;
2822
 
2823
          if (saw_errmsg)
2824
            {
2825
              gfc_error ("Redundant ERRMSG tag found at %L ", &tmp->where);
2826
              gfc_free_expr (tmp);
2827
              goto cleanup;
2828
            }
2829
 
2830
          errmsg = tmp;
2831
          saw_errmsg = true;
2832
 
2833
          if (gfc_match_char (',') == MATCH_YES)
2834
            goto dealloc_opt_list;
2835
        }
2836
 
2837
        gfc_gobble_whitespace ();
2838
 
2839
        if (gfc_peek_char () == ')')
2840
          break;
2841
    }
2842
 
2843
  if (gfc_match (" )%t") != MATCH_YES)
2844
    goto syntax;
2845
 
2846
  new_st.op = EXEC_DEALLOCATE;
2847
  new_st.expr1 = stat;
2848
  new_st.expr2 = errmsg;
2849
  new_st.ext.alloc.list = head;
2850
 
2851
  return MATCH_YES;
2852
 
2853
syntax:
2854
  gfc_syntax_error (ST_DEALLOCATE);
2855
 
2856
cleanup:
2857
  gfc_free_expr (errmsg);
2858
  gfc_free_expr (stat);
2859
  gfc_free_alloc_list (head);
2860
  return MATCH_ERROR;
2861
}
2862
 
2863
 
2864
/* Match a RETURN statement.  */
2865
 
2866
match
2867
gfc_match_return (void)
2868
{
2869
  gfc_expr *e;
2870
  match m;
2871
  gfc_compile_state s;
2872
 
2873
  e = NULL;
2874
  if (gfc_match_eos () == MATCH_YES)
2875
    goto done;
2876
 
2877
  if (gfc_find_state (COMP_SUBROUTINE) == FAILURE)
2878
    {
2879
      gfc_error ("Alternate RETURN statement at %C is only allowed within "
2880
                 "a SUBROUTINE");
2881
      goto cleanup;
2882
    }
2883
 
2884
  if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: Alternate RETURN "
2885
                      "at %C") == FAILURE)
2886
    return MATCH_ERROR;
2887
 
2888
  if (gfc_current_form == FORM_FREE)
2889
    {
2890
      /* The following are valid, so we can't require a blank after the
2891
        RETURN keyword:
2892
          return+1
2893
          return(1)  */
2894
      char c = gfc_peek_ascii_char ();
2895
      if (ISALPHA (c) || ISDIGIT (c))
2896
        return MATCH_NO;
2897
    }
2898
 
2899
  m = gfc_match (" %e%t", &e);
2900
  if (m == MATCH_YES)
2901
    goto done;
2902
  if (m == MATCH_ERROR)
2903
    goto cleanup;
2904
 
2905
  gfc_syntax_error (ST_RETURN);
2906
 
2907
cleanup:
2908
  gfc_free_expr (e);
2909
  return MATCH_ERROR;
2910
 
2911
done:
2912
  gfc_enclosing_unit (&s);
2913
  if (s == COMP_PROGRAM
2914
      && gfc_notify_std (GFC_STD_GNU, "Extension: RETURN statement in "
2915
                        "main program at %C") == FAILURE)
2916
      return MATCH_ERROR;
2917
 
2918
  new_st.op = EXEC_RETURN;
2919
  new_st.expr1 = e;
2920
 
2921
  return MATCH_YES;
2922
}
2923
 
2924
 
2925
/* Match the call of a type-bound procedure, if CALL%var has already been
2926
   matched and var found to be a derived-type variable.  */
2927
 
2928
static match
2929
match_typebound_call (gfc_symtree* varst)
2930
{
2931
  gfc_expr* base;
2932
  match m;
2933
 
2934
  base = gfc_get_expr ();
2935
  base->expr_type = EXPR_VARIABLE;
2936
  base->symtree = varst;
2937
  base->where = gfc_current_locus;
2938
  gfc_set_sym_referenced (varst->n.sym);
2939
 
2940
  m = gfc_match_varspec (base, 0, true, true);
2941
  if (m == MATCH_NO)
2942
    gfc_error ("Expected component reference at %C");
2943
  if (m != MATCH_YES)
2944
    return MATCH_ERROR;
2945
 
2946
  if (gfc_match_eos () != MATCH_YES)
2947
    {
2948
      gfc_error ("Junk after CALL at %C");
2949
      return MATCH_ERROR;
2950
    }
2951
 
2952
  if (base->expr_type == EXPR_COMPCALL)
2953
    new_st.op = EXEC_COMPCALL;
2954
  else if (base->expr_type == EXPR_PPC)
2955
    new_st.op = EXEC_CALL_PPC;
2956
  else
2957
    {
2958
      gfc_error ("Expected type-bound procedure or procedure pointer component "
2959
                 "at %C");
2960
      return MATCH_ERROR;
2961
    }
2962
  new_st.expr1 = base;
2963
 
2964
  return MATCH_YES;
2965
}
2966
 
2967
 
2968
/* Match a CALL statement.  The tricky part here are possible
2969
   alternate return specifiers.  We handle these by having all
2970
   "subroutines" actually return an integer via a register that gives
2971
   the return number.  If the call specifies alternate returns, we
2972
   generate code for a SELECT statement whose case clauses contain
2973
   GOTOs to the various labels.  */
2974
 
2975
match
2976
gfc_match_call (void)
2977
{
2978
  char name[GFC_MAX_SYMBOL_LEN + 1];
2979
  gfc_actual_arglist *a, *arglist;
2980
  gfc_case *new_case;
2981
  gfc_symbol *sym;
2982
  gfc_symtree *st;
2983
  gfc_code *c;
2984
  match m;
2985
  int i;
2986
 
2987
  arglist = NULL;
2988
 
2989
  m = gfc_match ("% %n", name);
2990
  if (m == MATCH_NO)
2991
    goto syntax;
2992
  if (m != MATCH_YES)
2993
    return m;
2994
 
2995
  if (gfc_get_ha_sym_tree (name, &st))
2996
    return MATCH_ERROR;
2997
 
2998
  sym = st->n.sym;
2999
 
3000
  /* If this is a variable of derived-type, it probably starts a type-bound
3001
     procedure call.  */
3002
  if ((sym->attr.flavor != FL_PROCEDURE
3003
       || gfc_is_function_return_value (sym, gfc_current_ns))
3004
      && (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS))
3005
    return match_typebound_call (st);
3006
 
3007
  /* If it does not seem to be callable (include functions so that the
3008
     right association is made.  They are thrown out in resolution.)
3009
     ...  */
3010
  if (!sym->attr.generic
3011
        && !sym->attr.subroutine
3012
        && !sym->attr.function)
3013
    {
3014
      if (!(sym->attr.external && !sym->attr.referenced))
3015
        {
3016
          /* ...create a symbol in this scope...  */
3017
          if (sym->ns != gfc_current_ns
3018
                && gfc_get_sym_tree (name, NULL, &st, false) == 1)
3019
            return MATCH_ERROR;
3020
 
3021
          if (sym != st->n.sym)
3022
            sym = st->n.sym;
3023
        }
3024
 
3025
      /* ...and then to try to make the symbol into a subroutine.  */
3026
      if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
3027
        return MATCH_ERROR;
3028
    }
3029
 
3030
  gfc_set_sym_referenced (sym);
3031
 
3032
  if (gfc_match_eos () != MATCH_YES)
3033
    {
3034
      m = gfc_match_actual_arglist (1, &arglist);
3035
      if (m == MATCH_NO)
3036
        goto syntax;
3037
      if (m == MATCH_ERROR)
3038
        goto cleanup;
3039
 
3040
      if (gfc_match_eos () != MATCH_YES)
3041
        goto syntax;
3042
    }
3043
 
3044
  /* If any alternate return labels were found, construct a SELECT
3045
     statement that will jump to the right place.  */
3046
 
3047
  i = 0;
3048
  for (a = arglist; a; a = a->next)
3049
    if (a->expr == NULL)
3050
      i = 1;
3051
 
3052
  if (i)
3053
    {
3054
      gfc_symtree *select_st;
3055
      gfc_symbol *select_sym;
3056
      char name[GFC_MAX_SYMBOL_LEN + 1];
3057
 
3058
      new_st.next = c = gfc_get_code ();
3059
      c->op = EXEC_SELECT;
3060
      sprintf (name, "_result_%s", sym->name);
3061
      gfc_get_ha_sym_tree (name, &select_st);   /* Can't fail.  */
3062
 
3063
      select_sym = select_st->n.sym;
3064
      select_sym->ts.type = BT_INTEGER;
3065
      select_sym->ts.kind = gfc_default_integer_kind;
3066
      gfc_set_sym_referenced (select_sym);
3067
      c->expr1 = gfc_get_expr ();
3068
      c->expr1->expr_type = EXPR_VARIABLE;
3069
      c->expr1->symtree = select_st;
3070
      c->expr1->ts = select_sym->ts;
3071
      c->expr1->where = gfc_current_locus;
3072
 
3073
      i = 0;
3074
      for (a = arglist; a; a = a->next)
3075
        {
3076
          if (a->expr != NULL)
3077
            continue;
3078
 
3079
          if (gfc_reference_st_label (a->label, ST_LABEL_TARGET) == FAILURE)
3080
            continue;
3081
 
3082
          i++;
3083
 
3084
          c->block = gfc_get_code ();
3085
          c = c->block;
3086
          c->op = EXEC_SELECT;
3087
 
3088
          new_case = gfc_get_case ();
3089
          new_case->high = new_case->low = gfc_int_expr (i);
3090
          c->ext.case_list = new_case;
3091
 
3092
          c->next = gfc_get_code ();
3093
          c->next->op = EXEC_GOTO;
3094
          c->next->label1 = a->label;
3095
        }
3096
    }
3097
 
3098
  new_st.op = EXEC_CALL;
3099
  new_st.symtree = st;
3100
  new_st.ext.actual = arglist;
3101
 
3102
  return MATCH_YES;
3103
 
3104
syntax:
3105
  gfc_syntax_error (ST_CALL);
3106
 
3107
cleanup:
3108
  gfc_free_actual_arglist (arglist);
3109
  return MATCH_ERROR;
3110
}
3111
 
3112
 
3113
/* Given a name, return a pointer to the common head structure,
3114
   creating it if it does not exist. If FROM_MODULE is nonzero, we
3115
   mangle the name so that it doesn't interfere with commons defined
3116
   in the using namespace.
3117
   TODO: Add to global symbol tree.  */
3118
 
3119
gfc_common_head *
3120
gfc_get_common (const char *name, int from_module)
3121
{
3122
  gfc_symtree *st;
3123
  static int serial = 0;
3124
  char mangled_name[GFC_MAX_SYMBOL_LEN + 1];
3125
 
3126
  if (from_module)
3127
    {
3128
      /* A use associated common block is only needed to correctly layout
3129
         the variables it contains.  */
3130
      snprintf (mangled_name, GFC_MAX_SYMBOL_LEN, "_%d_%s", serial++, name);
3131
      st = gfc_new_symtree (&gfc_current_ns->common_root, mangled_name);
3132
    }
3133
  else
3134
    {
3135
      st = gfc_find_symtree (gfc_current_ns->common_root, name);
3136
 
3137
      if (st == NULL)
3138
        st = gfc_new_symtree (&gfc_current_ns->common_root, name);
3139
    }
3140
 
3141
  if (st->n.common == NULL)
3142
    {
3143
      st->n.common = gfc_get_common_head ();
3144
      st->n.common->where = gfc_current_locus;
3145
      strcpy (st->n.common->name, name);
3146
    }
3147
 
3148
  return st->n.common;
3149
}
3150
 
3151
 
3152
/* Match a common block name.  */
3153
 
3154
match match_common_name (char *name)
3155
{
3156
  match m;
3157
 
3158
  if (gfc_match_char ('/') == MATCH_NO)
3159
    {
3160
      name[0] = '\0';
3161
      return MATCH_YES;
3162
    }
3163
 
3164
  if (gfc_match_char ('/') == MATCH_YES)
3165
    {
3166
      name[0] = '\0';
3167
      return MATCH_YES;
3168
    }
3169
 
3170
  m = gfc_match_name (name);
3171
 
3172
  if (m == MATCH_ERROR)
3173
    return MATCH_ERROR;
3174
  if (m == MATCH_YES && gfc_match_char ('/') == MATCH_YES)
3175
    return MATCH_YES;
3176
 
3177
  gfc_error ("Syntax error in common block name at %C");
3178
  return MATCH_ERROR;
3179
}
3180
 
3181
 
3182
/* Match a COMMON statement.  */
3183
 
3184
match
3185
gfc_match_common (void)
3186
{
3187
  gfc_symbol *sym, **head, *tail, *other, *old_blank_common;
3188
  char name[GFC_MAX_SYMBOL_LEN + 1];
3189
  gfc_common_head *t;
3190
  gfc_array_spec *as;
3191
  gfc_equiv *e1, *e2;
3192
  match m;
3193
  gfc_gsymbol *gsym;
3194
 
3195
  old_blank_common = gfc_current_ns->blank_common.head;
3196
  if (old_blank_common)
3197
    {
3198
      while (old_blank_common->common_next)
3199
        old_blank_common = old_blank_common->common_next;
3200
    }
3201
 
3202
  as = NULL;
3203
 
3204
  for (;;)
3205
    {
3206
      m = match_common_name (name);
3207
      if (m == MATCH_ERROR)
3208
        goto cleanup;
3209
 
3210
      gsym = gfc_get_gsymbol (name);
3211
      if (gsym->type != GSYM_UNKNOWN && gsym->type != GSYM_COMMON)
3212
        {
3213
          gfc_error ("Symbol '%s' at %C is already an external symbol that "
3214
                     "is not COMMON", name);
3215
          goto cleanup;
3216
        }
3217
 
3218
      if (gsym->type == GSYM_UNKNOWN)
3219
        {
3220
          gsym->type = GSYM_COMMON;
3221
          gsym->where = gfc_current_locus;
3222
          gsym->defined = 1;
3223
        }
3224
 
3225
      gsym->used = 1;
3226
 
3227
      if (name[0] == '\0')
3228
        {
3229
          t = &gfc_current_ns->blank_common;
3230
          if (t->head == NULL)
3231
            t->where = gfc_current_locus;
3232
        }
3233
      else
3234
        {
3235
          t = gfc_get_common (name, 0);
3236
        }
3237
      head = &t->head;
3238
 
3239
      if (*head == NULL)
3240
        tail = NULL;
3241
      else
3242
        {
3243
          tail = *head;
3244
          while (tail->common_next)
3245
            tail = tail->common_next;
3246
        }
3247
 
3248
      /* Grab the list of symbols.  */
3249
      for (;;)
3250
        {
3251
          m = gfc_match_symbol (&sym, 0);
3252
          if (m == MATCH_ERROR)
3253
            goto cleanup;
3254
          if (m == MATCH_NO)
3255
            goto syntax;
3256
 
3257
          /* Store a ref to the common block for error checking.  */
3258
          sym->common_block = t;
3259
 
3260
          /* See if we know the current common block is bind(c), and if
3261
             so, then see if we can check if the symbol is (which it'll
3262
             need to be).  This can happen if the bind(c) attr stmt was
3263
             applied to the common block, and the variable(s) already
3264
             defined, before declaring the common block.  */
3265
          if (t->is_bind_c == 1)
3266
            {
3267
              if (sym->ts.type != BT_UNKNOWN && sym->ts.is_c_interop != 1)
3268
                {
3269
                  /* If we find an error, just print it and continue,
3270
                     cause it's just semantic, and we can see if there
3271
                     are more errors.  */
3272
                  gfc_error_now ("Variable '%s' at %L in common block '%s' "
3273
                                 "at %C must be declared with a C "
3274
                                 "interoperable kind since common block "
3275
                                 "'%s' is bind(c)",
3276
                                 sym->name, &(sym->declared_at), t->name,
3277
                                 t->name);
3278
                }
3279
 
3280
              if (sym->attr.is_bind_c == 1)
3281
                gfc_error_now ("Variable '%s' in common block "
3282
                               "'%s' at %C can not be bind(c) since "
3283
                               "it is not global", sym->name, t->name);
3284
            }
3285
 
3286
          if (sym->attr.in_common)
3287
            {
3288
              gfc_error ("Symbol '%s' at %C is already in a COMMON block",
3289
                         sym->name);
3290
              goto cleanup;
3291
            }
3292
 
3293
          if (((sym->value != NULL && sym->value->expr_type != EXPR_NULL)
3294
               || sym->attr.data) && gfc_current_state () != COMP_BLOCK_DATA)
3295
            {
3296
              if (gfc_notify_std (GFC_STD_GNU, "Initialized symbol '%s' at %C "
3297
                                               "can only be COMMON in "
3298
                                               "BLOCK DATA", sym->name)
3299
                  == FAILURE)
3300
                goto cleanup;
3301
            }
3302
 
3303
          if (gfc_add_in_common (&sym->attr, sym->name, NULL) == FAILURE)
3304
            goto cleanup;
3305
 
3306
          if (tail != NULL)
3307
            tail->common_next = sym;
3308
          else
3309
            *head = sym;
3310
 
3311
          tail = sym;
3312
 
3313
          /* Deal with an optional array specification after the
3314
             symbol name.  */
3315
          m = gfc_match_array_spec (&as);
3316
          if (m == MATCH_ERROR)
3317
            goto cleanup;
3318
 
3319
          if (m == MATCH_YES)
3320
            {
3321
              if (as->type != AS_EXPLICIT)
3322
                {
3323
                  gfc_error ("Array specification for symbol '%s' in COMMON "
3324
                             "at %C must be explicit", sym->name);
3325
                  goto cleanup;
3326
                }
3327
 
3328
              if (gfc_add_dimension (&sym->attr, sym->name, NULL) == FAILURE)
3329
                goto cleanup;
3330
 
3331
              if (sym->attr.pointer)
3332
                {
3333
                  gfc_error ("Symbol '%s' in COMMON at %C cannot be a "
3334
                             "POINTER array", sym->name);
3335
                  goto cleanup;
3336
                }
3337
 
3338
              sym->as = as;
3339
              as = NULL;
3340
 
3341
            }
3342
 
3343
          sym->common_head = t;
3344
 
3345
          /* Check to see if the symbol is already in an equivalence group.
3346
             If it is, set the other members as being in common.  */
3347
          if (sym->attr.in_equivalence)
3348
            {
3349
              for (e1 = gfc_current_ns->equiv; e1; e1 = e1->next)
3350
                {
3351
                  for (e2 = e1; e2; e2 = e2->eq)
3352
                    if (e2->expr->symtree->n.sym == sym)
3353
                      goto equiv_found;
3354
 
3355
                  continue;
3356
 
3357
          equiv_found:
3358
 
3359
                  for (e2 = e1; e2; e2 = e2->eq)
3360
                    {
3361
                      other = e2->expr->symtree->n.sym;
3362
                      if (other->common_head
3363
                          && other->common_head != sym->common_head)
3364
                        {
3365
                          gfc_error ("Symbol '%s', in COMMON block '%s' at "
3366
                                     "%C is being indirectly equivalenced to "
3367
                                     "another COMMON block '%s'",
3368
                                     sym->name, sym->common_head->name,
3369
                                     other->common_head->name);
3370
                            goto cleanup;
3371
                        }
3372
                      other->attr.in_common = 1;
3373
                      other->common_head = t;
3374
                    }
3375
                }
3376
            }
3377
 
3378
 
3379
          gfc_gobble_whitespace ();
3380
          if (gfc_match_eos () == MATCH_YES)
3381
            goto done;
3382
          if (gfc_peek_ascii_char () == '/')
3383
            break;
3384
          if (gfc_match_char (',') != MATCH_YES)
3385
            goto syntax;
3386
          gfc_gobble_whitespace ();
3387
          if (gfc_peek_ascii_char () == '/')
3388
            break;
3389
        }
3390
    }
3391
 
3392
done:
3393
  return MATCH_YES;
3394
 
3395
syntax:
3396
  gfc_syntax_error (ST_COMMON);
3397
 
3398
cleanup:
3399
  if (old_blank_common)
3400
    old_blank_common->common_next = NULL;
3401
  else
3402
    gfc_current_ns->blank_common.head = NULL;
3403
  gfc_free_array_spec (as);
3404
  return MATCH_ERROR;
3405
}
3406
 
3407
 
3408
/* Match a BLOCK DATA program unit.  */
3409
 
3410
match
3411
gfc_match_block_data (void)
3412
{
3413
  char name[GFC_MAX_SYMBOL_LEN + 1];
3414
  gfc_symbol *sym;
3415
  match m;
3416
 
3417
  if (gfc_match_eos () == MATCH_YES)
3418
    {
3419
      gfc_new_block = NULL;
3420
      return MATCH_YES;
3421
    }
3422
 
3423
  m = gfc_match ("% %n%t", name);
3424
  if (m != MATCH_YES)
3425
    return MATCH_ERROR;
3426
 
3427
  if (gfc_get_symbol (name, NULL, &sym))
3428
    return MATCH_ERROR;
3429
 
3430
  if (gfc_add_flavor (&sym->attr, FL_BLOCK_DATA, sym->name, NULL) == FAILURE)
3431
    return MATCH_ERROR;
3432
 
3433
  gfc_new_block = sym;
3434
 
3435
  return MATCH_YES;
3436
}
3437
 
3438
 
3439
/* Free a namelist structure.  */
3440
 
3441
void
3442
gfc_free_namelist (gfc_namelist *name)
3443
{
3444
  gfc_namelist *n;
3445
 
3446
  for (; name; name = n)
3447
    {
3448
      n = name->next;
3449
      gfc_free (name);
3450
    }
3451
}
3452
 
3453
 
3454
/* Match a NAMELIST statement.  */
3455
 
3456
match
3457
gfc_match_namelist (void)
3458
{
3459
  gfc_symbol *group_name, *sym;
3460
  gfc_namelist *nl;
3461
  match m, m2;
3462
 
3463
  m = gfc_match (" / %s /", &group_name);
3464
  if (m == MATCH_NO)
3465
    goto syntax;
3466
  if (m == MATCH_ERROR)
3467
    goto error;
3468
 
3469
  for (;;)
3470
    {
3471
      if (group_name->ts.type != BT_UNKNOWN)
3472
        {
3473
          gfc_error ("Namelist group name '%s' at %C already has a basic "
3474
                     "type of %s", group_name->name,
3475
                     gfc_typename (&group_name->ts));
3476
          return MATCH_ERROR;
3477
        }
3478
 
3479
      if (group_name->attr.flavor == FL_NAMELIST
3480
          && group_name->attr.use_assoc
3481
          && gfc_notify_std (GFC_STD_GNU, "Namelist group name '%s' "
3482
                             "at %C already is USE associated and can"
3483
                             "not be respecified.", group_name->name)
3484
             == FAILURE)
3485
        return MATCH_ERROR;
3486
 
3487
      if (group_name->attr.flavor != FL_NAMELIST
3488
          && gfc_add_flavor (&group_name->attr, FL_NAMELIST,
3489
                             group_name->name, NULL) == FAILURE)
3490
        return MATCH_ERROR;
3491
 
3492
      for (;;)
3493
        {
3494
          m = gfc_match_symbol (&sym, 1);
3495
          if (m == MATCH_NO)
3496
            goto syntax;
3497
          if (m == MATCH_ERROR)
3498
            goto error;
3499
 
3500
          if (sym->attr.in_namelist == 0
3501
              && gfc_add_in_namelist (&sym->attr, sym->name, NULL) == FAILURE)
3502
            goto error;
3503
 
3504
          /* Use gfc_error_check here, rather than goto error, so that
3505
             these are the only errors for the next two lines.  */
3506
          if (sym->as && sym->as->type == AS_ASSUMED_SIZE)
3507
            {
3508
              gfc_error ("Assumed size array '%s' in namelist '%s' at "
3509
                         "%C is not allowed", sym->name, group_name->name);
3510
              gfc_error_check ();
3511
            }
3512
 
3513
          if (sym->ts.type == BT_CHARACTER && sym->ts.u.cl->length == NULL)
3514
            {
3515
              gfc_error ("Assumed character length '%s' in namelist '%s' at "
3516
                         "%C is not allowed", sym->name, group_name->name);
3517
              gfc_error_check ();
3518
            }
3519
 
3520
          nl = gfc_get_namelist ();
3521
          nl->sym = sym;
3522
          sym->refs++;
3523
 
3524
          if (group_name->namelist == NULL)
3525
            group_name->namelist = group_name->namelist_tail = nl;
3526
          else
3527
            {
3528
              group_name->namelist_tail->next = nl;
3529
              group_name->namelist_tail = nl;
3530
            }
3531
 
3532
          if (gfc_match_eos () == MATCH_YES)
3533
            goto done;
3534
 
3535
          m = gfc_match_char (',');
3536
 
3537
          if (gfc_match_char ('/') == MATCH_YES)
3538
            {
3539
              m2 = gfc_match (" %s /", &group_name);
3540
              if (m2 == MATCH_YES)
3541
                break;
3542
              if (m2 == MATCH_ERROR)
3543
                goto error;
3544
              goto syntax;
3545
            }
3546
 
3547
          if (m != MATCH_YES)
3548
            goto syntax;
3549
        }
3550
    }
3551
 
3552
done:
3553
  return MATCH_YES;
3554
 
3555
syntax:
3556
  gfc_syntax_error (ST_NAMELIST);
3557
 
3558
error:
3559
  return MATCH_ERROR;
3560
}
3561
 
3562
 
3563
/* Match a MODULE statement.  */
3564
 
3565
match
3566
gfc_match_module (void)
3567
{
3568
  match m;
3569
 
3570
  m = gfc_match (" %s%t", &gfc_new_block);
3571
  if (m != MATCH_YES)
3572
    return m;
3573
 
3574
  if (gfc_add_flavor (&gfc_new_block->attr, FL_MODULE,
3575
                      gfc_new_block->name, NULL) == FAILURE)
3576
    return MATCH_ERROR;
3577
 
3578
  return MATCH_YES;
3579
}
3580
 
3581
 
3582
/* Free equivalence sets and lists.  Recursively is the easiest way to
3583
   do this.  */
3584
 
3585
void
3586 378 julius
gfc_free_equiv_until (gfc_equiv *eq, gfc_equiv *stop)
3587 285 jeremybenn
{
3588 378 julius
  if (eq == stop)
3589 285 jeremybenn
    return;
3590
 
3591
  gfc_free_equiv (eq->eq);
3592 378 julius
  gfc_free_equiv_until (eq->next, stop);
3593 285 jeremybenn
  gfc_free_expr (eq->expr);
3594
  gfc_free (eq);
3595
}
3596
 
3597
 
3598 378 julius
void
3599
gfc_free_equiv (gfc_equiv *eq)
3600
{
3601
  gfc_free_equiv_until (eq, NULL);
3602
}
3603
 
3604
 
3605 285 jeremybenn
/* Match an EQUIVALENCE statement.  */
3606
 
3607
match
3608
gfc_match_equivalence (void)
3609
{
3610
  gfc_equiv *eq, *set, *tail;
3611
  gfc_ref *ref;
3612
  gfc_symbol *sym;
3613
  match m;
3614
  gfc_common_head *common_head = NULL;
3615
  bool common_flag;
3616
  int cnt;
3617
 
3618
  tail = NULL;
3619
 
3620
  for (;;)
3621
    {
3622
      eq = gfc_get_equiv ();
3623
      if (tail == NULL)
3624
        tail = eq;
3625
 
3626
      eq->next = gfc_current_ns->equiv;
3627
      gfc_current_ns->equiv = eq;
3628
 
3629
      if (gfc_match_char ('(') != MATCH_YES)
3630
        goto syntax;
3631
 
3632
      set = eq;
3633
      common_flag = FALSE;
3634
      cnt = 0;
3635
 
3636
      for (;;)
3637
        {
3638
          m = gfc_match_equiv_variable (&set->expr);
3639
          if (m == MATCH_ERROR)
3640
            goto cleanup;
3641
          if (m == MATCH_NO)
3642
            goto syntax;
3643
 
3644
          /*  count the number of objects.  */
3645
          cnt++;
3646
 
3647
          if (gfc_match_char ('%') == MATCH_YES)
3648
            {
3649
              gfc_error ("Derived type component %C is not a "
3650
                         "permitted EQUIVALENCE member");
3651
              goto cleanup;
3652
            }
3653
 
3654
          for (ref = set->expr->ref; ref; ref = ref->next)
3655
            if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
3656
              {
3657
                gfc_error ("Array reference in EQUIVALENCE at %C cannot "
3658
                           "be an array section");
3659
                goto cleanup;
3660
              }
3661
 
3662
          sym = set->expr->symtree->n.sym;
3663
 
3664
          if (gfc_add_in_equivalence (&sym->attr, sym->name, NULL) == FAILURE)
3665
            goto cleanup;
3666
 
3667
          if (sym->attr.in_common)
3668
            {
3669
              common_flag = TRUE;
3670
              common_head = sym->common_head;
3671
            }
3672
 
3673
          if (gfc_match_char (')') == MATCH_YES)
3674
            break;
3675
 
3676
          if (gfc_match_char (',') != MATCH_YES)
3677
            goto syntax;
3678
 
3679
          set->eq = gfc_get_equiv ();
3680
          set = set->eq;
3681
        }
3682
 
3683
      if (cnt < 2)
3684
        {
3685
          gfc_error ("EQUIVALENCE at %C requires two or more objects");
3686
          goto cleanup;
3687
        }
3688
 
3689
      /* If one of the members of an equivalence is in common, then
3690
         mark them all as being in common.  Before doing this, check
3691
         that members of the equivalence group are not in different
3692
         common blocks.  */
3693
      if (common_flag)
3694
        for (set = eq; set; set = set->eq)
3695
          {
3696
            sym = set->expr->symtree->n.sym;
3697
            if (sym->common_head && sym->common_head != common_head)
3698
              {
3699
                gfc_error ("Attempt to indirectly overlap COMMON "
3700
                           "blocks %s and %s by EQUIVALENCE at %C",
3701
                           sym->common_head->name, common_head->name);
3702
                goto cleanup;
3703
              }
3704
            sym->attr.in_common = 1;
3705
            sym->common_head = common_head;
3706
          }
3707
 
3708
      if (gfc_match_eos () == MATCH_YES)
3709
        break;
3710
      if (gfc_match_char (',') != MATCH_YES)
3711
        {
3712
          gfc_error ("Expecting a comma in EQUIVALENCE at %C");
3713
          goto cleanup;
3714
        }
3715
    }
3716
 
3717
  return MATCH_YES;
3718
 
3719
syntax:
3720
  gfc_syntax_error (ST_EQUIVALENCE);
3721
 
3722
cleanup:
3723
  eq = tail->next;
3724
  tail->next = NULL;
3725
 
3726
  gfc_free_equiv (gfc_current_ns->equiv);
3727
  gfc_current_ns->equiv = eq;
3728
 
3729
  return MATCH_ERROR;
3730
}
3731
 
3732
 
3733
/* Check that a statement function is not recursive. This is done by looking
3734
   for the statement function symbol(sym) by looking recursively through its
3735
   expression(e).  If a reference to sym is found, true is returned.
3736
   12.5.4 requires that any variable of function that is implicitly typed
3737
   shall have that type confirmed by any subsequent type declaration.  The
3738
   implicit typing is conveniently done here.  */
3739
static bool
3740
recursive_stmt_fcn (gfc_expr *, gfc_symbol *);
3741
 
3742
static bool
3743
check_stmt_fcn (gfc_expr *e, gfc_symbol *sym, int *f ATTRIBUTE_UNUSED)
3744
{
3745
 
3746
  if (e == NULL)
3747
    return false;
3748
 
3749
  switch (e->expr_type)
3750
    {
3751
    case EXPR_FUNCTION:
3752
      if (e->symtree == NULL)
3753
        return false;
3754
 
3755
      /* Check the name before testing for nested recursion!  */
3756
      if (sym->name == e->symtree->n.sym->name)
3757
        return true;
3758
 
3759
      /* Catch recursion via other statement functions.  */
3760
      if (e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION
3761
          && e->symtree->n.sym->value
3762
          && recursive_stmt_fcn (e->symtree->n.sym->value, sym))
3763
        return true;
3764
 
3765
      if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3766
        gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3767
 
3768
      break;
3769
 
3770
    case EXPR_VARIABLE:
3771
      if (e->symtree && sym->name == e->symtree->n.sym->name)
3772
        return true;
3773
 
3774
      if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
3775
        gfc_set_default_type (e->symtree->n.sym, 0, NULL);
3776
      break;
3777
 
3778
    default:
3779
      break;
3780
    }
3781
 
3782
  return false;
3783
}
3784
 
3785
 
3786
static bool
3787
recursive_stmt_fcn (gfc_expr *e, gfc_symbol *sym)
3788
{
3789
  return gfc_traverse_expr (e, sym, check_stmt_fcn, 0);
3790
}
3791
 
3792
 
3793
/* Match a statement function declaration.  It is so easy to match
3794
   non-statement function statements with a MATCH_ERROR as opposed to
3795
   MATCH_NO that we suppress error message in most cases.  */
3796
 
3797
match
3798
gfc_match_st_function (void)
3799
{
3800
  gfc_error_buf old_error;
3801
  gfc_symbol *sym;
3802
  gfc_expr *expr;
3803
  match m;
3804
 
3805
  m = gfc_match_symbol (&sym, 0);
3806
  if (m != MATCH_YES)
3807
    return m;
3808
 
3809
  gfc_push_error (&old_error);
3810
 
3811
  if (gfc_add_procedure (&sym->attr, PROC_ST_FUNCTION,
3812
                         sym->name, NULL) == FAILURE)
3813
    goto undo_error;
3814
 
3815
  if (gfc_match_formal_arglist (sym, 1, 0) != MATCH_YES)
3816
    goto undo_error;
3817
 
3818
  m = gfc_match (" = %e%t", &expr);
3819
  if (m == MATCH_NO)
3820
    goto undo_error;
3821
 
3822
  gfc_free_error (&old_error);
3823
  if (m == MATCH_ERROR)
3824
    return m;
3825
 
3826
  if (recursive_stmt_fcn (expr, sym))
3827
    {
3828
      gfc_error ("Statement function at %L is recursive", &expr->where);
3829
      return MATCH_ERROR;
3830
    }
3831
 
3832
  sym->value = expr;
3833
 
3834
  if (gfc_notify_std (GFC_STD_F95_OBS, "Obsolescent feature: "
3835
                      "Statement function at %C") == FAILURE)
3836
    return MATCH_ERROR;
3837
 
3838
  return MATCH_YES;
3839
 
3840
undo_error:
3841
  gfc_pop_error (&old_error);
3842
  return MATCH_NO;
3843
}
3844
 
3845
 
3846
/***************** SELECT CASE subroutines ******************/
3847
 
3848
/* Free a single case structure.  */
3849
 
3850
static void
3851
free_case (gfc_case *p)
3852
{
3853
  if (p->low == p->high)
3854
    p->high = NULL;
3855
  gfc_free_expr (p->low);
3856
  gfc_free_expr (p->high);
3857
  gfc_free (p);
3858
}
3859
 
3860
 
3861
/* Free a list of case structures.  */
3862
 
3863
void
3864
gfc_free_case_list (gfc_case *p)
3865
{
3866
  gfc_case *q;
3867
 
3868
  for (; p; p = q)
3869
    {
3870
      q = p->next;
3871
      free_case (p);
3872
    }
3873
}
3874
 
3875
 
3876
/* Match a single case selector.  */
3877
 
3878
static match
3879
match_case_selector (gfc_case **cp)
3880
{
3881
  gfc_case *c;
3882
  match m;
3883
 
3884
  c = gfc_get_case ();
3885
  c->where = gfc_current_locus;
3886
 
3887
  if (gfc_match_char (':') == MATCH_YES)
3888
    {
3889
      m = gfc_match_init_expr (&c->high);
3890
      if (m == MATCH_NO)
3891
        goto need_expr;
3892
      if (m == MATCH_ERROR)
3893
        goto cleanup;
3894
    }
3895
  else
3896
    {
3897
      m = gfc_match_init_expr (&c->low);
3898
      if (m == MATCH_ERROR)
3899
        goto cleanup;
3900
      if (m == MATCH_NO)
3901
        goto need_expr;
3902
 
3903
      /* If we're not looking at a ':' now, make a range out of a single
3904
         target.  Else get the upper bound for the case range.  */
3905
      if (gfc_match_char (':') != MATCH_YES)
3906
        c->high = c->low;
3907
      else
3908
        {
3909
          m = gfc_match_init_expr (&c->high);
3910
          if (m == MATCH_ERROR)
3911
            goto cleanup;
3912
          /* MATCH_NO is fine.  It's OK if nothing is there!  */
3913
        }
3914
    }
3915
 
3916
  *cp = c;
3917
  return MATCH_YES;
3918
 
3919
need_expr:
3920
  gfc_error ("Expected initialization expression in CASE at %C");
3921
 
3922
cleanup:
3923
  free_case (c);
3924
  return MATCH_ERROR;
3925
}
3926
 
3927
 
3928
/* Match the end of a case statement.  */
3929
 
3930
static match
3931
match_case_eos (void)
3932
{
3933
  char name[GFC_MAX_SYMBOL_LEN + 1];
3934
  match m;
3935
 
3936
  if (gfc_match_eos () == MATCH_YES)
3937
    return MATCH_YES;
3938
 
3939
  /* If the case construct doesn't have a case-construct-name, we
3940
     should have matched the EOS.  */
3941
  if (!gfc_current_block ())
3942
    return MATCH_NO;
3943
 
3944
  gfc_gobble_whitespace ();
3945
 
3946
  m = gfc_match_name (name);
3947
  if (m != MATCH_YES)
3948
    return m;
3949
 
3950
  if (strcmp (name, gfc_current_block ()->name) != 0)
3951
    {
3952
      gfc_error ("Expected block name '%s' of SELECT construct at %C",
3953
                 gfc_current_block ()->name);
3954
      return MATCH_ERROR;
3955
    }
3956
 
3957
  return gfc_match_eos ();
3958
}
3959
 
3960
 
3961
/* Match a SELECT statement.  */
3962
 
3963
match
3964
gfc_match_select (void)
3965
{
3966
  gfc_expr *expr;
3967
  match m;
3968
 
3969
  m = gfc_match_label ();
3970
  if (m == MATCH_ERROR)
3971
    return m;
3972
 
3973
  m = gfc_match (" select case ( %e )%t", &expr);
3974
  if (m != MATCH_YES)
3975
    return m;
3976
 
3977
  new_st.op = EXEC_SELECT;
3978
  new_st.expr1 = expr;
3979
 
3980
  return MATCH_YES;
3981
}
3982
 
3983
 
3984
/* Push the current selector onto the SELECT TYPE stack.  */
3985
 
3986
static void
3987
select_type_push (gfc_symbol *sel)
3988
{
3989
  gfc_select_type_stack *top = gfc_get_select_type_stack ();
3990
  top->selector = sel;
3991
  top->tmp = NULL;
3992
  top->prev = select_type_stack;
3993
 
3994
  select_type_stack = top;
3995
}
3996
 
3997
 
3998
/* Set the temporary for the current SELECT TYPE selector.  */
3999
 
4000
static void
4001
select_type_set_tmp (gfc_typespec *ts)
4002
{
4003
  char name[GFC_MAX_SYMBOL_LEN];
4004
  gfc_symtree *tmp;
4005
 
4006
  if (!gfc_type_is_extensible (ts->u.derived))
4007
    return;
4008
 
4009
  if (ts->type == BT_CLASS)
4010
    sprintf (name, "tmp$class$%s", ts->u.derived->name);
4011
  else
4012
    sprintf (name, "tmp$type$%s", ts->u.derived->name);
4013
  gfc_get_sym_tree (name, gfc_current_ns, &tmp, false);
4014
  gfc_add_type (tmp->n.sym, ts, NULL);
4015
  gfc_set_sym_referenced (tmp->n.sym);
4016
  gfc_add_pointer (&tmp->n.sym->attr, NULL);
4017
  gfc_add_flavor (&tmp->n.sym->attr, FL_VARIABLE, name, NULL);
4018
  if (ts->type == BT_CLASS)
4019
    {
4020
      gfc_build_class_symbol (&tmp->n.sym->ts, &tmp->n.sym->attr,
4021
                              &tmp->n.sym->as);
4022
      tmp->n.sym->attr.class_ok = 1;
4023
    }
4024
 
4025
  select_type_stack->tmp = tmp;
4026
}
4027
 
4028
 
4029
/* Match a SELECT TYPE statement.  */
4030
 
4031
match
4032
gfc_match_select_type (void)
4033
{
4034
  gfc_expr *expr1, *expr2 = NULL;
4035
  match m;
4036
  char name[GFC_MAX_SYMBOL_LEN];
4037
 
4038
  m = gfc_match_label ();
4039
  if (m == MATCH_ERROR)
4040
    return m;
4041
 
4042
  m = gfc_match (" select type ( ");
4043
  if (m != MATCH_YES)
4044
    return m;
4045
 
4046
  gfc_current_ns = gfc_build_block_ns (gfc_current_ns);
4047
 
4048
  m = gfc_match (" %n => %e", name, &expr2);
4049
  if (m == MATCH_YES)
4050
    {
4051
      expr1 = gfc_get_expr();
4052
      expr1->expr_type = EXPR_VARIABLE;
4053
      if (gfc_get_sym_tree (name, NULL, &expr1->symtree, false))
4054
        return MATCH_ERROR;
4055
      expr1->symtree->n.sym->ts = expr2->ts;
4056
      expr1->symtree->n.sym->attr.referenced = 1;
4057
      expr1->symtree->n.sym->attr.class_ok = 1;
4058
    }
4059
  else
4060
    {
4061
      m = gfc_match (" %e ", &expr1);
4062
      if (m != MATCH_YES)
4063
        return m;
4064
    }
4065
 
4066
  m = gfc_match (" )%t");
4067
  if (m != MATCH_YES)
4068
    return m;
4069
 
4070
  /* Check for F03:C811.  */
4071
  if (!expr2 && (expr1->expr_type != EXPR_VARIABLE || expr1->ref != NULL))
4072
    {
4073
      gfc_error ("Selector in SELECT TYPE at %C is not a named variable; "
4074
                 "use associate-name=>");
4075
      return MATCH_ERROR;
4076
    }
4077
 
4078
  /* Check for F03:C813.  */
4079
  if (expr1->ts.type != BT_CLASS && !(expr2 && expr2->ts.type == BT_CLASS))
4080
    {
4081
      gfc_error ("Selector shall be polymorphic in SELECT TYPE statement "
4082
                 "at %C");
4083
      return MATCH_ERROR;
4084
    }
4085
 
4086
  new_st.op = EXEC_SELECT_TYPE;
4087
  new_st.expr1 = expr1;
4088
  new_st.expr2 = expr2;
4089
  new_st.ext.ns = gfc_current_ns;
4090
 
4091
  select_type_push (expr1->symtree->n.sym);
4092
 
4093
  return MATCH_YES;
4094
}
4095
 
4096
 
4097
/* Match a CASE statement.  */
4098
 
4099
match
4100
gfc_match_case (void)
4101
{
4102
  gfc_case *c, *head, *tail;
4103
  match m;
4104
 
4105
  head = tail = NULL;
4106
 
4107
  if (gfc_current_state () != COMP_SELECT)
4108
    {
4109
      gfc_error ("Unexpected CASE statement at %C");
4110
      return MATCH_ERROR;
4111
    }
4112
 
4113
  if (gfc_match ("% default") == MATCH_YES)
4114
    {
4115
      m = match_case_eos ();
4116
      if (m == MATCH_NO)
4117
        goto syntax;
4118
      if (m == MATCH_ERROR)
4119
        goto cleanup;
4120
 
4121
      new_st.op = EXEC_SELECT;
4122
      c = gfc_get_case ();
4123
      c->where = gfc_current_locus;
4124
      new_st.ext.case_list = c;
4125
      return MATCH_YES;
4126
    }
4127
 
4128
  if (gfc_match_char ('(') != MATCH_YES)
4129
    goto syntax;
4130
 
4131
  for (;;)
4132
    {
4133
      if (match_case_selector (&c) == MATCH_ERROR)
4134
        goto cleanup;
4135
 
4136
      if (head == NULL)
4137
        head = c;
4138
      else
4139
        tail->next = c;
4140
 
4141
      tail = c;
4142
 
4143
      if (gfc_match_char (')') == MATCH_YES)
4144
        break;
4145
      if (gfc_match_char (',') != MATCH_YES)
4146
        goto syntax;
4147
    }
4148
 
4149
  m = match_case_eos ();
4150
  if (m == MATCH_NO)
4151
    goto syntax;
4152
  if (m == MATCH_ERROR)
4153
    goto cleanup;
4154
 
4155
  new_st.op = EXEC_SELECT;
4156
  new_st.ext.case_list = head;
4157
 
4158
  return MATCH_YES;
4159
 
4160
syntax:
4161
  gfc_error ("Syntax error in CASE specification at %C");
4162
 
4163
cleanup:
4164
  gfc_free_case_list (head);  /* new_st is cleaned up in parse.c.  */
4165
  return MATCH_ERROR;
4166
}
4167
 
4168
 
4169
/* Match a TYPE IS statement.  */
4170
 
4171
match
4172
gfc_match_type_is (void)
4173
{
4174
  gfc_case *c = NULL;
4175
  match m;
4176
 
4177
  if (gfc_current_state () != COMP_SELECT_TYPE)
4178
    {
4179
      gfc_error ("Unexpected TYPE IS statement at %C");
4180
      return MATCH_ERROR;
4181
    }
4182
 
4183
  if (gfc_match_char ('(') != MATCH_YES)
4184
    goto syntax;
4185
 
4186
  c = gfc_get_case ();
4187
  c->where = gfc_current_locus;
4188
 
4189
  /* TODO: Once unlimited polymorphism is implemented, we will need to call
4190
     match_type_spec here.  */
4191
  if (match_derived_type_spec (&c->ts) == MATCH_ERROR)
4192
    goto cleanup;
4193
 
4194
  if (gfc_match_char (')') != MATCH_YES)
4195
    goto syntax;
4196
 
4197
  m = match_case_eos ();
4198
  if (m == MATCH_NO)
4199
    goto syntax;
4200
  if (m == MATCH_ERROR)
4201
    goto cleanup;
4202
 
4203
  new_st.op = EXEC_SELECT_TYPE;
4204
  new_st.ext.case_list = c;
4205
 
4206
  /* Create temporary variable.  */
4207
  select_type_set_tmp (&c->ts);
4208
 
4209
  return MATCH_YES;
4210
 
4211
syntax:
4212
  gfc_error ("Syntax error in TYPE IS specification at %C");
4213
 
4214
cleanup:
4215
  if (c != NULL)
4216
    gfc_free_case_list (c);  /* new_st is cleaned up in parse.c.  */
4217
  return MATCH_ERROR;
4218
}
4219
 
4220
 
4221
/* Match a CLASS IS or CLASS DEFAULT statement.  */
4222
 
4223
match
4224
gfc_match_class_is (void)
4225
{
4226
  gfc_case *c = NULL;
4227
  match m;
4228
 
4229
  if (gfc_current_state () != COMP_SELECT_TYPE)
4230
    return MATCH_NO;
4231
 
4232
  if (gfc_match ("% default") == MATCH_YES)
4233
    {
4234
      m = match_case_eos ();
4235
      if (m == MATCH_NO)
4236
        goto syntax;
4237
      if (m == MATCH_ERROR)
4238
        goto cleanup;
4239
 
4240
      new_st.op = EXEC_SELECT_TYPE;
4241
      c = gfc_get_case ();
4242
      c->where = gfc_current_locus;
4243
      c->ts.type = BT_UNKNOWN;
4244
      new_st.ext.case_list = c;
4245
      return MATCH_YES;
4246
    }
4247
 
4248
  m = gfc_match ("% is");
4249
  if (m == MATCH_NO)
4250
    goto syntax;
4251
  if (m == MATCH_ERROR)
4252
    goto cleanup;
4253
 
4254
  if (gfc_match_char ('(') != MATCH_YES)
4255
    goto syntax;
4256
 
4257
  c = gfc_get_case ();
4258
  c->where = gfc_current_locus;
4259
 
4260
  if (match_derived_type_spec (&c->ts) == MATCH_ERROR)
4261
    goto cleanup;
4262
 
4263
  if (c->ts.type == BT_DERIVED)
4264
    c->ts.type = BT_CLASS;
4265
 
4266
  if (gfc_match_char (')') != MATCH_YES)
4267
    goto syntax;
4268
 
4269
  m = match_case_eos ();
4270
  if (m == MATCH_NO)
4271
    goto syntax;
4272
  if (m == MATCH_ERROR)
4273
    goto cleanup;
4274
 
4275
  new_st.op = EXEC_SELECT_TYPE;
4276
  new_st.ext.case_list = c;
4277
 
4278
  /* Create temporary variable.  */
4279
  select_type_set_tmp (&c->ts);
4280
 
4281
  return MATCH_YES;
4282
 
4283
syntax:
4284
  gfc_error ("Syntax error in CLASS IS specification at %C");
4285
 
4286
cleanup:
4287
  if (c != NULL)
4288
    gfc_free_case_list (c);  /* new_st is cleaned up in parse.c.  */
4289
  return MATCH_ERROR;
4290
}
4291
 
4292
 
4293
/********************* WHERE subroutines ********************/
4294
 
4295
/* Match the rest of a simple WHERE statement that follows an IF statement.
4296
 */
4297
 
4298
static match
4299
match_simple_where (void)
4300
{
4301
  gfc_expr *expr;
4302
  gfc_code *c;
4303
  match m;
4304
 
4305
  m = gfc_match (" ( %e )", &expr);
4306
  if (m != MATCH_YES)
4307
    return m;
4308
 
4309
  m = gfc_match_assignment ();
4310
  if (m == MATCH_NO)
4311
    goto syntax;
4312
  if (m == MATCH_ERROR)
4313
    goto cleanup;
4314
 
4315
  if (gfc_match_eos () != MATCH_YES)
4316
    goto syntax;
4317
 
4318
  c = gfc_get_code ();
4319
 
4320
  c->op = EXEC_WHERE;
4321
  c->expr1 = expr;
4322
  c->next = gfc_get_code ();
4323
 
4324
  *c->next = new_st;
4325
  gfc_clear_new_st ();
4326
 
4327
  new_st.op = EXEC_WHERE;
4328
  new_st.block = c;
4329
 
4330
  return MATCH_YES;
4331
 
4332
syntax:
4333
  gfc_syntax_error (ST_WHERE);
4334
 
4335
cleanup:
4336
  gfc_free_expr (expr);
4337
  return MATCH_ERROR;
4338
}
4339
 
4340
 
4341
/* Match a WHERE statement.  */
4342
 
4343
match
4344
gfc_match_where (gfc_statement *st)
4345
{
4346
  gfc_expr *expr;
4347
  match m0, m;
4348
  gfc_code *c;
4349
 
4350
  m0 = gfc_match_label ();
4351
  if (m0 == MATCH_ERROR)
4352
    return m0;
4353
 
4354
  m = gfc_match (" where ( %e )", &expr);
4355
  if (m != MATCH_YES)
4356
    return m;
4357
 
4358
  if (gfc_match_eos () == MATCH_YES)
4359
    {
4360
      *st = ST_WHERE_BLOCK;
4361
      new_st.op = EXEC_WHERE;
4362
      new_st.expr1 = expr;
4363
      return MATCH_YES;
4364
    }
4365
 
4366
  m = gfc_match_assignment ();
4367
  if (m == MATCH_NO)
4368
    gfc_syntax_error (ST_WHERE);
4369
 
4370
  if (m != MATCH_YES)
4371
    {
4372
      gfc_free_expr (expr);
4373
      return MATCH_ERROR;
4374
    }
4375
 
4376
  /* We've got a simple WHERE statement.  */
4377
  *st = ST_WHERE;
4378
  c = gfc_get_code ();
4379
 
4380
  c->op = EXEC_WHERE;
4381
  c->expr1 = expr;
4382
  c->next = gfc_get_code ();
4383
 
4384
  *c->next = new_st;
4385
  gfc_clear_new_st ();
4386
 
4387
  new_st.op = EXEC_WHERE;
4388
  new_st.block = c;
4389
 
4390
  return MATCH_YES;
4391
}
4392
 
4393
 
4394
/* Match an ELSEWHERE statement.  We leave behind a WHERE node in
4395
   new_st if successful.  */
4396
 
4397
match
4398
gfc_match_elsewhere (void)
4399
{
4400
  char name[GFC_MAX_SYMBOL_LEN + 1];
4401
  gfc_expr *expr;
4402
  match m;
4403
 
4404
  if (gfc_current_state () != COMP_WHERE)
4405
    {
4406
      gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
4407
      return MATCH_ERROR;
4408
    }
4409
 
4410
  expr = NULL;
4411
 
4412
  if (gfc_match_char ('(') == MATCH_YES)
4413
    {
4414
      m = gfc_match_expr (&expr);
4415
      if (m == MATCH_NO)
4416
        goto syntax;
4417
      if (m == MATCH_ERROR)
4418
        return MATCH_ERROR;
4419
 
4420
      if (gfc_match_char (')') != MATCH_YES)
4421
        goto syntax;
4422
    }
4423
 
4424
  if (gfc_match_eos () != MATCH_YES)
4425
    {
4426
      /* Only makes sense if we have a where-construct-name.  */
4427
      if (!gfc_current_block ())
4428
        {
4429
          m = MATCH_ERROR;
4430
          goto cleanup;
4431
        }
4432
      /* Better be a name at this point.  */
4433
      m = gfc_match_name (name);
4434
      if (m == MATCH_NO)
4435
        goto syntax;
4436
      if (m == MATCH_ERROR)
4437
        goto cleanup;
4438
 
4439
      if (gfc_match_eos () != MATCH_YES)
4440
        goto syntax;
4441
 
4442
      if (strcmp (name, gfc_current_block ()->name) != 0)
4443
        {
4444
          gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
4445
                     name, gfc_current_block ()->name);
4446
          goto cleanup;
4447
        }
4448
    }
4449
 
4450
  new_st.op = EXEC_WHERE;
4451
  new_st.expr1 = expr;
4452
  return MATCH_YES;
4453
 
4454
syntax:
4455
  gfc_syntax_error (ST_ELSEWHERE);
4456
 
4457
cleanup:
4458
  gfc_free_expr (expr);
4459
  return MATCH_ERROR;
4460
}
4461
 
4462
 
4463
/******************** FORALL subroutines ********************/
4464
 
4465
/* Free a list of FORALL iterators.  */
4466
 
4467
void
4468
gfc_free_forall_iterator (gfc_forall_iterator *iter)
4469
{
4470
  gfc_forall_iterator *next;
4471
 
4472
  while (iter)
4473
    {
4474
      next = iter->next;
4475
      gfc_free_expr (iter->var);
4476
      gfc_free_expr (iter->start);
4477
      gfc_free_expr (iter->end);
4478
      gfc_free_expr (iter->stride);
4479
      gfc_free (iter);
4480
      iter = next;
4481
    }
4482
}
4483
 
4484
 
4485
/* Match an iterator as part of a FORALL statement.  The format is:
4486
 
4487
     <var> = <start>:<end>[:<stride>]
4488
 
4489
   On MATCH_NO, the caller tests for the possibility that there is a
4490
   scalar mask expression.  */
4491
 
4492
static match
4493
match_forall_iterator (gfc_forall_iterator **result)
4494
{
4495
  gfc_forall_iterator *iter;
4496
  locus where;
4497
  match m;
4498
 
4499
  where = gfc_current_locus;
4500
  iter = XCNEW (gfc_forall_iterator);
4501
 
4502
  m = gfc_match_expr (&iter->var);
4503
  if (m != MATCH_YES)
4504
    goto cleanup;
4505
 
4506
  if (gfc_match_char ('=') != MATCH_YES
4507
      || iter->var->expr_type != EXPR_VARIABLE)
4508
    {
4509
      m = MATCH_NO;
4510
      goto cleanup;
4511
    }
4512
 
4513
  m = gfc_match_expr (&iter->start);
4514
  if (m != MATCH_YES)
4515
    goto cleanup;
4516
 
4517
  if (gfc_match_char (':') != MATCH_YES)
4518
    goto syntax;
4519
 
4520
  m = gfc_match_expr (&iter->end);
4521
  if (m == MATCH_NO)
4522
    goto syntax;
4523
  if (m == MATCH_ERROR)
4524
    goto cleanup;
4525
 
4526
  if (gfc_match_char (':') == MATCH_NO)
4527
    iter->stride = gfc_int_expr (1);
4528
  else
4529
    {
4530
      m = gfc_match_expr (&iter->stride);
4531
      if (m == MATCH_NO)
4532
        goto syntax;
4533
      if (m == MATCH_ERROR)
4534
        goto cleanup;
4535
    }
4536
 
4537
  /* Mark the iteration variable's symbol as used as a FORALL index.  */
4538
  iter->var->symtree->n.sym->forall_index = true;
4539
 
4540
  *result = iter;
4541
  return MATCH_YES;
4542
 
4543
syntax:
4544
  gfc_error ("Syntax error in FORALL iterator at %C");
4545
  m = MATCH_ERROR;
4546
 
4547
cleanup:
4548
 
4549
  gfc_current_locus = where;
4550
  gfc_free_forall_iterator (iter);
4551
  return m;
4552
}
4553
 
4554
 
4555
/* Match the header of a FORALL statement.  */
4556
 
4557
static match
4558
match_forall_header (gfc_forall_iterator **phead, gfc_expr **mask)
4559
{
4560
  gfc_forall_iterator *head, *tail, *new_iter;
4561
  gfc_expr *msk;
4562
  match m;
4563
 
4564
  gfc_gobble_whitespace ();
4565
 
4566
  head = tail = NULL;
4567
  msk = NULL;
4568
 
4569
  if (gfc_match_char ('(') != MATCH_YES)
4570
    return MATCH_NO;
4571
 
4572
  m = match_forall_iterator (&new_iter);
4573
  if (m == MATCH_ERROR)
4574
    goto cleanup;
4575
  if (m == MATCH_NO)
4576
    goto syntax;
4577
 
4578
  head = tail = new_iter;
4579
 
4580
  for (;;)
4581
    {
4582
      if (gfc_match_char (',') != MATCH_YES)
4583
        break;
4584
 
4585
      m = match_forall_iterator (&new_iter);
4586
      if (m == MATCH_ERROR)
4587
        goto cleanup;
4588
 
4589
      if (m == MATCH_YES)
4590
        {
4591
          tail->next = new_iter;
4592
          tail = new_iter;
4593
          continue;
4594
        }
4595
 
4596
      /* Have to have a mask expression.  */
4597
 
4598
      m = gfc_match_expr (&msk);
4599
      if (m == MATCH_NO)
4600
        goto syntax;
4601
      if (m == MATCH_ERROR)
4602
        goto cleanup;
4603
 
4604
      break;
4605
    }
4606
 
4607
  if (gfc_match_char (')') == MATCH_NO)
4608
    goto syntax;
4609
 
4610
  *phead = head;
4611
  *mask = msk;
4612
  return MATCH_YES;
4613
 
4614
syntax:
4615
  gfc_syntax_error (ST_FORALL);
4616
 
4617
cleanup:
4618
  gfc_free_expr (msk);
4619
  gfc_free_forall_iterator (head);
4620
 
4621
  return MATCH_ERROR;
4622
}
4623
 
4624
/* Match the rest of a simple FORALL statement that follows an
4625
   IF statement.  */
4626
 
4627
static match
4628
match_simple_forall (void)
4629
{
4630
  gfc_forall_iterator *head;
4631
  gfc_expr *mask;
4632
  gfc_code *c;
4633
  match m;
4634
 
4635
  mask = NULL;
4636
  head = NULL;
4637
  c = NULL;
4638
 
4639
  m = match_forall_header (&head, &mask);
4640
 
4641
  if (m == MATCH_NO)
4642
    goto syntax;
4643
  if (m != MATCH_YES)
4644
    goto cleanup;
4645
 
4646
  m = gfc_match_assignment ();
4647
 
4648
  if (m == MATCH_ERROR)
4649
    goto cleanup;
4650
  if (m == MATCH_NO)
4651
    {
4652
      m = gfc_match_pointer_assignment ();
4653
      if (m == MATCH_ERROR)
4654
        goto cleanup;
4655
      if (m == MATCH_NO)
4656
        goto syntax;
4657
    }
4658
 
4659
  c = gfc_get_code ();
4660
  *c = new_st;
4661
  c->loc = gfc_current_locus;
4662
 
4663
  if (gfc_match_eos () != MATCH_YES)
4664
    goto syntax;
4665
 
4666
  gfc_clear_new_st ();
4667
  new_st.op = EXEC_FORALL;
4668
  new_st.expr1 = mask;
4669
  new_st.ext.forall_iterator = head;
4670
  new_st.block = gfc_get_code ();
4671
 
4672
  new_st.block->op = EXEC_FORALL;
4673
  new_st.block->next = c;
4674
 
4675
  return MATCH_YES;
4676
 
4677
syntax:
4678
  gfc_syntax_error (ST_FORALL);
4679
 
4680
cleanup:
4681
  gfc_free_forall_iterator (head);
4682
  gfc_free_expr (mask);
4683
 
4684
  return MATCH_ERROR;
4685
}
4686
 
4687
 
4688
/* Match a FORALL statement.  */
4689
 
4690
match
4691
gfc_match_forall (gfc_statement *st)
4692
{
4693
  gfc_forall_iterator *head;
4694
  gfc_expr *mask;
4695
  gfc_code *c;
4696
  match m0, m;
4697
 
4698
  head = NULL;
4699
  mask = NULL;
4700
  c = NULL;
4701
 
4702
  m0 = gfc_match_label ();
4703
  if (m0 == MATCH_ERROR)
4704
    return MATCH_ERROR;
4705
 
4706
  m = gfc_match (" forall");
4707
  if (m != MATCH_YES)
4708
    return m;
4709
 
4710
  m = match_forall_header (&head, &mask);
4711
  if (m == MATCH_ERROR)
4712
    goto cleanup;
4713
  if (m == MATCH_NO)
4714
    goto syntax;
4715
 
4716
  if (gfc_match_eos () == MATCH_YES)
4717
    {
4718
      *st = ST_FORALL_BLOCK;
4719
      new_st.op = EXEC_FORALL;
4720
      new_st.expr1 = mask;
4721
      new_st.ext.forall_iterator = head;
4722
      return MATCH_YES;
4723
    }
4724
 
4725
  m = gfc_match_assignment ();
4726
  if (m == MATCH_ERROR)
4727
    goto cleanup;
4728
  if (m == MATCH_NO)
4729
    {
4730
      m = gfc_match_pointer_assignment ();
4731
      if (m == MATCH_ERROR)
4732
        goto cleanup;
4733
      if (m == MATCH_NO)
4734
        goto syntax;
4735
    }
4736
 
4737
  c = gfc_get_code ();
4738
  *c = new_st;
4739
  c->loc = gfc_current_locus;
4740
 
4741
  gfc_clear_new_st ();
4742
  new_st.op = EXEC_FORALL;
4743
  new_st.expr1 = mask;
4744
  new_st.ext.forall_iterator = head;
4745
  new_st.block = gfc_get_code ();
4746
  new_st.block->op = EXEC_FORALL;
4747
  new_st.block->next = c;
4748
 
4749
  *st = ST_FORALL;
4750
  return MATCH_YES;
4751
 
4752
syntax:
4753
  gfc_syntax_error (ST_FORALL);
4754
 
4755
cleanup:
4756
  gfc_free_forall_iterator (head);
4757
  gfc_free_expr (mask);
4758
  gfc_free_statements (c);
4759
  return MATCH_NO;
4760
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.