OSDN Git Service

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