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