OSDN Git Service

2008-08-22 Daniel Kraft <d@domob.eu>
[pf3gnuchains/gcc-fork.git] / gcc / fortran / decl.c
1 /* Declaration statement matcher
2    Copyright (C) 2002, 2004, 2005, 2006, 2007, 2008
3    Free Software Foundation, Inc.
4    Contributed by Andy Vaught
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "gfortran.h"
25 #include "match.h"
26 #include "parse.h"
27
28
29 /* Macros to access allocate memory for gfc_data_variable,
30    gfc_data_value and gfc_data.  */
31 #define gfc_get_data_variable() XCNEW (gfc_data_variable)
32 #define gfc_get_data_value() XCNEW (gfc_data_value)
33 #define gfc_get_data() XCNEW (gfc_data)
34
35
36 /* This flag is set if an old-style length selector is matched
37    during a type-declaration statement.  */
38
39 static int old_char_selector;
40
41 /* When variables acquire types and attributes from a declaration
42    statement, they get them from the following static variables.  The
43    first part of a declaration sets these variables and the second
44    part copies these into symbol structures.  */
45
46 static gfc_typespec current_ts;
47
48 static symbol_attribute current_attr;
49 static gfc_array_spec *current_as;
50 static int colon_seen;
51
52 /* The current binding label (if any).  */
53 static char curr_binding_label[GFC_MAX_BINDING_LABEL_LEN + 1];
54 /* Need to know how many identifiers are on the current data declaration
55    line in case we're given the BIND(C) attribute with a NAME= specifier.  */
56 static int num_idents_on_line;
57 /* Need to know if a NAME= specifier was found during gfc_match_bind_c so we
58    can supply a name if the curr_binding_label is nil and NAME= was not.  */
59 static int has_name_equals = 0;
60
61 /* Initializer of the previous enumerator.  */
62
63 static gfc_expr *last_initializer;
64
65 /* History of all the enumerators is maintained, so that
66    kind values of all the enumerators could be updated depending
67    upon the maximum initialized value.  */
68
69 typedef struct enumerator_history
70 {
71   gfc_symbol *sym;
72   gfc_expr *initializer;
73   struct enumerator_history *next;
74 }
75 enumerator_history;
76
77 /* Header of enum history chain.  */
78
79 static enumerator_history *enum_history = NULL;
80
81 /* Pointer of enum history node containing largest initializer.  */
82
83 static enumerator_history *max_enum = NULL;
84
85 /* gfc_new_block points to the symbol of a newly matched block.  */
86
87 gfc_symbol *gfc_new_block;
88
89 bool gfc_matching_function;
90
91
92 /********************* DATA statement subroutines *********************/
93
94 static bool in_match_data = false;
95
96 bool
97 gfc_in_match_data (void)
98 {
99   return in_match_data;
100 }
101
102 static void
103 set_in_match_data (bool set_value)
104 {
105   in_match_data = set_value;
106 }
107
108 /* Free a gfc_data_variable structure and everything beneath it.  */
109
110 static void
111 free_variable (gfc_data_variable *p)
112 {
113   gfc_data_variable *q;
114
115   for (; p; p = q)
116     {
117       q = p->next;
118       gfc_free_expr (p->expr);
119       gfc_free_iterator (&p->iter, 0);
120       free_variable (p->list);
121       gfc_free (p);
122     }
123 }
124
125
126 /* Free a gfc_data_value structure and everything beneath it.  */
127
128 static void
129 free_value (gfc_data_value *p)
130 {
131   gfc_data_value *q;
132
133   for (; p; p = q)
134     {
135       q = p->next;
136       gfc_free_expr (p->expr);
137       gfc_free (p);
138     }
139 }
140
141
142 /* Free a list of gfc_data structures.  */
143
144 void
145 gfc_free_data (gfc_data *p)
146 {
147   gfc_data *q;
148
149   for (; p; p = q)
150     {
151       q = p->next;
152       free_variable (p->var);
153       free_value (p->value);
154       gfc_free (p);
155     }
156 }
157
158
159 /* Free all data in a namespace.  */
160
161 static void
162 gfc_free_data_all (gfc_namespace *ns)
163 {
164   gfc_data *d;
165
166   for (;ns->data;)
167     {
168       d = ns->data->next;
169       gfc_free (ns->data);
170       ns->data = d;
171     }
172 }
173
174
175 static match var_element (gfc_data_variable *);
176
177 /* Match a list of variables terminated by an iterator and a right
178    parenthesis.  */
179
180 static match
181 var_list (gfc_data_variable *parent)
182 {
183   gfc_data_variable *tail, var;
184   match m;
185
186   m = var_element (&var);
187   if (m == MATCH_ERROR)
188     return MATCH_ERROR;
189   if (m == MATCH_NO)
190     goto syntax;
191
192   tail = gfc_get_data_variable ();
193   *tail = var;
194
195   parent->list = tail;
196
197   for (;;)
198     {
199       if (gfc_match_char (',') != MATCH_YES)
200         goto syntax;
201
202       m = gfc_match_iterator (&parent->iter, 1);
203       if (m == MATCH_YES)
204         break;
205       if (m == MATCH_ERROR)
206         return MATCH_ERROR;
207
208       m = var_element (&var);
209       if (m == MATCH_ERROR)
210         return MATCH_ERROR;
211       if (m == MATCH_NO)
212         goto syntax;
213
214       tail->next = gfc_get_data_variable ();
215       tail = tail->next;
216
217       *tail = var;
218     }
219
220   if (gfc_match_char (')') != MATCH_YES)
221     goto syntax;
222   return MATCH_YES;
223
224 syntax:
225   gfc_syntax_error (ST_DATA);
226   return MATCH_ERROR;
227 }
228
229
230 /* Match a single element in a data variable list, which can be a
231    variable-iterator list.  */
232
233 static match
234 var_element (gfc_data_variable *new_var)
235 {
236   match m;
237   gfc_symbol *sym;
238
239   memset (new_var, 0, sizeof (gfc_data_variable));
240
241   if (gfc_match_char ('(') == MATCH_YES)
242     return var_list (new_var);
243
244   m = gfc_match_variable (&new_var->expr, 0);
245   if (m != MATCH_YES)
246     return m;
247
248   sym = new_var->expr->symtree->n.sym;
249
250   /* Symbol should already have an associated type.  */
251   if (gfc_check_symbol_typed (sym, gfc_current_ns,
252                               false, gfc_current_locus) == FAILURE)
253     return MATCH_ERROR;
254
255   if (!sym->attr.function && gfc_current_ns->parent
256       && gfc_current_ns->parent == sym->ns)
257     {
258       gfc_error ("Host associated variable '%s' may not be in the DATA "
259                  "statement at %C", sym->name);
260       return MATCH_ERROR;
261     }
262
263   if (gfc_current_state () != COMP_BLOCK_DATA
264       && sym->attr.in_common
265       && gfc_notify_std (GFC_STD_GNU, "Extension: initialization of "
266                          "common block variable '%s' in DATA statement at %C",
267                          sym->name) == FAILURE)
268     return MATCH_ERROR;
269
270   if (gfc_add_data (&sym->attr, sym->name, &new_var->expr->where) == FAILURE)
271     return MATCH_ERROR;
272
273   return MATCH_YES;
274 }
275
276
277 /* Match the top-level list of data variables.  */
278
279 static match
280 top_var_list (gfc_data *d)
281 {
282   gfc_data_variable var, *tail, *new_var;
283   match m;
284
285   tail = NULL;
286
287   for (;;)
288     {
289       m = var_element (&var);
290       if (m == MATCH_NO)
291         goto syntax;
292       if (m == MATCH_ERROR)
293         return MATCH_ERROR;
294
295       new_var = gfc_get_data_variable ();
296       *new_var = var;
297
298       if (tail == NULL)
299         d->var = new_var;
300       else
301         tail->next = new_var;
302
303       tail = new_var;
304
305       if (gfc_match_char ('/') == MATCH_YES)
306         break;
307       if (gfc_match_char (',') != MATCH_YES)
308         goto syntax;
309     }
310
311   return MATCH_YES;
312
313 syntax:
314   gfc_syntax_error (ST_DATA);
315   gfc_free_data_all (gfc_current_ns);
316   return MATCH_ERROR;
317 }
318
319
320 static match
321 match_data_constant (gfc_expr **result)
322 {
323   char name[GFC_MAX_SYMBOL_LEN + 1];
324   gfc_symbol *sym;
325   gfc_expr *expr;
326   match m;
327   locus old_loc;
328
329   m = gfc_match_literal_constant (&expr, 1);
330   if (m == MATCH_YES)
331     {
332       *result = expr;
333       return MATCH_YES;
334     }
335
336   if (m == MATCH_ERROR)
337     return MATCH_ERROR;
338
339   m = gfc_match_null (result);
340   if (m != MATCH_NO)
341     return m;
342
343   old_loc = gfc_current_locus;
344
345   /* Should this be a structure component, try to match it
346      before matching a name.  */
347   m = gfc_match_rvalue (result);
348   if (m == MATCH_ERROR)
349     return m;
350
351   if (m == MATCH_YES && (*result)->expr_type == EXPR_STRUCTURE)
352     {
353       if (gfc_simplify_expr (*result, 0) == FAILURE)
354         m = MATCH_ERROR;
355       return m;
356     }
357
358   gfc_current_locus = old_loc;
359
360   m = gfc_match_name (name);
361   if (m != MATCH_YES)
362     return m;
363
364   if (gfc_find_symbol (name, NULL, 1, &sym))
365     return MATCH_ERROR;
366
367   if (sym == NULL
368       || (sym->attr.flavor != FL_PARAMETER && sym->attr.flavor != FL_DERIVED))
369     {
370       gfc_error ("Symbol '%s' must be a PARAMETER in DATA statement at %C",
371                  name);
372       return MATCH_ERROR;
373     }
374   else if (sym->attr.flavor == FL_DERIVED)
375     return gfc_match_structure_constructor (sym, result, false);
376
377   /* Check to see if the value is an initialization array expression.  */
378   if (sym->value->expr_type == EXPR_ARRAY)
379     {
380       gfc_current_locus = old_loc;
381
382       m = gfc_match_init_expr (result);
383       if (m == MATCH_ERROR)
384         return m;
385
386       if (m == MATCH_YES)
387         {
388           if (gfc_simplify_expr (*result, 0) == FAILURE)
389             m = MATCH_ERROR;
390
391           if ((*result)->expr_type == EXPR_CONSTANT)
392             return m;
393           else
394             {
395               gfc_error ("Invalid initializer %s in Data statement at %C", name);
396               return MATCH_ERROR;
397             }
398         }
399     }
400
401   *result = gfc_copy_expr (sym->value);
402   return MATCH_YES;
403 }
404
405
406 /* Match a list of values in a DATA statement.  The leading '/' has
407    already been seen at this point.  */
408
409 static match
410 top_val_list (gfc_data *data)
411 {
412   gfc_data_value *new_val, *tail;
413   gfc_expr *expr;
414   match m;
415
416   tail = NULL;
417
418   for (;;)
419     {
420       m = match_data_constant (&expr);
421       if (m == MATCH_NO)
422         goto syntax;
423       if (m == MATCH_ERROR)
424         return MATCH_ERROR;
425
426       new_val = gfc_get_data_value ();
427       mpz_init (new_val->repeat);
428
429       if (tail == NULL)
430         data->value = new_val;
431       else
432         tail->next = new_val;
433
434       tail = new_val;
435
436       if (expr->ts.type != BT_INTEGER || gfc_match_char ('*') != MATCH_YES)
437         {
438           tail->expr = expr;
439           mpz_set_ui (tail->repeat, 1);
440         }
441       else
442         {
443           if (expr->ts.type == BT_INTEGER)
444             mpz_set (tail->repeat, expr->value.integer);
445           gfc_free_expr (expr);
446
447           m = match_data_constant (&tail->expr);
448           if (m == MATCH_NO)
449             goto syntax;
450           if (m == MATCH_ERROR)
451             return MATCH_ERROR;
452         }
453
454       if (gfc_match_char ('/') == MATCH_YES)
455         break;
456       if (gfc_match_char (',') == MATCH_NO)
457         goto syntax;
458     }
459
460   return MATCH_YES;
461
462 syntax:
463   gfc_syntax_error (ST_DATA);
464   gfc_free_data_all (gfc_current_ns);
465   return MATCH_ERROR;
466 }
467
468
469 /* Matches an old style initialization.  */
470
471 static match
472 match_old_style_init (const char *name)
473 {
474   match m;
475   gfc_symtree *st;
476   gfc_symbol *sym;
477   gfc_data *newdata;
478
479   /* Set up data structure to hold initializers.  */
480   gfc_find_sym_tree (name, NULL, 0, &st);
481   sym = st->n.sym;
482
483   newdata = gfc_get_data ();
484   newdata->var = gfc_get_data_variable ();
485   newdata->var->expr = gfc_get_variable_expr (st);
486   newdata->where = gfc_current_locus;
487
488   /* Match initial value list. This also eats the terminal '/'.  */
489   m = top_val_list (newdata);
490   if (m != MATCH_YES)
491     {
492       gfc_free (newdata);
493       return m;
494     }
495
496   if (gfc_pure (NULL))
497     {
498       gfc_error ("Initialization at %C is not allowed in a PURE procedure");
499       gfc_free (newdata);
500       return MATCH_ERROR;
501     }
502
503   /* Mark the variable as having appeared in a data statement.  */
504   if (gfc_add_data (&sym->attr, sym->name, &sym->declared_at) == FAILURE)
505     {
506       gfc_free (newdata);
507       return MATCH_ERROR;
508     }
509
510   /* Chain in namespace list of DATA initializers.  */
511   newdata->next = gfc_current_ns->data;
512   gfc_current_ns->data = newdata;
513
514   return m;
515 }
516
517
518 /* Match the stuff following a DATA statement. If ERROR_FLAG is set,
519    we are matching a DATA statement and are therefore issuing an error
520    if we encounter something unexpected, if not, we're trying to match
521    an old-style initialization expression of the form INTEGER I /2/.  */
522
523 match
524 gfc_match_data (void)
525 {
526   gfc_data *new_data;
527   match m;
528
529   set_in_match_data (true);
530
531   for (;;)
532     {
533       new_data = gfc_get_data ();
534       new_data->where = gfc_current_locus;
535
536       m = top_var_list (new_data);
537       if (m != MATCH_YES)
538         goto cleanup;
539
540       m = top_val_list (new_data);
541       if (m != MATCH_YES)
542         goto cleanup;
543
544       new_data->next = gfc_current_ns->data;
545       gfc_current_ns->data = new_data;
546
547       if (gfc_match_eos () == MATCH_YES)
548         break;
549
550       gfc_match_char (',');     /* Optional comma */
551     }
552
553   set_in_match_data (false);
554
555   if (gfc_pure (NULL))
556     {
557       gfc_error ("DATA statement at %C is not allowed in a PURE procedure");
558       return MATCH_ERROR;
559     }
560
561   return MATCH_YES;
562
563 cleanup:
564   set_in_match_data (false);
565   gfc_free_data (new_data);
566   return MATCH_ERROR;
567 }
568
569
570 /************************ Declaration statements *********************/
571
572 /* Match an intent specification.  Since this can only happen after an
573    INTENT word, a legal intent-spec must follow.  */
574
575 static sym_intent
576 match_intent_spec (void)
577 {
578
579   if (gfc_match (" ( in out )") == MATCH_YES)
580     return INTENT_INOUT;
581   if (gfc_match (" ( in )") == MATCH_YES)
582     return INTENT_IN;
583   if (gfc_match (" ( out )") == MATCH_YES)
584     return INTENT_OUT;
585
586   gfc_error ("Bad INTENT specification at %C");
587   return INTENT_UNKNOWN;
588 }
589
590
591 /* Matches a character length specification, which is either a
592    specification expression or a '*'.  */
593
594 static match
595 char_len_param_value (gfc_expr **expr)
596 {
597   match m;
598
599   if (gfc_match_char ('*') == MATCH_YES)
600     {
601       *expr = NULL;
602       return MATCH_YES;
603     }
604
605   m = gfc_match_expr (expr);
606
607   if (m == MATCH_YES
608       && gfc_expr_check_typed (*expr, gfc_current_ns, false) == FAILURE)
609     return MATCH_ERROR;
610
611   if (m == MATCH_YES && (*expr)->expr_type == EXPR_FUNCTION)
612     {
613       if ((*expr)->value.function.actual
614           && (*expr)->value.function.actual->expr->symtree)
615         {
616           gfc_expr *e;
617           e = (*expr)->value.function.actual->expr;
618           if (e->symtree->n.sym->attr.flavor == FL_PROCEDURE
619               && e->expr_type == EXPR_VARIABLE)
620             {
621               if (e->symtree->n.sym->ts.type == BT_UNKNOWN)
622                 goto syntax;
623               if (e->symtree->n.sym->ts.type == BT_CHARACTER
624                   && e->symtree->n.sym->ts.cl
625                   && e->symtree->n.sym->ts.cl->length->ts.type == BT_UNKNOWN)
626                 goto syntax;
627             }
628         }
629     }
630   return m;
631
632 syntax:
633   gfc_error ("Conflict in attributes of function argument at %C");
634   return MATCH_ERROR;
635 }
636
637
638 /* A character length is a '*' followed by a literal integer or a
639    char_len_param_value in parenthesis.  */
640
641 static match
642 match_char_length (gfc_expr **expr)
643 {
644   int length;
645   match m;
646
647   m = gfc_match_char ('*');
648   if (m != MATCH_YES)
649     return m;
650
651   m = gfc_match_small_literal_int (&length, NULL);
652   if (m == MATCH_ERROR)
653     return m;
654
655   if (m == MATCH_YES)
656     {
657       *expr = gfc_int_expr (length);
658       return m;
659     }
660
661   if (gfc_match_char ('(') == MATCH_NO)
662     goto syntax;
663
664   m = char_len_param_value (expr);
665   if (m != MATCH_YES && gfc_matching_function)
666     {
667       gfc_undo_symbols ();
668       m = MATCH_YES;
669     }
670
671   if (m == MATCH_ERROR)
672     return m;
673   if (m == MATCH_NO)
674     goto syntax;
675
676   if (gfc_match_char (')') == MATCH_NO)
677     {
678       gfc_free_expr (*expr);
679       *expr = NULL;
680       goto syntax;
681     }
682
683   return MATCH_YES;
684
685 syntax:
686   gfc_error ("Syntax error in character length specification at %C");
687   return MATCH_ERROR;
688 }
689
690
691 /* Special subroutine for finding a symbol.  Check if the name is found
692    in the current name space.  If not, and we're compiling a function or
693    subroutine and the parent compilation unit is an interface, then check
694    to see if the name we've been given is the name of the interface
695    (located in another namespace).  */
696
697 static int
698 find_special (const char *name, gfc_symbol **result)
699 {
700   gfc_state_data *s;
701   int i;
702
703   i = gfc_get_symbol (name, NULL, result);
704   if (i == 0)
705     goto end;
706
707   if (gfc_current_state () != COMP_SUBROUTINE
708       && gfc_current_state () != COMP_FUNCTION)
709     goto end;
710
711   s = gfc_state_stack->previous;
712   if (s == NULL)
713     goto end;
714
715   if (s->state != COMP_INTERFACE)
716     goto end;
717   if (s->sym == NULL)
718     goto end;             /* Nameless interface.  */
719
720   if (strcmp (name, s->sym->name) == 0)
721     {
722       *result = s->sym;
723       return 0;
724     }
725
726 end:
727   return i;
728 }
729
730
731 /* Special subroutine for getting a symbol node associated with a
732    procedure name, used in SUBROUTINE and FUNCTION statements.  The
733    symbol is created in the parent using with symtree node in the
734    child unit pointing to the symbol.  If the current namespace has no
735    parent, then the symbol is just created in the current unit.  */
736
737 static int
738 get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
739 {
740   gfc_symtree *st;
741   gfc_symbol *sym;
742   int rc = 0;
743
744   /* Module functions have to be left in their own namespace because
745      they have potentially (almost certainly!) already been referenced.
746      In this sense, they are rather like external functions.  This is
747      fixed up in resolve.c(resolve_entries), where the symbol name-
748      space is set to point to the master function, so that the fake
749      result mechanism can work.  */
750   if (module_fcn_entry)
751     {
752       /* Present if entry is declared to be a module procedure.  */
753       rc = gfc_find_symbol (name, gfc_current_ns->parent, 0, result);
754
755       if (*result == NULL)
756         rc = gfc_get_symbol (name, NULL, result);
757       else if (!gfc_get_symbol (name, NULL, &sym) && sym
758                  && (*result)->ts.type == BT_UNKNOWN
759                  && sym->attr.flavor == FL_UNKNOWN)
760         /* Pick up the typespec for the entry, if declared in the function
761            body.  Note that this symbol is FL_UNKNOWN because it will
762            only have appeared in a type declaration.  The local symtree
763            is set to point to the module symbol and a unique symtree
764            to the local version.  This latter ensures a correct clearing
765            of the symbols.  */
766         {
767           /* If the ENTRY proceeds its specification, we need to ensure
768              that this does not raise a "has no IMPLICIT type" error.  */
769           if (sym->ts.type == BT_UNKNOWN)
770             sym->attr.untyped = 1;
771
772           (*result)->ts = sym->ts;
773
774           /* Put the symbol in the procedure namespace so that, should
775              the ENTRY precede its specification, the specification
776              can be applied.  */
777           (*result)->ns = gfc_current_ns;
778
779           gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
780           st->n.sym = *result;
781           st = gfc_get_unique_symtree (gfc_current_ns);
782           st->n.sym = sym;
783         }
784     }
785   else
786     rc = gfc_get_symbol (name, gfc_current_ns->parent, result);
787
788   if (rc)
789     return rc;
790
791   sym = *result;
792   gfc_current_ns->refs++;
793
794   if (sym && !sym->gfc_new && gfc_current_state () != COMP_INTERFACE)
795     {
796       /* Trap another encompassed procedure with the same name.  All
797          these conditions are necessary to avoid picking up an entry
798          whose name clashes with that of the encompassing procedure;
799          this is handled using gsymbols to register unique,globally
800          accessible names.  */
801       if (sym->attr.flavor != 0
802           && sym->attr.proc != 0
803           && (sym->attr.subroutine || sym->attr.function)
804           && sym->attr.if_source != IFSRC_UNKNOWN)
805         gfc_error_now ("Procedure '%s' at %C is already defined at %L",
806                        name, &sym->declared_at);
807
808       /* Trap a procedure with a name the same as interface in the
809          encompassing scope.  */
810       if (sym->attr.generic != 0
811           && (sym->attr.subroutine || sym->attr.function)
812           && !sym->attr.mod_proc)
813         gfc_error_now ("Name '%s' at %C is already defined"
814                        " as a generic interface at %L",
815                        name, &sym->declared_at);
816
817       /* Trap declarations of attributes in encompassing scope.  The
818          signature for this is that ts.kind is set.  Legitimate
819          references only set ts.type.  */
820       if (sym->ts.kind != 0
821           && !sym->attr.implicit_type
822           && sym->attr.proc == 0
823           && gfc_current_ns->parent != NULL
824           && sym->attr.access == 0
825           && !module_fcn_entry)
826         gfc_error_now ("Procedure '%s' at %C has an explicit interface "
827                        "and must not have attributes declared at %L",
828                        name, &sym->declared_at);
829     }
830
831   if (gfc_current_ns->parent == NULL || *result == NULL)
832     return rc;
833
834   /* Module function entries will already have a symtree in
835      the current namespace but will need one at module level.  */
836   if (module_fcn_entry)
837     {
838       /* Present if entry is declared to be a module procedure.  */
839       rc = gfc_find_sym_tree (name, gfc_current_ns->parent, 0, &st);
840       if (st == NULL)
841         st = gfc_new_symtree (&gfc_current_ns->parent->sym_root, name);
842     }
843   else
844     st = gfc_new_symtree (&gfc_current_ns->sym_root, name);
845
846   st->n.sym = sym;
847   sym->refs++;
848
849   /* See if the procedure should be a module procedure.  */
850
851   if (((sym->ns->proc_name != NULL
852                 && sym->ns->proc_name->attr.flavor == FL_MODULE
853                 && sym->attr.proc != PROC_MODULE)
854             || (module_fcn_entry && sym->attr.proc != PROC_MODULE))
855         && gfc_add_procedure (&sym->attr, PROC_MODULE,
856                               sym->name, NULL) == FAILURE)
857     rc = 2;
858
859   return rc;
860 }
861
862
863 /* Verify that the given symbol representing a parameter is C
864    interoperable, by checking to see if it was marked as such after
865    its declaration.  If the given symbol is not interoperable, a
866    warning is reported, thus removing the need to return the status to
867    the calling function.  The standard does not require the user use
868    one of the iso_c_binding named constants to declare an
869    interoperable parameter, but we can't be sure if the param is C
870    interop or not if the user doesn't.  For example, integer(4) may be
871    legal Fortran, but doesn't have meaning in C.  It may interop with
872    a number of the C types, which causes a problem because the
873    compiler can't know which one.  This code is almost certainly not
874    portable, and the user will get what they deserve if the C type
875    across platforms isn't always interoperable with integer(4).  If
876    the user had used something like integer(c_int) or integer(c_long),
877    the compiler could have automatically handled the varying sizes
878    across platforms.  */
879
880 gfc_try
881 verify_c_interop_param (gfc_symbol *sym)
882 {
883   int is_c_interop = 0;
884   gfc_try retval = SUCCESS;
885
886   /* We check implicitly typed variables in symbol.c:gfc_set_default_type().
887      Don't repeat the checks here.  */
888   if (sym->attr.implicit_type)
889     return SUCCESS;
890   
891   /* For subroutines or functions that are passed to a BIND(C) procedure,
892      they're interoperable if they're BIND(C) and their params are all
893      interoperable.  */
894   if (sym->attr.flavor == FL_PROCEDURE)
895     {
896       if (sym->attr.is_bind_c == 0)
897         {
898           gfc_error_now ("Procedure '%s' at %L must have the BIND(C) "
899                          "attribute to be C interoperable", sym->name,
900                          &(sym->declared_at));
901                          
902           return FAILURE;
903         }
904       else
905         {
906           if (sym->attr.is_c_interop == 1)
907             /* We've already checked this procedure; don't check it again.  */
908             return SUCCESS;
909           else
910             return verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
911                                       sym->common_block);
912         }
913     }
914   
915   /* See if we've stored a reference to a procedure that owns sym.  */
916   if (sym->ns != NULL && sym->ns->proc_name != NULL)
917     {
918       if (sym->ns->proc_name->attr.is_bind_c == 1)
919         {
920           is_c_interop =
921             (verify_c_interop (&(sym->ts), sym->name, &(sym->declared_at))
922              == SUCCESS ? 1 : 0);
923
924           if (is_c_interop != 1)
925             {
926               /* Make personalized messages to give better feedback.  */
927               if (sym->ts.type == BT_DERIVED)
928                 gfc_error ("Type '%s' at %L is a parameter to the BIND(C) "
929                            " procedure '%s' but is not C interoperable "
930                            "because derived type '%s' is not C interoperable",
931                            sym->name, &(sym->declared_at),
932                            sym->ns->proc_name->name, 
933                            sym->ts.derived->name);
934               else
935                 gfc_warning ("Variable '%s' at %L is a parameter to the "
936                              "BIND(C) procedure '%s' but may not be C "
937                              "interoperable",
938                              sym->name, &(sym->declared_at),
939                              sym->ns->proc_name->name);
940             }
941
942           /* Character strings are only C interoperable if they have a
943              length of 1.  */
944           if (sym->ts.type == BT_CHARACTER)
945             {
946               gfc_charlen *cl = sym->ts.cl;
947               if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT
948                   || mpz_cmp_si (cl->length->value.integer, 1) != 0)
949                 {
950                   gfc_error ("Character argument '%s' at %L "
951                              "must be length 1 because "
952                              "procedure '%s' is BIND(C)",
953                              sym->name, &sym->declared_at,
954                              sym->ns->proc_name->name);
955                   retval = FAILURE;
956                 }
957             }
958
959           /* We have to make sure that any param to a bind(c) routine does
960              not have the allocatable, pointer, or optional attributes,
961              according to J3/04-007, section 5.1.  */
962           if (sym->attr.allocatable == 1)
963             {
964               gfc_error ("Variable '%s' at %L cannot have the "
965                          "ALLOCATABLE attribute because procedure '%s'"
966                          " is BIND(C)", sym->name, &(sym->declared_at),
967                          sym->ns->proc_name->name);
968               retval = FAILURE;
969             }
970
971           if (sym->attr.pointer == 1)
972             {
973               gfc_error ("Variable '%s' at %L cannot have the "
974                          "POINTER attribute because procedure '%s'"
975                          " is BIND(C)", sym->name, &(sym->declared_at),
976                          sym->ns->proc_name->name);
977               retval = FAILURE;
978             }
979
980           if (sym->attr.optional == 1)
981             {
982               gfc_error ("Variable '%s' at %L cannot have the "
983                          "OPTIONAL attribute because procedure '%s'"
984                          " is BIND(C)", sym->name, &(sym->declared_at),
985                          sym->ns->proc_name->name);
986               retval = FAILURE;
987             }
988
989           /* Make sure that if it has the dimension attribute, that it is
990              either assumed size or explicit shape.  */
991           if (sym->as != NULL)
992             {
993               if (sym->as->type == AS_ASSUMED_SHAPE)
994                 {
995                   gfc_error ("Assumed-shape array '%s' at %L cannot be an "
996                              "argument to the procedure '%s' at %L because "
997                              "the procedure is BIND(C)", sym->name,
998                              &(sym->declared_at), sym->ns->proc_name->name,
999                              &(sym->ns->proc_name->declared_at));
1000                   retval = FAILURE;
1001                 }
1002
1003               if (sym->as->type == AS_DEFERRED)
1004                 {
1005                   gfc_error ("Deferred-shape array '%s' at %L cannot be an "
1006                              "argument to the procedure '%s' at %L because "
1007                              "the procedure is BIND(C)", sym->name,
1008                              &(sym->declared_at), sym->ns->proc_name->name,
1009                              &(sym->ns->proc_name->declared_at));
1010                   retval = FAILURE;
1011                 }
1012           }
1013         }
1014     }
1015
1016   return retval;
1017 }
1018
1019
1020 /* Function called by variable_decl() that adds a name to the symbol table.  */
1021
1022 static gfc_try
1023 build_sym (const char *name, gfc_charlen *cl,
1024            gfc_array_spec **as, locus *var_locus)
1025 {
1026   symbol_attribute attr;
1027   gfc_symbol *sym;
1028
1029   if (gfc_get_symbol (name, NULL, &sym))
1030     return FAILURE;
1031
1032   /* Start updating the symbol table.  Add basic type attribute if present.  */
1033   if (current_ts.type != BT_UNKNOWN
1034       && (sym->attr.implicit_type == 0
1035           || !gfc_compare_types (&sym->ts, &current_ts))
1036       && gfc_add_type (sym, &current_ts, var_locus) == FAILURE)
1037     return FAILURE;
1038
1039   if (sym->ts.type == BT_CHARACTER)
1040     sym->ts.cl = cl;
1041
1042   /* Add dimension attribute if present.  */
1043   if (gfc_set_array_spec (sym, *as, var_locus) == FAILURE)
1044     return FAILURE;
1045   *as = NULL;
1046
1047   /* Add attribute to symbol.  The copy is so that we can reset the
1048      dimension attribute.  */
1049   attr = current_attr;
1050   attr.dimension = 0;
1051
1052   if (gfc_copy_attr (&sym->attr, &attr, var_locus) == FAILURE)
1053     return FAILURE;
1054
1055   /* Finish any work that may need to be done for the binding label,
1056      if it's a bind(c).  The bind(c) attr is found before the symbol
1057      is made, and before the symbol name (for data decls), so the
1058      current_ts is holding the binding label, or nothing if the
1059      name= attr wasn't given.  Therefore, test here if we're dealing
1060      with a bind(c) and make sure the binding label is set correctly.  */
1061   if (sym->attr.is_bind_c == 1)
1062     {
1063       if (sym->binding_label[0] == '\0')
1064         {
1065           /* Set the binding label and verify that if a NAME= was specified
1066              then only one identifier was in the entity-decl-list.  */
1067           if (set_binding_label (sym->binding_label, sym->name,
1068                                  num_idents_on_line) == FAILURE)
1069             return FAILURE;
1070         }
1071     }
1072
1073   /* See if we know we're in a common block, and if it's a bind(c)
1074      common then we need to make sure we're an interoperable type.  */
1075   if (sym->attr.in_common == 1)
1076     {
1077       /* Test the common block object.  */
1078       if (sym->common_block != NULL && sym->common_block->is_bind_c == 1
1079           && sym->ts.is_c_interop != 1)
1080         {
1081           gfc_error_now ("Variable '%s' in common block '%s' at %C "
1082                          "must be declared with a C interoperable "
1083                          "kind since common block '%s' is BIND(C)",
1084                          sym->name, sym->common_block->name,
1085                          sym->common_block->name);
1086           gfc_clear_error ();
1087         }
1088     }
1089
1090   sym->attr.implied_index = 0;
1091
1092   return SUCCESS;
1093 }
1094
1095
1096 /* Set character constant to the given length. The constant will be padded or
1097    truncated.  If we're inside an array constructor without a typespec, we
1098    additionally check that all elements have the same length; check_len -1
1099    means no checking.  */
1100
1101 void
1102 gfc_set_constant_character_len (int len, gfc_expr *expr, int check_len)
1103 {
1104   gfc_char_t *s;
1105   int slen;
1106
1107   gcc_assert (expr->expr_type == EXPR_CONSTANT);
1108   gcc_assert (expr->ts.type == BT_CHARACTER);
1109
1110   slen = expr->value.character.length;
1111   if (len != slen)
1112     {
1113       s = gfc_get_wide_string (len + 1);
1114       memcpy (s, expr->value.character.string,
1115               MIN (len, slen) * sizeof (gfc_char_t));
1116       if (len > slen)
1117         gfc_wide_memset (&s[slen], ' ', len - slen);
1118
1119       if (gfc_option.warn_character_truncation && slen > len)
1120         gfc_warning_now ("CHARACTER expression at %L is being truncated "
1121                          "(%d/%d)", &expr->where, slen, len);
1122
1123       /* Apply the standard by 'hand' otherwise it gets cleared for
1124          initializers.  */
1125       if (check_len != -1 && slen != check_len
1126           && !(gfc_option.allow_std & GFC_STD_GNU))
1127         gfc_error_now ("The CHARACTER elements of the array constructor "
1128                        "at %L must have the same length (%d/%d)",
1129                         &expr->where, slen, check_len);
1130
1131       s[len] = '\0';
1132       gfc_free (expr->value.character.string);
1133       expr->value.character.string = s;
1134       expr->value.character.length = len;
1135     }
1136 }
1137
1138
1139 /* Function to create and update the enumerator history
1140    using the information passed as arguments.
1141    Pointer "max_enum" is also updated, to point to
1142    enum history node containing largest initializer.
1143
1144    SYM points to the symbol node of enumerator.
1145    INIT points to its enumerator value.  */
1146
1147 static void
1148 create_enum_history (gfc_symbol *sym, gfc_expr *init)
1149 {
1150   enumerator_history *new_enum_history;
1151   gcc_assert (sym != NULL && init != NULL);
1152
1153   new_enum_history = XCNEW (enumerator_history);
1154
1155   new_enum_history->sym = sym;
1156   new_enum_history->initializer = init;
1157   new_enum_history->next = NULL;
1158
1159   if (enum_history == NULL)
1160     {
1161       enum_history = new_enum_history;
1162       max_enum = enum_history;
1163     }
1164   else
1165     {
1166       new_enum_history->next = enum_history;
1167       enum_history = new_enum_history;
1168
1169       if (mpz_cmp (max_enum->initializer->value.integer,
1170                    new_enum_history->initializer->value.integer) < 0)
1171         max_enum = new_enum_history;
1172     }
1173 }
1174
1175
1176 /* Function to free enum kind history.  */
1177
1178 void
1179 gfc_free_enum_history (void)
1180 {
1181   enumerator_history *current = enum_history;
1182   enumerator_history *next;
1183
1184   while (current != NULL)
1185     {
1186       next = current->next;
1187       gfc_free (current);
1188       current = next;
1189     }
1190   max_enum = NULL;
1191   enum_history = NULL;
1192 }
1193
1194
1195 /* Function called by variable_decl() that adds an initialization
1196    expression to a symbol.  */
1197
1198 static gfc_try
1199 add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus)
1200 {
1201   symbol_attribute attr;
1202   gfc_symbol *sym;
1203   gfc_expr *init;
1204
1205   init = *initp;
1206   if (find_special (name, &sym))
1207     return FAILURE;
1208
1209   attr = sym->attr;
1210
1211   /* If this symbol is confirming an implicit parameter type,
1212      then an initialization expression is not allowed.  */
1213   if (attr.flavor == FL_PARAMETER
1214       && sym->value != NULL
1215       && *initp != NULL)
1216     {
1217       gfc_error ("Initializer not allowed for PARAMETER '%s' at %C",
1218                  sym->name);
1219       return FAILURE;
1220     }
1221
1222   if (init == NULL)
1223     {
1224       /* An initializer is required for PARAMETER declarations.  */
1225       if (attr.flavor == FL_PARAMETER)
1226         {
1227           gfc_error ("PARAMETER at %L is missing an initializer", var_locus);
1228           return FAILURE;
1229         }
1230     }
1231   else
1232     {
1233       /* If a variable appears in a DATA block, it cannot have an
1234          initializer.  */
1235       if (sym->attr.data)
1236         {
1237           gfc_error ("Variable '%s' at %C with an initializer already "
1238                      "appears in a DATA statement", sym->name);
1239           return FAILURE;
1240         }
1241
1242       /* Check if the assignment can happen. This has to be put off
1243          until later for a derived type variable.  */
1244       if (sym->ts.type != BT_DERIVED && init->ts.type != BT_DERIVED
1245           && gfc_check_assign_symbol (sym, init) == FAILURE)
1246         return FAILURE;
1247
1248       if (sym->ts.type == BT_CHARACTER && sym->ts.cl)
1249         {
1250           /* Update symbol character length according initializer.  */
1251           if (sym->ts.cl->length == NULL)
1252             {
1253               int clen;
1254               /* If there are multiple CHARACTER variables declared on the
1255                  same line, we don't want them to share the same length.  */
1256               sym->ts.cl = gfc_get_charlen ();
1257               sym->ts.cl->next = gfc_current_ns->cl_list;
1258               gfc_current_ns->cl_list = sym->ts.cl;
1259
1260               if (sym->attr.flavor == FL_PARAMETER)
1261                 {
1262                   if (init->expr_type == EXPR_CONSTANT)
1263                     {
1264                       clen = init->value.character.length;
1265                       sym->ts.cl->length = gfc_int_expr (clen);
1266                     }
1267                   else if (init->expr_type == EXPR_ARRAY)
1268                     {
1269                       gfc_expr *p = init->value.constructor->expr;
1270                       clen = p->value.character.length;
1271                       sym->ts.cl->length = gfc_int_expr (clen);
1272                     }
1273                   else if (init->ts.cl && init->ts.cl->length)
1274                     sym->ts.cl->length =
1275                                 gfc_copy_expr (sym->value->ts.cl->length);
1276                 }
1277             }
1278           /* Update initializer character length according symbol.  */
1279           else if (sym->ts.cl->length->expr_type == EXPR_CONSTANT)
1280             {
1281               int len = mpz_get_si (sym->ts.cl->length->value.integer);
1282               gfc_constructor * p;
1283
1284               if (init->expr_type == EXPR_CONSTANT)
1285                 gfc_set_constant_character_len (len, init, -1);
1286               else if (init->expr_type == EXPR_ARRAY)
1287                 {
1288                   /* Build a new charlen to prevent simplification from
1289                      deleting the length before it is resolved.  */
1290                   init->ts.cl = gfc_get_charlen ();
1291                   init->ts.cl->next = gfc_current_ns->cl_list;
1292                   gfc_current_ns->cl_list = sym->ts.cl;
1293                   init->ts.cl->length = gfc_copy_expr (sym->ts.cl->length);
1294
1295                   for (p = init->value.constructor; p; p = p->next)
1296                     gfc_set_constant_character_len (len, p->expr, -1);
1297                 }
1298             }
1299         }
1300
1301       /* Need to check if the expression we initialized this
1302          to was one of the iso_c_binding named constants.  If so,
1303          and we're a parameter (constant), let it be iso_c.
1304          For example:
1305          integer(c_int), parameter :: my_int = c_int
1306          integer(my_int) :: my_int_2
1307          If we mark my_int as iso_c (since we can see it's value
1308          is equal to one of the named constants), then my_int_2
1309          will be considered C interoperable.  */
1310       if (sym->ts.type != BT_CHARACTER && sym->ts.type != BT_DERIVED)
1311         {
1312           sym->ts.is_iso_c |= init->ts.is_iso_c;
1313           sym->ts.is_c_interop |= init->ts.is_c_interop;
1314           /* attr bits needed for module files.  */
1315           sym->attr.is_iso_c |= init->ts.is_iso_c;
1316           sym->attr.is_c_interop |= init->ts.is_c_interop;
1317           if (init->ts.is_iso_c)
1318             sym->ts.f90_type = init->ts.f90_type;
1319         }
1320       
1321       /* Add initializer.  Make sure we keep the ranks sane.  */
1322       if (sym->attr.dimension && init->rank == 0)
1323         {
1324           mpz_t size;
1325           gfc_expr *array;
1326           gfc_constructor *c;
1327           int n;
1328           if (sym->attr.flavor == FL_PARAMETER
1329                 && init->expr_type == EXPR_CONSTANT
1330                 && spec_size (sym->as, &size) == SUCCESS
1331                 && mpz_cmp_si (size, 0) > 0)
1332             {
1333               array = gfc_start_constructor (init->ts.type, init->ts.kind,
1334                                              &init->where);
1335
1336               array->value.constructor = c = NULL;
1337               for (n = 0; n < (int)mpz_get_si (size); n++)
1338                 {
1339                   if (array->value.constructor == NULL)
1340                     {
1341                       array->value.constructor = c = gfc_get_constructor ();
1342                       c->expr = init;
1343                     }
1344                   else
1345                     {
1346                       c->next = gfc_get_constructor ();
1347                       c = c->next;
1348                       c->expr = gfc_copy_expr (init);
1349                     }
1350                 }
1351
1352               array->shape = gfc_get_shape (sym->as->rank);
1353               for (n = 0; n < sym->as->rank; n++)
1354                 spec_dimen_size (sym->as, n, &array->shape[n]);
1355
1356               init = array;
1357               mpz_clear (size);
1358             }
1359           init->rank = sym->as->rank;
1360         }
1361
1362       sym->value = init;
1363       if (sym->attr.save == SAVE_NONE)
1364         sym->attr.save = SAVE_IMPLICIT;
1365       *initp = NULL;
1366     }
1367
1368   return SUCCESS;
1369 }
1370
1371
1372 /* Function called by variable_decl() that adds a name to a structure
1373    being built.  */
1374
1375 static gfc_try
1376 build_struct (const char *name, gfc_charlen *cl, gfc_expr **init,
1377               gfc_array_spec **as)
1378 {
1379   gfc_component *c;
1380
1381   /* If the current symbol is of the same derived type that we're
1382      constructing, it must have the pointer attribute.  */
1383   if (current_ts.type == BT_DERIVED
1384       && current_ts.derived == gfc_current_block ()
1385       && current_attr.pointer == 0)
1386     {
1387       gfc_error ("Component at %C must have the POINTER attribute");
1388       return FAILURE;
1389     }
1390
1391   if (gfc_current_block ()->attr.pointer && (*as)->rank != 0)
1392     {
1393       if ((*as)->type != AS_DEFERRED && (*as)->type != AS_EXPLICIT)
1394         {
1395           gfc_error ("Array component of structure at %C must have explicit "
1396                      "or deferred shape");
1397           return FAILURE;
1398         }
1399     }
1400
1401   if (gfc_add_component (gfc_current_block (), name, &c) == FAILURE)
1402     return FAILURE;
1403
1404   c->ts = current_ts;
1405   c->ts.cl = cl;
1406   gfc_set_component_attr (c, &current_attr);
1407
1408   c->initializer = *init;
1409   *init = NULL;
1410
1411   c->as = *as;
1412   if (c->as != NULL)
1413     c->dimension = 1;
1414   *as = NULL;
1415
1416   /* Should this ever get more complicated, combine with similar section
1417      in add_init_expr_to_sym into a separate function.  */
1418   if (c->ts.type == BT_CHARACTER && !c->pointer && c->initializer && c->ts.cl
1419       && c->ts.cl->length && c->ts.cl->length->expr_type == EXPR_CONSTANT)
1420     {
1421       int len;
1422
1423       gcc_assert (c->ts.cl && c->ts.cl->length);
1424       gcc_assert (c->ts.cl->length->expr_type == EXPR_CONSTANT);
1425       gcc_assert (c->ts.cl->length->ts.type == BT_INTEGER);
1426
1427       len = mpz_get_si (c->ts.cl->length->value.integer);
1428
1429       if (c->initializer->expr_type == EXPR_CONSTANT)
1430         gfc_set_constant_character_len (len, c->initializer, -1);
1431       else if (mpz_cmp (c->ts.cl->length->value.integer,
1432                         c->initializer->ts.cl->length->value.integer))
1433         {
1434           bool has_ts;
1435           gfc_constructor *ctor = c->initializer->value.constructor;
1436
1437           bool first = true;
1438           int first_len;
1439
1440           has_ts = (c->initializer->ts.cl
1441                     && c->initializer->ts.cl->length_from_typespec);
1442
1443           for (; ctor; ctor = ctor->next)
1444             {
1445               /* Remember the length of the first element for checking that
1446                  all elements *in the constructor* have the same length.  This
1447                  need not be the length of the LHS!  */
1448               if (first)
1449                 {
1450                   gcc_assert (ctor->expr->expr_type == EXPR_CONSTANT);
1451                   gcc_assert (ctor->expr->ts.type == BT_CHARACTER);
1452                   first_len = ctor->expr->value.character.length;
1453                   first = false;
1454                 }
1455
1456               if (ctor->expr->expr_type == EXPR_CONSTANT)
1457                 gfc_set_constant_character_len (len, ctor->expr,
1458                                                 has_ts ? -1 : first_len);
1459             }
1460         }
1461     }
1462
1463   /* Check array components.  */
1464   if (!c->dimension)
1465     {
1466       if (c->allocatable)
1467         {
1468           gfc_error ("Allocatable component at %C must be an array");
1469           return FAILURE;
1470         }
1471       else
1472         return SUCCESS;
1473     }
1474
1475   if (c->pointer)
1476     {
1477       if (c->as->type != AS_DEFERRED)
1478         {
1479           gfc_error ("Pointer array component of structure at %C must have a "
1480                      "deferred shape");
1481           return FAILURE;
1482         }
1483     }
1484   else if (c->allocatable)
1485     {
1486       if (c->as->type != AS_DEFERRED)
1487         {
1488           gfc_error ("Allocatable component of structure at %C must have a "
1489                      "deferred shape");
1490           return FAILURE;
1491         }
1492     }
1493   else
1494     {
1495       if (c->as->type != AS_EXPLICIT)
1496         {
1497           gfc_error ("Array component of structure at %C must have an "
1498                      "explicit shape");
1499           return FAILURE;
1500         }
1501     }
1502
1503   return SUCCESS;
1504 }
1505
1506
1507 /* Match a 'NULL()', and possibly take care of some side effects.  */
1508
1509 match
1510 gfc_match_null (gfc_expr **result)
1511 {
1512   gfc_symbol *sym;
1513   gfc_expr *e;
1514   match m;
1515
1516   m = gfc_match (" null ( )");
1517   if (m != MATCH_YES)
1518     return m;
1519
1520   /* The NULL symbol now has to be/become an intrinsic function.  */
1521   if (gfc_get_symbol ("null", NULL, &sym))
1522     {
1523       gfc_error ("NULL() initialization at %C is ambiguous");
1524       return MATCH_ERROR;
1525     }
1526
1527   gfc_intrinsic_symbol (sym);
1528
1529   if (sym->attr.proc != PROC_INTRINSIC
1530       && (gfc_add_procedure (&sym->attr, PROC_INTRINSIC,
1531                              sym->name, NULL) == FAILURE
1532           || gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE))
1533     return MATCH_ERROR;
1534
1535   e = gfc_get_expr ();
1536   e->where = gfc_current_locus;
1537   e->expr_type = EXPR_NULL;
1538   e->ts.type = BT_UNKNOWN;
1539
1540   *result = e;
1541
1542   return MATCH_YES;
1543 }
1544
1545
1546 /* Match a variable name with an optional initializer.  When this
1547    subroutine is called, a variable is expected to be parsed next.
1548    Depending on what is happening at the moment, updates either the
1549    symbol table or the current interface.  */
1550
1551 static match
1552 variable_decl (int elem)
1553 {
1554   char name[GFC_MAX_SYMBOL_LEN + 1];
1555   gfc_expr *initializer, *char_len;
1556   gfc_array_spec *as;
1557   gfc_array_spec *cp_as; /* Extra copy for Cray Pointees.  */
1558   gfc_charlen *cl;
1559   locus var_locus;
1560   match m;
1561   gfc_try t;
1562   gfc_symbol *sym;
1563   locus old_locus;
1564
1565   initializer = NULL;
1566   as = NULL;
1567   cp_as = NULL;
1568   old_locus = gfc_current_locus;
1569
1570   /* When we get here, we've just matched a list of attributes and
1571      maybe a type and a double colon.  The next thing we expect to see
1572      is the name of the symbol.  */
1573   m = gfc_match_name (name);
1574   if (m != MATCH_YES)
1575     goto cleanup;
1576
1577   var_locus = gfc_current_locus;
1578
1579   /* Now we could see the optional array spec. or character length.  */
1580   m = gfc_match_array_spec (&as);
1581   if (gfc_option.flag_cray_pointer && m == MATCH_YES)
1582     cp_as = gfc_copy_array_spec (as);
1583   else if (m == MATCH_ERROR)
1584     goto cleanup;
1585
1586   if (m == MATCH_NO)
1587     as = gfc_copy_array_spec (current_as);
1588
1589   char_len = NULL;
1590   cl = NULL;
1591
1592   if (current_ts.type == BT_CHARACTER)
1593     {
1594       switch (match_char_length (&char_len))
1595         {
1596         case MATCH_YES:
1597           cl = gfc_get_charlen ();
1598           cl->next = gfc_current_ns->cl_list;
1599           gfc_current_ns->cl_list = cl;
1600
1601           cl->length = char_len;
1602           break;
1603
1604         /* Non-constant lengths need to be copied after the first
1605            element.  Also copy assumed lengths.  */
1606         case MATCH_NO:
1607           if (elem > 1
1608               && (current_ts.cl->length == NULL
1609                   || current_ts.cl->length->expr_type != EXPR_CONSTANT))
1610             {
1611               cl = gfc_get_charlen ();
1612               cl->next = gfc_current_ns->cl_list;
1613               gfc_current_ns->cl_list = cl;
1614               cl->length = gfc_copy_expr (current_ts.cl->length);
1615             }
1616           else
1617             cl = current_ts.cl;
1618
1619           break;
1620
1621         case MATCH_ERROR:
1622           goto cleanup;
1623         }
1624     }
1625
1626   /*  If this symbol has already shown up in a Cray Pointer declaration,
1627       then we want to set the type & bail out.  */
1628   if (gfc_option.flag_cray_pointer)
1629     {
1630       gfc_find_symbol (name, gfc_current_ns, 1, &sym);
1631       if (sym != NULL && sym->attr.cray_pointee)
1632         {
1633           sym->ts.type = current_ts.type;
1634           sym->ts.kind = current_ts.kind;
1635           sym->ts.cl = cl;
1636           sym->ts.derived = current_ts.derived;
1637           sym->ts.is_c_interop = current_ts.is_c_interop;
1638           sym->ts.is_iso_c = current_ts.is_iso_c;
1639           m = MATCH_YES;
1640         
1641           /* Check to see if we have an array specification.  */
1642           if (cp_as != NULL)
1643             {
1644               if (sym->as != NULL)
1645                 {
1646                   gfc_error ("Duplicate array spec for Cray pointee at %C");
1647                   gfc_free_array_spec (cp_as);
1648                   m = MATCH_ERROR;
1649                   goto cleanup;
1650                 }
1651               else
1652                 {
1653                   if (gfc_set_array_spec (sym, cp_as, &var_locus) == FAILURE)
1654                     gfc_internal_error ("Couldn't set pointee array spec.");
1655
1656                   /* Fix the array spec.  */
1657                   m = gfc_mod_pointee_as (sym->as);
1658                   if (m == MATCH_ERROR)
1659                     goto cleanup;
1660                 }
1661             }
1662           goto cleanup;
1663         }
1664       else
1665         {
1666           gfc_free_array_spec (cp_as);
1667         }
1668     }
1669
1670
1671   /* OK, we've successfully matched the declaration.  Now put the
1672      symbol in the current namespace, because it might be used in the
1673      optional initialization expression for this symbol, e.g. this is
1674      perfectly legal:
1675
1676      integer, parameter :: i = huge(i)
1677
1678      This is only true for parameters or variables of a basic type.
1679      For components of derived types, it is not true, so we don't
1680      create a symbol for those yet.  If we fail to create the symbol,
1681      bail out.  */
1682   if (gfc_current_state () != COMP_DERIVED
1683       && build_sym (name, cl, &as, &var_locus) == FAILURE)
1684     {
1685       m = MATCH_ERROR;
1686       goto cleanup;
1687     }
1688
1689   /* An interface body specifies all of the procedure's
1690      characteristics and these shall be consistent with those
1691      specified in the procedure definition, except that the interface
1692      may specify a procedure that is not pure if the procedure is
1693      defined to be pure(12.3.2).  */
1694   if (current_ts.type == BT_DERIVED
1695       && gfc_current_ns->proc_name
1696       && gfc_current_ns->proc_name->attr.if_source == IFSRC_IFBODY
1697       && current_ts.derived->ns != gfc_current_ns)
1698     {
1699       gfc_symtree *st;
1700       st = gfc_find_symtree (gfc_current_ns->sym_root, current_ts.derived->name);
1701       if (!(current_ts.derived->attr.imported
1702                 && st != NULL
1703                 && st->n.sym == current_ts.derived)
1704             && !gfc_current_ns->has_import_set)
1705         {
1706             gfc_error ("the type of '%s' at %C has not been declared within the "
1707                        "interface", name);
1708             m = MATCH_ERROR;
1709             goto cleanup;
1710         }
1711     }
1712
1713   /* In functions that have a RESULT variable defined, the function
1714      name always refers to function calls.  Therefore, the name is
1715      not allowed to appear in specification statements.  */
1716   if (gfc_current_state () == COMP_FUNCTION
1717       && gfc_current_block () != NULL
1718       && gfc_current_block ()->result != NULL
1719       && gfc_current_block ()->result != gfc_current_block ()
1720       && strcmp (gfc_current_block ()->name, name) == 0)
1721     {
1722       gfc_error ("Function name '%s' not allowed at %C", name);
1723       m = MATCH_ERROR;
1724       goto cleanup;
1725     }
1726
1727   /* We allow old-style initializations of the form
1728        integer i /2/, j(4) /3*3, 1/
1729      (if no colon has been seen). These are different from data
1730      statements in that initializers are only allowed to apply to the
1731      variable immediately preceding, i.e.
1732        integer i, j /1, 2/
1733      is not allowed. Therefore we have to do some work manually, that
1734      could otherwise be left to the matchers for DATA statements.  */
1735
1736   if (!colon_seen && gfc_match (" /") == MATCH_YES)
1737     {
1738       if (gfc_notify_std (GFC_STD_GNU, "Extension: Old-style "
1739                           "initialization at %C") == FAILURE)
1740         return MATCH_ERROR;
1741  
1742       return match_old_style_init (name);
1743     }
1744
1745   /* The double colon must be present in order to have initializers.
1746      Otherwise the statement is ambiguous with an assignment statement.  */
1747   if (colon_seen)
1748     {
1749       if (gfc_match (" =>") == MATCH_YES)
1750         {
1751           if (!current_attr.pointer)
1752             {
1753               gfc_error ("Initialization at %C isn't for a pointer variable");
1754               m = MATCH_ERROR;
1755               goto cleanup;
1756             }
1757
1758           m = gfc_match_null (&initializer);
1759           if (m == MATCH_NO)
1760             {
1761               gfc_error ("Pointer initialization requires a NULL() at %C");
1762               m = MATCH_ERROR;
1763             }
1764
1765           if (gfc_pure (NULL))
1766             {
1767               gfc_error ("Initialization of pointer at %C is not allowed in "
1768                          "a PURE procedure");
1769               m = MATCH_ERROR;
1770             }
1771
1772           if (m != MATCH_YES)
1773             goto cleanup;
1774
1775         }
1776       else if (gfc_match_char ('=') == MATCH_YES)
1777         {
1778           if (current_attr.pointer)
1779             {
1780               gfc_error ("Pointer initialization at %C requires '=>', "
1781                          "not '='");
1782               m = MATCH_ERROR;
1783               goto cleanup;
1784             }
1785
1786           m = gfc_match_init_expr (&initializer);
1787           if (m == MATCH_NO)
1788             {
1789               gfc_error ("Expected an initialization expression at %C");
1790               m = MATCH_ERROR;
1791             }
1792
1793           if (current_attr.flavor != FL_PARAMETER && gfc_pure (NULL))
1794             {
1795               gfc_error ("Initialization of variable at %C is not allowed in "
1796                          "a PURE procedure");
1797               m = MATCH_ERROR;
1798             }
1799
1800           if (m != MATCH_YES)
1801             goto cleanup;
1802         }
1803     }
1804
1805   if (initializer != NULL && current_attr.allocatable
1806         && gfc_current_state () == COMP_DERIVED)
1807     {
1808       gfc_error ("Initialization of allocatable component at %C is not "
1809                  "allowed");
1810       m = MATCH_ERROR;
1811       goto cleanup;
1812     }
1813
1814   /* Add the initializer.  Note that it is fine if initializer is
1815      NULL here, because we sometimes also need to check if a
1816      declaration *must* have an initialization expression.  */
1817   if (gfc_current_state () != COMP_DERIVED)
1818     t = add_init_expr_to_sym (name, &initializer, &var_locus);
1819   else
1820     {
1821       if (current_ts.type == BT_DERIVED
1822           && !current_attr.pointer && !initializer)
1823         initializer = gfc_default_initializer (&current_ts);
1824       t = build_struct (name, cl, &initializer, &as);
1825     }
1826
1827   m = (t == SUCCESS) ? MATCH_YES : MATCH_ERROR;
1828
1829 cleanup:
1830   /* Free stuff up and return.  */
1831   gfc_free_expr (initializer);
1832   gfc_free_array_spec (as);
1833
1834   return m;
1835 }
1836
1837
1838 /* Match an extended-f77 "TYPESPEC*bytesize"-style kind specification.
1839    This assumes that the byte size is equal to the kind number for
1840    non-COMPLEX types, and equal to twice the kind number for COMPLEX.  */
1841
1842 match
1843 gfc_match_old_kind_spec (gfc_typespec *ts)
1844 {
1845   match m;
1846   int original_kind;
1847
1848   if (gfc_match_char ('*') != MATCH_YES)
1849     return MATCH_NO;
1850
1851   m = gfc_match_small_literal_int (&ts->kind, NULL);
1852   if (m != MATCH_YES)
1853     return MATCH_ERROR;
1854
1855   original_kind = ts->kind;
1856
1857   /* Massage the kind numbers for complex types.  */
1858   if (ts->type == BT_COMPLEX)
1859     {
1860       if (ts->kind % 2)
1861         {
1862           gfc_error ("Old-style type declaration %s*%d not supported at %C",
1863                      gfc_basic_typename (ts->type), original_kind);
1864           return MATCH_ERROR;
1865         }
1866       ts->kind /= 2;
1867     }
1868
1869   if (gfc_validate_kind (ts->type, ts->kind, true) < 0)
1870     {
1871       gfc_error ("Old-style type declaration %s*%d not supported at %C",
1872                  gfc_basic_typename (ts->type), original_kind);
1873       return MATCH_ERROR;
1874     }
1875
1876   if (gfc_notify_std (GFC_STD_GNU, "Nonstandard type declaration %s*%d at %C",
1877                       gfc_basic_typename (ts->type), original_kind) == FAILURE)
1878     return MATCH_ERROR;
1879
1880   return MATCH_YES;
1881 }
1882
1883
1884 /* Match a kind specification.  Since kinds are generally optional, we
1885    usually return MATCH_NO if something goes wrong.  If a "kind="
1886    string is found, then we know we have an error.  */
1887
1888 match
1889 gfc_match_kind_spec (gfc_typespec *ts, bool kind_expr_only)
1890 {
1891   locus where, loc;
1892   gfc_expr *e;
1893   match m, n;
1894   char c;
1895   const char *msg;
1896
1897   m = MATCH_NO;
1898   n = MATCH_YES;
1899   e = NULL;
1900
1901   where = loc = gfc_current_locus;
1902
1903   if (kind_expr_only)
1904     goto kind_expr;
1905
1906   if (gfc_match_char ('(') == MATCH_NO)
1907     return MATCH_NO;
1908
1909   /* Also gobbles optional text.  */
1910   if (gfc_match (" kind = ") == MATCH_YES)
1911     m = MATCH_ERROR;
1912
1913   loc = gfc_current_locus;
1914
1915 kind_expr:
1916   n = gfc_match_init_expr (&e);
1917
1918   if (n != MATCH_YES)
1919     {
1920       if (gfc_matching_function)
1921         {
1922           /* The function kind expression might include use associated or 
1923              imported parameters and try again after the specification
1924              expressions.....  */
1925           if (gfc_match_char (')') != MATCH_YES)
1926             {
1927               gfc_error ("Missing right parenthesis at %C");
1928               m = MATCH_ERROR;
1929               goto no_match;
1930             }
1931
1932           gfc_free_expr (e);
1933           gfc_undo_symbols ();
1934           return MATCH_YES;
1935         }
1936       else
1937         {
1938           /* ....or else, the match is real.  */
1939           if (n == MATCH_NO)
1940             gfc_error ("Expected initialization expression at %C");
1941           if (n != MATCH_YES)
1942             return MATCH_ERROR;
1943         }
1944     }
1945
1946   if (e->rank != 0)
1947     {
1948       gfc_error ("Expected scalar initialization expression at %C");
1949       m = MATCH_ERROR;
1950       goto no_match;
1951     }
1952
1953   msg = gfc_extract_int (e, &ts->kind);
1954
1955   if (msg != NULL)
1956     {
1957       gfc_error (msg);
1958       m = MATCH_ERROR;
1959       goto no_match;
1960     }
1961
1962   /* Before throwing away the expression, let's see if we had a
1963      C interoperable kind (and store the fact).  */
1964   if (e->ts.is_c_interop == 1)
1965     {
1966       /* Mark this as c interoperable if being declared with one
1967          of the named constants from iso_c_binding.  */
1968       ts->is_c_interop = e->ts.is_iso_c;
1969       ts->f90_type = e->ts.f90_type;
1970     }
1971   
1972   gfc_free_expr (e);
1973   e = NULL;
1974
1975   /* Ignore errors to this point, if we've gotten here.  This means
1976      we ignore the m=MATCH_ERROR from above.  */
1977   if (gfc_validate_kind (ts->type, ts->kind, true) < 0)
1978     {
1979       gfc_error ("Kind %d not supported for type %s at %C", ts->kind,
1980                  gfc_basic_typename (ts->type));
1981       gfc_current_locus = where;
1982       return MATCH_ERROR;
1983     }
1984
1985   gfc_gobble_whitespace ();
1986   if ((c = gfc_next_ascii_char ()) != ')'
1987       && (ts->type != BT_CHARACTER || c != ','))
1988     {
1989       if (ts->type == BT_CHARACTER)
1990         gfc_error ("Missing right parenthesis or comma at %C");
1991       else
1992         gfc_error ("Missing right parenthesis at %C");
1993       m = MATCH_ERROR;
1994     }
1995   else
1996      /* All tests passed.  */
1997      m = MATCH_YES;
1998
1999   if(m == MATCH_ERROR)
2000      gfc_current_locus = where;
2001   
2002   /* Return what we know from the test(s).  */
2003   return m;
2004
2005 no_match:
2006   gfc_free_expr (e);
2007   gfc_current_locus = where;
2008   return m;
2009 }
2010
2011
2012 static match
2013 match_char_kind (int * kind, int * is_iso_c)
2014 {
2015   locus where;
2016   gfc_expr *e;
2017   match m, n;
2018   const char *msg;
2019
2020   m = MATCH_NO;
2021   e = NULL;
2022   where = gfc_current_locus;
2023
2024   n = gfc_match_init_expr (&e);
2025
2026   if (n != MATCH_YES && gfc_matching_function)
2027     {
2028       /* The expression might include use-associated or imported
2029          parameters and try again after the specification 
2030          expressions.  */
2031       gfc_free_expr (e);
2032       gfc_undo_symbols ();
2033       return MATCH_YES;
2034     }
2035
2036   if (n == MATCH_NO)
2037     gfc_error ("Expected initialization expression at %C");
2038   if (n != MATCH_YES)
2039     return MATCH_ERROR;
2040
2041   if (e->rank != 0)
2042     {
2043       gfc_error ("Expected scalar initialization expression at %C");
2044       m = MATCH_ERROR;
2045       goto no_match;
2046     }
2047
2048   msg = gfc_extract_int (e, kind);
2049   *is_iso_c = e->ts.is_iso_c;
2050   if (msg != NULL)
2051     {
2052       gfc_error (msg);
2053       m = MATCH_ERROR;
2054       goto no_match;
2055     }
2056
2057   gfc_free_expr (e);
2058
2059   /* Ignore errors to this point, if we've gotten here.  This means
2060      we ignore the m=MATCH_ERROR from above.  */
2061   if (gfc_validate_kind (BT_CHARACTER, *kind, true) < 0)
2062     {
2063       gfc_error ("Kind %d is not supported for CHARACTER at %C", *kind);
2064       m = MATCH_ERROR;
2065     }
2066   else
2067      /* All tests passed.  */
2068      m = MATCH_YES;
2069
2070   if (m == MATCH_ERROR)
2071      gfc_current_locus = where;
2072   
2073   /* Return what we know from the test(s).  */
2074   return m;
2075
2076 no_match:
2077   gfc_free_expr (e);
2078   gfc_current_locus = where;
2079   return m;
2080 }
2081
2082 /* Match the various kind/length specifications in a CHARACTER
2083    declaration.  We don't return MATCH_NO.  */
2084
2085 static match
2086 match_char_spec (gfc_typespec *ts)
2087 {
2088   int kind, seen_length, is_iso_c;
2089   gfc_charlen *cl;
2090   gfc_expr *len;
2091   match m;
2092
2093   len = NULL;
2094   seen_length = 0;
2095   kind = 0;
2096   is_iso_c = 0;
2097
2098   /* Try the old-style specification first.  */
2099   old_char_selector = 0;
2100
2101   m = match_char_length (&len);
2102   if (m != MATCH_NO)
2103     {
2104       if (m == MATCH_YES)
2105         old_char_selector = 1;
2106       seen_length = 1;
2107       goto done;
2108     }
2109
2110   m = gfc_match_char ('(');
2111   if (m != MATCH_YES)
2112     {
2113       m = MATCH_YES;    /* Character without length is a single char.  */
2114       goto done;
2115     }
2116
2117   /* Try the weird case:  ( KIND = <int> [ , LEN = <len-param> ] ).  */
2118   if (gfc_match (" kind =") == MATCH_YES)
2119     {
2120       m = match_char_kind (&kind, &is_iso_c);
2121        
2122       if (m == MATCH_ERROR)
2123         goto done;
2124       if (m == MATCH_NO)
2125         goto syntax;
2126
2127       if (gfc_match (" , len =") == MATCH_NO)
2128         goto rparen;
2129
2130       m = char_len_param_value (&len);
2131       if (m == MATCH_NO)
2132         goto syntax;
2133       if (m == MATCH_ERROR)
2134         goto done;
2135       seen_length = 1;
2136
2137       goto rparen;
2138     }
2139
2140   /* Try to match "LEN = <len-param>" or "LEN = <len-param>, KIND = <int>".  */
2141   if (gfc_match (" len =") == MATCH_YES)
2142     {
2143       m = char_len_param_value (&len);
2144       if (m == MATCH_NO)
2145         goto syntax;
2146       if (m == MATCH_ERROR)
2147         goto done;
2148       seen_length = 1;
2149
2150       if (gfc_match_char (')') == MATCH_YES)
2151         goto done;
2152
2153       if (gfc_match (" , kind =") != MATCH_YES)
2154         goto syntax;
2155
2156       if (match_char_kind (&kind, &is_iso_c) == MATCH_ERROR)
2157         goto done;
2158
2159       goto rparen;
2160     }
2161
2162   /* Try to match ( <len-param> ) or ( <len-param> , [ KIND = ] <int> ).  */
2163   m = char_len_param_value (&len);
2164   if (m == MATCH_NO)
2165     goto syntax;
2166   if (m == MATCH_ERROR)
2167     goto done;
2168   seen_length = 1;
2169
2170   m = gfc_match_char (')');
2171   if (m == MATCH_YES)
2172     goto done;
2173
2174   if (gfc_match_char (',') != MATCH_YES)
2175     goto syntax;
2176
2177   gfc_match (" kind =");        /* Gobble optional text.  */
2178
2179   m = match_char_kind (&kind, &is_iso_c);
2180   if (m == MATCH_ERROR)
2181     goto done;
2182   if (m == MATCH_NO)
2183     goto syntax;
2184
2185 rparen:
2186   /* Require a right-paren at this point.  */
2187   m = gfc_match_char (')');
2188   if (m == MATCH_YES)
2189     goto done;
2190
2191 syntax:
2192   gfc_error ("Syntax error in CHARACTER declaration at %C");
2193   m = MATCH_ERROR;
2194   gfc_free_expr (len);
2195   return m;
2196
2197 done:
2198   /* Deal with character functions after USE and IMPORT statements.  */
2199   if (gfc_matching_function)
2200     {
2201       gfc_free_expr (len);
2202       gfc_undo_symbols ();
2203       return MATCH_YES;
2204     }
2205
2206   if (m != MATCH_YES)
2207     {
2208       gfc_free_expr (len);
2209       return m;
2210     }
2211
2212   /* Do some final massaging of the length values.  */
2213   cl = gfc_get_charlen ();
2214   cl->next = gfc_current_ns->cl_list;
2215   gfc_current_ns->cl_list = cl;
2216
2217   if (seen_length == 0)
2218     cl->length = gfc_int_expr (1);
2219   else
2220     cl->length = len;
2221
2222   ts->cl = cl;
2223   ts->kind = kind == 0 ? gfc_default_character_kind : kind;
2224
2225   /* We have to know if it was a c interoperable kind so we can
2226      do accurate type checking of bind(c) procs, etc.  */
2227   if (kind != 0)
2228     /* Mark this as c interoperable if being declared with one
2229        of the named constants from iso_c_binding.  */
2230     ts->is_c_interop = is_iso_c;
2231   else if (len != NULL)
2232     /* Here, we might have parsed something such as: character(c_char)
2233        In this case, the parsing code above grabs the c_char when
2234        looking for the length (line 1690, roughly).  it's the last
2235        testcase for parsing the kind params of a character variable.
2236        However, it's not actually the length.    this seems like it
2237        could be an error.  
2238        To see if the user used a C interop kind, test the expr
2239        of the so called length, and see if it's C interoperable.  */
2240     ts->is_c_interop = len->ts.is_iso_c;
2241   
2242   return MATCH_YES;
2243 }
2244
2245
2246 /* Matches a type specification.  If successful, sets the ts structure
2247    to the matched specification.  This is necessary for FUNCTION and
2248    IMPLICIT statements.
2249
2250    If implicit_flag is nonzero, then we don't check for the optional
2251    kind specification.  Not doing so is needed for matching an IMPLICIT
2252    statement correctly.  */
2253
2254 match
2255 gfc_match_type_spec (gfc_typespec *ts, int implicit_flag)
2256 {
2257   char name[GFC_MAX_SYMBOL_LEN + 1];
2258   gfc_symbol *sym;
2259   match m;
2260   char c;
2261   bool seen_deferred_kind;
2262
2263   /* A belt and braces check that the typespec is correctly being treated
2264      as a deferred characteristic association.  */
2265   seen_deferred_kind = (gfc_current_state () == COMP_FUNCTION)
2266                           && (gfc_current_block ()->result->ts.kind == -1)
2267                           && (ts->kind == -1);
2268   gfc_clear_ts (ts);
2269   if (seen_deferred_kind)
2270     ts->kind = -1;
2271
2272   /* Clear the current binding label, in case one is given.  */
2273   curr_binding_label[0] = '\0';
2274
2275   if (gfc_match (" byte") == MATCH_YES)
2276     {
2277       if (gfc_notify_std(GFC_STD_GNU, "Extension: BYTE type at %C")
2278           == FAILURE)
2279         return MATCH_ERROR;
2280
2281       if (gfc_validate_kind (BT_INTEGER, 1, true) < 0)
2282         {
2283           gfc_error ("BYTE type used at %C "
2284                      "is not available on the target machine");
2285           return MATCH_ERROR;
2286         }
2287
2288       ts->type = BT_INTEGER;
2289       ts->kind = 1;
2290       return MATCH_YES;
2291     }
2292
2293   if (gfc_match (" integer") == MATCH_YES)
2294     {
2295       ts->type = BT_INTEGER;
2296       ts->kind = gfc_default_integer_kind;
2297       goto get_kind;
2298     }
2299
2300   if (gfc_match (" character") == MATCH_YES)
2301     {
2302       ts->type = BT_CHARACTER;
2303       if (implicit_flag == 0)
2304         return match_char_spec (ts);
2305       else
2306         return MATCH_YES;
2307     }
2308
2309   if (gfc_match (" real") == MATCH_YES)
2310     {
2311       ts->type = BT_REAL;
2312       ts->kind = gfc_default_real_kind;
2313       goto get_kind;
2314     }
2315
2316   if (gfc_match (" double precision") == MATCH_YES)
2317     {
2318       ts->type = BT_REAL;
2319       ts->kind = gfc_default_double_kind;
2320       return MATCH_YES;
2321     }
2322
2323   if (gfc_match (" complex") == MATCH_YES)
2324     {
2325       ts->type = BT_COMPLEX;
2326       ts->kind = gfc_default_complex_kind;
2327       goto get_kind;
2328     }
2329
2330   if (gfc_match (" double complex") == MATCH_YES)
2331     {
2332       if (gfc_notify_std (GFC_STD_GNU, "DOUBLE COMPLEX at %C does not "
2333                           "conform to the Fortran 95 standard") == FAILURE)
2334         return MATCH_ERROR;
2335
2336       ts->type = BT_COMPLEX;
2337       ts->kind = gfc_default_double_kind;
2338       return MATCH_YES;
2339     }
2340
2341   if (gfc_match (" logical") == MATCH_YES)
2342     {
2343       ts->type = BT_LOGICAL;
2344       ts->kind = gfc_default_logical_kind;
2345       goto get_kind;
2346     }
2347
2348   m = gfc_match (" type ( %n )", name);
2349   if (m != MATCH_YES)
2350     return m;
2351
2352   ts->type = BT_DERIVED;
2353
2354   /* Defer association of the derived type until the end of the
2355      specification block.  However, if the derived type can be
2356      found, add it to the typespec.  */  
2357   if (gfc_matching_function)
2358     {
2359       ts->derived = NULL;
2360       if (gfc_current_state () != COMP_INTERFACE
2361             && !gfc_find_symbol (name, NULL, 1, &sym) && sym)
2362         ts->derived = sym;
2363       return MATCH_YES;
2364     }
2365
2366   /* Search for the name but allow the components to be defined later.  If
2367      type = -1, this typespec has been seen in a function declaration but
2368      the type could not be accessed at that point.  */
2369   sym = NULL;
2370   if (ts->kind != -1 && gfc_get_ha_symbol (name, &sym))
2371     {
2372       gfc_error ("Type name '%s' at %C is ambiguous", name);
2373       return MATCH_ERROR;
2374     }
2375   else if (ts->kind == -1)
2376     {
2377       int iface = gfc_state_stack->previous->state != COMP_INTERFACE
2378                     || gfc_current_ns->has_import_set;
2379       if (gfc_find_symbol (name, NULL, iface, &sym))
2380         {       
2381           gfc_error ("Type name '%s' at %C is ambiguous", name);
2382           return MATCH_ERROR;
2383         }
2384
2385       ts->kind = 0;
2386       if (sym == NULL)
2387         return MATCH_NO;
2388     }
2389
2390   if (sym->attr.flavor != FL_DERIVED
2391       && gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL) == FAILURE)
2392     return MATCH_ERROR;
2393
2394   gfc_set_sym_referenced (sym);
2395   ts->derived = sym;
2396
2397   return MATCH_YES;
2398
2399 get_kind:
2400   /* For all types except double, derived and character, look for an
2401      optional kind specifier.  MATCH_NO is actually OK at this point.  */
2402   if (implicit_flag == 1)
2403     return MATCH_YES;
2404
2405   if (gfc_current_form == FORM_FREE)
2406     {
2407       c = gfc_peek_ascii_char();
2408       if (!gfc_is_whitespace(c) && c != '*' && c != '('
2409           && c != ':' && c != ',')
2410        return MATCH_NO;
2411     }
2412
2413   m = gfc_match_kind_spec (ts, false);
2414   if (m == MATCH_NO && ts->type != BT_CHARACTER)
2415     m = gfc_match_old_kind_spec (ts);
2416
2417   /* Defer association of the KIND expression of function results
2418      until after USE and IMPORT statements.  */
2419   if ((gfc_current_state () == COMP_NONE && gfc_error_flag_test ())
2420          || gfc_matching_function)
2421     return MATCH_YES;
2422
2423   if (m == MATCH_NO)
2424     m = MATCH_YES;              /* No kind specifier found.  */
2425
2426   return m;
2427 }
2428
2429
2430 /* Match an IMPLICIT NONE statement.  Actually, this statement is
2431    already matched in parse.c, or we would not end up here in the
2432    first place.  So the only thing we need to check, is if there is
2433    trailing garbage.  If not, the match is successful.  */
2434
2435 match
2436 gfc_match_implicit_none (void)
2437 {
2438   return (gfc_match_eos () == MATCH_YES) ? MATCH_YES : MATCH_NO;
2439 }
2440
2441
2442 /* Match the letter range(s) of an IMPLICIT statement.  */
2443
2444 static match
2445 match_implicit_range (void)
2446 {
2447   char c, c1, c2;
2448   int inner;
2449   locus cur_loc;
2450
2451   cur_loc = gfc_current_locus;
2452
2453   gfc_gobble_whitespace ();
2454   c = gfc_next_ascii_char ();
2455   if (c != '(')
2456     {
2457       gfc_error ("Missing character range in IMPLICIT at %C");
2458       goto bad;
2459     }
2460
2461   inner = 1;
2462   while (inner)
2463     {
2464       gfc_gobble_whitespace ();
2465       c1 = gfc_next_ascii_char ();
2466       if (!ISALPHA (c1))
2467         goto bad;
2468
2469       gfc_gobble_whitespace ();
2470       c = gfc_next_ascii_char ();
2471
2472       switch (c)
2473         {
2474         case ')':
2475           inner = 0;            /* Fall through.  */
2476
2477         case ',':
2478           c2 = c1;
2479           break;
2480
2481         case '-':
2482           gfc_gobble_whitespace ();
2483           c2 = gfc_next_ascii_char ();
2484           if (!ISALPHA (c2))
2485             goto bad;
2486
2487           gfc_gobble_whitespace ();
2488           c = gfc_next_ascii_char ();
2489
2490           if ((c != ',') && (c != ')'))
2491             goto bad;
2492           if (c == ')')
2493             inner = 0;
2494
2495           break;
2496
2497         default:
2498           goto bad;
2499         }
2500
2501       if (c1 > c2)
2502         {
2503           gfc_error ("Letters must be in alphabetic order in "
2504                      "IMPLICIT statement at %C");
2505           goto bad;
2506         }
2507
2508       /* See if we can add the newly matched range to the pending
2509          implicits from this IMPLICIT statement.  We do not check for
2510          conflicts with whatever earlier IMPLICIT statements may have
2511          set.  This is done when we've successfully finished matching
2512          the current one.  */
2513       if (gfc_add_new_implicit_range (c1, c2) != SUCCESS)
2514         goto bad;
2515     }
2516
2517   return MATCH_YES;
2518
2519 bad:
2520   gfc_syntax_error (ST_IMPLICIT);
2521
2522   gfc_current_locus = cur_loc;
2523   return MATCH_ERROR;
2524 }
2525
2526
2527 /* Match an IMPLICIT statement, storing the types for
2528    gfc_set_implicit() if the statement is accepted by the parser.
2529    There is a strange looking, but legal syntactic construction
2530    possible.  It looks like:
2531
2532      IMPLICIT INTEGER (a-b) (c-d)
2533
2534    This is legal if "a-b" is a constant expression that happens to
2535    equal one of the legal kinds for integers.  The real problem
2536    happens with an implicit specification that looks like:
2537
2538      IMPLICIT INTEGER (a-b)
2539
2540    In this case, a typespec matcher that is "greedy" (as most of the
2541    matchers are) gobbles the character range as a kindspec, leaving
2542    nothing left.  We therefore have to go a bit more slowly in the
2543    matching process by inhibiting the kindspec checking during
2544    typespec matching and checking for a kind later.  */
2545
2546 match
2547 gfc_match_implicit (void)
2548 {
2549   gfc_typespec ts;
2550   locus cur_loc;
2551   char c;
2552   match m;
2553
2554   gfc_clear_ts (&ts);
2555
2556   /* We don't allow empty implicit statements.  */
2557   if (gfc_match_eos () == MATCH_YES)
2558     {
2559       gfc_error ("Empty IMPLICIT statement at %C");
2560       return MATCH_ERROR;
2561     }
2562
2563   do
2564     {
2565       /* First cleanup.  */
2566       gfc_clear_new_implicit ();
2567
2568       /* A basic type is mandatory here.  */
2569       m = gfc_match_type_spec (&ts, 1);
2570       if (m == MATCH_ERROR)
2571         goto error;
2572       if (m == MATCH_NO)
2573         goto syntax;
2574
2575       cur_loc = gfc_current_locus;
2576       m = match_implicit_range ();
2577
2578       if (m == MATCH_YES)
2579         {
2580           /* We may have <TYPE> (<RANGE>).  */
2581           gfc_gobble_whitespace ();
2582           c = gfc_next_ascii_char ();
2583           if ((c == '\n') || (c == ','))
2584             {
2585               /* Check for CHARACTER with no length parameter.  */
2586               if (ts.type == BT_CHARACTER && !ts.cl)
2587                 {
2588                   ts.kind = gfc_default_character_kind;
2589                   ts.cl = gfc_get_charlen ();
2590                   ts.cl->next = gfc_current_ns->cl_list;
2591                   gfc_current_ns->cl_list = ts.cl;
2592                   ts.cl->length = gfc_int_expr (1);
2593                 }
2594
2595               /* Record the Successful match.  */
2596               if (gfc_merge_new_implicit (&ts) != SUCCESS)
2597                 return MATCH_ERROR;
2598               continue;
2599             }
2600
2601           gfc_current_locus = cur_loc;
2602         }
2603
2604       /* Discard the (incorrectly) matched range.  */
2605       gfc_clear_new_implicit ();
2606
2607       /* Last chance -- check <TYPE> <SELECTOR> (<RANGE>).  */
2608       if (ts.type == BT_CHARACTER)
2609         m = match_char_spec (&ts);
2610       else
2611         {
2612           m = gfc_match_kind_spec (&ts, false);
2613           if (m == MATCH_NO)
2614             {
2615               m = gfc_match_old_kind_spec (&ts);
2616               if (m == MATCH_ERROR)
2617                 goto error;
2618               if (m == MATCH_NO)
2619                 goto syntax;
2620             }
2621         }
2622       if (m == MATCH_ERROR)
2623         goto error;
2624
2625       m = match_implicit_range ();
2626       if (m == MATCH_ERROR)
2627         goto error;
2628       if (m == MATCH_NO)
2629         goto syntax;
2630
2631       gfc_gobble_whitespace ();
2632       c = gfc_next_ascii_char ();
2633       if ((c != '\n') && (c != ','))
2634         goto syntax;
2635
2636       if (gfc_merge_new_implicit (&ts) != SUCCESS)
2637         return MATCH_ERROR;
2638     }
2639   while (c == ',');
2640
2641   return MATCH_YES;
2642
2643 syntax:
2644   gfc_syntax_error (ST_IMPLICIT);
2645
2646 error:
2647   return MATCH_ERROR;
2648 }
2649
2650
2651 match
2652 gfc_match_import (void)
2653 {
2654   char name[GFC_MAX_SYMBOL_LEN + 1];
2655   match m;
2656   gfc_symbol *sym;
2657   gfc_symtree *st;
2658
2659   if (gfc_current_ns->proc_name == NULL
2660       || gfc_current_ns->proc_name->attr.if_source != IFSRC_IFBODY)
2661     {
2662       gfc_error ("IMPORT statement at %C only permitted in "
2663                  "an INTERFACE body");
2664       return MATCH_ERROR;
2665     }
2666
2667   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: IMPORT statement at %C")
2668       == FAILURE)
2669     return MATCH_ERROR;
2670
2671   if (gfc_match_eos () == MATCH_YES)
2672     {
2673       /* All host variables should be imported.  */
2674       gfc_current_ns->has_import_set = 1;
2675       return MATCH_YES;
2676     }
2677
2678   if (gfc_match (" ::") == MATCH_YES)
2679     {
2680       if (gfc_match_eos () == MATCH_YES)
2681         {
2682            gfc_error ("Expecting list of named entities at %C");
2683            return MATCH_ERROR;
2684         }
2685     }
2686
2687   for(;;)
2688     {
2689       m = gfc_match (" %n", name);
2690       switch (m)
2691         {
2692         case MATCH_YES:
2693           if (gfc_current_ns->parent !=  NULL
2694               && gfc_find_symbol (name, gfc_current_ns->parent, 1, &sym))
2695             {
2696                gfc_error ("Type name '%s' at %C is ambiguous", name);
2697                return MATCH_ERROR;
2698             }
2699           else if (gfc_current_ns->proc_name->ns->parent !=  NULL
2700                    && gfc_find_symbol (name,
2701                                        gfc_current_ns->proc_name->ns->parent,
2702                                        1, &sym))
2703             {
2704                gfc_error ("Type name '%s' at %C is ambiguous", name);
2705                return MATCH_ERROR;
2706             }
2707
2708           if (sym == NULL)
2709             {
2710               gfc_error ("Cannot IMPORT '%s' from host scoping unit "
2711                          "at %C - does not exist.", name);
2712               return MATCH_ERROR;
2713             }
2714
2715           if (gfc_find_symtree (gfc_current_ns->sym_root,name))
2716             {
2717               gfc_warning ("'%s' is already IMPORTed from host scoping unit "
2718                            "at %C.", name);
2719               goto next_item;
2720             }
2721
2722           st = gfc_new_symtree (&gfc_current_ns->sym_root, name);
2723           st->n.sym = sym;
2724           sym->refs++;
2725           sym->attr.imported = 1;
2726
2727           goto next_item;
2728
2729         case MATCH_NO:
2730           break;
2731
2732         case MATCH_ERROR:
2733           return MATCH_ERROR;
2734         }
2735
2736     next_item:
2737       if (gfc_match_eos () == MATCH_YES)
2738         break;
2739       if (gfc_match_char (',') != MATCH_YES)
2740         goto syntax;
2741     }
2742
2743   return MATCH_YES;
2744
2745 syntax:
2746   gfc_error ("Syntax error in IMPORT statement at %C");
2747   return MATCH_ERROR;
2748 }
2749
2750
2751 /* A minimal implementation of gfc_match without whitespace, escape
2752    characters or variable arguments.  Returns true if the next
2753    characters match the TARGET template exactly.  */
2754
2755 static bool
2756 match_string_p (const char *target)
2757 {
2758   const char *p;
2759
2760   for (p = target; *p; p++)
2761     if ((char) gfc_next_ascii_char () != *p)
2762       return false;
2763   return true;
2764 }
2765
2766 /* Matches an attribute specification including array specs.  If
2767    successful, leaves the variables current_attr and current_as
2768    holding the specification.  Also sets the colon_seen variable for
2769    later use by matchers associated with initializations.
2770
2771    This subroutine is a little tricky in the sense that we don't know
2772    if we really have an attr-spec until we hit the double colon.
2773    Until that time, we can only return MATCH_NO.  This forces us to
2774    check for duplicate specification at this level.  */
2775
2776 static match
2777 match_attr_spec (void)
2778 {
2779   /* Modifiers that can exist in a type statement.  */
2780   typedef enum
2781   { GFC_DECL_BEGIN = 0,
2782     DECL_ALLOCATABLE = GFC_DECL_BEGIN, DECL_DIMENSION, DECL_EXTERNAL,
2783     DECL_IN, DECL_OUT, DECL_INOUT, DECL_INTRINSIC, DECL_OPTIONAL,
2784     DECL_PARAMETER, DECL_POINTER, DECL_PROTECTED, DECL_PRIVATE,
2785     DECL_PUBLIC, DECL_SAVE, DECL_TARGET, DECL_VALUE, DECL_VOLATILE,
2786     DECL_IS_BIND_C, DECL_NONE,
2787     GFC_DECL_END /* Sentinel */
2788   }
2789   decl_types;
2790
2791 /* GFC_DECL_END is the sentinel, index starts at 0.  */
2792 #define NUM_DECL GFC_DECL_END
2793
2794   locus start, seen_at[NUM_DECL];
2795   int seen[NUM_DECL];
2796   decl_types d;
2797   const char *attr;
2798   match m;
2799   gfc_try t;
2800
2801   gfc_clear_attr (&current_attr);
2802   start = gfc_current_locus;
2803
2804   current_as = NULL;
2805   colon_seen = 0;
2806
2807   /* See if we get all of the keywords up to the final double colon.  */
2808   for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
2809     seen[d] = 0;
2810
2811   for (;;)
2812     {
2813       char ch;
2814
2815       d = DECL_NONE;
2816       gfc_gobble_whitespace ();
2817
2818       ch = gfc_next_ascii_char ();
2819       if (ch == ':')
2820         {
2821           /* This is the successful exit condition for the loop.  */
2822           if (gfc_next_ascii_char () == ':')
2823             break;
2824         }
2825       else if (ch == ',')
2826         {
2827           gfc_gobble_whitespace ();
2828           switch (gfc_peek_ascii_char ())
2829             {
2830             case 'a':
2831               if (match_string_p ("allocatable"))
2832                 d = DECL_ALLOCATABLE;
2833               break;
2834
2835             case 'b':
2836               /* Try and match the bind(c).  */
2837               m = gfc_match_bind_c (NULL, true);
2838               if (m == MATCH_YES)
2839                 d = DECL_IS_BIND_C;
2840               else if (m == MATCH_ERROR)
2841                 goto cleanup;
2842               break;
2843
2844             case 'd':
2845               if (match_string_p ("dimension"))
2846                 d = DECL_DIMENSION;
2847               break;
2848
2849             case 'e':
2850               if (match_string_p ("external"))
2851                 d = DECL_EXTERNAL;
2852               break;
2853
2854             case 'i':
2855               if (match_string_p ("int"))
2856                 {
2857                   ch = gfc_next_ascii_char ();
2858                   if (ch == 'e')
2859                     {
2860                       if (match_string_p ("nt"))
2861                         {
2862                           /* Matched "intent".  */
2863                           /* TODO: Call match_intent_spec from here.  */
2864                           if (gfc_match (" ( in out )") == MATCH_YES)
2865                             d = DECL_INOUT;
2866                           else if (gfc_match (" ( in )") == MATCH_YES)
2867                             d = DECL_IN;
2868                           else if (gfc_match (" ( out )") == MATCH_YES)
2869                             d = DECL_OUT;
2870                         }
2871                     }
2872                   else if (ch == 'r')
2873                     {
2874                       if (match_string_p ("insic"))
2875                         {
2876                           /* Matched "intrinsic".  */
2877                           d = DECL_INTRINSIC;
2878                         }
2879                     }
2880                 }
2881               break;
2882
2883             case 'o':
2884               if (match_string_p ("optional"))
2885                 d = DECL_OPTIONAL;
2886               break;
2887
2888             case 'p':
2889               gfc_next_ascii_char ();
2890               switch (gfc_next_ascii_char ())
2891                 {
2892                 case 'a':
2893                   if (match_string_p ("rameter"))
2894                     {
2895                       /* Matched "parameter".  */
2896                       d = DECL_PARAMETER;
2897                     }
2898                   break;
2899
2900                 case 'o':
2901                   if (match_string_p ("inter"))
2902                     {
2903                       /* Matched "pointer".  */
2904                       d = DECL_POINTER;
2905                     }
2906                   break;
2907
2908                 case 'r':
2909                   ch = gfc_next_ascii_char ();
2910                   if (ch == 'i')
2911                     {
2912                       if (match_string_p ("vate"))
2913                         {
2914                           /* Matched "private".  */
2915                           d = DECL_PRIVATE;
2916                         }
2917                     }
2918                   else if (ch == 'o')
2919                     {
2920                       if (match_string_p ("tected"))
2921                         {
2922                           /* Matched "protected".  */
2923                           d = DECL_PROTECTED;
2924                         }
2925                     }
2926                   break;
2927
2928                 case 'u':
2929                   if (match_string_p ("blic"))
2930                     {
2931                       /* Matched "public".  */
2932                       d = DECL_PUBLIC;
2933                     }
2934                   break;
2935                 }
2936               break;
2937
2938             case 's':
2939               if (match_string_p ("save"))
2940                 d = DECL_SAVE;
2941               break;
2942
2943             case 't':
2944               if (match_string_p ("target"))
2945                 d = DECL_TARGET;
2946               break;
2947
2948             case 'v':
2949               gfc_next_ascii_char ();
2950               ch = gfc_next_ascii_char ();
2951               if (ch == 'a')
2952                 {
2953                   if (match_string_p ("lue"))
2954                     {
2955                       /* Matched "value".  */
2956                       d = DECL_VALUE;
2957                     }
2958                 }
2959               else if (ch == 'o')
2960                 {
2961                   if (match_string_p ("latile"))
2962                     {
2963                       /* Matched "volatile".  */
2964                       d = DECL_VOLATILE;
2965                     }
2966                 }
2967               break;
2968             }
2969         }
2970
2971       /* No double colon and no recognizable decl_type, so assume that
2972          we've been looking at something else the whole time.  */
2973       if (d == DECL_NONE)
2974         {
2975           m = MATCH_NO;
2976           goto cleanup;
2977         }
2978
2979       /* Check to make sure any parens are paired up correctly.  */
2980       if (gfc_match_parens () == MATCH_ERROR)
2981         {
2982           m = MATCH_ERROR;
2983           goto cleanup;
2984         }
2985
2986       seen[d]++;
2987       seen_at[d] = gfc_current_locus;
2988
2989       if (d == DECL_DIMENSION)
2990         {
2991           m = gfc_match_array_spec (&current_as);
2992
2993           if (m == MATCH_NO)
2994             {
2995               gfc_error ("Missing dimension specification at %C");
2996               m = MATCH_ERROR;
2997             }
2998
2999           if (m == MATCH_ERROR)
3000             goto cleanup;
3001         }
3002     }
3003
3004   /* Since we've seen a double colon, we have to be looking at an
3005      attr-spec.  This means that we can now issue errors.  */
3006   for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
3007     if (seen[d] > 1)
3008       {
3009         switch (d)
3010           {
3011           case DECL_ALLOCATABLE:
3012             attr = "ALLOCATABLE";
3013             break;
3014           case DECL_DIMENSION:
3015             attr = "DIMENSION";
3016             break;
3017           case DECL_EXTERNAL:
3018             attr = "EXTERNAL";
3019             break;
3020           case DECL_IN:
3021             attr = "INTENT (IN)";
3022             break;
3023           case DECL_OUT:
3024             attr = "INTENT (OUT)";
3025             break;
3026           case DECL_INOUT:
3027             attr = "INTENT (IN OUT)";
3028             break;
3029           case DECL_INTRINSIC:
3030             attr = "INTRINSIC";
3031             break;
3032           case DECL_OPTIONAL:
3033             attr = "OPTIONAL";
3034             break;
3035           case DECL_PARAMETER:
3036             attr = "PARAMETER";
3037             break;
3038           case DECL_POINTER:
3039             attr = "POINTER";
3040             break;
3041           case DECL_PROTECTED:
3042             attr = "PROTECTED";
3043             break;
3044           case DECL_PRIVATE:
3045             attr = "PRIVATE";
3046             break;
3047           case DECL_PUBLIC:
3048             attr = "PUBLIC";
3049             break;
3050           case DECL_SAVE:
3051             attr = "SAVE";
3052             break;
3053           case DECL_TARGET:
3054             attr = "TARGET";
3055             break;
3056           case DECL_IS_BIND_C:
3057             attr = "IS_BIND_C";
3058             break;
3059           case DECL_VALUE:
3060             attr = "VALUE";
3061             break;
3062           case DECL_VOLATILE:
3063             attr = "VOLATILE";
3064             break;
3065           default:
3066             attr = NULL;        /* This shouldn't happen.  */
3067           }
3068
3069         gfc_error ("Duplicate %s attribute at %L", attr, &seen_at[d]);
3070         m = MATCH_ERROR;
3071         goto cleanup;
3072       }
3073
3074   /* Now that we've dealt with duplicate attributes, add the attributes
3075      to the current attribute.  */
3076   for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
3077     {
3078       if (seen[d] == 0)
3079         continue;
3080
3081       if (gfc_current_state () == COMP_DERIVED
3082           && d != DECL_DIMENSION && d != DECL_POINTER
3083           && d != DECL_PRIVATE   && d != DECL_PUBLIC
3084           && d != DECL_NONE)
3085         {
3086           if (d == DECL_ALLOCATABLE)
3087             {
3088               if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ALLOCATABLE "
3089                                   "attribute at %C in a TYPE definition")
3090                   == FAILURE)
3091                 {
3092                   m = MATCH_ERROR;
3093                   goto cleanup;
3094                 }
3095             }
3096           else
3097             {
3098               gfc_error ("Attribute at %L is not allowed in a TYPE definition",
3099                          &seen_at[d]);
3100               m = MATCH_ERROR;
3101               goto cleanup;
3102             }
3103         }
3104
3105       if ((d == DECL_PRIVATE || d == DECL_PUBLIC)
3106           && gfc_current_state () != COMP_MODULE)
3107         {
3108           if (d == DECL_PRIVATE)
3109             attr = "PRIVATE";
3110           else
3111             attr = "PUBLIC";
3112           if (gfc_current_state () == COMP_DERIVED
3113               && gfc_state_stack->previous
3114               && gfc_state_stack->previous->state == COMP_MODULE)
3115             {
3116               if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Attribute %s "
3117                                   "at %L in a TYPE definition", attr,
3118                                   &seen_at[d])
3119                   == FAILURE)
3120                 {
3121                   m = MATCH_ERROR;
3122                   goto cleanup;
3123                 }
3124             }
3125           else
3126             {
3127               gfc_error ("%s attribute at %L is not allowed outside of the "
3128                          "specification part of a module", attr, &seen_at[d]);
3129               m = MATCH_ERROR;
3130               goto cleanup;
3131             }
3132         }
3133
3134       switch (d)
3135         {
3136         case DECL_ALLOCATABLE:
3137           t = gfc_add_allocatable (&current_attr, &seen_at[d]);
3138           break;
3139
3140         case DECL_DIMENSION:
3141           t = gfc_add_dimension (&current_attr, NULL, &seen_at[d]);
3142           break;
3143
3144         case DECL_EXTERNAL:
3145           t = gfc_add_external (&current_attr, &seen_at[d]);
3146           break;
3147
3148         case DECL_IN:
3149           t = gfc_add_intent (&current_attr, INTENT_IN, &seen_at[d]);
3150           break;
3151
3152         case DECL_OUT:
3153           t = gfc_add_intent (&current_attr, INTENT_OUT, &seen_at[d]);
3154           break;
3155
3156         case DECL_INOUT:
3157           t = gfc_add_intent (&current_attr, INTENT_INOUT, &seen_at[d]);
3158           break;
3159
3160         case DECL_INTRINSIC:
3161           t = gfc_add_intrinsic (&current_attr, &seen_at[d]);
3162           break;
3163
3164         case DECL_OPTIONAL:
3165           t = gfc_add_optional (&current_attr, &seen_at[d]);
3166           break;
3167
3168         case DECL_PARAMETER:
3169           t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, &seen_at[d]);
3170           break;
3171
3172         case DECL_POINTER:
3173           t = gfc_add_pointer (&current_attr, &seen_at[d]);
3174           break;
3175
3176         case DECL_PROTECTED:
3177           if (gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
3178             {
3179                gfc_error ("PROTECTED at %C only allowed in specification "
3180                           "part of a module");
3181                t = FAILURE;
3182                break;
3183             }
3184
3185           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PROTECTED "
3186                               "attribute at %C")
3187               == FAILURE)
3188             t = FAILURE;
3189           else
3190             t = gfc_add_protected (&current_attr, NULL, &seen_at[d]);
3191           break;
3192
3193         case DECL_PRIVATE:
3194           t = gfc_add_access (&current_attr, ACCESS_PRIVATE, NULL,
3195                               &seen_at[d]);
3196           break;
3197
3198         case DECL_PUBLIC:
3199           t = gfc_add_access (&current_attr, ACCESS_PUBLIC, NULL,
3200                               &seen_at[d]);
3201           break;
3202
3203         case DECL_SAVE:
3204           t = gfc_add_save (&current_attr, NULL, &seen_at[d]);
3205           break;
3206
3207         case DECL_TARGET:
3208           t = gfc_add_target (&current_attr, &seen_at[d]);
3209           break;
3210
3211         case DECL_IS_BIND_C:
3212            t = gfc_add_is_bind_c(&current_attr, NULL, &seen_at[d], 0);
3213            break;
3214            
3215         case DECL_VALUE:
3216           if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: VALUE attribute "
3217                               "at %C")
3218               == FAILURE)
3219             t = FAILURE;
3220           else
3221             t = gfc_add_value (&current_attr, NULL, &seen_at[d]);
3222           break;
3223
3224         case DECL_VOLATILE:
3225           if (gfc_notify_std (GFC_STD_F2003,
3226                               "Fortran 2003: VOLATILE attribute at %C")
3227               == FAILURE)
3228             t = FAILURE;
3229           else
3230             t = gfc_add_volatile (&current_attr, NULL, &seen_at[d]);
3231           break;
3232
3233         default:
3234           gfc_internal_error ("match_attr_spec(): Bad attribute");
3235         }
3236
3237       if (t == FAILURE)
3238         {
3239           m = MATCH_ERROR;
3240           goto cleanup;
3241         }
3242     }
3243
3244   colon_seen = 1;
3245   return MATCH_YES;
3246
3247 cleanup:
3248   gfc_current_locus = start;
3249   gfc_free_array_spec (current_as);
3250   current_as = NULL;
3251   return m;
3252 }
3253
3254
3255 /* Set the binding label, dest_label, either with the binding label
3256    stored in the given gfc_typespec, ts, or if none was provided, it
3257    will be the symbol name in all lower case, as required by the draft
3258    (J3/04-007, section 15.4.1).  If a binding label was given and
3259    there is more than one argument (num_idents), it is an error.  */
3260
3261 gfc_try
3262 set_binding_label (char *dest_label, const char *sym_name, int num_idents)
3263 {
3264   if (num_idents > 1 && has_name_equals)
3265     {
3266       gfc_error ("Multiple identifiers provided with "
3267                  "single NAME= specifier at %C");
3268       return FAILURE;
3269     }
3270
3271   if (curr_binding_label[0] != '\0')
3272     {
3273       /* Binding label given; store in temp holder til have sym.  */
3274       strcpy (dest_label, curr_binding_label);
3275     }
3276   else
3277     {
3278       /* No binding label given, and the NAME= specifier did not exist,
3279          which means there was no NAME="".  */
3280       if (sym_name != NULL && has_name_equals == 0)
3281         strcpy (dest_label, sym_name);
3282     }
3283    
3284   return SUCCESS;
3285 }
3286
3287
3288 /* Set the status of the given common block as being BIND(C) or not,
3289    depending on the given parameter, is_bind_c.  */
3290
3291 void
3292 set_com_block_bind_c (gfc_common_head *com_block, int is_bind_c)
3293 {
3294   com_block->is_bind_c = is_bind_c;
3295   return;
3296 }
3297
3298
3299 /* Verify that the given gfc_typespec is for a C interoperable type.  */
3300
3301 gfc_try
3302 verify_c_interop (gfc_typespec *ts, const char *name, locus *where)
3303 {
3304   gfc_try t;
3305
3306   /* Make sure the kind used is appropriate for the type.
3307      The f90_type is unknown if an integer constant was
3308      used (e.g., real(4), bind(c) :: myFloat).  */
3309   if (ts->f90_type != BT_UNKNOWN)
3310     {
3311       t = gfc_validate_c_kind (ts);
3312       if (t != SUCCESS)
3313         {
3314           /* Print an error, but continue parsing line.  */
3315           gfc_error_now ("C kind parameter is for type %s but "
3316                          "symbol '%s' at %L is of type %s",
3317                          gfc_basic_typename (ts->f90_type),
3318                          name, where, 
3319                          gfc_basic_typename (ts->type));
3320         }
3321     }
3322
3323   /* Make sure the kind is C interoperable.  This does not care about the
3324      possible error above.  */
3325   if (ts->type == BT_DERIVED && ts->derived != NULL)
3326     return (ts->derived->ts.is_c_interop ? SUCCESS : FAILURE);
3327   else if (ts->is_c_interop != 1)
3328     return FAILURE;
3329   
3330   return SUCCESS;
3331 }
3332
3333
3334 /* Verify that the variables of a given common block, which has been
3335    defined with the attribute specifier bind(c), to be of a C
3336    interoperable type.  Errors will be reported here, if
3337    encountered.  */
3338
3339 gfc_try
3340 verify_com_block_vars_c_interop (gfc_common_head *com_block)
3341 {
3342   gfc_symbol *curr_sym = NULL;
3343   gfc_try retval = SUCCESS;
3344
3345   curr_sym = com_block->head;
3346   
3347   /* Make sure we have at least one symbol.  */
3348   if (curr_sym == NULL)
3349     return retval;
3350
3351   /* Here we know we have a symbol, so we'll execute this loop
3352      at least once.  */
3353   do
3354     {
3355       /* The second to last param, 1, says this is in a common block.  */
3356       retval = verify_bind_c_sym (curr_sym, &(curr_sym->ts), 1, com_block);
3357       curr_sym = curr_sym->common_next;
3358     } while (curr_sym != NULL); 
3359
3360   return retval;
3361 }
3362
3363
3364 /* Verify that a given BIND(C) symbol is C interoperable.  If it is not,
3365    an appropriate error message is reported.  */
3366
3367 gfc_try
3368 verify_bind_c_sym (gfc_symbol *tmp_sym, gfc_typespec *ts,
3369                    int is_in_common, gfc_common_head *com_block)
3370 {
3371   gfc_try retval = SUCCESS;
3372
3373   if (tmp_sym->attr.function && tmp_sym->result != NULL)
3374     {
3375       tmp_sym = tmp_sym->result;
3376       /* Make sure it wasn't an implicitly typed result.  */
3377       if (tmp_sym->attr.implicit_type)
3378         {
3379           gfc_warning ("Implicitly declared BIND(C) function '%s' at "
3380                        "%L may not be C interoperable", tmp_sym->name,
3381                        &tmp_sym->declared_at);
3382           tmp_sym->ts.f90_type = tmp_sym->ts.type;
3383           /* Mark it as C interoperable to prevent duplicate warnings.  */
3384           tmp_sym->ts.is_c_interop = 1;
3385           tmp_sym->attr.is_c_interop = 1;
3386         }
3387     }
3388   
3389   /* Here, we know we have the bind(c) attribute, so if we have
3390      enough type info, then verify that it's a C interop kind.
3391      The info could be in the symbol already, or possibly still in
3392      the given ts (current_ts), so look in both.  */
3393   if (tmp_sym->ts.type != BT_UNKNOWN || ts->type != BT_UNKNOWN) 
3394     {
3395       if (verify_c_interop (&(tmp_sym->ts), tmp_sym->name,
3396                             &(tmp_sym->declared_at)) != SUCCESS)
3397         {
3398           /* See if we're dealing with a sym in a common block or not.  */
3399           if (is_in_common == 1)
3400             {
3401               gfc_warning ("Variable '%s' in common block '%s' at %L "
3402                            "may not be a C interoperable "
3403                            "kind though common block '%s' is BIND(C)",
3404                            tmp_sym->name, com_block->name,
3405                            &(tmp_sym->declared_at), com_block->name);
3406             }
3407           else
3408             {
3409               if (tmp_sym->ts.type == BT_DERIVED || ts->type == BT_DERIVED)
3410                 gfc_error ("Type declaration '%s' at %L is not C "
3411                            "interoperable but it is BIND(C)",
3412                            tmp_sym->name, &(tmp_sym->declared_at));
3413               else
3414                 gfc_warning ("Variable '%s' at %L "
3415                              "may not be a C interoperable "
3416                              "kind but it is bind(c)",
3417                              tmp_sym->name, &(tmp_sym->declared_at));
3418             }
3419         }
3420       
3421       /* Variables declared w/in a common block can't be bind(c)
3422          since there's no way for C to see these variables, so there's
3423          semantically no reason for the attribute.  */
3424       if (is_in_common == 1 && tmp_sym->attr.is_bind_c == 1)
3425         {
3426           gfc_error ("Variable '%s' in common block '%s' at "
3427                      "%L cannot be declared with BIND(C) "
3428                      "since it is not a global",
3429                      tmp_sym->name, com_block->name,
3430                      &(tmp_sym->declared_at));
3431           retval = FAILURE;
3432         }
3433       
3434       /* Scalar variables that are bind(c) can not have the pointer
3435          or allocatable attributes.  */
3436       if (tmp_sym->attr.is_bind_c == 1)
3437         {
3438           if (tmp_sym->attr.pointer == 1)
3439             {
3440               gfc_error ("Variable '%s' at %L cannot have both the "
3441                          "POINTER and BIND(C) attributes",
3442                          tmp_sym->name, &(tmp_sym->declared_at));
3443               retval = FAILURE;
3444             }
3445
3446           if (tmp_sym->attr.allocatable == 1)
3447             {
3448               gfc_error ("Variable '%s' at %L cannot have both the "
3449                          "ALLOCATABLE and BIND(C) attributes",
3450                          tmp_sym->name, &(tmp_sym->declared_at));
3451               retval = FAILURE;
3452             }
3453
3454           /* If it is a BIND(C) function, make sure the return value is a
3455              scalar value.  The previous tests in this function made sure
3456              the type is interoperable.  */
3457           if (tmp_sym->attr.function == 1 && tmp_sym->as != NULL)
3458             gfc_error ("Return type of BIND(C) function '%s' at %L cannot "
3459                        "be an array", tmp_sym->name, &(tmp_sym->declared_at));
3460
3461           /* BIND(C) functions can not return a character string.  */
3462           if (tmp_sym->attr.function == 1 && tmp_sym->ts.type == BT_CHARACTER)
3463             if (tmp_sym->ts.cl == NULL || tmp_sym->ts.cl->length == NULL
3464                 || tmp_sym->ts.cl->length->expr_type != EXPR_CONSTANT
3465                 || mpz_cmp_si (tmp_sym->ts.cl->length->value.integer, 1) != 0)
3466               gfc_error ("Return type of BIND(C) function '%s' at %L cannot "
3467                          "be a character string", tmp_sym->name,
3468                          &(tmp_sym->declared_at));
3469         }
3470     }
3471
3472   /* See if the symbol has been marked as private.  If it has, make sure
3473      there is no binding label and warn the user if there is one.  */
3474   if (tmp_sym->attr.access == ACCESS_PRIVATE
3475       && tmp_sym->binding_label[0] != '\0')
3476       /* Use gfc_warning_now because we won't say that the symbol fails
3477          just because of this.  */
3478       gfc_warning_now ("Symbol '%s' at %L is marked PRIVATE but has been "
3479                        "given the binding label '%s'", tmp_sym->name,
3480                        &(tmp_sym->declared_at), tmp_sym->binding_label);
3481
3482   return retval;
3483 }
3484
3485
3486 /* Set the appropriate fields for a symbol that's been declared as
3487    BIND(C) (the is_bind_c flag and the binding label), and verify that
3488    the type is C interoperable.  Errors are reported by the functions
3489    used to set/test these fields.  */
3490
3491 gfc_try
3492 set_verify_bind_c_sym (gfc_symbol *tmp_sym, int num_idents)
3493 {
3494   gfc_try retval = SUCCESS;
3495   
3496   /* TODO: Do we need to make sure the vars aren't marked private?  */
3497
3498   /* Set the is_bind_c bit in symbol_attribute.  */
3499   gfc_add_is_bind_c (&(tmp_sym->attr), tmp_sym->name, &gfc_current_locus, 0);
3500
3501   if (set_binding_label (tmp_sym->binding_label, tmp_sym->name, 
3502                          num_idents) != SUCCESS)
3503     return FAILURE;
3504
3505   return retval;
3506 }
3507
3508
3509 /* Set the fields marking the given common block as BIND(C), including
3510    a binding label, and report any errors encountered.  */
3511
3512 gfc_try
3513 set_verify_bind_c_com_block (gfc_common_head *com_block, int num_idents)
3514 {
3515   gfc_try retval = SUCCESS;
3516   
3517   /* destLabel, common name, typespec (which may have binding label).  */
3518   if (set_binding_label (com_block->binding_label, com_block->name, num_idents)
3519       != SUCCESS)
3520     return FAILURE;
3521
3522   /* Set the given common block (com_block) to being bind(c) (1).  */
3523   set_com_block_bind_c (com_block, 1);
3524
3525   return retval;
3526 }
3527
3528
3529 /* Retrieve the list of one or more identifiers that the given bind(c)
3530    attribute applies to.  */
3531
3532 gfc_try
3533 get_bind_c_idents (void)
3534 {
3535   char name[GFC_MAX_SYMBOL_LEN + 1];
3536   int num_idents = 0;
3537   gfc_symbol *tmp_sym = NULL;
3538   match found_id;
3539   gfc_common_head *com_block = NULL;
3540   
3541   if (gfc_match_name (name) == MATCH_YES)
3542     {
3543       found_id = MATCH_YES;
3544       gfc_get_ha_symbol (name, &tmp_sym);
3545     }
3546   else if (match_common_name (name) == MATCH_YES)
3547     {
3548       found_id = MATCH_YES;
3549       com_block = gfc_get_common (name, 0);
3550     }
3551   else
3552     {
3553       gfc_error ("Need either entity or common block name for "
3554                  "attribute specification statement at %C");
3555       return FAILURE;
3556     }
3557    
3558   /* Save the current identifier and look for more.  */
3559   do
3560     {
3561       /* Increment the number of identifiers found for this spec stmt.  */
3562       num_idents++;
3563
3564       /* Make sure we have a sym or com block, and verify that it can
3565          be bind(c).  Set the appropriate field(s) and look for more
3566          identifiers.  */
3567       if (tmp_sym != NULL || com_block != NULL)         
3568         {
3569           if (tmp_sym != NULL)
3570             {
3571               if (set_verify_bind_c_sym (tmp_sym, num_idents)
3572                   != SUCCESS)
3573                 return FAILURE;
3574             }
3575           else
3576             {
3577               if (set_verify_bind_c_com_block(com_block, num_idents)
3578                   != SUCCESS)
3579                 return FAILURE;
3580             }
3581          
3582           /* Look to see if we have another identifier.  */
3583           tmp_sym = NULL;
3584           if (gfc_match_eos () == MATCH_YES)
3585             found_id = MATCH_NO;
3586           else if (gfc_match_char (',') != MATCH_YES)
3587             found_id = MATCH_NO;
3588           else if (gfc_match_name (name) == MATCH_YES)
3589             {
3590               found_id = MATCH_YES;
3591               gfc_get_ha_symbol (name, &tmp_sym);
3592             }
3593           else if (match_common_name (name) == MATCH_YES)
3594             {
3595               found_id = MATCH_YES;
3596               com_block = gfc_get_common (name, 0);
3597             }
3598           else
3599             {
3600               gfc_error ("Missing entity or common block name for "
3601                          "attribute specification statement at %C");
3602               return FAILURE;
3603             }
3604         }
3605       else
3606         {
3607           gfc_internal_error ("Missing symbol");
3608         }
3609     } while (found_id == MATCH_YES);
3610
3611   /* if we get here we were successful */
3612   return SUCCESS;
3613 }
3614
3615
3616 /* Try and match a BIND(C) attribute specification statement.  */
3617    
3618 match
3619 gfc_match_bind_c_stmt (void)
3620 {
3621   match found_match = MATCH_NO;
3622   gfc_typespec *ts;
3623
3624   ts = &current_ts;
3625   
3626   /* This may not be necessary.  */
3627   gfc_clear_ts (ts);
3628   /* Clear the temporary binding label holder.  */
3629   curr_binding_label[0] = '\0';
3630
3631   /* Look for the bind(c).  */
3632   found_match = gfc_match_bind_c (NULL, true);
3633
3634   if (found_match == MATCH_YES)
3635     {
3636       /* Look for the :: now, but it is not required.  */
3637       gfc_match (" :: ");
3638
3639       /* Get the identifier(s) that needs to be updated.  This may need to
3640          change to hand the flag(s) for the attr specified so all identifiers
3641          found can have all appropriate parts updated (assuming that the same
3642          spec stmt can have multiple attrs, such as both bind(c) and
3643          allocatable...).  */
3644       if (get_bind_c_idents () != SUCCESS)
3645         /* Error message should have printed already.  */
3646         return MATCH_ERROR;
3647     }
3648
3649   return found_match;
3650 }
3651
3652
3653 /* Match a data declaration statement.  */
3654
3655 match
3656 gfc_match_data_decl (void)
3657 {
3658   gfc_symbol *sym;
3659   match m;
3660   int elem;
3661
3662   num_idents_on_line = 0;
3663   
3664   m = gfc_match_type_spec (&current_ts, 0);
3665   if (m != MATCH_YES)
3666     return m;
3667
3668   if (current_ts.type == BT_DERIVED && gfc_current_state () != COMP_DERIVED)
3669     {
3670       sym = gfc_use_derived (current_ts.derived);
3671
3672       if (sym == NULL)
3673         {
3674           m = MATCH_ERROR;
3675           goto cleanup;
3676         }
3677
3678       current_ts.derived = sym;
3679     }
3680
3681   m = match_attr_spec ();
3682   if (m == MATCH_ERROR)
3683     {
3684       m = MATCH_NO;
3685       goto cleanup;
3686     }
3687
3688   if (current_ts.type == BT_DERIVED && current_ts.derived->components == NULL
3689       && !current_ts.derived->attr.zero_comp)
3690     {
3691
3692       if (current_attr.pointer && gfc_current_state () == COMP_DERIVED)
3693         goto ok;
3694
3695       gfc_find_symbol (current_ts.derived->name,
3696                        current_ts.derived->ns->parent, 1, &sym);
3697
3698       /* Any symbol that we find had better be a type definition
3699          which has its components defined.  */
3700       if (sym != NULL && sym->attr.flavor == FL_DERIVED
3701           && (current_ts.derived->components != NULL
3702               || current_ts.derived->attr.zero_comp))
3703         goto ok;
3704
3705       /* Now we have an error, which we signal, and then fix up
3706          because the knock-on is plain and simple confusing.  */
3707       gfc_error_now ("Derived type at %C has not been previously defined "
3708                      "and so cannot appear in a derived type definition");
3709       current_attr.pointer = 1;
3710       goto ok;
3711     }
3712
3713 ok:
3714   /* If we have an old-style character declaration, and no new-style
3715      attribute specifications, then there a comma is optional between
3716      the type specification and the variable list.  */
3717   if (m == MATCH_NO && current_ts.type == BT_CHARACTER && old_char_selector)
3718     gfc_match_char (',');
3719
3720   /* Give the types/attributes to symbols that follow. Give the element
3721      a number so that repeat character length expressions can be copied.  */
3722   elem = 1;
3723   for (;;)
3724     {
3725       num_idents_on_line++;
3726       m = variable_decl (elem++);
3727       if (m == MATCH_ERROR)
3728         goto cleanup;
3729       if (m == MATCH_NO)
3730         break;
3731
3732       if (gfc_match_eos () == MATCH_YES)
3733         goto cleanup;
3734       if (gfc_match_char (',') != MATCH_YES)
3735         break;
3736     }
3737
3738   if (gfc_error_flag_test () == 0)
3739     gfc_error ("Syntax error in data declaration at %C");
3740   m = MATCH_ERROR;
3741
3742   gfc_free_data_all (gfc_current_ns);
3743
3744 cleanup:
3745   gfc_free_array_spec (current_as);
3746   current_as = NULL;
3747   return m;
3748 }
3749
3750
3751 /* Match a prefix associated with a function or subroutine
3752    declaration.  If the typespec pointer is nonnull, then a typespec
3753    can be matched.  Note that if nothing matches, MATCH_YES is
3754    returned (the null string was matched).  */
3755
3756 match
3757 gfc_match_prefix (gfc_typespec *ts)
3758 {
3759   bool seen_type;
3760
3761   gfc_clear_attr (&current_attr);
3762   seen_type = 0;
3763
3764   gcc_assert (!gfc_matching_prefix);
3765   gfc_matching_prefix = true;
3766
3767 loop:
3768   if (!seen_type && ts != NULL
3769       && gfc_match_type_spec (ts, 0) == MATCH_YES
3770       && gfc_match_space () == MATCH_YES)
3771     {
3772
3773       seen_type = 1;
3774       goto loop;
3775     }
3776
3777   if (gfc_match ("elemental% ") == MATCH_YES)
3778     {
3779       if (gfc_add_elemental (&current_attr, NULL) == FAILURE)
3780         goto error;
3781
3782       goto loop;
3783     }
3784
3785   if (gfc_match ("pure% ") == MATCH_YES)
3786     {
3787       if (gfc_add_pure (&current_attr, NULL) == FAILURE)
3788         goto error;
3789
3790       goto loop;
3791     }
3792
3793   if (gfc_match ("recursive% ") == MATCH_YES)
3794     {
3795       if (gfc_add_recursive (&current_attr, NULL) == FAILURE)
3796         goto error;
3797
3798       goto loop;
3799     }
3800
3801   /* At this point, the next item is not a prefix.  */
3802   gcc_assert (gfc_matching_prefix);
3803   gfc_matching_prefix = false;
3804   return MATCH_YES;
3805
3806 error:
3807   gcc_assert (gfc_matching_prefix);
3808   gfc_matching_prefix = false;
3809   return MATCH_ERROR;
3810 }
3811
3812
3813 /* Copy attributes matched by gfc_match_prefix() to attributes on a symbol.  */
3814
3815 static gfc_try
3816 copy_prefix (symbol_attribute *dest, locus *where)
3817 {
3818   if (current_attr.pure && gfc_add_pure (dest, where) == FAILURE)
3819     return FAILURE;
3820
3821   if (current_attr.elemental && gfc_add_elemental (dest, where) == FAILURE)
3822     return FAILURE;
3823
3824   if (current_attr.recursive && gfc_add_recursive (dest, where) == FAILURE)
3825     return FAILURE;
3826
3827   return SUCCESS;
3828 }
3829
3830
3831 /* Match a formal argument list.  */
3832
3833 match
3834 gfc_match_formal_arglist (gfc_symbol *progname, int st_flag, int null_flag)
3835 {
3836   gfc_formal_arglist *head, *tail, *p, *q;
3837   char name[GFC_MAX_SYMBOL_LEN + 1];
3838   gfc_symbol *sym;
3839   match m;
3840
3841   head = tail = NULL;
3842
3843   if (gfc_match_char ('(') != MATCH_YES)
3844     {
3845       if (null_flag)
3846         goto ok;
3847       return MATCH_NO;
3848     }
3849
3850   if (gfc_match_char (')') == MATCH_YES)
3851     goto ok;
3852
3853   for (;;)
3854     {
3855       if (gfc_match_char ('*') == MATCH_YES)
3856         sym = NULL;
3857       else
3858         {
3859           m = gfc_match_name (name);
3860           if (m != MATCH_YES)
3861             goto cleanup;
3862
3863           if (gfc_get_symbol (name, NULL, &sym))
3864             goto cleanup;
3865         }
3866
3867       p = gfc_get_formal_arglist ();
3868
3869       if (head == NULL)
3870         head = tail = p;
3871       else
3872         {
3873           tail->next = p;
3874           tail = p;
3875         }
3876
3877       tail->sym = sym;
3878
3879       /* We don't add the VARIABLE flavor because the name could be a
3880          dummy procedure.  We don't apply these attributes to formal
3881          arguments of statement functions.  */
3882       if (sym != NULL && !st_flag
3883           && (gfc_add_dummy (&sym->attr, sym->name, NULL) == FAILURE
3884               || gfc_missing_attr (&sym->attr, NULL) == FAILURE))
3885         {
3886           m = MATCH_ERROR;
3887           goto cleanup;
3888         }
3889
3890       /* The name of a program unit can be in a different namespace,
3891          so check for it explicitly.  After the statement is accepted,
3892          the name is checked for especially in gfc_get_symbol().  */
3893       if (gfc_new_block != NULL && sym != NULL
3894           && strcmp (sym->name, gfc_new_block->name) == 0)
3895         {
3896           gfc_error ("Name '%s' at %C is the name of the procedure",
3897                      sym->name);
3898           m = MATCH_ERROR;
3899           goto cleanup;
3900         }
3901
3902       if (gfc_match_char (')') == MATCH_YES)
3903         goto ok;
3904
3905       m = gfc_match_char (',');
3906       if (m != MATCH_YES)
3907         {
3908           gfc_error ("Unexpected junk in formal argument list at %C");
3909           goto cleanup;
3910         }
3911     }
3912
3913 ok:
3914   /* Check for duplicate symbols in the formal argument list.  */
3915   if (head != NULL)
3916     {
3917       for (p = head; p->next; p = p->next)
3918         {
3919           if (p->sym == NULL)
3920             continue;
3921
3922           for (q = p->next; q; q = q->next)
3923             if (p->sym == q->sym)
3924               {
3925                 gfc_error ("Duplicate symbol '%s' in formal argument list "
3926                            "at %C", p->sym->name);
3927
3928                 m = MATCH_ERROR;
3929                 goto cleanup;
3930               }
3931         }
3932     }
3933
3934   if (gfc_add_explicit_interface (progname, IFSRC_DECL, head, NULL)
3935       == FAILURE)
3936     {
3937       m = MATCH_ERROR;
3938       goto cleanup;
3939     }
3940
3941   return MATCH_YES;
3942
3943 cleanup:
3944   gfc_free_formal_arglist (head);
3945   return m;
3946 }
3947
3948
3949 /* Match a RESULT specification following a function declaration or
3950    ENTRY statement.  Also matches the end-of-statement.  */
3951
3952 static match
3953 match_result (gfc_symbol *function, gfc_symbol **result)
3954 {
3955   char name[GFC_MAX_SYMBOL_LEN + 1];
3956   gfc_symbol *r;
3957   match m;
3958
3959   if (gfc_match (" result (") != MATCH_YES)
3960     return MATCH_NO;
3961
3962   m = gfc_match_name (name);
3963   if (m != MATCH_YES)
3964     return m;
3965
3966   /* Get the right paren, and that's it because there could be the
3967      bind(c) attribute after the result clause.  */
3968   if (gfc_match_char(')') != MATCH_YES)
3969     {
3970      /* TODO: should report the missing right paren here.  */
3971       return MATCH_ERROR;
3972     }
3973
3974   if (strcmp (function->name, name) == 0)
3975     {
3976       gfc_error ("RESULT variable at %C must be different than function name");
3977       return MATCH_ERROR;
3978     }
3979
3980   if (gfc_get_symbol (name, NULL, &r))
3981     return MATCH_ERROR;
3982
3983   if (gfc_add_flavor (&r->attr, FL_VARIABLE, r->name, NULL) == FAILURE
3984       || gfc_add_result (&r->attr, r->name, NULL) == FAILURE)
3985     return MATCH_ERROR;
3986
3987   *result = r;
3988
3989   return MATCH_YES;
3990 }
3991
3992
3993 /* Match a function suffix, which could be a combination of a result
3994    clause and BIND(C), either one, or neither.  The draft does not
3995    require them to come in a specific order.  */
3996
3997 match
3998 gfc_match_suffix (gfc_symbol *sym, gfc_symbol **result)
3999 {
4000   match is_bind_c;   /* Found bind(c).  */
4001   match is_result;   /* Found result clause.  */
4002   match found_match; /* Status of whether we've found a good match.  */
4003   char peek_char;    /* Character we're going to peek at.  */
4004   bool allow_binding_name;
4005
4006   /* Initialize to having found nothing.  */
4007   found_match = MATCH_NO;
4008   is_bind_c = MATCH_NO; 
4009   is_result = MATCH_NO;
4010
4011   /* Get the next char to narrow between result and bind(c).  */
4012   gfc_gobble_whitespace ();
4013   peek_char = gfc_peek_ascii_char ();
4014
4015   /* C binding names are not allowed for internal procedures.  */
4016   if (gfc_current_state () == COMP_CONTAINS
4017       && sym->ns->proc_name->attr.flavor != FL_MODULE)
4018     allow_binding_name = false;
4019   else
4020     allow_binding_name = true;
4021
4022   switch (peek_char)
4023     {
4024     case 'r':
4025       /* Look for result clause.  */
4026       is_result = match_result (sym, result);
4027       if (is_result == MATCH_YES)
4028         {
4029           /* Now see if there is a bind(c) after it.  */
4030           is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
4031           /* We've found the result clause and possibly bind(c).  */
4032           found_match = MATCH_YES;
4033         }
4034       else
4035         /* This should only be MATCH_ERROR.  */
4036         found_match = is_result; 
4037       break;
4038     case 'b':
4039       /* Look for bind(c) first.  */
4040       is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
4041       if (is_bind_c == MATCH_YES)
4042         {
4043           /* Now see if a result clause followed it.  */
4044           is_result = match_result (sym, result);
4045           found_match = MATCH_YES;
4046         }
4047       else
4048         {
4049           /* Should only be a MATCH_ERROR if we get here after seeing 'b'.  */
4050           found_match = MATCH_ERROR;
4051         }
4052       break;
4053     default:
4054       gfc_error ("Unexpected junk after function declaration at %C");
4055       found_match = MATCH_ERROR;
4056       break;
4057     }
4058
4059   if (is_bind_c == MATCH_YES)
4060     {
4061       /* Fortran 2008 draft allows BIND(C) for internal procedures.  */
4062       if (gfc_current_state () == COMP_CONTAINS
4063           && sym->ns->proc_name->attr.flavor != FL_MODULE
4064           && gfc_notify_std (GFC_STD_F2008, "Fortran 2008: BIND(C) attribute "
4065                              "at %L may not be specified for an internal "
4066                              "procedure", &gfc_current_locus)
4067              == FAILURE)
4068         return MATCH_ERROR;
4069
4070       if (gfc_add_is_bind_c (&(sym->attr), sym->name, &gfc_current_locus, 1)
4071           == FAILURE)
4072         return MATCH_ERROR;
4073     }
4074   
4075   return found_match;
4076 }
4077
4078
4079 /* Match a PROCEDURE declaration (R1211).  */
4080
4081 static match
4082 match_procedure_decl (void)
4083 {
4084   match m;
4085   locus old_loc, entry_loc;
4086   gfc_symbol *sym, *proc_if = NULL;
4087   int num;
4088   gfc_expr *initializer = NULL;
4089
4090   old_loc = entry_loc = gfc_current_locus;
4091
4092   gfc_clear_ts (&current_ts);
4093
4094   if (gfc_match (" (") != MATCH_YES)
4095     {
4096       gfc_current_locus = entry_loc;
4097       return MATCH_NO;
4098     }
4099
4100   /* Get the type spec. for the procedure interface.  */
4101   old_loc = gfc_current_locus;
4102   m = gfc_match_type_spec (&current_ts, 0);
4103   if (m == MATCH_YES || (m == MATCH_NO && gfc_peek_ascii_char () == ')'))
4104     goto got_ts;
4105
4106   if (m == MATCH_ERROR)
4107     return m;
4108
4109   gfc_current_locus = old_loc;
4110
4111   /* Get the name of the procedure or abstract interface
4112   to inherit the interface from.  */
4113   m = gfc_match_symbol (&proc_if, 1);
4114
4115   if (m == MATCH_NO)
4116     goto syntax;
4117   else if (m == MATCH_ERROR)
4118     return m;
4119
4120   /* Various interface checks.  */
4121   if (proc_if)
4122     {
4123       /* Resolve interface if possible. That way, attr.procedure is only set
4124          if it is declared by a later procedure-declaration-stmt, which is
4125          invalid per C1212.  */
4126       while (proc_if->ts.interface)
4127         proc_if = proc_if->ts.interface;
4128
4129       if (proc_if->generic)
4130         {
4131           gfc_error ("Interface '%s' at %C may not be generic", proc_if->name);
4132           return MATCH_ERROR;
4133         }
4134       if (proc_if->attr.proc == PROC_ST_FUNCTION)
4135         {
4136           gfc_error ("Interface '%s' at %C may not be a statement function",
4137                     proc_if->name);
4138           return MATCH_ERROR;
4139         }
4140       /* Handle intrinsic procedures.  */
4141       if (!(proc_if->attr.external || proc_if->attr.use_assoc
4142             || proc_if->attr.if_source == IFSRC_IFBODY)
4143           && (gfc_is_intrinsic (proc_if, 0, gfc_current_locus)
4144               || gfc_is_intrinsic (proc_if, 1, gfc_current_locus)))
4145         proc_if->attr.intrinsic = 1;
4146       if (proc_if->attr.intrinsic
4147           && !gfc_intrinsic_actual_ok (proc_if->name, 0))
4148         {
4149           gfc_error ("Intrinsic procedure '%s' not allowed "
4150                     "in PROCEDURE statement at %C", proc_if->name);
4151           return MATCH_ERROR;
4152         }
4153     }
4154
4155 got_ts:
4156   if (gfc_match (" )") != MATCH_YES)
4157     {
4158       gfc_current_locus = entry_loc;
4159       return MATCH_NO;
4160     }
4161
4162   /* Parse attributes.  */
4163   m = match_attr_spec();
4164   if (m == MATCH_ERROR)
4165     return MATCH_ERROR;
4166
4167   /* Get procedure symbols.  */
4168   for(num=1;;num++)
4169     {
4170       m = gfc_match_symbol (&sym, 0);
4171       if (m == MATCH_NO)
4172         goto syntax;
4173       else if (m == MATCH_ERROR)
4174         return m;
4175
4176       /* Add current_attr to the symbol attributes.  */
4177       if (gfc_copy_attr (&sym->attr, &current_attr, NULL) == FAILURE)
4178         return MATCH_ERROR;
4179
4180       if (sym->attr.is_bind_c)
4181         {
4182           /* Check for C1218.  */
4183           if (!proc_if || !proc_if->attr.is_bind_c)
4184             {
4185               gfc_error ("BIND(C) attribute at %C requires "
4186                         "an interface with BIND(C)");
4187               return MATCH_ERROR;
4188             }
4189           /* Check for C1217.  */
4190           if (has_name_equals && sym->attr.pointer)
4191             {
4192               gfc_error ("BIND(C) procedure with NAME may not have "
4193                         "POINTER attribute at %C");
4194               return MATCH_ERROR;
4195             }
4196           if (has_name_equals && sym->attr.dummy)
4197             {
4198               gfc_error ("Dummy procedure at %C may not have "
4199                         "BIND(C) attribute with NAME");
4200               return MATCH_ERROR;
4201             }
4202           /* Set binding label for BIND(C).  */
4203           if (set_binding_label (sym->binding_label, sym->name, num) != SUCCESS)
4204             return MATCH_ERROR;
4205         }
4206
4207       if (gfc_add_external (&sym->attr, NULL) == FAILURE)
4208         return MATCH_ERROR;
4209       if (gfc_add_proc (&sym->attr, sym->name, NULL) == FAILURE)
4210         return MATCH_ERROR;
4211
4212       /* Set interface.  */
4213       if (proc_if != NULL)
4214         {
4215           sym->ts.interface = proc_if;
4216           sym->attr.untyped = 1;
4217         }
4218       else if (current_ts.type != BT_UNKNOWN)
4219         {
4220           sym->ts = current_ts;
4221           sym->ts.interface = gfc_new_symbol ("", gfc_current_ns);
4222           sym->ts.interface->ts = current_ts;
4223           sym->ts.interface->attr.function = 1;
4224           sym->attr.function = sym->ts.interface->attr.function;
4225         }
4226
4227       if (gfc_match (" =>") == MATCH_YES)
4228         {
4229           if (!current_attr.pointer)
4230             {
4231               gfc_error ("Initialization at %C isn't for a pointer variable");
4232               m = MATCH_ERROR;
4233               goto cleanup;
4234             }
4235
4236           m = gfc_match_null (&initializer);
4237           if (m == MATCH_NO)
4238             {
4239               gfc_error ("Pointer initialization requires a NULL() at %C");
4240               m = MATCH_ERROR;
4241             }
4242
4243           if (gfc_pure (NULL))
4244             {
4245               gfc_error ("Initialization of pointer at %C is not allowed in "
4246                          "a PURE procedure");
4247               m = MATCH_ERROR;
4248             }
4249
4250           if (m != MATCH_YES)
4251             goto cleanup;
4252
4253           if (add_init_expr_to_sym (sym->name, &initializer, &gfc_current_locus)
4254               != SUCCESS)
4255             goto cleanup;
4256
4257         }
4258
4259       gfc_set_sym_referenced (sym);
4260
4261       if (gfc_match_eos () == MATCH_YES)
4262         return MATCH_YES;
4263       if (gfc_match_char (',') != MATCH_YES)
4264         goto syntax;
4265     }
4266
4267 syntax:
4268   gfc_error ("Syntax error in PROCEDURE statement at %C");
4269   return MATCH_ERROR;
4270
4271 cleanup:
4272   /* Free stuff up and return.  */
4273   gfc_free_expr (initializer);
4274   return m;
4275 }
4276
4277
4278 /* Match a PROCEDURE declaration inside an interface (R1206).  */
4279
4280 static match
4281 match_procedure_in_interface (void)
4282 {
4283   match m;
4284   gfc_symbol *sym;
4285   char name[GFC_MAX_SYMBOL_LEN + 1];
4286
4287   if (current_interface.type == INTERFACE_NAMELESS
4288       || current_interface.type == INTERFACE_ABSTRACT)
4289     {
4290       gfc_error ("PROCEDURE at %C must be in a generic interface");
4291       return MATCH_ERROR;
4292     }
4293
4294   for(;;)
4295     {
4296       m = gfc_match_name (name);
4297       if (m == MATCH_NO)
4298         goto syntax;
4299       else if (m == MATCH_ERROR)
4300         return m;
4301       if (gfc_get_symbol (name, gfc_current_ns->parent, &sym))
4302         return MATCH_ERROR;
4303
4304       if (gfc_add_interface (sym) == FAILURE)
4305         return MATCH_ERROR;
4306
4307       if (gfc_match_eos () == MATCH_YES)
4308         break;
4309       if (gfc_match_char (',') != MATCH_YES)
4310         goto syntax;
4311     }
4312
4313   return MATCH_YES;
4314
4315 syntax:
4316   gfc_error ("Syntax error in PROCEDURE statement at %C");
4317   return MATCH_ERROR;
4318 }
4319
4320
4321 /* General matcher for PROCEDURE declarations.  */
4322
4323 match
4324 gfc_match_procedure (void)
4325 {
4326   match m;
4327
4328   switch (gfc_current_state ())
4329     {
4330     case COMP_NONE:
4331     case COMP_PROGRAM:
4332     case COMP_MODULE:
4333     case COMP_SUBROUTINE:
4334     case COMP_FUNCTION:
4335       m = match_procedure_decl ();
4336       break;
4337     case COMP_INTERFACE:
4338       m = match_procedure_in_interface ();
4339       break;
4340     case COMP_DERIVED:
4341       gfc_error ("Fortran 2003: Procedure components at %C are "
4342                 "not yet implemented in gfortran");
4343       return MATCH_ERROR;
4344     default:
4345       return MATCH_NO;
4346     }
4347
4348   if (m != MATCH_YES)
4349     return m;
4350
4351   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PROCEDURE statement at %C")
4352       == FAILURE)
4353     return MATCH_ERROR;
4354
4355   return m;
4356 }
4357
4358
4359 /* Warn if a matched procedure has the same name as an intrinsic; this is
4360    simply a wrapper around gfc_warn_intrinsic_shadow that interprets the current
4361    parser-state-stack to find out whether we're in a module.  */
4362
4363 static void
4364 warn_intrinsic_shadow (const gfc_symbol* sym, bool func)
4365 {
4366   bool in_module;
4367
4368   in_module = (gfc_state_stack->previous
4369                && gfc_state_stack->previous->state == COMP_MODULE);
4370
4371   gfc_warn_intrinsic_shadow (sym, in_module, func);
4372 }
4373
4374
4375 /* Match a function declaration.  */
4376
4377 match
4378 gfc_match_function_decl (void)
4379 {
4380   char name[GFC_MAX_SYMBOL_LEN + 1];
4381   gfc_symbol *sym, *result;
4382   locus old_loc;
4383   match m;
4384   match suffix_match;
4385   match found_match; /* Status returned by match func.  */  
4386
4387   if (gfc_current_state () != COMP_NONE
4388       && gfc_current_state () != COMP_INTERFACE
4389       && gfc_current_state () != COMP_CONTAINS)
4390     return MATCH_NO;
4391
4392   gfc_clear_ts (&current_ts);
4393
4394   old_loc = gfc_current_locus;
4395
4396   m = gfc_match_prefix (&current_ts);
4397   if (m != MATCH_YES)
4398     {
4399       gfc_current_locus = old_loc;
4400       return m;
4401     }
4402
4403   if (gfc_match ("function% %n", name) != MATCH_YES)
4404     {
4405       gfc_current_locus = old_loc;
4406       return MATCH_NO;
4407     }
4408   if (get_proc_name (name, &sym, false))
4409     return MATCH_ERROR;
4410   gfc_new_block = sym;
4411
4412   m = gfc_match_formal_arglist (sym, 0, 0);
4413   if (m == MATCH_NO)
4414     {
4415       gfc_error ("Expected formal argument list in function "
4416                  "definition at %C");
4417       m = MATCH_ERROR;
4418       goto cleanup;
4419     }
4420   else if (m == MATCH_ERROR)
4421     goto cleanup;
4422
4423   result = NULL;
4424
4425   /* According to the draft, the bind(c) and result clause can
4426      come in either order after the formal_arg_list (i.e., either
4427      can be first, both can exist together or by themselves or neither
4428      one).  Therefore, the match_result can't match the end of the
4429      string, and check for the bind(c) or result clause in either order.  */
4430   found_match = gfc_match_eos ();
4431
4432   /* Make sure that it isn't already declared as BIND(C).  If it is, it
4433      must have been marked BIND(C) with a BIND(C) attribute and that is
4434      not allowed for procedures.  */
4435   if (sym->attr.is_bind_c == 1)
4436     {
4437       sym->attr.is_bind_c = 0;
4438       if (sym->old_symbol != NULL)
4439         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4440                        "variables or common blocks",
4441                        &(sym->old_symbol->declared_at));
4442       else
4443         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4444                        "variables or common blocks", &gfc_current_locus);
4445     }
4446
4447   if (found_match != MATCH_YES)
4448     {
4449       /* If we haven't found the end-of-statement, look for a suffix.  */
4450       suffix_match = gfc_match_suffix (sym, &result);
4451       if (suffix_match == MATCH_YES)
4452         /* Need to get the eos now.  */
4453         found_match = gfc_match_eos ();
4454       else
4455         found_match = suffix_match;
4456     }
4457
4458   if(found_match != MATCH_YES)
4459     m = MATCH_ERROR;
4460   else
4461     {
4462       /* Make changes to the symbol.  */
4463       m = MATCH_ERROR;
4464       
4465       if (gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
4466         goto cleanup;
4467       
4468       if (gfc_missing_attr (&sym->attr, NULL) == FAILURE
4469           || copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
4470         goto cleanup;
4471
4472       if (current_ts.type != BT_UNKNOWN && sym->ts.type != BT_UNKNOWN
4473           && !sym->attr.implicit_type)
4474         {
4475           gfc_error ("Function '%s' at %C already has a type of %s", name,
4476                      gfc_basic_typename (sym->ts.type));
4477           goto cleanup;
4478         }
4479
4480       /* Delay matching the function characteristics until after the
4481          specification block by signalling kind=-1.  */
4482       sym->declared_at = old_loc;
4483       if (current_ts.type != BT_UNKNOWN)
4484         current_ts.kind = -1;
4485       else
4486         current_ts.kind = 0;
4487
4488       if (result == NULL)
4489         {
4490           sym->ts = current_ts;
4491           sym->result = sym;
4492         }
4493       else
4494         {
4495           result->ts = current_ts;
4496           sym->result = result;
4497         }
4498
4499       /* Warn if this procedure has the same name as an intrinsic.  */
4500       warn_intrinsic_shadow (sym, true);
4501
4502       return MATCH_YES;
4503     }
4504
4505 cleanup:
4506   gfc_current_locus = old_loc;
4507   return m;
4508 }
4509
4510
4511 /* This is mostly a copy of parse.c(add_global_procedure) but modified to
4512    pass the name of the entry, rather than the gfc_current_block name, and
4513    to return false upon finding an existing global entry.  */
4514
4515 static bool
4516 add_global_entry (const char *name, int sub)
4517 {
4518   gfc_gsymbol *s;
4519   unsigned int type;
4520
4521   s = gfc_get_gsymbol(name);
4522   type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
4523
4524   if (s->defined
4525       || (s->type != GSYM_UNKNOWN
4526           && s->type != type))
4527     gfc_global_used(s, NULL);
4528   else
4529     {
4530       s->type = type;
4531       s->where = gfc_current_locus;
4532       s->defined = 1;
4533       return true;
4534     }
4535   return false;
4536 }
4537
4538
4539 /* Match an ENTRY statement.  */
4540
4541 match
4542 gfc_match_entry (void)
4543 {
4544   gfc_symbol *proc;
4545   gfc_symbol *result;
4546   gfc_symbol *entry;
4547   char name[GFC_MAX_SYMBOL_LEN + 1];
4548   gfc_compile_state state;
4549   match m;
4550   gfc_entry_list *el;
4551   locus old_loc;
4552   bool module_procedure;
4553   char peek_char;
4554   match is_bind_c;
4555
4556   m = gfc_match_name (name);
4557   if (m != MATCH_YES)
4558     return m;
4559
4560   state = gfc_current_state ();
4561   if (state != COMP_SUBROUTINE && state != COMP_FUNCTION)
4562     {
4563       switch (state)
4564         {
4565           case COMP_PROGRAM:
4566             gfc_error ("ENTRY statement at %C cannot appear within a PROGRAM");
4567             break;
4568           case COMP_MODULE:
4569             gfc_error ("ENTRY statement at %C cannot appear within a MODULE");
4570             break;
4571           case COMP_BLOCK_DATA:
4572             gfc_error ("ENTRY statement at %C cannot appear within "
4573                        "a BLOCK DATA");
4574             break;
4575           case COMP_INTERFACE:
4576             gfc_error ("ENTRY statement at %C cannot appear within "
4577                        "an INTERFACE");
4578             break;
4579           case COMP_DERIVED:
4580             gfc_error ("ENTRY statement at %C cannot appear within "
4581                        "a DERIVED TYPE block");
4582             break;
4583           case COMP_IF:
4584             gfc_error ("ENTRY statement at %C cannot appear within "
4585                        "an IF-THEN block");
4586             break;
4587           case COMP_DO:
4588             gfc_error ("ENTRY statement at %C cannot appear within "
4589                        "a DO block");
4590             break;
4591           case COMP_SELECT:
4592             gfc_error ("ENTRY statement at %C cannot appear within "
4593                        "a SELECT block");
4594             break;
4595           case COMP_FORALL:
4596             gfc_error ("ENTRY statement at %C cannot appear within "
4597                        "a FORALL block");
4598             break;
4599           case COMP_WHERE:
4600             gfc_error ("ENTRY statement at %C cannot appear within "
4601                        "a WHERE block");
4602             break;
4603           case COMP_CONTAINS:
4604             gfc_error ("ENTRY statement at %C cannot appear within "
4605                        "a contained subprogram");
4606             break;
4607           default:
4608             gfc_internal_error ("gfc_match_entry(): Bad state");
4609         }
4610       return MATCH_ERROR;
4611     }
4612
4613   module_procedure = gfc_current_ns->parent != NULL
4614                    && gfc_current_ns->parent->proc_name
4615                    && gfc_current_ns->parent->proc_name->attr.flavor
4616                       == FL_MODULE;
4617
4618   if (gfc_current_ns->parent != NULL
4619       && gfc_current_ns->parent->proc_name
4620       && !module_procedure)
4621     {
4622       gfc_error("ENTRY statement at %C cannot appear in a "
4623                 "contained procedure");
4624       return MATCH_ERROR;
4625     }
4626
4627   /* Module function entries need special care in get_proc_name
4628      because previous references within the function will have
4629      created symbols attached to the current namespace.  */
4630   if (get_proc_name (name, &entry,
4631                      gfc_current_ns->parent != NULL
4632                      && module_procedure
4633                      && gfc_current_ns->proc_name->attr.function))
4634     return MATCH_ERROR;
4635
4636   proc = gfc_current_block ();
4637
4638   /* Make sure that it isn't already declared as BIND(C).  If it is, it
4639      must have been marked BIND(C) with a BIND(C) attribute and that is
4640      not allowed for procedures.  */
4641   if (entry->attr.is_bind_c == 1)
4642     {
4643       entry->attr.is_bind_c = 0;
4644       if (entry->old_symbol != NULL)
4645         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4646                        "variables or common blocks",
4647                        &(entry->old_symbol->declared_at));
4648       else
4649         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4650                        "variables or common blocks", &gfc_current_locus);
4651     }
4652   
4653   /* Check what next non-whitespace character is so we can tell if there
4654      is the required parens if we have a BIND(C).  */
4655   gfc_gobble_whitespace ();
4656   peek_char = gfc_peek_ascii_char ();
4657
4658   if (state == COMP_SUBROUTINE)
4659     {
4660       /* An entry in a subroutine.  */
4661       if (!gfc_current_ns->parent && !add_global_entry (name, 1))
4662         return MATCH_ERROR;
4663
4664       m = gfc_match_formal_arglist (entry, 0, 1);
4665       if (m != MATCH_YES)
4666         return MATCH_ERROR;
4667
4668       /* Call gfc_match_bind_c with allow_binding_name = true as ENTRY can
4669          never be an internal procedure.  */
4670       is_bind_c = gfc_match_bind_c (entry, true);
4671       if (is_bind_c == MATCH_ERROR)
4672         return MATCH_ERROR;
4673       if (is_bind_c == MATCH_YES)
4674         {
4675           if (peek_char != '(')
4676             {
4677               gfc_error ("Missing required parentheses before BIND(C) at %C");
4678               return MATCH_ERROR;
4679             }
4680             if (gfc_add_is_bind_c (&(entry->attr), entry->name, &(entry->declared_at), 1)
4681                 == FAILURE)
4682               return MATCH_ERROR;
4683         }
4684
4685       if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
4686           || gfc_add_subroutine (&entry->attr, entry->name, NULL) == FAILURE)
4687         return MATCH_ERROR;
4688     }
4689   else
4690     {
4691       /* An entry in a function.
4692          We need to take special care because writing
4693             ENTRY f()
4694          as
4695             ENTRY f
4696          is allowed, whereas
4697             ENTRY f() RESULT (r)
4698          can't be written as
4699             ENTRY f RESULT (r).  */
4700       if (!gfc_current_ns->parent && !add_global_entry (name, 0))
4701         return MATCH_ERROR;
4702
4703       old_loc = gfc_current_locus;
4704       if (gfc_match_eos () == MATCH_YES)
4705         {
4706           gfc_current_locus = old_loc;
4707           /* Match the empty argument list, and add the interface to
4708              the symbol.  */
4709           m = gfc_match_formal_arglist (entry, 0, 1);
4710         }
4711       else
4712         m = gfc_match_formal_arglist (entry, 0, 0);
4713
4714       if (m != MATCH_YES)
4715         return MATCH_ERROR;
4716
4717       result = NULL;
4718
4719       if (gfc_match_eos () == MATCH_YES)
4720         {
4721           if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
4722               || gfc_add_function (&entry->attr, entry->name, NULL) == FAILURE)
4723             return MATCH_ERROR;
4724
4725           entry->result = entry;
4726         }
4727       else
4728         {
4729           m = gfc_match_suffix (entry, &result);
4730           if (m == MATCH_NO)
4731             gfc_syntax_error (ST_ENTRY);
4732           if (m != MATCH_YES)
4733             return MATCH_ERROR;
4734
4735           if (result)
4736             {
4737               if (gfc_add_result (&result->attr, result->name, NULL) == FAILURE
4738                   || gfc_add_entry (&entry->attr, result->name, NULL) == FAILURE
4739                   || gfc_add_function (&entry->attr, result->name, NULL)
4740                   == FAILURE)
4741                 return MATCH_ERROR;
4742               entry->result = result;
4743             }
4744           else
4745             {
4746               if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
4747                   || gfc_add_function (&entry->attr, entry->name, NULL) == FAILURE)
4748                 return MATCH_ERROR;
4749               entry->result = entry;
4750             }
4751         }
4752     }
4753
4754   if (gfc_match_eos () != MATCH_YES)
4755     {
4756       gfc_syntax_error (ST_ENTRY);
4757       return MATCH_ERROR;
4758     }
4759
4760   entry->attr.recursive = proc->attr.recursive;
4761   entry->attr.elemental = proc->attr.elemental;
4762   entry->attr.pure = proc->attr.pure;
4763
4764   el = gfc_get_entry_list ();
4765   el->sym = entry;
4766   el->next = gfc_current_ns->entries;
4767   gfc_current_ns->entries = el;
4768   if (el->next)
4769     el->id = el->next->id + 1;
4770   else
4771     el->id = 1;
4772
4773   new_st.op = EXEC_ENTRY;
4774   new_st.ext.entry = el;
4775
4776   return MATCH_YES;
4777 }
4778
4779
4780 /* Match a subroutine statement, including optional prefixes.  */
4781
4782 match
4783 gfc_match_subroutine (void)
4784 {
4785   char name[GFC_MAX_SYMBOL_LEN + 1];
4786   gfc_symbol *sym;
4787   match m;
4788   match is_bind_c;
4789   char peek_char;
4790   bool allow_binding_name;
4791
4792   if (gfc_current_state () != COMP_NONE
4793       && gfc_current_state () != COMP_INTERFACE
4794       && gfc_current_state () != COMP_CONTAINS)
4795     return MATCH_NO;
4796
4797   m = gfc_match_prefix (NULL);
4798   if (m != MATCH_YES)
4799     return m;
4800
4801   m = gfc_match ("subroutine% %n", name);
4802   if (m != MATCH_YES)
4803     return m;
4804
4805   if (get_proc_name (name, &sym, false))
4806     return MATCH_ERROR;
4807   gfc_new_block = sym;
4808
4809   /* Check what next non-whitespace character is so we can tell if there
4810      is the required parens if we have a BIND(C).  */
4811   gfc_gobble_whitespace ();
4812   peek_char = gfc_peek_ascii_char ();
4813   
4814   if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
4815     return MATCH_ERROR;
4816
4817   if (gfc_match_formal_arglist (sym, 0, 1) != MATCH_YES)
4818     return MATCH_ERROR;
4819
4820   /* Make sure that it isn't already declared as BIND(C).  If it is, it
4821      must have been marked BIND(C) with a BIND(C) attribute and that is
4822      not allowed for procedures.  */
4823   if (sym->attr.is_bind_c == 1)
4824     {
4825       sym->attr.is_bind_c = 0;
4826       if (sym->old_symbol != NULL)
4827         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4828                        "variables or common blocks",
4829                        &(sym->old_symbol->declared_at));
4830       else
4831         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4832                        "variables or common blocks", &gfc_current_locus);
4833     }
4834
4835   /* C binding names are not allowed for internal procedures.  */
4836   if (gfc_current_state () == COMP_CONTAINS
4837       && sym->ns->proc_name->attr.flavor != FL_MODULE)
4838     allow_binding_name = false;
4839   else
4840     allow_binding_name = true;
4841
4842   /* Here, we are just checking if it has the bind(c) attribute, and if
4843      so, then we need to make sure it's all correct.  If it doesn't,
4844      we still need to continue matching the rest of the subroutine line.  */
4845   is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
4846   if (is_bind_c == MATCH_ERROR)
4847     {
4848       /* There was an attempt at the bind(c), but it was wrong.  An
4849          error message should have been printed w/in the gfc_match_bind_c
4850          so here we'll just return the MATCH_ERROR.  */
4851       return MATCH_ERROR;
4852     }
4853
4854   if (is_bind_c == MATCH_YES)
4855     {
4856       /* The following is allowed in the Fortran 2008 draft.  */
4857       if (gfc_current_state () == COMP_CONTAINS
4858           && sym->ns->proc_name->attr.flavor != FL_MODULE
4859           && gfc_notify_std (GFC_STD_F2008, "Fortran 2008: BIND(C) attribute "
4860                              "at %L may not be specified for an internal "
4861                              "procedure", &gfc_current_locus)
4862              == FAILURE)
4863         return MATCH_ERROR;
4864
4865       if (peek_char != '(')
4866         {
4867           gfc_error ("Missing required parentheses before BIND(C) at %C");
4868           return MATCH_ERROR;
4869         }
4870       if (gfc_add_is_bind_c (&(sym->attr), sym->name, &(sym->declared_at), 1)
4871           == FAILURE)
4872         return MATCH_ERROR;
4873     }
4874   
4875   if (gfc_match_eos () != MATCH_YES)
4876     {
4877       gfc_syntax_error (ST_SUBROUTINE);
4878       return MATCH_ERROR;
4879     }
4880
4881   if (copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
4882     return MATCH_ERROR;
4883
4884   /* Warn if it has the same name as an intrinsic.  */
4885   warn_intrinsic_shadow (sym, false);
4886
4887   return MATCH_YES;
4888 }
4889
4890
4891 /* Match a BIND(C) specifier, with the optional 'name=' specifier if
4892    given, and set the binding label in either the given symbol (if not
4893    NULL), or in the current_ts.  The symbol may be NULL because we may
4894    encounter the BIND(C) before the declaration itself.  Return
4895    MATCH_NO if what we're looking at isn't a BIND(C) specifier,
4896    MATCH_ERROR if it is a BIND(C) clause but an error was encountered,
4897    or MATCH_YES if the specifier was correct and the binding label and
4898    bind(c) fields were set correctly for the given symbol or the
4899    current_ts. If allow_binding_name is false, no binding name may be
4900    given.  */
4901
4902 match
4903 gfc_match_bind_c (gfc_symbol *sym, bool allow_binding_name)
4904 {
4905   /* binding label, if exists */   
4906   char binding_label[GFC_MAX_SYMBOL_LEN + 1];
4907   match double_quote;
4908   match single_quote;
4909
4910   /* Initialize the flag that specifies whether we encountered a NAME= 
4911      specifier or not.  */
4912   has_name_equals = 0;
4913
4914   /* Init the first char to nil so we can catch if we don't have
4915      the label (name attr) or the symbol name yet.  */
4916   binding_label[0] = '\0';
4917    
4918   /* This much we have to be able to match, in this order, if
4919      there is a bind(c) label.  */
4920   if (gfc_match (" bind ( c ") != MATCH_YES)
4921     return MATCH_NO;
4922
4923   /* Now see if there is a binding label, or if we've reached the
4924      end of the bind(c) attribute without one.  */
4925   if (gfc_match_char (',') == MATCH_YES)
4926     {
4927       if (gfc_match (" name = ") != MATCH_YES)
4928         {
4929           gfc_error ("Syntax error in NAME= specifier for binding label "
4930                      "at %C");
4931           /* should give an error message here */
4932           return MATCH_ERROR;
4933         }
4934
4935       has_name_equals = 1;
4936
4937       /* Get the opening quote.  */
4938       double_quote = MATCH_YES;
4939       single_quote = MATCH_YES;
4940       double_quote = gfc_match_char ('"');
4941       if (double_quote != MATCH_YES)
4942         single_quote = gfc_match_char ('\'');
4943       if (double_quote != MATCH_YES && single_quote != MATCH_YES)
4944         {
4945           gfc_error ("Syntax error in NAME= specifier for binding label "
4946                      "at %C");
4947           return MATCH_ERROR;
4948         }
4949       
4950       /* Grab the binding label, using functions that will not lower
4951          case the names automatically.  */
4952       if (gfc_match_name_C (binding_label) != MATCH_YES)
4953          return MATCH_ERROR;
4954       
4955       /* Get the closing quotation.  */
4956       if (double_quote == MATCH_YES)
4957         {
4958           if (gfc_match_char ('"') != MATCH_YES)
4959             {
4960               gfc_error ("Missing closing quote '\"' for binding label at %C");
4961               /* User started string with '"' so looked to match it.  */
4962               return MATCH_ERROR;
4963             }
4964         }
4965       else
4966         {
4967           if (gfc_match_char ('\'') != MATCH_YES)
4968             {
4969               gfc_error ("Missing closing quote '\'' for binding label at %C");
4970               /* User started string with "'" char.  */
4971               return MATCH_ERROR;
4972             }
4973         }
4974    }
4975
4976   /* Get the required right paren.  */
4977   if (gfc_match_char (')') != MATCH_YES)
4978     {
4979       gfc_error ("Missing closing paren for binding label at %C");
4980       return MATCH_ERROR;
4981     }
4982
4983   if (has_name_equals && !allow_binding_name)
4984     {
4985       gfc_error ("No binding name is allowed in BIND(C) at %C");
4986       return MATCH_ERROR;
4987     }
4988
4989   if (has_name_equals && sym != NULL && sym->attr.dummy)
4990     {
4991       gfc_error ("For dummy procedure %s, no binding name is "
4992                  "allowed in BIND(C) at %C", sym->name);
4993       return MATCH_ERROR;
4994     }
4995
4996
4997   /* Save the binding label to the symbol.  If sym is null, we're
4998      probably matching the typespec attributes of a declaration and
4999      haven't gotten the name yet, and therefore, no symbol yet.  */
5000   if (binding_label[0] != '\0')
5001     {
5002       if (sym != NULL)
5003       {
5004         strcpy (sym->binding_label, binding_label);
5005       }
5006       else
5007         strcpy (curr_binding_label, binding_label);
5008     }
5009   else if (allow_binding_name)
5010     {
5011       /* No binding label, but if symbol isn't null, we
5012          can set the label for it here.
5013          If name="" or allow_binding_name is false, no C binding name is
5014          created. */
5015       if (sym != NULL && sym->name != NULL && has_name_equals == 0)
5016         strncpy (sym->binding_label, sym->name, strlen (sym->name) + 1);
5017     }
5018
5019   if (has_name_equals && gfc_current_state () == COMP_INTERFACE
5020       && current_interface.type == INTERFACE_ABSTRACT)
5021     {
5022       gfc_error ("NAME not allowed on BIND(C) for ABSTRACT INTERFACE at %C");
5023       return MATCH_ERROR;
5024     }
5025
5026   return MATCH_YES;
5027 }
5028
5029
5030 /* Return nonzero if we're currently compiling a contained procedure.  */
5031
5032 static int
5033 contained_procedure (void)
5034 {
5035   gfc_state_data *s = gfc_state_stack;
5036
5037   if ((s->state == COMP_SUBROUTINE || s->state == COMP_FUNCTION)
5038       && s->previous != NULL && s->previous->state == COMP_CONTAINS)
5039     return 1;
5040
5041   return 0;
5042 }
5043
5044 /* Set the kind of each enumerator.  The kind is selected such that it is
5045    interoperable with the corresponding C enumeration type, making
5046    sure that -fshort-enums is honored.  */
5047
5048 static void
5049 set_enum_kind(void)
5050 {
5051   enumerator_history *current_history = NULL;
5052   int kind;
5053   int i;
5054
5055   if (max_enum == NULL || enum_history == NULL)
5056     return;
5057
5058   if (!gfc_option.fshort_enums)
5059     return;
5060
5061   i = 0;
5062   do
5063     {
5064       kind = gfc_integer_kinds[i++].kind;
5065     }
5066   while (kind < gfc_c_int_kind
5067          && gfc_check_integer_range (max_enum->initializer->value.integer,
5068                                      kind) != ARITH_OK);
5069
5070   current_history = enum_history;
5071   while (current_history != NULL)
5072     {
5073       current_history->sym->ts.kind = kind;
5074       current_history = current_history->next;
5075     }
5076 }
5077
5078
5079 /* Match any of the various end-block statements.  Returns the type of
5080    END to the caller.  The END INTERFACE, END IF, END DO and END
5081    SELECT statements cannot be replaced by a single END statement.  */
5082
5083 match
5084 gfc_match_end (gfc_statement *st)
5085 {
5086   char name[GFC_MAX_SYMBOL_LEN + 1];
5087   gfc_compile_state state;
5088   locus old_loc;
5089   const char *block_name;
5090   const char *target;
5091   int eos_ok;
5092   match m;
5093
5094   old_loc = gfc_current_locus;
5095   if (gfc_match ("end") != MATCH_YES)
5096     return MATCH_NO;
5097
5098   state = gfc_current_state ();
5099   block_name = gfc_current_block () == NULL
5100              ? NULL : gfc_current_block ()->name;
5101
5102   if (state == COMP_CONTAINS)
5103     {
5104       state = gfc_state_stack->previous->state;
5105       block_name = gfc_state_stack->previous->sym == NULL
5106                  ? NULL : gfc_state_stack->previous->sym->name;
5107     }
5108
5109   switch (state)
5110     {
5111     case COMP_NONE:
5112     case COMP_PROGRAM:
5113       *st = ST_END_PROGRAM;
5114       target = " program";
5115       eos_ok = 1;
5116       break;
5117
5118     case COMP_SUBROUTINE:
5119       *st = ST_END_SUBROUTINE;
5120       target = " subroutine";
5121       eos_ok = !contained_procedure ();
5122       break;
5123
5124     case COMP_FUNCTION:
5125       *st = ST_END_FUNCTION;
5126       target = " function";
5127       eos_ok = !contained_procedure ();
5128       break;
5129
5130     case COMP_BLOCK_DATA:
5131       *st = ST_END_BLOCK_DATA;
5132       target = " block data";
5133       eos_ok = 1;
5134       break;
5135
5136     case COMP_MODULE:
5137       *st = ST_END_MODULE;
5138       target = " module";
5139       eos_ok = 1;
5140       break;
5141
5142     case COMP_INTERFACE:
5143       *st = ST_END_INTERFACE;
5144       target = " interface";
5145       eos_ok = 0;
5146       break;
5147
5148     case COMP_DERIVED:
5149       *st = ST_END_TYPE;
5150       target = " type";
5151       eos_ok = 0;
5152       break;
5153
5154     case COMP_IF:
5155       *st = ST_ENDIF;
5156       target = " if";
5157       eos_ok = 0;
5158       break;
5159
5160     case COMP_DO:
5161       *st = ST_ENDDO;
5162       target = " do";
5163       eos_ok = 0;
5164       break;
5165
5166     case COMP_SELECT:
5167       *st = ST_END_SELECT;
5168       target = " select";
5169       eos_ok = 0;
5170       break;
5171
5172     case COMP_FORALL:
5173       *st = ST_END_FORALL;
5174       target = " forall";
5175       eos_ok = 0;
5176       break;
5177
5178     case COMP_WHERE:
5179       *st = ST_END_WHERE;
5180       target = " where";
5181       eos_ok = 0;
5182       break;
5183
5184     case COMP_ENUM:
5185       *st = ST_END_ENUM;
5186       target = " enum";
5187       eos_ok = 0;
5188       last_initializer = NULL;
5189       set_enum_kind ();
5190       gfc_free_enum_history ();
5191       break;
5192
5193     default:
5194       gfc_error ("Unexpected END statement at %C");
5195       goto cleanup;
5196     }
5197
5198   if (gfc_match_eos () == MATCH_YES)
5199     {
5200       if (!eos_ok)
5201         {
5202           /* We would have required END [something].  */
5203           gfc_error ("%s statement expected at %L",
5204                      gfc_ascii_statement (*st), &old_loc);
5205           goto cleanup;
5206         }
5207
5208       return MATCH_YES;
5209     }
5210
5211   /* Verify that we've got the sort of end-block that we're expecting.  */
5212   if (gfc_match (target) != MATCH_YES)
5213     {
5214       gfc_error ("Expecting %s statement at %C", gfc_ascii_statement (*st));
5215       goto cleanup;
5216     }
5217
5218   /* If we're at the end, make sure a block name wasn't required.  */
5219   if (gfc_match_eos () == MATCH_YES)
5220     {
5221
5222       if (*st != ST_ENDDO && *st != ST_ENDIF && *st != ST_END_SELECT
5223           && *st != ST_END_FORALL && *st != ST_END_WHERE)
5224         return MATCH_YES;
5225
5226       if (gfc_current_block () == NULL)
5227         return MATCH_YES;
5228
5229       gfc_error ("Expected block name of '%s' in %s statement at %C",
5230                  block_name, gfc_ascii_statement (*st));
5231
5232       return MATCH_ERROR;
5233     }
5234
5235   /* END INTERFACE has a special handler for its several possible endings.  */
5236   if (*st == ST_END_INTERFACE)
5237     return gfc_match_end_interface ();
5238
5239   /* We haven't hit the end of statement, so what is left must be an
5240      end-name.  */
5241   m = gfc_match_space ();
5242   if (m == MATCH_YES)
5243     m = gfc_match_name (name);
5244
5245   if (m == MATCH_NO)
5246     gfc_error ("Expected terminating name at %C");
5247   if (m != MATCH_YES)
5248     goto cleanup;
5249
5250   if (block_name == NULL)
5251     goto syntax;
5252
5253   if (strcmp (name, block_name) != 0)
5254     {
5255       gfc_error ("Expected label '%s' for %s statement at %C", block_name,
5256                  gfc_ascii_statement (*st));
5257       goto cleanup;
5258     }
5259
5260   if (gfc_match_eos () == MATCH_YES)
5261     return MATCH_YES;
5262
5263 syntax:
5264   gfc_syntax_error (*st);
5265
5266 cleanup:
5267   gfc_current_locus = old_loc;
5268   return MATCH_ERROR;
5269 }
5270
5271
5272
5273 /***************** Attribute declaration statements ****************/
5274
5275 /* Set the attribute of a single variable.  */
5276
5277 static match
5278 attr_decl1 (void)
5279 {
5280   char name[GFC_MAX_SYMBOL_LEN + 1];
5281   gfc_array_spec *as;
5282   gfc_symbol *sym;
5283   locus var_locus;
5284   match m;
5285
5286   as = NULL;
5287
5288   m = gfc_match_name (name);
5289   if (m != MATCH_YES)
5290     goto cleanup;
5291
5292   if (find_special (name, &sym))
5293     return MATCH_ERROR;
5294
5295   var_locus = gfc_current_locus;
5296
5297   /* Deal with possible array specification for certain attributes.  */
5298   if (current_attr.dimension
5299       || current_attr.allocatable
5300       || current_attr.pointer
5301       || current_attr.target)
5302     {
5303       m = gfc_match_array_spec (&as);
5304       if (m == MATCH_ERROR)
5305         goto cleanup;
5306
5307       if (current_attr.dimension && m == MATCH_NO)
5308         {
5309           gfc_error ("Missing array specification at %L in DIMENSION "
5310                      "statement", &var_locus);
5311           m = MATCH_ERROR;
5312           goto cleanup;
5313         }
5314
5315       if (current_attr.dimension && sym->value)
5316         {
5317           gfc_error ("Dimensions specified for %s at %L after its "
5318                      "initialisation", sym->name, &var_locus);
5319           m = MATCH_ERROR;
5320           goto cleanup;
5321         }
5322
5323       if ((current_attr.allocatable || current_attr.pointer)
5324           && (m == MATCH_YES) && (as->type != AS_DEFERRED))
5325         {
5326           gfc_error ("Array specification must be deferred at %L", &var_locus);
5327           m = MATCH_ERROR;
5328           goto cleanup;
5329         }
5330     }
5331
5332   /* Update symbol table.  DIMENSION attribute is set
5333      in gfc_set_array_spec().  */
5334   if (current_attr.dimension == 0
5335       && gfc_copy_attr (&sym->attr, &current_attr, &var_locus) == FAILURE)
5336     {
5337       m = MATCH_ERROR;
5338       goto cleanup;
5339     }
5340
5341   if (gfc_set_array_spec (sym, as, &var_locus) == FAILURE)
5342     {
5343       m = MATCH_ERROR;
5344       goto cleanup;
5345     }
5346
5347   if (sym->attr.cray_pointee && sym->as != NULL)
5348     {
5349       /* Fix the array spec.  */
5350       m = gfc_mod_pointee_as (sym->as);         
5351       if (m == MATCH_ERROR)
5352         goto cleanup;
5353     }
5354
5355   if (gfc_add_attribute (&sym->attr, &var_locus) == FAILURE)
5356     {
5357       m = MATCH_ERROR;
5358       goto cleanup;
5359     }
5360
5361   if ((current_attr.external || current_attr.intrinsic)
5362       && sym->attr.flavor != FL_PROCEDURE
5363       && gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL) == FAILURE)
5364     {
5365       m = MATCH_ERROR;
5366       goto cleanup;
5367     }
5368
5369   return MATCH_YES;
5370
5371 cleanup:
5372   gfc_free_array_spec (as);
5373   return m;
5374 }
5375
5376
5377 /* Generic attribute declaration subroutine.  Used for attributes that
5378    just have a list of names.  */
5379
5380 static match
5381 attr_decl (void)
5382 {
5383   match m;
5384
5385   /* Gobble the optional double colon, by simply ignoring the result
5386      of gfc_match().  */
5387   gfc_match (" ::");
5388
5389   for (;;)
5390     {
5391       m = attr_decl1 ();
5392       if (m != MATCH_YES)
5393         break;
5394
5395       if (gfc_match_eos () == MATCH_YES)
5396         {
5397           m = MATCH_YES;
5398           break;
5399         }
5400
5401       if (gfc_match_char (',') != MATCH_YES)
5402         {
5403           gfc_error ("Unexpected character in variable list at %C");
5404           m = MATCH_ERROR;
5405           break;
5406         }
5407     }
5408
5409   return m;
5410 }
5411
5412
5413 /* This routine matches Cray Pointer declarations of the form:
5414    pointer ( <pointer>, <pointee> )
5415    or
5416    pointer ( <pointer1>, <pointee1> ), ( <pointer2>, <pointee2> ), ...
5417    The pointer, if already declared, should be an integer.  Otherwise, we
5418    set it as BT_INTEGER with kind gfc_index_integer_kind.  The pointee may
5419    be either a scalar, or an array declaration.  No space is allocated for
5420    the pointee.  For the statement
5421    pointer (ipt, ar(10))
5422    any subsequent uses of ar will be translated (in C-notation) as
5423    ar(i) => ((<type> *) ipt)(i)
5424    After gimplification, pointee variable will disappear in the code.  */
5425
5426 static match
5427 cray_pointer_decl (void)
5428 {
5429   match m;
5430   gfc_array_spec *as;
5431   gfc_symbol *cptr; /* Pointer symbol.  */
5432   gfc_symbol *cpte; /* Pointee symbol.  */
5433   locus var_locus;
5434   bool done = false;
5435
5436   while (!done)
5437     {
5438       if (gfc_match_char ('(') != MATCH_YES)
5439         {
5440           gfc_error ("Expected '(' at %C");
5441           return MATCH_ERROR;
5442         }
5443
5444       /* Match pointer.  */
5445       var_locus = gfc_current_locus;
5446       gfc_clear_attr (&current_attr);
5447       gfc_add_cray_pointer (&current_attr, &var_locus);
5448       current_ts.type = BT_INTEGER;
5449       current_ts.kind = gfc_index_integer_kind;
5450
5451       m = gfc_match_symbol (&cptr, 0);
5452       if (m != MATCH_YES)
5453         {
5454           gfc_error ("Expected variable name at %C");
5455           return m;
5456         }
5457
5458       if (gfc_add_cray_pointer (&cptr->attr, &var_locus) == FAILURE)
5459         return MATCH_ERROR;
5460
5461       gfc_set_sym_referenced (cptr);
5462
5463       if (cptr->ts.type == BT_UNKNOWN) /* Override the type, if necessary.  */
5464         {
5465           cptr->ts.type = BT_INTEGER;
5466           cptr->ts.kind = gfc_index_integer_kind;
5467         }
5468       else if (cptr->ts.type != BT_INTEGER)
5469         {
5470           gfc_error ("Cray pointer at %C must be an integer");
5471           return MATCH_ERROR;
5472         }
5473       else if (cptr->ts.kind < gfc_index_integer_kind)
5474         gfc_warning ("Cray pointer at %C has %d bytes of precision;"
5475                      " memory addresses require %d bytes",
5476                      cptr->ts.kind, gfc_index_integer_kind);
5477
5478       if (gfc_match_char (',') != MATCH_YES)
5479         {
5480           gfc_error ("Expected \",\" at %C");
5481           return MATCH_ERROR;
5482         }
5483
5484       /* Match Pointee.  */
5485       var_locus = gfc_current_locus;
5486       gfc_clear_attr (&current_attr);
5487       gfc_add_cray_pointee (&current_attr, &var_locus);
5488       current_ts.type = BT_UNKNOWN;
5489       current_ts.kind = 0;
5490
5491       m = gfc_match_symbol (&cpte, 0);
5492       if (m != MATCH_YES)
5493         {
5494           gfc_error ("Expected variable name at %C");
5495           return m;
5496         }
5497
5498       /* Check for an optional array spec.  */
5499       m = gfc_match_array_spec (&as);
5500       if (m == MATCH_ERROR)
5501         {
5502           gfc_free_array_spec (as);
5503           return m;
5504         }
5505       else if (m == MATCH_NO)
5506         {
5507           gfc_free_array_spec (as);
5508           as = NULL;
5509         }   
5510
5511       if (gfc_add_cray_pointee (&cpte->attr, &var_locus) == FAILURE)
5512         return MATCH_ERROR;
5513
5514       gfc_set_sym_referenced (cpte);
5515
5516       if (cpte->as == NULL)
5517         {
5518           if (gfc_set_array_spec (cpte, as, &var_locus) == FAILURE)
5519             gfc_internal_error ("Couldn't set Cray pointee array spec.");
5520         }
5521       else if (as != NULL)
5522         {
5523           gfc_error ("Duplicate array spec for Cray pointee at %C");
5524           gfc_free_array_spec (as);
5525           return MATCH_ERROR;
5526         }
5527       
5528       as = NULL;
5529     
5530       if (cpte->as != NULL)
5531         {
5532           /* Fix array spec.  */
5533           m = gfc_mod_pointee_as (cpte->as);
5534           if (m == MATCH_ERROR)
5535             return m;
5536         } 
5537    
5538       /* Point the Pointee at the Pointer.  */
5539       cpte->cp_pointer = cptr;
5540
5541       if (gfc_match_char (')') != MATCH_YES)
5542         {
5543           gfc_error ("Expected \")\" at %C");
5544           return MATCH_ERROR;    
5545         }
5546       m = gfc_match_char (',');
5547       if (m != MATCH_YES)
5548         done = true; /* Stop searching for more declarations.  */
5549
5550     }
5551   
5552   if (m == MATCH_ERROR /* Failed when trying to find ',' above.  */
5553       || gfc_match_eos () != MATCH_YES)
5554     {
5555       gfc_error ("Expected \",\" or end of statement at %C");
5556       return MATCH_ERROR;
5557     }
5558   return MATCH_YES;
5559 }
5560
5561
5562 match
5563 gfc_match_external (void)
5564 {
5565
5566   gfc_clear_attr (&current_attr);
5567   current_attr.external = 1;
5568
5569   return attr_decl ();
5570 }
5571
5572
5573 match
5574 gfc_match_intent (void)
5575 {
5576   sym_intent intent;
5577
5578   intent = match_intent_spec ();
5579   if (intent == INTENT_UNKNOWN)
5580     return MATCH_ERROR;
5581
5582   gfc_clear_attr (&current_attr);
5583   current_attr.intent = intent;
5584
5585   return attr_decl ();
5586 }
5587
5588
5589 match
5590 gfc_match_intrinsic (void)
5591 {
5592
5593   gfc_clear_attr (&current_attr);
5594   current_attr.intrinsic = 1;
5595
5596   return attr_decl ();
5597 }
5598
5599
5600 match
5601 gfc_match_optional (void)
5602 {
5603
5604   gfc_clear_attr (&current_attr);
5605   current_attr.optional = 1;
5606
5607   return attr_decl ();
5608 }
5609
5610
5611 match
5612 gfc_match_pointer (void)
5613 {
5614   gfc_gobble_whitespace ();
5615   if (gfc_peek_ascii_char () == '(')
5616     {
5617       if (!gfc_option.flag_cray_pointer)
5618         {
5619           gfc_error ("Cray pointer declaration at %C requires -fcray-pointer "
5620                      "flag");
5621           return MATCH_ERROR;
5622         }
5623       return cray_pointer_decl ();
5624     }
5625   else
5626     {
5627       gfc_clear_attr (&current_attr);
5628       current_attr.pointer = 1;
5629     
5630       return attr_decl ();
5631     }
5632 }
5633
5634
5635 match
5636 gfc_match_allocatable (void)
5637 {
5638   gfc_clear_attr (&current_attr);
5639   current_attr.allocatable = 1;
5640
5641   return attr_decl ();
5642 }
5643
5644
5645 match
5646 gfc_match_dimension (void)
5647 {
5648   gfc_clear_attr (&current_attr);
5649   current_attr.dimension = 1;
5650
5651   return attr_decl ();
5652 }
5653
5654
5655 match
5656 gfc_match_target (void)
5657 {
5658   gfc_clear_attr (&current_attr);
5659   current_attr.target = 1;
5660
5661   return attr_decl ();
5662 }
5663
5664
5665 /* Match the list of entities being specified in a PUBLIC or PRIVATE
5666    statement.  */
5667
5668 static match
5669 access_attr_decl (gfc_statement st)
5670 {
5671   char name[GFC_MAX_SYMBOL_LEN + 1];
5672   interface_type type;
5673   gfc_user_op *uop;
5674   gfc_symbol *sym;
5675   gfc_intrinsic_op op;
5676   match m;
5677
5678   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
5679     goto done;
5680
5681   for (;;)
5682     {
5683       m = gfc_match_generic_spec (&type, name, &op);
5684       if (m == MATCH_NO)
5685         goto syntax;
5686       if (m == MATCH_ERROR)
5687         return MATCH_ERROR;
5688
5689       switch (type)
5690         {
5691         case INTERFACE_NAMELESS:
5692         case INTERFACE_ABSTRACT:
5693           goto syntax;
5694
5695         case INTERFACE_GENERIC:
5696           if (gfc_get_symbol (name, NULL, &sym))
5697             goto done;
5698
5699           if (gfc_add_access (&sym->attr, (st == ST_PUBLIC)
5700                                           ? ACCESS_PUBLIC : ACCESS_PRIVATE,
5701                               sym->name, NULL) == FAILURE)
5702             return MATCH_ERROR;
5703
5704           break;
5705
5706         case INTERFACE_INTRINSIC_OP:
5707           if (gfc_current_ns->operator_access[op] == ACCESS_UNKNOWN)
5708             {
5709               gfc_current_ns->operator_access[op] =
5710                 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
5711             }
5712           else
5713             {
5714               gfc_error ("Access specification of the %s operator at %C has "
5715                          "already been specified", gfc_op2string (op));
5716               goto done;
5717             }
5718
5719           break;
5720
5721         case INTERFACE_USER_OP:
5722           uop = gfc_get_uop (name);
5723
5724           if (uop->access == ACCESS_UNKNOWN)
5725             {
5726               uop->access = (st == ST_PUBLIC)
5727                           ? ACCESS_PUBLIC : ACCESS_PRIVATE;
5728             }
5729           else
5730             {
5731               gfc_error ("Access specification of the .%s. operator at %C "
5732                          "has already been specified", sym->name);
5733               goto done;
5734             }
5735
5736           break;
5737         }
5738
5739       if (gfc_match_char (',') == MATCH_NO)
5740         break;
5741     }
5742
5743   if (gfc_match_eos () != MATCH_YES)
5744     goto syntax;
5745   return MATCH_YES;
5746
5747 syntax:
5748   gfc_syntax_error (st);
5749
5750 done:
5751   return MATCH_ERROR;
5752 }
5753
5754
5755 match
5756 gfc_match_protected (void)
5757 {
5758   gfc_symbol *sym;
5759   match m;
5760
5761   if (gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
5762     {
5763        gfc_error ("PROTECTED at %C only allowed in specification "
5764                   "part of a module");
5765        return MATCH_ERROR;
5766
5767     }
5768
5769   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PROTECTED statement at %C")
5770       == FAILURE)
5771     return MATCH_ERROR;
5772
5773   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
5774     {
5775       return MATCH_ERROR;
5776     }
5777
5778   if (gfc_match_eos () == MATCH_YES)
5779     goto syntax;
5780
5781   for(;;)
5782     {
5783       m = gfc_match_symbol (&sym, 0);
5784       switch (m)
5785         {
5786         case MATCH_YES:
5787           if (gfc_add_protected (&sym->attr, sym->name, &gfc_current_locus)
5788               == FAILURE)
5789             return MATCH_ERROR;
5790           goto next_item;
5791
5792         case MATCH_NO:
5793           break;
5794
5795         case MATCH_ERROR:
5796           return MATCH_ERROR;
5797         }
5798
5799     next_item:
5800       if (gfc_match_eos () == MATCH_YES)
5801         break;
5802       if (gfc_match_char (',') != MATCH_YES)
5803         goto syntax;
5804     }
5805
5806   return MATCH_YES;
5807
5808 syntax:
5809   gfc_error ("Syntax error in PROTECTED statement at %C");
5810   return MATCH_ERROR;
5811 }
5812
5813
5814 /* The PRIVATE statement is a bit weird in that it can be an attribute
5815    declaration, but also works as a standalone statement inside of a
5816    type declaration or a module.  */
5817
5818 match
5819 gfc_match_private (gfc_statement *st)
5820 {
5821
5822   if (gfc_match ("private") != MATCH_YES)
5823     return MATCH_NO;
5824
5825   if (gfc_current_state () != COMP_MODULE
5826       && (gfc_current_state () != COMP_DERIVED
5827           || !gfc_state_stack->previous
5828           || gfc_state_stack->previous->state != COMP_MODULE))
5829     {
5830       gfc_error ("PRIVATE statement at %C is only allowed in the "
5831                  "specification part of a module");
5832       return MATCH_ERROR;
5833     }
5834
5835   if (gfc_current_state () == COMP_DERIVED)
5836     {
5837       if (gfc_match_eos () == MATCH_YES)
5838         {
5839           *st = ST_PRIVATE;
5840           return MATCH_YES;
5841         }
5842
5843       gfc_syntax_error (ST_PRIVATE);
5844       return MATCH_ERROR;
5845     }
5846
5847   if (gfc_match_eos () == MATCH_YES)
5848     {
5849       *st = ST_PRIVATE;
5850       return MATCH_YES;
5851     }
5852
5853   *st = ST_ATTR_DECL;
5854   return access_attr_decl (ST_PRIVATE);
5855 }
5856
5857
5858 match
5859 gfc_match_public (gfc_statement *st)
5860 {
5861
5862   if (gfc_match ("public") != MATCH_YES)
5863     return MATCH_NO;
5864
5865   if (gfc_current_state () != COMP_MODULE)
5866     {
5867       gfc_error ("PUBLIC statement at %C is only allowed in the "
5868                  "specification part of a module");
5869       return MATCH_ERROR;
5870     }
5871
5872   if (gfc_match_eos () == MATCH_YES)
5873     {
5874       *st = ST_PUBLIC;
5875       return MATCH_YES;
5876     }
5877
5878   *st = ST_ATTR_DECL;
5879   return access_attr_decl (ST_PUBLIC);
5880 }
5881
5882
5883 /* Workhorse for gfc_match_parameter.  */
5884
5885 static match
5886 do_parm (void)
5887 {
5888   gfc_symbol *sym;
5889   gfc_expr *init;
5890   match m;
5891
5892   m = gfc_match_symbol (&sym, 0);
5893   if (m == MATCH_NO)
5894     gfc_error ("Expected variable name at %C in PARAMETER statement");
5895
5896   if (m != MATCH_YES)
5897     return m;
5898
5899   if (gfc_match_char ('=') == MATCH_NO)
5900     {
5901       gfc_error ("Expected = sign in PARAMETER statement at %C");
5902       return MATCH_ERROR;
5903     }
5904
5905   m = gfc_match_init_expr (&init);
5906   if (m == MATCH_NO)
5907     gfc_error ("Expected expression at %C in PARAMETER statement");
5908   if (m != MATCH_YES)
5909     return m;
5910
5911   if (sym->ts.type == BT_UNKNOWN
5912       && gfc_set_default_type (sym, 1, NULL) == FAILURE)
5913     {
5914       m = MATCH_ERROR;
5915       goto cleanup;
5916     }
5917
5918   if (gfc_check_assign_symbol (sym, init) == FAILURE
5919       || gfc_add_flavor (&sym->attr, FL_PARAMETER, sym->name, NULL) == FAILURE)
5920     {
5921       m = MATCH_ERROR;
5922       goto cleanup;
5923     }
5924
5925   if (sym->value)
5926     {
5927       gfc_error ("Initializing already initialized variable at %C");
5928       m = MATCH_ERROR;
5929       goto cleanup;
5930     }
5931
5932   if (sym->ts.type == BT_CHARACTER
5933       && sym->ts.cl != NULL
5934       && sym->ts.cl->length != NULL
5935       && sym->ts.cl->length->expr_type == EXPR_CONSTANT
5936       && init->expr_type == EXPR_CONSTANT
5937       && init->ts.type == BT_CHARACTER)
5938     gfc_set_constant_character_len (
5939       mpz_get_si (sym->ts.cl->length->value.integer), init, -1);
5940   else if (sym->ts.type == BT_CHARACTER && sym->ts.cl != NULL
5941            && sym->ts.cl->length == NULL)
5942         {
5943           int clen;
5944           if (init->expr_type == EXPR_CONSTANT)
5945             {
5946               clen = init->value.character.length;
5947               sym->ts.cl->length = gfc_int_expr (clen);
5948             }
5949           else if (init->expr_type == EXPR_ARRAY)
5950             {
5951               gfc_expr *p = init->value.constructor->expr;
5952               clen = p->value.character.length;
5953               sym->ts.cl->length = gfc_int_expr (clen);
5954             }
5955           else if (init->ts.cl && init->ts.cl->length)
5956             sym->ts.cl->length = gfc_copy_expr (sym->value->ts.cl->length);
5957         }
5958
5959   sym->value = init;
5960   return MATCH_YES;
5961
5962 cleanup:
5963   gfc_free_expr (init);
5964   return m;
5965 }
5966
5967
5968 /* Match a parameter statement, with the weird syntax that these have.  */
5969
5970 match
5971 gfc_match_parameter (void)
5972 {
5973   match m;
5974
5975   if (gfc_match_char ('(') == MATCH_NO)
5976     return MATCH_NO;
5977
5978   for (;;)
5979     {
5980       m = do_parm ();
5981       if (m != MATCH_YES)
5982         break;
5983
5984       if (gfc_match (" )%t") == MATCH_YES)
5985         break;
5986
5987       if (gfc_match_char (',') != MATCH_YES)
5988         {
5989           gfc_error ("Unexpected characters in PARAMETER statement at %C");
5990           m = MATCH_ERROR;
5991           break;
5992         }
5993     }
5994
5995   return m;
5996 }
5997
5998
5999 /* Save statements have a special syntax.  */
6000
6001 match
6002 gfc_match_save (void)
6003 {
6004   char n[GFC_MAX_SYMBOL_LEN+1];
6005   gfc_common_head *c;
6006   gfc_symbol *sym;
6007   match m;
6008
6009   if (gfc_match_eos () == MATCH_YES)
6010     {
6011       if (gfc_current_ns->seen_save)
6012         {
6013           if (gfc_notify_std (GFC_STD_LEGACY, "Blanket SAVE statement at %C "
6014                               "follows previous SAVE statement")
6015               == FAILURE)
6016             return MATCH_ERROR;
6017         }
6018
6019       gfc_current_ns->save_all = gfc_current_ns->seen_save = 1;
6020       return MATCH_YES;
6021     }
6022
6023   if (gfc_current_ns->save_all)
6024     {
6025       if (gfc_notify_std (GFC_STD_LEGACY, "SAVE statement at %C follows "
6026                           "blanket SAVE statement")
6027           == FAILURE)
6028         return MATCH_ERROR;
6029     }
6030
6031   gfc_match (" ::");
6032
6033   for (;;)
6034     {
6035       m = gfc_match_symbol (&sym, 0);
6036       switch (m)
6037         {
6038         case MATCH_YES:
6039           if (gfc_add_save (&sym->attr, sym->name, &gfc_current_locus)
6040               == FAILURE)
6041             return MATCH_ERROR;
6042           goto next_item;
6043
6044         case MATCH_NO:
6045           break;
6046
6047         case MATCH_ERROR:
6048           return MATCH_ERROR;
6049         }
6050
6051       m = gfc_match (" / %n /", &n);
6052       if (m == MATCH_ERROR)
6053         return MATCH_ERROR;
6054       if (m == MATCH_NO)
6055         goto syntax;
6056
6057       c = gfc_get_common (n, 0);
6058       c->saved = 1;
6059
6060       gfc_current_ns->seen_save = 1;
6061
6062     next_item:
6063       if (gfc_match_eos () == MATCH_YES)
6064         break;
6065       if (gfc_match_char (',') != MATCH_YES)
6066         goto syntax;
6067     }
6068
6069   return MATCH_YES;
6070
6071 syntax:
6072   gfc_error ("Syntax error in SAVE statement at %C");
6073   return MATCH_ERROR;
6074 }
6075
6076
6077 match
6078 gfc_match_value (void)
6079 {
6080   gfc_symbol *sym;
6081   match m;
6082
6083   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: VALUE statement at %C")
6084       == FAILURE)
6085     return MATCH_ERROR;
6086
6087   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6088     {
6089       return MATCH_ERROR;
6090     }
6091
6092   if (gfc_match_eos () == MATCH_YES)
6093     goto syntax;
6094
6095   for(;;)
6096     {
6097       m = gfc_match_symbol (&sym, 0);
6098       switch (m)
6099         {
6100         case MATCH_YES:
6101           if (gfc_add_value (&sym->attr, sym->name, &gfc_current_locus)
6102               == FAILURE)
6103             return MATCH_ERROR;
6104           goto next_item;
6105
6106         case MATCH_NO:
6107           break;
6108
6109         case MATCH_ERROR:
6110           return MATCH_ERROR;
6111         }
6112
6113     next_item:
6114       if (gfc_match_eos () == MATCH_YES)
6115         break;
6116       if (gfc_match_char (',') != MATCH_YES)
6117         goto syntax;
6118     }
6119
6120   return MATCH_YES;
6121
6122 syntax:
6123   gfc_error ("Syntax error in VALUE statement at %C");
6124   return MATCH_ERROR;
6125 }
6126
6127
6128 match
6129 gfc_match_volatile (void)
6130 {
6131   gfc_symbol *sym;
6132   match m;
6133
6134   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: VOLATILE statement at %C")
6135       == FAILURE)
6136     return MATCH_ERROR;
6137
6138   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6139     {
6140       return MATCH_ERROR;
6141     }
6142
6143   if (gfc_match_eos () == MATCH_YES)
6144     goto syntax;
6145
6146   for(;;)
6147     {
6148       /* VOLATILE is special because it can be added to host-associated 
6149          symbols locally.  */
6150       m = gfc_match_symbol (&sym, 1);
6151       switch (m)
6152         {
6153         case MATCH_YES:
6154           if (gfc_add_volatile (&sym->attr, sym->name, &gfc_current_locus)
6155               == FAILURE)
6156             return MATCH_ERROR;
6157           goto next_item;
6158
6159         case MATCH_NO:
6160           break;
6161
6162         case MATCH_ERROR:
6163           return MATCH_ERROR;
6164         }
6165
6166     next_item:
6167       if (gfc_match_eos () == MATCH_YES)
6168         break;
6169       if (gfc_match_char (',') != MATCH_YES)
6170         goto syntax;
6171     }
6172
6173   return MATCH_YES;
6174
6175 syntax:
6176   gfc_error ("Syntax error in VOLATILE statement at %C");
6177   return MATCH_ERROR;
6178 }
6179
6180
6181 /* Match a module procedure statement.  Note that we have to modify
6182    symbols in the parent's namespace because the current one was there
6183    to receive symbols that are in an interface's formal argument list.  */
6184
6185 match
6186 gfc_match_modproc (void)
6187 {
6188   char name[GFC_MAX_SYMBOL_LEN + 1];
6189   gfc_symbol *sym;
6190   match m;
6191   gfc_namespace *module_ns;
6192   gfc_interface *old_interface_head, *interface;
6193
6194   if (gfc_state_stack->state != COMP_INTERFACE
6195       || gfc_state_stack->previous == NULL
6196       || current_interface.type == INTERFACE_NAMELESS
6197       || current_interface.type == INTERFACE_ABSTRACT)
6198     {
6199       gfc_error ("MODULE PROCEDURE at %C must be in a generic module "
6200                  "interface");
6201       return MATCH_ERROR;
6202     }
6203
6204   module_ns = gfc_current_ns->parent;
6205   for (; module_ns; module_ns = module_ns->parent)
6206     if (module_ns->proc_name->attr.flavor == FL_MODULE)
6207       break;
6208
6209   if (module_ns == NULL)
6210     return MATCH_ERROR;
6211
6212   /* Store the current state of the interface. We will need it if we
6213      end up with a syntax error and need to recover.  */
6214   old_interface_head = gfc_current_interface_head ();
6215
6216   for (;;)
6217     {
6218       bool last = false;
6219
6220       m = gfc_match_name (name);
6221       if (m == MATCH_NO)
6222         goto syntax;
6223       if (m != MATCH_YES)
6224         return MATCH_ERROR;
6225
6226       /* Check for syntax error before starting to add symbols to the
6227          current namespace.  */
6228       if (gfc_match_eos () == MATCH_YES)
6229         last = true;
6230       if (!last && gfc_match_char (',') != MATCH_YES)
6231         goto syntax;
6232
6233       /* Now we're sure the syntax is valid, we process this item
6234          further.  */
6235       if (gfc_get_symbol (name, module_ns, &sym))
6236         return MATCH_ERROR;
6237
6238       if (sym->attr.proc != PROC_MODULE
6239           && gfc_add_procedure (&sym->attr, PROC_MODULE,
6240                                 sym->name, NULL) == FAILURE)
6241         return MATCH_ERROR;
6242
6243       if (gfc_add_interface (sym) == FAILURE)
6244         return MATCH_ERROR;
6245
6246       sym->attr.mod_proc = 1;
6247
6248       if (last)
6249         break;
6250     }
6251
6252   return MATCH_YES;
6253
6254 syntax:
6255   /* Restore the previous state of the interface.  */
6256   interface = gfc_current_interface_head ();
6257   gfc_set_current_interface_head (old_interface_head);
6258
6259   /* Free the new interfaces.  */
6260   while (interface != old_interface_head)
6261   {
6262     gfc_interface *i = interface->next;
6263     gfc_free (interface);
6264     interface = i;
6265   }
6266
6267   /* And issue a syntax error.  */
6268   gfc_syntax_error (ST_MODULE_PROC);
6269   return MATCH_ERROR;
6270 }
6271
6272
6273 /* Check a derived type that is being extended.  */
6274 static gfc_symbol*
6275 check_extended_derived_type (char *name)
6276 {
6277   gfc_symbol *extended;
6278
6279   if (gfc_find_symbol (name, gfc_current_ns, 1, &extended))
6280     {
6281       gfc_error ("Ambiguous symbol in TYPE definition at %C");
6282       return NULL;
6283     }
6284
6285   if (!extended)
6286     {
6287       gfc_error ("No such symbol in TYPE definition at %C");
6288       return NULL;
6289     }
6290
6291   if (extended->attr.flavor != FL_DERIVED)
6292     {
6293       gfc_error ("'%s' in EXTENDS expression at %C is not a "
6294                  "derived type", name);
6295       return NULL;
6296     }
6297
6298   if (extended->attr.is_bind_c)
6299     {
6300       gfc_error ("'%s' cannot be extended at %C because it "
6301                  "is BIND(C)", extended->name);
6302       return NULL;
6303     }
6304
6305   if (extended->attr.sequence)
6306     {
6307       gfc_error ("'%s' cannot be extended at %C because it "
6308                  "is a SEQUENCE type", extended->name);
6309       return NULL;
6310     }
6311
6312   return extended;
6313 }
6314
6315
6316 /* Match the optional attribute specifiers for a type declaration.
6317    Return MATCH_ERROR if an error is encountered in one of the handled
6318    attributes (public, private, bind(c)), MATCH_NO if what's found is
6319    not a handled attribute, and MATCH_YES otherwise.  TODO: More error
6320    checking on attribute conflicts needs to be done.  */
6321
6322 match
6323 gfc_get_type_attr_spec (symbol_attribute *attr, char *name)
6324 {
6325   /* See if the derived type is marked as private.  */
6326   if (gfc_match (" , private") == MATCH_YES)
6327     {
6328       if (gfc_current_state () != COMP_MODULE)
6329         {
6330           gfc_error ("Derived type at %C can only be PRIVATE in the "
6331                      "specification part of a module");
6332           return MATCH_ERROR;
6333         }
6334
6335       if (gfc_add_access (attr, ACCESS_PRIVATE, NULL, NULL) == FAILURE)
6336         return MATCH_ERROR;
6337     }
6338   else if (gfc_match (" , public") == MATCH_YES)
6339     {
6340       if (gfc_current_state () != COMP_MODULE)
6341         {
6342           gfc_error ("Derived type at %C can only be PUBLIC in the "
6343                      "specification part of a module");
6344           return MATCH_ERROR;
6345         }
6346
6347       if (gfc_add_access (attr, ACCESS_PUBLIC, NULL, NULL) == FAILURE)
6348         return MATCH_ERROR;
6349     }
6350   else if (gfc_match(" , bind ( c )") == MATCH_YES)
6351     {
6352       /* If the type is defined to be bind(c) it then needs to make
6353          sure that all fields are interoperable.  This will
6354          need to be a semantic check on the finished derived type.
6355          See 15.2.3 (lines 9-12) of F2003 draft.  */
6356       if (gfc_add_is_bind_c (attr, NULL, &gfc_current_locus, 0) != SUCCESS)
6357         return MATCH_ERROR;
6358
6359       /* TODO: attr conflicts need to be checked, probably in symbol.c.  */
6360     }
6361   else if (name && gfc_match(" , extends ( %n )", name) == MATCH_YES)
6362     {
6363       if (gfc_add_extension (attr, &gfc_current_locus) == FAILURE)
6364         return MATCH_ERROR;
6365     }
6366   else
6367     return MATCH_NO;
6368
6369   /* If we get here, something matched.  */
6370   return MATCH_YES;
6371 }
6372
6373
6374 /* Match the beginning of a derived type declaration.  If a type name
6375    was the result of a function, then it is possible to have a symbol
6376    already to be known as a derived type yet have no components.  */
6377
6378 match
6379 gfc_match_derived_decl (void)
6380 {
6381   char name[GFC_MAX_SYMBOL_LEN + 1];
6382   char parent[GFC_MAX_SYMBOL_LEN + 1];
6383   symbol_attribute attr;
6384   gfc_symbol *sym;
6385   gfc_symbol *extended;
6386   match m;
6387   match is_type_attr_spec = MATCH_NO;
6388   bool seen_attr = false;
6389
6390   if (gfc_current_state () == COMP_DERIVED)
6391     return MATCH_NO;
6392
6393   name[0] = '\0';
6394   parent[0] = '\0';
6395   gfc_clear_attr (&attr);
6396   extended = NULL;
6397
6398   do
6399     {
6400       is_type_attr_spec = gfc_get_type_attr_spec (&attr, parent);
6401       if (is_type_attr_spec == MATCH_ERROR)
6402         return MATCH_ERROR;
6403       if (is_type_attr_spec == MATCH_YES)
6404         seen_attr = true;
6405     } while (is_type_attr_spec == MATCH_YES);
6406
6407   /* Deal with derived type extensions.  The extension attribute has
6408      been added to 'attr' but now the parent type must be found and
6409      checked.  */
6410   if (parent[0])
6411     extended = check_extended_derived_type (parent);
6412
6413   if (parent[0] && !extended)
6414     return MATCH_ERROR;
6415
6416   if (gfc_match (" ::") != MATCH_YES && seen_attr)
6417     {
6418       gfc_error ("Expected :: in TYPE definition at %C");
6419       return MATCH_ERROR;
6420     }
6421
6422   m = gfc_match (" %n%t", name);
6423   if (m != MATCH_YES)
6424     return m;
6425
6426   /* Make sure the name is not the name of an intrinsic type.  */
6427   if (gfc_is_intrinsic_typename (name))
6428     {
6429       gfc_error ("Type name '%s' at %C cannot be the same as an intrinsic "
6430                  "type", name);
6431       return MATCH_ERROR;
6432     }
6433
6434   if (gfc_get_symbol (name, NULL, &sym))
6435     return MATCH_ERROR;
6436
6437   if (sym->ts.type != BT_UNKNOWN)
6438     {
6439       gfc_error ("Derived type name '%s' at %C already has a basic type "
6440                  "of %s", sym->name, gfc_typename (&sym->ts));
6441       return MATCH_ERROR;
6442     }
6443
6444   /* The symbol may already have the derived attribute without the
6445      components.  The ways this can happen is via a function
6446      definition, an INTRINSIC statement or a subtype in another
6447      derived type that is a pointer.  The first part of the AND clause
6448      is true if the symbol is not the return value of a function.  */
6449   if (sym->attr.flavor != FL_DERIVED
6450       && gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL) == FAILURE)
6451     return MATCH_ERROR;
6452
6453   if (sym->components != NULL || sym->attr.zero_comp)
6454     {
6455       gfc_error ("Derived type definition of '%s' at %C has already been "
6456                  "defined", sym->name);
6457       return MATCH_ERROR;
6458     }
6459
6460   if (attr.access != ACCESS_UNKNOWN
6461       && gfc_add_access (&sym->attr, attr.access, sym->name, NULL) == FAILURE)
6462     return MATCH_ERROR;
6463
6464   /* See if the derived type was labeled as bind(c).  */
6465   if (attr.is_bind_c != 0)
6466     sym->attr.is_bind_c = attr.is_bind_c;
6467
6468
6469   /* Construct the f2k_derived namespace if it is not yet there.  */
6470   if (!sym->f2k_derived)
6471     sym->f2k_derived = gfc_get_namespace (NULL, 0);
6472
6473   
6474   if (extended && !sym->components)
6475     {
6476       gfc_component *p;
6477       gfc_symtree *st;
6478
6479       /* Add the extended derived type as the first component.  */
6480       gfc_add_component (sym, parent, &p);
6481       sym->attr.extension = attr.extension;
6482       extended->refs++;
6483       gfc_set_sym_referenced (extended);
6484
6485       p->ts.type = BT_DERIVED;
6486       p->ts.derived = extended;
6487       p->initializer = gfc_default_initializer (&p->ts);
6488
6489       /* Provide the links between the extended type and its extension.  */
6490       if (!extended->f2k_derived)
6491         extended->f2k_derived = gfc_get_namespace (NULL, 0);
6492       st = gfc_new_symtree (&extended->f2k_derived->sym_root, sym->name);
6493       st->n.sym = sym;
6494     }
6495
6496   gfc_new_block = sym;
6497
6498   return MATCH_YES;
6499 }
6500
6501
6502 /* Cray Pointees can be declared as: 
6503       pointer (ipt, a (n,m,...,*)) 
6504    By default, this is treated as an AS_ASSUMED_SIZE array.  We'll
6505    cheat and set a constant bound of 1 for the last dimension, if this
6506    is the case. Since there is no bounds-checking for Cray Pointees,
6507    this will be okay.  */
6508
6509 gfc_try
6510 gfc_mod_pointee_as (gfc_array_spec *as)
6511 {
6512   as->cray_pointee = true; /* This will be useful to know later.  */
6513   if (as->type == AS_ASSUMED_SIZE)
6514     {
6515       as->type = AS_EXPLICIT;
6516       as->upper[as->rank - 1] = gfc_int_expr (1);
6517       as->cp_was_assumed = true;
6518     }
6519   else if (as->type == AS_ASSUMED_SHAPE)
6520     {
6521       gfc_error ("Cray Pointee at %C cannot be assumed shape array");
6522       return MATCH_ERROR;
6523     }
6524   return MATCH_YES;
6525 }
6526
6527
6528 /* Match the enum definition statement, here we are trying to match 
6529    the first line of enum definition statement.  
6530    Returns MATCH_YES if match is found.  */
6531
6532 match
6533 gfc_match_enum (void)
6534 {
6535   match m;
6536   
6537   m = gfc_match_eos ();
6538   if (m != MATCH_YES)
6539     return m;
6540
6541   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ENUM and ENUMERATOR at %C")
6542       == FAILURE)
6543     return MATCH_ERROR;
6544
6545   return MATCH_YES;
6546 }
6547
6548
6549 /* Match a variable name with an optional initializer.  When this
6550    subroutine is called, a variable is expected to be parsed next.
6551    Depending on what is happening at the moment, updates either the
6552    symbol table or the current interface.  */
6553
6554 static match
6555 enumerator_decl (void)
6556 {
6557   char name[GFC_MAX_SYMBOL_LEN + 1];
6558   gfc_expr *initializer;
6559   gfc_array_spec *as = NULL;
6560   gfc_symbol *sym;
6561   locus var_locus;
6562   match m;
6563   gfc_try t;
6564   locus old_locus;
6565
6566   initializer = NULL;
6567   old_locus = gfc_current_locus;
6568
6569   /* When we get here, we've just matched a list of attributes and
6570      maybe a type and a double colon.  The next thing we expect to see
6571      is the name of the symbol.  */
6572   m = gfc_match_name (name);
6573   if (m != MATCH_YES)
6574     goto cleanup;
6575
6576   var_locus = gfc_current_locus;
6577
6578   /* OK, we've successfully matched the declaration.  Now put the
6579      symbol in the current namespace. If we fail to create the symbol,
6580      bail out.  */
6581   if (build_sym (name, NULL, &as, &var_locus) == FAILURE)
6582     {
6583       m = MATCH_ERROR;
6584       goto cleanup;
6585     }
6586
6587   /* The double colon must be present in order to have initializers.
6588      Otherwise the statement is ambiguous with an assignment statement.  */
6589   if (colon_seen)
6590     {
6591       if (gfc_match_char ('=') == MATCH_YES)
6592         {
6593           m = gfc_match_init_expr (&initializer);
6594           if (m == MATCH_NO)
6595             {
6596               gfc_error ("Expected an initialization expression at %C");
6597               m = MATCH_ERROR;
6598             }
6599
6600           if (m != MATCH_YES)
6601             goto cleanup;
6602         }
6603     }
6604
6605   /* If we do not have an initializer, the initialization value of the
6606      previous enumerator (stored in last_initializer) is incremented
6607      by 1 and is used to initialize the current enumerator.  */
6608   if (initializer == NULL)
6609     initializer = gfc_enum_initializer (last_initializer, old_locus);
6610
6611   if (initializer == NULL || initializer->ts.type != BT_INTEGER)
6612     {
6613       gfc_error("ENUMERATOR %L not initialized with integer expression",
6614                 &var_locus);
6615       m = MATCH_ERROR;
6616       gfc_free_enum_history ();
6617       goto cleanup;
6618     }
6619
6620   /* Store this current initializer, for the next enumerator variable
6621      to be parsed.  add_init_expr_to_sym() zeros initializer, so we
6622      use last_initializer below.  */
6623   last_initializer = initializer;
6624   t = add_init_expr_to_sym (name, &initializer, &var_locus);
6625
6626   /* Maintain enumerator history.  */
6627   gfc_find_symbol (name, NULL, 0, &sym);
6628   create_enum_history (sym, last_initializer);
6629
6630   return (t == SUCCESS) ? MATCH_YES : MATCH_ERROR;
6631
6632 cleanup:
6633   /* Free stuff up and return.  */
6634   gfc_free_expr (initializer);
6635
6636   return m;
6637 }
6638
6639
6640 /* Match the enumerator definition statement.  */
6641
6642 match
6643 gfc_match_enumerator_def (void)
6644 {
6645   match m;
6646   gfc_try t;
6647
6648   gfc_clear_ts (&current_ts);
6649
6650   m = gfc_match (" enumerator");
6651   if (m != MATCH_YES)
6652     return m;
6653
6654   m = gfc_match (" :: ");
6655   if (m == MATCH_ERROR)
6656     return m;
6657
6658   colon_seen = (m == MATCH_YES);
6659
6660   if (gfc_current_state () != COMP_ENUM)
6661     {
6662       gfc_error ("ENUM definition statement expected before %C");
6663       gfc_free_enum_history ();
6664       return MATCH_ERROR;
6665     }
6666
6667   (&current_ts)->type = BT_INTEGER;
6668   (&current_ts)->kind = gfc_c_int_kind;
6669
6670   gfc_clear_attr (&current_attr);
6671   t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, NULL);
6672   if (t == FAILURE)
6673     {
6674       m = MATCH_ERROR;
6675       goto cleanup;
6676     }
6677
6678   for (;;)
6679     {
6680       m = enumerator_decl ();
6681       if (m == MATCH_ERROR)
6682         goto cleanup;
6683       if (m == MATCH_NO)
6684         break;
6685
6686       if (gfc_match_eos () == MATCH_YES)
6687         goto cleanup;
6688       if (gfc_match_char (',') != MATCH_YES)
6689         break;
6690     }
6691
6692   if (gfc_current_state () == COMP_ENUM)
6693     {
6694       gfc_free_enum_history ();
6695       gfc_error ("Syntax error in ENUMERATOR definition at %C");
6696       m = MATCH_ERROR;
6697     }
6698
6699 cleanup:
6700   gfc_free_array_spec (current_as);
6701   current_as = NULL;
6702   return m;
6703
6704 }
6705
6706
6707 /* Match a FINAL declaration inside a derived type.  */
6708
6709 match
6710 gfc_match_final_decl (void)
6711 {
6712   char name[GFC_MAX_SYMBOL_LEN + 1];
6713   gfc_symbol* sym;
6714   match m;
6715   gfc_namespace* module_ns;
6716   bool first, last;
6717
6718   if (gfc_state_stack->state != COMP_DERIVED)
6719     {
6720       gfc_error ("FINAL declaration at %C must be inside a derived type "
6721                  "definition!");
6722       return MATCH_ERROR;
6723     }
6724
6725   gcc_assert (gfc_current_block ());
6726
6727   if (!gfc_state_stack->previous
6728       || gfc_state_stack->previous->state != COMP_MODULE)
6729     {
6730       gfc_error ("Derived type declaration with FINAL at %C must be in the"
6731                  " specification part of a MODULE");
6732       return MATCH_ERROR;
6733     }
6734
6735   module_ns = gfc_current_ns;
6736   gcc_assert (module_ns);
6737   gcc_assert (module_ns->proc_name->attr.flavor == FL_MODULE);
6738
6739   /* Match optional ::, don't care about MATCH_YES or MATCH_NO.  */
6740   if (gfc_match (" ::") == MATCH_ERROR)
6741     return MATCH_ERROR;
6742
6743   /* Match the sequence of procedure names.  */
6744   first = true;
6745   last = false;
6746   do
6747     {
6748       gfc_finalizer* f;
6749
6750       if (first && gfc_match_eos () == MATCH_YES)
6751         {
6752           gfc_error ("Empty FINAL at %C");
6753           return MATCH_ERROR;
6754         }
6755
6756       m = gfc_match_name (name);
6757       if (m == MATCH_NO)
6758         {
6759           gfc_error ("Expected module procedure name at %C");
6760           return MATCH_ERROR;
6761         }
6762       else if (m != MATCH_YES)
6763         return MATCH_ERROR;
6764
6765       if (gfc_match_eos () == MATCH_YES)
6766         last = true;
6767       if (!last && gfc_match_char (',') != MATCH_YES)
6768         {
6769           gfc_error ("Expected ',' at %C");
6770           return MATCH_ERROR;
6771         }
6772
6773       if (gfc_get_symbol (name, module_ns, &sym))
6774         {
6775           gfc_error ("Unknown procedure name \"%s\" at %C", name);
6776           return MATCH_ERROR;
6777         }
6778
6779       /* Mark the symbol as module procedure.  */
6780       if (sym->attr.proc != PROC_MODULE
6781           && gfc_add_procedure (&sym->attr, PROC_MODULE,
6782                                 sym->name, NULL) == FAILURE)
6783         return MATCH_ERROR;
6784
6785       /* Check if we already have this symbol in the list, this is an error.  */
6786       for (f = gfc_current_block ()->f2k_derived->finalizers; f; f = f->next)
6787         if (f->proc_sym == sym)
6788           {
6789             gfc_error ("'%s' at %C is already defined as FINAL procedure!",
6790                        name);
6791             return MATCH_ERROR;
6792           }
6793
6794       /* Add this symbol to the list of finalizers.  */
6795       gcc_assert (gfc_current_block ()->f2k_derived);
6796       ++sym->refs;
6797       f = XCNEW (gfc_finalizer);
6798       f->proc_sym = sym;
6799       f->proc_tree = NULL;
6800       f->where = gfc_current_locus;
6801       f->next = gfc_current_block ()->f2k_derived->finalizers;
6802       gfc_current_block ()->f2k_derived->finalizers = f;
6803
6804       first = false;
6805     }
6806   while (!last);
6807
6808   return MATCH_YES;
6809 }