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