OSDN Git Service

fortran/
[pf3gnuchains/gcc-fork.git] / gcc / fortran / primary.c
1 /* 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    0 if a .false. was found, and -1 otherwise.  */
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       if (actual)
2529         actual = actual->next;
2530     }
2531
2532   if (build_actual_constructor (&comp_head, &ctor_head, sym) == FAILURE)
2533     goto cleanup;
2534
2535   /* No component should be left, as this should have caused an error in the
2536      loop constructing the component-list (name that does not correspond to any
2537      component in the structure definition).  */
2538   if (comp_head && sym->attr.extension)
2539     {
2540       for (comp_iter = comp_head; comp_iter; comp_iter = comp_iter->next)
2541         {
2542           gfc_error ("component '%s' at %L has already been set by a "
2543                      "parent derived type constructor", comp_iter->name,
2544                      &comp_iter->where);
2545         }
2546       goto cleanup;
2547     }
2548   else
2549     gcc_assert (!comp_head);
2550
2551   if (parent)
2552     {
2553       expr = gfc_get_structure_constructor_expr (BT_DERIVED, 0, &gfc_current_locus);
2554       expr->ts.u.derived = sym;
2555       expr->value.constructor = ctor_head;
2556       *cexpr = expr;
2557     }
2558   else
2559     {
2560       expr->ts.u.derived = sym;
2561       expr->ts.kind = 0;
2562       expr->ts.type = BT_DERIVED;
2563       expr->value.constructor = ctor_head;
2564       expr->expr_type = EXPR_STRUCTURE;
2565     }
2566
2567   gfc_current_locus = old_locus; 
2568   if (parent)
2569     *arglist = actual;
2570   return SUCCESS;
2571
2572   cleanup:
2573   gfc_current_locus = old_locus; 
2574
2575   for (comp_iter = comp_head; comp_iter; )
2576     {
2577       gfc_structure_ctor_component *next = comp_iter->next;
2578       gfc_free_structure_ctor_component (comp_iter);
2579       comp_iter = next;
2580     }
2581   gfc_constructor_free (ctor_head);
2582
2583   return FAILURE;
2584 }
2585
2586
2587 match
2588 gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result)
2589 {
2590   match m;
2591   gfc_expr *e;
2592   gfc_symtree *symtree;
2593
2594   gfc_get_sym_tree (sym->name, NULL, &symtree, false);   /* Can't fail */
2595
2596   e = gfc_get_expr ();
2597   e->symtree = symtree;
2598   e->expr_type = EXPR_FUNCTION;
2599
2600   gcc_assert (sym->attr.flavor == FL_DERIVED
2601               && symtree->n.sym->attr.flavor == FL_PROCEDURE);
2602   e->value.function.esym = sym;
2603   e->symtree->n.sym->attr.generic = 1;
2604
2605    m = gfc_match_actual_arglist (0, &e->value.function.actual);
2606    if (m != MATCH_YES)
2607      {
2608        gfc_free_expr (e);
2609        return m;
2610      }
2611
2612    if (gfc_convert_to_structure_constructor (e, sym, NULL, NULL, false)
2613        != SUCCESS)
2614      {
2615        gfc_free_expr (e);
2616        return MATCH_ERROR;
2617      }
2618
2619    *result = e;
2620    return MATCH_YES;
2621 }
2622
2623
2624 /* If the symbol is an implicit do loop index and implicitly typed,
2625    it should not be host associated.  Provide a symtree from the
2626    current namespace.  */
2627 static match
2628 check_for_implicit_index (gfc_symtree **st, gfc_symbol **sym)
2629 {
2630   if ((*sym)->attr.flavor == FL_VARIABLE
2631       && (*sym)->ns != gfc_current_ns
2632       && (*sym)->attr.implied_index
2633       && (*sym)->attr.implicit_type
2634       && !(*sym)->attr.use_assoc)
2635     {
2636       int i;
2637       i = gfc_get_sym_tree ((*sym)->name, NULL, st, false);
2638       if (i)
2639         return MATCH_ERROR;
2640       *sym = (*st)->n.sym;
2641     }
2642   return MATCH_YES;
2643 }
2644
2645
2646 /* Procedure pointer as function result: Replace the function symbol by the
2647    auto-generated hidden result variable named "ppr@".  */
2648
2649 static gfc_try
2650 replace_hidden_procptr_result (gfc_symbol **sym, gfc_symtree **st)
2651 {
2652   /* Check for procedure pointer result variable.  */
2653   if ((*sym)->attr.function && !(*sym)->attr.external
2654       && (*sym)->result && (*sym)->result != *sym
2655       && (*sym)->result->attr.proc_pointer
2656       && (*sym) == gfc_current_ns->proc_name
2657       && (*sym) == (*sym)->result->ns->proc_name
2658       && strcmp ("ppr@", (*sym)->result->name) == 0)
2659     {
2660       /* Automatic replacement with "hidden" result variable.  */
2661       (*sym)->result->attr.referenced = (*sym)->attr.referenced;
2662       *sym = (*sym)->result;
2663       *st = gfc_find_symtree ((*sym)->ns->sym_root, (*sym)->name);
2664       return SUCCESS;
2665     }
2666   return FAILURE;
2667 }
2668
2669
2670 /* Matches a variable name followed by anything that might follow it--
2671    array reference, argument list of a function, etc.  */
2672
2673 match
2674 gfc_match_rvalue (gfc_expr **result)
2675 {
2676   gfc_actual_arglist *actual_arglist;
2677   char name[GFC_MAX_SYMBOL_LEN + 1], argname[GFC_MAX_SYMBOL_LEN + 1];
2678   gfc_state_data *st;
2679   gfc_symbol *sym;
2680   gfc_symtree *symtree;
2681   locus where, old_loc;
2682   gfc_expr *e;
2683   match m, m2;
2684   int i;
2685   gfc_typespec *ts;
2686   bool implicit_char;
2687   gfc_ref *ref;
2688
2689   m = gfc_match_name (name);
2690   if (m != MATCH_YES)
2691     return m;
2692
2693   if (gfc_find_state (COMP_INTERFACE) == SUCCESS
2694       && !gfc_current_ns->has_import_set)
2695     i = gfc_get_sym_tree (name, NULL, &symtree, false);
2696   else
2697     i = gfc_get_ha_sym_tree (name, &symtree);
2698
2699   if (i)
2700     return MATCH_ERROR;
2701
2702   sym = symtree->n.sym;
2703   e = NULL;
2704   where = gfc_current_locus;
2705
2706   replace_hidden_procptr_result (&sym, &symtree);
2707
2708   /* If this is an implicit do loop index and implicitly typed,
2709      it should not be host associated.  */
2710   m = check_for_implicit_index (&symtree, &sym);
2711   if (m != MATCH_YES)
2712     return m;
2713
2714   gfc_set_sym_referenced (sym);
2715   sym->attr.implied_index = 0;
2716
2717   if (sym->attr.function && sym->result == sym)
2718     {
2719       /* See if this is a directly recursive function call.  */
2720       gfc_gobble_whitespace ();
2721       if (sym->attr.recursive
2722           && gfc_peek_ascii_char () == '('
2723           && gfc_current_ns->proc_name == sym
2724           && !sym->attr.dimension)
2725         {
2726           gfc_error ("'%s' at %C is the name of a recursive function "
2727                      "and so refers to the result variable. Use an "
2728                      "explicit RESULT variable for direct recursion "
2729                      "(12.5.2.1)", sym->name);
2730           return MATCH_ERROR;
2731         }
2732
2733       if (gfc_is_function_return_value (sym, gfc_current_ns))
2734         goto variable;
2735
2736       if (sym->attr.entry
2737           && (sym->ns == gfc_current_ns
2738               || sym->ns == gfc_current_ns->parent))
2739         {
2740           gfc_entry_list *el = NULL;
2741           
2742           for (el = sym->ns->entries; el; el = el->next)
2743             if (sym == el->sym)
2744               goto variable;
2745         }
2746     }
2747
2748   if (gfc_matching_procptr_assignment)
2749     goto procptr0;
2750
2751   if (sym->attr.function || sym->attr.external || sym->attr.intrinsic)
2752     goto function0;
2753
2754   if (sym->attr.generic)
2755     goto generic_function;
2756
2757   switch (sym->attr.flavor)
2758     {
2759     case FL_VARIABLE:
2760     variable:
2761       e = gfc_get_expr ();
2762
2763       e->expr_type = EXPR_VARIABLE;
2764       e->symtree = symtree;
2765
2766       m = gfc_match_varspec (e, 0, false, true);
2767       break;
2768
2769     case FL_PARAMETER:
2770       /* A statement of the form "REAL, parameter :: a(0:10) = 1" will
2771          end up here.  Unfortunately, sym->value->expr_type is set to 
2772          EXPR_CONSTANT, and so the if () branch would be followed without
2773          the !sym->as check.  */
2774       if (sym->value && sym->value->expr_type != EXPR_ARRAY && !sym->as)
2775         e = gfc_copy_expr (sym->value);
2776       else
2777         {
2778           e = gfc_get_expr ();
2779           e->expr_type = EXPR_VARIABLE;
2780         }
2781
2782       e->symtree = symtree;
2783       m = gfc_match_varspec (e, 0, false, true);
2784
2785       if (sym->ts.is_c_interop || sym->ts.is_iso_c)
2786         break;
2787
2788       /* Variable array references to derived type parameters cause
2789          all sorts of headaches in simplification. Treating such
2790          expressions as variable works just fine for all array
2791          references.  */
2792       if (sym->value && sym->ts.type == BT_DERIVED && e->ref)
2793         {
2794           for (ref = e->ref; ref; ref = ref->next)
2795             if (ref->type == REF_ARRAY)
2796               break;
2797
2798           if (ref == NULL || ref->u.ar.type == AR_FULL)
2799             break;
2800
2801           ref = e->ref;
2802           e->ref = NULL;
2803           gfc_free_expr (e);
2804           e = gfc_get_expr ();
2805           e->expr_type = EXPR_VARIABLE;
2806           e->symtree = symtree;
2807           e->ref = ref;
2808         }
2809
2810       break;
2811
2812     case FL_DERIVED:
2813       sym = gfc_use_derived (sym);
2814       if (sym == NULL)
2815         m = MATCH_ERROR;
2816       else
2817         goto generic_function;
2818       break;
2819
2820     /* If we're here, then the name is known to be the name of a
2821        procedure, yet it is not sure to be the name of a function.  */
2822     case FL_PROCEDURE:
2823
2824     /* Procedure Pointer Assignments. */
2825     procptr0:
2826       if (gfc_matching_procptr_assignment)
2827         {
2828           gfc_gobble_whitespace ();
2829           if (!sym->attr.dimension && gfc_peek_ascii_char () == '(')
2830             /* Parse functions returning a procptr.  */
2831             goto function0;
2832
2833           if (gfc_is_intrinsic (sym, 0, gfc_current_locus)
2834               || gfc_is_intrinsic (sym, 1, gfc_current_locus))
2835             sym->attr.intrinsic = 1;
2836           e = gfc_get_expr ();
2837           e->expr_type = EXPR_VARIABLE;
2838           e->symtree = symtree;
2839           m = gfc_match_varspec (e, 0, false, true);
2840           break;
2841         }
2842
2843       if (sym->attr.subroutine)
2844         {
2845           gfc_error ("Unexpected use of subroutine name '%s' at %C",
2846                      sym->name);
2847           m = MATCH_ERROR;
2848           break;
2849         }
2850
2851       /* At this point, the name has to be a non-statement function.
2852          If the name is the same as the current function being
2853          compiled, then we have a variable reference (to the function
2854          result) if the name is non-recursive.  */
2855
2856       st = gfc_enclosing_unit (NULL);
2857
2858       if (st != NULL && st->state == COMP_FUNCTION
2859           && st->sym == sym
2860           && !sym->attr.recursive)
2861         {
2862           e = gfc_get_expr ();
2863           e->symtree = symtree;
2864           e->expr_type = EXPR_VARIABLE;
2865
2866           m = gfc_match_varspec (e, 0, false, true);
2867           break;
2868         }
2869
2870     /* Match a function reference.  */
2871     function0:
2872       m = gfc_match_actual_arglist (0, &actual_arglist);
2873       if (m == MATCH_NO)
2874         {
2875           if (sym->attr.proc == PROC_ST_FUNCTION)
2876             gfc_error ("Statement function '%s' requires argument list at %C",
2877                        sym->name);
2878           else
2879             gfc_error ("Function '%s' requires an argument list at %C",
2880                        sym->name);
2881
2882           m = MATCH_ERROR;
2883           break;
2884         }
2885
2886       if (m != MATCH_YES)
2887         {
2888           m = MATCH_ERROR;
2889           break;
2890         }
2891
2892       gfc_get_ha_sym_tree (name, &symtree);     /* Can't fail */
2893       sym = symtree->n.sym;
2894
2895       replace_hidden_procptr_result (&sym, &symtree);
2896
2897       e = gfc_get_expr ();
2898       e->symtree = symtree;
2899       e->expr_type = EXPR_FUNCTION;
2900       e->value.function.actual = actual_arglist;
2901       e->where = gfc_current_locus;
2902
2903       if (sym->ts.type == BT_CLASS && sym->attr.class_ok
2904           && CLASS_DATA (sym)->as)
2905         e->rank = CLASS_DATA (sym)->as->rank;
2906       else if (sym->as != NULL)
2907         e->rank = sym->as->rank;
2908
2909       if (!sym->attr.function
2910           && gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
2911         {
2912           m = MATCH_ERROR;
2913           break;
2914         }
2915
2916       /* Check here for the existence of at least one argument for the
2917          iso_c_binding functions C_LOC, C_FUNLOC, and C_ASSOCIATED.  The
2918          argument(s) given will be checked in gfc_iso_c_func_interface,
2919          during resolution of the function call.  */
2920       if (sym->attr.is_iso_c == 1
2921           && (sym->from_intmod == INTMOD_ISO_C_BINDING
2922               && (sym->intmod_sym_id == ISOCBINDING_LOC
2923                   || sym->intmod_sym_id == ISOCBINDING_FUNLOC
2924                   || sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)))
2925         {
2926           /* make sure we were given a param */
2927           if (actual_arglist == NULL)
2928             {
2929               gfc_error ("Missing argument to '%s' at %C", sym->name);
2930               m = MATCH_ERROR;
2931               break;
2932             }
2933         }
2934
2935       if (sym->result == NULL)
2936         sym->result = sym;
2937
2938       m = MATCH_YES;
2939       break;
2940
2941     case FL_UNKNOWN:
2942
2943       /* Special case for derived type variables that get their types
2944          via an IMPLICIT statement.  This can't wait for the
2945          resolution phase.  */
2946
2947       if (gfc_peek_ascii_char () == '%'
2948           && sym->ts.type == BT_UNKNOWN
2949           && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
2950         gfc_set_default_type (sym, 0, sym->ns);
2951
2952       /* If the symbol has a (co)dimension attribute, the expression is a
2953          variable.  */
2954
2955       if (sym->attr.dimension || sym->attr.codimension)
2956         {
2957           if (gfc_add_flavor (&sym->attr, FL_VARIABLE,
2958                               sym->name, NULL) == FAILURE)
2959             {
2960               m = MATCH_ERROR;
2961               break;
2962             }
2963
2964           e = gfc_get_expr ();
2965           e->symtree = symtree;
2966           e->expr_type = EXPR_VARIABLE;
2967           m = gfc_match_varspec (e, 0, false, true);
2968           break;
2969         }
2970
2971       if (sym->ts.type == BT_CLASS && sym->attr.class_ok
2972           && (CLASS_DATA (sym)->attr.dimension
2973               || CLASS_DATA (sym)->attr.codimension))
2974         {
2975           if (gfc_add_flavor (&sym->attr, FL_VARIABLE,
2976                               sym->name, NULL) == FAILURE)
2977             {
2978               m = MATCH_ERROR;
2979               break;
2980             }
2981
2982           e = gfc_get_expr ();
2983           e->symtree = symtree;
2984           e->expr_type = EXPR_VARIABLE;
2985           m = gfc_match_varspec (e, 0, false, true);
2986           break;
2987         }
2988
2989       /* Name is not an array, so we peek to see if a '(' implies a
2990          function call or a substring reference.  Otherwise the
2991          variable is just a scalar.  */
2992
2993       gfc_gobble_whitespace ();
2994       if (gfc_peek_ascii_char () != '(')
2995         {
2996           /* Assume a scalar variable */
2997           e = gfc_get_expr ();
2998           e->symtree = symtree;
2999           e->expr_type = EXPR_VARIABLE;
3000
3001           if (gfc_add_flavor (&sym->attr, FL_VARIABLE,
3002                               sym->name, NULL) == FAILURE)
3003             {
3004               m = MATCH_ERROR;
3005               break;
3006             }
3007
3008           /*FIXME:??? gfc_match_varspec does set this for us: */
3009           e->ts = sym->ts;
3010           m = gfc_match_varspec (e, 0, false, true);
3011           break;
3012         }
3013
3014       /* See if this is a function reference with a keyword argument
3015          as first argument. We do this because otherwise a spurious
3016          symbol would end up in the symbol table.  */
3017
3018       old_loc = gfc_current_locus;
3019       m2 = gfc_match (" ( %n =", argname);
3020       gfc_current_locus = old_loc;
3021
3022       e = gfc_get_expr ();
3023       e->symtree = symtree;
3024
3025       if (m2 != MATCH_YES)
3026         {
3027           /* Try to figure out whether we're dealing with a character type.
3028              We're peeking ahead here, because we don't want to call 
3029              match_substring if we're dealing with an implicitly typed
3030              non-character variable.  */
3031           implicit_char = false;
3032           if (sym->ts.type == BT_UNKNOWN)
3033             {
3034               ts = gfc_get_default_type (sym->name, NULL);
3035               if (ts->type == BT_CHARACTER)
3036                 implicit_char = true;
3037             }
3038
3039           /* See if this could possibly be a substring reference of a name
3040              that we're not sure is a variable yet.  */
3041
3042           if ((implicit_char || sym->ts.type == BT_CHARACTER)
3043               && match_substring (sym->ts.u.cl, 0, &e->ref) == MATCH_YES)
3044             {
3045
3046               e->expr_type = EXPR_VARIABLE;
3047
3048               if (sym->attr.flavor != FL_VARIABLE
3049                   && gfc_add_flavor (&sym->attr, FL_VARIABLE,
3050                                      sym->name, NULL) == FAILURE)
3051                 {
3052                   m = MATCH_ERROR;
3053                   break;
3054                 }
3055
3056               if (sym->ts.type == BT_UNKNOWN
3057                   && gfc_set_default_type (sym, 1, NULL) == FAILURE)
3058                 {
3059                   m = MATCH_ERROR;
3060                   break;
3061                 }
3062
3063               e->ts = sym->ts;
3064               if (e->ref)
3065                 e->ts.u.cl = NULL;
3066               m = MATCH_YES;
3067               break;
3068             }
3069         }
3070
3071       /* Give up, assume we have a function.  */
3072
3073       gfc_get_sym_tree (name, NULL, &symtree, false);   /* Can't fail */
3074       sym = symtree->n.sym;
3075       e->expr_type = EXPR_FUNCTION;
3076
3077       if (!sym->attr.function
3078           && gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
3079         {
3080           m = MATCH_ERROR;
3081           break;
3082         }
3083
3084       sym->result = sym;
3085
3086       m = gfc_match_actual_arglist (0, &e->value.function.actual);
3087       if (m == MATCH_NO)
3088         gfc_error ("Missing argument list in function '%s' at %C", sym->name);
3089
3090       if (m != MATCH_YES)
3091         {
3092           m = MATCH_ERROR;
3093           break;
3094         }
3095
3096       /* If our new function returns a character, array or structure
3097          type, it might have subsequent references.  */
3098
3099       m = gfc_match_varspec (e, 0, false, true);
3100       if (m == MATCH_NO)
3101         m = MATCH_YES;
3102
3103       break;
3104
3105     generic_function:
3106       gfc_get_sym_tree (name, NULL, &symtree, false);   /* Can't fail */
3107
3108       e = gfc_get_expr ();
3109       e->symtree = symtree;
3110       e->expr_type = EXPR_FUNCTION;
3111
3112       if (sym->attr.flavor == FL_DERIVED)
3113         {
3114           e->value.function.esym = sym;
3115           e->symtree->n.sym->attr.generic = 1;
3116         }
3117
3118       m = gfc_match_actual_arglist (0, &e->value.function.actual);
3119       break;
3120
3121     default:
3122       gfc_error ("Symbol at %C is not appropriate for an expression");
3123       return MATCH_ERROR;
3124     }
3125
3126   if (m == MATCH_YES)
3127     {
3128       e->where = where;
3129       *result = e;
3130     }
3131   else
3132     gfc_free_expr (e);
3133
3134   return m;
3135 }
3136
3137
3138 /* Match a variable, i.e. something that can be assigned to.  This
3139    starts as a symbol, can be a structure component or an array
3140    reference.  It can be a function if the function doesn't have a
3141    separate RESULT variable.  If the symbol has not been previously
3142    seen, we assume it is a variable.
3143
3144    This function is called by two interface functions:
3145    gfc_match_variable, which has host_flag = 1, and
3146    gfc_match_equiv_variable, with host_flag = 0, to restrict the
3147    match of the symbol to the local scope.  */
3148
3149 static match
3150 match_variable (gfc_expr **result, int equiv_flag, int host_flag)
3151 {
3152   gfc_symbol *sym;
3153   gfc_symtree *st;
3154   gfc_expr *expr;
3155   locus where;
3156   match m;
3157
3158   /* Since nothing has any business being an lvalue in a module
3159      specification block, an interface block or a contains section,
3160      we force the changed_symbols mechanism to work by setting
3161      host_flag to 0. This prevents valid symbols that have the name
3162      of keywords, such as 'end', being turned into variables by
3163      failed matching to assignments for, e.g., END INTERFACE.  */
3164   if (gfc_current_state () == COMP_MODULE
3165       || gfc_current_state () == COMP_INTERFACE
3166       || gfc_current_state () == COMP_CONTAINS)
3167     host_flag = 0;
3168
3169   where = gfc_current_locus;
3170   m = gfc_match_sym_tree (&st, host_flag);
3171   if (m != MATCH_YES)
3172     return m;
3173
3174   sym = st->n.sym;
3175
3176   /* If this is an implicit do loop index and implicitly typed,
3177      it should not be host associated.  */
3178   m = check_for_implicit_index (&st, &sym);
3179   if (m != MATCH_YES)
3180     return m;
3181
3182   sym->attr.implied_index = 0;
3183
3184   gfc_set_sym_referenced (sym);
3185   switch (sym->attr.flavor)
3186     {
3187     case FL_VARIABLE:
3188       /* Everything is alright.  */
3189       break;
3190
3191     case FL_UNKNOWN:
3192       {
3193         sym_flavor flavor = FL_UNKNOWN;
3194
3195         gfc_gobble_whitespace ();
3196
3197         if (sym->attr.external || sym->attr.procedure
3198             || sym->attr.function || sym->attr.subroutine)
3199           flavor = FL_PROCEDURE;
3200
3201         /* If it is not a procedure, is not typed and is host associated,
3202            we cannot give it a flavor yet.  */
3203         else if (sym->ns == gfc_current_ns->parent
3204                    && sym->ts.type == BT_UNKNOWN)
3205           break;
3206
3207         /* These are definitive indicators that this is a variable.  */
3208         else if (gfc_peek_ascii_char () != '(' || sym->ts.type != BT_UNKNOWN
3209                  || sym->attr.pointer || sym->as != NULL)
3210           flavor = FL_VARIABLE;
3211
3212         if (flavor != FL_UNKNOWN
3213             && gfc_add_flavor (&sym->attr, flavor, sym->name, NULL) == FAILURE)
3214           return MATCH_ERROR;
3215       }
3216       break;
3217
3218     case FL_PARAMETER:
3219       if (equiv_flag)
3220         {
3221           gfc_error ("Named constant at %C in an EQUIVALENCE");
3222           return MATCH_ERROR;
3223         }
3224       /* Otherwise this is checked for and an error given in the
3225          variable definition context checks.  */
3226       break;
3227
3228     case FL_PROCEDURE:
3229       /* Check for a nonrecursive function result variable.  */
3230       if (sym->attr.function
3231           && !sym->attr.external
3232           && sym->result == sym
3233           && (gfc_is_function_return_value (sym, gfc_current_ns)
3234               || (sym->attr.entry
3235                   && sym->ns == gfc_current_ns)
3236               || (sym->attr.entry
3237                   && sym->ns == gfc_current_ns->parent)))
3238         {
3239           /* If a function result is a derived type, then the derived
3240              type may still have to be resolved.  */
3241
3242           if (sym->ts.type == BT_DERIVED
3243               && gfc_use_derived (sym->ts.u.derived) == NULL)
3244             return MATCH_ERROR;
3245           break;
3246         }
3247
3248       if (sym->attr.proc_pointer
3249           || replace_hidden_procptr_result (&sym, &st) == SUCCESS)
3250         break;
3251
3252       /* Fall through to error */
3253
3254     default:
3255       gfc_error ("'%s' at %C is not a variable", sym->name);
3256       return MATCH_ERROR;
3257     }
3258
3259   /* Special case for derived type variables that get their types
3260      via an IMPLICIT statement.  This can't wait for the
3261      resolution phase.  */
3262
3263     {
3264       gfc_namespace * implicit_ns;
3265
3266       if (gfc_current_ns->proc_name == sym)
3267         implicit_ns = gfc_current_ns;
3268       else
3269         implicit_ns = sym->ns;
3270         
3271       if (gfc_peek_ascii_char () == '%'
3272           && sym->ts.type == BT_UNKNOWN
3273           && gfc_get_default_type (sym->name, implicit_ns)->type == BT_DERIVED)
3274         gfc_set_default_type (sym, 0, implicit_ns);
3275     }
3276
3277   expr = gfc_get_expr ();
3278
3279   expr->expr_type = EXPR_VARIABLE;
3280   expr->symtree = st;
3281   expr->ts = sym->ts;
3282   expr->where = where;
3283
3284   /* Now see if we have to do more.  */
3285   m = gfc_match_varspec (expr, equiv_flag, false, false);
3286   if (m != MATCH_YES)
3287     {
3288       gfc_free_expr (expr);
3289       return m;
3290     }
3291
3292   *result = expr;
3293   return MATCH_YES;
3294 }
3295
3296
3297 match
3298 gfc_match_variable (gfc_expr **result, int equiv_flag)
3299 {
3300   return match_variable (result, equiv_flag, 1);
3301 }
3302
3303
3304 match
3305 gfc_match_equiv_variable (gfc_expr **result)
3306 {
3307   return match_variable (result, 1, 0);
3308 }
3309