OSDN Git Service

2008-08-28 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   c->attr = current_attr;
1407
1408   c->initializer = *init;
1409   *init = NULL;
1410
1411   c->as = *as;
1412   if (c->as != NULL)
1413     c->attr.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->attr.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->attr.dimension)
1465     {
1466       if (c->attr.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->attr.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->attr.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   bool bind_c_function = false;
3372   gfc_try retval = SUCCESS;
3373
3374   if (tmp_sym->attr.function && tmp_sym->attr.is_bind_c)
3375     bind_c_function = true;
3376
3377   if (tmp_sym->attr.function && tmp_sym->result != NULL)
3378     {
3379       tmp_sym = tmp_sym->result;
3380       /* Make sure it wasn't an implicitly typed result.  */
3381       if (tmp_sym->attr.implicit_type)
3382         {
3383           gfc_warning ("Implicitly declared BIND(C) function '%s' at "
3384                        "%L may not be C interoperable", tmp_sym->name,
3385                        &tmp_sym->declared_at);
3386           tmp_sym->ts.f90_type = tmp_sym->ts.type;
3387           /* Mark it as C interoperable to prevent duplicate warnings.  */
3388           tmp_sym->ts.is_c_interop = 1;
3389           tmp_sym->attr.is_c_interop = 1;
3390         }
3391     }
3392
3393   /* Here, we know we have the bind(c) attribute, so if we have
3394      enough type info, then verify that it's a C interop kind.
3395      The info could be in the symbol already, or possibly still in
3396      the given ts (current_ts), so look in both.  */
3397   if (tmp_sym->ts.type != BT_UNKNOWN || ts->type != BT_UNKNOWN) 
3398     {
3399       if (verify_c_interop (&(tmp_sym->ts), tmp_sym->name,
3400                             &(tmp_sym->declared_at)) != SUCCESS)
3401         {
3402           /* See if we're dealing with a sym in a common block or not.  */
3403           if (is_in_common == 1)
3404             {
3405               gfc_warning ("Variable '%s' in common block '%s' at %L "
3406                            "may not be a C interoperable "
3407                            "kind though common block '%s' is BIND(C)",
3408                            tmp_sym->name, com_block->name,
3409                            &(tmp_sym->declared_at), com_block->name);
3410             }
3411           else
3412             {
3413               if (tmp_sym->ts.type == BT_DERIVED || ts->type == BT_DERIVED)
3414                 gfc_error ("Type declaration '%s' at %L is not C "
3415                            "interoperable but it is BIND(C)",
3416                            tmp_sym->name, &(tmp_sym->declared_at));
3417               else
3418                 gfc_warning ("Variable '%s' at %L "
3419                              "may not be a C interoperable "
3420                              "kind but it is bind(c)",
3421                              tmp_sym->name, &(tmp_sym->declared_at));
3422             }
3423         }
3424       
3425       /* Variables declared w/in a common block can't be bind(c)
3426          since there's no way for C to see these variables, so there's
3427          semantically no reason for the attribute.  */
3428       if (is_in_common == 1 && tmp_sym->attr.is_bind_c == 1)
3429         {
3430           gfc_error ("Variable '%s' in common block '%s' at "
3431                      "%L cannot be declared with BIND(C) "
3432                      "since it is not a global",
3433                      tmp_sym->name, com_block->name,
3434                      &(tmp_sym->declared_at));
3435           retval = FAILURE;
3436         }
3437       
3438       /* Scalar variables that are bind(c) can not have the pointer
3439          or allocatable attributes.  */
3440       if (tmp_sym->attr.is_bind_c == 1)
3441         {
3442           if (tmp_sym->attr.pointer == 1)
3443             {
3444               gfc_error ("Variable '%s' at %L cannot have both the "
3445                          "POINTER and BIND(C) attributes",
3446                          tmp_sym->name, &(tmp_sym->declared_at));
3447               retval = FAILURE;
3448             }
3449
3450           if (tmp_sym->attr.allocatable == 1)
3451             {
3452               gfc_error ("Variable '%s' at %L cannot have both the "
3453                          "ALLOCATABLE and BIND(C) attributes",
3454                          tmp_sym->name, &(tmp_sym->declared_at));
3455               retval = FAILURE;
3456             }
3457
3458         }
3459
3460       /* If it is a BIND(C) function, make sure the return value is a
3461          scalar value.  The previous tests in this function made sure
3462          the type is interoperable.  */
3463       if (bind_c_function && tmp_sym->as != NULL)
3464         gfc_error ("Return type of BIND(C) function '%s' at %L cannot "
3465                    "be an array", tmp_sym->name, &(tmp_sym->declared_at));
3466
3467       /* BIND(C) functions can not return a character string.  */
3468       if (bind_c_function && tmp_sym->ts.type == BT_CHARACTER)
3469         if (tmp_sym->ts.cl == NULL || tmp_sym->ts.cl->length == NULL
3470             || tmp_sym->ts.cl->length->expr_type != EXPR_CONSTANT
3471             || mpz_cmp_si (tmp_sym->ts.cl->length->value.integer, 1) != 0)
3472           gfc_error ("Return type of BIND(C) function '%s' at %L cannot "
3473                          "be a character string", tmp_sym->name,
3474                          &(tmp_sym->declared_at));
3475     }
3476
3477   /* See if the symbol has been marked as private.  If it has, make sure
3478      there is no binding label and warn the user if there is one.  */
3479   if (tmp_sym->attr.access == ACCESS_PRIVATE
3480       && tmp_sym->binding_label[0] != '\0')
3481       /* Use gfc_warning_now because we won't say that the symbol fails
3482          just because of this.  */
3483       gfc_warning_now ("Symbol '%s' at %L is marked PRIVATE but has been "
3484                        "given the binding label '%s'", tmp_sym->name,
3485                        &(tmp_sym->declared_at), tmp_sym->binding_label);
3486
3487   return retval;
3488 }
3489
3490
3491 /* Set the appropriate fields for a symbol that's been declared as
3492    BIND(C) (the is_bind_c flag and the binding label), and verify that
3493    the type is C interoperable.  Errors are reported by the functions
3494    used to set/test these fields.  */
3495
3496 gfc_try
3497 set_verify_bind_c_sym (gfc_symbol *tmp_sym, int num_idents)
3498 {
3499   gfc_try retval = SUCCESS;
3500   
3501   /* TODO: Do we need to make sure the vars aren't marked private?  */
3502
3503   /* Set the is_bind_c bit in symbol_attribute.  */
3504   gfc_add_is_bind_c (&(tmp_sym->attr), tmp_sym->name, &gfc_current_locus, 0);
3505
3506   if (set_binding_label (tmp_sym->binding_label, tmp_sym->name, 
3507                          num_idents) != SUCCESS)
3508     return FAILURE;
3509
3510   return retval;
3511 }
3512
3513
3514 /* Set the fields marking the given common block as BIND(C), including
3515    a binding label, and report any errors encountered.  */
3516
3517 gfc_try
3518 set_verify_bind_c_com_block (gfc_common_head *com_block, int num_idents)
3519 {
3520   gfc_try retval = SUCCESS;
3521   
3522   /* destLabel, common name, typespec (which may have binding label).  */
3523   if (set_binding_label (com_block->binding_label, com_block->name, num_idents)
3524       != SUCCESS)
3525     return FAILURE;
3526
3527   /* Set the given common block (com_block) to being bind(c) (1).  */
3528   set_com_block_bind_c (com_block, 1);
3529
3530   return retval;
3531 }
3532
3533
3534 /* Retrieve the list of one or more identifiers that the given bind(c)
3535    attribute applies to.  */
3536
3537 gfc_try
3538 get_bind_c_idents (void)
3539 {
3540   char name[GFC_MAX_SYMBOL_LEN + 1];
3541   int num_idents = 0;
3542   gfc_symbol *tmp_sym = NULL;
3543   match found_id;
3544   gfc_common_head *com_block = NULL;
3545   
3546   if (gfc_match_name (name) == MATCH_YES)
3547     {
3548       found_id = MATCH_YES;
3549       gfc_get_ha_symbol (name, &tmp_sym);
3550     }
3551   else if (match_common_name (name) == MATCH_YES)
3552     {
3553       found_id = MATCH_YES;
3554       com_block = gfc_get_common (name, 0);
3555     }
3556   else
3557     {
3558       gfc_error ("Need either entity or common block name for "
3559                  "attribute specification statement at %C");
3560       return FAILURE;
3561     }
3562    
3563   /* Save the current identifier and look for more.  */
3564   do
3565     {
3566       /* Increment the number of identifiers found for this spec stmt.  */
3567       num_idents++;
3568
3569       /* Make sure we have a sym or com block, and verify that it can
3570          be bind(c).  Set the appropriate field(s) and look for more
3571          identifiers.  */
3572       if (tmp_sym != NULL || com_block != NULL)         
3573         {
3574           if (tmp_sym != NULL)
3575             {
3576               if (set_verify_bind_c_sym (tmp_sym, num_idents)
3577                   != SUCCESS)
3578                 return FAILURE;
3579             }
3580           else
3581             {
3582               if (set_verify_bind_c_com_block(com_block, num_idents)
3583                   != SUCCESS)
3584                 return FAILURE;
3585             }
3586          
3587           /* Look to see if we have another identifier.  */
3588           tmp_sym = NULL;
3589           if (gfc_match_eos () == MATCH_YES)
3590             found_id = MATCH_NO;
3591           else if (gfc_match_char (',') != MATCH_YES)
3592             found_id = MATCH_NO;
3593           else if (gfc_match_name (name) == MATCH_YES)
3594             {
3595               found_id = MATCH_YES;
3596               gfc_get_ha_symbol (name, &tmp_sym);
3597             }
3598           else if (match_common_name (name) == MATCH_YES)
3599             {
3600               found_id = MATCH_YES;
3601               com_block = gfc_get_common (name, 0);
3602             }
3603           else
3604             {
3605               gfc_error ("Missing entity or common block name for "
3606                          "attribute specification statement at %C");
3607               return FAILURE;
3608             }
3609         }
3610       else
3611         {
3612           gfc_internal_error ("Missing symbol");
3613         }
3614     } while (found_id == MATCH_YES);
3615
3616   /* if we get here we were successful */
3617   return SUCCESS;
3618 }
3619
3620
3621 /* Try and match a BIND(C) attribute specification statement.  */
3622    
3623 match
3624 gfc_match_bind_c_stmt (void)
3625 {
3626   match found_match = MATCH_NO;
3627   gfc_typespec *ts;
3628
3629   ts = &current_ts;
3630   
3631   /* This may not be necessary.  */
3632   gfc_clear_ts (ts);
3633   /* Clear the temporary binding label holder.  */
3634   curr_binding_label[0] = '\0';
3635
3636   /* Look for the bind(c).  */
3637   found_match = gfc_match_bind_c (NULL, true);
3638
3639   if (found_match == MATCH_YES)
3640     {
3641       /* Look for the :: now, but it is not required.  */
3642       gfc_match (" :: ");
3643
3644       /* Get the identifier(s) that needs to be updated.  This may need to
3645          change to hand the flag(s) for the attr specified so all identifiers
3646          found can have all appropriate parts updated (assuming that the same
3647          spec stmt can have multiple attrs, such as both bind(c) and
3648          allocatable...).  */
3649       if (get_bind_c_idents () != SUCCESS)
3650         /* Error message should have printed already.  */
3651         return MATCH_ERROR;
3652     }
3653
3654   return found_match;
3655 }
3656
3657
3658 /* Match a data declaration statement.  */
3659
3660 match
3661 gfc_match_data_decl (void)
3662 {
3663   gfc_symbol *sym;
3664   match m;
3665   int elem;
3666
3667   num_idents_on_line = 0;
3668   
3669   m = gfc_match_type_spec (&current_ts, 0);
3670   if (m != MATCH_YES)
3671     return m;
3672
3673   if (current_ts.type == BT_DERIVED && gfc_current_state () != COMP_DERIVED)
3674     {
3675       sym = gfc_use_derived (current_ts.derived);
3676
3677       if (sym == NULL)
3678         {
3679           m = MATCH_ERROR;
3680           goto cleanup;
3681         }
3682
3683       current_ts.derived = sym;
3684     }
3685
3686   m = match_attr_spec ();
3687   if (m == MATCH_ERROR)
3688     {
3689       m = MATCH_NO;
3690       goto cleanup;
3691     }
3692
3693   if (current_ts.type == BT_DERIVED && current_ts.derived->components == NULL
3694       && !current_ts.derived->attr.zero_comp)
3695     {
3696
3697       if (current_attr.pointer && gfc_current_state () == COMP_DERIVED)
3698         goto ok;
3699
3700       gfc_find_symbol (current_ts.derived->name,
3701                        current_ts.derived->ns->parent, 1, &sym);
3702
3703       /* Any symbol that we find had better be a type definition
3704          which has its components defined.  */
3705       if (sym != NULL && sym->attr.flavor == FL_DERIVED
3706           && (current_ts.derived->components != NULL
3707               || current_ts.derived->attr.zero_comp))
3708         goto ok;
3709
3710       /* Now we have an error, which we signal, and then fix up
3711          because the knock-on is plain and simple confusing.  */
3712       gfc_error_now ("Derived type at %C has not been previously defined "
3713                      "and so cannot appear in a derived type definition");
3714       current_attr.pointer = 1;
3715       goto ok;
3716     }
3717
3718 ok:
3719   /* If we have an old-style character declaration, and no new-style
3720      attribute specifications, then there a comma is optional between
3721      the type specification and the variable list.  */
3722   if (m == MATCH_NO && current_ts.type == BT_CHARACTER && old_char_selector)
3723     gfc_match_char (',');
3724
3725   /* Give the types/attributes to symbols that follow. Give the element
3726      a number so that repeat character length expressions can be copied.  */
3727   elem = 1;
3728   for (;;)
3729     {
3730       num_idents_on_line++;
3731       m = variable_decl (elem++);
3732       if (m == MATCH_ERROR)
3733         goto cleanup;
3734       if (m == MATCH_NO)
3735         break;
3736
3737       if (gfc_match_eos () == MATCH_YES)
3738         goto cleanup;
3739       if (gfc_match_char (',') != MATCH_YES)
3740         break;
3741     }
3742
3743   if (gfc_error_flag_test () == 0)
3744     gfc_error ("Syntax error in data declaration at %C");
3745   m = MATCH_ERROR;
3746
3747   gfc_free_data_all (gfc_current_ns);
3748
3749 cleanup:
3750   gfc_free_array_spec (current_as);
3751   current_as = NULL;
3752   return m;
3753 }
3754
3755
3756 /* Match a prefix associated with a function or subroutine
3757    declaration.  If the typespec pointer is nonnull, then a typespec
3758    can be matched.  Note that if nothing matches, MATCH_YES is
3759    returned (the null string was matched).  */
3760
3761 match
3762 gfc_match_prefix (gfc_typespec *ts)
3763 {
3764   bool seen_type;
3765
3766   gfc_clear_attr (&current_attr);
3767   seen_type = 0;
3768
3769   gcc_assert (!gfc_matching_prefix);
3770   gfc_matching_prefix = true;
3771
3772 loop:
3773   if (!seen_type && ts != NULL
3774       && gfc_match_type_spec (ts, 0) == MATCH_YES
3775       && gfc_match_space () == MATCH_YES)
3776     {
3777
3778       seen_type = 1;
3779       goto loop;
3780     }
3781
3782   if (gfc_match ("elemental% ") == MATCH_YES)
3783     {
3784       if (gfc_add_elemental (&current_attr, NULL) == FAILURE)
3785         goto error;
3786
3787       goto loop;
3788     }
3789
3790   if (gfc_match ("pure% ") == MATCH_YES)
3791     {
3792       if (gfc_add_pure (&current_attr, NULL) == FAILURE)
3793         goto error;
3794
3795       goto loop;
3796     }
3797
3798   if (gfc_match ("recursive% ") == MATCH_YES)
3799     {
3800       if (gfc_add_recursive (&current_attr, NULL) == FAILURE)
3801         goto error;
3802
3803       goto loop;
3804     }
3805
3806   /* At this point, the next item is not a prefix.  */
3807   gcc_assert (gfc_matching_prefix);
3808   gfc_matching_prefix = false;
3809   return MATCH_YES;
3810
3811 error:
3812   gcc_assert (gfc_matching_prefix);
3813   gfc_matching_prefix = false;
3814   return MATCH_ERROR;
3815 }
3816
3817
3818 /* Copy attributes matched by gfc_match_prefix() to attributes on a symbol.  */
3819
3820 static gfc_try
3821 copy_prefix (symbol_attribute *dest, locus *where)
3822 {
3823   if (current_attr.pure && gfc_add_pure (dest, where) == FAILURE)
3824     return FAILURE;
3825
3826   if (current_attr.elemental && gfc_add_elemental (dest, where) == FAILURE)
3827     return FAILURE;
3828
3829   if (current_attr.recursive && gfc_add_recursive (dest, where) == FAILURE)
3830     return FAILURE;
3831
3832   return SUCCESS;
3833 }
3834
3835
3836 /* Match a formal argument list.  */
3837
3838 match
3839 gfc_match_formal_arglist (gfc_symbol *progname, int st_flag, int null_flag)
3840 {
3841   gfc_formal_arglist *head, *tail, *p, *q;
3842   char name[GFC_MAX_SYMBOL_LEN + 1];
3843   gfc_symbol *sym;
3844   match m;
3845
3846   head = tail = NULL;
3847
3848   if (gfc_match_char ('(') != MATCH_YES)
3849     {
3850       if (null_flag)
3851         goto ok;
3852       return MATCH_NO;
3853     }
3854
3855   if (gfc_match_char (')') == MATCH_YES)
3856     goto ok;
3857
3858   for (;;)
3859     {
3860       if (gfc_match_char ('*') == MATCH_YES)
3861         sym = NULL;
3862       else
3863         {
3864           m = gfc_match_name (name);
3865           if (m != MATCH_YES)
3866             goto cleanup;
3867
3868           if (gfc_get_symbol (name, NULL, &sym))
3869             goto cleanup;
3870         }
3871
3872       p = gfc_get_formal_arglist ();
3873
3874       if (head == NULL)
3875         head = tail = p;
3876       else
3877         {
3878           tail->next = p;
3879           tail = p;
3880         }
3881
3882       tail->sym = sym;
3883
3884       /* We don't add the VARIABLE flavor because the name could be a
3885          dummy procedure.  We don't apply these attributes to formal
3886          arguments of statement functions.  */
3887       if (sym != NULL && !st_flag
3888           && (gfc_add_dummy (&sym->attr, sym->name, NULL) == FAILURE
3889               || gfc_missing_attr (&sym->attr, NULL) == FAILURE))
3890         {
3891           m = MATCH_ERROR;
3892           goto cleanup;
3893         }
3894
3895       /* The name of a program unit can be in a different namespace,
3896          so check for it explicitly.  After the statement is accepted,
3897          the name is checked for especially in gfc_get_symbol().  */
3898       if (gfc_new_block != NULL && sym != NULL
3899           && strcmp (sym->name, gfc_new_block->name) == 0)
3900         {
3901           gfc_error ("Name '%s' at %C is the name of the procedure",
3902                      sym->name);
3903           m = MATCH_ERROR;
3904           goto cleanup;
3905         }
3906
3907       if (gfc_match_char (')') == MATCH_YES)
3908         goto ok;
3909
3910       m = gfc_match_char (',');
3911       if (m != MATCH_YES)
3912         {
3913           gfc_error ("Unexpected junk in formal argument list at %C");
3914           goto cleanup;
3915         }
3916     }
3917
3918 ok:
3919   /* Check for duplicate symbols in the formal argument list.  */
3920   if (head != NULL)
3921     {
3922       for (p = head; p->next; p = p->next)
3923         {
3924           if (p->sym == NULL)
3925             continue;
3926
3927           for (q = p->next; q; q = q->next)
3928             if (p->sym == q->sym)
3929               {
3930                 gfc_error ("Duplicate symbol '%s' in formal argument list "
3931                            "at %C", p->sym->name);
3932
3933                 m = MATCH_ERROR;
3934                 goto cleanup;
3935               }
3936         }
3937     }
3938
3939   if (gfc_add_explicit_interface (progname, IFSRC_DECL, head, NULL)
3940       == FAILURE)
3941     {
3942       m = MATCH_ERROR;
3943       goto cleanup;
3944     }
3945
3946   return MATCH_YES;
3947
3948 cleanup:
3949   gfc_free_formal_arglist (head);
3950   return m;
3951 }
3952
3953
3954 /* Match a RESULT specification following a function declaration or
3955    ENTRY statement.  Also matches the end-of-statement.  */
3956
3957 static match
3958 match_result (gfc_symbol *function, gfc_symbol **result)
3959 {
3960   char name[GFC_MAX_SYMBOL_LEN + 1];
3961   gfc_symbol *r;
3962   match m;
3963
3964   if (gfc_match (" result (") != MATCH_YES)
3965     return MATCH_NO;
3966
3967   m = gfc_match_name (name);
3968   if (m != MATCH_YES)
3969     return m;
3970
3971   /* Get the right paren, and that's it because there could be the
3972      bind(c) attribute after the result clause.  */
3973   if (gfc_match_char(')') != MATCH_YES)
3974     {
3975      /* TODO: should report the missing right paren here.  */
3976       return MATCH_ERROR;
3977     }
3978
3979   if (strcmp (function->name, name) == 0)
3980     {
3981       gfc_error ("RESULT variable at %C must be different than function name");
3982       return MATCH_ERROR;
3983     }
3984
3985   if (gfc_get_symbol (name, NULL, &r))
3986     return MATCH_ERROR;
3987
3988   if (gfc_add_flavor (&r->attr, FL_VARIABLE, r->name, NULL) == FAILURE
3989       || gfc_add_result (&r->attr, r->name, NULL) == FAILURE)
3990     return MATCH_ERROR;
3991
3992   *result = r;
3993
3994   return MATCH_YES;
3995 }
3996
3997
3998 /* Match a function suffix, which could be a combination of a result
3999    clause and BIND(C), either one, or neither.  The draft does not
4000    require them to come in a specific order.  */
4001
4002 match
4003 gfc_match_suffix (gfc_symbol *sym, gfc_symbol **result)
4004 {
4005   match is_bind_c;   /* Found bind(c).  */
4006   match is_result;   /* Found result clause.  */
4007   match found_match; /* Status of whether we've found a good match.  */
4008   char peek_char;    /* Character we're going to peek at.  */
4009   bool allow_binding_name;
4010
4011   /* Initialize to having found nothing.  */
4012   found_match = MATCH_NO;
4013   is_bind_c = MATCH_NO; 
4014   is_result = MATCH_NO;
4015
4016   /* Get the next char to narrow between result and bind(c).  */
4017   gfc_gobble_whitespace ();
4018   peek_char = gfc_peek_ascii_char ();
4019
4020   /* C binding names are not allowed for internal procedures.  */
4021   if (gfc_current_state () == COMP_CONTAINS
4022       && sym->ns->proc_name->attr.flavor != FL_MODULE)
4023     allow_binding_name = false;
4024   else
4025     allow_binding_name = true;
4026
4027   switch (peek_char)
4028     {
4029     case 'r':
4030       /* Look for result clause.  */
4031       is_result = match_result (sym, result);
4032       if (is_result == MATCH_YES)
4033         {
4034           /* Now see if there is a bind(c) after it.  */
4035           is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
4036           /* We've found the result clause and possibly bind(c).  */
4037           found_match = MATCH_YES;
4038         }
4039       else
4040         /* This should only be MATCH_ERROR.  */
4041         found_match = is_result; 
4042       break;
4043     case 'b':
4044       /* Look for bind(c) first.  */
4045       is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
4046       if (is_bind_c == MATCH_YES)
4047         {
4048           /* Now see if a result clause followed it.  */
4049           is_result = match_result (sym, result);
4050           found_match = MATCH_YES;
4051         }
4052       else
4053         {
4054           /* Should only be a MATCH_ERROR if we get here after seeing 'b'.  */
4055           found_match = MATCH_ERROR;
4056         }
4057       break;
4058     default:
4059       gfc_error ("Unexpected junk after function declaration at %C");
4060       found_match = MATCH_ERROR;
4061       break;
4062     }
4063
4064   if (is_bind_c == MATCH_YES)
4065     {
4066       /* Fortran 2008 draft allows BIND(C) for internal procedures.  */
4067       if (gfc_current_state () == COMP_CONTAINS
4068           && sym->ns->proc_name->attr.flavor != FL_MODULE
4069           && gfc_notify_std (GFC_STD_F2008, "Fortran 2008: BIND(C) attribute "
4070                              "at %L may not be specified for an internal "
4071                              "procedure", &gfc_current_locus)
4072              == FAILURE)
4073         return MATCH_ERROR;
4074
4075       if (gfc_add_is_bind_c (&(sym->attr), sym->name, &gfc_current_locus, 1)
4076           == FAILURE)
4077         return MATCH_ERROR;
4078     }
4079   
4080   return found_match;
4081 }
4082
4083
4084 /* Match a PROCEDURE declaration (R1211).  */
4085
4086 static match
4087 match_procedure_decl (void)
4088 {
4089   match m;
4090   locus old_loc, entry_loc;
4091   gfc_symbol *sym, *proc_if = NULL;
4092   int num;
4093   gfc_expr *initializer = NULL;
4094
4095   old_loc = entry_loc = gfc_current_locus;
4096
4097   gfc_clear_ts (&current_ts);
4098
4099   if (gfc_match (" (") != MATCH_YES)
4100     {
4101       gfc_current_locus = entry_loc;
4102       return MATCH_NO;
4103     }
4104
4105   /* Get the type spec. for the procedure interface.  */
4106   old_loc = gfc_current_locus;
4107   m = gfc_match_type_spec (&current_ts, 0);
4108   if (m == MATCH_YES || (m == MATCH_NO && gfc_peek_ascii_char () == ')'))
4109     goto got_ts;
4110
4111   if (m == MATCH_ERROR)
4112     return m;
4113
4114   gfc_current_locus = old_loc;
4115
4116   /* Get the name of the procedure or abstract interface
4117   to inherit the interface from.  */
4118   m = gfc_match_symbol (&proc_if, 1);
4119
4120   if (m == MATCH_NO)
4121     goto syntax;
4122   else if (m == MATCH_ERROR)
4123     return m;
4124
4125   /* Various interface checks.  */
4126   if (proc_if)
4127     {
4128       /* Resolve interface if possible. That way, attr.procedure is only set
4129          if it is declared by a later procedure-declaration-stmt, which is
4130          invalid per C1212.  */
4131       while (proc_if->ts.interface)
4132         proc_if = proc_if->ts.interface;
4133
4134       if (proc_if->generic)
4135         {
4136           gfc_error ("Interface '%s' at %C may not be generic", proc_if->name);
4137           return MATCH_ERROR;
4138         }
4139       if (proc_if->attr.proc == PROC_ST_FUNCTION)
4140         {
4141           gfc_error ("Interface '%s' at %C may not be a statement function",
4142                     proc_if->name);
4143           return MATCH_ERROR;
4144         }
4145       /* Handle intrinsic procedures.  */
4146       if (!(proc_if->attr.external || proc_if->attr.use_assoc
4147             || proc_if->attr.if_source == IFSRC_IFBODY)
4148           && (gfc_is_intrinsic (proc_if, 0, gfc_current_locus)
4149               || gfc_is_intrinsic (proc_if, 1, gfc_current_locus)))
4150         proc_if->attr.intrinsic = 1;
4151       if (proc_if->attr.intrinsic
4152           && !gfc_intrinsic_actual_ok (proc_if->name, 0))
4153         {
4154           gfc_error ("Intrinsic procedure '%s' not allowed "
4155                     "in PROCEDURE statement at %C", proc_if->name);
4156           return MATCH_ERROR;
4157         }
4158     }
4159
4160 got_ts:
4161   if (gfc_match (" )") != MATCH_YES)
4162     {
4163       gfc_current_locus = entry_loc;
4164       return MATCH_NO;
4165     }
4166
4167   /* Parse attributes.  */
4168   m = match_attr_spec();
4169   if (m == MATCH_ERROR)
4170     return MATCH_ERROR;
4171
4172   /* Get procedure symbols.  */
4173   for(num=1;;num++)
4174     {
4175       m = gfc_match_symbol (&sym, 0);
4176       if (m == MATCH_NO)
4177         goto syntax;
4178       else if (m == MATCH_ERROR)
4179         return m;
4180
4181       /* Add current_attr to the symbol attributes.  */
4182       if (gfc_copy_attr (&sym->attr, &current_attr, NULL) == FAILURE)
4183         return MATCH_ERROR;
4184
4185       if (sym->attr.is_bind_c)
4186         {
4187           /* Check for C1218.  */
4188           if (!proc_if || !proc_if->attr.is_bind_c)
4189             {
4190               gfc_error ("BIND(C) attribute at %C requires "
4191                         "an interface with BIND(C)");
4192               return MATCH_ERROR;
4193             }
4194           /* Check for C1217.  */
4195           if (has_name_equals && sym->attr.pointer)
4196             {
4197               gfc_error ("BIND(C) procedure with NAME may not have "
4198                         "POINTER attribute at %C");
4199               return MATCH_ERROR;
4200             }
4201           if (has_name_equals && sym->attr.dummy)
4202             {
4203               gfc_error ("Dummy procedure at %C may not have "
4204                         "BIND(C) attribute with NAME");
4205               return MATCH_ERROR;
4206             }
4207           /* Set binding label for BIND(C).  */
4208           if (set_binding_label (sym->binding_label, sym->name, num) != SUCCESS)
4209             return MATCH_ERROR;
4210         }
4211
4212       if (gfc_add_external (&sym->attr, NULL) == FAILURE)
4213         return MATCH_ERROR;
4214       if (gfc_add_proc (&sym->attr, sym->name, NULL) == FAILURE)
4215         return MATCH_ERROR;
4216
4217       /* Set interface.  */
4218       if (proc_if != NULL)
4219         {
4220           sym->ts.interface = proc_if;
4221           sym->attr.untyped = 1;
4222         }
4223       else if (current_ts.type != BT_UNKNOWN)
4224         {
4225           sym->ts = current_ts;
4226           sym->ts.interface = gfc_new_symbol ("", gfc_current_ns);
4227           sym->ts.interface->ts = current_ts;
4228           sym->ts.interface->attr.function = 1;
4229           sym->attr.function = sym->ts.interface->attr.function;
4230         }
4231
4232       if (gfc_match (" =>") == MATCH_YES)
4233         {
4234           if (!current_attr.pointer)
4235             {
4236               gfc_error ("Initialization at %C isn't for a pointer variable");
4237               m = MATCH_ERROR;
4238               goto cleanup;
4239             }
4240
4241           m = gfc_match_null (&initializer);
4242           if (m == MATCH_NO)
4243             {
4244               gfc_error ("Pointer initialization requires a NULL() at %C");
4245               m = MATCH_ERROR;
4246             }
4247
4248           if (gfc_pure (NULL))
4249             {
4250               gfc_error ("Initialization of pointer at %C is not allowed in "
4251                          "a PURE procedure");
4252               m = MATCH_ERROR;
4253             }
4254
4255           if (m != MATCH_YES)
4256             goto cleanup;
4257
4258           if (add_init_expr_to_sym (sym->name, &initializer, &gfc_current_locus)
4259               != SUCCESS)
4260             goto cleanup;
4261
4262         }
4263
4264       gfc_set_sym_referenced (sym);
4265
4266       if (gfc_match_eos () == MATCH_YES)
4267         return MATCH_YES;
4268       if (gfc_match_char (',') != MATCH_YES)
4269         goto syntax;
4270     }
4271
4272 syntax:
4273   gfc_error ("Syntax error in PROCEDURE statement at %C");
4274   return MATCH_ERROR;
4275
4276 cleanup:
4277   /* Free stuff up and return.  */
4278   gfc_free_expr (initializer);
4279   return m;
4280 }
4281
4282
4283 /* Match a PROCEDURE declaration inside an interface (R1206).  */
4284
4285 static match
4286 match_procedure_in_interface (void)
4287 {
4288   match m;
4289   gfc_symbol *sym;
4290   char name[GFC_MAX_SYMBOL_LEN + 1];
4291
4292   if (current_interface.type == INTERFACE_NAMELESS
4293       || current_interface.type == INTERFACE_ABSTRACT)
4294     {
4295       gfc_error ("PROCEDURE at %C must be in a generic interface");
4296       return MATCH_ERROR;
4297     }
4298
4299   for(;;)
4300     {
4301       m = gfc_match_name (name);
4302       if (m == MATCH_NO)
4303         goto syntax;
4304       else if (m == MATCH_ERROR)
4305         return m;
4306       if (gfc_get_symbol (name, gfc_current_ns->parent, &sym))
4307         return MATCH_ERROR;
4308
4309       if (gfc_add_interface (sym) == FAILURE)
4310         return MATCH_ERROR;
4311
4312       if (gfc_match_eos () == MATCH_YES)
4313         break;
4314       if (gfc_match_char (',') != MATCH_YES)
4315         goto syntax;
4316     }
4317
4318   return MATCH_YES;
4319
4320 syntax:
4321   gfc_error ("Syntax error in PROCEDURE statement at %C");
4322   return MATCH_ERROR;
4323 }
4324
4325
4326 /* General matcher for PROCEDURE declarations.  */
4327
4328 static match match_procedure_in_type (void);
4329
4330 match
4331 gfc_match_procedure (void)
4332 {
4333   match m;
4334
4335   switch (gfc_current_state ())
4336     {
4337     case COMP_NONE:
4338     case COMP_PROGRAM:
4339     case COMP_MODULE:
4340     case COMP_SUBROUTINE:
4341     case COMP_FUNCTION:
4342       m = match_procedure_decl ();
4343       break;
4344     case COMP_INTERFACE:
4345       m = match_procedure_in_interface ();
4346       break;
4347     case COMP_DERIVED:
4348       gfc_error ("Fortran 2003: Procedure components at %C are not yet"
4349                  " implemented in gfortran");
4350       return MATCH_ERROR;
4351     case COMP_DERIVED_CONTAINS:
4352       m = match_procedure_in_type ();
4353       break;
4354     default:
4355       return MATCH_NO;
4356     }
4357
4358   if (m != MATCH_YES)
4359     return m;
4360
4361   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PROCEDURE statement at %C")
4362       == FAILURE)
4363     return MATCH_ERROR;
4364
4365   return m;
4366 }
4367
4368
4369 /* Warn if a matched procedure has the same name as an intrinsic; this is
4370    simply a wrapper around gfc_warn_intrinsic_shadow that interprets the current
4371    parser-state-stack to find out whether we're in a module.  */
4372
4373 static void
4374 warn_intrinsic_shadow (const gfc_symbol* sym, bool func)
4375 {
4376   bool in_module;
4377
4378   in_module = (gfc_state_stack->previous
4379                && gfc_state_stack->previous->state == COMP_MODULE);
4380
4381   gfc_warn_intrinsic_shadow (sym, in_module, func);
4382 }
4383
4384
4385 /* Match a function declaration.  */
4386
4387 match
4388 gfc_match_function_decl (void)
4389 {
4390   char name[GFC_MAX_SYMBOL_LEN + 1];
4391   gfc_symbol *sym, *result;
4392   locus old_loc;
4393   match m;
4394   match suffix_match;
4395   match found_match; /* Status returned by match func.  */  
4396
4397   if (gfc_current_state () != COMP_NONE
4398       && gfc_current_state () != COMP_INTERFACE
4399       && gfc_current_state () != COMP_CONTAINS)
4400     return MATCH_NO;
4401
4402   gfc_clear_ts (&current_ts);
4403
4404   old_loc = gfc_current_locus;
4405
4406   m = gfc_match_prefix (&current_ts);
4407   if (m != MATCH_YES)
4408     {
4409       gfc_current_locus = old_loc;
4410       return m;
4411     }
4412
4413   if (gfc_match ("function% %n", name) != MATCH_YES)
4414     {
4415       gfc_current_locus = old_loc;
4416       return MATCH_NO;
4417     }
4418   if (get_proc_name (name, &sym, false))
4419     return MATCH_ERROR;
4420   gfc_new_block = sym;
4421
4422   m = gfc_match_formal_arglist (sym, 0, 0);
4423   if (m == MATCH_NO)
4424     {
4425       gfc_error ("Expected formal argument list in function "
4426                  "definition at %C");
4427       m = MATCH_ERROR;
4428       goto cleanup;
4429     }
4430   else if (m == MATCH_ERROR)
4431     goto cleanup;
4432
4433   result = NULL;
4434
4435   /* According to the draft, the bind(c) and result clause can
4436      come in either order after the formal_arg_list (i.e., either
4437      can be first, both can exist together or by themselves or neither
4438      one).  Therefore, the match_result can't match the end of the
4439      string, and check for the bind(c) or result clause in either order.  */
4440   found_match = gfc_match_eos ();
4441
4442   /* Make sure that it isn't already declared as BIND(C).  If it is, it
4443      must have been marked BIND(C) with a BIND(C) attribute and that is
4444      not allowed for procedures.  */
4445   if (sym->attr.is_bind_c == 1)
4446     {
4447       sym->attr.is_bind_c = 0;
4448       if (sym->old_symbol != NULL)
4449         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4450                        "variables or common blocks",
4451                        &(sym->old_symbol->declared_at));
4452       else
4453         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4454                        "variables or common blocks", &gfc_current_locus);
4455     }
4456
4457   if (found_match != MATCH_YES)
4458     {
4459       /* If we haven't found the end-of-statement, look for a suffix.  */
4460       suffix_match = gfc_match_suffix (sym, &result);
4461       if (suffix_match == MATCH_YES)
4462         /* Need to get the eos now.  */
4463         found_match = gfc_match_eos ();
4464       else
4465         found_match = suffix_match;
4466     }
4467
4468   if(found_match != MATCH_YES)
4469     m = MATCH_ERROR;
4470   else
4471     {
4472       /* Make changes to the symbol.  */
4473       m = MATCH_ERROR;
4474       
4475       if (gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
4476         goto cleanup;
4477       
4478       if (gfc_missing_attr (&sym->attr, NULL) == FAILURE
4479           || copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
4480         goto cleanup;
4481
4482       if (current_ts.type != BT_UNKNOWN && sym->ts.type != BT_UNKNOWN
4483           && !sym->attr.implicit_type)
4484         {
4485           gfc_error ("Function '%s' at %C already has a type of %s", name,
4486                      gfc_basic_typename (sym->ts.type));
4487           goto cleanup;
4488         }
4489
4490       /* Delay matching the function characteristics until after the
4491          specification block by signalling kind=-1.  */
4492       sym->declared_at = old_loc;
4493       if (current_ts.type != BT_UNKNOWN)
4494         current_ts.kind = -1;
4495       else
4496         current_ts.kind = 0;
4497
4498       if (result == NULL)
4499         {
4500           sym->ts = current_ts;
4501           sym->result = sym;
4502         }
4503       else
4504         {
4505           result->ts = current_ts;
4506           sym->result = result;
4507         }
4508
4509       /* Warn if this procedure has the same name as an intrinsic.  */
4510       warn_intrinsic_shadow (sym, true);
4511
4512       return MATCH_YES;
4513     }
4514
4515 cleanup:
4516   gfc_current_locus = old_loc;
4517   return m;
4518 }
4519
4520
4521 /* This is mostly a copy of parse.c(add_global_procedure) but modified to
4522    pass the name of the entry, rather than the gfc_current_block name, and
4523    to return false upon finding an existing global entry.  */
4524
4525 static bool
4526 add_global_entry (const char *name, int sub)
4527 {
4528   gfc_gsymbol *s;
4529   unsigned int type;
4530
4531   s = gfc_get_gsymbol(name);
4532   type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
4533
4534   if (s->defined
4535       || (s->type != GSYM_UNKNOWN
4536           && s->type != type))
4537     gfc_global_used(s, NULL);
4538   else
4539     {
4540       s->type = type;
4541       s->where = gfc_current_locus;
4542       s->defined = 1;
4543       return true;
4544     }
4545   return false;
4546 }
4547
4548
4549 /* Match an ENTRY statement.  */
4550
4551 match
4552 gfc_match_entry (void)
4553 {
4554   gfc_symbol *proc;
4555   gfc_symbol *result;
4556   gfc_symbol *entry;
4557   char name[GFC_MAX_SYMBOL_LEN + 1];
4558   gfc_compile_state state;
4559   match m;
4560   gfc_entry_list *el;
4561   locus old_loc;
4562   bool module_procedure;
4563   char peek_char;
4564   match is_bind_c;
4565
4566   m = gfc_match_name (name);
4567   if (m != MATCH_YES)
4568     return m;
4569
4570   state = gfc_current_state ();
4571   if (state != COMP_SUBROUTINE && state != COMP_FUNCTION)
4572     {
4573       switch (state)
4574         {
4575           case COMP_PROGRAM:
4576             gfc_error ("ENTRY statement at %C cannot appear within a PROGRAM");
4577             break;
4578           case COMP_MODULE:
4579             gfc_error ("ENTRY statement at %C cannot appear within a MODULE");
4580             break;
4581           case COMP_BLOCK_DATA:
4582             gfc_error ("ENTRY statement at %C cannot appear within "
4583                        "a BLOCK DATA");
4584             break;
4585           case COMP_INTERFACE:
4586             gfc_error ("ENTRY statement at %C cannot appear within "
4587                        "an INTERFACE");
4588             break;
4589           case COMP_DERIVED:
4590             gfc_error ("ENTRY statement at %C cannot appear within "
4591                        "a DERIVED TYPE block");
4592             break;
4593           case COMP_IF:
4594             gfc_error ("ENTRY statement at %C cannot appear within "
4595                        "an IF-THEN block");
4596             break;
4597           case COMP_DO:
4598             gfc_error ("ENTRY statement at %C cannot appear within "
4599                        "a DO block");
4600             break;
4601           case COMP_SELECT:
4602             gfc_error ("ENTRY statement at %C cannot appear within "
4603                        "a SELECT block");
4604             break;
4605           case COMP_FORALL:
4606             gfc_error ("ENTRY statement at %C cannot appear within "
4607                        "a FORALL block");
4608             break;
4609           case COMP_WHERE:
4610             gfc_error ("ENTRY statement at %C cannot appear within "
4611                        "a WHERE block");
4612             break;
4613           case COMP_CONTAINS:
4614             gfc_error ("ENTRY statement at %C cannot appear within "
4615                        "a contained subprogram");
4616             break;
4617           default:
4618             gfc_internal_error ("gfc_match_entry(): Bad state");
4619         }
4620       return MATCH_ERROR;
4621     }
4622
4623   module_procedure = gfc_current_ns->parent != NULL
4624                    && gfc_current_ns->parent->proc_name
4625                    && gfc_current_ns->parent->proc_name->attr.flavor
4626                       == FL_MODULE;
4627
4628   if (gfc_current_ns->parent != NULL
4629       && gfc_current_ns->parent->proc_name
4630       && !module_procedure)
4631     {
4632       gfc_error("ENTRY statement at %C cannot appear in a "
4633                 "contained procedure");
4634       return MATCH_ERROR;
4635     }
4636
4637   /* Module function entries need special care in get_proc_name
4638      because previous references within the function will have
4639      created symbols attached to the current namespace.  */
4640   if (get_proc_name (name, &entry,
4641                      gfc_current_ns->parent != NULL
4642                      && module_procedure
4643                      && gfc_current_ns->proc_name->attr.function))
4644     return MATCH_ERROR;
4645
4646   proc = gfc_current_block ();
4647
4648   /* Make sure that it isn't already declared as BIND(C).  If it is, it
4649      must have been marked BIND(C) with a BIND(C) attribute and that is
4650      not allowed for procedures.  */
4651   if (entry->attr.is_bind_c == 1)
4652     {
4653       entry->attr.is_bind_c = 0;
4654       if (entry->old_symbol != NULL)
4655         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4656                        "variables or common blocks",
4657                        &(entry->old_symbol->declared_at));
4658       else
4659         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4660                        "variables or common blocks", &gfc_current_locus);
4661     }
4662   
4663   /* Check what next non-whitespace character is so we can tell if there
4664      is the required parens if we have a BIND(C).  */
4665   gfc_gobble_whitespace ();
4666   peek_char = gfc_peek_ascii_char ();
4667
4668   if (state == COMP_SUBROUTINE)
4669     {
4670       /* An entry in a subroutine.  */
4671       if (!gfc_current_ns->parent && !add_global_entry (name, 1))
4672         return MATCH_ERROR;
4673
4674       m = gfc_match_formal_arglist (entry, 0, 1);
4675       if (m != MATCH_YES)
4676         return MATCH_ERROR;
4677
4678       /* Call gfc_match_bind_c with allow_binding_name = true as ENTRY can
4679          never be an internal procedure.  */
4680       is_bind_c = gfc_match_bind_c (entry, true);
4681       if (is_bind_c == MATCH_ERROR)
4682         return MATCH_ERROR;
4683       if (is_bind_c == MATCH_YES)
4684         {
4685           if (peek_char != '(')
4686             {
4687               gfc_error ("Missing required parentheses before BIND(C) at %C");
4688               return MATCH_ERROR;
4689             }
4690             if (gfc_add_is_bind_c (&(entry->attr), entry->name, &(entry->declared_at), 1)
4691                 == FAILURE)
4692               return MATCH_ERROR;
4693         }
4694
4695       if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
4696           || gfc_add_subroutine (&entry->attr, entry->name, NULL) == FAILURE)
4697         return MATCH_ERROR;
4698     }
4699   else
4700     {
4701       /* An entry in a function.
4702          We need to take special care because writing
4703             ENTRY f()
4704          as
4705             ENTRY f
4706          is allowed, whereas
4707             ENTRY f() RESULT (r)
4708          can't be written as
4709             ENTRY f RESULT (r).  */
4710       if (!gfc_current_ns->parent && !add_global_entry (name, 0))
4711         return MATCH_ERROR;
4712
4713       old_loc = gfc_current_locus;
4714       if (gfc_match_eos () == MATCH_YES)
4715         {
4716           gfc_current_locus = old_loc;
4717           /* Match the empty argument list, and add the interface to
4718              the symbol.  */
4719           m = gfc_match_formal_arglist (entry, 0, 1);
4720         }
4721       else
4722         m = gfc_match_formal_arglist (entry, 0, 0);
4723
4724       if (m != MATCH_YES)
4725         return MATCH_ERROR;
4726
4727       result = NULL;
4728
4729       if (gfc_match_eos () == MATCH_YES)
4730         {
4731           if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
4732               || gfc_add_function (&entry->attr, entry->name, NULL) == FAILURE)
4733             return MATCH_ERROR;
4734
4735           entry->result = entry;
4736         }
4737       else
4738         {
4739           m = gfc_match_suffix (entry, &result);
4740           if (m == MATCH_NO)
4741             gfc_syntax_error (ST_ENTRY);
4742           if (m != MATCH_YES)
4743             return MATCH_ERROR;
4744
4745           if (result)
4746             {
4747               if (gfc_add_result (&result->attr, result->name, NULL) == FAILURE
4748                   || gfc_add_entry (&entry->attr, result->name, NULL) == FAILURE
4749                   || gfc_add_function (&entry->attr, result->name, NULL)
4750                   == FAILURE)
4751                 return MATCH_ERROR;
4752               entry->result = result;
4753             }
4754           else
4755             {
4756               if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
4757                   || gfc_add_function (&entry->attr, entry->name, NULL) == FAILURE)
4758                 return MATCH_ERROR;
4759               entry->result = entry;
4760             }
4761         }
4762     }
4763
4764   if (gfc_match_eos () != MATCH_YES)
4765     {
4766       gfc_syntax_error (ST_ENTRY);
4767       return MATCH_ERROR;
4768     }
4769
4770   entry->attr.recursive = proc->attr.recursive;
4771   entry->attr.elemental = proc->attr.elemental;
4772   entry->attr.pure = proc->attr.pure;
4773
4774   el = gfc_get_entry_list ();
4775   el->sym = entry;
4776   el->next = gfc_current_ns->entries;
4777   gfc_current_ns->entries = el;
4778   if (el->next)
4779     el->id = el->next->id + 1;
4780   else
4781     el->id = 1;
4782
4783   new_st.op = EXEC_ENTRY;
4784   new_st.ext.entry = el;
4785
4786   return MATCH_YES;
4787 }
4788
4789
4790 /* Match a subroutine statement, including optional prefixes.  */
4791
4792 match
4793 gfc_match_subroutine (void)
4794 {
4795   char name[GFC_MAX_SYMBOL_LEN + 1];
4796   gfc_symbol *sym;
4797   match m;
4798   match is_bind_c;
4799   char peek_char;
4800   bool allow_binding_name;
4801
4802   if (gfc_current_state () != COMP_NONE
4803       && gfc_current_state () != COMP_INTERFACE
4804       && gfc_current_state () != COMP_CONTAINS)
4805     return MATCH_NO;
4806
4807   m = gfc_match_prefix (NULL);
4808   if (m != MATCH_YES)
4809     return m;
4810
4811   m = gfc_match ("subroutine% %n", name);
4812   if (m != MATCH_YES)
4813     return m;
4814
4815   if (get_proc_name (name, &sym, false))
4816     return MATCH_ERROR;
4817   gfc_new_block = sym;
4818
4819   /* Check what next non-whitespace character is so we can tell if there
4820      is the required parens if we have a BIND(C).  */
4821   gfc_gobble_whitespace ();
4822   peek_char = gfc_peek_ascii_char ();
4823   
4824   if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
4825     return MATCH_ERROR;
4826
4827   if (gfc_match_formal_arglist (sym, 0, 1) != MATCH_YES)
4828     return MATCH_ERROR;
4829
4830   /* Make sure that it isn't already declared as BIND(C).  If it is, it
4831      must have been marked BIND(C) with a BIND(C) attribute and that is
4832      not allowed for procedures.  */
4833   if (sym->attr.is_bind_c == 1)
4834     {
4835       sym->attr.is_bind_c = 0;
4836       if (sym->old_symbol != NULL)
4837         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4838                        "variables or common blocks",
4839                        &(sym->old_symbol->declared_at));
4840       else
4841         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4842                        "variables or common blocks", &gfc_current_locus);
4843     }
4844
4845   /* C binding names are not allowed for internal procedures.  */
4846   if (gfc_current_state () == COMP_CONTAINS
4847       && sym->ns->proc_name->attr.flavor != FL_MODULE)
4848     allow_binding_name = false;
4849   else
4850     allow_binding_name = true;
4851
4852   /* Here, we are just checking if it has the bind(c) attribute, and if
4853      so, then we need to make sure it's all correct.  If it doesn't,
4854      we still need to continue matching the rest of the subroutine line.  */
4855   is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
4856   if (is_bind_c == MATCH_ERROR)
4857     {
4858       /* There was an attempt at the bind(c), but it was wrong.  An
4859          error message should have been printed w/in the gfc_match_bind_c
4860          so here we'll just return the MATCH_ERROR.  */
4861       return MATCH_ERROR;
4862     }
4863
4864   if (is_bind_c == MATCH_YES)
4865     {
4866       /* The following is allowed in the Fortran 2008 draft.  */
4867       if (gfc_current_state () == COMP_CONTAINS
4868           && sym->ns->proc_name->attr.flavor != FL_MODULE
4869           && gfc_notify_std (GFC_STD_F2008, "Fortran 2008: BIND(C) attribute "
4870                              "at %L may not be specified for an internal "
4871                              "procedure", &gfc_current_locus)
4872              == FAILURE)
4873         return MATCH_ERROR;
4874
4875       if (peek_char != '(')
4876         {
4877           gfc_error ("Missing required parentheses before BIND(C) at %C");
4878           return MATCH_ERROR;
4879         }
4880       if (gfc_add_is_bind_c (&(sym->attr), sym->name, &(sym->declared_at), 1)
4881           == FAILURE)
4882         return MATCH_ERROR;
4883     }
4884   
4885   if (gfc_match_eos () != MATCH_YES)
4886     {
4887       gfc_syntax_error (ST_SUBROUTINE);
4888       return MATCH_ERROR;
4889     }
4890
4891   if (copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
4892     return MATCH_ERROR;
4893
4894   /* Warn if it has the same name as an intrinsic.  */
4895   warn_intrinsic_shadow (sym, false);
4896
4897   return MATCH_YES;
4898 }
4899
4900
4901 /* Match a BIND(C) specifier, with the optional 'name=' specifier if
4902    given, and set the binding label in either the given symbol (if not
4903    NULL), or in the current_ts.  The symbol may be NULL because we may
4904    encounter the BIND(C) before the declaration itself.  Return
4905    MATCH_NO if what we're looking at isn't a BIND(C) specifier,
4906    MATCH_ERROR if it is a BIND(C) clause but an error was encountered,
4907    or MATCH_YES if the specifier was correct and the binding label and
4908    bind(c) fields were set correctly for the given symbol or the
4909    current_ts. If allow_binding_name is false, no binding name may be
4910    given.  */
4911
4912 match
4913 gfc_match_bind_c (gfc_symbol *sym, bool allow_binding_name)
4914 {
4915   /* binding label, if exists */   
4916   char binding_label[GFC_MAX_SYMBOL_LEN + 1];
4917   match double_quote;
4918   match single_quote;
4919
4920   /* Initialize the flag that specifies whether we encountered a NAME= 
4921      specifier or not.  */
4922   has_name_equals = 0;
4923
4924   /* Init the first char to nil so we can catch if we don't have
4925      the label (name attr) or the symbol name yet.  */
4926   binding_label[0] = '\0';
4927    
4928   /* This much we have to be able to match, in this order, if
4929      there is a bind(c) label.  */
4930   if (gfc_match (" bind ( c ") != MATCH_YES)
4931     return MATCH_NO;
4932
4933   /* Now see if there is a binding label, or if we've reached the
4934      end of the bind(c) attribute without one.  */
4935   if (gfc_match_char (',') == MATCH_YES)
4936     {
4937       if (gfc_match (" name = ") != MATCH_YES)
4938         {
4939           gfc_error ("Syntax error in NAME= specifier for binding label "
4940                      "at %C");
4941           /* should give an error message here */
4942           return MATCH_ERROR;
4943         }
4944
4945       has_name_equals = 1;
4946
4947       /* Get the opening quote.  */
4948       double_quote = MATCH_YES;
4949       single_quote = MATCH_YES;
4950       double_quote = gfc_match_char ('"');
4951       if (double_quote != MATCH_YES)
4952         single_quote = gfc_match_char ('\'');
4953       if (double_quote != MATCH_YES && single_quote != MATCH_YES)
4954         {
4955           gfc_error ("Syntax error in NAME= specifier for binding label "
4956                      "at %C");
4957           return MATCH_ERROR;
4958         }
4959       
4960       /* Grab the binding label, using functions that will not lower
4961          case the names automatically.  */
4962       if (gfc_match_name_C (binding_label) != MATCH_YES)
4963          return MATCH_ERROR;
4964       
4965       /* Get the closing quotation.  */
4966       if (double_quote == MATCH_YES)
4967         {
4968           if (gfc_match_char ('"') != MATCH_YES)
4969             {
4970               gfc_error ("Missing closing quote '\"' for binding label at %C");
4971               /* User started string with '"' so looked to match it.  */
4972               return MATCH_ERROR;
4973             }
4974         }
4975       else
4976         {
4977           if (gfc_match_char ('\'') != MATCH_YES)
4978             {
4979               gfc_error ("Missing closing quote '\'' for binding label at %C");
4980               /* User started string with "'" char.  */
4981               return MATCH_ERROR;
4982             }
4983         }
4984    }
4985
4986   /* Get the required right paren.  */
4987   if (gfc_match_char (')') != MATCH_YES)
4988     {
4989       gfc_error ("Missing closing paren for binding label at %C");
4990       return MATCH_ERROR;
4991     }
4992
4993   if (has_name_equals && !allow_binding_name)
4994     {
4995       gfc_error ("No binding name is allowed in BIND(C) at %C");
4996       return MATCH_ERROR;
4997     }
4998
4999   if (has_name_equals && sym != NULL && sym->attr.dummy)
5000     {
5001       gfc_error ("For dummy procedure %s, no binding name is "
5002                  "allowed in BIND(C) at %C", sym->name);
5003       return MATCH_ERROR;
5004     }
5005
5006
5007   /* Save the binding label to the symbol.  If sym is null, we're
5008      probably matching the typespec attributes of a declaration and
5009      haven't gotten the name yet, and therefore, no symbol yet.  */
5010   if (binding_label[0] != '\0')
5011     {
5012       if (sym != NULL)
5013       {
5014         strcpy (sym->binding_label, binding_label);
5015       }
5016       else
5017         strcpy (curr_binding_label, binding_label);
5018     }
5019   else if (allow_binding_name)
5020     {
5021       /* No binding label, but if symbol isn't null, we
5022          can set the label for it here.
5023          If name="" or allow_binding_name is false, no C binding name is
5024          created. */
5025       if (sym != NULL && sym->name != NULL && has_name_equals == 0)
5026         strncpy (sym->binding_label, sym->name, strlen (sym->name) + 1);
5027     }
5028
5029   if (has_name_equals && gfc_current_state () == COMP_INTERFACE
5030       && current_interface.type == INTERFACE_ABSTRACT)
5031     {
5032       gfc_error ("NAME not allowed on BIND(C) for ABSTRACT INTERFACE at %C");
5033       return MATCH_ERROR;
5034     }
5035
5036   return MATCH_YES;
5037 }
5038
5039
5040 /* Return nonzero if we're currently compiling a contained procedure.  */
5041
5042 static int
5043 contained_procedure (void)
5044 {
5045   gfc_state_data *s = gfc_state_stack;
5046
5047   if ((s->state == COMP_SUBROUTINE || s->state == COMP_FUNCTION)
5048       && s->previous != NULL && s->previous->state == COMP_CONTAINS)
5049     return 1;
5050
5051   return 0;
5052 }
5053
5054 /* Set the kind of each enumerator.  The kind is selected such that it is
5055    interoperable with the corresponding C enumeration type, making
5056    sure that -fshort-enums is honored.  */
5057
5058 static void
5059 set_enum_kind(void)
5060 {
5061   enumerator_history *current_history = NULL;
5062   int kind;
5063   int i;
5064
5065   if (max_enum == NULL || enum_history == NULL)
5066     return;
5067
5068   if (!gfc_option.fshort_enums)
5069     return;
5070
5071   i = 0;
5072   do
5073     {
5074       kind = gfc_integer_kinds[i++].kind;
5075     }
5076   while (kind < gfc_c_int_kind
5077          && gfc_check_integer_range (max_enum->initializer->value.integer,
5078                                      kind) != ARITH_OK);
5079
5080   current_history = enum_history;
5081   while (current_history != NULL)
5082     {
5083       current_history->sym->ts.kind = kind;
5084       current_history = current_history->next;
5085     }
5086 }
5087
5088
5089 /* Match any of the various end-block statements.  Returns the type of
5090    END to the caller.  The END INTERFACE, END IF, END DO and END
5091    SELECT statements cannot be replaced by a single END statement.  */
5092
5093 match
5094 gfc_match_end (gfc_statement *st)
5095 {
5096   char name[GFC_MAX_SYMBOL_LEN + 1];
5097   gfc_compile_state state;
5098   locus old_loc;
5099   const char *block_name;
5100   const char *target;
5101   int eos_ok;
5102   match m;
5103
5104   old_loc = gfc_current_locus;
5105   if (gfc_match ("end") != MATCH_YES)
5106     return MATCH_NO;
5107
5108   state = gfc_current_state ();
5109   block_name = gfc_current_block () == NULL
5110              ? NULL : gfc_current_block ()->name;
5111
5112   if (state == COMP_CONTAINS || state == COMP_DERIVED_CONTAINS)
5113     {
5114       state = gfc_state_stack->previous->state;
5115       block_name = gfc_state_stack->previous->sym == NULL
5116                  ? NULL : gfc_state_stack->previous->sym->name;
5117     }
5118
5119   switch (state)
5120     {
5121     case COMP_NONE:
5122     case COMP_PROGRAM:
5123       *st = ST_END_PROGRAM;
5124       target = " program";
5125       eos_ok = 1;
5126       break;
5127
5128     case COMP_SUBROUTINE:
5129       *st = ST_END_SUBROUTINE;
5130       target = " subroutine";
5131       eos_ok = !contained_procedure ();
5132       break;
5133
5134     case COMP_FUNCTION:
5135       *st = ST_END_FUNCTION;
5136       target = " function";
5137       eos_ok = !contained_procedure ();
5138       break;
5139
5140     case COMP_BLOCK_DATA:
5141       *st = ST_END_BLOCK_DATA;
5142       target = " block data";
5143       eos_ok = 1;
5144       break;
5145
5146     case COMP_MODULE:
5147       *st = ST_END_MODULE;
5148       target = " module";
5149       eos_ok = 1;
5150       break;
5151
5152     case COMP_INTERFACE:
5153       *st = ST_END_INTERFACE;
5154       target = " interface";
5155       eos_ok = 0;
5156       break;
5157
5158     case COMP_DERIVED:
5159     case COMP_DERIVED_CONTAINS:
5160       *st = ST_END_TYPE;
5161       target = " type";
5162       eos_ok = 0;
5163       break;
5164
5165     case COMP_IF:
5166       *st = ST_ENDIF;
5167       target = " if";
5168       eos_ok = 0;
5169       break;
5170
5171     case COMP_DO:
5172       *st = ST_ENDDO;
5173       target = " do";
5174       eos_ok = 0;
5175       break;
5176
5177     case COMP_SELECT:
5178       *st = ST_END_SELECT;
5179       target = " select";
5180       eos_ok = 0;
5181       break;
5182
5183     case COMP_FORALL:
5184       *st = ST_END_FORALL;
5185       target = " forall";
5186       eos_ok = 0;
5187       break;
5188
5189     case COMP_WHERE:
5190       *st = ST_END_WHERE;
5191       target = " where";
5192       eos_ok = 0;
5193       break;
5194
5195     case COMP_ENUM:
5196       *st = ST_END_ENUM;
5197       target = " enum";
5198       eos_ok = 0;
5199       last_initializer = NULL;
5200       set_enum_kind ();
5201       gfc_free_enum_history ();
5202       break;
5203
5204     default:
5205       gfc_error ("Unexpected END statement at %C");
5206       goto cleanup;
5207     }
5208
5209   if (gfc_match_eos () == MATCH_YES)
5210     {
5211       if (!eos_ok)
5212         {
5213           /* We would have required END [something].  */
5214           gfc_error ("%s statement expected at %L",
5215                      gfc_ascii_statement (*st), &old_loc);
5216           goto cleanup;
5217         }
5218
5219       return MATCH_YES;
5220     }
5221
5222   /* Verify that we've got the sort of end-block that we're expecting.  */
5223   if (gfc_match (target) != MATCH_YES)
5224     {
5225       gfc_error ("Expecting %s statement at %C", gfc_ascii_statement (*st));
5226       goto cleanup;
5227     }
5228
5229   /* If we're at the end, make sure a block name wasn't required.  */
5230   if (gfc_match_eos () == MATCH_YES)
5231     {
5232
5233       if (*st != ST_ENDDO && *st != ST_ENDIF && *st != ST_END_SELECT
5234           && *st != ST_END_FORALL && *st != ST_END_WHERE)
5235         return MATCH_YES;
5236
5237       if (gfc_current_block () == NULL)
5238         return MATCH_YES;
5239
5240       gfc_error ("Expected block name of '%s' in %s statement at %C",
5241                  block_name, gfc_ascii_statement (*st));
5242
5243       return MATCH_ERROR;
5244     }
5245
5246   /* END INTERFACE has a special handler for its several possible endings.  */
5247   if (*st == ST_END_INTERFACE)
5248     return gfc_match_end_interface ();
5249
5250   /* We haven't hit the end of statement, so what is left must be an
5251      end-name.  */
5252   m = gfc_match_space ();
5253   if (m == MATCH_YES)
5254     m = gfc_match_name (name);
5255
5256   if (m == MATCH_NO)
5257     gfc_error ("Expected terminating name at %C");
5258   if (m != MATCH_YES)
5259     goto cleanup;
5260
5261   if (block_name == NULL)
5262     goto syntax;
5263
5264   if (strcmp (name, block_name) != 0)
5265     {
5266       gfc_error ("Expected label '%s' for %s statement at %C", block_name,
5267                  gfc_ascii_statement (*st));
5268       goto cleanup;
5269     }
5270
5271   if (gfc_match_eos () == MATCH_YES)
5272     return MATCH_YES;
5273
5274 syntax:
5275   gfc_syntax_error (*st);
5276
5277 cleanup:
5278   gfc_current_locus = old_loc;
5279   return MATCH_ERROR;
5280 }
5281
5282
5283
5284 /***************** Attribute declaration statements ****************/
5285
5286 /* Set the attribute of a single variable.  */
5287
5288 static match
5289 attr_decl1 (void)
5290 {
5291   char name[GFC_MAX_SYMBOL_LEN + 1];
5292   gfc_array_spec *as;
5293   gfc_symbol *sym;
5294   locus var_locus;
5295   match m;
5296
5297   as = NULL;
5298
5299   m = gfc_match_name (name);
5300   if (m != MATCH_YES)
5301     goto cleanup;
5302
5303   if (find_special (name, &sym))
5304     return MATCH_ERROR;
5305
5306   var_locus = gfc_current_locus;
5307
5308   /* Deal with possible array specification for certain attributes.  */
5309   if (current_attr.dimension
5310       || current_attr.allocatable
5311       || current_attr.pointer
5312       || current_attr.target)
5313     {
5314       m = gfc_match_array_spec (&as);
5315       if (m == MATCH_ERROR)
5316         goto cleanup;
5317
5318       if (current_attr.dimension && m == MATCH_NO)
5319         {
5320           gfc_error ("Missing array specification at %L in DIMENSION "
5321                      "statement", &var_locus);
5322           m = MATCH_ERROR;
5323           goto cleanup;
5324         }
5325
5326       if (current_attr.dimension && sym->value)
5327         {
5328           gfc_error ("Dimensions specified for %s at %L after its "
5329                      "initialisation", sym->name, &var_locus);
5330           m = MATCH_ERROR;
5331           goto cleanup;
5332         }
5333
5334       if ((current_attr.allocatable || current_attr.pointer)
5335           && (m == MATCH_YES) && (as->type != AS_DEFERRED))
5336         {
5337           gfc_error ("Array specification must be deferred at %L", &var_locus);
5338           m = MATCH_ERROR;
5339           goto cleanup;
5340         }
5341     }
5342
5343   /* Update symbol table.  DIMENSION attribute is set
5344      in gfc_set_array_spec().  */
5345   if (current_attr.dimension == 0
5346       && gfc_copy_attr (&sym->attr, &current_attr, &var_locus) == FAILURE)
5347     {
5348       m = MATCH_ERROR;
5349       goto cleanup;
5350     }
5351
5352   if (gfc_set_array_spec (sym, as, &var_locus) == FAILURE)
5353     {
5354       m = MATCH_ERROR;
5355       goto cleanup;
5356     }
5357
5358   if (sym->attr.cray_pointee && sym->as != NULL)
5359     {
5360       /* Fix the array spec.  */
5361       m = gfc_mod_pointee_as (sym->as);         
5362       if (m == MATCH_ERROR)
5363         goto cleanup;
5364     }
5365
5366   if (gfc_add_attribute (&sym->attr, &var_locus) == FAILURE)
5367     {
5368       m = MATCH_ERROR;
5369       goto cleanup;
5370     }
5371
5372   if ((current_attr.external || current_attr.intrinsic)
5373       && sym->attr.flavor != FL_PROCEDURE
5374       && gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL) == FAILURE)
5375     {
5376       m = MATCH_ERROR;
5377       goto cleanup;
5378     }
5379
5380   return MATCH_YES;
5381
5382 cleanup:
5383   gfc_free_array_spec (as);
5384   return m;
5385 }
5386
5387
5388 /* Generic attribute declaration subroutine.  Used for attributes that
5389    just have a list of names.  */
5390
5391 static match
5392 attr_decl (void)
5393 {
5394   match m;
5395
5396   /* Gobble the optional double colon, by simply ignoring the result
5397      of gfc_match().  */
5398   gfc_match (" ::");
5399
5400   for (;;)
5401     {
5402       m = attr_decl1 ();
5403       if (m != MATCH_YES)
5404         break;
5405
5406       if (gfc_match_eos () == MATCH_YES)
5407         {
5408           m = MATCH_YES;
5409           break;
5410         }
5411
5412       if (gfc_match_char (',') != MATCH_YES)
5413         {
5414           gfc_error ("Unexpected character in variable list at %C");
5415           m = MATCH_ERROR;
5416           break;
5417         }
5418     }
5419
5420   return m;
5421 }
5422
5423
5424 /* This routine matches Cray Pointer declarations of the form:
5425    pointer ( <pointer>, <pointee> )
5426    or
5427    pointer ( <pointer1>, <pointee1> ), ( <pointer2>, <pointee2> ), ...
5428    The pointer, if already declared, should be an integer.  Otherwise, we
5429    set it as BT_INTEGER with kind gfc_index_integer_kind.  The pointee may
5430    be either a scalar, or an array declaration.  No space is allocated for
5431    the pointee.  For the statement
5432    pointer (ipt, ar(10))
5433    any subsequent uses of ar will be translated (in C-notation) as
5434    ar(i) => ((<type> *) ipt)(i)
5435    After gimplification, pointee variable will disappear in the code.  */
5436
5437 static match
5438 cray_pointer_decl (void)
5439 {
5440   match m;
5441   gfc_array_spec *as;
5442   gfc_symbol *cptr; /* Pointer symbol.  */
5443   gfc_symbol *cpte; /* Pointee symbol.  */
5444   locus var_locus;
5445   bool done = false;
5446
5447   while (!done)
5448     {
5449       if (gfc_match_char ('(') != MATCH_YES)
5450         {
5451           gfc_error ("Expected '(' at %C");
5452           return MATCH_ERROR;
5453         }
5454
5455       /* Match pointer.  */
5456       var_locus = gfc_current_locus;
5457       gfc_clear_attr (&current_attr);
5458       gfc_add_cray_pointer (&current_attr, &var_locus);
5459       current_ts.type = BT_INTEGER;
5460       current_ts.kind = gfc_index_integer_kind;
5461
5462       m = gfc_match_symbol (&cptr, 0);
5463       if (m != MATCH_YES)
5464         {
5465           gfc_error ("Expected variable name at %C");
5466           return m;
5467         }
5468
5469       if (gfc_add_cray_pointer (&cptr->attr, &var_locus) == FAILURE)
5470         return MATCH_ERROR;
5471
5472       gfc_set_sym_referenced (cptr);
5473
5474       if (cptr->ts.type == BT_UNKNOWN) /* Override the type, if necessary.  */
5475         {
5476           cptr->ts.type = BT_INTEGER;
5477           cptr->ts.kind = gfc_index_integer_kind;
5478         }
5479       else if (cptr->ts.type != BT_INTEGER)
5480         {
5481           gfc_error ("Cray pointer at %C must be an integer");
5482           return MATCH_ERROR;
5483         }
5484       else if (cptr->ts.kind < gfc_index_integer_kind)
5485         gfc_warning ("Cray pointer at %C has %d bytes of precision;"
5486                      " memory addresses require %d bytes",
5487                      cptr->ts.kind, gfc_index_integer_kind);
5488
5489       if (gfc_match_char (',') != MATCH_YES)
5490         {
5491           gfc_error ("Expected \",\" at %C");
5492           return MATCH_ERROR;
5493         }
5494
5495       /* Match Pointee.  */
5496       var_locus = gfc_current_locus;
5497       gfc_clear_attr (&current_attr);
5498       gfc_add_cray_pointee (&current_attr, &var_locus);
5499       current_ts.type = BT_UNKNOWN;
5500       current_ts.kind = 0;
5501
5502       m = gfc_match_symbol (&cpte, 0);
5503       if (m != MATCH_YES)
5504         {
5505           gfc_error ("Expected variable name at %C");
5506           return m;
5507         }
5508
5509       /* Check for an optional array spec.  */
5510       m = gfc_match_array_spec (&as);
5511       if (m == MATCH_ERROR)
5512         {
5513           gfc_free_array_spec (as);
5514           return m;
5515         }
5516       else if (m == MATCH_NO)
5517         {
5518           gfc_free_array_spec (as);
5519           as = NULL;
5520         }   
5521
5522       if (gfc_add_cray_pointee (&cpte->attr, &var_locus) == FAILURE)
5523         return MATCH_ERROR;
5524
5525       gfc_set_sym_referenced (cpte);
5526
5527       if (cpte->as == NULL)
5528         {
5529           if (gfc_set_array_spec (cpte, as, &var_locus) == FAILURE)
5530             gfc_internal_error ("Couldn't set Cray pointee array spec.");
5531         }
5532       else if (as != NULL)
5533         {
5534           gfc_error ("Duplicate array spec for Cray pointee at %C");
5535           gfc_free_array_spec (as);
5536           return MATCH_ERROR;
5537         }
5538       
5539       as = NULL;
5540     
5541       if (cpte->as != NULL)
5542         {
5543           /* Fix array spec.  */
5544           m = gfc_mod_pointee_as (cpte->as);
5545           if (m == MATCH_ERROR)
5546             return m;
5547         } 
5548    
5549       /* Point the Pointee at the Pointer.  */
5550       cpte->cp_pointer = cptr;
5551
5552       if (gfc_match_char (')') != MATCH_YES)
5553         {
5554           gfc_error ("Expected \")\" at %C");
5555           return MATCH_ERROR;    
5556         }
5557       m = gfc_match_char (',');
5558       if (m != MATCH_YES)
5559         done = true; /* Stop searching for more declarations.  */
5560
5561     }
5562   
5563   if (m == MATCH_ERROR /* Failed when trying to find ',' above.  */
5564       || gfc_match_eos () != MATCH_YES)
5565     {
5566       gfc_error ("Expected \",\" or end of statement at %C");
5567       return MATCH_ERROR;
5568     }
5569   return MATCH_YES;
5570 }
5571
5572
5573 match
5574 gfc_match_external (void)
5575 {
5576
5577   gfc_clear_attr (&current_attr);
5578   current_attr.external = 1;
5579
5580   return attr_decl ();
5581 }
5582
5583
5584 match
5585 gfc_match_intent (void)
5586 {
5587   sym_intent intent;
5588
5589   intent = match_intent_spec ();
5590   if (intent == INTENT_UNKNOWN)
5591     return MATCH_ERROR;
5592
5593   gfc_clear_attr (&current_attr);
5594   current_attr.intent = intent;
5595
5596   return attr_decl ();
5597 }
5598
5599
5600 match
5601 gfc_match_intrinsic (void)
5602 {
5603
5604   gfc_clear_attr (&current_attr);
5605   current_attr.intrinsic = 1;
5606
5607   return attr_decl ();
5608 }
5609
5610
5611 match
5612 gfc_match_optional (void)
5613 {
5614
5615   gfc_clear_attr (&current_attr);
5616   current_attr.optional = 1;
5617
5618   return attr_decl ();
5619 }
5620
5621
5622 match
5623 gfc_match_pointer (void)
5624 {
5625   gfc_gobble_whitespace ();
5626   if (gfc_peek_ascii_char () == '(')
5627     {
5628       if (!gfc_option.flag_cray_pointer)
5629         {
5630           gfc_error ("Cray pointer declaration at %C requires -fcray-pointer "
5631                      "flag");
5632           return MATCH_ERROR;
5633         }
5634       return cray_pointer_decl ();
5635     }
5636   else
5637     {
5638       gfc_clear_attr (&current_attr);
5639       current_attr.pointer = 1;
5640     
5641       return attr_decl ();
5642     }
5643 }
5644
5645
5646 match
5647 gfc_match_allocatable (void)
5648 {
5649   gfc_clear_attr (&current_attr);
5650   current_attr.allocatable = 1;
5651
5652   return attr_decl ();
5653 }
5654
5655
5656 match
5657 gfc_match_dimension (void)
5658 {
5659   gfc_clear_attr (&current_attr);
5660   current_attr.dimension = 1;
5661
5662   return attr_decl ();
5663 }
5664
5665
5666 match
5667 gfc_match_target (void)
5668 {
5669   gfc_clear_attr (&current_attr);
5670   current_attr.target = 1;
5671
5672   return attr_decl ();
5673 }
5674
5675
5676 /* Match the list of entities being specified in a PUBLIC or PRIVATE
5677    statement.  */
5678
5679 static match
5680 access_attr_decl (gfc_statement st)
5681 {
5682   char name[GFC_MAX_SYMBOL_LEN + 1];
5683   interface_type type;
5684   gfc_user_op *uop;
5685   gfc_symbol *sym;
5686   gfc_intrinsic_op op;
5687   match m;
5688
5689   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
5690     goto done;
5691
5692   for (;;)
5693     {
5694       m = gfc_match_generic_spec (&type, name, &op);
5695       if (m == MATCH_NO)
5696         goto syntax;
5697       if (m == MATCH_ERROR)
5698         return MATCH_ERROR;
5699
5700       switch (type)
5701         {
5702         case INTERFACE_NAMELESS:
5703         case INTERFACE_ABSTRACT:
5704           goto syntax;
5705
5706         case INTERFACE_GENERIC:
5707           if (gfc_get_symbol (name, NULL, &sym))
5708             goto done;
5709
5710           if (gfc_add_access (&sym->attr, (st == ST_PUBLIC)
5711                                           ? ACCESS_PUBLIC : ACCESS_PRIVATE,
5712                               sym->name, NULL) == FAILURE)
5713             return MATCH_ERROR;
5714
5715           break;
5716
5717         case INTERFACE_INTRINSIC_OP:
5718           if (gfc_current_ns->operator_access[op] == ACCESS_UNKNOWN)
5719             {
5720               gfc_current_ns->operator_access[op] =
5721                 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
5722             }
5723           else
5724             {
5725               gfc_error ("Access specification of the %s operator at %C has "
5726                          "already been specified", gfc_op2string (op));
5727               goto done;
5728             }
5729
5730           break;
5731
5732         case INTERFACE_USER_OP:
5733           uop = gfc_get_uop (name);
5734
5735           if (uop->access == ACCESS_UNKNOWN)
5736             {
5737               uop->access = (st == ST_PUBLIC)
5738                           ? ACCESS_PUBLIC : ACCESS_PRIVATE;
5739             }
5740           else
5741             {
5742               gfc_error ("Access specification of the .%s. operator at %C "
5743                          "has already been specified", sym->name);
5744               goto done;
5745             }
5746
5747           break;
5748         }
5749
5750       if (gfc_match_char (',') == MATCH_NO)
5751         break;
5752     }
5753
5754   if (gfc_match_eos () != MATCH_YES)
5755     goto syntax;
5756   return MATCH_YES;
5757
5758 syntax:
5759   gfc_syntax_error (st);
5760
5761 done:
5762   return MATCH_ERROR;
5763 }
5764
5765
5766 match
5767 gfc_match_protected (void)
5768 {
5769   gfc_symbol *sym;
5770   match m;
5771
5772   if (gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
5773     {
5774        gfc_error ("PROTECTED at %C only allowed in specification "
5775                   "part of a module");
5776        return MATCH_ERROR;
5777
5778     }
5779
5780   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PROTECTED statement at %C")
5781       == FAILURE)
5782     return MATCH_ERROR;
5783
5784   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
5785     {
5786       return MATCH_ERROR;
5787     }
5788
5789   if (gfc_match_eos () == MATCH_YES)
5790     goto syntax;
5791
5792   for(;;)
5793     {
5794       m = gfc_match_symbol (&sym, 0);
5795       switch (m)
5796         {
5797         case MATCH_YES:
5798           if (gfc_add_protected (&sym->attr, sym->name, &gfc_current_locus)
5799               == FAILURE)
5800             return MATCH_ERROR;
5801           goto next_item;
5802
5803         case MATCH_NO:
5804           break;
5805
5806         case MATCH_ERROR:
5807           return MATCH_ERROR;
5808         }
5809
5810     next_item:
5811       if (gfc_match_eos () == MATCH_YES)
5812         break;
5813       if (gfc_match_char (',') != MATCH_YES)
5814         goto syntax;
5815     }
5816
5817   return MATCH_YES;
5818
5819 syntax:
5820   gfc_error ("Syntax error in PROTECTED statement at %C");
5821   return MATCH_ERROR;
5822 }
5823
5824
5825 /* The PRIVATE statement is a bit weird in that it can be an attribute
5826    declaration, but also works as a standalone statement inside of a
5827    type declaration or a module.  */
5828
5829 match
5830 gfc_match_private (gfc_statement *st)
5831 {
5832
5833   if (gfc_match ("private") != MATCH_YES)
5834     return MATCH_NO;
5835
5836   if (gfc_current_state () != COMP_MODULE
5837       && !(gfc_current_state () == COMP_DERIVED
5838            && gfc_state_stack->previous
5839            && gfc_state_stack->previous->state == COMP_MODULE)
5840       && !(gfc_current_state () == COMP_DERIVED_CONTAINS
5841            && gfc_state_stack->previous && gfc_state_stack->previous->previous
5842            && gfc_state_stack->previous->previous->state == COMP_MODULE))
5843     {
5844       gfc_error ("PRIVATE statement at %C is only allowed in the "
5845                  "specification part of a module");
5846       return MATCH_ERROR;
5847     }
5848
5849   if (gfc_current_state () == COMP_DERIVED)
5850     {
5851       if (gfc_match_eos () == MATCH_YES)
5852         {
5853           *st = ST_PRIVATE;
5854           return MATCH_YES;
5855         }
5856
5857       gfc_syntax_error (ST_PRIVATE);
5858       return MATCH_ERROR;
5859     }
5860
5861   if (gfc_match_eos () == MATCH_YES)
5862     {
5863       *st = ST_PRIVATE;
5864       return MATCH_YES;
5865     }
5866
5867   *st = ST_ATTR_DECL;
5868   return access_attr_decl (ST_PRIVATE);
5869 }
5870
5871
5872 match
5873 gfc_match_public (gfc_statement *st)
5874 {
5875
5876   if (gfc_match ("public") != MATCH_YES)
5877     return MATCH_NO;
5878
5879   if (gfc_current_state () != COMP_MODULE)
5880     {
5881       gfc_error ("PUBLIC statement at %C is only allowed in the "
5882                  "specification part of a module");
5883       return MATCH_ERROR;
5884     }
5885
5886   if (gfc_match_eos () == MATCH_YES)
5887     {
5888       *st = ST_PUBLIC;
5889       return MATCH_YES;
5890     }
5891
5892   *st = ST_ATTR_DECL;
5893   return access_attr_decl (ST_PUBLIC);
5894 }
5895
5896
5897 /* Workhorse for gfc_match_parameter.  */
5898
5899 static match
5900 do_parm (void)
5901 {
5902   gfc_symbol *sym;
5903   gfc_expr *init;
5904   match m;
5905
5906   m = gfc_match_symbol (&sym, 0);
5907   if (m == MATCH_NO)
5908     gfc_error ("Expected variable name at %C in PARAMETER statement");
5909
5910   if (m != MATCH_YES)
5911     return m;
5912
5913   if (gfc_match_char ('=') == MATCH_NO)
5914     {
5915       gfc_error ("Expected = sign in PARAMETER statement at %C");
5916       return MATCH_ERROR;
5917     }
5918
5919   m = gfc_match_init_expr (&init);
5920   if (m == MATCH_NO)
5921     gfc_error ("Expected expression at %C in PARAMETER statement");
5922   if (m != MATCH_YES)
5923     return m;
5924
5925   if (sym->ts.type == BT_UNKNOWN
5926       && gfc_set_default_type (sym, 1, NULL) == FAILURE)
5927     {
5928       m = MATCH_ERROR;
5929       goto cleanup;
5930     }
5931
5932   if (gfc_check_assign_symbol (sym, init) == FAILURE
5933       || gfc_add_flavor (&sym->attr, FL_PARAMETER, sym->name, NULL) == FAILURE)
5934     {
5935       m = MATCH_ERROR;
5936       goto cleanup;
5937     }
5938
5939   if (sym->value)
5940     {
5941       gfc_error ("Initializing already initialized variable at %C");
5942       m = MATCH_ERROR;
5943       goto cleanup;
5944     }
5945
5946   if (sym->ts.type == BT_CHARACTER
5947       && sym->ts.cl != NULL
5948       && sym->ts.cl->length != NULL
5949       && sym->ts.cl->length->expr_type == EXPR_CONSTANT
5950       && init->expr_type == EXPR_CONSTANT
5951       && init->ts.type == BT_CHARACTER)
5952     gfc_set_constant_character_len (
5953       mpz_get_si (sym->ts.cl->length->value.integer), init, -1);
5954   else if (sym->ts.type == BT_CHARACTER && sym->ts.cl != NULL
5955            && sym->ts.cl->length == NULL)
5956         {
5957           int clen;
5958           if (init->expr_type == EXPR_CONSTANT)
5959             {
5960               clen = init->value.character.length;
5961               sym->ts.cl->length = gfc_int_expr (clen);
5962             }
5963           else if (init->expr_type == EXPR_ARRAY)
5964             {
5965               gfc_expr *p = init->value.constructor->expr;
5966               clen = p->value.character.length;
5967               sym->ts.cl->length = gfc_int_expr (clen);
5968             }
5969           else if (init->ts.cl && init->ts.cl->length)
5970             sym->ts.cl->length = gfc_copy_expr (sym->value->ts.cl->length);
5971         }
5972
5973   sym->value = init;
5974   return MATCH_YES;
5975
5976 cleanup:
5977   gfc_free_expr (init);
5978   return m;
5979 }
5980
5981
5982 /* Match a parameter statement, with the weird syntax that these have.  */
5983
5984 match
5985 gfc_match_parameter (void)
5986 {
5987   match m;
5988
5989   if (gfc_match_char ('(') == MATCH_NO)
5990     return MATCH_NO;
5991
5992   for (;;)
5993     {
5994       m = do_parm ();
5995       if (m != MATCH_YES)
5996         break;
5997
5998       if (gfc_match (" )%t") == MATCH_YES)
5999         break;
6000
6001       if (gfc_match_char (',') != MATCH_YES)
6002         {
6003           gfc_error ("Unexpected characters in PARAMETER statement at %C");
6004           m = MATCH_ERROR;
6005           break;
6006         }
6007     }
6008
6009   return m;
6010 }
6011
6012
6013 /* Save statements have a special syntax.  */
6014
6015 match
6016 gfc_match_save (void)
6017 {
6018   char n[GFC_MAX_SYMBOL_LEN+1];
6019   gfc_common_head *c;
6020   gfc_symbol *sym;
6021   match m;
6022
6023   if (gfc_match_eos () == MATCH_YES)
6024     {
6025       if (gfc_current_ns->seen_save)
6026         {
6027           if (gfc_notify_std (GFC_STD_LEGACY, "Blanket SAVE statement at %C "
6028                               "follows previous SAVE statement")
6029               == FAILURE)
6030             return MATCH_ERROR;
6031         }
6032
6033       gfc_current_ns->save_all = gfc_current_ns->seen_save = 1;
6034       return MATCH_YES;
6035     }
6036
6037   if (gfc_current_ns->save_all)
6038     {
6039       if (gfc_notify_std (GFC_STD_LEGACY, "SAVE statement at %C follows "
6040                           "blanket SAVE statement")
6041           == FAILURE)
6042         return MATCH_ERROR;
6043     }
6044
6045   gfc_match (" ::");
6046
6047   for (;;)
6048     {
6049       m = gfc_match_symbol (&sym, 0);
6050       switch (m)
6051         {
6052         case MATCH_YES:
6053           if (gfc_add_save (&sym->attr, sym->name, &gfc_current_locus)
6054               == FAILURE)
6055             return MATCH_ERROR;
6056           goto next_item;
6057
6058         case MATCH_NO:
6059           break;
6060
6061         case MATCH_ERROR:
6062           return MATCH_ERROR;
6063         }
6064
6065       m = gfc_match (" / %n /", &n);
6066       if (m == MATCH_ERROR)
6067         return MATCH_ERROR;
6068       if (m == MATCH_NO)
6069         goto syntax;
6070
6071       c = gfc_get_common (n, 0);
6072       c->saved = 1;
6073
6074       gfc_current_ns->seen_save = 1;
6075
6076     next_item:
6077       if (gfc_match_eos () == MATCH_YES)
6078         break;
6079       if (gfc_match_char (',') != MATCH_YES)
6080         goto syntax;
6081     }
6082
6083   return MATCH_YES;
6084
6085 syntax:
6086   gfc_error ("Syntax error in SAVE statement at %C");
6087   return MATCH_ERROR;
6088 }
6089
6090
6091 match
6092 gfc_match_value (void)
6093 {
6094   gfc_symbol *sym;
6095   match m;
6096
6097   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: VALUE statement at %C")
6098       == FAILURE)
6099     return MATCH_ERROR;
6100
6101   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6102     {
6103       return MATCH_ERROR;
6104     }
6105
6106   if (gfc_match_eos () == MATCH_YES)
6107     goto syntax;
6108
6109   for(;;)
6110     {
6111       m = gfc_match_symbol (&sym, 0);
6112       switch (m)
6113         {
6114         case MATCH_YES:
6115           if (gfc_add_value (&sym->attr, sym->name, &gfc_current_locus)
6116               == FAILURE)
6117             return MATCH_ERROR;
6118           goto next_item;
6119
6120         case MATCH_NO:
6121           break;
6122
6123         case MATCH_ERROR:
6124           return MATCH_ERROR;
6125         }
6126
6127     next_item:
6128       if (gfc_match_eos () == MATCH_YES)
6129         break;
6130       if (gfc_match_char (',') != MATCH_YES)
6131         goto syntax;
6132     }
6133
6134   return MATCH_YES;
6135
6136 syntax:
6137   gfc_error ("Syntax error in VALUE statement at %C");
6138   return MATCH_ERROR;
6139 }
6140
6141
6142 match
6143 gfc_match_volatile (void)
6144 {
6145   gfc_symbol *sym;
6146   match m;
6147
6148   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: VOLATILE statement at %C")
6149       == FAILURE)
6150     return MATCH_ERROR;
6151
6152   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6153     {
6154       return MATCH_ERROR;
6155     }
6156
6157   if (gfc_match_eos () == MATCH_YES)
6158     goto syntax;
6159
6160   for(;;)
6161     {
6162       /* VOLATILE is special because it can be added to host-associated 
6163          symbols locally.  */
6164       m = gfc_match_symbol (&sym, 1);
6165       switch (m)
6166         {
6167         case MATCH_YES:
6168           if (gfc_add_volatile (&sym->attr, sym->name, &gfc_current_locus)
6169               == FAILURE)
6170             return MATCH_ERROR;
6171           goto next_item;
6172
6173         case MATCH_NO:
6174           break;
6175
6176         case MATCH_ERROR:
6177           return MATCH_ERROR;
6178         }
6179
6180     next_item:
6181       if (gfc_match_eos () == MATCH_YES)
6182         break;
6183       if (gfc_match_char (',') != MATCH_YES)
6184         goto syntax;
6185     }
6186
6187   return MATCH_YES;
6188
6189 syntax:
6190   gfc_error ("Syntax error in VOLATILE statement at %C");
6191   return MATCH_ERROR;
6192 }
6193
6194
6195 /* Match a module procedure statement.  Note that we have to modify
6196    symbols in the parent's namespace because the current one was there
6197    to receive symbols that are in an interface's formal argument list.  */
6198
6199 match
6200 gfc_match_modproc (void)
6201 {
6202   char name[GFC_MAX_SYMBOL_LEN + 1];
6203   gfc_symbol *sym;
6204   match m;
6205   gfc_namespace *module_ns;
6206   gfc_interface *old_interface_head, *interface;
6207
6208   if (gfc_state_stack->state != COMP_INTERFACE
6209       || gfc_state_stack->previous == NULL
6210       || current_interface.type == INTERFACE_NAMELESS
6211       || current_interface.type == INTERFACE_ABSTRACT)
6212     {
6213       gfc_error ("MODULE PROCEDURE at %C must be in a generic module "
6214                  "interface");
6215       return MATCH_ERROR;
6216     }
6217
6218   module_ns = gfc_current_ns->parent;
6219   for (; module_ns; module_ns = module_ns->parent)
6220     if (module_ns->proc_name->attr.flavor == FL_MODULE)
6221       break;
6222
6223   if (module_ns == NULL)
6224     return MATCH_ERROR;
6225
6226   /* Store the current state of the interface. We will need it if we
6227      end up with a syntax error and need to recover.  */
6228   old_interface_head = gfc_current_interface_head ();
6229
6230   for (;;)
6231     {
6232       bool last = false;
6233
6234       m = gfc_match_name (name);
6235       if (m == MATCH_NO)
6236         goto syntax;
6237       if (m != MATCH_YES)
6238         return MATCH_ERROR;
6239
6240       /* Check for syntax error before starting to add symbols to the
6241          current namespace.  */
6242       if (gfc_match_eos () == MATCH_YES)
6243         last = true;
6244       if (!last && gfc_match_char (',') != MATCH_YES)
6245         goto syntax;
6246
6247       /* Now we're sure the syntax is valid, we process this item
6248          further.  */
6249       if (gfc_get_symbol (name, module_ns, &sym))
6250         return MATCH_ERROR;
6251
6252       if (sym->attr.proc != PROC_MODULE
6253           && gfc_add_procedure (&sym->attr, PROC_MODULE,
6254                                 sym->name, NULL) == FAILURE)
6255         return MATCH_ERROR;
6256
6257       if (gfc_add_interface (sym) == FAILURE)
6258         return MATCH_ERROR;
6259
6260       sym->attr.mod_proc = 1;
6261
6262       if (last)
6263         break;
6264     }
6265
6266   return MATCH_YES;
6267
6268 syntax:
6269   /* Restore the previous state of the interface.  */
6270   interface = gfc_current_interface_head ();
6271   gfc_set_current_interface_head (old_interface_head);
6272
6273   /* Free the new interfaces.  */
6274   while (interface != old_interface_head)
6275   {
6276     gfc_interface *i = interface->next;
6277     gfc_free (interface);
6278     interface = i;
6279   }
6280
6281   /* And issue a syntax error.  */
6282   gfc_syntax_error (ST_MODULE_PROC);
6283   return MATCH_ERROR;
6284 }
6285
6286
6287 /* Check a derived type that is being extended.  */
6288 static gfc_symbol*
6289 check_extended_derived_type (char *name)
6290 {
6291   gfc_symbol *extended;
6292
6293   if (gfc_find_symbol (name, gfc_current_ns, 1, &extended))
6294     {
6295       gfc_error ("Ambiguous symbol in TYPE definition at %C");
6296       return NULL;
6297     }
6298
6299   if (!extended)
6300     {
6301       gfc_error ("No such symbol in TYPE definition at %C");
6302       return NULL;
6303     }
6304
6305   if (extended->attr.flavor != FL_DERIVED)
6306     {
6307       gfc_error ("'%s' in EXTENDS expression at %C is not a "
6308                  "derived type", name);
6309       return NULL;
6310     }
6311
6312   if (extended->attr.is_bind_c)
6313     {
6314       gfc_error ("'%s' cannot be extended at %C because it "
6315                  "is BIND(C)", extended->name);
6316       return NULL;
6317     }
6318
6319   if (extended->attr.sequence)
6320     {
6321       gfc_error ("'%s' cannot be extended at %C because it "
6322                  "is a SEQUENCE type", extended->name);
6323       return NULL;
6324     }
6325
6326   return extended;
6327 }
6328
6329
6330 /* Match the optional attribute specifiers for a type declaration.
6331    Return MATCH_ERROR if an error is encountered in one of the handled
6332    attributes (public, private, bind(c)), MATCH_NO if what's found is
6333    not a handled attribute, and MATCH_YES otherwise.  TODO: More error
6334    checking on attribute conflicts needs to be done.  */
6335
6336 match
6337 gfc_get_type_attr_spec (symbol_attribute *attr, char *name)
6338 {
6339   /* See if the derived type is marked as private.  */
6340   if (gfc_match (" , private") == MATCH_YES)
6341     {
6342       if (gfc_current_state () != COMP_MODULE)
6343         {
6344           gfc_error ("Derived type at %C can only be PRIVATE in the "
6345                      "specification part of a module");
6346           return MATCH_ERROR;
6347         }
6348
6349       if (gfc_add_access (attr, ACCESS_PRIVATE, NULL, NULL) == FAILURE)
6350         return MATCH_ERROR;
6351     }
6352   else if (gfc_match (" , public") == MATCH_YES)
6353     {
6354       if (gfc_current_state () != COMP_MODULE)
6355         {
6356           gfc_error ("Derived type at %C can only be PUBLIC in the "
6357                      "specification part of a module");
6358           return MATCH_ERROR;
6359         }
6360
6361       if (gfc_add_access (attr, ACCESS_PUBLIC, NULL, NULL) == FAILURE)
6362         return MATCH_ERROR;
6363     }
6364   else if (gfc_match(" , bind ( c )") == MATCH_YES)
6365     {
6366       /* If the type is defined to be bind(c) it then needs to make
6367          sure that all fields are interoperable.  This will
6368          need to be a semantic check on the finished derived type.
6369          See 15.2.3 (lines 9-12) of F2003 draft.  */
6370       if (gfc_add_is_bind_c (attr, NULL, &gfc_current_locus, 0) != SUCCESS)
6371         return MATCH_ERROR;
6372
6373       /* TODO: attr conflicts need to be checked, probably in symbol.c.  */
6374     }
6375   else if (name && gfc_match(" , extends ( %n )", name) == MATCH_YES)
6376     {
6377       if (gfc_add_extension (attr, &gfc_current_locus) == FAILURE)
6378         return MATCH_ERROR;
6379     }
6380   else
6381     return MATCH_NO;
6382
6383   /* If we get here, something matched.  */
6384   return MATCH_YES;
6385 }
6386
6387
6388 /* Match the beginning of a derived type declaration.  If a type name
6389    was the result of a function, then it is possible to have a symbol
6390    already to be known as a derived type yet have no components.  */
6391
6392 match
6393 gfc_match_derived_decl (void)
6394 {
6395   char name[GFC_MAX_SYMBOL_LEN + 1];
6396   char parent[GFC_MAX_SYMBOL_LEN + 1];
6397   symbol_attribute attr;
6398   gfc_symbol *sym;
6399   gfc_symbol *extended;
6400   match m;
6401   match is_type_attr_spec = MATCH_NO;
6402   bool seen_attr = false;
6403
6404   if (gfc_current_state () == COMP_DERIVED)
6405     return MATCH_NO;
6406
6407   name[0] = '\0';
6408   parent[0] = '\0';
6409   gfc_clear_attr (&attr);
6410   extended = NULL;
6411
6412   do
6413     {
6414       is_type_attr_spec = gfc_get_type_attr_spec (&attr, parent);
6415       if (is_type_attr_spec == MATCH_ERROR)
6416         return MATCH_ERROR;
6417       if (is_type_attr_spec == MATCH_YES)
6418         seen_attr = true;
6419     } while (is_type_attr_spec == MATCH_YES);
6420
6421   /* Deal with derived type extensions.  The extension attribute has
6422      been added to 'attr' but now the parent type must be found and
6423      checked.  */
6424   if (parent[0])
6425     extended = check_extended_derived_type (parent);
6426
6427   if (parent[0] && !extended)
6428     return MATCH_ERROR;
6429
6430   if (gfc_match (" ::") != MATCH_YES && seen_attr)
6431     {
6432       gfc_error ("Expected :: in TYPE definition at %C");
6433       return MATCH_ERROR;
6434     }
6435
6436   m = gfc_match (" %n%t", name);
6437   if (m != MATCH_YES)
6438     return m;
6439
6440   /* Make sure the name is not the name of an intrinsic type.  */
6441   if (gfc_is_intrinsic_typename (name))
6442     {
6443       gfc_error ("Type name '%s' at %C cannot be the same as an intrinsic "
6444                  "type", name);
6445       return MATCH_ERROR;
6446     }
6447
6448   if (gfc_get_symbol (name, NULL, &sym))
6449     return MATCH_ERROR;
6450
6451   if (sym->ts.type != BT_UNKNOWN)
6452     {
6453       gfc_error ("Derived type name '%s' at %C already has a basic type "
6454                  "of %s", sym->name, gfc_typename (&sym->ts));
6455       return MATCH_ERROR;
6456     }
6457
6458   /* The symbol may already have the derived attribute without the
6459      components.  The ways this can happen is via a function
6460      definition, an INTRINSIC statement or a subtype in another
6461      derived type that is a pointer.  The first part of the AND clause
6462      is true if the symbol is not the return value of a function.  */
6463   if (sym->attr.flavor != FL_DERIVED
6464       && gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL) == FAILURE)
6465     return MATCH_ERROR;
6466
6467   if (sym->components != NULL || sym->attr.zero_comp)
6468     {
6469       gfc_error ("Derived type definition of '%s' at %C has already been "
6470                  "defined", sym->name);
6471       return MATCH_ERROR;
6472     }
6473
6474   if (attr.access != ACCESS_UNKNOWN
6475       && gfc_add_access (&sym->attr, attr.access, sym->name, NULL) == FAILURE)
6476     return MATCH_ERROR;
6477
6478   /* See if the derived type was labeled as bind(c).  */
6479   if (attr.is_bind_c != 0)
6480     sym->attr.is_bind_c = attr.is_bind_c;
6481
6482
6483   /* Construct the f2k_derived namespace if it is not yet there.  */
6484   if (!sym->f2k_derived)
6485     sym->f2k_derived = gfc_get_namespace (NULL, 0);
6486
6487   
6488   if (extended && !sym->components)
6489     {
6490       gfc_component *p;
6491       gfc_symtree *st;
6492
6493       /* Add the extended derived type as the first component.  */
6494       gfc_add_component (sym, parent, &p);
6495       sym->attr.extension = attr.extension;
6496       extended->refs++;
6497       gfc_set_sym_referenced (extended);
6498
6499       p->ts.type = BT_DERIVED;
6500       p->ts.derived = extended;
6501       p->initializer = gfc_default_initializer (&p->ts);
6502
6503       /* Provide the links between the extended type and its extension.  */
6504       if (!extended->f2k_derived)
6505         extended->f2k_derived = gfc_get_namespace (NULL, 0);
6506       st = gfc_new_symtree (&extended->f2k_derived->sym_root, sym->name);
6507       st->n.sym = sym;
6508     }
6509
6510   gfc_new_block = sym;
6511
6512   return MATCH_YES;
6513 }
6514
6515
6516 /* Cray Pointees can be declared as: 
6517       pointer (ipt, a (n,m,...,*)) 
6518    By default, this is treated as an AS_ASSUMED_SIZE array.  We'll
6519    cheat and set a constant bound of 1 for the last dimension, if this
6520    is the case. Since there is no bounds-checking for Cray Pointees,
6521    this will be okay.  */
6522
6523 gfc_try
6524 gfc_mod_pointee_as (gfc_array_spec *as)
6525 {
6526   as->cray_pointee = true; /* This will be useful to know later.  */
6527   if (as->type == AS_ASSUMED_SIZE)
6528     {
6529       as->type = AS_EXPLICIT;
6530       as->upper[as->rank - 1] = gfc_int_expr (1);
6531       as->cp_was_assumed = true;
6532     }
6533   else if (as->type == AS_ASSUMED_SHAPE)
6534     {
6535       gfc_error ("Cray Pointee at %C cannot be assumed shape array");
6536       return MATCH_ERROR;
6537     }
6538   return MATCH_YES;
6539 }
6540
6541
6542 /* Match the enum definition statement, here we are trying to match 
6543    the first line of enum definition statement.  
6544    Returns MATCH_YES if match is found.  */
6545
6546 match
6547 gfc_match_enum (void)
6548 {
6549   match m;
6550   
6551   m = gfc_match_eos ();
6552   if (m != MATCH_YES)
6553     return m;
6554
6555   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ENUM and ENUMERATOR at %C")
6556       == FAILURE)
6557     return MATCH_ERROR;
6558
6559   return MATCH_YES;
6560 }
6561
6562
6563 /* Match a variable name with an optional initializer.  When this
6564    subroutine is called, a variable is expected to be parsed next.
6565    Depending on what is happening at the moment, updates either the
6566    symbol table or the current interface.  */
6567
6568 static match
6569 enumerator_decl (void)
6570 {
6571   char name[GFC_MAX_SYMBOL_LEN + 1];
6572   gfc_expr *initializer;
6573   gfc_array_spec *as = NULL;
6574   gfc_symbol *sym;
6575   locus var_locus;
6576   match m;
6577   gfc_try t;
6578   locus old_locus;
6579
6580   initializer = NULL;
6581   old_locus = gfc_current_locus;
6582
6583   /* When we get here, we've just matched a list of attributes and
6584      maybe a type and a double colon.  The next thing we expect to see
6585      is the name of the symbol.  */
6586   m = gfc_match_name (name);
6587   if (m != MATCH_YES)
6588     goto cleanup;
6589
6590   var_locus = gfc_current_locus;
6591
6592   /* OK, we've successfully matched the declaration.  Now put the
6593      symbol in the current namespace. If we fail to create the symbol,
6594      bail out.  */
6595   if (build_sym (name, NULL, &as, &var_locus) == FAILURE)
6596     {
6597       m = MATCH_ERROR;
6598       goto cleanup;
6599     }
6600
6601   /* The double colon must be present in order to have initializers.
6602      Otherwise the statement is ambiguous with an assignment statement.  */
6603   if (colon_seen)
6604     {
6605       if (gfc_match_char ('=') == MATCH_YES)
6606         {
6607           m = gfc_match_init_expr (&initializer);
6608           if (m == MATCH_NO)
6609             {
6610               gfc_error ("Expected an initialization expression at %C");
6611               m = MATCH_ERROR;
6612             }
6613
6614           if (m != MATCH_YES)
6615             goto cleanup;
6616         }
6617     }
6618
6619   /* If we do not have an initializer, the initialization value of the
6620      previous enumerator (stored in last_initializer) is incremented
6621      by 1 and is used to initialize the current enumerator.  */
6622   if (initializer == NULL)
6623     initializer = gfc_enum_initializer (last_initializer, old_locus);
6624
6625   if (initializer == NULL || initializer->ts.type != BT_INTEGER)
6626     {
6627       gfc_error("ENUMERATOR %L not initialized with integer expression",
6628                 &var_locus);
6629       m = MATCH_ERROR;
6630       gfc_free_enum_history ();
6631       goto cleanup;
6632     }
6633
6634   /* Store this current initializer, for the next enumerator variable
6635      to be parsed.  add_init_expr_to_sym() zeros initializer, so we
6636      use last_initializer below.  */
6637   last_initializer = initializer;
6638   t = add_init_expr_to_sym (name, &initializer, &var_locus);
6639
6640   /* Maintain enumerator history.  */
6641   gfc_find_symbol (name, NULL, 0, &sym);
6642   create_enum_history (sym, last_initializer);
6643
6644   return (t == SUCCESS) ? MATCH_YES : MATCH_ERROR;
6645
6646 cleanup:
6647   /* Free stuff up and return.  */
6648   gfc_free_expr (initializer);
6649
6650   return m;
6651 }
6652
6653
6654 /* Match the enumerator definition statement.  */
6655
6656 match
6657 gfc_match_enumerator_def (void)
6658 {
6659   match m;
6660   gfc_try t;
6661
6662   gfc_clear_ts (&current_ts);
6663
6664   m = gfc_match (" enumerator");
6665   if (m != MATCH_YES)
6666     return m;
6667
6668   m = gfc_match (" :: ");
6669   if (m == MATCH_ERROR)
6670     return m;
6671
6672   colon_seen = (m == MATCH_YES);
6673
6674   if (gfc_current_state () != COMP_ENUM)
6675     {
6676       gfc_error ("ENUM definition statement expected before %C");
6677       gfc_free_enum_history ();
6678       return MATCH_ERROR;
6679     }
6680
6681   (&current_ts)->type = BT_INTEGER;
6682   (&current_ts)->kind = gfc_c_int_kind;
6683
6684   gfc_clear_attr (&current_attr);
6685   t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, NULL);
6686   if (t == FAILURE)
6687     {
6688       m = MATCH_ERROR;
6689       goto cleanup;
6690     }
6691
6692   for (;;)
6693     {
6694       m = enumerator_decl ();
6695       if (m == MATCH_ERROR)
6696         goto cleanup;
6697       if (m == MATCH_NO)
6698         break;
6699
6700       if (gfc_match_eos () == MATCH_YES)
6701         goto cleanup;
6702       if (gfc_match_char (',') != MATCH_YES)
6703         break;
6704     }
6705
6706   if (gfc_current_state () == COMP_ENUM)
6707     {
6708       gfc_free_enum_history ();
6709       gfc_error ("Syntax error in ENUMERATOR definition at %C");
6710       m = MATCH_ERROR;
6711     }
6712
6713 cleanup:
6714   gfc_free_array_spec (current_as);
6715   current_as = NULL;
6716   return m;
6717
6718 }
6719
6720
6721 /* Match binding attributes.  */
6722
6723 static match
6724 match_binding_attributes (gfc_typebound_proc* ba)
6725 {
6726   bool found_passing = false;
6727   match m;
6728
6729   /* Intialize to defaults.  Do so even before the MATCH_NO check so that in
6730      this case the defaults are in there.  */
6731   ba->access = ACCESS_UNKNOWN;
6732   ba->pass_arg = NULL;
6733   ba->pass_arg_num = 0;
6734   ba->nopass = 0;
6735   ba->non_overridable = 0;
6736
6737   /* If we find a comma, we believe there are binding attributes.  */
6738   if (gfc_match_char (',') == MATCH_NO)
6739     return MATCH_NO;
6740
6741   do
6742     {
6743       /* NOPASS flag.  */
6744       m = gfc_match (" nopass");
6745       if (m == MATCH_ERROR)
6746         goto error;
6747       if (m == MATCH_YES)
6748         {
6749           if (found_passing)
6750             {
6751               gfc_error ("Binding attributes already specify passing, illegal"
6752                          " NOPASS at %C");
6753               goto error;
6754             }
6755
6756           found_passing = true;
6757           ba->nopass = 1;
6758           continue;
6759         }
6760
6761       /* NON_OVERRIDABLE flag.  */
6762       m = gfc_match (" non_overridable");
6763       if (m == MATCH_ERROR)
6764         goto error;
6765       if (m == MATCH_YES)
6766         {
6767           if (ba->non_overridable)
6768             {
6769               gfc_error ("Duplicate NON_OVERRIDABLE at %C");
6770               goto error;
6771             }
6772
6773           ba->non_overridable = 1;
6774           continue;
6775         }
6776
6777       /* DEFERRED flag.  */
6778       /* TODO: Handle really once implemented.  */
6779       m = gfc_match (" deferred");
6780       if (m == MATCH_ERROR)
6781         goto error;
6782       if (m == MATCH_YES)
6783         {
6784           gfc_error ("DEFERRED not yet implemented at %C");
6785           goto error;
6786         }
6787
6788       /* PASS possibly including argument.  */
6789       m = gfc_match (" pass");
6790       if (m == MATCH_ERROR)
6791         goto error;
6792       if (m == MATCH_YES)
6793         {
6794           char arg[GFC_MAX_SYMBOL_LEN + 1];
6795
6796           if (found_passing)
6797             {
6798               gfc_error ("Binding attributes already specify passing, illegal"
6799                          " PASS at %C");
6800               goto error;
6801             }
6802
6803           m = gfc_match (" ( %n )", arg);
6804           if (m == MATCH_ERROR)
6805             goto error;
6806           if (m == MATCH_YES)
6807             ba->pass_arg = xstrdup (arg);
6808           gcc_assert ((m == MATCH_YES) == (ba->pass_arg != NULL));
6809
6810           found_passing = true;
6811           ba->nopass = 0;
6812           continue;
6813         }
6814
6815       /* Access specifier.  */
6816
6817       m = gfc_match (" public");
6818       if (m == MATCH_ERROR)
6819         goto error;
6820       if (m == MATCH_YES)
6821         {
6822           if (ba->access != ACCESS_UNKNOWN)
6823             {
6824               gfc_error ("Duplicate access-specifier at %C");
6825               goto error;
6826             }
6827
6828           ba->access = ACCESS_PUBLIC;
6829           continue;
6830         }
6831
6832       m = gfc_match (" private");
6833       if (m == MATCH_ERROR)
6834         goto error;
6835       if (m == MATCH_YES)
6836         {
6837           if (ba->access != ACCESS_UNKNOWN)
6838             {
6839               gfc_error ("Duplicate access-specifier at %C");
6840               goto error;
6841             }
6842
6843           ba->access = ACCESS_PRIVATE;
6844           continue;
6845         }
6846
6847       /* Nothing matching found.  */
6848       gfc_error ("Expected binding attribute at %C");
6849       goto error;
6850     }
6851   while (gfc_match_char (',') == MATCH_YES);
6852
6853   return MATCH_YES;
6854
6855 error:
6856   gfc_free (ba->pass_arg);
6857   return MATCH_ERROR;
6858 }
6859
6860
6861 /* Match a PROCEDURE specific binding inside a derived type.  */
6862
6863 static match
6864 match_procedure_in_type (void)
6865 {
6866   char name[GFC_MAX_SYMBOL_LEN + 1];
6867   char target_buf[GFC_MAX_SYMBOL_LEN + 1];
6868   char* target;
6869   gfc_typebound_proc* tb;
6870   bool seen_colons;
6871   bool seen_attrs;
6872   match m;
6873   gfc_symtree* stree;
6874   gfc_namespace* ns;
6875   gfc_symbol* block;
6876
6877   /* Check current state.  */
6878   gcc_assert (gfc_state_stack->state == COMP_DERIVED_CONTAINS);
6879   block = gfc_state_stack->previous->sym;
6880   gcc_assert (block);
6881
6882   /* TODO: Really implement PROCEDURE(interface).  */
6883   if (gfc_match (" (") == MATCH_YES)
6884     {
6885       gfc_error ("Procedure with interface only allowed in abstract types at"
6886                  " %C");
6887       return MATCH_ERROR;
6888     }
6889
6890   /* Construct the data structure.  */
6891   tb = gfc_get_typebound_proc ();
6892   tb->where = gfc_current_locus;
6893
6894   /* Match binding attributes.  */
6895   m = match_binding_attributes (tb);
6896   if (m == MATCH_ERROR)
6897     return m;
6898   seen_attrs = (m == MATCH_YES);
6899
6900   /* Match the colons.  */
6901   m = gfc_match (" ::");
6902   if (m == MATCH_ERROR)
6903     return m;
6904   seen_colons = (m == MATCH_YES);
6905   if (seen_attrs && !seen_colons)
6906     {
6907       gfc_error ("Expected '::' after binding-attributes at %C");
6908       return MATCH_ERROR;
6909     }
6910
6911   /* Match the binding name.  */ 
6912   m = gfc_match_name (name);
6913   if (m == MATCH_ERROR)
6914     return m;
6915   if (m == MATCH_NO)
6916     {
6917       gfc_error ("Expected binding name at %C");
6918       return MATCH_ERROR;
6919     }
6920
6921   /* Try to match the '=> target', if it's there.  */
6922   target = NULL;
6923   m = gfc_match (" =>");
6924   if (m == MATCH_ERROR)
6925     return m;
6926   if (m == MATCH_YES)
6927     {
6928       if (!seen_colons)
6929         {
6930           gfc_error ("'::' needed in PROCEDURE binding with explicit target"
6931                      " at %C");
6932           return MATCH_ERROR;
6933         }
6934
6935       m = gfc_match_name (target_buf);
6936       if (m == MATCH_ERROR)
6937         return m;
6938       if (m == MATCH_NO)
6939         {
6940           gfc_error ("Expected binding target after '=>' at %C");
6941           return MATCH_ERROR;
6942         }
6943       target = target_buf;
6944     }
6945
6946   /* Now we should have the end.  */
6947   m = gfc_match_eos ();
6948   if (m == MATCH_ERROR)
6949     return m;
6950   if (m == MATCH_NO)
6951     {
6952       gfc_error ("Junk after PROCEDURE declaration at %C");
6953       return MATCH_ERROR;
6954     }
6955
6956   /* If no target was found, it has the same name as the binding.  */
6957   if (!target)
6958     target = name;
6959
6960   /* Get the namespace to insert the symbols into.  */
6961   ns = block->f2k_derived;
6962   gcc_assert (ns);
6963
6964   /* See if we already have a binding with this name in the symtree which would
6965      be an error.  */
6966   stree = gfc_find_symtree (ns->sym_root, name);
6967   if (stree)
6968     {
6969       gfc_error ("There's already a procedure with binding name '%s' for the"
6970                  " derived type '%s' at %C", name, block->name);
6971       return MATCH_ERROR;
6972     }
6973
6974   /* Insert it and set attributes.  */
6975   if (gfc_get_sym_tree (name, ns, &stree))
6976     return MATCH_ERROR;
6977   if (gfc_get_sym_tree (target, gfc_current_ns, &tb->target))
6978     return MATCH_ERROR;
6979   stree->typebound = tb;
6980
6981   return MATCH_YES;
6982 }
6983
6984
6985 /* Match a FINAL declaration inside a derived type.  */
6986
6987 match
6988 gfc_match_final_decl (void)
6989 {
6990   char name[GFC_MAX_SYMBOL_LEN + 1];
6991   gfc_symbol* sym;
6992   match m;
6993   gfc_namespace* module_ns;
6994   bool first, last;
6995   gfc_symbol* block;
6996
6997   if (gfc_state_stack->state != COMP_DERIVED_CONTAINS)
6998     {
6999       gfc_error ("FINAL declaration at %C must be inside a derived type "
7000                  "CONTAINS section");
7001       return MATCH_ERROR;
7002     }
7003
7004   block = gfc_state_stack->previous->sym;
7005   gcc_assert (block);
7006
7007   if (!gfc_state_stack->previous || !gfc_state_stack->previous->previous
7008       || gfc_state_stack->previous->previous->state != COMP_MODULE)
7009     {
7010       gfc_error ("Derived type declaration with FINAL at %C must be in the"
7011                  " specification part of a MODULE");
7012       return MATCH_ERROR;
7013     }
7014
7015   module_ns = gfc_current_ns;
7016   gcc_assert (module_ns);
7017   gcc_assert (module_ns->proc_name->attr.flavor == FL_MODULE);
7018
7019   /* Match optional ::, don't care about MATCH_YES or MATCH_NO.  */
7020   if (gfc_match (" ::") == MATCH_ERROR)
7021     return MATCH_ERROR;
7022
7023   /* Match the sequence of procedure names.  */
7024   first = true;
7025   last = false;
7026   do
7027     {
7028       gfc_finalizer* f;
7029
7030       if (first && gfc_match_eos () == MATCH_YES)
7031         {
7032           gfc_error ("Empty FINAL at %C");
7033           return MATCH_ERROR;
7034         }
7035
7036       m = gfc_match_name (name);
7037       if (m == MATCH_NO)
7038         {
7039           gfc_error ("Expected module procedure name at %C");
7040           return MATCH_ERROR;
7041         }
7042       else if (m != MATCH_YES)
7043         return MATCH_ERROR;
7044
7045       if (gfc_match_eos () == MATCH_YES)
7046         last = true;
7047       if (!last && gfc_match_char (',') != MATCH_YES)
7048         {
7049           gfc_error ("Expected ',' at %C");
7050           return MATCH_ERROR;
7051         }
7052
7053       if (gfc_get_symbol (name, module_ns, &sym))
7054         {
7055           gfc_error ("Unknown procedure name \"%s\" at %C", name);
7056           return MATCH_ERROR;
7057         }
7058
7059       /* Mark the symbol as module procedure.  */
7060       if (sym->attr.proc != PROC_MODULE
7061           && gfc_add_procedure (&sym->attr, PROC_MODULE,
7062                                 sym->name, NULL) == FAILURE)
7063         return MATCH_ERROR;
7064
7065       /* Check if we already have this symbol in the list, this is an error.  */
7066       for (f = block->f2k_derived->finalizers; f; f = f->next)
7067         if (f->proc_sym == sym)
7068           {
7069             gfc_error ("'%s' at %C is already defined as FINAL procedure!",
7070                        name);
7071             return MATCH_ERROR;
7072           }
7073
7074       /* Add this symbol to the list of finalizers.  */
7075       gcc_assert (block->f2k_derived);
7076       ++sym->refs;
7077       f = XCNEW (gfc_finalizer);
7078       f->proc_sym = sym;
7079       f->proc_tree = NULL;
7080       f->where = gfc_current_locus;
7081       f->next = block->f2k_derived->finalizers;
7082       block->f2k_derived->finalizers = f;
7083
7084       first = false;
7085     }
7086   while (!last);
7087
7088   return MATCH_YES;
7089 }