OSDN Git Service

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