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