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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [fortran/] [match.c] - Blame information for rev 712

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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