OSDN Git Service

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