OSDN Git Service

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