OSDN Git Service

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