OSDN Git Service

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