OSDN Git Service

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