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