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