OSDN Git Service

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