OSDN Git Service

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