OSDN Git Service

2008-07-24 Daniel Kraft <d@domob.eu>
[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 precede 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_is_intrinsic (proc_if, 0, gfc_current_locus)
4124               || gfc_is_intrinsic (proc_if, 1, gfc_current_locus)))
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 /* Warn if a matched procedure has the same name as an intrinsic; this is
4340    simply a wrapper around gfc_warn_intrinsic_shadow that interprets the current
4341    parser-state-stack to find out whether we're in a module.  */
4342
4343 static void
4344 warn_intrinsic_shadow (const gfc_symbol* sym, bool func)
4345 {
4346   bool in_module;
4347
4348   in_module = (gfc_state_stack->previous
4349                && gfc_state_stack->previous->state == COMP_MODULE);
4350
4351   gfc_warn_intrinsic_shadow (sym, in_module, func);
4352 }
4353
4354
4355 /* Match a function declaration.  */
4356
4357 match
4358 gfc_match_function_decl (void)
4359 {
4360   char name[GFC_MAX_SYMBOL_LEN + 1];
4361   gfc_symbol *sym, *result;
4362   locus old_loc;
4363   match m;
4364   match suffix_match;
4365   match found_match; /* Status returned by match func.  */  
4366
4367   if (gfc_current_state () != COMP_NONE
4368       && gfc_current_state () != COMP_INTERFACE
4369       && gfc_current_state () != COMP_CONTAINS)
4370     return MATCH_NO;
4371
4372   gfc_clear_ts (&current_ts);
4373
4374   old_loc = gfc_current_locus;
4375
4376   m = gfc_match_prefix (&current_ts);
4377   if (m != MATCH_YES)
4378     {
4379       gfc_current_locus = old_loc;
4380       return m;
4381     }
4382
4383   if (gfc_match ("function% %n", name) != MATCH_YES)
4384     {
4385       gfc_current_locus = old_loc;
4386       return MATCH_NO;
4387     }
4388   if (get_proc_name (name, &sym, false))
4389     return MATCH_ERROR;
4390   gfc_new_block = sym;
4391
4392   m = gfc_match_formal_arglist (sym, 0, 0);
4393   if (m == MATCH_NO)
4394     {
4395       gfc_error ("Expected formal argument list in function "
4396                  "definition at %C");
4397       m = MATCH_ERROR;
4398       goto cleanup;
4399     }
4400   else if (m == MATCH_ERROR)
4401     goto cleanup;
4402
4403   result = NULL;
4404
4405   /* According to the draft, the bind(c) and result clause can
4406      come in either order after the formal_arg_list (i.e., either
4407      can be first, both can exist together or by themselves or neither
4408      one).  Therefore, the match_result can't match the end of the
4409      string, and check for the bind(c) or result clause in either order.  */
4410   found_match = gfc_match_eos ();
4411
4412   /* Make sure that it isn't already declared as BIND(C).  If it is, it
4413      must have been marked BIND(C) with a BIND(C) attribute and that is
4414      not allowed for procedures.  */
4415   if (sym->attr.is_bind_c == 1)
4416     {
4417       sym->attr.is_bind_c = 0;
4418       if (sym->old_symbol != NULL)
4419         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4420                        "variables or common blocks",
4421                        &(sym->old_symbol->declared_at));
4422       else
4423         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4424                        "variables or common blocks", &gfc_current_locus);
4425     }
4426
4427   if (found_match != MATCH_YES)
4428     {
4429       /* If we haven't found the end-of-statement, look for a suffix.  */
4430       suffix_match = gfc_match_suffix (sym, &result);
4431       if (suffix_match == MATCH_YES)
4432         /* Need to get the eos now.  */
4433         found_match = gfc_match_eos ();
4434       else
4435         found_match = suffix_match;
4436     }
4437
4438   if(found_match != MATCH_YES)
4439     m = MATCH_ERROR;
4440   else
4441     {
4442       /* Make changes to the symbol.  */
4443       m = MATCH_ERROR;
4444       
4445       if (gfc_add_function (&sym->attr, sym->name, NULL) == FAILURE)
4446         goto cleanup;
4447       
4448       if (gfc_missing_attr (&sym->attr, NULL) == FAILURE
4449           || copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
4450         goto cleanup;
4451
4452       if (current_ts.type != BT_UNKNOWN && sym->ts.type != BT_UNKNOWN
4453           && !sym->attr.implicit_type)
4454         {
4455           gfc_error ("Function '%s' at %C already has a type of %s", name,
4456                      gfc_basic_typename (sym->ts.type));
4457           goto cleanup;
4458         }
4459
4460       /* Delay matching the function characteristics until after the
4461          specification block by signalling kind=-1.  */
4462       sym->declared_at = old_loc;
4463       if (current_ts.type != BT_UNKNOWN)
4464         current_ts.kind = -1;
4465       else
4466         current_ts.kind = 0;
4467
4468       if (result == NULL)
4469         {
4470           sym->ts = current_ts;
4471           sym->result = sym;
4472         }
4473       else
4474         {
4475           result->ts = current_ts;
4476           sym->result = result;
4477         }
4478
4479       /* Warn if this procedure has the same name as an intrinsic.  */
4480       warn_intrinsic_shadow (sym, true);
4481
4482       return MATCH_YES;
4483     }
4484
4485 cleanup:
4486   gfc_current_locus = old_loc;
4487   return m;
4488 }
4489
4490
4491 /* This is mostly a copy of parse.c(add_global_procedure) but modified to
4492    pass the name of the entry, rather than the gfc_current_block name, and
4493    to return false upon finding an existing global entry.  */
4494
4495 static bool
4496 add_global_entry (const char *name, int sub)
4497 {
4498   gfc_gsymbol *s;
4499   unsigned int type;
4500
4501   s = gfc_get_gsymbol(name);
4502   type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
4503
4504   if (s->defined
4505       || (s->type != GSYM_UNKNOWN
4506           && s->type != type))
4507     gfc_global_used(s, NULL);
4508   else
4509     {
4510       s->type = type;
4511       s->where = gfc_current_locus;
4512       s->defined = 1;
4513       return true;
4514     }
4515   return false;
4516 }
4517
4518
4519 /* Match an ENTRY statement.  */
4520
4521 match
4522 gfc_match_entry (void)
4523 {
4524   gfc_symbol *proc;
4525   gfc_symbol *result;
4526   gfc_symbol *entry;
4527   char name[GFC_MAX_SYMBOL_LEN + 1];
4528   gfc_compile_state state;
4529   match m;
4530   gfc_entry_list *el;
4531   locus old_loc;
4532   bool module_procedure;
4533   char peek_char;
4534   match is_bind_c;
4535
4536   m = gfc_match_name (name);
4537   if (m != MATCH_YES)
4538     return m;
4539
4540   state = gfc_current_state ();
4541   if (state != COMP_SUBROUTINE && state != COMP_FUNCTION)
4542     {
4543       switch (state)
4544         {
4545           case COMP_PROGRAM:
4546             gfc_error ("ENTRY statement at %C cannot appear within a PROGRAM");
4547             break;
4548           case COMP_MODULE:
4549             gfc_error ("ENTRY statement at %C cannot appear within a MODULE");
4550             break;
4551           case COMP_BLOCK_DATA:
4552             gfc_error ("ENTRY statement at %C cannot appear within "
4553                        "a BLOCK DATA");
4554             break;
4555           case COMP_INTERFACE:
4556             gfc_error ("ENTRY statement at %C cannot appear within "
4557                        "an INTERFACE");
4558             break;
4559           case COMP_DERIVED:
4560             gfc_error ("ENTRY statement at %C cannot appear within "
4561                        "a DERIVED TYPE block");
4562             break;
4563           case COMP_IF:
4564             gfc_error ("ENTRY statement at %C cannot appear within "
4565                        "an IF-THEN block");
4566             break;
4567           case COMP_DO:
4568             gfc_error ("ENTRY statement at %C cannot appear within "
4569                        "a DO block");
4570             break;
4571           case COMP_SELECT:
4572             gfc_error ("ENTRY statement at %C cannot appear within "
4573                        "a SELECT block");
4574             break;
4575           case COMP_FORALL:
4576             gfc_error ("ENTRY statement at %C cannot appear within "
4577                        "a FORALL block");
4578             break;
4579           case COMP_WHERE:
4580             gfc_error ("ENTRY statement at %C cannot appear within "
4581                        "a WHERE block");
4582             break;
4583           case COMP_CONTAINS:
4584             gfc_error ("ENTRY statement at %C cannot appear within "
4585                        "a contained subprogram");
4586             break;
4587           default:
4588             gfc_internal_error ("gfc_match_entry(): Bad state");
4589         }
4590       return MATCH_ERROR;
4591     }
4592
4593   module_procedure = gfc_current_ns->parent != NULL
4594                    && gfc_current_ns->parent->proc_name
4595                    && gfc_current_ns->parent->proc_name->attr.flavor
4596                       == FL_MODULE;
4597
4598   if (gfc_current_ns->parent != NULL
4599       && gfc_current_ns->parent->proc_name
4600       && !module_procedure)
4601     {
4602       gfc_error("ENTRY statement at %C cannot appear in a "
4603                 "contained procedure");
4604       return MATCH_ERROR;
4605     }
4606
4607   /* Module function entries need special care in get_proc_name
4608      because previous references within the function will have
4609      created symbols attached to the current namespace.  */
4610   if (get_proc_name (name, &entry,
4611                      gfc_current_ns->parent != NULL
4612                      && module_procedure
4613                      && gfc_current_ns->proc_name->attr.function))
4614     return MATCH_ERROR;
4615
4616   proc = gfc_current_block ();
4617
4618   /* Make sure that it isn't already declared as BIND(C).  If it is, it
4619      must have been marked BIND(C) with a BIND(C) attribute and that is
4620      not allowed for procedures.  */
4621   if (entry->attr.is_bind_c == 1)
4622     {
4623       entry->attr.is_bind_c = 0;
4624       if (entry->old_symbol != NULL)
4625         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4626                        "variables or common blocks",
4627                        &(entry->old_symbol->declared_at));
4628       else
4629         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4630                        "variables or common blocks", &gfc_current_locus);
4631     }
4632   
4633   /* Check what next non-whitespace character is so we can tell if there
4634      is the required parens if we have a BIND(C).  */
4635   gfc_gobble_whitespace ();
4636   peek_char = gfc_peek_ascii_char ();
4637
4638   if (state == COMP_SUBROUTINE)
4639     {
4640       /* An entry in a subroutine.  */
4641       if (!gfc_current_ns->parent && !add_global_entry (name, 1))
4642         return MATCH_ERROR;
4643
4644       m = gfc_match_formal_arglist (entry, 0, 1);
4645       if (m != MATCH_YES)
4646         return MATCH_ERROR;
4647
4648       /* Call gfc_match_bind_c with allow_binding_name = true as ENTRY can
4649          never be an internal procedure.  */
4650       is_bind_c = gfc_match_bind_c (entry, true);
4651       if (is_bind_c == MATCH_ERROR)
4652         return MATCH_ERROR;
4653       if (is_bind_c == MATCH_YES)
4654         {
4655           if (peek_char != '(')
4656             {
4657               gfc_error ("Missing required parentheses before BIND(C) at %C");
4658               return MATCH_ERROR;
4659             }
4660             if (gfc_add_is_bind_c (&(entry->attr), entry->name, &(entry->declared_at), 1)
4661                 == FAILURE)
4662               return MATCH_ERROR;
4663         }
4664
4665       if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
4666           || gfc_add_subroutine (&entry->attr, entry->name, NULL) == FAILURE)
4667         return MATCH_ERROR;
4668     }
4669   else
4670     {
4671       /* An entry in a function.
4672          We need to take special care because writing
4673             ENTRY f()
4674          as
4675             ENTRY f
4676          is allowed, whereas
4677             ENTRY f() RESULT (r)
4678          can't be written as
4679             ENTRY f RESULT (r).  */
4680       if (!gfc_current_ns->parent && !add_global_entry (name, 0))
4681         return MATCH_ERROR;
4682
4683       old_loc = gfc_current_locus;
4684       if (gfc_match_eos () == MATCH_YES)
4685         {
4686           gfc_current_locus = old_loc;
4687           /* Match the empty argument list, and add the interface to
4688              the symbol.  */
4689           m = gfc_match_formal_arglist (entry, 0, 1);
4690         }
4691       else
4692         m = gfc_match_formal_arglist (entry, 0, 0);
4693
4694       if (m != MATCH_YES)
4695         return MATCH_ERROR;
4696
4697       result = NULL;
4698
4699       if (gfc_match_eos () == MATCH_YES)
4700         {
4701           if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
4702               || gfc_add_function (&entry->attr, entry->name, NULL) == FAILURE)
4703             return MATCH_ERROR;
4704
4705           entry->result = entry;
4706         }
4707       else
4708         {
4709           m = gfc_match_suffix (entry, &result);
4710           if (m == MATCH_NO)
4711             gfc_syntax_error (ST_ENTRY);
4712           if (m != MATCH_YES)
4713             return MATCH_ERROR;
4714
4715           if (result)
4716             {
4717               if (gfc_add_result (&result->attr, result->name, NULL) == FAILURE
4718                   || gfc_add_entry (&entry->attr, result->name, NULL) == FAILURE
4719                   || gfc_add_function (&entry->attr, result->name, NULL)
4720                   == FAILURE)
4721                 return MATCH_ERROR;
4722               entry->result = result;
4723             }
4724           else
4725             {
4726               if (gfc_add_entry (&entry->attr, entry->name, NULL) == FAILURE
4727                   || gfc_add_function (&entry->attr, entry->name, NULL) == FAILURE)
4728                 return MATCH_ERROR;
4729               entry->result = entry;
4730             }
4731         }
4732     }
4733
4734   if (gfc_match_eos () != MATCH_YES)
4735     {
4736       gfc_syntax_error (ST_ENTRY);
4737       return MATCH_ERROR;
4738     }
4739
4740   entry->attr.recursive = proc->attr.recursive;
4741   entry->attr.elemental = proc->attr.elemental;
4742   entry->attr.pure = proc->attr.pure;
4743
4744   el = gfc_get_entry_list ();
4745   el->sym = entry;
4746   el->next = gfc_current_ns->entries;
4747   gfc_current_ns->entries = el;
4748   if (el->next)
4749     el->id = el->next->id + 1;
4750   else
4751     el->id = 1;
4752
4753   new_st.op = EXEC_ENTRY;
4754   new_st.ext.entry = el;
4755
4756   return MATCH_YES;
4757 }
4758
4759
4760 /* Match a subroutine statement, including optional prefixes.  */
4761
4762 match
4763 gfc_match_subroutine (void)
4764 {
4765   char name[GFC_MAX_SYMBOL_LEN + 1];
4766   gfc_symbol *sym;
4767   match m;
4768   match is_bind_c;
4769   char peek_char;
4770   bool allow_binding_name;
4771
4772   if (gfc_current_state () != COMP_NONE
4773       && gfc_current_state () != COMP_INTERFACE
4774       && gfc_current_state () != COMP_CONTAINS)
4775     return MATCH_NO;
4776
4777   m = gfc_match_prefix (NULL);
4778   if (m != MATCH_YES)
4779     return m;
4780
4781   m = gfc_match ("subroutine% %n", name);
4782   if (m != MATCH_YES)
4783     return m;
4784
4785   if (get_proc_name (name, &sym, false))
4786     return MATCH_ERROR;
4787   gfc_new_block = sym;
4788
4789   /* Check what next non-whitespace character is so we can tell if there
4790      is the required parens if we have a BIND(C).  */
4791   gfc_gobble_whitespace ();
4792   peek_char = gfc_peek_ascii_char ();
4793   
4794   if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
4795     return MATCH_ERROR;
4796
4797   if (gfc_match_formal_arglist (sym, 0, 1) != MATCH_YES)
4798     return MATCH_ERROR;
4799
4800   /* Make sure that it isn't already declared as BIND(C).  If it is, it
4801      must have been marked BIND(C) with a BIND(C) attribute and that is
4802      not allowed for procedures.  */
4803   if (sym->attr.is_bind_c == 1)
4804     {
4805       sym->attr.is_bind_c = 0;
4806       if (sym->old_symbol != NULL)
4807         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4808                        "variables or common blocks",
4809                        &(sym->old_symbol->declared_at));
4810       else
4811         gfc_error_now ("BIND(C) attribute at %L can only be used for "
4812                        "variables or common blocks", &gfc_current_locus);
4813     }
4814
4815   /* C binding names are not allowed for internal procedures.  */
4816   if (gfc_current_state () == COMP_CONTAINS
4817       && sym->ns->proc_name->attr.flavor != FL_MODULE)
4818     allow_binding_name = false;
4819   else
4820     allow_binding_name = true;
4821
4822   /* Here, we are just checking if it has the bind(c) attribute, and if
4823      so, then we need to make sure it's all correct.  If it doesn't,
4824      we still need to continue matching the rest of the subroutine line.  */
4825   is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
4826   if (is_bind_c == MATCH_ERROR)
4827     {
4828       /* There was an attempt at the bind(c), but it was wrong.  An
4829          error message should have been printed w/in the gfc_match_bind_c
4830          so here we'll just return the MATCH_ERROR.  */
4831       return MATCH_ERROR;
4832     }
4833
4834   if (is_bind_c == MATCH_YES)
4835     {
4836       /* The following is allowed in the Fortran 2008 draft.  */
4837       if (gfc_current_state () == COMP_CONTAINS
4838           && sym->ns->proc_name->attr.flavor != FL_MODULE
4839           && gfc_notify_std (GFC_STD_F2008, "Fortran 2008: BIND(C) attribute "
4840                              "at %L may not be specified for an internal "
4841                              "procedure", &gfc_current_locus)
4842              == FAILURE)
4843         return MATCH_ERROR;
4844
4845       if (peek_char != '(')
4846         {
4847           gfc_error ("Missing required parentheses before BIND(C) at %C");
4848           return MATCH_ERROR;
4849         }
4850       if (gfc_add_is_bind_c (&(sym->attr), sym->name, &(sym->declared_at), 1)
4851           == FAILURE)
4852         return MATCH_ERROR;
4853     }
4854   
4855   if (gfc_match_eos () != MATCH_YES)
4856     {
4857       gfc_syntax_error (ST_SUBROUTINE);
4858       return MATCH_ERROR;
4859     }
4860
4861   if (copy_prefix (&sym->attr, &sym->declared_at) == FAILURE)
4862     return MATCH_ERROR;
4863
4864   /* Warn if it has the same name as an intrinsic.  */
4865   warn_intrinsic_shadow (sym, false);
4866
4867   return MATCH_YES;
4868 }
4869
4870
4871 /* Match a BIND(C) specifier, with the optional 'name=' specifier if
4872    given, and set the binding label in either the given symbol (if not
4873    NULL), or in the current_ts.  The symbol may be NULL because we may
4874    encounter the BIND(C) before the declaration itself.  Return
4875    MATCH_NO if what we're looking at isn't a BIND(C) specifier,
4876    MATCH_ERROR if it is a BIND(C) clause but an error was encountered,
4877    or MATCH_YES if the specifier was correct and the binding label and
4878    bind(c) fields were set correctly for the given symbol or the
4879    current_ts. If allow_binding_name is false, no binding name may be
4880    given.  */
4881
4882 match
4883 gfc_match_bind_c (gfc_symbol *sym, bool allow_binding_name)
4884 {
4885   /* binding label, if exists */   
4886   char binding_label[GFC_MAX_SYMBOL_LEN + 1];
4887   match double_quote;
4888   match single_quote;
4889
4890   /* Initialize the flag that specifies whether we encountered a NAME= 
4891      specifier or not.  */
4892   has_name_equals = 0;
4893
4894   /* Init the first char to nil so we can catch if we don't have
4895      the label (name attr) or the symbol name yet.  */
4896   binding_label[0] = '\0';
4897    
4898   /* This much we have to be able to match, in this order, if
4899      there is a bind(c) label.  */
4900   if (gfc_match (" bind ( c ") != MATCH_YES)
4901     return MATCH_NO;
4902
4903   /* Now see if there is a binding label, or if we've reached the
4904      end of the bind(c) attribute without one.  */
4905   if (gfc_match_char (',') == MATCH_YES)
4906     {
4907       if (gfc_match (" name = ") != MATCH_YES)
4908         {
4909           gfc_error ("Syntax error in NAME= specifier for binding label "
4910                      "at %C");
4911           /* should give an error message here */
4912           return MATCH_ERROR;
4913         }
4914
4915       has_name_equals = 1;
4916
4917       /* Get the opening quote.  */
4918       double_quote = MATCH_YES;
4919       single_quote = MATCH_YES;
4920       double_quote = gfc_match_char ('"');
4921       if (double_quote != MATCH_YES)
4922         single_quote = gfc_match_char ('\'');
4923       if (double_quote != MATCH_YES && single_quote != MATCH_YES)
4924         {
4925           gfc_error ("Syntax error in NAME= specifier for binding label "
4926                      "at %C");
4927           return MATCH_ERROR;
4928         }
4929       
4930       /* Grab the binding label, using functions that will not lower
4931          case the names automatically.  */
4932       if (gfc_match_name_C (binding_label) != MATCH_YES)
4933          return MATCH_ERROR;
4934       
4935       /* Get the closing quotation.  */
4936       if (double_quote == MATCH_YES)
4937         {
4938           if (gfc_match_char ('"') != MATCH_YES)
4939             {
4940               gfc_error ("Missing closing quote '\"' for binding label at %C");
4941               /* User started string with '"' so looked to match it.  */
4942               return MATCH_ERROR;
4943             }
4944         }
4945       else
4946         {
4947           if (gfc_match_char ('\'') != MATCH_YES)
4948             {
4949               gfc_error ("Missing closing quote '\'' for binding label at %C");
4950               /* User started string with "'" char.  */
4951               return MATCH_ERROR;
4952             }
4953         }
4954    }
4955
4956   /* Get the required right paren.  */
4957   if (gfc_match_char (')') != MATCH_YES)
4958     {
4959       gfc_error ("Missing closing paren for binding label at %C");
4960       return MATCH_ERROR;
4961     }
4962
4963   if (has_name_equals && !allow_binding_name)
4964     {
4965       gfc_error ("No binding name is allowed in BIND(C) at %C");
4966       return MATCH_ERROR;
4967     }
4968
4969   if (has_name_equals && sym != NULL && sym->attr.dummy)
4970     {
4971       gfc_error ("For dummy procedure %s, no binding name is "
4972                  "allowed in BIND(C) at %C", sym->name);
4973       return MATCH_ERROR;
4974     }
4975
4976
4977   /* Save the binding label to the symbol.  If sym is null, we're
4978      probably matching the typespec attributes of a declaration and
4979      haven't gotten the name yet, and therefore, no symbol yet.  */
4980   if (binding_label[0] != '\0')
4981     {
4982       if (sym != NULL)
4983       {
4984         strcpy (sym->binding_label, binding_label);
4985       }
4986       else
4987         strcpy (curr_binding_label, binding_label);
4988     }
4989   else if (allow_binding_name)
4990     {
4991       /* No binding label, but if symbol isn't null, we
4992          can set the label for it here.
4993          If name="" or allow_binding_name is false, no C binding name is
4994          created. */
4995       if (sym != NULL && sym->name != NULL && has_name_equals == 0)
4996         strncpy (sym->binding_label, sym->name, strlen (sym->name) + 1);
4997     }
4998
4999   if (has_name_equals && gfc_current_state () == COMP_INTERFACE
5000       && current_interface.type == INTERFACE_ABSTRACT)
5001     {
5002       gfc_error ("NAME not allowed on BIND(C) for ABSTRACT INTERFACE at %C");
5003       return MATCH_ERROR;
5004     }
5005
5006   return MATCH_YES;
5007 }
5008
5009
5010 /* Return nonzero if we're currently compiling a contained procedure.  */
5011
5012 static int
5013 contained_procedure (void)
5014 {
5015   gfc_state_data *s = gfc_state_stack;
5016
5017   if ((s->state == COMP_SUBROUTINE || s->state == COMP_FUNCTION)
5018       && s->previous != NULL && s->previous->state == COMP_CONTAINS)
5019     return 1;
5020
5021   return 0;
5022 }
5023
5024 /* Set the kind of each enumerator.  The kind is selected such that it is
5025    interoperable with the corresponding C enumeration type, making
5026    sure that -fshort-enums is honored.  */
5027
5028 static void
5029 set_enum_kind(void)
5030 {
5031   enumerator_history *current_history = NULL;
5032   int kind;
5033   int i;
5034
5035   if (max_enum == NULL || enum_history == NULL)
5036     return;
5037
5038   if (!gfc_option.fshort_enums)
5039     return;
5040
5041   i = 0;
5042   do
5043     {
5044       kind = gfc_integer_kinds[i++].kind;
5045     }
5046   while (kind < gfc_c_int_kind
5047          && gfc_check_integer_range (max_enum->initializer->value.integer,
5048                                      kind) != ARITH_OK);
5049
5050   current_history = enum_history;
5051   while (current_history != NULL)
5052     {
5053       current_history->sym->ts.kind = kind;
5054       current_history = current_history->next;
5055     }
5056 }
5057
5058
5059 /* Match any of the various end-block statements.  Returns the type of
5060    END to the caller.  The END INTERFACE, END IF, END DO and END
5061    SELECT statements cannot be replaced by a single END statement.  */
5062
5063 match
5064 gfc_match_end (gfc_statement *st)
5065 {
5066   char name[GFC_MAX_SYMBOL_LEN + 1];
5067   gfc_compile_state state;
5068   locus old_loc;
5069   const char *block_name;
5070   const char *target;
5071   int eos_ok;
5072   match m;
5073
5074   old_loc = gfc_current_locus;
5075   if (gfc_match ("end") != MATCH_YES)
5076     return MATCH_NO;
5077
5078   state = gfc_current_state ();
5079   block_name = gfc_current_block () == NULL
5080              ? NULL : gfc_current_block ()->name;
5081
5082   if (state == COMP_CONTAINS)
5083     {
5084       state = gfc_state_stack->previous->state;
5085       block_name = gfc_state_stack->previous->sym == NULL
5086                  ? NULL : gfc_state_stack->previous->sym->name;
5087     }
5088
5089   switch (state)
5090     {
5091     case COMP_NONE:
5092     case COMP_PROGRAM:
5093       *st = ST_END_PROGRAM;
5094       target = " program";
5095       eos_ok = 1;
5096       break;
5097
5098     case COMP_SUBROUTINE:
5099       *st = ST_END_SUBROUTINE;
5100       target = " subroutine";
5101       eos_ok = !contained_procedure ();
5102       break;
5103
5104     case COMP_FUNCTION:
5105       *st = ST_END_FUNCTION;
5106       target = " function";
5107       eos_ok = !contained_procedure ();
5108       break;
5109
5110     case COMP_BLOCK_DATA:
5111       *st = ST_END_BLOCK_DATA;
5112       target = " block data";
5113       eos_ok = 1;
5114       break;
5115
5116     case COMP_MODULE:
5117       *st = ST_END_MODULE;
5118       target = " module";
5119       eos_ok = 1;
5120       break;
5121
5122     case COMP_INTERFACE:
5123       *st = ST_END_INTERFACE;
5124       target = " interface";
5125       eos_ok = 0;
5126       break;
5127
5128     case COMP_DERIVED:
5129       *st = ST_END_TYPE;
5130       target = " type";
5131       eos_ok = 0;
5132       break;
5133
5134     case COMP_IF:
5135       *st = ST_ENDIF;
5136       target = " if";
5137       eos_ok = 0;
5138       break;
5139
5140     case COMP_DO:
5141       *st = ST_ENDDO;
5142       target = " do";
5143       eos_ok = 0;
5144       break;
5145
5146     case COMP_SELECT:
5147       *st = ST_END_SELECT;
5148       target = " select";
5149       eos_ok = 0;
5150       break;
5151
5152     case COMP_FORALL:
5153       *st = ST_END_FORALL;
5154       target = " forall";
5155       eos_ok = 0;
5156       break;
5157
5158     case COMP_WHERE:
5159       *st = ST_END_WHERE;
5160       target = " where";
5161       eos_ok = 0;
5162       break;
5163
5164     case COMP_ENUM:
5165       *st = ST_END_ENUM;
5166       target = " enum";
5167       eos_ok = 0;
5168       last_initializer = NULL;
5169       set_enum_kind ();
5170       gfc_free_enum_history ();
5171       break;
5172
5173     default:
5174       gfc_error ("Unexpected END statement at %C");
5175       goto cleanup;
5176     }
5177
5178   if (gfc_match_eos () == MATCH_YES)
5179     {
5180       if (!eos_ok)
5181         {
5182           /* We would have required END [something].  */
5183           gfc_error ("%s statement expected at %L",
5184                      gfc_ascii_statement (*st), &old_loc);
5185           goto cleanup;
5186         }
5187
5188       return MATCH_YES;
5189     }
5190
5191   /* Verify that we've got the sort of end-block that we're expecting.  */
5192   if (gfc_match (target) != MATCH_YES)
5193     {
5194       gfc_error ("Expecting %s statement at %C", gfc_ascii_statement (*st));
5195       goto cleanup;
5196     }
5197
5198   /* If we're at the end, make sure a block name wasn't required.  */
5199   if (gfc_match_eos () == MATCH_YES)
5200     {
5201
5202       if (*st != ST_ENDDO && *st != ST_ENDIF && *st != ST_END_SELECT
5203           && *st != ST_END_FORALL && *st != ST_END_WHERE)
5204         return MATCH_YES;
5205
5206       if (gfc_current_block () == NULL)
5207         return MATCH_YES;
5208
5209       gfc_error ("Expected block name of '%s' in %s statement at %C",
5210                  block_name, gfc_ascii_statement (*st));
5211
5212       return MATCH_ERROR;
5213     }
5214
5215   /* END INTERFACE has a special handler for its several possible endings.  */
5216   if (*st == ST_END_INTERFACE)
5217     return gfc_match_end_interface ();
5218
5219   /* We haven't hit the end of statement, so what is left must be an
5220      end-name.  */
5221   m = gfc_match_space ();
5222   if (m == MATCH_YES)
5223     m = gfc_match_name (name);
5224
5225   if (m == MATCH_NO)
5226     gfc_error ("Expected terminating name at %C");
5227   if (m != MATCH_YES)
5228     goto cleanup;
5229
5230   if (block_name == NULL)
5231     goto syntax;
5232
5233   if (strcmp (name, block_name) != 0)
5234     {
5235       gfc_error ("Expected label '%s' for %s statement at %C", block_name,
5236                  gfc_ascii_statement (*st));
5237       goto cleanup;
5238     }
5239
5240   if (gfc_match_eos () == MATCH_YES)
5241     return MATCH_YES;
5242
5243 syntax:
5244   gfc_syntax_error (*st);
5245
5246 cleanup:
5247   gfc_current_locus = old_loc;
5248   return MATCH_ERROR;
5249 }
5250
5251
5252
5253 /***************** Attribute declaration statements ****************/
5254
5255 /* Set the attribute of a single variable.  */
5256
5257 static match
5258 attr_decl1 (void)
5259 {
5260   char name[GFC_MAX_SYMBOL_LEN + 1];
5261   gfc_array_spec *as;
5262   gfc_symbol *sym;
5263   locus var_locus;
5264   match m;
5265
5266   as = NULL;
5267
5268   m = gfc_match_name (name);
5269   if (m != MATCH_YES)
5270     goto cleanup;
5271
5272   if (find_special (name, &sym))
5273     return MATCH_ERROR;
5274
5275   var_locus = gfc_current_locus;
5276
5277   /* Deal with possible array specification for certain attributes.  */
5278   if (current_attr.dimension
5279       || current_attr.allocatable
5280       || current_attr.pointer
5281       || current_attr.target)
5282     {
5283       m = gfc_match_array_spec (&as);
5284       if (m == MATCH_ERROR)
5285         goto cleanup;
5286
5287       if (current_attr.dimension && m == MATCH_NO)
5288         {
5289           gfc_error ("Missing array specification at %L in DIMENSION "
5290                      "statement", &var_locus);
5291           m = MATCH_ERROR;
5292           goto cleanup;
5293         }
5294
5295       if (current_attr.dimension && sym->value)
5296         {
5297           gfc_error ("Dimensions specified for %s at %L after its "
5298                      "initialisation", sym->name, &var_locus);
5299           m = MATCH_ERROR;
5300           goto cleanup;
5301         }
5302
5303       if ((current_attr.allocatable || current_attr.pointer)
5304           && (m == MATCH_YES) && (as->type != AS_DEFERRED))
5305         {
5306           gfc_error ("Array specification must be deferred at %L", &var_locus);
5307           m = MATCH_ERROR;
5308           goto cleanup;
5309         }
5310     }
5311
5312   /* Update symbol table.  DIMENSION attribute is set
5313      in gfc_set_array_spec().  */
5314   if (current_attr.dimension == 0
5315       && gfc_copy_attr (&sym->attr, &current_attr, &var_locus) == FAILURE)
5316     {
5317       m = MATCH_ERROR;
5318       goto cleanup;
5319     }
5320
5321   if (gfc_set_array_spec (sym, as, &var_locus) == FAILURE)
5322     {
5323       m = MATCH_ERROR;
5324       goto cleanup;
5325     }
5326
5327   if (sym->attr.cray_pointee && sym->as != NULL)
5328     {
5329       /* Fix the array spec.  */
5330       m = gfc_mod_pointee_as (sym->as);         
5331       if (m == MATCH_ERROR)
5332         goto cleanup;
5333     }
5334
5335   if (gfc_add_attribute (&sym->attr, &var_locus) == FAILURE)
5336     {
5337       m = MATCH_ERROR;
5338       goto cleanup;
5339     }
5340
5341   if ((current_attr.external || current_attr.intrinsic)
5342       && sym->attr.flavor != FL_PROCEDURE
5343       && gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL) == FAILURE)
5344     {
5345       m = MATCH_ERROR;
5346       goto cleanup;
5347     }
5348
5349   return MATCH_YES;
5350
5351 cleanup:
5352   gfc_free_array_spec (as);
5353   return m;
5354 }
5355
5356
5357 /* Generic attribute declaration subroutine.  Used for attributes that
5358    just have a list of names.  */
5359
5360 static match
5361 attr_decl (void)
5362 {
5363   match m;
5364
5365   /* Gobble the optional double colon, by simply ignoring the result
5366      of gfc_match().  */
5367   gfc_match (" ::");
5368
5369   for (;;)
5370     {
5371       m = attr_decl1 ();
5372       if (m != MATCH_YES)
5373         break;
5374
5375       if (gfc_match_eos () == MATCH_YES)
5376         {
5377           m = MATCH_YES;
5378           break;
5379         }
5380
5381       if (gfc_match_char (',') != MATCH_YES)
5382         {
5383           gfc_error ("Unexpected character in variable list at %C");
5384           m = MATCH_ERROR;
5385           break;
5386         }
5387     }
5388
5389   return m;
5390 }
5391
5392
5393 /* This routine matches Cray Pointer declarations of the form:
5394    pointer ( <pointer>, <pointee> )
5395    or
5396    pointer ( <pointer1>, <pointee1> ), ( <pointer2>, <pointee2> ), ...
5397    The pointer, if already declared, should be an integer.  Otherwise, we
5398    set it as BT_INTEGER with kind gfc_index_integer_kind.  The pointee may
5399    be either a scalar, or an array declaration.  No space is allocated for
5400    the pointee.  For the statement
5401    pointer (ipt, ar(10))
5402    any subsequent uses of ar will be translated (in C-notation) as
5403    ar(i) => ((<type> *) ipt)(i)
5404    After gimplification, pointee variable will disappear in the code.  */
5405
5406 static match
5407 cray_pointer_decl (void)
5408 {
5409   match m;
5410   gfc_array_spec *as;
5411   gfc_symbol *cptr; /* Pointer symbol.  */
5412   gfc_symbol *cpte; /* Pointee symbol.  */
5413   locus var_locus;
5414   bool done = false;
5415
5416   while (!done)
5417     {
5418       if (gfc_match_char ('(') != MATCH_YES)
5419         {
5420           gfc_error ("Expected '(' at %C");
5421           return MATCH_ERROR;
5422         }
5423
5424       /* Match pointer.  */
5425       var_locus = gfc_current_locus;
5426       gfc_clear_attr (&current_attr);
5427       gfc_add_cray_pointer (&current_attr, &var_locus);
5428       current_ts.type = BT_INTEGER;
5429       current_ts.kind = gfc_index_integer_kind;
5430
5431       m = gfc_match_symbol (&cptr, 0);
5432       if (m != MATCH_YES)
5433         {
5434           gfc_error ("Expected variable name at %C");
5435           return m;
5436         }
5437
5438       if (gfc_add_cray_pointer (&cptr->attr, &var_locus) == FAILURE)
5439         return MATCH_ERROR;
5440
5441       gfc_set_sym_referenced (cptr);
5442
5443       if (cptr->ts.type == BT_UNKNOWN) /* Override the type, if necessary.  */
5444         {
5445           cptr->ts.type = BT_INTEGER;
5446           cptr->ts.kind = gfc_index_integer_kind;
5447         }
5448       else if (cptr->ts.type != BT_INTEGER)
5449         {
5450           gfc_error ("Cray pointer at %C must be an integer");
5451           return MATCH_ERROR;
5452         }
5453       else if (cptr->ts.kind < gfc_index_integer_kind)
5454         gfc_warning ("Cray pointer at %C has %d bytes of precision;"
5455                      " memory addresses require %d bytes",
5456                      cptr->ts.kind, gfc_index_integer_kind);
5457
5458       if (gfc_match_char (',') != MATCH_YES)
5459         {
5460           gfc_error ("Expected \",\" at %C");
5461           return MATCH_ERROR;
5462         }
5463
5464       /* Match Pointee.  */
5465       var_locus = gfc_current_locus;
5466       gfc_clear_attr (&current_attr);
5467       gfc_add_cray_pointee (&current_attr, &var_locus);
5468       current_ts.type = BT_UNKNOWN;
5469       current_ts.kind = 0;
5470
5471       m = gfc_match_symbol (&cpte, 0);
5472       if (m != MATCH_YES)
5473         {
5474           gfc_error ("Expected variable name at %C");
5475           return m;
5476         }
5477
5478       /* Check for an optional array spec.  */
5479       m = gfc_match_array_spec (&as);
5480       if (m == MATCH_ERROR)
5481         {
5482           gfc_free_array_spec (as);
5483           return m;
5484         }
5485       else if (m == MATCH_NO)
5486         {
5487           gfc_free_array_spec (as);
5488           as = NULL;
5489         }   
5490
5491       if (gfc_add_cray_pointee (&cpte->attr, &var_locus) == FAILURE)
5492         return MATCH_ERROR;
5493
5494       gfc_set_sym_referenced (cpte);
5495
5496       if (cpte->as == NULL)
5497         {
5498           if (gfc_set_array_spec (cpte, as, &var_locus) == FAILURE)
5499             gfc_internal_error ("Couldn't set Cray pointee array spec.");
5500         }
5501       else if (as != NULL)
5502         {
5503           gfc_error ("Duplicate array spec for Cray pointee at %C");
5504           gfc_free_array_spec (as);
5505           return MATCH_ERROR;
5506         }
5507       
5508       as = NULL;
5509     
5510       if (cpte->as != NULL)
5511         {
5512           /* Fix array spec.  */
5513           m = gfc_mod_pointee_as (cpte->as);
5514           if (m == MATCH_ERROR)
5515             return m;
5516         } 
5517    
5518       /* Point the Pointee at the Pointer.  */
5519       cpte->cp_pointer = cptr;
5520
5521       if (gfc_match_char (')') != MATCH_YES)
5522         {
5523           gfc_error ("Expected \")\" at %C");
5524           return MATCH_ERROR;    
5525         }
5526       m = gfc_match_char (',');
5527       if (m != MATCH_YES)
5528         done = true; /* Stop searching for more declarations.  */
5529
5530     }
5531   
5532   if (m == MATCH_ERROR /* Failed when trying to find ',' above.  */
5533       || gfc_match_eos () != MATCH_YES)
5534     {
5535       gfc_error ("Expected \",\" or end of statement at %C");
5536       return MATCH_ERROR;
5537     }
5538   return MATCH_YES;
5539 }
5540
5541
5542 match
5543 gfc_match_external (void)
5544 {
5545
5546   gfc_clear_attr (&current_attr);
5547   current_attr.external = 1;
5548
5549   return attr_decl ();
5550 }
5551
5552
5553 match
5554 gfc_match_intent (void)
5555 {
5556   sym_intent intent;
5557
5558   intent = match_intent_spec ();
5559   if (intent == INTENT_UNKNOWN)
5560     return MATCH_ERROR;
5561
5562   gfc_clear_attr (&current_attr);
5563   current_attr.intent = intent;
5564
5565   return attr_decl ();
5566 }
5567
5568
5569 match
5570 gfc_match_intrinsic (void)
5571 {
5572
5573   gfc_clear_attr (&current_attr);
5574   current_attr.intrinsic = 1;
5575
5576   return attr_decl ();
5577 }
5578
5579
5580 match
5581 gfc_match_optional (void)
5582 {
5583
5584   gfc_clear_attr (&current_attr);
5585   current_attr.optional = 1;
5586
5587   return attr_decl ();
5588 }
5589
5590
5591 match
5592 gfc_match_pointer (void)
5593 {
5594   gfc_gobble_whitespace ();
5595   if (gfc_peek_ascii_char () == '(')
5596     {
5597       if (!gfc_option.flag_cray_pointer)
5598         {
5599           gfc_error ("Cray pointer declaration at %C requires -fcray-pointer "
5600                      "flag");
5601           return MATCH_ERROR;
5602         }
5603       return cray_pointer_decl ();
5604     }
5605   else
5606     {
5607       gfc_clear_attr (&current_attr);
5608       current_attr.pointer = 1;
5609     
5610       return attr_decl ();
5611     }
5612 }
5613
5614
5615 match
5616 gfc_match_allocatable (void)
5617 {
5618   gfc_clear_attr (&current_attr);
5619   current_attr.allocatable = 1;
5620
5621   return attr_decl ();
5622 }
5623
5624
5625 match
5626 gfc_match_dimension (void)
5627 {
5628   gfc_clear_attr (&current_attr);
5629   current_attr.dimension = 1;
5630
5631   return attr_decl ();
5632 }
5633
5634
5635 match
5636 gfc_match_target (void)
5637 {
5638   gfc_clear_attr (&current_attr);
5639   current_attr.target = 1;
5640
5641   return attr_decl ();
5642 }
5643
5644
5645 /* Match the list of entities being specified in a PUBLIC or PRIVATE
5646    statement.  */
5647
5648 static match
5649 access_attr_decl (gfc_statement st)
5650 {
5651   char name[GFC_MAX_SYMBOL_LEN + 1];
5652   interface_type type;
5653   gfc_user_op *uop;
5654   gfc_symbol *sym;
5655   gfc_intrinsic_op op;
5656   match m;
5657
5658   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
5659     goto done;
5660
5661   for (;;)
5662     {
5663       m = gfc_match_generic_spec (&type, name, &op);
5664       if (m == MATCH_NO)
5665         goto syntax;
5666       if (m == MATCH_ERROR)
5667         return MATCH_ERROR;
5668
5669       switch (type)
5670         {
5671         case INTERFACE_NAMELESS:
5672         case INTERFACE_ABSTRACT:
5673           goto syntax;
5674
5675         case INTERFACE_GENERIC:
5676           if (gfc_get_symbol (name, NULL, &sym))
5677             goto done;
5678
5679           if (gfc_add_access (&sym->attr, (st == ST_PUBLIC)
5680                                           ? ACCESS_PUBLIC : ACCESS_PRIVATE,
5681                               sym->name, NULL) == FAILURE)
5682             return MATCH_ERROR;
5683
5684           break;
5685
5686         case INTERFACE_INTRINSIC_OP:
5687           if (gfc_current_ns->operator_access[op] == ACCESS_UNKNOWN)
5688             {
5689               gfc_current_ns->operator_access[op] =
5690                 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
5691             }
5692           else
5693             {
5694               gfc_error ("Access specification of the %s operator at %C has "
5695                          "already been specified", gfc_op2string (op));
5696               goto done;
5697             }
5698
5699           break;
5700
5701         case INTERFACE_USER_OP:
5702           uop = gfc_get_uop (name);
5703
5704           if (uop->access == ACCESS_UNKNOWN)
5705             {
5706               uop->access = (st == ST_PUBLIC)
5707                           ? ACCESS_PUBLIC : ACCESS_PRIVATE;
5708             }
5709           else
5710             {
5711               gfc_error ("Access specification of the .%s. operator at %C "
5712                          "has already been specified", sym->name);
5713               goto done;
5714             }
5715
5716           break;
5717         }
5718
5719       if (gfc_match_char (',') == MATCH_NO)
5720         break;
5721     }
5722
5723   if (gfc_match_eos () != MATCH_YES)
5724     goto syntax;
5725   return MATCH_YES;
5726
5727 syntax:
5728   gfc_syntax_error (st);
5729
5730 done:
5731   return MATCH_ERROR;
5732 }
5733
5734
5735 match
5736 gfc_match_protected (void)
5737 {
5738   gfc_symbol *sym;
5739   match m;
5740
5741   if (gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
5742     {
5743        gfc_error ("PROTECTED at %C only allowed in specification "
5744                   "part of a module");
5745        return MATCH_ERROR;
5746
5747     }
5748
5749   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: PROTECTED statement at %C")
5750       == FAILURE)
5751     return MATCH_ERROR;
5752
5753   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
5754     {
5755       return MATCH_ERROR;
5756     }
5757
5758   if (gfc_match_eos () == MATCH_YES)
5759     goto syntax;
5760
5761   for(;;)
5762     {
5763       m = gfc_match_symbol (&sym, 0);
5764       switch (m)
5765         {
5766         case MATCH_YES:
5767           if (gfc_add_protected (&sym->attr, sym->name, &gfc_current_locus)
5768               == FAILURE)
5769             return MATCH_ERROR;
5770           goto next_item;
5771
5772         case MATCH_NO:
5773           break;
5774
5775         case MATCH_ERROR:
5776           return MATCH_ERROR;
5777         }
5778
5779     next_item:
5780       if (gfc_match_eos () == MATCH_YES)
5781         break;
5782       if (gfc_match_char (',') != MATCH_YES)
5783         goto syntax;
5784     }
5785
5786   return MATCH_YES;
5787
5788 syntax:
5789   gfc_error ("Syntax error in PROTECTED statement at %C");
5790   return MATCH_ERROR;
5791 }
5792
5793
5794 /* The PRIVATE statement is a bit weird in that it can be an attribute
5795    declaration, but also works as a standalone statement inside of a
5796    type declaration or a module.  */
5797
5798 match
5799 gfc_match_private (gfc_statement *st)
5800 {
5801
5802   if (gfc_match ("private") != MATCH_YES)
5803     return MATCH_NO;
5804
5805   if (gfc_current_state () != COMP_MODULE
5806       && (gfc_current_state () != COMP_DERIVED
5807           || !gfc_state_stack->previous
5808           || gfc_state_stack->previous->state != COMP_MODULE))
5809     {
5810       gfc_error ("PRIVATE statement at %C is only allowed in the "
5811                  "specification part of a module");
5812       return MATCH_ERROR;
5813     }
5814
5815   if (gfc_current_state () == COMP_DERIVED)
5816     {
5817       if (gfc_match_eos () == MATCH_YES)
5818         {
5819           *st = ST_PRIVATE;
5820           return MATCH_YES;
5821         }
5822
5823       gfc_syntax_error (ST_PRIVATE);
5824       return MATCH_ERROR;
5825     }
5826
5827   if (gfc_match_eos () == MATCH_YES)
5828     {
5829       *st = ST_PRIVATE;
5830       return MATCH_YES;
5831     }
5832
5833   *st = ST_ATTR_DECL;
5834   return access_attr_decl (ST_PRIVATE);
5835 }
5836
5837
5838 match
5839 gfc_match_public (gfc_statement *st)
5840 {
5841
5842   if (gfc_match ("public") != MATCH_YES)
5843     return MATCH_NO;
5844
5845   if (gfc_current_state () != COMP_MODULE)
5846     {
5847       gfc_error ("PUBLIC statement at %C is only allowed in the "
5848                  "specification part of a module");
5849       return MATCH_ERROR;
5850     }
5851
5852   if (gfc_match_eos () == MATCH_YES)
5853     {
5854       *st = ST_PUBLIC;
5855       return MATCH_YES;
5856     }
5857
5858   *st = ST_ATTR_DECL;
5859   return access_attr_decl (ST_PUBLIC);
5860 }
5861
5862
5863 /* Workhorse for gfc_match_parameter.  */
5864
5865 static match
5866 do_parm (void)
5867 {
5868   gfc_symbol *sym;
5869   gfc_expr *init;
5870   match m;
5871
5872   m = gfc_match_symbol (&sym, 0);
5873   if (m == MATCH_NO)
5874     gfc_error ("Expected variable name at %C in PARAMETER statement");
5875
5876   if (m != MATCH_YES)
5877     return m;
5878
5879   if (gfc_match_char ('=') == MATCH_NO)
5880     {
5881       gfc_error ("Expected = sign in PARAMETER statement at %C");
5882       return MATCH_ERROR;
5883     }
5884
5885   m = gfc_match_init_expr (&init);
5886   if (m == MATCH_NO)
5887     gfc_error ("Expected expression at %C in PARAMETER statement");
5888   if (m != MATCH_YES)
5889     return m;
5890
5891   if (sym->ts.type == BT_UNKNOWN
5892       && gfc_set_default_type (sym, 1, NULL) == FAILURE)
5893     {
5894       m = MATCH_ERROR;
5895       goto cleanup;
5896     }
5897
5898   if (gfc_check_assign_symbol (sym, init) == FAILURE
5899       || gfc_add_flavor (&sym->attr, FL_PARAMETER, sym->name, NULL) == FAILURE)
5900     {
5901       m = MATCH_ERROR;
5902       goto cleanup;
5903     }
5904
5905   if (sym->value)
5906     {
5907       gfc_error ("Initializing already initialized variable at %C");
5908       m = MATCH_ERROR;
5909       goto cleanup;
5910     }
5911
5912   if (sym->ts.type == BT_CHARACTER
5913       && sym->ts.cl != NULL
5914       && sym->ts.cl->length != NULL
5915       && sym->ts.cl->length->expr_type == EXPR_CONSTANT
5916       && init->expr_type == EXPR_CONSTANT
5917       && init->ts.type == BT_CHARACTER)
5918     gfc_set_constant_character_len (
5919       mpz_get_si (sym->ts.cl->length->value.integer), init, -1);
5920   else if (sym->ts.type == BT_CHARACTER && sym->ts.cl != NULL
5921            && sym->ts.cl->length == NULL)
5922         {
5923           int clen;
5924           if (init->expr_type == EXPR_CONSTANT)
5925             {
5926               clen = init->value.character.length;
5927               sym->ts.cl->length = gfc_int_expr (clen);
5928             }
5929           else if (init->expr_type == EXPR_ARRAY)
5930             {
5931               gfc_expr *p = init->value.constructor->expr;
5932               clen = p->value.character.length;
5933               sym->ts.cl->length = gfc_int_expr (clen);
5934             }
5935           else if (init->ts.cl && init->ts.cl->length)
5936             sym->ts.cl->length = gfc_copy_expr (sym->value->ts.cl->length);
5937         }
5938
5939   sym->value = init;
5940   return MATCH_YES;
5941
5942 cleanup:
5943   gfc_free_expr (init);
5944   return m;
5945 }
5946
5947
5948 /* Match a parameter statement, with the weird syntax that these have.  */
5949
5950 match
5951 gfc_match_parameter (void)
5952 {
5953   match m;
5954
5955   if (gfc_match_char ('(') == MATCH_NO)
5956     return MATCH_NO;
5957
5958   for (;;)
5959     {
5960       m = do_parm ();
5961       if (m != MATCH_YES)
5962         break;
5963
5964       if (gfc_match (" )%t") == MATCH_YES)
5965         break;
5966
5967       if (gfc_match_char (',') != MATCH_YES)
5968         {
5969           gfc_error ("Unexpected characters in PARAMETER statement at %C");
5970           m = MATCH_ERROR;
5971           break;
5972         }
5973     }
5974
5975   return m;
5976 }
5977
5978
5979 /* Save statements have a special syntax.  */
5980
5981 match
5982 gfc_match_save (void)
5983 {
5984   char n[GFC_MAX_SYMBOL_LEN+1];
5985   gfc_common_head *c;
5986   gfc_symbol *sym;
5987   match m;
5988
5989   if (gfc_match_eos () == MATCH_YES)
5990     {
5991       if (gfc_current_ns->seen_save)
5992         {
5993           if (gfc_notify_std (GFC_STD_LEGACY, "Blanket SAVE statement at %C "
5994                               "follows previous SAVE statement")
5995               == FAILURE)
5996             return MATCH_ERROR;
5997         }
5998
5999       gfc_current_ns->save_all = gfc_current_ns->seen_save = 1;
6000       return MATCH_YES;
6001     }
6002
6003   if (gfc_current_ns->save_all)
6004     {
6005       if (gfc_notify_std (GFC_STD_LEGACY, "SAVE statement at %C follows "
6006                           "blanket SAVE statement")
6007           == FAILURE)
6008         return MATCH_ERROR;
6009     }
6010
6011   gfc_match (" ::");
6012
6013   for (;;)
6014     {
6015       m = gfc_match_symbol (&sym, 0);
6016       switch (m)
6017         {
6018         case MATCH_YES:
6019           if (gfc_add_save (&sym->attr, sym->name, &gfc_current_locus)
6020               == FAILURE)
6021             return MATCH_ERROR;
6022           goto next_item;
6023
6024         case MATCH_NO:
6025           break;
6026
6027         case MATCH_ERROR:
6028           return MATCH_ERROR;
6029         }
6030
6031       m = gfc_match (" / %n /", &n);
6032       if (m == MATCH_ERROR)
6033         return MATCH_ERROR;
6034       if (m == MATCH_NO)
6035         goto syntax;
6036
6037       c = gfc_get_common (n, 0);
6038       c->saved = 1;
6039
6040       gfc_current_ns->seen_save = 1;
6041
6042     next_item:
6043       if (gfc_match_eos () == MATCH_YES)
6044         break;
6045       if (gfc_match_char (',') != MATCH_YES)
6046         goto syntax;
6047     }
6048
6049   return MATCH_YES;
6050
6051 syntax:
6052   gfc_error ("Syntax error in SAVE statement at %C");
6053   return MATCH_ERROR;
6054 }
6055
6056
6057 match
6058 gfc_match_value (void)
6059 {
6060   gfc_symbol *sym;
6061   match m;
6062
6063   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: VALUE statement at %C")
6064       == FAILURE)
6065     return MATCH_ERROR;
6066
6067   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6068     {
6069       return MATCH_ERROR;
6070     }
6071
6072   if (gfc_match_eos () == MATCH_YES)
6073     goto syntax;
6074
6075   for(;;)
6076     {
6077       m = gfc_match_symbol (&sym, 0);
6078       switch (m)
6079         {
6080         case MATCH_YES:
6081           if (gfc_add_value (&sym->attr, sym->name, &gfc_current_locus)
6082               == FAILURE)
6083             return MATCH_ERROR;
6084           goto next_item;
6085
6086         case MATCH_NO:
6087           break;
6088
6089         case MATCH_ERROR:
6090           return MATCH_ERROR;
6091         }
6092
6093     next_item:
6094       if (gfc_match_eos () == MATCH_YES)
6095         break;
6096       if (gfc_match_char (',') != MATCH_YES)
6097         goto syntax;
6098     }
6099
6100   return MATCH_YES;
6101
6102 syntax:
6103   gfc_error ("Syntax error in VALUE statement at %C");
6104   return MATCH_ERROR;
6105 }
6106
6107
6108 match
6109 gfc_match_volatile (void)
6110 {
6111   gfc_symbol *sym;
6112   match m;
6113
6114   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: VOLATILE statement at %C")
6115       == FAILURE)
6116     return MATCH_ERROR;
6117
6118   if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
6119     {
6120       return MATCH_ERROR;
6121     }
6122
6123   if (gfc_match_eos () == MATCH_YES)
6124     goto syntax;
6125
6126   for(;;)
6127     {
6128       /* VOLATILE is special because it can be added to host-associated 
6129          symbols locally.  */
6130       m = gfc_match_symbol (&sym, 1);
6131       switch (m)
6132         {
6133         case MATCH_YES:
6134           if (gfc_add_volatile (&sym->attr, sym->name, &gfc_current_locus)
6135               == FAILURE)
6136             return MATCH_ERROR;
6137           goto next_item;
6138
6139         case MATCH_NO:
6140           break;
6141
6142         case MATCH_ERROR:
6143           return MATCH_ERROR;
6144         }
6145
6146     next_item:
6147       if (gfc_match_eos () == MATCH_YES)
6148         break;
6149       if (gfc_match_char (',') != MATCH_YES)
6150         goto syntax;
6151     }
6152
6153   return MATCH_YES;
6154
6155 syntax:
6156   gfc_error ("Syntax error in VOLATILE statement at %C");
6157   return MATCH_ERROR;
6158 }
6159
6160
6161 /* Match a module procedure statement.  Note that we have to modify
6162    symbols in the parent's namespace because the current one was there
6163    to receive symbols that are in an interface's formal argument list.  */
6164
6165 match
6166 gfc_match_modproc (void)
6167 {
6168   char name[GFC_MAX_SYMBOL_LEN + 1];
6169   gfc_symbol *sym;
6170   match m;
6171   gfc_namespace *module_ns;
6172   gfc_interface *old_interface_head, *interface;
6173
6174   if (gfc_state_stack->state != COMP_INTERFACE
6175       || gfc_state_stack->previous == NULL
6176       || current_interface.type == INTERFACE_NAMELESS
6177       || current_interface.type == INTERFACE_ABSTRACT)
6178     {
6179       gfc_error ("MODULE PROCEDURE at %C must be in a generic module "
6180                  "interface");
6181       return MATCH_ERROR;
6182     }
6183
6184   module_ns = gfc_current_ns->parent;
6185   for (; module_ns; module_ns = module_ns->parent)
6186     if (module_ns->proc_name->attr.flavor == FL_MODULE)
6187       break;
6188
6189   if (module_ns == NULL)
6190     return MATCH_ERROR;
6191
6192   /* Store the current state of the interface. We will need it if we
6193      end up with a syntax error and need to recover.  */
6194   old_interface_head = gfc_current_interface_head ();
6195
6196   for (;;)
6197     {
6198       bool last = false;
6199
6200       m = gfc_match_name (name);
6201       if (m == MATCH_NO)
6202         goto syntax;
6203       if (m != MATCH_YES)
6204         return MATCH_ERROR;
6205
6206       /* Check for syntax error before starting to add symbols to the
6207          current namespace.  */
6208       if (gfc_match_eos () == MATCH_YES)
6209         last = true;
6210       if (!last && gfc_match_char (',') != MATCH_YES)
6211         goto syntax;
6212
6213       /* Now we're sure the syntax is valid, we process this item
6214          further.  */
6215       if (gfc_get_symbol (name, module_ns, &sym))
6216         return MATCH_ERROR;
6217
6218       if (sym->attr.proc != PROC_MODULE
6219           && gfc_add_procedure (&sym->attr, PROC_MODULE,
6220                                 sym->name, NULL) == FAILURE)
6221         return MATCH_ERROR;
6222
6223       if (gfc_add_interface (sym) == FAILURE)
6224         return MATCH_ERROR;
6225
6226       sym->attr.mod_proc = 1;
6227
6228       if (last)
6229         break;
6230     }
6231
6232   return MATCH_YES;
6233
6234 syntax:
6235   /* Restore the previous state of the interface.  */
6236   interface = gfc_current_interface_head ();
6237   gfc_set_current_interface_head (old_interface_head);
6238
6239   /* Free the new interfaces.  */
6240   while (interface != old_interface_head)
6241   {
6242     gfc_interface *i = interface->next;
6243     gfc_free (interface);
6244     interface = i;
6245   }
6246
6247   /* And issue a syntax error.  */
6248   gfc_syntax_error (ST_MODULE_PROC);
6249   return MATCH_ERROR;
6250 }
6251
6252
6253 /* Match the optional attribute specifiers for a type declaration.
6254    Return MATCH_ERROR if an error is encountered in one of the handled
6255    attributes (public, private, bind(c)), MATCH_NO if what's found is
6256    not a handled attribute, and MATCH_YES otherwise.  TODO: More error
6257    checking on attribute conflicts needs to be done.  */
6258
6259 match
6260 gfc_get_type_attr_spec (symbol_attribute *attr)
6261 {
6262   /* See if the derived type is marked as private.  */
6263   if (gfc_match (" , private") == MATCH_YES)
6264     {
6265       if (gfc_current_state () != COMP_MODULE)
6266         {
6267           gfc_error ("Derived type at %C can only be PRIVATE in the "
6268                      "specification part of a module");
6269           return MATCH_ERROR;
6270         }
6271
6272       if (gfc_add_access (attr, ACCESS_PRIVATE, NULL, NULL) == FAILURE)
6273         return MATCH_ERROR;
6274     }
6275   else if (gfc_match (" , public") == MATCH_YES)
6276     {
6277       if (gfc_current_state () != COMP_MODULE)
6278         {
6279           gfc_error ("Derived type at %C can only be PUBLIC in the "
6280                      "specification part of a module");
6281           return MATCH_ERROR;
6282         }
6283
6284       if (gfc_add_access (attr, ACCESS_PUBLIC, NULL, NULL) == FAILURE)
6285         return MATCH_ERROR;
6286     }
6287   else if (gfc_match(" , bind ( c )") == MATCH_YES)
6288     {
6289       /* If the type is defined to be bind(c) it then needs to make
6290          sure that all fields are interoperable.  This will
6291          need to be a semantic check on the finished derived type.
6292          See 15.2.3 (lines 9-12) of F2003 draft.  */
6293       if (gfc_add_is_bind_c (attr, NULL, &gfc_current_locus, 0) != SUCCESS)
6294         return MATCH_ERROR;
6295
6296       /* TODO: attr conflicts need to be checked, probably in symbol.c.  */
6297     }
6298   else
6299     return MATCH_NO;
6300
6301   /* If we get here, something matched.  */
6302   return MATCH_YES;
6303 }
6304
6305
6306 /* Match the beginning of a derived type declaration.  If a type name
6307    was the result of a function, then it is possible to have a symbol
6308    already to be known as a derived type yet have no components.  */
6309
6310 match
6311 gfc_match_derived_decl (void)
6312 {
6313   char name[GFC_MAX_SYMBOL_LEN + 1];
6314   symbol_attribute attr;
6315   gfc_symbol *sym;
6316   match m;
6317   match is_type_attr_spec = MATCH_NO;
6318   bool seen_attr = false;
6319
6320   if (gfc_current_state () == COMP_DERIVED)
6321     return MATCH_NO;
6322
6323   gfc_clear_attr (&attr);
6324
6325   do
6326     {
6327       is_type_attr_spec = gfc_get_type_attr_spec (&attr);
6328       if (is_type_attr_spec == MATCH_ERROR)
6329         return MATCH_ERROR;
6330       if (is_type_attr_spec == MATCH_YES)
6331         seen_attr = true;
6332     } while (is_type_attr_spec == MATCH_YES);
6333
6334   if (gfc_match (" ::") != MATCH_YES && seen_attr)
6335     {
6336       gfc_error ("Expected :: in TYPE definition at %C");
6337       return MATCH_ERROR;
6338     }
6339
6340   m = gfc_match (" %n%t", name);
6341   if (m != MATCH_YES)
6342     return m;
6343
6344   /* Make sure the name is not the name of an intrinsic type.  */
6345   if (gfc_is_intrinsic_typename (name))
6346     {
6347       gfc_error ("Type name '%s' at %C cannot be the same as an intrinsic "
6348                  "type", name);
6349       return MATCH_ERROR;
6350     }
6351
6352   if (gfc_get_symbol (name, NULL, &sym))
6353     return MATCH_ERROR;
6354
6355   if (sym->ts.type != BT_UNKNOWN)
6356     {
6357       gfc_error ("Derived type name '%s' at %C already has a basic type "
6358                  "of %s", sym->name, gfc_typename (&sym->ts));
6359       return MATCH_ERROR;
6360     }
6361
6362   /* The symbol may already have the derived attribute without the
6363      components.  The ways this can happen is via a function
6364      definition, an INTRINSIC statement or a subtype in another
6365      derived type that is a pointer.  The first part of the AND clause
6366      is true if the symbol is not the return value of a function.  */
6367   if (sym->attr.flavor != FL_DERIVED
6368       && gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL) == FAILURE)
6369     return MATCH_ERROR;
6370
6371   if (sym->components != NULL || sym->attr.zero_comp)
6372     {
6373       gfc_error ("Derived type definition of '%s' at %C has already been "
6374                  "defined", sym->name);
6375       return MATCH_ERROR;
6376     }
6377
6378   if (attr.access != ACCESS_UNKNOWN
6379       && gfc_add_access (&sym->attr, attr.access, sym->name, NULL) == FAILURE)
6380     return MATCH_ERROR;
6381
6382   /* See if the derived type was labeled as bind(c).  */
6383   if (attr.is_bind_c != 0)
6384     sym->attr.is_bind_c = attr.is_bind_c;
6385
6386   /* Construct the f2k_derived namespace if it is not yet there.  */
6387   if (!sym->f2k_derived)
6388     sym->f2k_derived = gfc_get_namespace (NULL, 0);
6389
6390   gfc_new_block = sym;
6391
6392   return MATCH_YES;
6393 }
6394
6395
6396 /* Cray Pointees can be declared as: 
6397       pointer (ipt, a (n,m,...,*)) 
6398    By default, this is treated as an AS_ASSUMED_SIZE array.  We'll
6399    cheat and set a constant bound of 1 for the last dimension, if this
6400    is the case. Since there is no bounds-checking for Cray Pointees,
6401    this will be okay.  */
6402
6403 try
6404 gfc_mod_pointee_as (gfc_array_spec *as)
6405 {
6406   as->cray_pointee = true; /* This will be useful to know later.  */
6407   if (as->type == AS_ASSUMED_SIZE)
6408     {
6409       as->type = AS_EXPLICIT;
6410       as->upper[as->rank - 1] = gfc_int_expr (1);
6411       as->cp_was_assumed = true;
6412     }
6413   else if (as->type == AS_ASSUMED_SHAPE)
6414     {
6415       gfc_error ("Cray Pointee at %C cannot be assumed shape array");
6416       return MATCH_ERROR;
6417     }
6418   return MATCH_YES;
6419 }
6420
6421
6422 /* Match the enum definition statement, here we are trying to match 
6423    the first line of enum definition statement.  
6424    Returns MATCH_YES if match is found.  */
6425
6426 match
6427 gfc_match_enum (void)
6428 {
6429   match m;
6430   
6431   m = gfc_match_eos ();
6432   if (m != MATCH_YES)
6433     return m;
6434
6435   if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: ENUM and ENUMERATOR at %C")
6436       == FAILURE)
6437     return MATCH_ERROR;
6438
6439   return MATCH_YES;
6440 }
6441
6442
6443 /* Match a variable name with an optional initializer.  When this
6444    subroutine is called, a variable is expected to be parsed next.
6445    Depending on what is happening at the moment, updates either the
6446    symbol table or the current interface.  */
6447
6448 static match
6449 enumerator_decl (void)
6450 {
6451   char name[GFC_MAX_SYMBOL_LEN + 1];
6452   gfc_expr *initializer;
6453   gfc_array_spec *as = NULL;
6454   gfc_symbol *sym;
6455   locus var_locus;
6456   match m;
6457   try t;
6458   locus old_locus;
6459
6460   initializer = NULL;
6461   old_locus = gfc_current_locus;
6462
6463   /* When we get here, we've just matched a list of attributes and
6464      maybe a type and a double colon.  The next thing we expect to see
6465      is the name of the symbol.  */
6466   m = gfc_match_name (name);
6467   if (m != MATCH_YES)
6468     goto cleanup;
6469
6470   var_locus = gfc_current_locus;
6471
6472   /* OK, we've successfully matched the declaration.  Now put the
6473      symbol in the current namespace. If we fail to create the symbol,
6474      bail out.  */
6475   if (build_sym (name, NULL, &as, &var_locus) == FAILURE)
6476     {
6477       m = MATCH_ERROR;
6478       goto cleanup;
6479     }
6480
6481   /* The double colon must be present in order to have initializers.
6482      Otherwise the statement is ambiguous with an assignment statement.  */
6483   if (colon_seen)
6484     {
6485       if (gfc_match_char ('=') == MATCH_YES)
6486         {
6487           m = gfc_match_init_expr (&initializer);
6488           if (m == MATCH_NO)
6489             {
6490               gfc_error ("Expected an initialization expression at %C");
6491               m = MATCH_ERROR;
6492             }
6493
6494           if (m != MATCH_YES)
6495             goto cleanup;
6496         }
6497     }
6498
6499   /* If we do not have an initializer, the initialization value of the
6500      previous enumerator (stored in last_initializer) is incremented
6501      by 1 and is used to initialize the current enumerator.  */
6502   if (initializer == NULL)
6503     initializer = gfc_enum_initializer (last_initializer, old_locus);
6504
6505   if (initializer == NULL || initializer->ts.type != BT_INTEGER)
6506     {
6507       gfc_error("ENUMERATOR %L not initialized with integer expression",
6508                 &var_locus);
6509       m = MATCH_ERROR;
6510       gfc_free_enum_history ();
6511       goto cleanup;
6512     }
6513
6514   /* Store this current initializer, for the next enumerator variable
6515      to be parsed.  add_init_expr_to_sym() zeros initializer, so we
6516      use last_initializer below.  */
6517   last_initializer = initializer;
6518   t = add_init_expr_to_sym (name, &initializer, &var_locus);
6519
6520   /* Maintain enumerator history.  */
6521   gfc_find_symbol (name, NULL, 0, &sym);
6522   create_enum_history (sym, last_initializer);
6523
6524   return (t == SUCCESS) ? MATCH_YES : MATCH_ERROR;
6525
6526 cleanup:
6527   /* Free stuff up and return.  */
6528   gfc_free_expr (initializer);
6529
6530   return m;
6531 }
6532
6533
6534 /* Match the enumerator definition statement.  */
6535
6536 match
6537 gfc_match_enumerator_def (void)
6538 {
6539   match m;
6540   try t;
6541
6542   gfc_clear_ts (&current_ts);
6543
6544   m = gfc_match (" enumerator");
6545   if (m != MATCH_YES)
6546     return m;
6547
6548   m = gfc_match (" :: ");
6549   if (m == MATCH_ERROR)
6550     return m;
6551
6552   colon_seen = (m == MATCH_YES);
6553
6554   if (gfc_current_state () != COMP_ENUM)
6555     {
6556       gfc_error ("ENUM definition statement expected before %C");
6557       gfc_free_enum_history ();
6558       return MATCH_ERROR;
6559     }
6560
6561   (&current_ts)->type = BT_INTEGER;
6562   (&current_ts)->kind = gfc_c_int_kind;
6563
6564   gfc_clear_attr (&current_attr);
6565   t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, NULL);
6566   if (t == FAILURE)
6567     {
6568       m = MATCH_ERROR;
6569       goto cleanup;
6570     }
6571
6572   for (;;)
6573     {
6574       m = enumerator_decl ();
6575       if (m == MATCH_ERROR)
6576         goto cleanup;
6577       if (m == MATCH_NO)
6578         break;
6579
6580       if (gfc_match_eos () == MATCH_YES)
6581         goto cleanup;
6582       if (gfc_match_char (',') != MATCH_YES)
6583         break;
6584     }
6585
6586   if (gfc_current_state () == COMP_ENUM)
6587     {
6588       gfc_free_enum_history ();
6589       gfc_error ("Syntax error in ENUMERATOR definition at %C");
6590       m = MATCH_ERROR;
6591     }
6592
6593 cleanup:
6594   gfc_free_array_spec (current_as);
6595   current_as = NULL;
6596   return m;
6597
6598 }
6599
6600 /* Match a FINAL declaration inside a derived type.  */
6601
6602 match
6603 gfc_match_final_decl (void)
6604 {
6605   char name[GFC_MAX_SYMBOL_LEN + 1];
6606   gfc_symbol* sym;
6607   match m;
6608   gfc_namespace* module_ns;
6609   bool first, last;
6610
6611   if (gfc_state_stack->state != COMP_DERIVED)
6612     {
6613       gfc_error ("FINAL declaration at %C must be inside a derived type "
6614                  "definition!");
6615       return MATCH_ERROR;
6616     }
6617
6618   gcc_assert (gfc_current_block ());
6619
6620   if (!gfc_state_stack->previous
6621       || gfc_state_stack->previous->state != COMP_MODULE)
6622     {
6623       gfc_error ("Derived type declaration with FINAL at %C must be in the"
6624                  " specification part of a MODULE");
6625       return MATCH_ERROR;
6626     }
6627
6628   module_ns = gfc_current_ns;
6629   gcc_assert (module_ns);
6630   gcc_assert (module_ns->proc_name->attr.flavor == FL_MODULE);
6631
6632   /* Match optional ::, don't care about MATCH_YES or MATCH_NO.  */
6633   if (gfc_match (" ::") == MATCH_ERROR)
6634     return MATCH_ERROR;
6635
6636   /* Match the sequence of procedure names.  */
6637   first = true;
6638   last = false;
6639   do
6640     {
6641       gfc_finalizer* f;
6642
6643       if (first && gfc_match_eos () == MATCH_YES)
6644         {
6645           gfc_error ("Empty FINAL at %C");
6646           return MATCH_ERROR;
6647         }
6648
6649       m = gfc_match_name (name);
6650       if (m == MATCH_NO)
6651         {
6652           gfc_error ("Expected module procedure name at %C");
6653           return MATCH_ERROR;
6654         }
6655       else if (m != MATCH_YES)
6656         return MATCH_ERROR;
6657
6658       if (gfc_match_eos () == MATCH_YES)
6659         last = true;
6660       if (!last && gfc_match_char (',') != MATCH_YES)
6661         {
6662           gfc_error ("Expected ',' at %C");
6663           return MATCH_ERROR;
6664         }
6665
6666       if (gfc_get_symbol (name, module_ns, &sym))
6667         {
6668           gfc_error ("Unknown procedure name \"%s\" at %C", name);
6669           return MATCH_ERROR;
6670         }
6671
6672       /* Mark the symbol as module procedure.  */
6673       if (sym->attr.proc != PROC_MODULE
6674           && gfc_add_procedure (&sym->attr, PROC_MODULE,
6675                                 sym->name, NULL) == FAILURE)
6676         return MATCH_ERROR;
6677
6678       /* Check if we already have this symbol in the list, this is an error.  */
6679       for (f = gfc_current_block ()->f2k_derived->finalizers; f; f = f->next)
6680         if (f->procedure == sym)
6681           {
6682             gfc_error ("'%s' at %C is already defined as FINAL procedure!",
6683                        name);
6684             return MATCH_ERROR;
6685           }
6686
6687       /* Add this symbol to the list of finalizers.  */
6688       gcc_assert (gfc_current_block ()->f2k_derived);
6689       ++sym->refs;
6690       f = XCNEW (gfc_finalizer);
6691       f->procedure = sym;
6692       f->where = gfc_current_locus;
6693       f->next = gfc_current_block ()->f2k_derived->finalizers;
6694       gfc_current_block ()->f2k_derived->finalizers = f;
6695
6696       first = false;
6697     }
6698   while (!last);
6699
6700   return MATCH_YES;
6701 }