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

Subversion Repositories openrisc

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 712 jeremybenn
/* Primary expression subroutines
2
   Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
3
   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 "arith.h"
28
#include "match.h"
29
#include "parse.h"
30
#include "constructor.h"
31
 
32
int matching_actual_arglist = 0;
33
 
34
/* Matches a kind-parameter expression, which is either a named
35
   symbolic constant or a nonnegative integer constant.  If
36
   successful, sets the kind value to the correct integer.
37
   The argument 'is_iso_c' signals whether the kind is an ISO_C_BINDING
38
   symbol like e.g. 'c_int'.  */
39
 
40
static match
41
match_kind_param (int *kind, int *is_iso_c)
42
{
43
  char name[GFC_MAX_SYMBOL_LEN + 1];
44
  gfc_symbol *sym;
45
  const char *p;
46
  match m;
47
 
48
  *is_iso_c = 0;
49
 
50
  m = gfc_match_small_literal_int (kind, NULL);
51
  if (m != MATCH_NO)
52
    return m;
53
 
54
  m = gfc_match_name (name);
55
  if (m != MATCH_YES)
56
    return m;
57
 
58
  if (gfc_find_symbol (name, NULL, 1, &sym))
59
    return MATCH_ERROR;
60
 
61
  if (sym == NULL)
62
    return MATCH_NO;
63
 
64
  *is_iso_c = sym->attr.is_iso_c;
65
 
66
  if (sym->attr.flavor != FL_PARAMETER)
67
    return MATCH_NO;
68
 
69
  if (sym->value == NULL)
70
    return MATCH_NO;
71
 
72
  p = gfc_extract_int (sym->value, kind);
73
  if (p != NULL)
74
    return MATCH_NO;
75
 
76
  gfc_set_sym_referenced (sym);
77
 
78
  if (*kind < 0)
79
    return MATCH_NO;
80
 
81
  return MATCH_YES;
82
}
83
 
84
 
85
/* Get a trailing kind-specification for non-character variables.
86
   Returns:
87
     * the integer kind value or
88
     * -1 if an error was generated,
89
     * -2 if no kind was found.
90
   The argument 'is_iso_c' signals whether the kind is an ISO_C_BINDING
91
   symbol like e.g. 'c_int'.  */
92
 
93
static int
94
get_kind (int *is_iso_c)
95
{
96
  int kind;
97
  match m;
98
 
99
  *is_iso_c = 0;
100
 
101
  if (gfc_match_char ('_') != MATCH_YES)
102
    return -2;
103
 
104
  m = match_kind_param (&kind, is_iso_c);
105
  if (m == MATCH_NO)
106
    gfc_error ("Missing kind-parameter at %C");
107
 
108
  return (m == MATCH_YES) ? kind : -1;
109
}
110
 
111
 
112
/* Given a character and a radix, see if the character is a valid
113
   digit in that radix.  */
114
 
115
int
116
gfc_check_digit (char c, int radix)
117
{
118
  int r;
119
 
120
  switch (radix)
121
    {
122
    case 2:
123
      r = ('0' <= c && c <= '1');
124
      break;
125
 
126
    case 8:
127
      r = ('0' <= c && c <= '7');
128
      break;
129
 
130
    case 10:
131
      r = ('0' <= c && c <= '9');
132
      break;
133
 
134
    case 16:
135
      r = ISXDIGIT (c);
136
      break;
137
 
138
    default:
139
      gfc_internal_error ("gfc_check_digit(): bad radix");
140
    }
141
 
142
  return r;
143
}
144
 
145
 
146
/* Match the digit string part of an integer if signflag is not set,
147
   the signed digit string part if signflag is set.  If the buffer
148
   is NULL, we just count characters for the resolution pass.  Returns
149
   the number of characters matched, -1 for no match.  */
150
 
151
static int
152
match_digits (int signflag, int radix, char *buffer)
153
{
154
  locus old_loc;
155
  int length;
156
  char c;
157
 
158
  length = 0;
159
  c = gfc_next_ascii_char ();
160
 
161
  if (signflag && (c == '+' || c == '-'))
162
    {
163
      if (buffer != NULL)
164
        *buffer++ = c;
165
      gfc_gobble_whitespace ();
166
      c = gfc_next_ascii_char ();
167
      length++;
168
    }
169
 
170
  if (!gfc_check_digit (c, radix))
171
    return -1;
172
 
173
  length++;
174
  if (buffer != NULL)
175
    *buffer++ = c;
176
 
177
  for (;;)
178
    {
179
      old_loc = gfc_current_locus;
180
      c = gfc_next_ascii_char ();
181
 
182
      if (!gfc_check_digit (c, radix))
183
        break;
184
 
185
      if (buffer != NULL)
186
        *buffer++ = c;
187
      length++;
188
    }
189
 
190
  gfc_current_locus = old_loc;
191
 
192
  return length;
193
}
194
 
195
 
196
/* Match an integer (digit string and optional kind).
197
   A sign will be accepted if signflag is set.  */
198
 
199
static match
200
match_integer_constant (gfc_expr **result, int signflag)
201
{
202
  int length, kind, is_iso_c;
203
  locus old_loc;
204
  char *buffer;
205
  gfc_expr *e;
206
 
207
  old_loc = gfc_current_locus;
208
  gfc_gobble_whitespace ();
209
 
210
  length = match_digits (signflag, 10, NULL);
211
  gfc_current_locus = old_loc;
212
  if (length == -1)
213
    return MATCH_NO;
214
 
215
  buffer = (char *) alloca (length + 1);
216
  memset (buffer, '\0', length + 1);
217
 
218
  gfc_gobble_whitespace ();
219
 
220
  match_digits (signflag, 10, buffer);
221
 
222
  kind = get_kind (&is_iso_c);
223
  if (kind == -2)
224
    kind = gfc_default_integer_kind;
225
  if (kind == -1)
226
    return MATCH_ERROR;
227
 
228
  if (kind == 4 && gfc_option.flag_integer4_kind == 8)
229
    kind = 8;
230
 
231
  if (gfc_validate_kind (BT_INTEGER, kind, true) < 0)
232
    {
233
      gfc_error ("Integer kind %d at %C not available", kind);
234
      return MATCH_ERROR;
235
    }
236
 
237
  e = gfc_convert_integer (buffer, kind, 10, &gfc_current_locus);
238
  e->ts.is_c_interop = is_iso_c;
239
 
240
  if (gfc_range_check (e) != ARITH_OK)
241
    {
242
      gfc_error ("Integer too big for its kind at %C. This check can be "
243
                 "disabled with the option -fno-range-check");
244
 
245
      gfc_free_expr (e);
246
      return MATCH_ERROR;
247
    }
248
 
249
  *result = e;
250
  return MATCH_YES;
251
}
252
 
253
 
254
/* Match a Hollerith constant.  */
255
 
256
static match
257
match_hollerith_constant (gfc_expr **result)
258
{
259
  locus old_loc;
260
  gfc_expr *e = NULL;
261
  const char *msg;
262
  int num, pad;
263
  int i;
264
 
265
  old_loc = gfc_current_locus;
266
  gfc_gobble_whitespace ();
267
 
268
  if (match_integer_constant (&e, 0) == MATCH_YES
269
      && gfc_match_char ('h') == MATCH_YES)
270
    {
271
      if (gfc_notify_std (GFC_STD_LEGACY, "Extension: Hollerith constant "
272
                          "at %C") == FAILURE)
273
        goto cleanup;
274
 
275
      msg = gfc_extract_int (e, &num);
276
      if (msg != NULL)
277
        {
278
          gfc_error (msg);
279
          goto cleanup;
280
        }
281
      if (num == 0)
282
        {
283
          gfc_error ("Invalid Hollerith constant: %L must contain at least "
284
                     "one character", &old_loc);
285
          goto cleanup;
286
        }
287
      if (e->ts.kind != gfc_default_integer_kind)
288
        {
289
          gfc_error ("Invalid Hollerith constant: Integer kind at %L "
290
                     "should be default", &old_loc);
291
          goto cleanup;
292
        }
293
      else
294
        {
295
          gfc_free_expr (e);
296
          e = gfc_get_constant_expr (BT_HOLLERITH, gfc_default_character_kind,
297
                                     &gfc_current_locus);
298
 
299
          /* Calculate padding needed to fit default integer memory.  */
300
          pad = gfc_default_integer_kind - (num % gfc_default_integer_kind);
301
 
302
          e->representation.string = XCNEWVEC (char, num + pad + 1);
303
 
304
          for (i = 0; i < num; i++)
305
            {
306
              gfc_char_t c = gfc_next_char_literal (INSTRING_WARN);
307
              if (! gfc_wide_fits_in_byte (c))
308
                {
309
                  gfc_error ("Invalid Hollerith constant at %L contains a "
310
                             "wide character", &old_loc);
311
                  goto cleanup;
312
                }
313
 
314
              e->representation.string[i] = (unsigned char) c;
315
            }
316
 
317
          /* Now pad with blanks and end with a null char.  */
318
          for (i = 0; i < pad; i++)
319
            e->representation.string[num + i] = ' ';
320
 
321
          e->representation.string[num + i] = '\0';
322
          e->representation.length = num + pad;
323
          e->ts.u.pad = pad;
324
 
325
          *result = e;
326
          return MATCH_YES;
327
        }
328
    }
329
 
330
  gfc_free_expr (e);
331
  gfc_current_locus = old_loc;
332
  return MATCH_NO;
333
 
334
cleanup:
335
  gfc_free_expr (e);
336
  return MATCH_ERROR;
337
}
338
 
339
 
340
/* Match a binary, octal or hexadecimal constant that can be found in
341
   a DATA statement.  The standard permits b'010...', o'73...', and
342
   z'a1...' where b, o, and z can be capital letters.  This function
343
   also accepts postfixed forms of the constants: '01...'b, '73...'o,
344
   and 'a1...'z.  An additional extension is the use of x for z.  */
345
 
346
static match
347
match_boz_constant (gfc_expr **result)
348
{
349
  int radix, length, x_hex, kind;
350
  locus old_loc, start_loc;
351
  char *buffer, post, delim;
352
  gfc_expr *e;
353
 
354
  start_loc = old_loc = gfc_current_locus;
355
  gfc_gobble_whitespace ();
356
 
357
  x_hex = 0;
358
  switch (post = gfc_next_ascii_char ())
359
    {
360
    case 'b':
361
      radix = 2;
362
      post = 0;
363
      break;
364
    case 'o':
365
      radix = 8;
366
      post = 0;
367
      break;
368
    case 'x':
369
      x_hex = 1;
370
      /* Fall through.  */
371
    case 'z':
372
      radix = 16;
373
      post = 0;
374
      break;
375
    case '\'':
376
      /* Fall through.  */
377
    case '\"':
378
      delim = post;
379
      post = 1;
380
      radix = 16;  /* Set to accept any valid digit string.  */
381
      break;
382
    default:
383
      goto backup;
384
    }
385
 
386
  /* No whitespace allowed here.  */
387
 
388
  if (post == 0)
389
    delim = gfc_next_ascii_char ();
390
 
391
  if (delim != '\'' && delim != '\"')
392
    goto backup;
393
 
394
  if (x_hex
395
      && (gfc_notify_std (GFC_STD_GNU, "Extension: Hexadecimal "
396
                          "constant at %C uses non-standard syntax")
397
          == FAILURE))
398
      return MATCH_ERROR;
399
 
400
  old_loc = gfc_current_locus;
401
 
402
  length = match_digits (0, radix, NULL);
403
  if (length == -1)
404
    {
405
      gfc_error ("Empty set of digits in BOZ constant at %C");
406
      return MATCH_ERROR;
407
    }
408
 
409
  if (gfc_next_ascii_char () != delim)
410
    {
411
      gfc_error ("Illegal character in BOZ constant at %C");
412
      return MATCH_ERROR;
413
    }
414
 
415
  if (post == 1)
416
    {
417
      switch (gfc_next_ascii_char ())
418
        {
419
        case 'b':
420
          radix = 2;
421
          break;
422
        case 'o':
423
          radix = 8;
424
          break;
425
        case 'x':
426
          /* Fall through.  */
427
        case 'z':
428
          radix = 16;
429
          break;
430
        default:
431
          goto backup;
432
        }
433
 
434
      if (gfc_notify_std (GFC_STD_GNU, "Extension: BOZ constant "
435
                          "at %C uses non-standard postfix syntax")
436
          == FAILURE)
437
        return MATCH_ERROR;
438
    }
439
 
440
  gfc_current_locus = old_loc;
441
 
442
  buffer = (char *) alloca (length + 1);
443
  memset (buffer, '\0', length + 1);
444
 
445
  match_digits (0, radix, buffer);
446
  gfc_next_ascii_char ();    /* Eat delimiter.  */
447
  if (post == 1)
448
    gfc_next_ascii_char ();  /* Eat postfixed b, o, z, or x.  */
449
 
450
  /* In section 5.2.5 and following C567 in the Fortran 2003 standard, we find
451
     "If a data-stmt-constant is a boz-literal-constant, the corresponding
452
     variable shall be of type integer.  The boz-literal-constant is treated
453
     as if it were an int-literal-constant with a kind-param that specifies
454
     the representation method with the largest decimal exponent range
455
     supported by the processor."  */
456
 
457
  kind = gfc_max_integer_kind;
458
  e = gfc_convert_integer (buffer, kind, radix, &gfc_current_locus);
459
 
460
  /* Mark as boz variable.  */
461
  e->is_boz = 1;
462
 
463
  if (gfc_range_check (e) != ARITH_OK)
464
    {
465
      gfc_error ("Integer too big for integer kind %i at %C", kind);
466
      gfc_free_expr (e);
467
      return MATCH_ERROR;
468
    }
469
 
470
  if (!gfc_in_match_data ()
471
      && (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: BOZ used outside a DATA "
472
                          "statement at %C")
473
          == FAILURE))
474
      return MATCH_ERROR;
475
 
476
  *result = e;
477
  return MATCH_YES;
478
 
479
backup:
480
  gfc_current_locus = start_loc;
481
  return MATCH_NO;
482
}
483
 
484
 
485
/* Match a real constant of some sort.  Allow a signed constant if signflag
486
   is nonzero.  */
487
 
488
static match
489
match_real_constant (gfc_expr **result, int signflag)
490
{
491
  int kind, count, seen_dp, seen_digits, is_iso_c;
492
  locus old_loc, temp_loc;
493
  char *p, *buffer, c, exp_char;
494
  gfc_expr *e;
495
  bool negate;
496
 
497
  old_loc = gfc_current_locus;
498
  gfc_gobble_whitespace ();
499
 
500
  e = NULL;
501
 
502
  count = 0;
503
  seen_dp = 0;
504
  seen_digits = 0;
505
  exp_char = ' ';
506
  negate = FALSE;
507
 
508
  c = gfc_next_ascii_char ();
509
  if (signflag && (c == '+' || c == '-'))
510
    {
511
      if (c == '-')
512
        negate = TRUE;
513
 
514
      gfc_gobble_whitespace ();
515
      c = gfc_next_ascii_char ();
516
    }
517
 
518
  /* Scan significand.  */
519
  for (;; c = gfc_next_ascii_char (), count++)
520
    {
521
      if (c == '.')
522
        {
523
          if (seen_dp)
524
            goto done;
525
 
526
          /* Check to see if "." goes with a following operator like
527
             ".eq.".  */
528
          temp_loc = gfc_current_locus;
529
          c = gfc_next_ascii_char ();
530
 
531
          if (c == 'e' || c == 'd' || c == 'q')
532
            {
533
              c = gfc_next_ascii_char ();
534
              if (c == '.')
535
                goto done;      /* Operator named .e. or .d.  */
536
            }
537
 
538
          if (ISALPHA (c))
539
            goto done;          /* Distinguish 1.e9 from 1.eq.2 */
540
 
541
          gfc_current_locus = temp_loc;
542
          seen_dp = 1;
543
          continue;
544
        }
545
 
546
      if (ISDIGIT (c))
547
        {
548
          seen_digits = 1;
549
          continue;
550
        }
551
 
552
      break;
553
    }
554
 
555
  if (!seen_digits || (c != 'e' && c != 'd' && c != 'q'))
556
    goto done;
557
  exp_char = c;
558
 
559
 
560
  if (c == 'q')
561
    {
562
      if (gfc_notify_std (GFC_STD_GNU, "Extension: exponent-letter 'q' in "
563
                         "real-literal-constant at %C") == FAILURE)
564
        return MATCH_ERROR;
565
      else if (gfc_option.warn_real_q_constant)
566
        gfc_warning("Extension: exponent-letter 'q' in real-literal-constant "
567
                    "at %C");
568
    }
569
 
570
  /* Scan exponent.  */
571
  c = gfc_next_ascii_char ();
572
  count++;
573
 
574
  if (c == '+' || c == '-')
575
    {                           /* optional sign */
576
      c = gfc_next_ascii_char ();
577
      count++;
578
    }
579
 
580
  if (!ISDIGIT (c))
581
    {
582
      gfc_error ("Missing exponent in real number at %C");
583
      return MATCH_ERROR;
584
    }
585
 
586
  while (ISDIGIT (c))
587
    {
588
      c = gfc_next_ascii_char ();
589
      count++;
590
    }
591
 
592
done:
593
  /* Check that we have a numeric constant.  */
594
  if (!seen_digits || (!seen_dp && exp_char == ' '))
595
    {
596
      gfc_current_locus = old_loc;
597
      return MATCH_NO;
598
    }
599
 
600
  /* Convert the number.  */
601
  gfc_current_locus = old_loc;
602
  gfc_gobble_whitespace ();
603
 
604
  buffer = (char *) alloca (count + 1);
605
  memset (buffer, '\0', count + 1);
606
 
607
  p = buffer;
608
  c = gfc_next_ascii_char ();
609
  if (c == '+' || c == '-')
610
    {
611
      gfc_gobble_whitespace ();
612
      c = gfc_next_ascii_char ();
613
    }
614
 
615
  /* Hack for mpfr_set_str().  */
616
  for (;;)
617
    {
618
      if (c == 'd' || c == 'q')
619
        *p = 'e';
620
      else
621
        *p = c;
622
      p++;
623
      if (--count == 0)
624
        break;
625
 
626
      c = gfc_next_ascii_char ();
627
    }
628
 
629
  kind = get_kind (&is_iso_c);
630
  if (kind == -1)
631
    goto cleanup;
632
 
633
  switch (exp_char)
634
    {
635
    case 'd':
636
      if (kind != -2)
637
        {
638
          gfc_error ("Real number at %C has a 'd' exponent and an explicit "
639
                     "kind");
640
          goto cleanup;
641
        }
642
      kind = gfc_default_double_kind;
643
 
644
      if (kind == 4)
645
        {
646
          if (gfc_option.flag_real4_kind == 8)
647
            kind = 8;
648
          if (gfc_option.flag_real4_kind == 10)
649
            kind = 10;
650
          if (gfc_option.flag_real4_kind == 16)
651
            kind = 16;
652
        }
653
 
654
      if (kind == 8)
655
        {
656
          if (gfc_option.flag_real8_kind == 4)
657
            kind = 4;
658
          if (gfc_option.flag_real8_kind == 10)
659
            kind = 10;
660
          if (gfc_option.flag_real8_kind == 16)
661
            kind = 16;
662
        }
663
      break;
664
 
665
    case 'q':
666
      if (kind != -2)
667
        {
668
          gfc_error ("Real number at %C has a 'q' exponent and an explicit "
669
                     "kind");
670
          goto cleanup;
671
        }
672
 
673
      /* The maximum possible real kind type parameter is 16.  First, try
674
         that for the kind, then fallback to trying kind=10 (Intel 80 bit)
675
         extended precision.  If neither value works, just given up.  */
676
      kind = 16;
677
      if (gfc_validate_kind (BT_REAL, kind, true) < 0)
678
        {
679
          kind = 10;
680
          if (gfc_validate_kind (BT_REAL, kind, true) < 0)
681
            {
682
              gfc_error ("Invalid exponent-letter 'q' in "
683
                         "real-literal-constant at %C");
684
              goto cleanup;
685
            }
686
        }
687
      break;
688
 
689
    default:
690
      if (kind == -2)
691
        kind = gfc_default_real_kind;
692
 
693
      if (kind == 4)
694
        {
695
          if (gfc_option.flag_real4_kind == 8)
696
            kind = 8;
697
          if (gfc_option.flag_real4_kind == 10)
698
            kind = 10;
699
          if (gfc_option.flag_real4_kind == 16)
700
            kind = 16;
701
        }
702
 
703
      if (kind == 8)
704
        {
705
          if (gfc_option.flag_real8_kind == 4)
706
            kind = 4;
707
          if (gfc_option.flag_real8_kind == 10)
708
            kind = 10;
709
          if (gfc_option.flag_real8_kind == 16)
710
            kind = 16;
711
        }
712
 
713
      if (gfc_validate_kind (BT_REAL, kind, true) < 0)
714
        {
715
          gfc_error ("Invalid real kind %d at %C", kind);
716
          goto cleanup;
717
        }
718
    }
719
 
720
  e = gfc_convert_real (buffer, kind, &gfc_current_locus);
721
  if (negate)
722
    mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
723
  e->ts.is_c_interop = is_iso_c;
724
 
725
  switch (gfc_range_check (e))
726
    {
727
    case ARITH_OK:
728
      break;
729
    case ARITH_OVERFLOW:
730
      gfc_error ("Real constant overflows its kind at %C");
731
      goto cleanup;
732
 
733
    case ARITH_UNDERFLOW:
734
      if (gfc_option.warn_underflow)
735
        gfc_warning ("Real constant underflows its kind at %C");
736
      mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
737
      break;
738
 
739
    default:
740
      gfc_internal_error ("gfc_range_check() returned bad value");
741
    }
742
 
743
  *result = e;
744
  return MATCH_YES;
745
 
746
cleanup:
747
  gfc_free_expr (e);
748
  return MATCH_ERROR;
749
}
750
 
751
 
752
/* Match a substring reference.  */
753
 
754
static match
755
match_substring (gfc_charlen *cl, int init, gfc_ref **result)
756
{
757
  gfc_expr *start, *end;
758
  locus old_loc;
759
  gfc_ref *ref;
760
  match m;
761
 
762
  start = NULL;
763
  end = NULL;
764
 
765
  old_loc = gfc_current_locus;
766
 
767
  m = gfc_match_char ('(');
768
  if (m != MATCH_YES)
769
    return MATCH_NO;
770
 
771
  if (gfc_match_char (':') != MATCH_YES)
772
    {
773
      if (init)
774
        m = gfc_match_init_expr (&start);
775
      else
776
        m = gfc_match_expr (&start);
777
 
778
      if (m != MATCH_YES)
779
        {
780
          m = MATCH_NO;
781
          goto cleanup;
782
        }
783
 
784
      m = gfc_match_char (':');
785
      if (m != MATCH_YES)
786
        goto cleanup;
787
    }
788
 
789
  if (gfc_match_char (')') != MATCH_YES)
790
    {
791
      if (init)
792
        m = gfc_match_init_expr (&end);
793
      else
794
        m = gfc_match_expr (&end);
795
 
796
      if (m == MATCH_NO)
797
        goto syntax;
798
      if (m == MATCH_ERROR)
799
        goto cleanup;
800
 
801
      m = gfc_match_char (')');
802
      if (m == MATCH_NO)
803
        goto syntax;
804
    }
805
 
806
  /* Optimize away the (:) reference.  */
807
  if (start == NULL && end == NULL)
808
    ref = NULL;
809
  else
810
    {
811
      ref = gfc_get_ref ();
812
 
813
      ref->type = REF_SUBSTRING;
814
      if (start == NULL)
815
        start = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
816
      ref->u.ss.start = start;
817
      if (end == NULL && cl)
818
        end = gfc_copy_expr (cl->length);
819
      ref->u.ss.end = end;
820
      ref->u.ss.length = cl;
821
    }
822
 
823
  *result = ref;
824
  return MATCH_YES;
825
 
826
syntax:
827
  gfc_error ("Syntax error in SUBSTRING specification at %C");
828
  m = MATCH_ERROR;
829
 
830
cleanup:
831
  gfc_free_expr (start);
832
  gfc_free_expr (end);
833
 
834
  gfc_current_locus = old_loc;
835
  return m;
836
}
837
 
838
 
839
/* Reads the next character of a string constant, taking care to
840
   return doubled delimiters on the input as a single instance of
841
   the delimiter.
842
 
843
   Special return values for "ret" argument are:
844
     -1   End of the string, as determined by the delimiter
845
     -2   Unterminated string detected
846
 
847
   Backslash codes are also expanded at this time.  */
848
 
849
static gfc_char_t
850
next_string_char (gfc_char_t delimiter, int *ret)
851
{
852
  locus old_locus;
853
  gfc_char_t c;
854
 
855
  c = gfc_next_char_literal (INSTRING_WARN);
856
  *ret = 0;
857
 
858
  if (c == '\n')
859
    {
860
      *ret = -2;
861
      return 0;
862
    }
863
 
864
  if (gfc_option.flag_backslash && c == '\\')
865
    {
866
      old_locus = gfc_current_locus;
867
 
868
      if (gfc_match_special_char (&c) == MATCH_NO)
869
        gfc_current_locus = old_locus;
870
 
871
      if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
872
        gfc_warning ("Extension: backslash character at %C");
873
    }
874
 
875
  if (c != delimiter)
876
    return c;
877
 
878
  old_locus = gfc_current_locus;
879
  c = gfc_next_char_literal (NONSTRING);
880
 
881
  if (c == delimiter)
882
    return c;
883
  gfc_current_locus = old_locus;
884
 
885
  *ret = -1;
886
  return 0;
887
}
888
 
889
 
890
/* Special case of gfc_match_name() that matches a parameter kind name
891
   before a string constant.  This takes case of the weird but legal
892
   case of:
893
 
894
     kind_____'string'
895
 
896
   where kind____ is a parameter. gfc_match_name() will happily slurp
897
   up all the underscores, which leads to problems.  If we return
898
   MATCH_YES, the parse pointer points to the final underscore, which
899
   is not part of the name.  We never return MATCH_ERROR-- errors in
900
   the name will be detected later.  */
901
 
902
static match
903
match_charkind_name (char *name)
904
{
905
  locus old_loc;
906
  char c, peek;
907
  int len;
908
 
909
  gfc_gobble_whitespace ();
910
  c = gfc_next_ascii_char ();
911
  if (!ISALPHA (c))
912
    return MATCH_NO;
913
 
914
  *name++ = c;
915
  len = 1;
916
 
917
  for (;;)
918
    {
919
      old_loc = gfc_current_locus;
920
      c = gfc_next_ascii_char ();
921
 
922
      if (c == '_')
923
        {
924
          peek = gfc_peek_ascii_char ();
925
 
926
          if (peek == '\'' || peek == '\"')
927
            {
928
              gfc_current_locus = old_loc;
929
              *name = '\0';
930
              return MATCH_YES;
931
            }
932
        }
933
 
934
      if (!ISALNUM (c)
935
          && c != '_'
936
          && (c != '$' || !gfc_option.flag_dollar_ok))
937
        break;
938
 
939
      *name++ = c;
940
      if (++len > GFC_MAX_SYMBOL_LEN)
941
        break;
942
    }
943
 
944
  return MATCH_NO;
945
}
946
 
947
 
948
/* See if the current input matches a character constant.  Lots of
949
   contortions have to be done to match the kind parameter which comes
950
   before the actual string.  The main consideration is that we don't
951
   want to error out too quickly.  For example, we don't actually do
952
   any validation of the kinds until we have actually seen a legal
953
   delimiter.  Using match_kind_param() generates errors too quickly.  */
954
 
955
static match
956
match_string_constant (gfc_expr **result)
957
{
958
  char name[GFC_MAX_SYMBOL_LEN + 1], peek;
959
  int i, kind, length, warn_ampersand, ret;
960
  locus old_locus, start_locus;
961
  gfc_symbol *sym;
962
  gfc_expr *e;
963
  const char *q;
964
  match m;
965
  gfc_char_t c, delimiter, *p;
966
 
967
  old_locus = gfc_current_locus;
968
 
969
  gfc_gobble_whitespace ();
970
 
971
  c = gfc_next_char ();
972
  if (c == '\'' || c == '"')
973
    {
974
      kind = gfc_default_character_kind;
975
      start_locus = gfc_current_locus;
976
      goto got_delim;
977
    }
978
 
979
  if (gfc_wide_is_digit (c))
980
    {
981
      kind = 0;
982
 
983
      while (gfc_wide_is_digit (c))
984
        {
985
          kind = kind * 10 + c - '0';
986
          if (kind > 9999999)
987
            goto no_match;
988
          c = gfc_next_char ();
989
        }
990
 
991
    }
992
  else
993
    {
994
      gfc_current_locus = old_locus;
995
 
996
      m = match_charkind_name (name);
997
      if (m != MATCH_YES)
998
        goto no_match;
999
 
1000
      if (gfc_find_symbol (name, NULL, 1, &sym)
1001
          || sym == NULL
1002
          || sym->attr.flavor != FL_PARAMETER)
1003
        goto no_match;
1004
 
1005
      kind = -1;
1006
      c = gfc_next_char ();
1007
    }
1008
 
1009
  if (c == ' ')
1010
    {
1011
      gfc_gobble_whitespace ();
1012
      c = gfc_next_char ();
1013
    }
1014
 
1015
  if (c != '_')
1016
    goto no_match;
1017
 
1018
  gfc_gobble_whitespace ();
1019
 
1020
  c = gfc_next_char ();
1021
  if (c != '\'' && c != '"')
1022
    goto no_match;
1023
 
1024
  start_locus = gfc_current_locus;
1025
 
1026
  if (kind == -1)
1027
    {
1028
      q = gfc_extract_int (sym->value, &kind);
1029
      if (q != NULL)
1030
        {
1031
          gfc_error (q);
1032
          return MATCH_ERROR;
1033
        }
1034
      gfc_set_sym_referenced (sym);
1035
    }
1036
 
1037
  if (gfc_validate_kind (BT_CHARACTER, kind, true) < 0)
1038
    {
1039
      gfc_error ("Invalid kind %d for CHARACTER constant at %C", kind);
1040
      return MATCH_ERROR;
1041
    }
1042
 
1043
got_delim:
1044
  /* Scan the string into a block of memory by first figuring out how
1045
     long it is, allocating the structure, then re-reading it.  This
1046
     isn't particularly efficient, but string constants aren't that
1047
     common in most code.  TODO: Use obstacks?  */
1048
 
1049
  delimiter = c;
1050
  length = 0;
1051
 
1052
  for (;;)
1053
    {
1054
      c = next_string_char (delimiter, &ret);
1055
      if (ret == -1)
1056
        break;
1057
      if (ret == -2)
1058
        {
1059
          gfc_current_locus = start_locus;
1060
          gfc_error ("Unterminated character constant beginning at %C");
1061
          return MATCH_ERROR;
1062
        }
1063
 
1064
      length++;
1065
    }
1066
 
1067
  /* Peek at the next character to see if it is a b, o, z, or x for the
1068
     postfixed BOZ literal constants.  */
1069
  peek = gfc_peek_ascii_char ();
1070
  if (peek == 'b' || peek == 'o' || peek =='z' || peek == 'x')
1071
    goto no_match;
1072
 
1073
  e = gfc_get_character_expr (kind, &start_locus, NULL, length);
1074
 
1075
  gfc_current_locus = start_locus;
1076
 
1077
  /* We disable the warning for the following loop as the warning has already
1078
     been printed in the loop above.  */
1079
  warn_ampersand = gfc_option.warn_ampersand;
1080
  gfc_option.warn_ampersand = 0;
1081
 
1082
  p = e->value.character.string;
1083
  for (i = 0; i < length; i++)
1084
    {
1085
      c = next_string_char (delimiter, &ret);
1086
 
1087
      if (!gfc_check_character_range (c, kind))
1088
        {
1089
          gfc_error ("Character '%s' in string at %C is not representable "
1090
                     "in character kind %d", gfc_print_wide_char (c), kind);
1091
          return MATCH_ERROR;
1092
        }
1093
 
1094
      *p++ = c;
1095
    }
1096
 
1097
  *p = '\0';    /* TODO: C-style string is for development/debug purposes.  */
1098
  gfc_option.warn_ampersand = warn_ampersand;
1099
 
1100
  next_string_char (delimiter, &ret);
1101
  if (ret != -1)
1102
    gfc_internal_error ("match_string_constant(): Delimiter not found");
1103
 
1104
  if (match_substring (NULL, 0, &e->ref) != MATCH_NO)
1105
    e->expr_type = EXPR_SUBSTRING;
1106
 
1107
  *result = e;
1108
 
1109
  return MATCH_YES;
1110
 
1111
no_match:
1112
  gfc_current_locus = old_locus;
1113
  return MATCH_NO;
1114
}
1115
 
1116
 
1117
/* Match a .true. or .false.  Returns 1 if a .true. was found,
1118
 
1119
static int
1120
match_logical_constant_string (void)
1121
{
1122
  locus orig_loc = gfc_current_locus;
1123
 
1124
  gfc_gobble_whitespace ();
1125
  if (gfc_next_ascii_char () == '.')
1126
    {
1127
      char ch = gfc_next_ascii_char ();
1128
      if (ch == 'f')
1129
        {
1130
          if (gfc_next_ascii_char () == 'a'
1131
              && gfc_next_ascii_char () == 'l'
1132
              && gfc_next_ascii_char () == 's'
1133
              && gfc_next_ascii_char () == 'e'
1134
              && gfc_next_ascii_char () == '.')
1135
            /* Matched ".false.".  */
1136
            return 0;
1137
        }
1138
      else if (ch == 't')
1139
        {
1140
          if (gfc_next_ascii_char () == 'r'
1141
              && gfc_next_ascii_char () == 'u'
1142
              && gfc_next_ascii_char () == 'e'
1143
              && gfc_next_ascii_char () == '.')
1144
            /* Matched ".true.".  */
1145
            return 1;
1146
        }
1147
    }
1148
  gfc_current_locus = orig_loc;
1149
  return -1;
1150
}
1151
 
1152
/* Match a .true. or .false.  */
1153
 
1154
static match
1155
match_logical_constant (gfc_expr **result)
1156
{
1157
  gfc_expr *e;
1158
  int i, kind, is_iso_c;
1159
 
1160
  i = match_logical_constant_string ();
1161
  if (i == -1)
1162
    return MATCH_NO;
1163
 
1164
  kind = get_kind (&is_iso_c);
1165
  if (kind == -1)
1166
    return MATCH_ERROR;
1167
  if (kind == -2)
1168
    kind = gfc_default_logical_kind;
1169
 
1170
  if (gfc_validate_kind (BT_LOGICAL, kind, true) < 0)
1171
    {
1172
      gfc_error ("Bad kind for logical constant at %C");
1173
      return MATCH_ERROR;
1174
    }
1175
 
1176
  e = gfc_get_logical_expr (kind, &gfc_current_locus, i);
1177
  e->ts.is_c_interop = is_iso_c;
1178
 
1179
  *result = e;
1180
  return MATCH_YES;
1181
}
1182
 
1183
 
1184
/* Match a real or imaginary part of a complex constant that is a
1185
   symbolic constant.  */
1186
 
1187
static match
1188
match_sym_complex_part (gfc_expr **result)
1189
{
1190
  char name[GFC_MAX_SYMBOL_LEN + 1];
1191
  gfc_symbol *sym;
1192
  gfc_expr *e;
1193
  match m;
1194
 
1195
  m = gfc_match_name (name);
1196
  if (m != MATCH_YES)
1197
    return m;
1198
 
1199
  if (gfc_find_symbol (name, NULL, 1, &sym) || sym == NULL)
1200
    return MATCH_NO;
1201
 
1202
  if (sym->attr.flavor != FL_PARAMETER)
1203
    {
1204
      gfc_error ("Expected PARAMETER symbol in complex constant at %C");
1205
      return MATCH_ERROR;
1206
    }
1207
 
1208
  if (!gfc_numeric_ts (&sym->value->ts))
1209
    {
1210
      gfc_error ("Numeric PARAMETER required in complex constant at %C");
1211
      return MATCH_ERROR;
1212
    }
1213
 
1214
  if (sym->value->rank != 0)
1215
    {
1216
      gfc_error ("Scalar PARAMETER required in complex constant at %C");
1217
      return MATCH_ERROR;
1218
    }
1219
 
1220
  if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PARAMETER symbol in "
1221
                      "complex constant at %C") == FAILURE)
1222
    return MATCH_ERROR;
1223
 
1224
  switch (sym->value->ts.type)
1225
    {
1226
    case BT_REAL:
1227
      e = gfc_copy_expr (sym->value);
1228
      break;
1229
 
1230
    case BT_COMPLEX:
1231
      e = gfc_complex2real (sym->value, sym->value->ts.kind);
1232
      if (e == NULL)
1233
        goto error;
1234
      break;
1235
 
1236
    case BT_INTEGER:
1237
      e = gfc_int2real (sym->value, gfc_default_real_kind);
1238
      if (e == NULL)
1239
        goto error;
1240
      break;
1241
 
1242
    default:
1243
      gfc_internal_error ("gfc_match_sym_complex_part(): Bad type");
1244
    }
1245
 
1246
  *result = e;          /* e is a scalar, real, constant expression.  */
1247
  return MATCH_YES;
1248
 
1249
error:
1250
  gfc_error ("Error converting PARAMETER constant in complex constant at %C");
1251
  return MATCH_ERROR;
1252
}
1253
 
1254
 
1255
/* Match a real or imaginary part of a complex number.  */
1256
 
1257
static match
1258
match_complex_part (gfc_expr **result)
1259
{
1260
  match m;
1261
 
1262
  m = match_sym_complex_part (result);
1263
  if (m != MATCH_NO)
1264
    return m;
1265
 
1266
  m = match_real_constant (result, 1);
1267
  if (m != MATCH_NO)
1268
    return m;
1269
 
1270
  return match_integer_constant (result, 1);
1271
}
1272
 
1273
 
1274
/* Try to match a complex constant.  */
1275
 
1276
static match
1277
match_complex_constant (gfc_expr **result)
1278
{
1279
  gfc_expr *e, *real, *imag;
1280
  gfc_error_buf old_error;
1281
  gfc_typespec target;
1282
  locus old_loc;
1283
  int kind;
1284
  match m;
1285
 
1286
  old_loc = gfc_current_locus;
1287
  real = imag = e = NULL;
1288
 
1289
  m = gfc_match_char ('(');
1290
  if (m != MATCH_YES)
1291
    return m;
1292
 
1293
  gfc_push_error (&old_error);
1294
 
1295
  m = match_complex_part (&real);
1296
  if (m == MATCH_NO)
1297
    {
1298
      gfc_free_error (&old_error);
1299
      goto cleanup;
1300
    }
1301
 
1302
  if (gfc_match_char (',') == MATCH_NO)
1303
    {
1304
      gfc_pop_error (&old_error);
1305
      m = MATCH_NO;
1306
      goto cleanup;
1307
    }
1308
 
1309
  /* If m is error, then something was wrong with the real part and we
1310
     assume we have a complex constant because we've seen the ','.  An
1311
     ambiguous case here is the start of an iterator list of some
1312
     sort. These sort of lists are matched prior to coming here.  */
1313
 
1314
  if (m == MATCH_ERROR)
1315
    {
1316
      gfc_free_error (&old_error);
1317
      goto cleanup;
1318
    }
1319
  gfc_pop_error (&old_error);
1320
 
1321
  m = match_complex_part (&imag);
1322
  if (m == MATCH_NO)
1323
    goto syntax;
1324
  if (m == MATCH_ERROR)
1325
    goto cleanup;
1326
 
1327
  m = gfc_match_char (')');
1328
  if (m == MATCH_NO)
1329
    {
1330
      /* Give the matcher for implied do-loops a chance to run.  This
1331
         yields a much saner error message for (/ (i, 4=i, 6) /).  */
1332
      if (gfc_peek_ascii_char () == '=')
1333
        {
1334
          m = MATCH_ERROR;
1335
          goto cleanup;
1336
        }
1337
      else
1338
    goto syntax;
1339
    }
1340
 
1341
  if (m == MATCH_ERROR)
1342
    goto cleanup;
1343
 
1344
  /* Decide on the kind of this complex number.  */
1345
  if (real->ts.type == BT_REAL)
1346
    {
1347
      if (imag->ts.type == BT_REAL)
1348
        kind = gfc_kind_max (real, imag);
1349
      else
1350
        kind = real->ts.kind;
1351
    }
1352
  else
1353
    {
1354
      if (imag->ts.type == BT_REAL)
1355
        kind = imag->ts.kind;
1356
      else
1357
        kind = gfc_default_real_kind;
1358
    }
1359
  gfc_clear_ts (&target);
1360
  target.type = BT_REAL;
1361
  target.kind = kind;
1362
 
1363
  if (real->ts.type != BT_REAL || kind != real->ts.kind)
1364
    gfc_convert_type (real, &target, 2);
1365
  if (imag->ts.type != BT_REAL || kind != imag->ts.kind)
1366
    gfc_convert_type (imag, &target, 2);
1367
 
1368
  e = gfc_convert_complex (real, imag, kind);
1369
  e->where = gfc_current_locus;
1370
 
1371
  gfc_free_expr (real);
1372
  gfc_free_expr (imag);
1373
 
1374
  *result = e;
1375
  return MATCH_YES;
1376
 
1377
syntax:
1378
  gfc_error ("Syntax error in COMPLEX constant at %C");
1379
  m = MATCH_ERROR;
1380
 
1381
cleanup:
1382
  gfc_free_expr (e);
1383
  gfc_free_expr (real);
1384
  gfc_free_expr (imag);
1385
  gfc_current_locus = old_loc;
1386
 
1387
  return m;
1388
}
1389
 
1390
 
1391
/* Match constants in any of several forms.  Returns nonzero for a
1392
   match, zero for no match.  */
1393
 
1394
match
1395
gfc_match_literal_constant (gfc_expr **result, int signflag)
1396
{
1397
  match m;
1398
 
1399
  m = match_complex_constant (result);
1400
  if (m != MATCH_NO)
1401
    return m;
1402
 
1403
  m = match_string_constant (result);
1404
  if (m != MATCH_NO)
1405
    return m;
1406
 
1407
  m = match_boz_constant (result);
1408
  if (m != MATCH_NO)
1409
    return m;
1410
 
1411
  m = match_real_constant (result, signflag);
1412
  if (m != MATCH_NO)
1413
    return m;
1414
 
1415
  m = match_hollerith_constant (result);
1416
  if (m != MATCH_NO)
1417
    return m;
1418
 
1419
  m = match_integer_constant (result, signflag);
1420
  if (m != MATCH_NO)
1421
    return m;
1422
 
1423
  m = match_logical_constant (result);
1424
  if (m != MATCH_NO)
1425
    return m;
1426
 
1427
  return MATCH_NO;
1428
}
1429
 
1430
 
1431
/* This checks if a symbol is the return value of an encompassing function.
1432
   Function nesting can be maximally two levels deep, but we may have
1433
   additional local namespaces like BLOCK etc.  */
1434
 
1435
bool
1436
gfc_is_function_return_value (gfc_symbol *sym, gfc_namespace *ns)
1437
{
1438
  if (!sym->attr.function || (sym->result != sym))
1439
    return false;
1440
  while (ns)
1441
    {
1442
      if (ns->proc_name == sym)
1443
        return true;
1444
      ns = ns->parent;
1445
    }
1446
  return false;
1447
}
1448
 
1449
 
1450
/* Match a single actual argument value.  An actual argument is
1451
   usually an expression, but can also be a procedure name.  If the
1452
   argument is a single name, it is not always possible to tell
1453
   whether the name is a dummy procedure or not.  We treat these cases
1454
   by creating an argument that looks like a dummy procedure and
1455
   fixing things later during resolution.  */
1456
 
1457
static match
1458
match_actual_arg (gfc_expr **result)
1459
{
1460
  char name[GFC_MAX_SYMBOL_LEN + 1];
1461
  gfc_symtree *symtree;
1462
  locus where, w;
1463
  gfc_expr *e;
1464
  char c;
1465
 
1466
  gfc_gobble_whitespace ();
1467
  where = gfc_current_locus;
1468
 
1469
  switch (gfc_match_name (name))
1470
    {
1471
    case MATCH_ERROR:
1472
      return MATCH_ERROR;
1473
 
1474
    case MATCH_NO:
1475
      break;
1476
 
1477
    case MATCH_YES:
1478
      w = gfc_current_locus;
1479
      gfc_gobble_whitespace ();
1480
      c = gfc_next_ascii_char ();
1481
      gfc_current_locus = w;
1482
 
1483
      if (c != ',' && c != ')')
1484
        break;
1485
 
1486
      if (gfc_find_sym_tree (name, NULL, 1, &symtree))
1487
        break;
1488
      /* Handle error elsewhere.  */
1489
 
1490
      /* Eliminate a couple of common cases where we know we don't
1491
         have a function argument.  */
1492
      if (symtree == NULL)
1493
        {
1494
          gfc_get_sym_tree (name, NULL, &symtree, false);
1495
          gfc_set_sym_referenced (symtree->n.sym);
1496
        }
1497
      else
1498
        {
1499
          gfc_symbol *sym;
1500
 
1501
          sym = symtree->n.sym;
1502
          gfc_set_sym_referenced (sym);
1503
          if (sym->attr.flavor != FL_PROCEDURE
1504
              && sym->attr.flavor != FL_UNKNOWN)
1505
            break;
1506
 
1507
          if (sym->attr.in_common && !sym->attr.proc_pointer)
1508
            {
1509
              gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name,
1510
                              &sym->declared_at);
1511
              break;
1512
            }
1513
 
1514
          /* If the symbol is a function with itself as the result and
1515
             is being defined, then we have a variable.  */
1516
          if (sym->attr.function && sym->result == sym)
1517
            {
1518
              if (gfc_is_function_return_value (sym, gfc_current_ns))
1519
                break;
1520
 
1521
              if (sym->attr.entry
1522
                  && (sym->ns == gfc_current_ns
1523
                      || sym->ns == gfc_current_ns->parent))
1524
                {
1525
                  gfc_entry_list *el = NULL;
1526
 
1527
                  for (el = sym->ns->entries; el; el = el->next)
1528
                    if (sym == el->sym)
1529
                      break;
1530
 
1531
                  if (el)
1532
                    break;
1533
                }
1534
            }
1535
        }
1536
 
1537
      e = gfc_get_expr ();      /* Leave it unknown for now */
1538
      e->symtree = symtree;
1539
      e->expr_type = EXPR_VARIABLE;
1540
      e->ts.type = BT_PROCEDURE;
1541
      e->where = where;
1542
 
1543
      *result = e;
1544
      return MATCH_YES;
1545
    }
1546
 
1547
  gfc_current_locus = where;
1548
  return gfc_match_expr (result);
1549
}
1550
 
1551
 
1552
/* Match a keyword argument.  */
1553
 
1554
static match
1555
match_keyword_arg (gfc_actual_arglist *actual, gfc_actual_arglist *base)
1556
{
1557
  char name[GFC_MAX_SYMBOL_LEN + 1];
1558
  gfc_actual_arglist *a;
1559
  locus name_locus;
1560
  match m;
1561
 
1562
  name_locus = gfc_current_locus;
1563
  m = gfc_match_name (name);
1564
 
1565
  if (m != MATCH_YES)
1566
    goto cleanup;
1567
  if (gfc_match_char ('=') != MATCH_YES)
1568
    {
1569
      m = MATCH_NO;
1570
      goto cleanup;
1571
    }
1572
 
1573
  m = match_actual_arg (&actual->expr);
1574
  if (m != MATCH_YES)
1575
    goto cleanup;
1576
 
1577
  /* Make sure this name has not appeared yet.  */
1578
 
1579
  if (name[0] != '\0')
1580
    {
1581
      for (a = base; a; a = a->next)
1582
        if (a->name != NULL && strcmp (a->name, name) == 0)
1583
          {
1584
            gfc_error ("Keyword '%s' at %C has already appeared in the "
1585
                       "current argument list", name);
1586
            return MATCH_ERROR;
1587
          }
1588
    }
1589
 
1590
  actual->name = gfc_get_string (name);
1591
  return MATCH_YES;
1592
 
1593
cleanup:
1594
  gfc_current_locus = name_locus;
1595
  return m;
1596
}
1597
 
1598
 
1599
/* Match an argument list function, such as %VAL.  */
1600
 
1601
static match
1602
match_arg_list_function (gfc_actual_arglist *result)
1603
{
1604
  char name[GFC_MAX_SYMBOL_LEN + 1];
1605
  locus old_locus;
1606
  match m;
1607
 
1608
  old_locus = gfc_current_locus;
1609
 
1610
  if (gfc_match_char ('%') != MATCH_YES)
1611
    {
1612
      m = MATCH_NO;
1613
      goto cleanup;
1614
    }
1615
 
1616
  m = gfc_match ("%n (", name);
1617
  if (m != MATCH_YES)
1618
    goto cleanup;
1619
 
1620
  if (name[0] != '\0')
1621
    {
1622
      switch (name[0])
1623
        {
1624
        case 'l':
1625
          if (strncmp (name, "loc", 3) == 0)
1626
            {
1627
              result->name = "%LOC";
1628
              break;
1629
            }
1630
        case 'r':
1631
          if (strncmp (name, "ref", 3) == 0)
1632
            {
1633
              result->name = "%REF";
1634
              break;
1635
            }
1636
        case 'v':
1637
          if (strncmp (name, "val", 3) == 0)
1638
            {
1639
              result->name = "%VAL";
1640
              break;
1641
            }
1642
        default:
1643
          m = MATCH_ERROR;
1644
          goto cleanup;
1645
        }
1646
    }
1647
 
1648
  if (gfc_notify_std (GFC_STD_GNU, "Extension: argument list "
1649
                      "function at %C") == FAILURE)
1650
    {
1651
      m = MATCH_ERROR;
1652
      goto cleanup;
1653
    }
1654
 
1655
  m = match_actual_arg (&result->expr);
1656
  if (m != MATCH_YES)
1657
    goto cleanup;
1658
 
1659
  if (gfc_match_char (')') != MATCH_YES)
1660
    {
1661
      m = MATCH_NO;
1662
      goto cleanup;
1663
    }
1664
 
1665
  return MATCH_YES;
1666
 
1667
cleanup:
1668
  gfc_current_locus = old_locus;
1669
  return m;
1670
}
1671
 
1672
 
1673
/* Matches an actual argument list of a function or subroutine, from
1674
   the opening parenthesis to the closing parenthesis.  The argument
1675
   list is assumed to allow keyword arguments because we don't know if
1676
   the symbol associated with the procedure has an implicit interface
1677
   or not.  We make sure keywords are unique. If sub_flag is set,
1678
   we're matching the argument list of a subroutine.  */
1679
 
1680
match
1681
gfc_match_actual_arglist (int sub_flag, gfc_actual_arglist **argp)
1682
{
1683
  gfc_actual_arglist *head, *tail;
1684
  int seen_keyword;
1685
  gfc_st_label *label;
1686
  locus old_loc;
1687
  match m;
1688
 
1689
  *argp = tail = NULL;
1690
  old_loc = gfc_current_locus;
1691
 
1692
  seen_keyword = 0;
1693
 
1694
  if (gfc_match_char ('(') == MATCH_NO)
1695
    return (sub_flag) ? MATCH_YES : MATCH_NO;
1696
 
1697
  if (gfc_match_char (')') == MATCH_YES)
1698
    return MATCH_YES;
1699
  head = NULL;
1700
 
1701
  matching_actual_arglist++;
1702
 
1703
  for (;;)
1704
    {
1705
      if (head == NULL)
1706
        head = tail = gfc_get_actual_arglist ();
1707
      else
1708
        {
1709
          tail->next = gfc_get_actual_arglist ();
1710
          tail = tail->next;
1711
        }
1712
 
1713
      if (sub_flag && gfc_match_char ('*') == MATCH_YES)
1714
        {
1715
          m = gfc_match_st_label (&label);
1716
          if (m == MATCH_NO)
1717
            gfc_error ("Expected alternate return label at %C");
1718
          if (m != MATCH_YES)
1719
            goto cleanup;
1720
 
1721
          tail->label = label;
1722
          goto next;
1723
        }
1724
 
1725
      /* After the first keyword argument is seen, the following
1726
         arguments must also have keywords.  */
1727
      if (seen_keyword)
1728
        {
1729
          m = match_keyword_arg (tail, head);
1730
 
1731
          if (m == MATCH_ERROR)
1732
            goto cleanup;
1733
          if (m == MATCH_NO)
1734
            {
1735
              gfc_error ("Missing keyword name in actual argument list at %C");
1736
              goto cleanup;
1737
            }
1738
 
1739
        }
1740
      else
1741
        {
1742
          /* Try an argument list function, like %VAL.  */
1743
          m = match_arg_list_function (tail);
1744
          if (m == MATCH_ERROR)
1745
            goto cleanup;
1746
 
1747
          /* See if we have the first keyword argument.  */
1748
          if (m == MATCH_NO)
1749
            {
1750
              m = match_keyword_arg (tail, head);
1751
              if (m == MATCH_YES)
1752
                seen_keyword = 1;
1753
              if (m == MATCH_ERROR)
1754
                goto cleanup;
1755
            }
1756
 
1757
          if (m == MATCH_NO)
1758
            {
1759
              /* Try for a non-keyword argument.  */
1760
              m = match_actual_arg (&tail->expr);
1761
              if (m == MATCH_ERROR)
1762
                goto cleanup;
1763
              if (m == MATCH_NO)
1764
                goto syntax;
1765
            }
1766
        }
1767
 
1768
 
1769
    next:
1770
      if (gfc_match_char (')') == MATCH_YES)
1771
        break;
1772
      if (gfc_match_char (',') != MATCH_YES)
1773
        goto syntax;
1774
    }
1775
 
1776
  *argp = head;
1777
  matching_actual_arglist--;
1778
  return MATCH_YES;
1779
 
1780
syntax:
1781
  gfc_error ("Syntax error in argument list at %C");
1782
 
1783
cleanup:
1784
  gfc_free_actual_arglist (head);
1785
  gfc_current_locus = old_loc;
1786
  matching_actual_arglist--;
1787
  return MATCH_ERROR;
1788
}
1789
 
1790
 
1791
/* Used by gfc_match_varspec() to extend the reference list by one
1792
   element.  */
1793
 
1794
static gfc_ref *
1795
extend_ref (gfc_expr *primary, gfc_ref *tail)
1796
{
1797
  if (primary->ref == NULL)
1798
    primary->ref = tail = gfc_get_ref ();
1799
  else
1800
    {
1801
      if (tail == NULL)
1802
        gfc_internal_error ("extend_ref(): Bad tail");
1803
      tail->next = gfc_get_ref ();
1804
      tail = tail->next;
1805
    }
1806
 
1807
  return tail;
1808
}
1809
 
1810
 
1811
/* Match any additional specifications associated with the current
1812
   variable like member references or substrings.  If equiv_flag is
1813
   set we only match stuff that is allowed inside an EQUIVALENCE
1814
   statement.  sub_flag tells whether we expect a type-bound procedure found
1815
   to be a subroutine as part of CALL or a FUNCTION. For procedure pointer
1816
   components, 'ppc_arg' determines whether the PPC may be called (with an
1817
   argument list), or whether it may just be referred to as a pointer.  */
1818
 
1819
match
1820
gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
1821
                   bool ppc_arg)
1822
{
1823
  char name[GFC_MAX_SYMBOL_LEN + 1];
1824
  gfc_ref *substring, *tail;
1825
  gfc_component *component;
1826
  gfc_symbol *sym = primary->symtree->n.sym;
1827
  match m;
1828
  bool unknown;
1829
 
1830
  tail = NULL;
1831
 
1832
  gfc_gobble_whitespace ();
1833
 
1834
  if (gfc_peek_ascii_char () == '[')
1835
    {
1836
      if ((sym->ts.type != BT_CLASS && sym->attr.dimension)
1837
          || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
1838
              && CLASS_DATA (sym)->attr.dimension))
1839
        {
1840
          gfc_error ("Array section designator, e.g. '(:)', is required "
1841
                     "besides the coarray designator '[...]' at %C");
1842
          return MATCH_ERROR;
1843
        }
1844
      if ((sym->ts.type != BT_CLASS && !sym->attr.codimension)
1845
          || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
1846
              && !CLASS_DATA (sym)->attr.codimension))
1847
        {
1848
          gfc_error ("Coarray designator at %C but '%s' is not a coarray",
1849
                     sym->name);
1850
          return MATCH_ERROR;
1851
        }
1852
    }
1853
 
1854
  /* For associate names, we may not yet know whether they are arrays or not.
1855
     Thus if we have one and parentheses follow, we have to assume that it
1856
     actually is one for now.  The final decision will be made at
1857
     resolution time, of course.  */
1858
  if (sym->assoc && gfc_peek_ascii_char () == '(')
1859
    sym->attr.dimension = 1;
1860
 
1861
  if ((equiv_flag && gfc_peek_ascii_char () == '(')
1862
      || gfc_peek_ascii_char () == '[' || sym->attr.codimension
1863
      || (sym->attr.dimension && sym->ts.type != BT_CLASS
1864
          && !sym->attr.proc_pointer && !gfc_is_proc_ptr_comp (primary, NULL)
1865
          && !(gfc_matching_procptr_assignment
1866
               && sym->attr.flavor == FL_PROCEDURE))
1867
      || (sym->ts.type == BT_CLASS && sym->attr.class_ok
1868
          && (CLASS_DATA (sym)->attr.dimension
1869
              || CLASS_DATA (sym)->attr.codimension)))
1870
    {
1871
      gfc_array_spec *as;
1872
 
1873
      tail = extend_ref (primary, tail);
1874
      tail->type = REF_ARRAY;
1875
 
1876
      /* In EQUIVALENCE, we don't know yet whether we are seeing
1877
         an array, character variable or array of character
1878
         variables.  We'll leave the decision till resolve time.  */
1879
 
1880
      if (equiv_flag)
1881
        as = NULL;
1882
      else if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
1883
        as = CLASS_DATA (sym)->as;
1884
      else
1885
        as = sym->as;
1886
 
1887
      m = gfc_match_array_ref (&tail->u.ar, as, equiv_flag,
1888
                               as ? as->corank : 0);
1889
      if (m != MATCH_YES)
1890
        return m;
1891
 
1892
      gfc_gobble_whitespace ();
1893
      if (equiv_flag && gfc_peek_ascii_char () == '(')
1894
        {
1895
          tail = extend_ref (primary, tail);
1896
          tail->type = REF_ARRAY;
1897
 
1898
          m = gfc_match_array_ref (&tail->u.ar, NULL, equiv_flag, 0);
1899
          if (m != MATCH_YES)
1900
            return m;
1901
        }
1902
    }
1903
 
1904
  primary->ts = sym->ts;
1905
 
1906
  if (equiv_flag)
1907
    return MATCH_YES;
1908
 
1909
  if (sym->ts.type == BT_UNKNOWN && gfc_peek_ascii_char () == '%'
1910
      && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
1911
    gfc_set_default_type (sym, 0, sym->ns);
1912
 
1913
  if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
1914
      || gfc_match_char ('%') != MATCH_YES)
1915
    goto check_substring;
1916
 
1917
  sym = sym->ts.u.derived;
1918
 
1919
  for (;;)
1920
    {
1921
      gfc_try t;
1922
      gfc_symtree *tbp;
1923
 
1924
      m = gfc_match_name (name);
1925
      if (m == MATCH_NO)
1926
        gfc_error ("Expected structure component name at %C");
1927
      if (m != MATCH_YES)
1928
        return MATCH_ERROR;
1929
 
1930
      if (sym->f2k_derived)
1931
        tbp = gfc_find_typebound_proc (sym, &t, name, false, &gfc_current_locus);
1932
      else
1933
        tbp = NULL;
1934
 
1935
      if (tbp)
1936
        {
1937
          gfc_symbol* tbp_sym;
1938
 
1939
          if (t == FAILURE)
1940
            return MATCH_ERROR;
1941
 
1942
          gcc_assert (!tail || !tail->next);
1943
          gcc_assert (primary->expr_type == EXPR_VARIABLE
1944
                      || (primary->expr_type == EXPR_STRUCTURE
1945
                          && primary->symtree && primary->symtree->n.sym
1946
                          && primary->symtree->n.sym->attr.flavor));
1947
 
1948
          if (tbp->n.tb->is_generic)
1949
            tbp_sym = NULL;
1950
          else
1951
            tbp_sym = tbp->n.tb->u.specific->n.sym;
1952
 
1953
          primary->expr_type = EXPR_COMPCALL;
1954
          primary->value.compcall.tbp = tbp->n.tb;
1955
          primary->value.compcall.name = tbp->name;
1956
          primary->value.compcall.ignore_pass = 0;
1957
          primary->value.compcall.assign = 0;
1958
          primary->value.compcall.base_object = NULL;
1959
          gcc_assert (primary->symtree->n.sym->attr.referenced);
1960
          if (tbp_sym)
1961
            primary->ts = tbp_sym->ts;
1962
 
1963
          m = gfc_match_actual_arglist (tbp->n.tb->subroutine,
1964
                                        &primary->value.compcall.actual);
1965
          if (m == MATCH_ERROR)
1966
            return MATCH_ERROR;
1967
          if (m == MATCH_NO)
1968
            {
1969
              if (sub_flag)
1970
                primary->value.compcall.actual = NULL;
1971
              else
1972
                {
1973
                  gfc_error ("Expected argument list at %C");
1974
                  return MATCH_ERROR;
1975
                }
1976
            }
1977
 
1978
          break;
1979
        }
1980
 
1981
      component = gfc_find_component (sym, name, false, false);
1982
      if (component == NULL)
1983
        return MATCH_ERROR;
1984
 
1985
      tail = extend_ref (primary, tail);
1986
      tail->type = REF_COMPONENT;
1987
 
1988
      tail->u.c.component = component;
1989
      tail->u.c.sym = sym;
1990
 
1991
      primary->ts = component->ts;
1992
 
1993
      if (component->attr.proc_pointer && ppc_arg
1994
          && !gfc_matching_procptr_assignment)
1995
        {
1996
          /* Procedure pointer component call: Look for argument list.  */
1997
          m = gfc_match_actual_arglist (sub_flag,
1998
                                        &primary->value.compcall.actual);
1999
          if (m == MATCH_ERROR)
2000
            return MATCH_ERROR;
2001
 
2002
          if (m == MATCH_NO && !gfc_matching_ptr_assignment
2003
              && !matching_actual_arglist)
2004
            {
2005
              gfc_error ("Procedure pointer component '%s' requires an "
2006
                         "argument list at %C", component->name);
2007
              return MATCH_ERROR;
2008
            }
2009
 
2010
          if (m == MATCH_YES)
2011
            primary->expr_type = EXPR_PPC;
2012
 
2013
          break;
2014
        }
2015
 
2016
      if (component->as != NULL && !component->attr.proc_pointer)
2017
        {
2018
          tail = extend_ref (primary, tail);
2019
          tail->type = REF_ARRAY;
2020
 
2021
          m = gfc_match_array_ref (&tail->u.ar, component->as, equiv_flag,
2022
                          component->as->corank);
2023
          if (m != MATCH_YES)
2024
            return m;
2025
        }
2026
      else if (component->ts.type == BT_CLASS
2027
               && CLASS_DATA (component)->as != NULL
2028
               && !component->attr.proc_pointer)
2029
        {
2030
          tail = extend_ref (primary, tail);
2031
          tail->type = REF_ARRAY;
2032
 
2033
          m = gfc_match_array_ref (&tail->u.ar, CLASS_DATA (component)->as,
2034
                                   equiv_flag,
2035
                                   CLASS_DATA (component)->as->corank);
2036
          if (m != MATCH_YES)
2037
            return m;
2038
        }
2039
 
2040
      if ((component->ts.type != BT_DERIVED && component->ts.type != BT_CLASS)
2041
          || gfc_match_char ('%') != MATCH_YES)
2042
        break;
2043
 
2044
      sym = component->ts.u.derived;
2045
    }
2046
 
2047
check_substring:
2048
  unknown = false;
2049
  if (primary->ts.type == BT_UNKNOWN && sym->attr.flavor != FL_DERIVED)
2050
    {
2051
      if (gfc_get_default_type (sym->name, sym->ns)->type == BT_CHARACTER)
2052
       {
2053
         gfc_set_default_type (sym, 0, sym->ns);
2054
         primary->ts = sym->ts;
2055
         unknown = true;
2056
       }
2057
    }
2058
 
2059
  if (primary->ts.type == BT_CHARACTER)
2060
    {
2061
      switch (match_substring (primary->ts.u.cl, equiv_flag, &substring))
2062
        {
2063
        case MATCH_YES:
2064
          if (tail == NULL)
2065
            primary->ref = substring;
2066
          else
2067
            tail->next = substring;
2068
 
2069
          if (primary->expr_type == EXPR_CONSTANT)
2070
            primary->expr_type = EXPR_SUBSTRING;
2071
 
2072
          if (substring)
2073
            primary->ts.u.cl = NULL;
2074
 
2075
          break;
2076
 
2077
        case MATCH_NO:
2078
          if (unknown)
2079
            {
2080
              gfc_clear_ts (&primary->ts);
2081
              gfc_clear_ts (&sym->ts);
2082
            }
2083
          break;
2084
 
2085
        case MATCH_ERROR:
2086
          return MATCH_ERROR;
2087
        }
2088
    }
2089
 
2090
  /* F2008, C727.  */
2091
  if (primary->expr_type == EXPR_PPC && gfc_is_coindexed (primary))
2092
    {
2093
      gfc_error ("Coindexed procedure-pointer component at %C");
2094
      return MATCH_ERROR;
2095
    }
2096
 
2097
  return MATCH_YES;
2098
}
2099
 
2100
 
2101
/* Given an expression that is a variable, figure out what the
2102
   ultimate variable's type and attribute is, traversing the reference
2103
   structures if necessary.
2104
 
2105
   This subroutine is trickier than it looks.  We start at the base
2106
   symbol and store the attribute.  Component references load a
2107
   completely new attribute.
2108
 
2109
   A couple of rules come into play.  Subobjects of targets are always
2110
   targets themselves.  If we see a component that goes through a
2111
   pointer, then the expression must also be a target, since the
2112
   pointer is associated with something (if it isn't core will soon be
2113
   dumped).  If we see a full part or section of an array, the
2114
   expression is also an array.
2115
 
2116
   We can have at most one full array reference.  */
2117
 
2118
symbol_attribute
2119
gfc_variable_attr (gfc_expr *expr, gfc_typespec *ts)
2120
{
2121
  int dimension, pointer, allocatable, target;
2122
  symbol_attribute attr;
2123
  gfc_ref *ref;
2124
  gfc_symbol *sym;
2125
  gfc_component *comp;
2126
 
2127
  if (expr->expr_type != EXPR_VARIABLE && expr->expr_type != EXPR_FUNCTION)
2128
    gfc_internal_error ("gfc_variable_attr(): Expression isn't a variable");
2129
 
2130
  sym = expr->symtree->n.sym;
2131
  attr = sym->attr;
2132
 
2133
  if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
2134
    {
2135
      dimension = CLASS_DATA (sym)->attr.dimension;
2136
      pointer = CLASS_DATA (sym)->attr.class_pointer;
2137
      allocatable = CLASS_DATA (sym)->attr.allocatable;
2138
    }
2139
  else
2140
    {
2141
      dimension = attr.dimension;
2142
      pointer = attr.pointer;
2143
      allocatable = attr.allocatable;
2144
    }
2145
 
2146
  target = attr.target;
2147
  if (pointer || attr.proc_pointer)
2148
    target = 1;
2149
 
2150
  if (ts != NULL && expr->ts.type == BT_UNKNOWN)
2151
    *ts = sym->ts;
2152
 
2153
  for (ref = expr->ref; ref; ref = ref->next)
2154
    switch (ref->type)
2155
      {
2156
      case REF_ARRAY:
2157
 
2158
        switch (ref->u.ar.type)
2159
          {
2160
          case AR_FULL:
2161
            dimension = 1;
2162
            break;
2163
 
2164
          case AR_SECTION:
2165
            allocatable = pointer = 0;
2166
            dimension = 1;
2167
            break;
2168
 
2169
          case AR_ELEMENT:
2170
            /* Handle coarrays.  */
2171
            if (ref->u.ar.dimen > 0)
2172
              allocatable = pointer = 0;
2173
            break;
2174
 
2175
          case AR_UNKNOWN:
2176
            gfc_internal_error ("gfc_variable_attr(): Bad array reference");
2177
          }
2178
 
2179
        break;
2180
 
2181
      case REF_COMPONENT:
2182
        comp = ref->u.c.component;
2183
        attr = comp->attr;
2184
        if (ts != NULL)
2185
          {
2186
            *ts = comp->ts;
2187
            /* Don't set the string length if a substring reference
2188
               follows.  */
2189
            if (ts->type == BT_CHARACTER
2190
                && ref->next && ref->next->type == REF_SUBSTRING)
2191
                ts->u.cl = NULL;
2192
          }
2193
 
2194
        if (comp->ts.type == BT_CLASS)
2195
          {
2196
            pointer = CLASS_DATA (comp)->attr.class_pointer;
2197
            allocatable = CLASS_DATA (comp)->attr.allocatable;
2198
          }
2199
        else
2200
          {
2201
            pointer = comp->attr.pointer;
2202
            allocatable = comp->attr.allocatable;
2203
          }
2204
        if (pointer || attr.proc_pointer)
2205
          target = 1;
2206
 
2207
        break;
2208
 
2209
      case REF_SUBSTRING:
2210
        allocatable = pointer = 0;
2211
        break;
2212
      }
2213
 
2214
  attr.dimension = dimension;
2215
  attr.pointer = pointer;
2216
  attr.allocatable = allocatable;
2217
  attr.target = target;
2218
  attr.save = sym->attr.save;
2219
 
2220
  return attr;
2221
}
2222
 
2223
 
2224
/* Return the attribute from a general expression.  */
2225
 
2226
symbol_attribute
2227
gfc_expr_attr (gfc_expr *e)
2228
{
2229
  symbol_attribute attr;
2230
 
2231
  switch (e->expr_type)
2232
    {
2233
    case EXPR_VARIABLE:
2234
      attr = gfc_variable_attr (e, NULL);
2235
      break;
2236
 
2237
    case EXPR_FUNCTION:
2238
      gfc_clear_attr (&attr);
2239
 
2240
      if (e->value.function.esym != NULL)
2241
        {
2242
          gfc_symbol *sym = e->value.function.esym->result;
2243
          attr = sym->attr;
2244
          if (sym->ts.type == BT_CLASS)
2245
            {
2246
              attr.dimension = CLASS_DATA (sym)->attr.dimension;
2247
              attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
2248
              attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
2249
            }
2250
        }
2251
      else
2252
        attr = gfc_variable_attr (e, NULL);
2253
 
2254
      /* TODO: NULL() returns pointers.  May have to take care of this
2255
         here.  */
2256
 
2257
      break;
2258
 
2259
    default:
2260
      gfc_clear_attr (&attr);
2261
      break;
2262
    }
2263
 
2264
  return attr;
2265
}
2266
 
2267
 
2268
/* Match a structure constructor.  The initial symbol has already been
2269
   seen.  */
2270
 
2271
typedef struct gfc_structure_ctor_component
2272
{
2273
  char* name;
2274
  gfc_expr* val;
2275
  locus where;
2276
  struct gfc_structure_ctor_component* next;
2277
}
2278
gfc_structure_ctor_component;
2279
 
2280
#define gfc_get_structure_ctor_component() XCNEW (gfc_structure_ctor_component)
2281
 
2282
static void
2283
gfc_free_structure_ctor_component (gfc_structure_ctor_component *comp)
2284
{
2285
  free (comp->name);
2286
  gfc_free_expr (comp->val);
2287
  free (comp);
2288
}
2289
 
2290
 
2291
/* Translate the component list into the actual constructor by sorting it in
2292
   the order required; this also checks along the way that each and every
2293
   component actually has an initializer and handles default initializers
2294
   for components without explicit value given.  */
2295
static gfc_try
2296
build_actual_constructor (gfc_structure_ctor_component **comp_head,
2297
                          gfc_constructor_base *ctor_head, gfc_symbol *sym)
2298
{
2299
  gfc_structure_ctor_component *comp_iter;
2300
  gfc_component *comp;
2301
 
2302
  for (comp = sym->components; comp; comp = comp->next)
2303
    {
2304
      gfc_structure_ctor_component **next_ptr;
2305
      gfc_expr *value = NULL;
2306
 
2307
      /* Try to find the initializer for the current component by name.  */
2308
      next_ptr = comp_head;
2309
      for (comp_iter = *comp_head; comp_iter; comp_iter = comp_iter->next)
2310
        {
2311
          if (!strcmp (comp_iter->name, comp->name))
2312
            break;
2313
          next_ptr = &comp_iter->next;
2314
        }
2315
 
2316
      /* If an extension, try building the parent derived type by building
2317
         a value expression for the parent derived type and calling self.  */
2318
      if (!comp_iter && comp == sym->components && sym->attr.extension)
2319
        {
2320
          value = gfc_get_structure_constructor_expr (comp->ts.type,
2321
                                                      comp->ts.kind,
2322
                                                      &gfc_current_locus);
2323
          value->ts = comp->ts;
2324
 
2325
          if (build_actual_constructor (comp_head, &value->value.constructor,
2326
                                        comp->ts.u.derived) == FAILURE)
2327
            {
2328
              gfc_free_expr (value);
2329
              return FAILURE;
2330
            }
2331
 
2332
          gfc_constructor_append_expr (ctor_head, value, NULL);
2333
          continue;
2334
        }
2335
 
2336
      /* If it was not found, try the default initializer if there's any;
2337
         otherwise, it's an error.  */
2338
      if (!comp_iter)
2339
        {
2340
          if (comp->initializer)
2341
            {
2342
              if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Structure"
2343
                                  " constructor with missing optional arguments"
2344
                                  " at %C") == FAILURE)
2345
                return FAILURE;
2346
              value = gfc_copy_expr (comp->initializer);
2347
            }
2348
          else
2349
            {
2350
              gfc_error ("No initializer for component '%s' given in the"
2351
                         " structure constructor at %C!", comp->name);
2352
              return FAILURE;
2353
            }
2354
        }
2355
      else
2356
        value = comp_iter->val;
2357
 
2358
      /* Add the value to the constructor chain built.  */
2359
      gfc_constructor_append_expr (ctor_head, value, NULL);
2360
 
2361
      /* Remove the entry from the component list.  We don't want the expression
2362
         value to be free'd, so set it to NULL.  */
2363
      if (comp_iter)
2364
        {
2365
          *next_ptr = comp_iter->next;
2366
          comp_iter->val = NULL;
2367
          gfc_free_structure_ctor_component (comp_iter);
2368
        }
2369
    }
2370
  return SUCCESS;
2371
}
2372
 
2373
 
2374
gfc_try
2375
gfc_convert_to_structure_constructor (gfc_expr *e, gfc_symbol *sym, gfc_expr **cexpr,
2376
                                      gfc_actual_arglist **arglist,
2377
                                      bool parent)
2378
{
2379
  gfc_actual_arglist *actual;
2380
  gfc_structure_ctor_component *comp_tail, *comp_head, *comp_iter;
2381
  gfc_constructor_base ctor_head = NULL;
2382
  gfc_component *comp; /* Is set NULL when named component is first seen */
2383
  const char* last_name = NULL;
2384
  locus old_locus;
2385
  gfc_expr *expr;
2386
 
2387
  expr = parent ? *cexpr : e;
2388
  old_locus = gfc_current_locus;
2389
  if (parent)
2390
    ; /* gfc_current_locus = *arglist->expr ? ->where;*/
2391
  else
2392
    gfc_current_locus = expr->where;
2393
 
2394
  comp_tail = comp_head = NULL;
2395
 
2396
  if (!parent && sym->attr.abstract)
2397
    {
2398
      gfc_error ("Can't construct ABSTRACT type '%s' at %L",
2399
                 sym->name, &expr->where);
2400
      goto cleanup;
2401
    }
2402
 
2403
  comp = sym->components;
2404
  actual = parent ? *arglist : expr->value.function.actual;
2405
  for ( ; actual; )
2406
    {
2407
      gfc_component *this_comp = NULL;
2408
 
2409
      if (!comp_head)
2410
        comp_tail = comp_head = gfc_get_structure_ctor_component ();
2411
      else
2412
        {
2413
          comp_tail->next = gfc_get_structure_ctor_component ();
2414
          comp_tail = comp_tail->next;
2415
        }
2416
      if (actual->name)
2417
        {
2418
          if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Structure"
2419
                              " constructor with named arguments at %C")
2420
              == FAILURE)
2421
            goto cleanup;
2422
 
2423
          comp_tail->name = xstrdup (actual->name);
2424
          last_name = comp_tail->name;
2425
          comp = NULL;
2426
        }
2427
      else
2428
        {
2429
          /* Components without name are not allowed after the first named
2430
             component initializer!  */
2431
          if (!comp)
2432
            {
2433
              if (last_name)
2434
                gfc_error ("Component initializer without name after component"
2435
                           " named %s at %L!", last_name,
2436
                           actual->expr ? &actual->expr->where
2437
                                        : &gfc_current_locus);
2438
              else
2439
                gfc_error ("Too many components in structure constructor at "
2440
                           "%L!", actual->expr ? &actual->expr->where
2441
                                               : &gfc_current_locus);
2442
              goto cleanup;
2443
            }
2444
 
2445
          comp_tail->name = xstrdup (comp->name);
2446
        }
2447
 
2448
      /* Find the current component in the structure definition and check
2449
             its access is not private.  */
2450
      if (comp)
2451
        this_comp = gfc_find_component (sym, comp->name, false, false);
2452
      else
2453
        {
2454
          this_comp = gfc_find_component (sym, (const char *)comp_tail->name,
2455
                                          false, false);
2456
          comp = NULL; /* Reset needed!  */
2457
        }
2458
 
2459
      /* Here we can check if a component name is given which does not
2460
         correspond to any component of the defined structure.  */
2461
      if (!this_comp)
2462
        goto cleanup;
2463
 
2464
      comp_tail->val = actual->expr;
2465
      if (actual->expr != NULL)
2466
        comp_tail->where = actual->expr->where;
2467
      actual->expr = NULL;
2468
 
2469
      /* Check if this component is already given a value.  */
2470
      for (comp_iter = comp_head; comp_iter != comp_tail;
2471
           comp_iter = comp_iter->next)
2472
        {
2473
          gcc_assert (comp_iter);
2474
          if (!strcmp (comp_iter->name, comp_tail->name))
2475
            {
2476
              gfc_error ("Component '%s' is initialized twice in the structure"
2477
                         " constructor at %L!", comp_tail->name,
2478
                         comp_tail->val ? &comp_tail->where
2479
                                        : &gfc_current_locus);
2480
              goto cleanup;
2481
            }
2482
        }
2483
 
2484
      /* F2008, R457/C725, for PURE C1283.  */
2485
      if (this_comp->attr.pointer && comp_tail->val
2486
          && gfc_is_coindexed (comp_tail->val))
2487
        {
2488
          gfc_error ("Coindexed expression to pointer component '%s' in "
2489
                     "structure constructor at %L!", comp_tail->name,
2490
                     &comp_tail->where);
2491
          goto cleanup;
2492
        }
2493
 
2494
          /* If not explicitly a parent constructor, gather up the components
2495
             and build one.  */
2496
          if (comp && comp == sym->components
2497
                && sym->attr.extension
2498
                && comp_tail->val
2499
                && (comp_tail->val->ts.type != BT_DERIVED
2500
                      ||
2501
                    comp_tail->val->ts.u.derived != this_comp->ts.u.derived))
2502
            {
2503
              gfc_try m;
2504
              gfc_actual_arglist *arg_null = NULL;
2505
 
2506
              actual->expr = comp_tail->val;
2507
              comp_tail->val = NULL;
2508
 
2509
              m = gfc_convert_to_structure_constructor (NULL,
2510
                                        comp->ts.u.derived, &comp_tail->val,
2511
                                        comp->ts.u.derived->attr.zero_comp
2512
                                          ? &arg_null : &actual, true);
2513
              if (m == FAILURE)
2514
                goto cleanup;
2515
 
2516
              if (comp->ts.u.derived->attr.zero_comp)
2517
                {
2518
                  comp = comp->next;
2519
                  continue;
2520
                }
2521
            }
2522
 
2523
      if (comp)
2524
        comp = comp->next;
2525
      if (parent && !comp)
2526
        break;
2527
 
2528
      actual = actual->next;
2529
    }
2530
 
2531
  if (build_actual_constructor (&comp_head, &ctor_head, sym) == FAILURE)
2532
    goto cleanup;
2533
 
2534
  /* No component should be left, as this should have caused an error in the
2535
     loop constructing the component-list (name that does not correspond to any
2536
     component in the structure definition).  */
2537
  if (comp_head && sym->attr.extension)
2538
    {
2539
      for (comp_iter = comp_head; comp_iter; comp_iter = comp_iter->next)
2540
        {
2541
          gfc_error ("component '%s' at %L has already been set by a "
2542
                     "parent derived type constructor", comp_iter->name,
2543
                     &comp_iter->where);
2544
        }
2545
      goto cleanup;
2546
    }
2547
  else
2548
    gcc_assert (!comp_head);
2549
 
2550
  if (parent)
2551
    {
2552
      expr = gfc_get_structure_constructor_expr (BT_DERIVED, 0, &gfc_current_locus);
2553
      expr->ts.u.derived = sym;
2554
      expr->value.constructor = ctor_head;
2555
      *cexpr = expr;
2556
    }
2557
  else
2558
    {
2559
      expr->ts.u.derived = sym;
2560
      expr->ts.kind = 0;
2561
      expr->ts.type = BT_DERIVED;
2562
      expr->value.constructor = ctor_head;
2563
      expr->expr_type = EXPR_STRUCTURE;
2564
    }
2565
 
2566
  gfc_current_locus = old_locus;
2567
  if (parent)
2568
    *arglist = actual;
2569
  return SUCCESS;
2570
 
2571
  cleanup:
2572
  gfc_current_locus = old_locus;
2573
 
2574
  for (comp_iter = comp_head; comp_iter; )
2575
    {
2576
      gfc_structure_ctor_component *next = comp_iter->next;
2577
      gfc_free_structure_ctor_component (comp_iter);
2578
      comp_iter = next;
2579
    }
2580
  gfc_constructor_free (ctor_head);
2581
 
2582
  return FAILURE;
2583
}
2584
 
2585
 
2586
match
2587
gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result)
2588
{
2589
  match m;
2590
  gfc_expr *e;
2591
  gfc_symtree *symtree;
2592
 
2593
  gfc_get_sym_tree (sym->name, NULL, &symtree, false);   /* Can't fail */
2594
 
2595
  e = gfc_get_expr ();
2596
  e->symtree = symtree;
2597
  e->expr_type = EXPR_FUNCTION;
2598
 
2599
  gcc_assert (sym->attr.flavor == FL_DERIVED
2600
              && symtree->n.sym->attr.flavor == FL_PROCEDURE);
2601
  e->value.function.esym = sym;
2602
  e->symtree->n.sym->attr.generic = 1;
2603
 
2604
   m = gfc_match_actual_arglist (0, &e->value.function.actual);
2605
   if (m != MATCH_YES)
2606
     {
2607
       gfc_free_expr (e);
2608
       return m;
2609
     }
2610
 
2611
   if (gfc_convert_to_structure_constructor (e, sym, NULL, NULL, false)
2612
       != SUCCESS)
2613
     {
2614
       gfc_free_expr (e);
2615
       return MATCH_ERROR;
2616
     }
2617
 
2618
   *result = e;
2619
   return MATCH_YES;
2620
}
2621
 
2622
 
2623
/* If the symbol is an implicit do loop index and implicitly typed,
2624
   it should not be host associated.  Provide a symtree from the
2625
   current namespace.  */
2626
static match
2627
check_for_implicit_index (gfc_symtree **st, gfc_symbol **sym)
2628
{
2629
  if ((*sym)->attr.flavor == FL_VARIABLE
2630
      && (*sym)->ns != gfc_current_ns
2631
      && (*sym)->attr.implied_index
2632
      && (*sym)->attr.implicit_type
2633
      && !(*sym)->attr.use_assoc)
2634
    {
2635
      int i;
2636
      i = gfc_get_sym_tree ((*sym)->name, NULL, st, false);
2637
      if (i)
2638
        return MATCH_ERROR;
2639
      *sym = (*st)->n.sym;
2640
    }
2641
  return MATCH_YES;
2642
}
2643
 
2644
 
2645
/* Procedure pointer as function result: Replace the function symbol by the
2646
   auto-generated hidden result variable named "ppr@".  */
2647
 
2648
static gfc_try
2649
replace_hidden_procptr_result (gfc_symbol **sym, gfc_symtree **st)
2650
{
2651
  /* Check for procedure pointer result variable.  */
2652
  if ((*sym)->attr.function && !(*sym)->attr.external
2653
      && (*sym)->result && (*sym)->result != *sym
2654
      && (*sym)->result->attr.proc_pointer
2655
      && (*sym) == gfc_current_ns->proc_name
2656
      && (*sym) == (*sym)->result->ns->proc_name
2657
      && strcmp ("ppr@", (*sym)->result->name) == 0)
2658
    {
2659
      /* Automatic replacement with "hidden" result variable.  */
2660
      (*sym)->result->attr.referenced = (*sym)->attr.referenced;
2661
      *sym = (*sym)->result;
2662
      *st = gfc_find_symtree ((*sym)->ns->sym_root, (*sym)->name);
2663
      return SUCCESS;
2664
    }
2665
  return FAILURE;
2666
}
2667
 
2668
 
2669
/* Matches a variable name followed by anything that might follow it--
2670
   array reference, argument list of a function, etc.  */
2671
 
2672
match
2673
gfc_match_rvalue (gfc_expr **result)
2674
{
2675
  gfc_actual_arglist *actual_arglist;
2676
  char name[GFC_MAX_SYMBOL_LEN + 1], argname[GFC_MAX_SYMBOL_LEN + 1];
2677
  gfc_state_data *st;
2678
  gfc_symbol *sym;
2679
  gfc_symtree *symtree;
2680
  locus where, old_loc;
2681
  gfc_expr *e;
2682
  match m, m2;
2683
  int i;
2684
  gfc_typespec *ts;
2685
  bool implicit_char;
2686
  gfc_ref *ref;
2687
 
2688
  m = gfc_match_name (name);
2689
  if (m != MATCH_YES)
2690
    return m;
2691
 
2692
  if (gfc_find_state (COMP_INTERFACE) == SUCCESS
2693
      && !gfc_current_ns->has_import_set)
2694
    i = gfc_get_sym_tree (name, NULL, &symtree, false);
2695
  else
2696
    i = gfc_get_ha_sym_tree (name, &symtree);
2697
 
2698
  if (i)
2699
    return MATCH_ERROR;
2700
 
2701
  sym = symtree->n.sym;
2702
  e = NULL;
2703
  where = gfc_current_locus;
2704
 
2705
  replace_hidden_procptr_result (&sym, &symtree);
2706
 
2707
  /* If this is an implicit do loop index and implicitly typed,
2708
     it should not be host associated.  */
2709
  m = check_for_implicit_index (&symtree, &sym);
2710
  if (m != MATCH_YES)
2711
    return m;
2712
 
2713
  gfc_set_sym_referenced (sym);
2714
  sym->attr.implied_index = 0;
2715
 
2716
  if (sym->attr.function && sym->result == sym)
2717
    {
2718
      /* See if this is a directly recursive function call.  */
2719
      gfc_gobble_whitespace ();
2720
      if (sym->attr.recursive
2721
          && gfc_peek_ascii_char () == '('
2722
          && gfc_current_ns->proc_name == sym
2723
          && !sym->attr.dimension)
2724
        {
2725
          gfc_error ("'%s' at %C is the name of a recursive function "
2726
                     "and so refers to the result variable. Use an "
2727
                     "explicit RESULT variable for direct recursion "
2728
                     "(12.5.2.1)", sym->name);
2729
          return MATCH_ERROR;
2730
        }
2731
 
2732
      if (gfc_is_function_return_value (sym, gfc_current_ns))
2733
        goto variable;
2734
 
2735
      if (sym->attr.entry
2736
          && (sym->ns == gfc_current_ns
2737
              || sym->ns == gfc_current_ns->parent))
2738
        {
2739
          gfc_entry_list *el = NULL;
2740
 
2741
          for (el = sym->ns->entries; el; el = el->next)
2742
            if (sym == el->sym)
2743
              goto variable;
2744
        }
2745
    }
2746
 
2747
  if (gfc_matching_procptr_assignment)
2748
    goto procptr0;
2749
 
2750
  if (sym->attr.function || sym->attr.external || sym->attr.intrinsic)
2751
    goto function0;
2752
 
2753
  if (sym->attr.generic)
2754
    goto generic_function;
2755
 
2756
  switch (sym->attr.flavor)
2757
    {
2758
    case FL_VARIABLE:
2759
    variable:
2760
      e = gfc_get_expr ();
2761
 
2762
      e->expr_type = EXPR_VARIABLE;
2763
      e->symtree = symtree;
2764
 
2765
      m = gfc_match_varspec (e, 0, false, true);
2766
      break;
2767
 
2768
    case FL_PARAMETER:
2769
      /* A statement of the form "REAL, parameter :: a(0:10) = 1" will
2770
         end up here.  Unfortunately, sym->value->expr_type is set to
2771
         EXPR_CONSTANT, and so the if () branch would be followed without
2772
         the !sym->as check.  */
2773
      if (sym->value && sym->value->expr_type != EXPR_ARRAY && !sym->as)
2774
        e = gfc_copy_expr (sym->value);
2775
      else
2776
        {
2777
          e = gfc_get_expr ();
2778
          e->expr_type = EXPR_VARIABLE;
2779
        }
2780
 
2781
      e->symtree = symtree;
2782
      m = gfc_match_varspec (e, 0, false, true);
2783
 
2784
      if (sym->ts.is_c_interop || sym->ts.is_iso_c)
2785
        break;
2786
 
2787
      /* Variable array references to derived type parameters cause
2788
         all sorts of headaches in simplification. Treating such
2789
         expressions as variable works just fine for all array
2790
         references.  */
2791
      if (sym->value && sym->ts.type == BT_DERIVED && e->ref)
2792
        {
2793
          for (ref = e->ref; ref; ref = ref->next)
2794
            if (ref->type == REF_ARRAY)
2795
              break;
2796
 
2797
          if (ref == NULL || ref->u.ar.type == AR_FULL)
2798
            break;
2799
 
2800
          ref = e->ref;
2801
          e->ref = NULL;
2802
          gfc_free_expr (e);
2803
          e = gfc_get_expr ();
2804
          e->expr_type = EXPR_VARIABLE;
2805
          e->symtree = symtree;
2806
          e->ref = ref;
2807
        }
2808
 
2809
      break;
2810
 
2811
    case FL_DERIVED:
2812
      sym = gfc_use_derived (sym);
2813
      if (sym == NULL)
2814
        m = MATCH_ERROR;
2815
      else
2816
        goto generic_function;
2817
      break;
2818
 
2819
    /* If we're here, then the name is known to be the name of a
2820
       procedure, yet it is not sure to be the name of a function.  */
2821
    case FL_PROCEDURE:
2822
 
2823
    /* Procedure Pointer Assignments. */
2824
    procptr0:
2825
      if (gfc_matching_procptr_assignment)
2826
        {
2827
          gfc_gobble_whitespace ();
2828
          if (!sym->attr.dimension && gfc_peek_ascii_char () == '(')
2829
            /* Parse functions returning a procptr.  */
2830
            goto function0;
2831
 
2832
          if (gfc_is_intrinsic (sym, 0, gfc_current_locus)
2833
              || gfc_is_intrinsic (sym, 1, gfc_current_locus))
2834
            sym->attr.intrinsic = 1;
2835
          e = gfc_get_expr ();
2836
          e->expr_type = EXPR_VARIABLE;
2837
          e->symtree = symtree;
2838
          m = gfc_match_varspec (e, 0, false, true);
2839
          break;
2840
        }
2841
 
2842
      if (sym->attr.subroutine)
2843
        {
2844
          gfc_error ("Unexpected use of subroutine name '%s' at %C",
2845
                     sym->name);
2846
          m = MATCH_ERROR;
2847
          break;
2848
        }
2849
 
2850
      /* At this point, the name has to be a non-statement function.
2851
         If the name is the same as the current function being
2852
         compiled, then we have a variable reference (to the function
2853
         result) if the name is non-recursive.  */
2854
 
2855
      st = gfc_enclosing_unit (NULL);
2856
 
2857
      if (st != NULL && st->state == COMP_FUNCTION
2858
          && st->sym == sym
2859
          && !sym->attr.recursive)
2860
        {
2861
          e = gfc_get_expr ();
2862
          e->symtree = symtree;
2863
          e->expr_type = EXPR_VARIABLE;
2864
 
2865
          m = gfc_match_varspec (e, 0, false, true);
2866
          break;
2867
        }
2868
 
2869
    /* Match a function reference.  */
2870
    function0:
2871
      m = gfc_match_actual_arglist (0, &actual_arglist);
2872
      if (m == MATCH_NO)
2873
        {
2874
          if (sym->attr.proc == PROC_ST_FUNCTION)
2875
            gfc_error ("Statement function '%s' requires argument list at %C",
2876
                       sym->name);
2877
          else
2878
            gfc_error ("Function '%s' requires an argument list at %C",
2879
                       sym->name);
2880
 
2881
          m = MATCH_ERROR;
2882
          break;
2883
        }
2884
 
2885
      if (m != MATCH_YES)
2886
        {
2887
          m = MATCH_ERROR;
2888
          break;
2889
        }
2890
 
2891
      gfc_get_ha_sym_tree (name, &symtree);     /* Can't fail */
2892
      sym = symtree->n.sym;
2893
 
2894
      replace_hidden_procptr_result (&sym, &symtree);
2895
 
2896
      e = gfc_get_expr ();
2897
      e->symtree = symtree;
2898
      e->expr_type = EXPR_FUNCTION;
2899
      e->value.function.actual = actual_arglist;
2900
      e->where = gfc_current_locus;
2901
 
2902
      if (sym->ts.type == BT_CLASS && sym->attr.class_ok
2903
          && CLASS_DATA (sym)->as)
2904
        e->rank = CLASS_DATA (sym)->as->rank;
2905
      else if (sym->as != NULL)
2906
        e->rank = sym->as->rank;
2907
 
2908
      if (!sym->attr.function
2909
          && gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
2910
        {
2911
          m = MATCH_ERROR;
2912
          break;
2913
        }
2914
 
2915
      /* Check here for the existence of at least one argument for the
2916
         iso_c_binding functions C_LOC, C_FUNLOC, and C_ASSOCIATED.  The
2917
         argument(s) given will be checked in gfc_iso_c_func_interface,
2918
         during resolution of the function call.  */
2919
      if (sym->attr.is_iso_c == 1
2920
          && (sym->from_intmod == INTMOD_ISO_C_BINDING
2921
              && (sym->intmod_sym_id == ISOCBINDING_LOC
2922
                  || sym->intmod_sym_id == ISOCBINDING_FUNLOC
2923
                  || sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)))
2924
        {
2925
          /* make sure we were given a param */
2926
          if (actual_arglist == NULL)
2927
            {
2928
              gfc_error ("Missing argument to '%s' at %C", sym->name);
2929
              m = MATCH_ERROR;
2930
              break;
2931
            }
2932
        }
2933
 
2934
      if (sym->result == NULL)
2935
        sym->result = sym;
2936
 
2937
      m = MATCH_YES;
2938
      break;
2939
 
2940
    case FL_UNKNOWN:
2941
 
2942
      /* Special case for derived type variables that get their types
2943
         via an IMPLICIT statement.  This can't wait for the
2944
         resolution phase.  */
2945
 
2946
      if (gfc_peek_ascii_char () == '%'
2947
          && sym->ts.type == BT_UNKNOWN
2948
          && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
2949
        gfc_set_default_type (sym, 0, sym->ns);
2950
 
2951
      /* If the symbol has a (co)dimension attribute, the expression is a
2952
         variable.  */
2953
 
2954
      if (sym->attr.dimension || sym->attr.codimension)
2955
        {
2956
          if (gfc_add_flavor (&sym->attr, FL_VARIABLE,
2957
                              sym->name, NULL) == FAILURE)
2958
            {
2959
              m = MATCH_ERROR;
2960
              break;
2961
            }
2962
 
2963
          e = gfc_get_expr ();
2964
          e->symtree = symtree;
2965
          e->expr_type = EXPR_VARIABLE;
2966
          m = gfc_match_varspec (e, 0, false, true);
2967
          break;
2968
        }
2969
 
2970
      if (sym->ts.type == BT_CLASS && sym->attr.class_ok
2971
          && (CLASS_DATA (sym)->attr.dimension
2972
              || CLASS_DATA (sym)->attr.codimension))
2973
        {
2974
          if (gfc_add_flavor (&sym->attr, FL_VARIABLE,
2975
                              sym->name, NULL) == FAILURE)
2976
            {
2977
              m = MATCH_ERROR;
2978
              break;
2979
            }
2980
 
2981
          e = gfc_get_expr ();
2982
          e->symtree = symtree;
2983
          e->expr_type = EXPR_VARIABLE;
2984
          m = gfc_match_varspec (e, 0, false, true);
2985
          break;
2986
        }
2987
 
2988
      /* Name is not an array, so we peek to see if a '(' implies a
2989
         function call or a substring reference.  Otherwise the
2990
         variable is just a scalar.  */
2991
 
2992
      gfc_gobble_whitespace ();
2993
      if (gfc_peek_ascii_char () != '(')
2994
        {
2995
          /* Assume a scalar variable */
2996
          e = gfc_get_expr ();
2997
          e->symtree = symtree;
2998
          e->expr_type = EXPR_VARIABLE;
2999
 
3000
          if (gfc_add_flavor (&sym->attr, FL_VARIABLE,
3001
                              sym->name, NULL) == FAILURE)
3002
            {
3003
              m = MATCH_ERROR;
3004
              break;
3005
            }
3006
 
3007
          /*FIXME:??? gfc_match_varspec does set this for us: */
3008
          e->ts = sym->ts;
3009
          m = gfc_match_varspec (e, 0, false, true);
3010
          break;
3011
        }
3012
 
3013
      /* See if this is a function reference with a keyword argument
3014
         as first argument. We do this because otherwise a spurious
3015
         symbol would end up in the symbol table.  */
3016
 
3017
      old_loc = gfc_current_locus;
3018
      m2 = gfc_match (" ( %n =", argname);
3019
      gfc_current_locus = old_loc;
3020
 
3021
      e = gfc_get_expr ();
3022
      e->symtree = symtree;
3023
 
3024
      if (m2 != MATCH_YES)
3025
        {
3026
          /* Try to figure out whether we're dealing with a character type.
3027
             We're peeking ahead here, because we don't want to call
3028
             match_substring if we're dealing with an implicitly typed
3029
             non-character variable.  */
3030
          implicit_char = false;
3031
          if (sym->ts.type == BT_UNKNOWN)
3032
            {
3033
              ts = gfc_get_default_type (sym->name, NULL);
3034
              if (ts->type == BT_CHARACTER)
3035
                implicit_char = true;
3036
            }
3037
 
3038
          /* See if this could possibly be a substring reference of a name
3039
             that we're not sure is a variable yet.  */
3040
 
3041
          if ((implicit_char || sym->ts.type == BT_CHARACTER)
3042
              && match_substring (sym->ts.u.cl, 0, &e->ref) == MATCH_YES)
3043
            {
3044
 
3045
              e->expr_type = EXPR_VARIABLE;
3046
 
3047
              if (sym->attr.flavor != FL_VARIABLE
3048
                  && gfc_add_flavor (&sym->attr, FL_VARIABLE,
3049
                                     sym->name, NULL) == FAILURE)
3050
                {
3051
                  m = MATCH_ERROR;
3052
                  break;
3053
                }
3054
 
3055
              if (sym->ts.type == BT_UNKNOWN
3056
                  && gfc_set_default_type (sym, 1, NULL) == FAILURE)
3057
                {
3058
                  m = MATCH_ERROR;
3059
                  break;
3060
                }
3061
 
3062
              e->ts = sym->ts;
3063
              if (e->ref)
3064
                e->ts.u.cl = NULL;
3065
              m = MATCH_YES;
3066
              break;
3067
            }
3068
        }
3069
 
3070
      /* Give up, assume we have a function.  */
3071
 
3072
      gfc_get_sym_tree (name, NULL, &symtree, false);   /* Can't fail */
3073
      sym = symtree->n.sym;
3074
      e->expr_type = EXPR_FUNCTION;
3075
 
3076
      if (!sym->attr.function
3077
          && gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
3078
        {
3079
          m = MATCH_ERROR;
3080
          break;
3081
        }
3082
 
3083
      sym->result = sym;
3084
 
3085
      m = gfc_match_actual_arglist (0, &e->value.function.actual);
3086
      if (m == MATCH_NO)
3087
        gfc_error ("Missing argument list in function '%s' at %C", sym->name);
3088
 
3089
      if (m != MATCH_YES)
3090
        {
3091
          m = MATCH_ERROR;
3092
          break;
3093
        }
3094
 
3095
      /* If our new function returns a character, array or structure
3096
         type, it might have subsequent references.  */
3097
 
3098
      m = gfc_match_varspec (e, 0, false, true);
3099
      if (m == MATCH_NO)
3100
        m = MATCH_YES;
3101
 
3102
      break;
3103
 
3104
    generic_function:
3105
      gfc_get_sym_tree (name, NULL, &symtree, false);   /* Can't fail */
3106
 
3107
      e = gfc_get_expr ();
3108
      e->symtree = symtree;
3109
      e->expr_type = EXPR_FUNCTION;
3110
 
3111
      if (sym->attr.flavor == FL_DERIVED)
3112
        {
3113
          e->value.function.esym = sym;
3114
          e->symtree->n.sym->attr.generic = 1;
3115
        }
3116
 
3117
      m = gfc_match_actual_arglist (0, &e->value.function.actual);
3118
      break;
3119
 
3120
    default:
3121
      gfc_error ("Symbol at %C is not appropriate for an expression");
3122
      return MATCH_ERROR;
3123
    }
3124
 
3125
  if (m == MATCH_YES)
3126
    {
3127
      e->where = where;
3128
      *result = e;
3129
    }
3130
  else
3131
    gfc_free_expr (e);
3132
 
3133
  return m;
3134
}
3135
 
3136
 
3137
/* Match a variable, i.e. something that can be assigned to.  This
3138
   starts as a symbol, can be a structure component or an array
3139
   reference.  It can be a function if the function doesn't have a
3140
   separate RESULT variable.  If the symbol has not been previously
3141
   seen, we assume it is a variable.
3142
 
3143
   This function is called by two interface functions:
3144
   gfc_match_variable, which has host_flag = 1, and
3145
   gfc_match_equiv_variable, with host_flag = 0, to restrict the
3146
   match of the symbol to the local scope.  */
3147
 
3148
static match
3149
match_variable (gfc_expr **result, int equiv_flag, int host_flag)
3150
{
3151
  gfc_symbol *sym;
3152
  gfc_symtree *st;
3153
  gfc_expr *expr;
3154
  locus where;
3155
  match m;
3156
 
3157
  /* Since nothing has any business being an lvalue in a module
3158
     specification block, an interface block or a contains section,
3159
     we force the changed_symbols mechanism to work by setting
3160
     host_flag to 0. This prevents valid symbols that have the name
3161
     of keywords, such as 'end', being turned into variables by
3162
     failed matching to assignments for, e.g., END INTERFACE.  */
3163
  if (gfc_current_state () == COMP_MODULE
3164
      || gfc_current_state () == COMP_INTERFACE
3165
      || gfc_current_state () == COMP_CONTAINS)
3166
    host_flag = 0;
3167
 
3168
  where = gfc_current_locus;
3169
  m = gfc_match_sym_tree (&st, host_flag);
3170
  if (m != MATCH_YES)
3171
    return m;
3172
 
3173
  sym = st->n.sym;
3174
 
3175
  /* If this is an implicit do loop index and implicitly typed,
3176
     it should not be host associated.  */
3177
  m = check_for_implicit_index (&st, &sym);
3178
  if (m != MATCH_YES)
3179
    return m;
3180
 
3181
  sym->attr.implied_index = 0;
3182
 
3183
  gfc_set_sym_referenced (sym);
3184
  switch (sym->attr.flavor)
3185
    {
3186
    case FL_VARIABLE:
3187
      /* Everything is alright.  */
3188
      break;
3189
 
3190
    case FL_UNKNOWN:
3191
      {
3192
        sym_flavor flavor = FL_UNKNOWN;
3193
 
3194
        gfc_gobble_whitespace ();
3195
 
3196
        if (sym->attr.external || sym->attr.procedure
3197
            || sym->attr.function || sym->attr.subroutine)
3198
          flavor = FL_PROCEDURE;
3199
 
3200
        /* If it is not a procedure, is not typed and is host associated,
3201
           we cannot give it a flavor yet.  */
3202
        else if (sym->ns == gfc_current_ns->parent
3203
                   && sym->ts.type == BT_UNKNOWN)
3204
          break;
3205
 
3206
        /* These are definitive indicators that this is a variable.  */
3207
        else if (gfc_peek_ascii_char () != '(' || sym->ts.type != BT_UNKNOWN
3208
                 || sym->attr.pointer || sym->as != NULL)
3209
          flavor = FL_VARIABLE;
3210
 
3211
        if (flavor != FL_UNKNOWN
3212
            && gfc_add_flavor (&sym->attr, flavor, sym->name, NULL) == FAILURE)
3213
          return MATCH_ERROR;
3214
      }
3215
      break;
3216
 
3217
    case FL_PARAMETER:
3218
      if (equiv_flag)
3219
        {
3220
          gfc_error ("Named constant at %C in an EQUIVALENCE");
3221
          return MATCH_ERROR;
3222
        }
3223
      /* Otherwise this is checked for and an error given in the
3224
         variable definition context checks.  */
3225
      break;
3226
 
3227
    case FL_PROCEDURE:
3228
      /* Check for a nonrecursive function result variable.  */
3229
      if (sym->attr.function
3230
          && !sym->attr.external
3231
          && sym->result == sym
3232
          && (gfc_is_function_return_value (sym, gfc_current_ns)
3233
              || (sym->attr.entry
3234
                  && sym->ns == gfc_current_ns)
3235
              || (sym->attr.entry
3236
                  && sym->ns == gfc_current_ns->parent)))
3237
        {
3238
          /* If a function result is a derived type, then the derived
3239
             type may still have to be resolved.  */
3240
 
3241
          if (sym->ts.type == BT_DERIVED
3242
              && gfc_use_derived (sym->ts.u.derived) == NULL)
3243
            return MATCH_ERROR;
3244
          break;
3245
        }
3246
 
3247
      if (sym->attr.proc_pointer
3248
          || replace_hidden_procptr_result (&sym, &st) == SUCCESS)
3249
        break;
3250
 
3251
      /* Fall through to error */
3252
 
3253
    default:
3254
      gfc_error ("'%s' at %C is not a variable", sym->name);
3255
      return MATCH_ERROR;
3256
    }
3257
 
3258
  /* Special case for derived type variables that get their types
3259
     via an IMPLICIT statement.  This can't wait for the
3260
     resolution phase.  */
3261
 
3262
    {
3263
      gfc_namespace * implicit_ns;
3264
 
3265
      if (gfc_current_ns->proc_name == sym)
3266
        implicit_ns = gfc_current_ns;
3267
      else
3268
        implicit_ns = sym->ns;
3269
 
3270
      if (gfc_peek_ascii_char () == '%'
3271
          && sym->ts.type == BT_UNKNOWN
3272
          && gfc_get_default_type (sym->name, implicit_ns)->type == BT_DERIVED)
3273
        gfc_set_default_type (sym, 0, implicit_ns);
3274
    }
3275
 
3276
  expr = gfc_get_expr ();
3277
 
3278
  expr->expr_type = EXPR_VARIABLE;
3279
  expr->symtree = st;
3280
  expr->ts = sym->ts;
3281
  expr->where = where;
3282
 
3283
  /* Now see if we have to do more.  */
3284
  m = gfc_match_varspec (expr, equiv_flag, false, false);
3285
  if (m != MATCH_YES)
3286
    {
3287
      gfc_free_expr (expr);
3288
      return m;
3289
    }
3290
 
3291
  *result = expr;
3292
  return MATCH_YES;
3293
}
3294
 
3295
 
3296
match
3297
gfc_match_variable (gfc_expr **result, int equiv_flag)
3298
{
3299
  return match_variable (result, equiv_flag, 1);
3300
}
3301
 
3302
 
3303
match
3304
gfc_match_equiv_variable (gfc_expr **result)
3305
{
3306
  return match_variable (result, 1, 0);
3307
}
3308
 

powered by: WebSVN 2.1.0

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