]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/decl.c
Daily bump.
[thirdparty/gcc.git] / gcc / fortran / decl.c
CommitLineData
6de9cd9a 1/* Declaration statement matcher
85ec4feb 2 Copyright (C) 2002-2018 Free Software Foundation, Inc.
6de9cd9a
DN
3 Contributed by Andy Vaught
4
9fc4d79b 5This file is part of GCC.
6de9cd9a 6
9fc4d79b
TS
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
d234d788 9Software Foundation; either version 3, or (at your option) any later
9fc4d79b 10version.
6de9cd9a 11
9fc4d79b
TS
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
6de9cd9a
DN
16
17You should have received a copy of the GNU General Public License
d234d788
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
6de9cd9a 20
6de9cd9a 21#include "config.h"
d22e4895 22#include "system.h"
953bee7c 23#include "coretypes.h"
2adfab87
AM
24#include "options.h"
25#include "tree.h"
6de9cd9a 26#include "gfortran.h"
2adfab87 27#include "stringpool.h"
6de9cd9a
DN
28#include "match.h"
29#include "parse.h"
b7e75771 30#include "constructor.h"
ca39e6f2
FXC
31
32/* Macros to access allocate memory for gfc_data_variable,
33 gfc_data_value and gfc_data. */
ece3f663
KG
34#define gfc_get_data_variable() XCNEW (gfc_data_variable)
35#define gfc_get_data_value() XCNEW (gfc_data_value)
36#define gfc_get_data() XCNEW (gfc_data)
ca39e6f2
FXC
37
38
524af0d6 39static bool set_binding_label (const char **, const char *, int);
62603fae
JB
40
41
2054fc29 42/* This flag is set if an old-style length selector is matched
6de9cd9a
DN
43 during a type-declaration statement. */
44
45static int old_char_selector;
46
46fa431d 47/* When variables acquire types and attributes from a declaration
6de9cd9a
DN
48 statement, they get them from the following static variables. The
49 first part of a declaration sets these variables and the second
50 part copies these into symbol structures. */
51
52static gfc_typespec current_ts;
53
54static symbol_attribute current_attr;
55static gfc_array_spec *current_as;
56static int colon_seen;
6f855a26 57static int attr_seen;
6de9cd9a 58
a8b3b0b6 59/* The current binding label (if any). */
9975a30b 60static const char* curr_binding_label;
a8b3b0b6
CR
61/* Need to know how many identifiers are on the current data declaration
62 line in case we're given the BIND(C) attribute with a NAME= specifier. */
63static int num_idents_on_line;
64/* Need to know if a NAME= specifier was found during gfc_match_bind_c so we
65 can supply a name if the curr_binding_label is nil and NAME= was not. */
66static int has_name_equals = 0;
67
25d8f0a2
TS
68/* Initializer of the previous enumerator. */
69
70static gfc_expr *last_initializer;
71
72/* History of all the enumerators is maintained, so that
73 kind values of all the enumerators could be updated depending
74 upon the maximum initialized value. */
75
76typedef struct enumerator_history
77{
78 gfc_symbol *sym;
79 gfc_expr *initializer;
80 struct enumerator_history *next;
81}
82enumerator_history;
83
84/* Header of enum history chain. */
85
86static enumerator_history *enum_history = NULL;
87
88/* Pointer of enum history node containing largest initializer. */
89
90static enumerator_history *max_enum = NULL;
91
6de9cd9a
DN
92/* gfc_new_block points to the symbol of a newly matched block. */
93
94gfc_symbol *gfc_new_block;
95
1c8bcdf7 96bool gfc_matching_function;
e2d29968 97
170a8bd6
EB
98/* Set upon parsing a !GCC$ unroll n directive for use in the next loop. */
99int directive_unroll = -1;
100
5bab4c96
PT
101/* If a kind expression of a component of a parameterized derived type is
102 parameterized, temporarily store the expression here. */
103static gfc_expr *saved_kind_expr = NULL;
104
105/* Used to store the parameter list arising in a PDT declaration and
106 in the typespec of a PDT variable or component. */
107static gfc_actual_arglist *decl_type_param_list;
108static gfc_actual_arglist *type_param_spec_list;
109
294fbfc8
TS
110/********************* DATA statement subroutines *********************/
111
2220652d
PT
112static bool in_match_data = false;
113
114bool
115gfc_in_match_data (void)
116{
117 return in_match_data;
118}
119
ca39e6f2
FXC
120static void
121set_in_match_data (bool set_value)
2220652d
PT
122{
123 in_match_data = set_value;
124}
125
294fbfc8
TS
126/* Free a gfc_data_variable structure and everything beneath it. */
127
128static void
636dff67 129free_variable (gfc_data_variable *p)
294fbfc8
TS
130{
131 gfc_data_variable *q;
132
133 for (; p; p = q)
134 {
135 q = p->next;
136 gfc_free_expr (p->expr);
137 gfc_free_iterator (&p->iter, 0);
138 free_variable (p->list);
cede9502 139 free (p);
294fbfc8
TS
140 }
141}
142
143
144/* Free a gfc_data_value structure and everything beneath it. */
145
146static void
636dff67 147free_value (gfc_data_value *p)
294fbfc8
TS
148{
149 gfc_data_value *q;
150
151 for (; p; p = q)
152 {
153 q = p->next;
c9d75a48 154 mpz_clear (p->repeat);
294fbfc8 155 gfc_free_expr (p->expr);
cede9502 156 free (p);
294fbfc8
TS
157 }
158}
159
160
161/* Free a list of gfc_data structures. */
162
163void
636dff67 164gfc_free_data (gfc_data *p)
294fbfc8
TS
165{
166 gfc_data *q;
167
168 for (; p; p = q)
169 {
170 q = p->next;
294fbfc8
TS
171 free_variable (p->var);
172 free_value (p->value);
cede9502 173 free (p);
294fbfc8
TS
174 }
175}
176
177
a9f6f1f2 178/* Free all data in a namespace. */
636dff67 179
a9f6f1f2 180static void
66e4ab31 181gfc_free_data_all (gfc_namespace *ns)
a9f6f1f2
JD
182{
183 gfc_data *d;
184
185 for (;ns->data;)
186 {
187 d = ns->data->next;
cede9502 188 free (ns->data);
a9f6f1f2
JD
189 ns->data = d;
190 }
191}
192
d5e2274d
SB
193/* Reject data parsed since the last restore point was marked. */
194
195void
196gfc_reject_data (gfc_namespace *ns)
197{
198 gfc_data *d;
199
200 while (ns->data && ns->data != ns->old_data)
201 {
202 d = ns->data->next;
203 free (ns->data);
204 ns->data = d;
205 }
206}
a9f6f1f2 207
294fbfc8
TS
208static match var_element (gfc_data_variable *);
209
210/* Match a list of variables terminated by an iterator and a right
211 parenthesis. */
212
213static match
636dff67 214var_list (gfc_data_variable *parent)
294fbfc8
TS
215{
216 gfc_data_variable *tail, var;
217 match m;
218
219 m = var_element (&var);
220 if (m == MATCH_ERROR)
221 return MATCH_ERROR;
222 if (m == MATCH_NO)
223 goto syntax;
224
225 tail = gfc_get_data_variable ();
226 *tail = var;
227
228 parent->list = tail;
229
230 for (;;)
231 {
232 if (gfc_match_char (',') != MATCH_YES)
233 goto syntax;
234
235 m = gfc_match_iterator (&parent->iter, 1);
236 if (m == MATCH_YES)
237 break;
238 if (m == MATCH_ERROR)
239 return MATCH_ERROR;
240
241 m = var_element (&var);
242 if (m == MATCH_ERROR)
243 return MATCH_ERROR;
244 if (m == MATCH_NO)
245 goto syntax;
246
247 tail->next = gfc_get_data_variable ();
248 tail = tail->next;
249
250 *tail = var;
251 }
252
253 if (gfc_match_char (')') != MATCH_YES)
254 goto syntax;
255 return MATCH_YES;
256
257syntax:
258 gfc_syntax_error (ST_DATA);
259 return MATCH_ERROR;
260}
261
262
263/* Match a single element in a data variable list, which can be a
264 variable-iterator list. */
265
266static match
7b901ac4 267var_element (gfc_data_variable *new_var)
294fbfc8
TS
268{
269 match m;
270 gfc_symbol *sym;
271
7b901ac4 272 memset (new_var, 0, sizeof (gfc_data_variable));
294fbfc8
TS
273
274 if (gfc_match_char ('(') == MATCH_YES)
7b901ac4 275 return var_list (new_var);
294fbfc8 276
7b901ac4 277 m = gfc_match_variable (&new_var->expr, 0);
294fbfc8
TS
278 if (m != MATCH_YES)
279 return m;
280
7b901ac4 281 sym = new_var->expr->symtree->n.sym;
294fbfc8 282
f37e928c 283 /* Symbol should already have an associated type. */
524af0d6 284 if (!gfc_check_symbol_typed (sym, gfc_current_ns, false, gfc_current_locus))
f37e928c
DK
285 return MATCH_ERROR;
286
636dff67
SK
287 if (!sym->attr.function && gfc_current_ns->parent
288 && gfc_current_ns->parent == sym->ns)
294fbfc8 289 {
c4100eae 290 gfc_error ("Host associated variable %qs may not be in the DATA "
e25a0da3 291 "statement at %C", sym->name);
294fbfc8
TS
292 return MATCH_ERROR;
293 }
294
4075a94e 295 if (gfc_current_state () != COMP_BLOCK_DATA
636dff67 296 && sym->attr.in_common
524af0d6 297 && !gfc_notify_std (GFC_STD_GNU, "initialization of "
a4d9b221 298 "common block variable %qs in DATA statement at %C",
524af0d6 299 sym->name))
4075a94e 300 return MATCH_ERROR;
294fbfc8 301
524af0d6 302 if (!gfc_add_data (&sym->attr, sym->name, &new_var->expr->where))
294fbfc8
TS
303 return MATCH_ERROR;
304
305 return MATCH_YES;
306}
307
308
309/* Match the top-level list of data variables. */
310
311static match
636dff67 312top_var_list (gfc_data *d)
294fbfc8 313{
7b901ac4 314 gfc_data_variable var, *tail, *new_var;
294fbfc8
TS
315 match m;
316
317 tail = NULL;
318
319 for (;;)
320 {
321 m = var_element (&var);
322 if (m == MATCH_NO)
323 goto syntax;
324 if (m == MATCH_ERROR)
325 return MATCH_ERROR;
326
7b901ac4
KG
327 new_var = gfc_get_data_variable ();
328 *new_var = var;
294fbfc8
TS
329
330 if (tail == NULL)
7b901ac4 331 d->var = new_var;
294fbfc8 332 else
7b901ac4 333 tail->next = new_var;
294fbfc8 334
7b901ac4 335 tail = new_var;
294fbfc8
TS
336
337 if (gfc_match_char ('/') == MATCH_YES)
338 break;
339 if (gfc_match_char (',') != MATCH_YES)
340 goto syntax;
341 }
342
343 return MATCH_YES;
344
345syntax:
346 gfc_syntax_error (ST_DATA);
a9f6f1f2 347 gfc_free_data_all (gfc_current_ns);
294fbfc8
TS
348 return MATCH_ERROR;
349}
350
351
352static match
636dff67 353match_data_constant (gfc_expr **result)
294fbfc8
TS
354{
355 char name[GFC_MAX_SYMBOL_LEN + 1];
c3f34952 356 gfc_symbol *sym, *dt_sym = NULL;
294fbfc8
TS
357 gfc_expr *expr;
358 match m;
36d3fb4c 359 locus old_loc;
294fbfc8
TS
360
361 m = gfc_match_literal_constant (&expr, 1);
362 if (m == MATCH_YES)
363 {
364 *result = expr;
365 return MATCH_YES;
366 }
367
368 if (m == MATCH_ERROR)
369 return MATCH_ERROR;
370
371 m = gfc_match_null (result);
372 if (m != MATCH_NO)
373 return m;
374
36d3fb4c
PT
375 old_loc = gfc_current_locus;
376
377 /* Should this be a structure component, try to match it
378 before matching a name. */
379 m = gfc_match_rvalue (result);
380 if (m == MATCH_ERROR)
381 return m;
382
383 if (m == MATCH_YES && (*result)->expr_type == EXPR_STRUCTURE)
384 {
524af0d6 385 if (!gfc_simplify_expr (*result, 0))
36d3fb4c
PT
386 m = MATCH_ERROR;
387 return m;
388 }
46f4f794
TB
389 else if (m == MATCH_YES)
390 gfc_free_expr (*result);
36d3fb4c
PT
391
392 gfc_current_locus = old_loc;
393
294fbfc8
TS
394 m = gfc_match_name (name);
395 if (m != MATCH_YES)
396 return m;
397
398 if (gfc_find_symbol (name, NULL, 1, &sym))
399 return MATCH_ERROR;
400
c3f34952
TB
401 if (sym && sym->attr.generic)
402 dt_sym = gfc_find_dt_in_generic (sym);
403
294fbfc8 404 if (sym == NULL
c3f34952 405 || (sym->attr.flavor != FL_PARAMETER
f6288c24 406 && (!dt_sym || !gfc_fl_struct (dt_sym->attr.flavor))))
294fbfc8 407 {
c4100eae 408 gfc_error ("Symbol %qs must be a PARAMETER in DATA statement at %C",
294fbfc8 409 name);
89f1f37e 410 *result = NULL;
294fbfc8
TS
411 return MATCH_ERROR;
412 }
f6288c24 413 else if (dt_sym && gfc_fl_struct (dt_sym->attr.flavor))
c3f34952 414 return gfc_match_structure_constructor (dt_sym, result);
294fbfc8 415
d46e0870
JD
416 /* Check to see if the value is an initialization array expression. */
417 if (sym->value->expr_type == EXPR_ARRAY)
418 {
419 gfc_current_locus = old_loc;
420
421 m = gfc_match_init_expr (result);
422 if (m == MATCH_ERROR)
423 return m;
424
425 if (m == MATCH_YES)
426 {
524af0d6 427 if (!gfc_simplify_expr (*result, 0))
d46e0870
JD
428 m = MATCH_ERROR;
429
430 if ((*result)->expr_type == EXPR_CONSTANT)
431 return m;
432 else
433 {
434 gfc_error ("Invalid initializer %s in Data statement at %C", name);
435 return MATCH_ERROR;
436 }
437 }
438 }
439
294fbfc8
TS
440 *result = gfc_copy_expr (sym->value);
441 return MATCH_YES;
442}
443
444
445/* Match a list of values in a DATA statement. The leading '/' has
446 already been seen at this point. */
447
448static match
636dff67 449top_val_list (gfc_data *data)
294fbfc8 450{
7b901ac4 451 gfc_data_value *new_val, *tail;
294fbfc8 452 gfc_expr *expr;
294fbfc8
TS
453 match m;
454
455 tail = NULL;
456
457 for (;;)
458 {
459 m = match_data_constant (&expr);
460 if (m == MATCH_NO)
461 goto syntax;
462 if (m == MATCH_ERROR)
463 return MATCH_ERROR;
464
7b901ac4
KG
465 new_val = gfc_get_data_value ();
466 mpz_init (new_val->repeat);
294fbfc8
TS
467
468 if (tail == NULL)
7b901ac4 469 data->value = new_val;
294fbfc8 470 else
7b901ac4 471 tail->next = new_val;
294fbfc8 472
7b901ac4 473 tail = new_val;
294fbfc8
TS
474
475 if (expr->ts.type != BT_INTEGER || gfc_match_char ('*') != MATCH_YES)
476 {
477 tail->expr = expr;
f2112868 478 mpz_set_ui (tail->repeat, 1);
294fbfc8
TS
479 }
480 else
481 {
46f4f794 482 mpz_set (tail->repeat, expr->value.integer);
294fbfc8 483 gfc_free_expr (expr);
294fbfc8
TS
484
485 m = match_data_constant (&tail->expr);
486 if (m == MATCH_NO)
487 goto syntax;
488 if (m == MATCH_ERROR)
489 return MATCH_ERROR;
490 }
491
492 if (gfc_match_char ('/') == MATCH_YES)
493 break;
494 if (gfc_match_char (',') == MATCH_NO)
495 goto syntax;
496 }
497
498 return MATCH_YES;
499
500syntax:
501 gfc_syntax_error (ST_DATA);
a9f6f1f2 502 gfc_free_data_all (gfc_current_ns);
294fbfc8
TS
503 return MATCH_ERROR;
504}
505
506
507/* Matches an old style initialization. */
508
509static match
510match_old_style_init (const char *name)
511{
512 match m;
513 gfc_symtree *st;
ed0e3607 514 gfc_symbol *sym;
294fbfc8
TS
515 gfc_data *newdata;
516
517 /* Set up data structure to hold initializers. */
518 gfc_find_sym_tree (name, NULL, 0, &st);
ed0e3607
AL
519 sym = st->n.sym;
520
294fbfc8
TS
521 newdata = gfc_get_data ();
522 newdata->var = gfc_get_data_variable ();
523 newdata->var->expr = gfc_get_variable_expr (st);
8c5c0b80 524 newdata->where = gfc_current_locus;
294fbfc8 525
66e4ab31 526 /* Match initial value list. This also eats the terminal '/'. */
294fbfc8
TS
527 m = top_val_list (newdata);
528 if (m != MATCH_YES)
529 {
cede9502 530 free (newdata);
294fbfc8
TS
531 return m;
532 }
533
534 if (gfc_pure (NULL))
535 {
536 gfc_error ("Initialization at %C is not allowed in a PURE procedure");
cede9502 537 free (newdata);
294fbfc8
TS
538 return MATCH_ERROR;
539 }
ccd7751b 540 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
f1f39033 541
ed0e3607 542 /* Mark the variable as having appeared in a data statement. */
524af0d6 543 if (!gfc_add_data (&sym->attr, sym->name, &sym->declared_at))
ed0e3607 544 {
cede9502 545 free (newdata);
ed0e3607
AL
546 return MATCH_ERROR;
547 }
548
294fbfc8
TS
549 /* Chain in namespace list of DATA initializers. */
550 newdata->next = gfc_current_ns->data;
551 gfc_current_ns->data = newdata;
552
553 return m;
554}
555
636dff67 556
294fbfc8 557/* Match the stuff following a DATA statement. If ERROR_FLAG is set,
13795658 558 we are matching a DATA statement and are therefore issuing an error
d51347f9 559 if we encounter something unexpected, if not, we're trying to match
69de3b83 560 an old-style initialization expression of the form INTEGER I /2/. */
294fbfc8
TS
561
562match
563gfc_match_data (void)
564{
7b901ac4 565 gfc_data *new_data;
294fbfc8
TS
566 match m;
567
5f0ba745
SK
568 /* Before parsing the rest of a DATA statement, check F2008:c1206. */
569 if ((gfc_current_state () == COMP_FUNCTION
570 || gfc_current_state () == COMP_SUBROUTINE)
571 && gfc_state_stack->previous->state == COMP_INTERFACE)
572 {
573 gfc_error ("DATA statement at %C cannot appear within an INTERFACE");
574 return MATCH_ERROR;
575 }
576
ca39e6f2 577 set_in_match_data (true);
2220652d 578
294fbfc8
TS
579 for (;;)
580 {
7b901ac4
KG
581 new_data = gfc_get_data ();
582 new_data->where = gfc_current_locus;
294fbfc8 583
7b901ac4 584 m = top_var_list (new_data);
294fbfc8
TS
585 if (m != MATCH_YES)
586 goto cleanup;
587
c034c38f
SK
588 if (new_data->var->iter.var
589 && new_data->var->iter.var->ts.type == BT_INTEGER
590 && new_data->var->iter.var->symtree->n.sym->attr.implied_index == 1
591 && new_data->var->list
592 && new_data->var->list->expr
593 && new_data->var->list->expr->ts.type == BT_CHARACTER
594 && new_data->var->list->expr->ref
595 && new_data->var->list->expr->ref->type == REF_SUBSTRING)
596 {
597 gfc_error ("Invalid substring in data-implied-do at %L in DATA "
598 "statement", &new_data->var->list->expr->where);
599 goto cleanup;
600 }
601
7b901ac4 602 m = top_val_list (new_data);
294fbfc8
TS
603 if (m != MATCH_YES)
604 goto cleanup;
605
7b901ac4
KG
606 new_data->next = gfc_current_ns->data;
607 gfc_current_ns->data = new_data;
294fbfc8
TS
608
609 if (gfc_match_eos () == MATCH_YES)
610 break;
611
612 gfc_match_char (','); /* Optional comma */
613 }
614
ca39e6f2 615 set_in_match_data (false);
2220652d 616
294fbfc8
TS
617 if (gfc_pure (NULL))
618 {
619 gfc_error ("DATA statement at %C is not allowed in a PURE procedure");
620 return MATCH_ERROR;
621 }
ccd7751b 622 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
f1f39033 623
294fbfc8
TS
624 return MATCH_YES;
625
626cleanup:
ca39e6f2 627 set_in_match_data (false);
7b901ac4 628 gfc_free_data (new_data);
294fbfc8
TS
629 return MATCH_ERROR;
630}
631
632
633/************************ Declaration statements *********************/
634
d3a9eea2 635
f6288c24
FR
636/* Like gfc_match_init_expr, but matches a 'clist' (old-style initialization
637 list). The difference here is the expression is a list of constants
6442a6f4 638 and is surrounded by '/'.
f6288c24
FR
639 The typespec ts must match the typespec of the variable which the
640 clist is initializing.
6442a6f4 641 The arrayspec tells whether this should match a list of constants
f6288c24
FR
642 corresponding to array elements or a scalar (as == NULL). */
643
644static match
645match_clist_expr (gfc_expr **result, gfc_typespec *ts, gfc_array_spec *as)
646{
647 gfc_constructor_base array_head = NULL;
648 gfc_expr *expr = NULL;
649 match m;
650 locus where;
9b24c104 651 mpz_t repeat, cons_size, as_size;
f6288c24
FR
652 bool scalar;
653 int cmp;
654
655 gcc_assert (ts);
656
657 mpz_init_set_ui (repeat, 0);
f6288c24
FR
658 scalar = !as || !as->rank;
659
660 /* We have already matched '/' - now look for a constant list, as with
661 top_val_list from decl.c, but append the result to an array. */
662 if (gfc_match ("/") == MATCH_YES)
663 {
664 gfc_error ("Empty old style initializer list at %C");
665 goto cleanup;
666 }
667
668 where = gfc_current_locus;
669 for (;;)
670 {
671 m = match_data_constant (&expr);
672 if (m != MATCH_YES)
673 expr = NULL; /* match_data_constant may set expr to garbage */
674 if (m == MATCH_NO)
675 goto syntax;
676 if (m == MATCH_ERROR)
677 goto cleanup;
678
679 /* Found r in repeat spec r*c; look for the constant to repeat. */
680 if ( gfc_match_char ('*') == MATCH_YES)
681 {
682 if (scalar)
683 {
684 gfc_error ("Repeat spec invalid in scalar initializer at %C");
685 goto cleanup;
686 }
687 if (expr->ts.type != BT_INTEGER)
688 {
689 gfc_error ("Repeat spec must be an integer at %C");
690 goto cleanup;
691 }
692 mpz_set (repeat, expr->value.integer);
693 gfc_free_expr (expr);
694 expr = NULL;
695
696 m = match_data_constant (&expr);
697 if (m == MATCH_NO)
698 gfc_error ("Expected data constant after repeat spec at %C");
699 if (m != MATCH_YES)
700 goto cleanup;
701 }
702 /* No repeat spec, we matched the data constant itself. */
703 else
704 mpz_set_ui (repeat, 1);
705
706 if (!scalar)
707 {
708 /* Add the constant initializer as many times as repeated. */
709 for (; mpz_cmp_ui (repeat, 0) > 0; mpz_sub_ui (repeat, repeat, 1))
710 {
711 /* Make sure types of elements match */
712 if(ts && !gfc_compare_types (&expr->ts, ts)
713 && !gfc_convert_type (expr, ts, 1))
714 goto cleanup;
715
716 gfc_constructor_append_expr (&array_head,
717 gfc_copy_expr (expr), &gfc_current_locus);
718 }
719
720 gfc_free_expr (expr);
721 expr = NULL;
722 }
723
724 /* For scalar initializers quit after one element. */
725 else
726 {
727 if(gfc_match_char ('/') != MATCH_YES)
728 {
729 gfc_error ("End of scalar initializer expected at %C");
730 goto cleanup;
731 }
732 break;
733 }
734
735 if (gfc_match_char ('/') == MATCH_YES)
736 break;
737 if (gfc_match_char (',') == MATCH_NO)
738 goto syntax;
739 }
740
741 /* Set up expr as an array constructor. */
742 if (!scalar)
743 {
744 expr = gfc_get_array_expr (ts->type, ts->kind, &where);
745 expr->ts = *ts;
746 expr->value.constructor = array_head;
747
748 expr->rank = as->rank;
749 expr->shape = gfc_get_shape (expr->rank);
750
9b24c104
FR
751 /* Validate sizes. We built expr ourselves, so cons_size will be
752 constant (we fail above for non-constant expressions).
753 We still need to verify that the array-spec has constant size. */
754 cmp = 0;
755 gcc_assert (gfc_array_size (expr, &cons_size));
756 if (!spec_size (as, &as_size))
757 {
758 gfc_error ("Expected constant array-spec in initializer list at %L",
759 as->type == AS_EXPLICIT ? &as->upper[0]->where : &where);
760 cmp = -1;
761 }
762 else
763 {
764 /* Make sure the specs are of the same size. */
765 cmp = mpz_cmp (cons_size, as_size);
766 if (cmp < 0)
767 gfc_error ("Not enough elements in array initializer at %C");
768 else if (cmp > 0)
769 gfc_error ("Too many elements in array initializer at %C");
770 mpz_clear (as_size);
771 }
772 mpz_clear (cons_size);
f6288c24 773 if (cmp)
9b24c104 774 goto cleanup;
f6288c24
FR
775 }
776
777 /* Make sure scalar types match. */
778 else if (!gfc_compare_types (&expr->ts, ts)
779 && !gfc_convert_type (expr, ts, 1))
780 goto cleanup;
781
782 if (expr->ts.u.cl)
783 expr->ts.u.cl->length_from_typespec = 1;
784
785 *result = expr;
f6288c24
FR
786 mpz_clear (repeat);
787 return MATCH_YES;
788
789syntax:
790 gfc_error ("Syntax error in old style initializer list at %C");
791
792cleanup:
793 if (expr)
794 expr->value.constructor = NULL;
795 gfc_free_expr (expr);
796 gfc_constructor_free (array_head);
f6288c24
FR
797 mpz_clear (repeat);
798 return MATCH_ERROR;
799}
800
801
eea58adb 802/* Auxiliary function to merge DIMENSION and CODIMENSION array specs. */
d3a9eea2 803
524af0d6 804static bool
d3a9eea2
TB
805merge_array_spec (gfc_array_spec *from, gfc_array_spec *to, bool copy)
806{
807 int i;
808
63fbf586
TB
809 if ((from->type == AS_ASSUMED_RANK && to->corank)
810 || (to->type == AS_ASSUMED_RANK && from->corank))
811 {
812 gfc_error ("The assumed-rank array at %C shall not have a codimension");
524af0d6 813 return false;
63fbf586 814 }
c62c6622 815
d3a9eea2
TB
816 if (to->rank == 0 && from->rank > 0)
817 {
818 to->rank = from->rank;
819 to->type = from->type;
820 to->cray_pointee = from->cray_pointee;
821 to->cp_was_assumed = from->cp_was_assumed;
822
823 for (i = 0; i < to->corank; i++)
824 {
825 to->lower[from->rank + i] = to->lower[i];
826 to->upper[from->rank + i] = to->upper[i];
827 }
828 for (i = 0; i < from->rank; i++)
829 {
830 if (copy)
831 {
832 to->lower[i] = gfc_copy_expr (from->lower[i]);
833 to->upper[i] = gfc_copy_expr (from->upper[i]);
834 }
835 else
836 {
837 to->lower[i] = from->lower[i];
838 to->upper[i] = from->upper[i];
839 }
840 }
841 }
842 else if (to->corank == 0 && from->corank > 0)
843 {
844 to->corank = from->corank;
845 to->cotype = from->cotype;
846
847 for (i = 0; i < from->corank; i++)
848 {
849 if (copy)
850 {
851 to->lower[to->rank + i] = gfc_copy_expr (from->lower[i]);
852 to->upper[to->rank + i] = gfc_copy_expr (from->upper[i]);
853 }
854 else
855 {
856 to->lower[to->rank + i] = from->lower[i];
857 to->upper[to->rank + i] = from->upper[i];
858 }
859 }
860 }
63fbf586 861
524af0d6 862 return true;
d3a9eea2
TB
863}
864
865
6de9cd9a
DN
866/* Match an intent specification. Since this can only happen after an
867 INTENT word, a legal intent-spec must follow. */
868
869static sym_intent
870match_intent_spec (void)
871{
872
873 if (gfc_match (" ( in out )") == MATCH_YES)
874 return INTENT_INOUT;
875 if (gfc_match (" ( in )") == MATCH_YES)
876 return INTENT_IN;
877 if (gfc_match (" ( out )") == MATCH_YES)
878 return INTENT_OUT;
879
880 gfc_error ("Bad INTENT specification at %C");
881 return INTENT_UNKNOWN;
882}
883
884
885/* Matches a character length specification, which is either a
e69afb29 886 specification expression, '*', or ':'. */
6de9cd9a
DN
887
888static match
e69afb29 889char_len_param_value (gfc_expr **expr, bool *deferred)
6de9cd9a 890{
cba28dad
JD
891 match m;
892
e69afb29
SK
893 *expr = NULL;
894 *deferred = false;
895
6de9cd9a 896 if (gfc_match_char ('*') == MATCH_YES)
e69afb29
SK
897 return MATCH_YES;
898
899 if (gfc_match_char (':') == MATCH_YES)
6de9cd9a 900 {
98a819ea 901 if (!gfc_notify_std (GFC_STD_F2003, "deferred type parameter at %C"))
e69afb29
SK
902 return MATCH_ERROR;
903
904 *deferred = true;
905
6de9cd9a
DN
906 return MATCH_YES;
907 }
908
cba28dad 909 m = gfc_match_expr (expr);
f37e928c 910
98a819ea
SK
911 if (m == MATCH_NO || m == MATCH_ERROR)
912 return m;
913
914 if (!gfc_expr_check_typed (*expr, gfc_current_ns, false))
f37e928c
DK
915 return MATCH_ERROR;
916
98a819ea 917 if ((*expr)->expr_type == EXPR_FUNCTION)
cba28dad 918 {
8d48826b
SK
919 if ((*expr)->ts.type == BT_INTEGER
920 || ((*expr)->ts.type == BT_UNKNOWN
921 && strcmp((*expr)->symtree->name, "null") != 0))
922 return MATCH_YES;
923
924 goto syntax;
925 }
926 else if ((*expr)->expr_type == EXPR_CONSTANT)
927 {
928 /* F2008, 4.4.3.1: The length is a type parameter; its kind is
929 processor dependent and its value is greater than or equal to zero.
930 F2008, 4.4.3.2: If the character length parameter value evaluates
931 to a negative value, the length of character entities declared
932 is zero. */
933
934 if ((*expr)->ts.type == BT_INTEGER)
cba28dad 935 {
8d48826b
SK
936 if (mpz_cmp_si ((*expr)->value.integer, 0) < 0)
937 mpz_set_si ((*expr)->value.integer, 0);
cba28dad 938 }
8d48826b
SK
939 else
940 goto syntax;
cba28dad 941 }
8d48826b
SK
942 else if ((*expr)->expr_type == EXPR_ARRAY)
943 goto syntax;
944 else if ((*expr)->expr_type == EXPR_VARIABLE)
945 {
fb42421e 946 bool t;
8d48826b
SK
947 gfc_expr *e;
948
949 e = gfc_copy_expr (*expr);
950
951 /* This catches the invalid code "[character(m(2:3)) :: 'x', 'y']",
952 which causes an ICE if gfc_reduce_init_expr() is called. */
54b96a2d
SK
953 if (e->ref && e->ref->type == REF_ARRAY
954 && e->ref->u.ar.type == AR_UNKNOWN
8d48826b
SK
955 && e->ref->u.ar.dimen_type[0] == DIMEN_RANGE)
956 goto syntax;
957
fb42421e
SK
958 t = gfc_reduce_init_expr (e);
959
8d987deb
SK
960 if (!t && e->ts.type == BT_UNKNOWN
961 && e->symtree->n.sym->attr.untyped == 1
63ac6251
TK
962 && (flag_implicit_none
963 || e->symtree->n.sym->ns->seen_implicit_none == 1
8d987deb 964 || e->symtree->n.sym->ns->parent->seen_implicit_none == 1))
fb42421e
SK
965 {
966 gfc_free_expr (e);
967 goto syntax;
968 }
98a819ea 969
54b96a2d 970 if ((e->ref && e->ref->type == REF_ARRAY
70112e2a 971 && e->ref->u.ar.type != AR_ELEMENT)
8d48826b
SK
972 || (!e->ref && e->expr_type == EXPR_ARRAY))
973 {
974 gfc_free_expr (e);
975 goto syntax;
976 }
977
978 gfc_free_expr (e);
979 }
98a819ea 980
cba28dad
JD
981 return m;
982
983syntax:
8d48826b 984 gfc_error ("Scalar INTEGER expression expected at %L", &(*expr)->where);
cba28dad 985 return MATCH_ERROR;
6de9cd9a
DN
986}
987
988
989/* A character length is a '*' followed by a literal integer or a
990 char_len_param_value in parenthesis. */
991
992static match
62732c30 993match_char_length (gfc_expr **expr, bool *deferred, bool obsolescent_check)
6de9cd9a 994{
5cf54585 995 int length;
6de9cd9a
DN
996 match m;
997
f5acf0f2 998 *deferred = false;
6de9cd9a
DN
999 m = gfc_match_char ('*');
1000 if (m != MATCH_YES)
1001 return m;
1002
5cf54585 1003 m = gfc_match_small_literal_int (&length, NULL);
6de9cd9a
DN
1004 if (m == MATCH_ERROR)
1005 return m;
1006
1007 if (m == MATCH_YES)
1008 {
62732c30 1009 if (obsolescent_check
524af0d6 1010 && !gfc_notify_std (GFC_STD_F95_OBS, "Old-style character length at %C"))
e2ab8b09 1011 return MATCH_ERROR;
f622221a 1012 *expr = gfc_get_int_expr (gfc_charlen_int_kind, NULL, length);
6de9cd9a
DN
1013 return m;
1014 }
1015
1016 if (gfc_match_char ('(') == MATCH_NO)
1017 goto syntax;
1018
e69afb29 1019 m = char_len_param_value (expr, deferred);
1c8bcdf7
PT
1020 if (m != MATCH_YES && gfc_matching_function)
1021 {
1022 gfc_undo_symbols ();
1023 m = MATCH_YES;
1024 }
1025
6de9cd9a
DN
1026 if (m == MATCH_ERROR)
1027 return m;
1028 if (m == MATCH_NO)
1029 goto syntax;
1030
1031 if (gfc_match_char (')') == MATCH_NO)
1032 {
1033 gfc_free_expr (*expr);
1034 *expr = NULL;
1035 goto syntax;
1036 }
1037
1038 return MATCH_YES;
1039
1040syntax:
1041 gfc_error ("Syntax error in character length specification at %C");
1042 return MATCH_ERROR;
1043}
1044
1045
9e35b386
EE
1046/* Special subroutine for finding a symbol. Check if the name is found
1047 in the current name space. If not, and we're compiling a function or
1048 subroutine and the parent compilation unit is an interface, then check
1049 to see if the name we've been given is the name of the interface
1050 (located in another namespace). */
6de9cd9a
DN
1051
1052static int
08a6b8e0 1053find_special (const char *name, gfc_symbol **result, bool allow_subroutine)
6de9cd9a
DN
1054{
1055 gfc_state_data *s;
08a6b8e0 1056 gfc_symtree *st;
9e35b386 1057 int i;
6de9cd9a 1058
08a6b8e0 1059 i = gfc_get_sym_tree (name, NULL, &st, allow_subroutine);
d51347f9 1060 if (i == 0)
08a6b8e0
TB
1061 {
1062 *result = st ? st->n.sym : NULL;
1063 goto end;
1064 }
d51347f9 1065
6de9cd9a
DN
1066 if (gfc_current_state () != COMP_SUBROUTINE
1067 && gfc_current_state () != COMP_FUNCTION)
9e35b386 1068 goto end;
6de9cd9a
DN
1069
1070 s = gfc_state_stack->previous;
1071 if (s == NULL)
9e35b386 1072 goto end;
6de9cd9a
DN
1073
1074 if (s->state != COMP_INTERFACE)
9e35b386 1075 goto end;
6de9cd9a 1076 if (s->sym == NULL)
66e4ab31 1077 goto end; /* Nameless interface. */
6de9cd9a
DN
1078
1079 if (strcmp (name, s->sym->name) == 0)
1080 {
1081 *result = s->sym;
1082 return 0;
1083 }
1084
9e35b386
EE
1085end:
1086 return i;
6de9cd9a
DN
1087}
1088
1089
1090/* Special subroutine for getting a symbol node associated with a
1091 procedure name, used in SUBROUTINE and FUNCTION statements. The
1092 symbol is created in the parent using with symtree node in the
1093 child unit pointing to the symbol. If the current namespace has no
1094 parent, then the symbol is just created in the current unit. */
1095
1096static int
636dff67 1097get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
6de9cd9a
DN
1098{
1099 gfc_symtree *st;
1100 gfc_symbol *sym;
a7ca4d8d 1101 int rc = 0;
6de9cd9a 1102
1a492601
PT
1103 /* Module functions have to be left in their own namespace because
1104 they have potentially (almost certainly!) already been referenced.
1105 In this sense, they are rather like external functions. This is
1106 fixed up in resolve.c(resolve_entries), where the symbol name-
1107 space is set to point to the master function, so that the fake
1108 result mechanism can work. */
1109 if (module_fcn_entry)
6c12686b
PT
1110 {
1111 /* Present if entry is declared to be a module procedure. */
1112 rc = gfc_find_symbol (name, gfc_current_ns->parent, 0, result);
aa84a9a5 1113
6c12686b
PT
1114 if (*result == NULL)
1115 rc = gfc_get_symbol (name, NULL, result);
2e32a71e 1116 else if (!gfc_get_symbol (name, NULL, &sym) && sym
aa84a9a5
PT
1117 && (*result)->ts.type == BT_UNKNOWN
1118 && sym->attr.flavor == FL_UNKNOWN)
1119 /* Pick up the typespec for the entry, if declared in the function
1120 body. Note that this symbol is FL_UNKNOWN because it will
1121 only have appeared in a type declaration. The local symtree
1122 is set to point to the module symbol and a unique symtree
1123 to the local version. This latter ensures a correct clearing
1124 of the symbols. */
2e32a71e
PT
1125 {
1126 /* If the ENTRY proceeds its specification, we need to ensure
1127 that this does not raise a "has no IMPLICIT type" error. */
1128 if (sym->ts.type == BT_UNKNOWN)
0e5a218b 1129 sym->attr.untyped = 1;
2e32a71e 1130
0e5a218b 1131 (*result)->ts = sym->ts;
2e32a71e
PT
1132
1133 /* Put the symbol in the procedure namespace so that, should
df2fba9e 1134 the ENTRY precede its specification, the specification
2e32a71e
PT
1135 can be applied. */
1136 (*result)->ns = gfc_current_ns;
1137
1138 gfc_find_sym_tree (name, gfc_current_ns, 0, &st);
1139 st->n.sym = *result;
1140 st = gfc_get_unique_symtree (gfc_current_ns);
2050626a 1141 sym->refs++;
2e32a71e
PT
1142 st->n.sym = sym;
1143 }
6c12686b 1144 }
68ea355b
PT
1145 else
1146 rc = gfc_get_symbol (name, gfc_current_ns->parent, result);
6de9cd9a 1147
a7ca4d8d
PT
1148 if (rc)
1149 return rc;
1150
68ea355b 1151 sym = *result;
79124116
PT
1152 if (sym->attr.proc == PROC_ST_FUNCTION)
1153 return rc;
6de9cd9a 1154
4668d6f9
PT
1155 if (sym->attr.module_procedure
1156 && sym->attr.if_source == IFSRC_IFBODY)
1157 {
1158 /* Create a partially populated interface symbol to carry the
1159 characteristics of the procedure and the result. */
c064374d
PT
1160 sym->tlink = gfc_new_symbol (name, sym->ns);
1161 gfc_add_type (sym->tlink, &(sym->ts),
4668d6f9 1162 &gfc_current_locus);
c064374d 1163 gfc_copy_attr (&sym->tlink->attr, &sym->attr, NULL);
4668d6f9 1164 if (sym->attr.dimension)
c064374d 1165 sym->tlink->as = gfc_copy_array_spec (sym->as);
4668d6f9
PT
1166
1167 /* Ideally, at this point, a copy would be made of the formal
1168 arguments and their namespace. However, this does not appear
1169 to be necessary, albeit at the expense of not being able to
1170 use gfc_compare_interfaces directly. */
1171
1172 if (sym->result && sym->result != sym)
1173 {
c064374d 1174 sym->tlink->result = sym->result;
4668d6f9
PT
1175 sym->result = NULL;
1176 }
1177 else if (sym->result)
1178 {
c064374d 1179 sym->tlink->result = sym->tlink;
4668d6f9
PT
1180 }
1181 }
1182 else if (sym && !sym->gfc_new
1183 && gfc_current_state () != COMP_INTERFACE)
68ea355b 1184 {
cda7004b
PT
1185 /* Trap another encompassed procedure with the same name. All
1186 these conditions are necessary to avoid picking up an entry
1187 whose name clashes with that of the encompassing procedure;
2050626a 1188 this is handled using gsymbols to register unique, globally
cda7004b 1189 accessible names. */
68ea355b 1190 if (sym->attr.flavor != 0
636dff67
SK
1191 && sym->attr.proc != 0
1192 && (sym->attr.subroutine || sym->attr.function)
1193 && sym->attr.if_source != IFSRC_UNKNOWN)
fea70c99
MLI
1194 gfc_error_now ("Procedure %qs at %C is already defined at %L",
1195 name, &sym->declared_at);
68ea355b 1196
fd3e70af
JD
1197 /* Trap a procedure with a name the same as interface in the
1198 encompassing scope. */
1199 if (sym->attr.generic != 0
2305fa31
JD
1200 && (sym->attr.subroutine || sym->attr.function)
1201 && !sym->attr.mod_proc)
fea70c99
MLI
1202 gfc_error_now ("Name %qs at %C is already defined"
1203 " as a generic interface at %L",
1204 name, &sym->declared_at);
fd3e70af 1205
68ea355b
PT
1206 /* Trap declarations of attributes in encompassing scope. The
1207 signature for this is that ts.kind is set. Legitimate
1208 references only set ts.type. */
1209 if (sym->ts.kind != 0
636dff67
SK
1210 && !sym->attr.implicit_type
1211 && sym->attr.proc == 0
1212 && gfc_current_ns->parent != NULL
1213 && sym->attr.access == 0
1214 && !module_fcn_entry)
fea70c99
MLI
1215 gfc_error_now ("Procedure %qs at %C has an explicit interface "
1216 "and must not have attributes declared at %L",
1217 name, &sym->declared_at);
68ea355b
PT
1218 }
1219
1220 if (gfc_current_ns->parent == NULL || *result == NULL)
1221 return rc;
6de9cd9a 1222
1a492601
PT
1223 /* Module function entries will already have a symtree in
1224 the current namespace but will need one at module level. */
1225 if (module_fcn_entry)
6c12686b
PT
1226 {
1227 /* Present if entry is declared to be a module procedure. */
1228 rc = gfc_find_sym_tree (name, gfc_current_ns->parent, 0, &st);
1229 if (st == NULL)
1230 st = gfc_new_symtree (&gfc_current_ns->parent->sym_root, name);
1231 }
1a492601
PT
1232 else
1233 st = gfc_new_symtree (&gfc_current_ns->sym_root, name);
6de9cd9a 1234
6de9cd9a
DN
1235 st->n.sym = sym;
1236 sym->refs++;
1237
66e4ab31 1238 /* See if the procedure should be a module procedure. */
6de9cd9a 1239
1a492601 1240 if (((sym->ns->proc_name != NULL
6c12686b
PT
1241 && sym->ns->proc_name->attr.flavor == FL_MODULE
1242 && sym->attr.proc != PROC_MODULE)
1243 || (module_fcn_entry && sym->attr.proc != PROC_MODULE))
524af0d6 1244 && !gfc_add_procedure (&sym->attr, PROC_MODULE, sym->name, NULL))
6de9cd9a
DN
1245 rc = 2;
1246
1247 return rc;
1248}
1249
1250
a8b3b0b6
CR
1251/* Verify that the given symbol representing a parameter is C
1252 interoperable, by checking to see if it was marked as such after
1253 its declaration. If the given symbol is not interoperable, a
1254 warning is reported, thus removing the need to return the status to
1255 the calling function. The standard does not require the user use
1256 one of the iso_c_binding named constants to declare an
1257 interoperable parameter, but we can't be sure if the param is C
1258 interop or not if the user doesn't. For example, integer(4) may be
1259 legal Fortran, but doesn't have meaning in C. It may interop with
1260 a number of the C types, which causes a problem because the
1261 compiler can't know which one. This code is almost certainly not
1262 portable, and the user will get what they deserve if the C type
1263 across platforms isn't always interoperable with integer(4). If
1264 the user had used something like integer(c_int) or integer(c_long),
1265 the compiler could have automatically handled the varying sizes
1266 across platforms. */
1267
524af0d6 1268bool
00820a2a 1269gfc_verify_c_interop_param (gfc_symbol *sym)
a8b3b0b6
CR
1270{
1271 int is_c_interop = 0;
524af0d6 1272 bool retval = true;
a8b3b0b6
CR
1273
1274 /* We check implicitly typed variables in symbol.c:gfc_set_default_type().
1275 Don't repeat the checks here. */
1276 if (sym->attr.implicit_type)
524af0d6 1277 return true;
f5acf0f2 1278
a8b3b0b6
CR
1279 /* For subroutines or functions that are passed to a BIND(C) procedure,
1280 they're interoperable if they're BIND(C) and their params are all
1281 interoperable. */
1282 if (sym->attr.flavor == FL_PROCEDURE)
1283 {
1284 if (sym->attr.is_bind_c == 0)
1285 {
4daa149b
TB
1286 gfc_error_now ("Procedure %qs at %L must have the BIND(C) "
1287 "attribute to be C interoperable", sym->name,
1288 &(sym->declared_at));
524af0d6 1289 return false;
a8b3b0b6
CR
1290 }
1291 else
1292 {
1293 if (sym->attr.is_c_interop == 1)
1294 /* We've already checked this procedure; don't check it again. */
524af0d6 1295 return true;
a8b3b0b6
CR
1296 else
1297 return verify_bind_c_sym (sym, &(sym->ts), sym->attr.in_common,
1298 sym->common_block);
1299 }
1300 }
f5acf0f2 1301
a8b3b0b6
CR
1302 /* See if we've stored a reference to a procedure that owns sym. */
1303 if (sym->ns != NULL && sym->ns->proc_name != NULL)
1304 {
1305 if (sym->ns->proc_name->attr.is_bind_c == 1)
1306 {
524af0d6 1307 is_c_interop = (gfc_verify_c_interop(&(sym->ts)) ? 1 : 0);
a8b3b0b6
CR
1308
1309 if (is_c_interop != 1)
1310 {
1311 /* Make personalized messages to give better feedback. */
1312 if (sym->ts.type == BT_DERIVED)
c4100eae
MLI
1313 gfc_error ("Variable %qs at %L is a dummy argument to the "
1314 "BIND(C) procedure %qs but is not C interoperable "
1315 "because derived type %qs is not C interoperable",
a8b3b0b6 1316 sym->name, &(sym->declared_at),
f5acf0f2 1317 sym->ns->proc_name->name,
bc21d315 1318 sym->ts.u.derived->name);
00820a2a 1319 else if (sym->ts.type == BT_CLASS)
c4100eae
MLI
1320 gfc_error ("Variable %qs at %L is a dummy argument to the "
1321 "BIND(C) procedure %qs but is not C interoperable "
00820a2a
JW
1322 "because it is polymorphic",
1323 sym->name, &(sym->declared_at),
1324 sym->ns->proc_name->name);
4daa149b 1325 else if (warn_c_binding_type)
48749dbc
MLI
1326 gfc_warning (OPT_Wc_binding_type,
1327 "Variable %qs at %L is a dummy argument of the "
1328 "BIND(C) procedure %qs but may not be C "
a8b3b0b6
CR
1329 "interoperable",
1330 sym->name, &(sym->declared_at),
1331 sym->ns->proc_name->name);
1332 }
aa5e22f0
CR
1333
1334 /* Character strings are only C interoperable if they have a
1335 length of 1. */
1336 if (sym->ts.type == BT_CHARACTER)
1337 {
bc21d315 1338 gfc_charlen *cl = sym->ts.u.cl;
aa5e22f0
CR
1339 if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT
1340 || mpz_cmp_si (cl->length->value.integer, 1) != 0)
1341 {
c4100eae 1342 gfc_error ("Character argument %qs at %L "
aa5e22f0 1343 "must be length 1 because "
c4100eae 1344 "procedure %qs is BIND(C)",
aa5e22f0
CR
1345 sym->name, &sym->declared_at,
1346 sym->ns->proc_name->name);
524af0d6 1347 retval = false;
aa5e22f0
CR
1348 }
1349 }
1350
a8b3b0b6
CR
1351 /* We have to make sure that any param to a bind(c) routine does
1352 not have the allocatable, pointer, or optional attributes,
1353 according to J3/04-007, section 5.1. */
60f6ca95 1354 if (sym->attr.allocatable == 1
a4d9b221
TB
1355 && !gfc_notify_std (GFC_STD_F2008_TS, "Variable %qs at %L with "
1356 "ALLOCATABLE attribute in procedure %qs "
60f6ca95
TB
1357 "with BIND(C)", sym->name,
1358 &(sym->declared_at),
1359 sym->ns->proc_name->name))
1360 retval = false;
1361
1362 if (sym->attr.pointer == 1
a4d9b221
TB
1363 && !gfc_notify_std (GFC_STD_F2008_TS, "Variable %qs at %L with "
1364 "POINTER attribute in procedure %qs "
60f6ca95
TB
1365 "with BIND(C)", sym->name,
1366 &(sym->declared_at),
1367 sym->ns->proc_name->name))
1368 retval = false;
1369
1370 if ((sym->attr.allocatable || sym->attr.pointer) && !sym->as)
a8b3b0b6 1371 {
c4100eae
MLI
1372 gfc_error ("Scalar variable %qs at %L with POINTER or "
1373 "ALLOCATABLE in procedure %qs with BIND(C) is not yet"
60f6ca95 1374 " supported", sym->name, &(sym->declared_at),
a8b3b0b6 1375 sym->ns->proc_name->name);
524af0d6 1376 retval = false;
a8b3b0b6
CR
1377 }
1378
2e8d9212 1379 if (sym->attr.optional == 1 && sym->attr.value)
a8b3b0b6 1380 {
c4100eae
MLI
1381 gfc_error ("Variable %qs at %L cannot have both the OPTIONAL "
1382 "and the VALUE attribute because procedure %qs "
2e8d9212 1383 "is BIND(C)", sym->name, &(sym->declared_at),
a8b3b0b6 1384 sym->ns->proc_name->name);
524af0d6 1385 retval = false;
a8b3b0b6 1386 }
2e8d9212 1387 else if (sym->attr.optional == 1
a4d9b221 1388 && !gfc_notify_std (GFC_STD_F2008_TS, "Variable %qs "
524af0d6 1389 "at %L with OPTIONAL attribute in "
70112e2a
PT
1390 "procedure %qs which is BIND(C)",
1391 sym->name, &(sym->declared_at),
524af0d6
JB
1392 sym->ns->proc_name->name))
1393 retval = false;
a8b3b0b6
CR
1394
1395 /* Make sure that if it has the dimension attribute, that it is
95d47b8d
TB
1396 either assumed size or explicit shape. Deferred shape is already
1397 covered by the pointer/allocatable attribute. */
1398 if (sym->as != NULL && sym->as->type == AS_ASSUMED_SHAPE
2a2703a2 1399 && !gfc_notify_std (GFC_STD_F2008_TS, "Assumed-shape array %qs "
524af0d6 1400 "at %L as dummy argument to the BIND(C) "
811582ec 1401 "procedure %qs at %L", sym->name,
70112e2a
PT
1402 &(sym->declared_at),
1403 sym->ns->proc_name->name,
524af0d6
JB
1404 &(sym->ns->proc_name->declared_at)))
1405 retval = false;
a8b3b0b6
CR
1406 }
1407 }
1408
1409 return retval;
1410}
1411
1412
cf2b3c22 1413
a8b3b0b6 1414/* Function called by variable_decl() that adds a name to the symbol table. */
6de9cd9a 1415
524af0d6 1416static bool
e69afb29 1417build_sym (const char *name, gfc_charlen *cl, bool cl_deferred,
636dff67 1418 gfc_array_spec **as, locus *var_locus)
6de9cd9a
DN
1419{
1420 symbol_attribute attr;
1421 gfc_symbol *sym;
1e6025b6 1422 int upper;
bedee914
PT
1423 gfc_symtree *st;
1424
1425 /* Symbols in a submodule are host associated from the parent module or
1426 submodules. Therefore, they can be overridden by declarations in the
1427 submodule scope. Deal with this by attaching the existing symbol to
1428 a new symtree and recycling the old symtree with a new symbol... */
1429 st = gfc_find_symtree (gfc_current_ns->sym_root, name);
1430 if (st != NULL && gfc_state_stack->state == COMP_SUBMODULE
1431 && st->n.sym != NULL
1432 && st->n.sym->attr.host_assoc && st->n.sym->attr.used_in_submodule)
1433 {
1434 gfc_symtree *s = gfc_get_unique_symtree (gfc_current_ns);
1435 s->n.sym = st->n.sym;
1436 sym = gfc_new_symbol (name, gfc_current_ns);
6de9cd9a 1437
bedee914
PT
1438
1439 st->n.sym = sym;
1440 sym->refs++;
1441 gfc_set_sym_referenced (sym);
1442 }
1443 /* ...Otherwise generate a new symtree and new symbol. */
1444 else if (gfc_get_symbol (name, NULL, &sym))
524af0d6 1445 return false;
6de9cd9a 1446
1e6025b6
TK
1447 /* Check if the name has already been defined as a type. The
1448 first letter of the symtree will be in upper case then. Of
1449 course, this is only necessary if the upper case letter is
1450 actually different. */
1451
1452 upper = TOUPPER(name[0]);
1453 if (upper != name[0])
1454 {
1455 char u_name[GFC_MAX_SYMBOL_LEN + 1];
1456 gfc_symtree *st;
1e6025b6 1457
025d57f0
MS
1458 gcc_assert (strlen(name) <= GFC_MAX_SYMBOL_LEN);
1459 strcpy (u_name, name);
1e6025b6
TK
1460 u_name[0] = upper;
1461
1462 st = gfc_find_symtree (gfc_current_ns->sym_root, u_name);
1463
f6288c24
FR
1464 /* STRUCTURE types can alias symbol names */
1465 if (st != 0 && st->n.sym->attr.flavor != FL_STRUCT)
1e6025b6
TK
1466 {
1467 gfc_error ("Symbol %qs at %C also declared as a type at %L", name,
1468 &st->n.sym->declared_at);
1469 return false;
1470 }
1471 }
1472
66e4ab31 1473 /* Start updating the symbol table. Add basic type attribute if present. */
6de9cd9a 1474 if (current_ts.type != BT_UNKNOWN
636dff67
SK
1475 && (sym->attr.implicit_type == 0
1476 || !gfc_compare_types (&sym->ts, &current_ts))
524af0d6
JB
1477 && !gfc_add_type (sym, &current_ts, var_locus))
1478 return false;
6de9cd9a
DN
1479
1480 if (sym->ts.type == BT_CHARACTER)
e69afb29
SK
1481 {
1482 sym->ts.u.cl = cl;
1483 sym->ts.deferred = cl_deferred;
1484 }
6de9cd9a
DN
1485
1486 /* Add dimension attribute if present. */
524af0d6
JB
1487 if (!gfc_set_array_spec (sym, *as, var_locus))
1488 return false;
6de9cd9a
DN
1489 *as = NULL;
1490
1491 /* Add attribute to symbol. The copy is so that we can reset the
1492 dimension attribute. */
1493 attr = current_attr;
1494 attr.dimension = 0;
be59db2d 1495 attr.codimension = 0;
6de9cd9a 1496
524af0d6
JB
1497 if (!gfc_copy_attr (&sym->attr, &attr, var_locus))
1498 return false;
6de9cd9a 1499
a8b3b0b6
CR
1500 /* Finish any work that may need to be done for the binding label,
1501 if it's a bind(c). The bind(c) attr is found before the symbol
1502 is made, and before the symbol name (for data decls), so the
1503 current_ts is holding the binding label, or nothing if the
1504 name= attr wasn't given. Therefore, test here if we're dealing
1505 with a bind(c) and make sure the binding label is set correctly. */
1506 if (sym->attr.is_bind_c == 1)
1507 {
62603fae 1508 if (!sym->binding_label)
a8b3b0b6 1509 {
ad4a2f64
TB
1510 /* Set the binding label and verify that if a NAME= was specified
1511 then only one identifier was in the entity-decl-list. */
70112e2a 1512 if (!set_binding_label (&sym->binding_label, sym->name,
524af0d6
JB
1513 num_idents_on_line))
1514 return false;
a8b3b0b6
CR
1515 }
1516 }
1517
1518 /* See if we know we're in a common block, and if it's a bind(c)
1519 common then we need to make sure we're an interoperable type. */
1520 if (sym->attr.in_common == 1)
1521 {
1522 /* Test the common block object. */
1523 if (sym->common_block != NULL && sym->common_block->is_bind_c == 1
1524 && sym->ts.is_c_interop != 1)
1525 {
4daa149b 1526 gfc_error_now ("Variable %qs in common block %qs at %C "
a8b3b0b6 1527 "must be declared with a C interoperable "
4daa149b 1528 "kind since common block %qs is BIND(C)",
a8b3b0b6
CR
1529 sym->name, sym->common_block->name,
1530 sym->common_block->name);
1531 gfc_clear_error ();
1532 }
1533 }
1534
9a3db5a3
PT
1535 sym->attr.implied_index = 0;
1536
5bab4c96
PT
1537 /* Use the parameter expressions for a parameterized derived type. */
1538 if ((sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
1539 && sym->ts.u.derived->attr.pdt_type && type_param_spec_list)
1540 sym->param_list = gfc_copy_actual_arglist (type_param_spec_list);
1541
528622fd 1542 if (sym->ts.type == BT_CLASS)
9b6da3c7 1543 return gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as);
cf2b3c22 1544
524af0d6 1545 return true;
6de9cd9a
DN
1546}
1547
636dff67 1548
df7cc9b5 1549/* Set character constant to the given length. The constant will be padded or
d2848082
DK
1550 truncated. If we're inside an array constructor without a typespec, we
1551 additionally check that all elements have the same length; check_len -1
1552 means no checking. */
df7cc9b5
FW
1553
1554void
6b271a2e
JB
1555gfc_set_constant_character_len (gfc_charlen_t len, gfc_expr *expr,
1556 gfc_charlen_t check_len)
df7cc9b5 1557{
00660189 1558 gfc_char_t *s;
6b271a2e 1559 gfc_charlen_t slen;
df7cc9b5 1560
834e9dbb
SK
1561 if (expr->ts.type != BT_CHARACTER)
1562 return;
63af1586 1563
b441ae1d
SK
1564 if (expr->expr_type != EXPR_CONSTANT)
1565 {
1566 gfc_error_now ("CHARACTER length must be a constant at %L", &expr->where);
1567 return;
1568 }
df7cc9b5
FW
1569
1570 slen = expr->value.character.length;
1571 if (len != slen)
1572 {
00660189
FXC
1573 s = gfc_get_wide_string (len + 1);
1574 memcpy (s, expr->value.character.string,
1575 MIN (len, slen) * sizeof (gfc_char_t));
df7cc9b5 1576 if (len > slen)
00660189 1577 gfc_wide_memset (&s[slen], ' ', len - slen);
2220652d 1578
a96c39ea 1579 if (warn_character_truncation && slen > len)
4daa149b
TB
1580 gfc_warning_now (OPT_Wcharacter_truncation,
1581 "CHARACTER expression at %L is being truncated "
6b271a2e
JB
1582 "(%ld/%ld)", &expr->where,
1583 (long) slen, (long) len);
2220652d
PT
1584
1585 /* Apply the standard by 'hand' otherwise it gets cleared for
1586 initializers. */
d2848082
DK
1587 if (check_len != -1 && slen != check_len
1588 && !(gfc_option.allow_std & GFC_STD_GNU))
2220652d 1589 gfc_error_now ("The CHARACTER elements of the array constructor "
6b271a2e
JB
1590 "at %L must have the same length (%ld/%ld)",
1591 &expr->where, (long) slen,
1592 (long) check_len);
2220652d 1593
150675a8 1594 s[len] = '\0';
cede9502 1595 free (expr->value.character.string);
df7cc9b5
FW
1596 expr->value.character.string = s;
1597 expr->value.character.length = len;
1598 }
1599}
6de9cd9a 1600
25d8f0a2 1601
d51347f9 1602/* Function to create and update the enumerator history
25d8f0a2 1603 using the information passed as arguments.
d51347f9
TB
1604 Pointer "max_enum" is also updated, to point to
1605 enum history node containing largest initializer.
25d8f0a2
TS
1606
1607 SYM points to the symbol node of enumerator.
66e4ab31 1608 INIT points to its enumerator value. */
25d8f0a2 1609
d51347f9 1610static void
636dff67 1611create_enum_history (gfc_symbol *sym, gfc_expr *init)
25d8f0a2
TS
1612{
1613 enumerator_history *new_enum_history;
1614 gcc_assert (sym != NULL && init != NULL);
1615
ece3f663 1616 new_enum_history = XCNEW (enumerator_history);
25d8f0a2
TS
1617
1618 new_enum_history->sym = sym;
1619 new_enum_history->initializer = init;
1620 new_enum_history->next = NULL;
1621
1622 if (enum_history == NULL)
1623 {
1624 enum_history = new_enum_history;
1625 max_enum = enum_history;
1626 }
1627 else
1628 {
1629 new_enum_history->next = enum_history;
1630 enum_history = new_enum_history;
1631
d51347f9 1632 if (mpz_cmp (max_enum->initializer->value.integer,
25d8f0a2 1633 new_enum_history->initializer->value.integer) < 0)
636dff67 1634 max_enum = new_enum_history;
25d8f0a2
TS
1635 }
1636}
1637
1638
d51347f9 1639/* Function to free enum kind history. */
25d8f0a2 1640
d51347f9 1641void
636dff67 1642gfc_free_enum_history (void)
25d8f0a2 1643{
d51347f9
TB
1644 enumerator_history *current = enum_history;
1645 enumerator_history *next;
25d8f0a2
TS
1646
1647 while (current != NULL)
1648 {
1649 next = current->next;
cede9502 1650 free (current);
25d8f0a2
TS
1651 current = next;
1652 }
1653 max_enum = NULL;
1654 enum_history = NULL;
1655}
1656
1657
6de9cd9a
DN
1658/* Function called by variable_decl() that adds an initialization
1659 expression to a symbol. */
1660
524af0d6 1661static bool
66e4ab31 1662add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus)
6de9cd9a
DN
1663{
1664 symbol_attribute attr;
1665 gfc_symbol *sym;
1666 gfc_expr *init;
1667
1668 init = *initp;
08a6b8e0 1669 if (find_special (name, &sym, false))
524af0d6 1670 return false;
6de9cd9a
DN
1671
1672 attr = sym->attr;
1673
1674 /* If this symbol is confirming an implicit parameter type,
1675 then an initialization expression is not allowed. */
1676 if (attr.flavor == FL_PARAMETER
1677 && sym->value != NULL
1678 && *initp != NULL)
1679 {
c4100eae 1680 gfc_error ("Initializer not allowed for PARAMETER %qs at %C",
6de9cd9a 1681 sym->name);
524af0d6 1682 return false;
6de9cd9a
DN
1683 }
1684
1685 if (init == NULL)
1686 {
1687 /* An initializer is required for PARAMETER declarations. */
1688 if (attr.flavor == FL_PARAMETER)
1689 {
1690 gfc_error ("PARAMETER at %L is missing an initializer", var_locus);
524af0d6 1691 return false;
6de9cd9a
DN
1692 }
1693 }
1694 else
1695 {
1696 /* If a variable appears in a DATA block, it cannot have an
1de8a836 1697 initializer. */
6de9cd9a
DN
1698 if (sym->attr.data)
1699 {
c4100eae 1700 gfc_error ("Variable %qs at %C with an initializer already "
636dff67 1701 "appears in a DATA statement", sym->name);
524af0d6 1702 return false;
6de9cd9a
DN
1703 }
1704
75d17889 1705 /* Check if the assignment can happen. This has to be put off
80f95228 1706 until later for derived type variables and procedure pointers. */
f6288c24 1707 if (!gfc_bt_struct (sym->ts.type) && !gfc_bt_struct (init->ts.type)
cf2b3c22 1708 && sym->ts.type != BT_CLASS && init->ts.type != BT_CLASS
f5acf0f2 1709 && !sym->attr.proc_pointer
524af0d6
JB
1710 && !gfc_check_assign_symbol (sym, NULL, init))
1711 return false;
6de9cd9a 1712
bc21d315 1713 if (sym->ts.type == BT_CHARACTER && sym->ts.u.cl
51b128a0 1714 && init->ts.type == BT_CHARACTER)
df7cc9b5
FW
1715 {
1716 /* Update symbol character length according initializer. */
524af0d6
JB
1717 if (!gfc_check_assign_symbol (sym, NULL, init))
1718 return false;
51b128a0 1719
bc21d315 1720 if (sym->ts.u.cl->length == NULL)
df7cc9b5 1721 {
f622221a 1722 gfc_charlen_t clen;
66e4ab31
SK
1723 /* If there are multiple CHARACTER variables declared on the
1724 same line, we don't want them to share the same length. */
b76e28c6 1725 sym->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
96f4873b 1726
a99288e5
PT
1727 if (sym->attr.flavor == FL_PARAMETER)
1728 {
1729 if (init->expr_type == EXPR_CONSTANT)
1730 {
1731 clen = init->value.character.length;
b7e75771 1732 sym->ts.u.cl->length
f622221a 1733 = gfc_get_int_expr (gfc_charlen_int_kind,
b7e75771 1734 NULL, clen);
a99288e5
PT
1735 }
1736 else if (init->expr_type == EXPR_ARRAY)
1737 {
c004a341 1738 if (init->ts.u.cl && init->ts.u.cl->length)
39abef62
LK
1739 {
1740 const gfc_expr *length = init->ts.u.cl->length;
1741 if (length->expr_type != EXPR_CONSTANT)
1742 {
1743 gfc_error ("Cannot initialize parameter array "
1744 "at %L "
1745 "with variable length elements",
1746 &sym->declared_at);
1747 return false;
1748 }
1749 clen = mpz_get_si (length->value.integer);
1750 }
dc0f176a
SK
1751 else if (init->value.constructor)
1752 {
1753 gfc_constructor *c;
70112e2a 1754 c = gfc_constructor_first (init->value.constructor);
dc0f176a
SK
1755 clen = c->expr->value.character.length;
1756 }
1757 else
1758 gcc_unreachable ();
b7e75771 1759 sym->ts.u.cl->length
f622221a 1760 = gfc_get_int_expr (gfc_charlen_int_kind,
b7e75771 1761 NULL, clen);
a99288e5 1762 }
bc21d315
JW
1763 else if (init->ts.u.cl && init->ts.u.cl->length)
1764 sym->ts.u.cl->length =
1765 gfc_copy_expr (sym->value->ts.u.cl->length);
a99288e5 1766 }
df7cc9b5
FW
1767 }
1768 /* Update initializer character length according symbol. */
bc21d315 1769 else if (sym->ts.u.cl->length->expr_type == EXPR_CONSTANT)
df7cc9b5 1770 {
d30ecc9c
SK
1771 if (!gfc_specification_expr (sym->ts.u.cl->length))
1772 return false;
1773
aeb8c028
JJ
1774 int k = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind,
1775 false);
1776 /* resolve_charlen will complain later on if the length
1777 is too large. Just skeep the initialization in that case. */
1778 if (mpz_cmp (sym->ts.u.cl->length->value.integer,
1779 gfc_integer_kinds[k].huge) <= 0)
df7cc9b5 1780 {
aeb8c028
JJ
1781 HOST_WIDE_INT len
1782 = gfc_mpz_get_hwi (sym->ts.u.cl->length->value.integer);
1783
1784 if (init->expr_type == EXPR_CONSTANT)
1785 gfc_set_constant_character_len (len, init, -1);
1786 else if (init->expr_type == EXPR_ARRAY)
1787 {
1788 gfc_constructor *c;
b7e75771 1789
aeb8c028
JJ
1790 /* Build a new charlen to prevent simplification from
1791 deleting the length before it is resolved. */
1792 init->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1793 init->ts.u.cl->length
1794 = gfc_copy_expr (sym->ts.u.cl->length);
dcdc7b6c 1795
aeb8c028
JJ
1796 for (c = gfc_constructor_first (init->value.constructor);
1797 c; c = gfc_constructor_next (c))
1798 gfc_set_constant_character_len (len, c->expr, -1);
1799 }
df7cc9b5
FW
1800 }
1801 }
1802 }
1803
f5ca06e6
DK
1804 /* If sym is implied-shape, set its upper bounds from init. */
1805 if (sym->attr.flavor == FL_PARAMETER && sym->attr.dimension
1806 && sym->as->type == AS_IMPLIED_SHAPE)
1807 {
1808 int dim;
1809
1810 if (init->rank == 0)
1811 {
1812 gfc_error ("Can't initialize implied-shape array at %L"
1813 " with scalar", &sym->declared_at);
524af0d6 1814 return false;
f5ca06e6 1815 }
f5ca06e6
DK
1816
1817 /* Shape should be present, we get an initialization expression. */
1818 gcc_assert (init->shape);
1819
1820 for (dim = 0; dim < sym->as->rank; ++dim)
1821 {
1822 int k;
cdffe788 1823 gfc_expr *e, *lower;
f5acf0f2 1824
f5ca06e6 1825 lower = sym->as->lower[dim];
cdffe788 1826
70112e2a 1827 /* If the lower bound is an array element from another
cdffe788
SK
1828 parameterized array, then it is marked with EXPR_VARIABLE and
1829 is an initialization expression. Try to reduce it. */
1830 if (lower->expr_type == EXPR_VARIABLE)
1831 gfc_reduce_init_expr (lower);
1832
1833 if (lower->expr_type == EXPR_CONSTANT)
1834 {
1835 /* All dimensions must be without upper bound. */
1836 gcc_assert (!sym->as->upper[dim]);
1837
1838 k = lower->ts.kind;
1839 e = gfc_get_constant_expr (BT_INTEGER, k, &sym->declared_at);
1840 mpz_add (e->value.integer, lower->value.integer,
1841 init->shape[dim]);
1842 mpz_sub_ui (e->value.integer, e->value.integer, 1);
1843 sym->as->upper[dim] = e;
1844 }
1845 else
f5ca06e6
DK
1846 {
1847 gfc_error ("Non-constant lower bound in implied-shape"
1848 " declaration at %L", &lower->where);
524af0d6 1849 return false;
f5ca06e6 1850 }
f5ca06e6
DK
1851 }
1852
1853 sym->as->type = AS_EXPLICIT;
1854 }
1855
a8b3b0b6
CR
1856 /* Need to check if the expression we initialized this
1857 to was one of the iso_c_binding named constants. If so,
1858 and we're a parameter (constant), let it be iso_c.
1859 For example:
1860 integer(c_int), parameter :: my_int = c_int
1861 integer(my_int) :: my_int_2
1862 If we mark my_int as iso_c (since we can see it's value
1863 is equal to one of the named constants), then my_int_2
1864 will be considered C interoperable. */
f6288c24 1865 if (sym->ts.type != BT_CHARACTER && !gfc_bt_struct (sym->ts.type))
a8b3b0b6
CR
1866 {
1867 sym->ts.is_iso_c |= init->ts.is_iso_c;
1868 sym->ts.is_c_interop |= init->ts.is_c_interop;
1869 /* attr bits needed for module files. */
1870 sym->attr.is_iso_c |= init->ts.is_iso_c;
1871 sym->attr.is_c_interop |= init->ts.is_c_interop;
1872 if (init->ts.is_iso_c)
1873 sym->ts.f90_type = init->ts.f90_type;
1874 }
b7e75771 1875
6de9cd9a
DN
1876 /* Add initializer. Make sure we keep the ranks sane. */
1877 if (sym->attr.dimension && init->rank == 0)
a9b43781
PT
1878 {
1879 mpz_t size;
1880 gfc_expr *array;
a9b43781
PT
1881 int n;
1882 if (sym->attr.flavor == FL_PARAMETER
1883 && init->expr_type == EXPR_CONSTANT
524af0d6 1884 && spec_size (sym->as, &size)
a9b43781
PT
1885 && mpz_cmp_si (size, 0) > 0)
1886 {
b7e75771
JD
1887 array = gfc_get_array_expr (init->ts.type, init->ts.kind,
1888 &init->where);
a9b43781 1889 for (n = 0; n < (int)mpz_get_si (size); n++)
b7e75771
JD
1890 gfc_constructor_append_expr (&array->value.constructor,
1891 n == 0
1892 ? init
1893 : gfc_copy_expr (init),
1894 &init->where);
f5acf0f2 1895
a9b43781
PT
1896 array->shape = gfc_get_shape (sym->as->rank);
1897 for (n = 0; n < sym->as->rank; n++)
1898 spec_dimen_size (sym->as, n, &array->shape[n]);
1899
1900 init = array;
1901 mpz_clear (size);
1902 }
1903 init->rank = sym->as->rank;
1904 }
6de9cd9a
DN
1905
1906 sym->value = init;
ef7236d2
DF
1907 if (sym->attr.save == SAVE_NONE)
1908 sym->attr.save = SAVE_IMPLICIT;
6de9cd9a
DN
1909 *initp = NULL;
1910 }
1911
524af0d6 1912 return true;
6de9cd9a
DN
1913}
1914
1915
1916/* Function called by variable_decl() that adds a name to a structure
1917 being built. */
1918
524af0d6 1919static bool
636dff67
SK
1920build_struct (const char *name, gfc_charlen *cl, gfc_expr **init,
1921 gfc_array_spec **as)
6de9cd9a 1922{
f6288c24 1923 gfc_state_data *s;
6de9cd9a
DN
1924 gfc_component *c;
1925
619dd721 1926 /* F03:C438/C439. If the current symbol is of the same derived type that we're
6de9cd9a 1927 constructing, it must have the pointer attribute. */
619dd721 1928 if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
bc21d315 1929 && current_ts.u.derived == gfc_current_block ()
6de9cd9a
DN
1930 && current_attr.pointer == 0)
1931 {
bf9f15ee
PT
1932 if (current_attr.allocatable
1933 && !gfc_notify_std(GFC_STD_F2008, "Component at %C "
1934 "must have the POINTER attribute"))
1935 {
1936 return false;
1937 }
1938 else if (current_attr.allocatable == 0)
1939 {
9cbf8673
JW
1940 gfc_error ("Component at %C must have the POINTER attribute");
1941 return false;
1942 }
6de9cd9a 1943 }
9cbf8673
JW
1944
1945 /* F03:C437. */
1946 if (current_ts.type == BT_CLASS
1947 && !(current_attr.pointer || current_attr.allocatable))
1948 {
1949 gfc_error ("Component %qs with CLASS at %C must be allocatable "
1950 "or pointer", name);
1951 return false;
bf9f15ee 1952 }
6de9cd9a 1953
636dff67 1954 if (gfc_current_block ()->attr.pointer && (*as)->rank != 0)
6de9cd9a
DN
1955 {
1956 if ((*as)->type != AS_DEFERRED && (*as)->type != AS_EXPLICIT)
1957 {
1958 gfc_error ("Array component of structure at %C must have explicit "
1959 "or deferred shape");
524af0d6 1960 return false;
6de9cd9a
DN
1961 }
1962 }
1963
f6288c24
FR
1964 /* If we are in a nested union/map definition, gfc_add_component will not
1965 properly find repeated components because:
6442a6f4 1966 (i) gfc_add_component does a flat search, where components of unions
f6288c24
FR
1967 and maps are implicity chained so nested components may conflict.
1968 (ii) Unions and maps are not linked as components of their parent
1969 structures until after they are parsed.
1970 For (i) we use gfc_find_component which searches recursively, and for (ii)
1971 we search each block directly from the parse stack until we find the top
1972 level structure. */
1973
1974 s = gfc_state_stack;
1975 if (s->state == COMP_UNION || s->state == COMP_MAP)
1976 {
1977 while (s->state == COMP_UNION || gfc_comp_struct (s->state))
1978 {
1979 c = gfc_find_component (s->sym, name, true, true, NULL);
1980 if (c != NULL)
1981 {
2f029c08 1982 gfc_error_now ("Component %qs at %C already declared at %L",
f6288c24
FR
1983 name, &c->loc);
1984 return false;
1985 }
1986 /* Break after we've searched the entire chain. */
1987 if (s->state == COMP_DERIVED || s->state == COMP_STRUCTURE)
1988 break;
1989 s = s->previous;
1990 }
1991 }
1992
524af0d6
JB
1993 if (!gfc_add_component (gfc_current_block(), name, &c))
1994 return false;
6de9cd9a
DN
1995
1996 c->ts = current_ts;
bc21d315
JW
1997 if (c->ts.type == BT_CHARACTER)
1998 c->ts.u.cl = cl;
5bab4c96
PT
1999
2000 if (c->ts.type != BT_CLASS && c->ts.type != BT_DERIVED
276515e6
PT
2001 && (c->ts.kind == 0 || c->ts.type == BT_CHARACTER)
2002 && saved_kind_expr != NULL)
5bab4c96
PT
2003 c->kind_expr = gfc_copy_expr (saved_kind_expr);
2004
d4b7d0f0 2005 c->attr = current_attr;
6de9cd9a
DN
2006
2007 c->initializer = *init;
2008 *init = NULL;
2009
2010 c->as = *as;
2011 if (c->as != NULL)
be59db2d
TB
2012 {
2013 if (c->as->corank)
2014 c->attr.codimension = 1;
2015 if (c->as->rank)
2016 c->attr.dimension = 1;
2017 }
6de9cd9a
DN
2018 *as = NULL;
2019
7fc61626 2020 gfc_apply_init (&c->ts, &c->attr, c->initializer);
28d08315 2021
6de9cd9a 2022 /* Check array components. */
d4b7d0f0 2023 if (!c->attr.dimension)
2e23972e 2024 goto scalar;
6de9cd9a 2025
d4b7d0f0 2026 if (c->attr.pointer)
6de9cd9a
DN
2027 {
2028 if (c->as->type != AS_DEFERRED)
2029 {
5046aff5
PT
2030 gfc_error ("Pointer array component of structure at %C must have a "
2031 "deferred shape");
a4f15a7d 2032 return false;
5046aff5
PT
2033 }
2034 }
d4b7d0f0 2035 else if (c->attr.allocatable)
5046aff5
PT
2036 {
2037 if (c->as->type != AS_DEFERRED)
2038 {
2039 gfc_error ("Allocatable component of structure at %C must have a "
2040 "deferred shape");
a4f15a7d 2041 return false;
6de9cd9a
DN
2042 }
2043 }
2044 else
2045 {
2046 if (c->as->type != AS_EXPLICIT)
2047 {
636dff67
SK
2048 gfc_error ("Array component of structure at %C must have an "
2049 "explicit shape");
a4f15a7d 2050 return false;
6de9cd9a
DN
2051 }
2052 }
2053
2e23972e
JW
2054scalar:
2055 if (c->ts.type == BT_CLASS)
a4f15a7d 2056 return gfc_build_class_symbol (&c->ts, &c->attr, &c->as);
ea59b186 2057
5bab4c96
PT
2058 if (c->attr.pdt_kind || c->attr.pdt_len)
2059 {
2060 gfc_symbol *sym;
2061 gfc_find_symbol (c->name, gfc_current_block ()->f2k_derived,
2062 0, &sym);
2063 if (sym == NULL)
2064 {
2065 gfc_error ("Type parameter %qs at %C has no corresponding entry "
2066 "in the type parameter name list at %L",
2067 c->name, &gfc_current_block ()->declared_at);
2068 return false;
2069 }
2070 sym->ts = c->ts;
2071 sym->attr.pdt_kind = c->attr.pdt_kind;
2072 sym->attr.pdt_len = c->attr.pdt_len;
2073 if (c->initializer)
2074 sym->value = gfc_copy_expr (c->initializer);
2075 sym->attr.flavor = FL_VARIABLE;
2076 }
2077
2078 if ((c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
2079 && c->ts.u.derived && c->ts.u.derived->attr.pdt_template
2080 && decl_type_param_list)
2081 c->param_list = gfc_copy_actual_arglist (decl_type_param_list);
2082
a4f15a7d 2083 return true;
6de9cd9a
DN
2084}
2085
2086
2087/* Match a 'NULL()', and possibly take care of some side effects. */
2088
2089match
636dff67 2090gfc_match_null (gfc_expr **result)
6de9cd9a
DN
2091{
2092 gfc_symbol *sym;
576f6da6 2093 match m, m2 = MATCH_NO;
6de9cd9a 2094
576f6da6
TB
2095 if ((m = gfc_match (" null ( )")) == MATCH_ERROR)
2096 return MATCH_ERROR;
2097
2098 if (m == MATCH_NO)
2099 {
2100 locus old_loc;
2101 char name[GFC_MAX_SYMBOL_LEN + 1];
2102
94241120 2103 if ((m2 = gfc_match (" null (")) != MATCH_YES)
576f6da6
TB
2104 return m2;
2105
2106 old_loc = gfc_current_locus;
2107 if ((m2 = gfc_match (" %n ) ", name)) == MATCH_ERROR)
2108 return MATCH_ERROR;
2109 if (m2 != MATCH_YES
2110 && ((m2 = gfc_match (" mold = %n )", name)) == MATCH_ERROR))
2111 return MATCH_ERROR;
2112 if (m2 == MATCH_NO)
2113 {
2114 gfc_current_locus = old_loc;
2115 return MATCH_NO;
2116 }
2117 }
6de9cd9a
DN
2118
2119 /* The NULL symbol now has to be/become an intrinsic function. */
2120 if (gfc_get_symbol ("null", NULL, &sym))
2121 {
2122 gfc_error ("NULL() initialization at %C is ambiguous");
2123 return MATCH_ERROR;
2124 }
2125
2126 gfc_intrinsic_symbol (sym);
2127
2128 if (sym->attr.proc != PROC_INTRINSIC
07416986 2129 && !(sym->attr.use_assoc && sym->attr.intrinsic)
524af0d6
JB
2130 && (!gfc_add_procedure(&sym->attr, PROC_INTRINSIC, sym->name, NULL)
2131 || !gfc_add_function (&sym->attr, sym->name, NULL)))
6de9cd9a
DN
2132 return MATCH_ERROR;
2133
b7e75771 2134 *result = gfc_get_null_expr (&gfc_current_locus);
6de9cd9a 2135
576f6da6
TB
2136 /* Invalid per F2008, C512. */
2137 if (m2 == MATCH_YES)
2138 {
2139 gfc_error ("NULL() initialization at %C may not have MOLD");
2140 return MATCH_ERROR;
2141 }
2142
6de9cd9a
DN
2143 return MATCH_YES;
2144}
2145
2146
80f95228
JW
2147/* Match the initialization expr for a data pointer or procedure pointer. */
2148
2149static match
2150match_pointer_init (gfc_expr **init, int procptr)
2151{
2152 match m;
2153
f6288c24 2154 if (gfc_pure (NULL) && !gfc_comp_struct (gfc_state_stack->state))
80f95228
JW
2155 {
2156 gfc_error ("Initialization of pointer at %C is not allowed in "
2157 "a PURE procedure");
2158 return MATCH_ERROR;
2159 }
ccd7751b 2160 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
80f95228 2161
eea58adb 2162 /* Match NULL() initialization. */
80f95228
JW
2163 m = gfc_match_null (init);
2164 if (m != MATCH_NO)
2165 return m;
2166
2167 /* Match non-NULL initialization. */
837c4b78 2168 gfc_matching_ptr_assignment = !procptr;
80f95228
JW
2169 gfc_matching_procptr_assignment = procptr;
2170 m = gfc_match_rvalue (init);
837c4b78 2171 gfc_matching_ptr_assignment = 0;
80f95228
JW
2172 gfc_matching_procptr_assignment = 0;
2173 if (m == MATCH_ERROR)
2174 return MATCH_ERROR;
2175 else if (m == MATCH_NO)
2176 {
2177 gfc_error ("Error in pointer initialization at %C");
2178 return MATCH_ERROR;
2179 }
2180
dc9a54fa
JW
2181 if (!procptr && !gfc_resolve_expr (*init))
2182 return MATCH_ERROR;
f5acf0f2 2183
524af0d6
JB
2184 if (!gfc_notify_std (GFC_STD_F2008, "non-NULL pointer "
2185 "initialization at %C"))
80f95228
JW
2186 return MATCH_ERROR;
2187
2188 return MATCH_YES;
2189}
2190
2191
524af0d6 2192static bool
bb9de0c4
JW
2193check_function_name (char *name)
2194{
2195 /* In functions that have a RESULT variable defined, the function name always
2196 refers to function calls. Therefore, the name is not allowed to appear in
2197 specification statements. When checking this, be careful about
2198 'hidden' procedure pointer results ('ppr@'). */
2199
2200 if (gfc_current_state () == COMP_FUNCTION)
2201 {
2202 gfc_symbol *block = gfc_current_block ();
2203 if (block && block->result && block->result != block
2204 && strcmp (block->result->name, "ppr@") != 0
2205 && strcmp (block->name, name) == 0)
2206 {
c4100eae 2207 gfc_error ("Function name %qs not allowed at %C", name);
524af0d6 2208 return false;
bb9de0c4
JW
2209 }
2210 }
2211
524af0d6 2212 return true;
bb9de0c4
JW
2213}
2214
2215
6de9cd9a
DN
2216/* Match a variable name with an optional initializer. When this
2217 subroutine is called, a variable is expected to be parsed next.
2218 Depending on what is happening at the moment, updates either the
2219 symbol table or the current interface. */
2220
2221static match
949d5b72 2222variable_decl (int elem)
6de9cd9a
DN
2223{
2224 char name[GFC_MAX_SYMBOL_LEN + 1];
6f855a26 2225 static unsigned int fill_id = 0;
6de9cd9a
DN
2226 gfc_expr *initializer, *char_len;
2227 gfc_array_spec *as;
83d890b9 2228 gfc_array_spec *cp_as; /* Extra copy for Cray Pointees. */
6de9cd9a 2229 gfc_charlen *cl;
e69afb29 2230 bool cl_deferred;
6de9cd9a
DN
2231 locus var_locus;
2232 match m;
524af0d6 2233 bool t;
83d890b9 2234 gfc_symbol *sym;
6de9cd9a
DN
2235
2236 initializer = NULL;
2237 as = NULL;
83d890b9 2238 cp_as = NULL;
6de9cd9a
DN
2239
2240 /* When we get here, we've just matched a list of attributes and
2241 maybe a type and a double colon. The next thing we expect to see
2242 is the name of the symbol. */
6f855a26
FR
2243
2244 /* If we are parsing a structure with legacy support, we allow the symbol
2245 name to be '%FILL' which gives it an anonymous (inaccessible) name. */
2246 m = MATCH_NO;
2247 gfc_gobble_whitespace ();
2248 if (gfc_peek_ascii_char () == '%')
2249 {
2250 gfc_next_ascii_char ();
2251 m = gfc_match ("fill");
2252 }
2253
6de9cd9a 2254 if (m != MATCH_YES)
6f855a26
FR
2255 {
2256 m = gfc_match_name (name);
2257 if (m != MATCH_YES)
2258 goto cleanup;
2259 }
2260
2261 else
2262 {
2263 m = MATCH_ERROR;
2264 if (gfc_current_state () != COMP_STRUCTURE)
2265 {
2266 if (flag_dec_structure)
2267 gfc_error ("%qs not allowed outside STRUCTURE at %C", "%FILL");
2268 else
2269 gfc_error ("%qs at %C is a DEC extension, enable with "
2270 "%<-fdec-structure%>", "%FILL");
2271 goto cleanup;
2272 }
2273
2274 if (attr_seen)
2275 {
2276 gfc_error ("%qs entity cannot have attributes at %C", "%FILL");
2277 goto cleanup;
2278 }
2279
2280 /* %FILL components are given invalid fortran names. */
2281 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "%%FILL%u", fill_id++);
2282 m = MATCH_YES;
2283 }
6de9cd9a 2284
63645982 2285 var_locus = gfc_current_locus;
6de9cd9a
DN
2286
2287 /* Now we could see the optional array spec. or character length. */
be59db2d 2288 m = gfc_match_array_spec (&as, true, true);
11126dc0 2289 if (m == MATCH_ERROR)
6de9cd9a 2290 goto cleanup;
25d8f0a2 2291
6de9cd9a
DN
2292 if (m == MATCH_NO)
2293 as = gfc_copy_array_spec (current_as);
63fbf586 2294 else if (current_as
524af0d6 2295 && !merge_array_spec (current_as, as, true))
63fbf586
TB
2296 {
2297 m = MATCH_ERROR;
2298 goto cleanup;
2299 }
6de9cd9a 2300
c61819ff 2301 if (flag_cray_pointer)
11126dc0
AL
2302 cp_as = gfc_copy_array_spec (as);
2303
f5ca06e6
DK
2304 /* At this point, we know for sure if the symbol is PARAMETER and can thus
2305 determine (and check) whether it can be implied-shape. If it
2306 was parsed as assumed-size, change it because PARAMETERs can not
09ef33c1
SK
2307 be assumed-size.
2308
2309 An explicit-shape-array cannot appear under several conditions.
2310 That check is done here as well. */
f5ca06e6
DK
2311 if (as)
2312 {
2313 if (as->type == AS_IMPLIED_SHAPE && current_attr.flavor != FL_PARAMETER)
2314 {
2315 m = MATCH_ERROR;
c4100eae 2316 gfc_error ("Non-PARAMETER symbol %qs at %L can't be implied-shape",
f5ca06e6
DK
2317 name, &var_locus);
2318 goto cleanup;
2319 }
2320
2321 if (as->type == AS_ASSUMED_SIZE && as->rank == 1
2322 && current_attr.flavor == FL_PARAMETER)
2323 as->type = AS_IMPLIED_SHAPE;
2324
2325 if (as->type == AS_IMPLIED_SHAPE
70112e2a 2326 && !gfc_notify_std (GFC_STD_F2008, "Implied-shape array at %L",
524af0d6 2327 &var_locus))
f5ca06e6
DK
2328 {
2329 m = MATCH_ERROR;
2330 goto cleanup;
2331 }
09ef33c1
SK
2332
2333 /* F2018:C830 (R816) An explicit-shape-spec whose bounds are not
2334 constant expressions shall appear only in a subprogram, derived
2335 type definition, BLOCK construct, or interface body. */
2336 if (as->type == AS_EXPLICIT
2337 && gfc_current_state () != COMP_BLOCK
2338 && gfc_current_state () != COMP_DERIVED
2339 && gfc_current_state () != COMP_FUNCTION
2340 && gfc_current_state () != COMP_INTERFACE
2341 && gfc_current_state () != COMP_SUBROUTINE)
2342 {
2343 gfc_expr *e;
2344 bool not_constant = false;
2345
2346 for (int i = 0; i < as->rank; i++)
2347 {
2348 e = gfc_copy_expr (as->lower[i]);
2349 gfc_resolve_expr (e);
2350 gfc_simplify_expr (e, 0);
2351 if (e && (e->expr_type != EXPR_CONSTANT))
2352 {
2353 not_constant = true;
2354 break;
2355 }
2356 gfc_free_expr (e);
2357
2358 e = gfc_copy_expr (as->upper[i]);
2359 gfc_resolve_expr (e);
2360 gfc_simplify_expr (e, 0);
2361 if (e && (e->expr_type != EXPR_CONSTANT))
2362 {
2363 not_constant = true;
2364 break;
2365 }
2366 gfc_free_expr (e);
2367 }
2368
2369 if (not_constant)
2370 {
2371 gfc_error ("Explicit shaped array with nonconstant bounds at %C");
2372 m = MATCH_ERROR;
2373 goto cleanup;
2374 }
2375 }
f5ca06e6
DK
2376 }
2377
6de9cd9a
DN
2378 char_len = NULL;
2379 cl = NULL;
e69afb29 2380 cl_deferred = false;
6de9cd9a
DN
2381
2382 if (current_ts.type == BT_CHARACTER)
2383 {
2767f2cc 2384 switch (match_char_length (&char_len, &cl_deferred, false))
6de9cd9a
DN
2385 {
2386 case MATCH_YES:
b76e28c6 2387 cl = gfc_new_charlen (gfc_current_ns, NULL);
6de9cd9a
DN
2388
2389 cl->length = char_len;
2390 break;
2391
949d5b72 2392 /* Non-constant lengths need to be copied after the first
9b21a380 2393 element. Also copy assumed lengths. */
6de9cd9a 2394 case MATCH_NO:
9b21a380 2395 if (elem > 1
bc21d315
JW
2396 && (current_ts.u.cl->length == NULL
2397 || current_ts.u.cl->length->expr_type != EXPR_CONSTANT))
949d5b72 2398 {
b76e28c6 2399 cl = gfc_new_charlen (gfc_current_ns, NULL);
bc21d315 2400 cl->length = gfc_copy_expr (current_ts.u.cl->length);
949d5b72
PT
2401 }
2402 else
bc21d315 2403 cl = current_ts.u.cl;
949d5b72 2404
e69afb29
SK
2405 cl_deferred = current_ts.deferred;
2406
6de9cd9a
DN
2407 break;
2408
2409 case MATCH_ERROR:
2410 goto cleanup;
2411 }
2412 }
2413
4668d6f9
PT
2414 /* The dummy arguments and result of the abreviated form of MODULE
2415 PROCEDUREs, used in SUBMODULES should not be redefined. */
2416 if (gfc_current_ns->proc_name
2417 && gfc_current_ns->proc_name->abr_modproc_decl)
2418 {
2419 gfc_find_symbol (name, gfc_current_ns, 1, &sym);
2420 if (sym != NULL && (sym->attr.dummy || sym->attr.result))
2421 {
2422 m = MATCH_ERROR;
811582ec 2423 gfc_error ("%qs at %C is a redefinition of the declaration "
4668d6f9 2424 "in the corresponding interface for MODULE "
811582ec 2425 "PROCEDURE %qs", sym->name,
4668d6f9
PT
2426 gfc_current_ns->proc_name->name);
2427 goto cleanup;
2428 }
2429 }
2430
6f855a26
FR
2431 /* %FILL components may not have initializers. */
2432 if (strncmp (name, "%FILL", 5) == 0 && gfc_match_eos () != MATCH_YES)
2433 {
2434 gfc_error ("%qs entity cannot have an initializer at %C", "%FILL");
2435 m = MATCH_ERROR;
2436 goto cleanup;
2437 }
2438
83d890b9 2439 /* If this symbol has already shown up in a Cray Pointer declaration,
88f7d6fb 2440 and this is not a component declaration,
66e4ab31 2441 then we want to set the type & bail out. */
f6288c24 2442 if (flag_cray_pointer && !gfc_comp_struct (gfc_current_state ()))
83d890b9
AL
2443 {
2444 gfc_find_symbol (name, gfc_current_ns, 1, &sym);
2445 if (sym != NULL && sym->attr.cray_pointee)
2446 {
2447 sym->ts.type = current_ts.type;
2448 sym->ts.kind = current_ts.kind;
bc21d315
JW
2449 sym->ts.u.cl = cl;
2450 sym->ts.u.derived = current_ts.u.derived;
a8b3b0b6
CR
2451 sym->ts.is_c_interop = current_ts.is_c_interop;
2452 sym->ts.is_iso_c = current_ts.is_iso_c;
83d890b9 2453 m = MATCH_YES;
f5acf0f2 2454
83d890b9
AL
2455 /* Check to see if we have an array specification. */
2456 if (cp_as != NULL)
2457 {
2458 if (sym->as != NULL)
2459 {
e25a0da3 2460 gfc_error ("Duplicate array spec for Cray pointee at %C");
83d890b9
AL
2461 gfc_free_array_spec (cp_as);
2462 m = MATCH_ERROR;
2463 goto cleanup;
2464 }
2465 else
2466 {
524af0d6 2467 if (!gfc_set_array_spec (sym, cp_as, &var_locus))
83d890b9 2468 gfc_internal_error ("Couldn't set pointee array spec.");
d51347f9 2469
83d890b9 2470 /* Fix the array spec. */
d51347f9 2471 m = gfc_mod_pointee_as (sym->as);
83d890b9
AL
2472 if (m == MATCH_ERROR)
2473 goto cleanup;
2474 }
d51347f9 2475 }
83d890b9
AL
2476 goto cleanup;
2477 }
2478 else
2479 {
2480 gfc_free_array_spec (cp_as);
2481 }
2482 }
d51347f9 2483
3070bab4
JW
2484 /* Procedure pointer as function result. */
2485 if (gfc_current_state () == COMP_FUNCTION
2486 && strcmp ("ppr@", gfc_current_block ()->name) == 0
2487 && strcmp (name, gfc_current_block ()->ns->proc_name->name) == 0)
2488 strcpy (name, "ppr@");
2489
2490 if (gfc_current_state () == COMP_FUNCTION
2491 && strcmp (name, gfc_current_block ()->name) == 0
2492 && gfc_current_block ()->result
2493 && strcmp ("ppr@", gfc_current_block ()->result->name) == 0)
2494 strcpy (name, "ppr@");
d51347f9 2495
6de9cd9a
DN
2496 /* OK, we've successfully matched the declaration. Now put the
2497 symbol in the current namespace, because it might be used in the
69de3b83 2498 optional initialization expression for this symbol, e.g. this is
6de9cd9a
DN
2499 perfectly legal:
2500
2501 integer, parameter :: i = huge(i)
2502
2503 This is only true for parameters or variables of a basic type.
2504 For components of derived types, it is not true, so we don't
2505 create a symbol for those yet. If we fail to create the symbol,
2506 bail out. */
f6288c24 2507 if (!gfc_comp_struct (gfc_current_state ())
524af0d6 2508 && !build_sym (name, cl, cl_deferred, &as, &var_locus))
6de9cd9a 2509 {
72af9f0b
PT
2510 m = MATCH_ERROR;
2511 goto cleanup;
2512 }
2513
524af0d6 2514 if (!check_function_name (name))
6de9cd9a 2515 {
6de9cd9a
DN
2516 m = MATCH_ERROR;
2517 goto cleanup;
2518 }
2519
294fbfc8
TS
2520 /* We allow old-style initializations of the form
2521 integer i /2/, j(4) /3*3, 1/
2522 (if no colon has been seen). These are different from data
2523 statements in that initializers are only allowed to apply to the
2524 variable immediately preceding, i.e.
2525 integer i, j /1, 2/
2526 is not allowed. Therefore we have to do some work manually, that
75d17889 2527 could otherwise be left to the matchers for DATA statements. */
294fbfc8
TS
2528
2529 if (!colon_seen && gfc_match (" /") == MATCH_YES)
2530 {
524af0d6
JB
2531 if (!gfc_notify_std (GFC_STD_GNU, "Old-style "
2532 "initialization at %C"))
294fbfc8 2533 return MATCH_ERROR;
f6288c24
FR
2534
2535 /* Allow old style initializations for components of STRUCTUREs and MAPs
2536 but not components of derived types. */
b18f1efc
JJ
2537 else if (gfc_current_state () == COMP_DERIVED)
2538 {
2539 gfc_error ("Invalid old style initialization for derived type "
2540 "component at %C");
2541 m = MATCH_ERROR;
2542 goto cleanup;
2543 }
f5acf0f2 2544
f6288c24
FR
2545 /* For structure components, read the initializer as a special
2546 expression and let the rest of this function apply the initializer
2547 as usual. */
2548 else if (gfc_comp_struct (gfc_current_state ()))
2549 {
2550 m = match_clist_expr (&initializer, &current_ts, as);
2551 if (m == MATCH_NO)
2552 gfc_error ("Syntax error in old style initialization of %s at %C",
2553 name);
2554 if (m != MATCH_YES)
2555 goto cleanup;
2556 }
2557
2558 /* Otherwise we treat the old style initialization just like a
2559 DATA declaration for the current variable. */
2560 else
2561 return match_old_style_init (name);
294fbfc8
TS
2562 }
2563
6de9cd9a
DN
2564 /* The double colon must be present in order to have initializers.
2565 Otherwise the statement is ambiguous with an assignment statement. */
2566 if (colon_seen)
2567 {
2568 if (gfc_match (" =>") == MATCH_YES)
2569 {
6de9cd9a
DN
2570 if (!current_attr.pointer)
2571 {
2572 gfc_error ("Initialization at %C isn't for a pointer variable");
2573 m = MATCH_ERROR;
2574 goto cleanup;
2575 }
2576
80f95228 2577 m = match_pointer_init (&initializer, 0);
6de9cd9a
DN
2578 if (m != MATCH_YES)
2579 goto cleanup;
6de9cd9a
DN
2580 }
2581 else if (gfc_match_char ('=') == MATCH_YES)
2582 {
2583 if (current_attr.pointer)
2584 {
a4d9b221
TB
2585 gfc_error ("Pointer initialization at %C requires %<=>%>, "
2586 "not %<=%>");
6de9cd9a
DN
2587 m = MATCH_ERROR;
2588 goto cleanup;
2589 }
2590
2591 m = gfc_match_init_expr (&initializer);
2592 if (m == MATCH_NO)
2593 {
2594 gfc_error ("Expected an initialization expression at %C");
2595 m = MATCH_ERROR;
2596 }
2597
ade20620 2598 if (current_attr.flavor != FL_PARAMETER && gfc_pure (NULL)
f6288c24 2599 && !gfc_comp_struct (gfc_state_stack->state))
6de9cd9a 2600 {
636dff67
SK
2601 gfc_error ("Initialization of variable at %C is not allowed in "
2602 "a PURE procedure");
6de9cd9a
DN
2603 m = MATCH_ERROR;
2604 }
2605
ccd7751b 2606 if (current_attr.flavor != FL_PARAMETER
f6288c24 2607 && !gfc_comp_struct (gfc_state_stack->state))
ccd7751b
TB
2608 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
2609
6de9cd9a
DN
2610 if (m != MATCH_YES)
2611 goto cleanup;
2612 }
cb44ab82
VL
2613 }
2614
5046aff5 2615 if (initializer != NULL && current_attr.allocatable
f6288c24 2616 && gfc_comp_struct (gfc_current_state ()))
5046aff5 2617 {
636dff67
SK
2618 gfc_error ("Initialization of allocatable component at %C is not "
2619 "allowed");
5046aff5
PT
2620 m = MATCH_ERROR;
2621 goto cleanup;
2622 }
2623
18a4e7e3
PT
2624 if (gfc_current_state () == COMP_DERIVED
2625 && gfc_current_block ()->attr.pdt_template)
2626 {
2627 gfc_symbol *param;
2628 gfc_find_symbol (name, gfc_current_block ()->f2k_derived,
2629 0, &param);
2630 if (!param && (current_attr.pdt_kind || current_attr.pdt_len))
2631 {
2632 gfc_error ("The component with KIND or LEN attribute at %C does not "
2633 "not appear in the type parameter list at %L",
2634 &gfc_current_block ()->declared_at);
2635 m = MATCH_ERROR;
2636 goto cleanup;
2637 }
2638 else if (param && !(current_attr.pdt_kind || current_attr.pdt_len))
2639 {
2640 gfc_error ("The component at %C that appears in the type parameter "
2641 "list at %L has neither the KIND nor LEN attribute",
2642 &gfc_current_block ()->declared_at);
2643 m = MATCH_ERROR;
2644 goto cleanup;
2645 }
2646 else if (as && (current_attr.pdt_kind || current_attr.pdt_len))
2647 {
2648 gfc_error ("The component at %C which is a type parameter must be "
2649 "a scalar");
2650 m = MATCH_ERROR;
2651 goto cleanup;
2652 }
2653 else if (param && initializer)
2654 param->value = gfc_copy_expr (initializer);
2655 }
2656
54b4ba60 2657 /* Add the initializer. Note that it is fine if initializer is
6de9cd9a
DN
2658 NULL here, because we sometimes also need to check if a
2659 declaration *must* have an initialization expression. */
f6288c24 2660 if (!gfc_comp_struct (gfc_current_state ()))
6de9cd9a
DN
2661 t = add_init_expr_to_sym (name, &initializer, &var_locus);
2662 else
54b4ba60 2663 {
5046aff5 2664 if (current_ts.type == BT_DERIVED
636dff67 2665 && !current_attr.pointer && !initializer)
54b4ba60
PB
2666 initializer = gfc_default_initializer (&current_ts);
2667 t = build_struct (name, cl, &initializer, &as);
f6288c24
FR
2668
2669 /* If we match a nested structure definition we expect to see the
2670 * body even if the variable declarations blow up, so we need to keep
2671 * the structure declaration around. */
2672 if (gfc_new_block && gfc_new_block->attr.flavor == FL_STRUCT)
2673 gfc_commit_symbol (gfc_new_block);
54b4ba60 2674 }
6de9cd9a 2675
524af0d6 2676 m = (t) ? MATCH_YES : MATCH_ERROR;
6de9cd9a
DN
2677
2678cleanup:
2679 /* Free stuff up and return. */
2680 gfc_free_expr (initializer);
2681 gfc_free_array_spec (as);
2682
2683 return m;
2684}
2685
2686
b2b81a3f
BM
2687/* Match an extended-f77 "TYPESPEC*bytesize"-style kind specification.
2688 This assumes that the byte size is equal to the kind number for
2689 non-COMPLEX types, and equal to twice the kind number for COMPLEX. */
6de9cd9a
DN
2690
2691match
636dff67 2692gfc_match_old_kind_spec (gfc_typespec *ts)
6de9cd9a
DN
2693{
2694 match m;
5cf54585 2695 int original_kind;
6de9cd9a
DN
2696
2697 if (gfc_match_char ('*') != MATCH_YES)
2698 return MATCH_NO;
2699
5cf54585 2700 m = gfc_match_small_literal_int (&ts->kind, NULL);
6de9cd9a
DN
2701 if (m != MATCH_YES)
2702 return MATCH_ERROR;
2703
e45b3c75
ES
2704 original_kind = ts->kind;
2705
6de9cd9a 2706 /* Massage the kind numbers for complex types. */
e45b3c75
ES
2707 if (ts->type == BT_COMPLEX)
2708 {
2709 if (ts->kind % 2)
636dff67
SK
2710 {
2711 gfc_error ("Old-style type declaration %s*%d not supported at %C",
2712 gfc_basic_typename (ts->type), original_kind);
2713 return MATCH_ERROR;
2714 }
e45b3c75 2715 ts->kind /= 2;
f4347334
ZG
2716
2717 }
2718
203c7ebf 2719 if (ts->type == BT_INTEGER && ts->kind == 4 && flag_integer4_kind == 8)
f4347334
ZG
2720 ts->kind = 8;
2721
2722 if (ts->type == BT_REAL || ts->type == BT_COMPLEX)
2723 {
2724 if (ts->kind == 4)
2725 {
203c7ebf 2726 if (flag_real4_kind == 8)
f4347334 2727 ts->kind = 8;
203c7ebf 2728 if (flag_real4_kind == 10)
f4347334 2729 ts->kind = 10;
203c7ebf 2730 if (flag_real4_kind == 16)
f4347334
ZG
2731 ts->kind = 16;
2732 }
2733
2734 if (ts->kind == 8)
2735 {
203c7ebf 2736 if (flag_real8_kind == 4)
f4347334 2737 ts->kind = 4;
203c7ebf 2738 if (flag_real8_kind == 10)
f4347334 2739 ts->kind = 10;
203c7ebf 2740 if (flag_real8_kind == 16)
f4347334
ZG
2741 ts->kind = 16;
2742 }
e45b3c75 2743 }
6de9cd9a 2744
e7a2d5fb 2745 if (gfc_validate_kind (ts->type, ts->kind, true) < 0)
6de9cd9a 2746 {
e45b3c75 2747 gfc_error ("Old-style type declaration %s*%d not supported at %C",
636dff67 2748 gfc_basic_typename (ts->type), original_kind);
6de9cd9a
DN
2749 return MATCH_ERROR;
2750 }
2751
70112e2a
PT
2752 if (!gfc_notify_std (GFC_STD_GNU,
2753 "Nonstandard type declaration %s*%d at %C",
524af0d6 2754 gfc_basic_typename(ts->type), original_kind))
df8652dc
SK
2755 return MATCH_ERROR;
2756
6de9cd9a
DN
2757 return MATCH_YES;
2758}
2759
2760
2761/* Match a kind specification. Since kinds are generally optional, we
2762 usually return MATCH_NO if something goes wrong. If a "kind="
2763 string is found, then we know we have an error. */
2764
2765match
e2d29968 2766gfc_match_kind_spec (gfc_typespec *ts, bool kind_expr_only)
6de9cd9a 2767{
e2d29968 2768 locus where, loc;
6de9cd9a
DN
2769 gfc_expr *e;
2770 match m, n;
96ee3a4a 2771 char c;
6de9cd9a
DN
2772
2773 m = MATCH_NO;
e2d29968 2774 n = MATCH_YES;
6de9cd9a 2775 e = NULL;
5bab4c96 2776 saved_kind_expr = NULL;
6de9cd9a 2777
e2d29968
PT
2778 where = loc = gfc_current_locus;
2779
2780 if (kind_expr_only)
2781 goto kind_expr;
6de9cd9a
DN
2782
2783 if (gfc_match_char ('(') == MATCH_NO)
2784 return MATCH_NO;
2785
2786 /* Also gobbles optional text. */
2787 if (gfc_match (" kind = ") == MATCH_YES)
2788 m = MATCH_ERROR;
2789
e2d29968
PT
2790 loc = gfc_current_locus;
2791
2792kind_expr:
5bab4c96 2793
6de9cd9a 2794 n = gfc_match_init_expr (&e);
e2d29968 2795
5bab4c96
PT
2796 if (gfc_derived_parameter_expr (e))
2797 {
2798 ts->kind = 0;
2799 saved_kind_expr = gfc_copy_expr (e);
2800 goto close_brackets;
2801 }
2802
6de9cd9a 2803 if (n != MATCH_YES)
e2d29968 2804 {
1c8bcdf7 2805 if (gfc_matching_function)
e2d29968 2806 {
f5acf0f2 2807 /* The function kind expression might include use associated or
1c8bcdf7
PT
2808 imported parameters and try again after the specification
2809 expressions..... */
e2d29968
PT
2810 if (gfc_match_char (')') != MATCH_YES)
2811 {
2812 gfc_error ("Missing right parenthesis at %C");
2813 m = MATCH_ERROR;
2814 goto no_match;
2815 }
2816
2817 gfc_free_expr (e);
e2d29968
PT
2818 gfc_undo_symbols ();
2819 return MATCH_YES;
2820 }
2821 else
2822 {
2823 /* ....or else, the match is real. */
2824 if (n == MATCH_NO)
2825 gfc_error ("Expected initialization expression at %C");
2826 if (n != MATCH_YES)
2827 return MATCH_ERROR;
2828 }
2829 }
6de9cd9a
DN
2830
2831 if (e->rank != 0)
2832 {
2833 gfc_error ("Expected scalar initialization expression at %C");
2834 m = MATCH_ERROR;
2835 goto no_match;
2836 }
2837
51f03c6b 2838 if (gfc_extract_int (e, &ts->kind, 1))
6de9cd9a 2839 {
6de9cd9a
DN
2840 m = MATCH_ERROR;
2841 goto no_match;
2842 }
2843
a8b3b0b6
CR
2844 /* Before throwing away the expression, let's see if we had a
2845 C interoperable kind (and store the fact). */
2846 if (e->ts.is_c_interop == 1)
2847 {
eea58adb 2848 /* Mark this as C interoperable if being declared with one
a8b3b0b6
CR
2849 of the named constants from iso_c_binding. */
2850 ts->is_c_interop = e->ts.is_iso_c;
2851 ts->f90_type = e->ts.f90_type;
e655a6cc
TK
2852 if (e->symtree)
2853 ts->interop_kind = e->symtree->n.sym;
a8b3b0b6 2854 }
f5acf0f2 2855
6de9cd9a
DN
2856 gfc_free_expr (e);
2857 e = NULL;
2858
a8b3b0b6
CR
2859 /* Ignore errors to this point, if we've gotten here. This means
2860 we ignore the m=MATCH_ERROR from above. */
e7a2d5fb 2861 if (gfc_validate_kind (ts->type, ts->kind, true) < 0)
6de9cd9a
DN
2862 {
2863 gfc_error ("Kind %d not supported for type %s at %C", ts->kind,
2864 gfc_basic_typename (ts->type));
96ee3a4a
TB
2865 gfc_current_locus = where;
2866 return MATCH_ERROR;
6de9cd9a 2867 }
96ee3a4a 2868
2ec855f1
TB
2869 /* Warn if, e.g., c_int is used for a REAL variable, but not
2870 if, e.g., c_double is used for COMPLEX as the standard
2871 explicitly says that the kind type parameter for complex and real
2872 variable is the same, i.e. c_float == c_float_complex. */
2873 if (ts->f90_type != BT_UNKNOWN && ts->f90_type != ts->type
2874 && !((ts->f90_type == BT_REAL && ts->type == BT_COMPLEX)
2875 || (ts->f90_type == BT_COMPLEX && ts->type == BT_REAL)))
db30e21c 2876 gfc_warning_now (0, "C kind type parameter is for type %s but type at %L "
2be51762
TB
2877 "is %s", gfc_basic_typename (ts->f90_type), &where,
2878 gfc_basic_typename (ts->type));
2ec855f1 2879
5bab4c96
PT
2880close_brackets:
2881
96ee3a4a 2882 gfc_gobble_whitespace ();
8fc541d3
FXC
2883 if ((c = gfc_next_ascii_char ()) != ')'
2884 && (ts->type != BT_CHARACTER || c != ','))
6de9cd9a 2885 {
96ee3a4a
TB
2886 if (ts->type == BT_CHARACTER)
2887 gfc_error ("Missing right parenthesis or comma at %C");
2888 else
2889 gfc_error ("Missing right parenthesis at %C");
e2d29968 2890 m = MATCH_ERROR;
6de9cd9a 2891 }
a8b3b0b6
CR
2892 else
2893 /* All tests passed. */
2894 m = MATCH_YES;
6de9cd9a 2895
a8b3b0b6
CR
2896 if(m == MATCH_ERROR)
2897 gfc_current_locus = where;
f4347334 2898
203c7ebf 2899 if (ts->type == BT_INTEGER && ts->kind == 4 && flag_integer4_kind == 8)
f4347334
ZG
2900 ts->kind = 8;
2901
2902 if (ts->type == BT_REAL || ts->type == BT_COMPLEX)
2903 {
2904 if (ts->kind == 4)
2905 {
203c7ebf 2906 if (flag_real4_kind == 8)
f4347334 2907 ts->kind = 8;
203c7ebf 2908 if (flag_real4_kind == 10)
f4347334 2909 ts->kind = 10;
203c7ebf 2910 if (flag_real4_kind == 16)
f4347334
ZG
2911 ts->kind = 16;
2912 }
2913
2914 if (ts->kind == 8)
2915 {
203c7ebf 2916 if (flag_real8_kind == 4)
f4347334 2917 ts->kind = 4;
203c7ebf 2918 if (flag_real8_kind == 10)
f4347334 2919 ts->kind = 10;
203c7ebf 2920 if (flag_real8_kind == 16)
f4347334
ZG
2921 ts->kind = 16;
2922 }
2923 }
2924
a8b3b0b6
CR
2925 /* Return what we know from the test(s). */
2926 return m;
6de9cd9a
DN
2927
2928no_match:
2929 gfc_free_expr (e);
63645982 2930 gfc_current_locus = where;
6de9cd9a
DN
2931 return m;
2932}
2933
2934
187de1ed
FXC
2935static match
2936match_char_kind (int * kind, int * is_iso_c)
2937{
2938 locus where;
2939 gfc_expr *e;
2940 match m, n;
51f03c6b 2941 bool fail;
187de1ed
FXC
2942
2943 m = MATCH_NO;
2944 e = NULL;
2945 where = gfc_current_locus;
2946
2947 n = gfc_match_init_expr (&e);
96ee3a4a 2948
1c8bcdf7 2949 if (n != MATCH_YES && gfc_matching_function)
96ee3a4a 2950 {
1c8bcdf7 2951 /* The expression might include use-associated or imported
f5acf0f2 2952 parameters and try again after the specification
1c8bcdf7 2953 expressions. */
96ee3a4a 2954 gfc_free_expr (e);
96ee3a4a
TB
2955 gfc_undo_symbols ();
2956 return MATCH_YES;
2957 }
2958
187de1ed
FXC
2959 if (n == MATCH_NO)
2960 gfc_error ("Expected initialization expression at %C");
2961 if (n != MATCH_YES)
2962 return MATCH_ERROR;
2963
2964 if (e->rank != 0)
2965 {
2966 gfc_error ("Expected scalar initialization expression at %C");
2967 m = MATCH_ERROR;
2968 goto no_match;
2969 }
2970
87f3a5cf
PT
2971 if (gfc_derived_parameter_expr (e))
2972 {
2973 saved_kind_expr = e;
2974 *kind = 0;
2975 return MATCH_YES;
2976 }
2977
51f03c6b 2978 fail = gfc_extract_int (e, kind, 1);
187de1ed 2979 *is_iso_c = e->ts.is_iso_c;
51f03c6b 2980 if (fail)
187de1ed 2981 {
187de1ed
FXC
2982 m = MATCH_ERROR;
2983 goto no_match;
2984 }
2985
2986 gfc_free_expr (e);
2987
2988 /* Ignore errors to this point, if we've gotten here. This means
2989 we ignore the m=MATCH_ERROR from above. */
2990 if (gfc_validate_kind (BT_CHARACTER, *kind, true) < 0)
2991 {
2992 gfc_error ("Kind %d is not supported for CHARACTER at %C", *kind);
2993 m = MATCH_ERROR;
2994 }
2995 else
2996 /* All tests passed. */
2997 m = MATCH_YES;
2998
2999 if (m == MATCH_ERROR)
3000 gfc_current_locus = where;
f5acf0f2 3001
187de1ed
FXC
3002 /* Return what we know from the test(s). */
3003 return m;
3004
3005no_match:
3006 gfc_free_expr (e);
3007 gfc_current_locus = where;
3008 return m;
3009}
3010
8234e5e0 3011
6de9cd9a
DN
3012/* Match the various kind/length specifications in a CHARACTER
3013 declaration. We don't return MATCH_NO. */
3014
8234e5e0
SK
3015match
3016gfc_match_char_spec (gfc_typespec *ts)
6de9cd9a 3017{
187de1ed 3018 int kind, seen_length, is_iso_c;
6de9cd9a
DN
3019 gfc_charlen *cl;
3020 gfc_expr *len;
3021 match m;
e69afb29 3022 bool deferred;
187de1ed 3023
6de9cd9a
DN
3024 len = NULL;
3025 seen_length = 0;
187de1ed
FXC
3026 kind = 0;
3027 is_iso_c = 0;
e69afb29 3028 deferred = false;
6de9cd9a
DN
3029
3030 /* Try the old-style specification first. */
3031 old_char_selector = 0;
3032
2767f2cc 3033 m = match_char_length (&len, &deferred, true);
6de9cd9a
DN
3034 if (m != MATCH_NO)
3035 {
3036 if (m == MATCH_YES)
3037 old_char_selector = 1;
3038 seen_length = 1;
3039 goto done;
3040 }
3041
3042 m = gfc_match_char ('(');
3043 if (m != MATCH_YES)
3044 {
a8b3b0b6 3045 m = MATCH_YES; /* Character without length is a single char. */
6de9cd9a
DN
3046 goto done;
3047 }
3048
a8b3b0b6 3049 /* Try the weird case: ( KIND = <int> [ , LEN = <len-param> ] ). */
6de9cd9a
DN
3050 if (gfc_match (" kind =") == MATCH_YES)
3051 {
187de1ed 3052 m = match_char_kind (&kind, &is_iso_c);
f5acf0f2 3053
6de9cd9a
DN
3054 if (m == MATCH_ERROR)
3055 goto done;
3056 if (m == MATCH_NO)
3057 goto syntax;
3058
3059 if (gfc_match (" , len =") == MATCH_NO)
3060 goto rparen;
3061
e69afb29 3062 m = char_len_param_value (&len, &deferred);
6de9cd9a
DN
3063 if (m == MATCH_NO)
3064 goto syntax;
3065 if (m == MATCH_ERROR)
3066 goto done;
3067 seen_length = 1;
3068
3069 goto rparen;
3070 }
3071
66e4ab31 3072 /* Try to match "LEN = <len-param>" or "LEN = <len-param>, KIND = <int>". */
6de9cd9a
DN
3073 if (gfc_match (" len =") == MATCH_YES)
3074 {
e69afb29 3075 m = char_len_param_value (&len, &deferred);
6de9cd9a
DN
3076 if (m == MATCH_NO)
3077 goto syntax;
3078 if (m == MATCH_ERROR)
3079 goto done;
3080 seen_length = 1;
3081
3082 if (gfc_match_char (')') == MATCH_YES)
3083 goto done;
3084
3085 if (gfc_match (" , kind =") != MATCH_YES)
3086 goto syntax;
3087
187de1ed
FXC
3088 if (match_char_kind (&kind, &is_iso_c) == MATCH_ERROR)
3089 goto done;
6de9cd9a
DN
3090
3091 goto rparen;
3092 }
3093
66e4ab31 3094 /* Try to match ( <len-param> ) or ( <len-param> , [ KIND = ] <int> ). */
e69afb29 3095 m = char_len_param_value (&len, &deferred);
6de9cd9a
DN
3096 if (m == MATCH_NO)
3097 goto syntax;
3098 if (m == MATCH_ERROR)
3099 goto done;
3100 seen_length = 1;
3101
3102 m = gfc_match_char (')');
3103 if (m == MATCH_YES)
3104 goto done;
3105
3106 if (gfc_match_char (',') != MATCH_YES)
3107 goto syntax;
3108
a8b3b0b6 3109 gfc_match (" kind ="); /* Gobble optional text. */
6de9cd9a 3110
187de1ed 3111 m = match_char_kind (&kind, &is_iso_c);
6de9cd9a
DN
3112 if (m == MATCH_ERROR)
3113 goto done;
3114 if (m == MATCH_NO)
3115 goto syntax;
3116
3117rparen:
3118 /* Require a right-paren at this point. */
3119 m = gfc_match_char (')');
3120 if (m == MATCH_YES)
3121 goto done;
3122
3123syntax:
3124 gfc_error ("Syntax error in CHARACTER declaration at %C");
3125 m = MATCH_ERROR;
16f8ffc8
JD
3126 gfc_free_expr (len);
3127 return m;
6de9cd9a
DN
3128
3129done:
a99d95a2
PT
3130 /* Deal with character functions after USE and IMPORT statements. */
3131 if (gfc_matching_function)
1c8bcdf7 3132 {
a99d95a2 3133 gfc_free_expr (len);
1c8bcdf7
PT
3134 gfc_undo_symbols ();
3135 return MATCH_YES;
3136 }
3137
6de9cd9a
DN
3138 if (m != MATCH_YES)
3139 {
3140 gfc_free_expr (len);
3141 return m;
3142 }
3143
3144 /* Do some final massaging of the length values. */
b76e28c6 3145 cl = gfc_new_charlen (gfc_current_ns, NULL);
6de9cd9a
DN
3146
3147 if (seen_length == 0)
f622221a 3148 cl->length = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
6de9cd9a 3149 else
00df7c36
SK
3150 {
3151 /* If gfortran ends up here, then the len may be reducible to a
3152 constant. Try to do that here. If it does not reduce, simply
3153 assign len to the charlen. */
3154 if (len && len->expr_type != EXPR_CONSTANT)
3155 {
3156 gfc_expr *e;
3157 e = gfc_copy_expr (len);
3158 gfc_reduce_init_expr (e);
3159 if (e->expr_type == EXPR_CONSTANT)
3160 gfc_replace_expr (len, e);
3161 else
3162 gfc_free_expr (e);
3163 cl->length = len;
3164 }
3165 else
3166 cl->length = len;
3167 }
6de9cd9a 3168
bc21d315 3169 ts->u.cl = cl;
187de1ed 3170 ts->kind = kind == 0 ? gfc_default_character_kind : kind;
e69afb29 3171 ts->deferred = deferred;
6de9cd9a 3172
eea58adb 3173 /* We have to know if it was a C interoperable kind so we can
a8b3b0b6 3174 do accurate type checking of bind(c) procs, etc. */
187de1ed 3175 if (kind != 0)
eea58adb 3176 /* Mark this as C interoperable if being declared with one
187de1ed
FXC
3177 of the named constants from iso_c_binding. */
3178 ts->is_c_interop = is_iso_c;
a8b3b0b6 3179 else if (len != NULL)
187de1ed
FXC
3180 /* Here, we might have parsed something such as: character(c_char)
3181 In this case, the parsing code above grabs the c_char when
3182 looking for the length (line 1690, roughly). it's the last
3183 testcase for parsing the kind params of a character variable.
3184 However, it's not actually the length. this seems like it
f5acf0f2 3185 could be an error.
187de1ed
FXC
3186 To see if the user used a C interop kind, test the expr
3187 of the so called length, and see if it's C interoperable. */
3188 ts->is_c_interop = len->ts.is_iso_c;
f5acf0f2 3189
6de9cd9a
DN
3190 return MATCH_YES;
3191}
3192
3193
f6288c24
FR
3194/* Matches a RECORD declaration. */
3195
3196static match
e79e6763 3197match_record_decl (char *name)
f6288c24
FR
3198{
3199 locus old_loc;
3200 old_loc = gfc_current_locus;
e79e6763 3201 match m;
f6288c24 3202
e79e6763
FR
3203 m = gfc_match (" record /");
3204 if (m == MATCH_YES)
f6288c24 3205 {
f6d17ecd 3206 if (!flag_dec_structure)
f6288c24
FR
3207 {
3208 gfc_current_locus = old_loc;
3209 gfc_error ("RECORD at %C is an extension, enable it with "
3210 "-fdec-structure");
3211 return MATCH_ERROR;
3212 }
e79e6763
FR
3213 m = gfc_match (" %n/", name);
3214 if (m == MATCH_YES)
3215 return MATCH_YES;
f6288c24
FR
3216 }
3217
e79e6763 3218 gfc_current_locus = old_loc;
f6d17ecd 3219 if (flag_dec_structure
e79e6763
FR
3220 && (gfc_match (" record% ") == MATCH_YES
3221 || gfc_match (" record%t") == MATCH_YES))
3222 gfc_error ("Structure name expected after RECORD at %C");
3223 if (m == MATCH_NO)
f6288c24 3224 return MATCH_NO;
e79e6763
FR
3225
3226 return MATCH_ERROR;
f6288c24
FR
3227}
3228
5bab4c96
PT
3229
3230/* This function uses the gfc_actual_arglist 'type_param_spec_list' as a source
3231 of expressions to substitute into the possibly parameterized expression
3232 'e'. Using a list is inefficient but should not be too bad since the
3233 number of type parameters is not likely to be large. */
3234static bool
3235insert_parameter_exprs (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
3236 int* f)
3237{
3238 gfc_actual_arglist *param;
3239 gfc_expr *copy;
3240
3241 if (e->expr_type != EXPR_VARIABLE)
3242 return false;
3243
3244 gcc_assert (e->symtree);
3245 if (e->symtree->n.sym->attr.pdt_kind
3246 || (*f != 0 && e->symtree->n.sym->attr.pdt_len))
3247 {
3248 for (param = type_param_spec_list; param; param = param->next)
3249 if (strcmp (e->symtree->n.sym->name, param->name) == 0)
3250 break;
3251
3252 if (param)
3253 {
3254 copy = gfc_copy_expr (param->expr);
3255 *e = *copy;
3256 free (copy);
3257 }
3258 }
3259
3260 return false;
3261}
3262
3263
3264bool
3265gfc_insert_kind_parameter_exprs (gfc_expr *e)
3266{
3267 return gfc_traverse_expr (e, NULL, &insert_parameter_exprs, 0);
3268}
3269
3270
3271bool
3272gfc_insert_parameter_exprs (gfc_expr *e, gfc_actual_arglist *param_list)
3273{
3274 gfc_actual_arglist *old_param_spec_list = type_param_spec_list;
3275 type_param_spec_list = param_list;
3276 return gfc_traverse_expr (e, NULL, &insert_parameter_exprs, 1);
3277 type_param_spec_list = NULL;
3278 type_param_spec_list = old_param_spec_list;
3279}
3280
3281/* Determines the instance of a parameterized derived type to be used by
3282 matching determining the values of the kind parameters and using them
3283 in the name of the instance. If the instance exists, it is used, otherwise
3284 a new derived type is created. */
3285match
3286gfc_get_pdt_instance (gfc_actual_arglist *param_list, gfc_symbol **sym,
3287 gfc_actual_arglist **ext_param_list)
3288{
3289 /* The PDT template symbol. */
3290 gfc_symbol *pdt = *sym;
3291 /* The symbol for the parameter in the template f2k_namespace. */
3292 gfc_symbol *param;
3293 /* The hoped for instance of the PDT. */
3294 gfc_symbol *instance;
3295 /* The list of parameters appearing in the PDT declaration. */
3296 gfc_formal_arglist *type_param_name_list;
3297 /* Used to store the parameter specification list during recursive calls. */
3298 gfc_actual_arglist *old_param_spec_list;
3299 /* Pointers to the parameter specification being used. */
3300 gfc_actual_arglist *actual_param;
3301 gfc_actual_arglist *tail = NULL;
3302 /* Used to build up the name of the PDT instance. The prefix uses 4
3303 characters and each KIND parameter 2 more. Allow 8 of the latter. */
3304 char name[GFC_MAX_SYMBOL_LEN + 21];
3305
3306 bool name_seen = (param_list == NULL);
3307 bool assumed_seen = false;
3308 bool deferred_seen = false;
3309 bool spec_error = false;
3310 int kind_value, i;
3311 gfc_expr *kind_expr;
3312 gfc_component *c1, *c2;
3313 match m;
3314
3315 type_param_spec_list = NULL;
3316
3317 type_param_name_list = pdt->formal;
3318 actual_param = param_list;
3319 sprintf (name, "Pdt%s", pdt->name);
3320
3321 /* Run through the parameter name list and pick up the actual
3322 parameter values or use the default values in the PDT declaration. */
3323 for (; type_param_name_list;
3324 type_param_name_list = type_param_name_list->next)
3325 {
3326 if (actual_param && actual_param->spec_type != SPEC_EXPLICIT)
3327 {
3328 if (actual_param->spec_type == SPEC_ASSUMED)
3329 spec_error = deferred_seen;
3330 else
3331 spec_error = assumed_seen;
3332
3333 if (spec_error)
3334 {
3335 gfc_error ("The type parameter spec list at %C cannot contain "
3336 "both ASSUMED and DEFERRED parameters");
18a4e7e3 3337 goto error_return;
5bab4c96
PT
3338 }
3339 }
3340
3341 if (actual_param && actual_param->name)
3342 name_seen = true;
3343 param = type_param_name_list->sym;
3344
276515e6
PT
3345 if (!param || !param->name)
3346 continue;
3347
18a4e7e3 3348 c1 = gfc_find_component (pdt, param->name, false, true, NULL);
de624bee
PT
3349 /* An error should already have been thrown in resolve.c
3350 (resolve_fl_derived0). */
18a4e7e3 3351 if (!pdt->attr.use_assoc && !c1)
de624bee 3352 goto error_return;
18a4e7e3 3353
5bab4c96
PT
3354 kind_expr = NULL;
3355 if (!name_seen)
3356 {
18a4e7e3
PT
3357 if (!actual_param && !(c1 && c1->initializer))
3358 {
3359 gfc_error ("The type parameter spec list at %C does not contain "
3360 "enough parameter expressions");
3361 goto error_return;
3362 }
3363 else if (!actual_param && c1 && c1->initializer)
3364 kind_expr = gfc_copy_expr (c1->initializer);
3365 else if (actual_param && actual_param->spec_type == SPEC_EXPLICIT)
5bab4c96
PT
3366 kind_expr = gfc_copy_expr (actual_param->expr);
3367 }
3368 else
3369 {
3370 actual_param = param_list;
3371 for (;actual_param; actual_param = actual_param->next)
3372 if (actual_param->name
3373 && strcmp (actual_param->name, param->name) == 0)
3374 break;
3375 if (actual_param && actual_param->spec_type == SPEC_EXPLICIT)
3376 kind_expr = gfc_copy_expr (actual_param->expr);
3377 else
3378 {
62d3c075
PT
3379 if (c1->initializer)
3380 kind_expr = gfc_copy_expr (c1->initializer);
5bab4c96
PT
3381 else if (!(actual_param && param->attr.pdt_len))
3382 {
71a21b9e 3383 gfc_error ("The derived parameter %qs at %C does not "
5bab4c96 3384 "have a default value", param->name);
18a4e7e3 3385 goto error_return;
5bab4c96
PT
3386 }
3387 }
3388 }
3389
3390 /* Store the current parameter expressions in a temporary actual
3391 arglist 'list' so that they can be substituted in the corresponding
3392 expressions in the PDT instance. */
3393 if (type_param_spec_list == NULL)
3394 {
3395 type_param_spec_list = gfc_get_actual_arglist ();
3396 tail = type_param_spec_list;
3397 }
3398 else
3399 {
3400 tail->next = gfc_get_actual_arglist ();
3401 tail = tail->next;
3402 }
3403 tail->name = param->name;
3404
3405 if (kind_expr)
3406 {
87f3a5cf
PT
3407 /* Try simplification even for LEN expressions. */
3408 gfc_resolve_expr (kind_expr);
3409 gfc_simplify_expr (kind_expr, 1);
18a4e7e3
PT
3410 /* Variable expressions seem to default to BT_PROCEDURE.
3411 TODO find out why this is and fix it. */
3412 if (kind_expr->ts.type != BT_INTEGER
3413 && kind_expr->ts.type != BT_PROCEDURE)
3414 {
3415 gfc_error ("The parameter expression at %C must be of "
3416 "INTEGER type and not %s type",
3417 gfc_basic_typename (kind_expr->ts.type));
3418 goto error_return;
3419 }
3420
5bab4c96 3421 tail->expr = gfc_copy_expr (kind_expr);
5bab4c96
PT
3422 }
3423
3424 if (actual_param)
3425 tail->spec_type = actual_param->spec_type;
3426
3427 if (!param->attr.pdt_kind)
3428 {
18a4e7e3 3429 if (!name_seen && actual_param)
5bab4c96
PT
3430 actual_param = actual_param->next;
3431 if (kind_expr)
3432 {
3433 gfc_free_expr (kind_expr);
3434 kind_expr = NULL;
3435 }
3436 continue;
3437 }
3438
3439 if (actual_param
3440 && (actual_param->spec_type == SPEC_ASSUMED
3441 || actual_param->spec_type == SPEC_DEFERRED))
3442 {
71a21b9e 3443 gfc_error ("The KIND parameter %qs at %C cannot either be "
5bab4c96 3444 "ASSUMED or DEFERRED", param->name);
18a4e7e3 3445 goto error_return;
5bab4c96
PT
3446 }
3447
3448 if (!kind_expr || !gfc_is_constant_expr (kind_expr))
3449 {
71a21b9e 3450 gfc_error ("The value for the KIND parameter %qs at %C does not "
5bab4c96 3451 "reduce to a constant expression", param->name);
18a4e7e3 3452 goto error_return;
5bab4c96
PT
3453 }
3454
3455 gfc_extract_int (kind_expr, &kind_value);
8a302cb2 3456 sprintf (name + strlen (name), "_%d", kind_value);
5bab4c96
PT
3457
3458 if (!name_seen && actual_param)
3459 actual_param = actual_param->next;
3460 gfc_free_expr (kind_expr);
3461 }
3462
18a4e7e3
PT
3463 if (!name_seen && actual_param)
3464 {
3465 gfc_error ("The type parameter spec list at %C contains too many "
3466 "parameter expressions");
3467 goto error_return;
3468 }
3469
5bab4c96
PT
3470 /* Now we search for the PDT instance 'name'. If it doesn't exist, we
3471 build it, using 'pdt' as a template. */
3472 if (gfc_get_symbol (name, pdt->ns, &instance))
3473 {
3474 gfc_error ("Parameterized derived type at %C is ambiguous");
18a4e7e3 3475 goto error_return;
5bab4c96
PT
3476 }
3477
3478 m = MATCH_YES;
3479
3480 if (instance->attr.flavor == FL_DERIVED
3481 && instance->attr.pdt_type)
3482 {
3483 instance->refs++;
3484 if (ext_param_list)
3485 *ext_param_list = type_param_spec_list;
3486 *sym = instance;
3487 gfc_commit_symbols ();
3488 return m;
3489 }
3490
3491 /* Start building the new instance of the parameterized type. */
3492 gfc_copy_attr (&instance->attr, &pdt->attr, &pdt->declared_at);
3493 instance->attr.pdt_template = 0;
3494 instance->attr.pdt_type = 1;
3495 instance->declared_at = gfc_current_locus;
3496
3497 /* Add the components, replacing the parameters in all expressions
3498 with the expressions for their values in 'type_param_spec_list'. */
3499 c1 = pdt->components;
3500 tail = type_param_spec_list;
3501 for (; c1; c1 = c1->next)
3502 {
3503 gfc_add_component (instance, c1->name, &c2);
276515e6 3504
5bab4c96
PT
3505 c2->ts = c1->ts;
3506 c2->attr = c1->attr;
3507
276515e6
PT
3508 /* The order of declaration of the type_specs might not be the
3509 same as that of the components. */
3510 if (c1->attr.pdt_kind || c1->attr.pdt_len)
3511 {
3512 for (tail = type_param_spec_list; tail; tail = tail->next)
3513 if (strcmp (c1->name, tail->name) == 0)
3514 break;
3515 }
3516
5bab4c96
PT
3517 /* Deal with type extension by recursively calling this function
3518 to obtain the instance of the extended type. */
3519 if (gfc_current_state () != COMP_DERIVED
3520 && c1 == pdt->components
3521 && (c1->ts.type == BT_DERIVED || c1->ts.type == BT_CLASS)
3522 && c1->ts.u.derived && c1->ts.u.derived->attr.pdt_template
3523 && gfc_get_derived_super_type (*sym) == c2->ts.u.derived)
3524 {
3525 gfc_formal_arglist *f;
3526
3527 old_param_spec_list = type_param_spec_list;
3528
3529 /* Obtain a spec list appropriate to the extended type..*/
3530 actual_param = gfc_copy_actual_arglist (type_param_spec_list);
3531 type_param_spec_list = actual_param;
3532 for (f = c1->ts.u.derived->formal; f && f->next; f = f->next)
3533 actual_param = actual_param->next;
3534 if (actual_param)
3535 {
3536 gfc_free_actual_arglist (actual_param->next);
3537 actual_param->next = NULL;
3538 }
3539
3540 /* Now obtain the PDT instance for the extended type. */
3541 c2->param_list = type_param_spec_list;
3542 m = gfc_get_pdt_instance (type_param_spec_list, &c2->ts.u.derived,
3543 NULL);
3544 type_param_spec_list = old_param_spec_list;
3545
3546 c2->ts.u.derived->refs++;
3547 gfc_set_sym_referenced (c2->ts.u.derived);
3548
3549 /* Set extension level. */
3550 if (c2->ts.u.derived->attr.extension == 255)
3551 {
3552 /* Since the extension field is 8 bit wide, we can only have
3553 up to 255 extension levels. */
3554 gfc_error ("Maximum extension level reached with type %qs at %L",
3555 c2->ts.u.derived->name,
3556 &c2->ts.u.derived->declared_at);
18a4e7e3 3557 goto error_return;
5bab4c96
PT
3558 }
3559 instance->attr.extension = c2->ts.u.derived->attr.extension + 1;
3560
5bab4c96
PT
3561 continue;
3562 }
3563
3564 /* Set the component kind using the parameterized expression. */
276515e6
PT
3565 if ((c1->ts.kind == 0 || c1->ts.type == BT_CHARACTER)
3566 && c1->kind_expr != NULL)
5bab4c96
PT
3567 {
3568 gfc_expr *e = gfc_copy_expr (c1->kind_expr);
3569 gfc_insert_kind_parameter_exprs (e);
87f3a5cf 3570 gfc_simplify_expr (e, 1);
5bab4c96
PT
3571 gfc_extract_int (e, &c2->ts.kind);
3572 gfc_free_expr (e);
18a4e7e3
PT
3573 if (gfc_validate_kind (c2->ts.type, c2->ts.kind, true) < 0)
3574 {
3575 gfc_error ("Kind %d not supported for type %s at %C",
3576 c2->ts.kind, gfc_basic_typename (c2->ts.type));
3577 goto error_return;
3578 }
5bab4c96
PT
3579 }
3580
3581 /* Similarly, set the string length if parameterized. */
3582 if (c1->ts.type == BT_CHARACTER
3583 && c1->ts.u.cl->length
3584 && gfc_derived_parameter_expr (c1->ts.u.cl->length))
3585 {
3586 gfc_expr *e;
3587 e = gfc_copy_expr (c1->ts.u.cl->length);
3588 gfc_insert_kind_parameter_exprs (e);
3589 gfc_simplify_expr (e, 1);
3590 c2->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
3591 c2->ts.u.cl->length = e;
3592 c2->attr.pdt_string = 1;
3593 }
3594
3595 /* Set up either the KIND/LEN initializer, if constant,
3596 or the parameterized expression. Use the template
3597 initializer if one is not already set in this instance. */
3598 if (c2->attr.pdt_kind || c2->attr.pdt_len)
3599 {
3600 if (tail && tail->expr && gfc_is_constant_expr (tail->expr))
3601 c2->initializer = gfc_copy_expr (tail->expr);
3602 else if (tail && tail->expr)
3603 {
3604 c2->param_list = gfc_get_actual_arglist ();
3605 c2->param_list->name = tail->name;
3606 c2->param_list->expr = gfc_copy_expr (tail->expr);
3607 c2->param_list->next = NULL;
3608 }
3609
3610 if (!c2->initializer && c1->initializer)
3611 c2->initializer = gfc_copy_expr (c1->initializer);
5bab4c96
PT
3612 }
3613
3614 /* Copy the array spec. */
3615 c2->as = gfc_copy_array_spec (c1->as);
3616 if (c1->ts.type == BT_CLASS)
3617 CLASS_DATA (c2)->as = gfc_copy_array_spec (CLASS_DATA (c1)->as);
3618
3619 /* Determine if an array spec is parameterized. If so, substitute
3620 in the parameter expressions for the bounds and set the pdt_array
3621 attribute. Notice that this attribute must be unconditionally set
3622 if this is an array of parameterized character length. */
3623 if (c1->as && c1->as->type == AS_EXPLICIT)
3624 {
3625 bool pdt_array = false;
3626
3627 /* Are the bounds of the array parameterized? */
3628 for (i = 0; i < c1->as->rank; i++)
3629 {
3630 if (gfc_derived_parameter_expr (c1->as->lower[i]))
3631 pdt_array = true;
3632 if (gfc_derived_parameter_expr (c1->as->upper[i]))
3633 pdt_array = true;
3634 }
3635
3636 /* If they are, free the expressions for the bounds and
3637 replace them with the template expressions with substitute
3638 values. */
3639 for (i = 0; pdt_array && i < c1->as->rank; i++)
3640 {
3641 gfc_expr *e;
3642 e = gfc_copy_expr (c1->as->lower[i]);
3643 gfc_insert_kind_parameter_exprs (e);
3644 gfc_simplify_expr (e, 1);
3645 gfc_free_expr (c2->as->lower[i]);
3646 c2->as->lower[i] = e;
3647 e = gfc_copy_expr (c1->as->upper[i]);
3648 gfc_insert_kind_parameter_exprs (e);
3649 gfc_simplify_expr (e, 1);
3650 gfc_free_expr (c2->as->upper[i]);
3651 c2->as->upper[i] = e;
3652 }
3653 c2->attr.pdt_array = pdt_array ? 1 : c2->attr.pdt_string;
0b627b58
PT
3654 if (c1->initializer)
3655 {
3656 c2->initializer = gfc_copy_expr (c1->initializer);
3657 gfc_insert_kind_parameter_exprs (c2->initializer);
3658 gfc_simplify_expr (c2->initializer, 1);
3659 }
5bab4c96
PT
3660 }
3661
3662 /* Recurse into this function for PDT components. */
3663 if ((c1->ts.type == BT_DERIVED || c1->ts.type == BT_CLASS)
3664 && c1->ts.u.derived && c1->ts.u.derived->attr.pdt_template)
3665 {
3666 gfc_actual_arglist *params;
3667 /* The component in the template has a list of specification
3668 expressions derived from its declaration. */
3669 params = gfc_copy_actual_arglist (c1->param_list);
3670 actual_param = params;
3671 /* Substitute the template parameters with the expressions
3672 from the specification list. */
3673 for (;actual_param; actual_param = actual_param->next)
3674 gfc_insert_parameter_exprs (actual_param->expr,
3675 type_param_spec_list);
3676
3677 /* Now obtain the PDT instance for the component. */
3678 old_param_spec_list = type_param_spec_list;
3679 m = gfc_get_pdt_instance (params, &c2->ts.u.derived, NULL);
3680 type_param_spec_list = old_param_spec_list;
3681
3682 c2->param_list = params;
2fcd5884
PT
3683 if (!(c2->attr.pointer || c2->attr.allocatable))
3684 c2->initializer = gfc_default_initializer (&c2->ts);
3685
3686 if (c2->attr.allocatable)
3687 instance->attr.alloc_comp = 1;
5bab4c96
PT
3688 }
3689 }
3690
3691 gfc_commit_symbol (instance);
3692 if (ext_param_list)
3693 *ext_param_list = type_param_spec_list;
3694 *sym = instance;
3695 return m;
18a4e7e3
PT
3696
3697error_return:
3698 gfc_free_actual_arglist (type_param_spec_list);
3699 return MATCH_ERROR;
5bab4c96
PT
3700}
3701
3702
e74f1cc8
JW
3703/* Matches a declaration-type-spec (F03:R502). If successful, sets the ts
3704 structure to the matched specification. This is necessary for FUNCTION and
6de9cd9a
DN
3705 IMPLICIT statements.
3706
d51347f9 3707 If implicit_flag is nonzero, then we don't check for the optional
e5ddaa24 3708 kind specification. Not doing so is needed for matching an IMPLICIT
6de9cd9a
DN
3709 statement correctly. */
3710
e2d29968 3711match
e74f1cc8 3712gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag)
6de9cd9a
DN
3713{
3714 char name[GFC_MAX_SYMBOL_LEN + 1];
c3f34952 3715 gfc_symbol *sym, *dt_sym;
6de9cd9a 3716 match m;
8fc541d3 3717 char c;
0fb56814 3718 bool seen_deferred_kind, matched_type;
c3f34952 3719 const char *dt_name;
6de9cd9a 3720
5bab4c96
PT
3721 decl_type_param_list = NULL;
3722
1c8bcdf7
PT
3723 /* A belt and braces check that the typespec is correctly being treated
3724 as a deferred characteristic association. */
3725 seen_deferred_kind = (gfc_current_state () == COMP_FUNCTION)
a99d95a2
PT
3726 && (gfc_current_block ()->result->ts.kind == -1)
3727 && (ts->kind == -1);
6de9cd9a 3728 gfc_clear_ts (ts);
1c8bcdf7
PT
3729 if (seen_deferred_kind)
3730 ts->kind = -1;
6de9cd9a 3731
a8b3b0b6 3732 /* Clear the current binding label, in case one is given. */
62603fae 3733 curr_binding_label = NULL;
a8b3b0b6 3734
5f700e6d
AL
3735 if (gfc_match (" byte") == MATCH_YES)
3736 {
524af0d6 3737 if (!gfc_notify_std (GFC_STD_GNU, "BYTE type at %C"))
5f700e6d
AL
3738 return MATCH_ERROR;
3739
3740 if (gfc_validate_kind (BT_INTEGER, 1, true) < 0)
3741 {
3742 gfc_error ("BYTE type used at %C "
3743 "is not available on the target machine");
3744 return MATCH_ERROR;
3745 }
d51347f9 3746
5f700e6d
AL
3747 ts->type = BT_INTEGER;
3748 ts->kind = 1;
3749 return MATCH_YES;
3750 }
3751
0fb56814 3752
45a69325 3753 m = gfc_match (" type (");
0fb56814 3754 matched_type = (m == MATCH_YES);
45a69325
TB
3755 if (matched_type)
3756 {
3757 gfc_gobble_whitespace ();
3758 if (gfc_peek_ascii_char () == '*')
3759 {
3760 if ((m = gfc_match ("*)")) != MATCH_YES)
3761 return m;
f6288c24 3762 if (gfc_comp_struct (gfc_current_state ()))
45a69325
TB
3763 {
3764 gfc_error ("Assumed type at %C is not allowed for components");
3765 return MATCH_ERROR;
3766 }
524af0d6
JB
3767 if (!gfc_notify_std (GFC_STD_F2008_TS, "Assumed type "
3768 "at %C"))
45a69325
TB
3769 return MATCH_ERROR;
3770 ts->type = BT_ASSUMED;
3771 return MATCH_YES;
3772 }
3773
3774 m = gfc_match ("%n", name);
3775 matched_type = (m == MATCH_YES);
3776 }
3777
0fb56814
TB
3778 if ((matched_type && strcmp ("integer", name) == 0)
3779 || (!matched_type && gfc_match (" integer") == MATCH_YES))
6de9cd9a
DN
3780 {
3781 ts->type = BT_INTEGER;
9d64df18 3782 ts->kind = gfc_default_integer_kind;
6de9cd9a
DN
3783 goto get_kind;
3784 }
3785
0fb56814
TB
3786 if ((matched_type && strcmp ("character", name) == 0)
3787 || (!matched_type && gfc_match (" character") == MATCH_YES))
6de9cd9a 3788 {
0fb56814 3789 if (matched_type
524af0d6
JB
3790 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
3791 "intrinsic-type-spec at %C"))
0fb56814
TB
3792 return MATCH_ERROR;
3793
6de9cd9a 3794 ts->type = BT_CHARACTER;
e5ddaa24 3795 if (implicit_flag == 0)
0fb56814 3796 m = gfc_match_char_spec (ts);
e5ddaa24 3797 else
0fb56814
TB
3798 m = MATCH_YES;
3799
3800 if (matched_type && m == MATCH_YES && gfc_match_char (')') != MATCH_YES)
3801 m = MATCH_ERROR;
3802
3803 return m;
6de9cd9a
DN
3804 }
3805
0fb56814
TB
3806 if ((matched_type && strcmp ("real", name) == 0)
3807 || (!matched_type && gfc_match (" real") == MATCH_YES))
6de9cd9a
DN
3808 {
3809 ts->type = BT_REAL;
9d64df18 3810 ts->kind = gfc_default_real_kind;
6de9cd9a
DN
3811 goto get_kind;
3812 }
3813
0fb56814
TB
3814 if ((matched_type
3815 && (strcmp ("doubleprecision", name) == 0
3816 || (strcmp ("double", name) == 0
3817 && gfc_match (" precision") == MATCH_YES)))
3818 || (!matched_type && gfc_match (" double precision") == MATCH_YES))
6de9cd9a 3819 {
0fb56814 3820 if (matched_type
524af0d6
JB
3821 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
3822 "intrinsic-type-spec at %C"))
0fb56814
TB
3823 return MATCH_ERROR;
3824 if (matched_type && gfc_match_char (')') != MATCH_YES)
3825 return MATCH_ERROR;
3826
6de9cd9a 3827 ts->type = BT_REAL;
9d64df18 3828 ts->kind = gfc_default_double_kind;
6de9cd9a
DN
3829 return MATCH_YES;
3830 }
3831
0fb56814
TB
3832 if ((matched_type && strcmp ("complex", name) == 0)
3833 || (!matched_type && gfc_match (" complex") == MATCH_YES))
6de9cd9a
DN
3834 {
3835 ts->type = BT_COMPLEX;
9d64df18 3836 ts->kind = gfc_default_complex_kind;
6de9cd9a
DN
3837 goto get_kind;
3838 }
3839
0fb56814
TB
3840 if ((matched_type
3841 && (strcmp ("doublecomplex", name) == 0
3842 || (strcmp ("double", name) == 0
3843 && gfc_match (" complex") == MATCH_YES)))
3844 || (!matched_type && gfc_match (" double complex") == MATCH_YES))
6de9cd9a 3845 {
524af0d6 3846 if (!gfc_notify_std (GFC_STD_GNU, "DOUBLE COMPLEX at %C"))
0fb56814
TB
3847 return MATCH_ERROR;
3848
3849 if (matched_type
524af0d6
JB
3850 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
3851 "intrinsic-type-spec at %C"))
0fb56814
TB
3852 return MATCH_ERROR;
3853
3854 if (matched_type && gfc_match_char (')') != MATCH_YES)
df8652dc
SK
3855 return MATCH_ERROR;
3856
6de9cd9a 3857 ts->type = BT_COMPLEX;
9d64df18 3858 ts->kind = gfc_default_double_kind;
6de9cd9a
DN
3859 return MATCH_YES;
3860 }
3861
0fb56814
TB
3862 if ((matched_type && strcmp ("logical", name) == 0)
3863 || (!matched_type && gfc_match (" logical") == MATCH_YES))
6de9cd9a
DN
3864 {
3865 ts->type = BT_LOGICAL;
9d64df18 3866 ts->kind = gfc_default_logical_kind;
6de9cd9a
DN
3867 goto get_kind;
3868 }
3869
0fb56814 3870 if (matched_type)
5bab4c96
PT
3871 {
3872 m = gfc_match_actual_arglist (1, &decl_type_param_list, true);
3873 if (m == MATCH_ERROR)
3874 return m;
3875
0fb56814 3876 m = gfc_match_char (')');
5bab4c96 3877 }
0fb56814 3878
f6288c24
FR
3879 if (m != MATCH_YES)
3880 m = match_record_decl (name);
3881
3882 if (matched_type || m == MATCH_YES)
3883 {
3884 ts->type = BT_DERIVED;
3885 /* We accept record/s/ or type(s) where s is a structure, but we
3886 * don't need all the extra derived-type stuff for structures. */
3887 if (gfc_find_symbol (gfc_dt_upper_string (name), NULL, 1, &sym))
3888 {
2f029c08 3889 gfc_error ("Type name %qs at %C is ambiguous", name);
f6288c24
FR
3890 return MATCH_ERROR;
3891 }
5bab4c96
PT
3892
3893 if (sym && sym->attr.flavor == FL_DERIVED
3894 && sym->attr.pdt_template
3895 && gfc_current_state () != COMP_DERIVED)
3896 {
3897 m = gfc_get_pdt_instance (decl_type_param_list, &sym, NULL);
3898 if (m != MATCH_YES)
3899 return m;
3900 gcc_assert (!sym->attr.pdt_template && sym->attr.pdt_type);
3901 ts->u.derived = sym;
3902 strcpy (name, gfc_dt_lower_string (sym->name));
3903 }
3904
f6288c24
FR
3905 if (sym && sym->attr.flavor == FL_STRUCT)
3906 {
3907 ts->u.derived = sym;
3908 return MATCH_YES;
3909 }
3910 /* Actually a derived type. */
3911 }
3912
cf2b3c22 3913 else
727e8544 3914 {
f6288c24 3915 /* Match nested STRUCTURE declarations; only valid within another
e79e6763 3916 structure declaration. */
f6d17ecd 3917 if (flag_dec_structure
e79e6763
FR
3918 && (gfc_current_state () == COMP_STRUCTURE
3919 || gfc_current_state () == COMP_MAP))
3920 {
3921 m = gfc_match (" structure");
3922 if (m == MATCH_YES)
3923 {
3924 m = gfc_match_structure_decl ();
3925 if (m == MATCH_YES)
3926 {
3927 /* gfc_new_block is updated by match_structure_decl. */
3928 ts->type = BT_DERIVED;
3929 ts->u.derived = gfc_new_block;
3930 return MATCH_YES;
3931 }
3932 }
3933 if (m == MATCH_ERROR)
3934 return MATCH_ERROR;
3935 }
f6288c24 3936
528622fd
JW
3937 /* Match CLASS declarations. */
3938 m = gfc_match (" class ( * )");
3939 if (m == MATCH_ERROR)
3940 return MATCH_ERROR;
3941 else if (m == MATCH_YES)
3942 {
8b704316
PT
3943 gfc_symbol *upe;
3944 gfc_symtree *st;
3945 ts->type = BT_CLASS;
f5acf0f2 3946 gfc_find_symbol ("STAR", gfc_current_ns, 1, &upe);
8b704316
PT
3947 if (upe == NULL)
3948 {
f5acf0f2
PT
3949 upe = gfc_new_symbol ("STAR", gfc_current_ns);
3950 st = gfc_new_symtree (&gfc_current_ns->sym_root, "STAR");
8b704316
PT
3951 st->n.sym = upe;
3952 gfc_set_sym_referenced (upe);
3953 upe->refs++;
3954 upe->ts.type = BT_VOID;
3955 upe->attr.unlimited_polymorphic = 1;
3956 /* This is essential to force the construction of
3957 unlimited polymorphic component class containers. */
3958 upe->attr.zero_comp = 1;
70112e2a 3959 if (!gfc_add_flavor (&upe->attr, FL_DERIVED, NULL,
524af0d6 3960 &gfc_current_locus))
b93d8a3f
JW
3961 return MATCH_ERROR;
3962 }
8b704316
PT
3963 else
3964 {
b93d8a3f 3965 st = gfc_get_tbp_symtree (&gfc_current_ns->sym_root, "STAR");
8b704316
PT
3966 st->n.sym = upe;
3967 upe->refs++;
3968 }
3969 ts->u.derived = upe;
3970 return m;
3971 }
528622fd 3972
5bab4c96
PT
3973 m = gfc_match (" class (");
3974
3975 if (m == MATCH_YES)
3976 m = gfc_match ("%n", name);
3977 else
3978 return m;
3979
727e8544
JW
3980 if (m != MATCH_YES)
3981 return m;
cf2b3c22 3982 ts->type = BT_CLASS;
727e8544 3983
524af0d6 3984 if (!gfc_notify_std (GFC_STD_F2003, "CLASS statement at %C"))
e74f1cc8 3985 return MATCH_ERROR;
5bab4c96
PT
3986
3987 m = gfc_match_actual_arglist (1, &decl_type_param_list, true);
3988 if (m == MATCH_ERROR)
3989 return m;
3990
3991 m = gfc_match_char (')');
3992 if (m != MATCH_YES)
3993 return m;
727e8544 3994 }
6de9cd9a 3995
1c8bcdf7
PT
3996 /* Defer association of the derived type until the end of the
3997 specification block. However, if the derived type can be
f5acf0f2 3998 found, add it to the typespec. */
1c8bcdf7 3999 if (gfc_matching_function)
e2d29968 4000 {
bc21d315 4001 ts->u.derived = NULL;
1c8bcdf7
PT
4002 if (gfc_current_state () != COMP_INTERFACE
4003 && !gfc_find_symbol (name, NULL, 1, &sym) && sym)
c3f34952
TB
4004 {
4005 sym = gfc_find_dt_in_generic (sym);
4006 ts->u.derived = sym;
4007 }
e2d29968
PT
4008 return MATCH_YES;
4009 }
4010
4011 /* Search for the name but allow the components to be defined later. If
4012 type = -1, this typespec has been seen in a function declaration but
c3f34952 4013 the type could not be accessed at that point. The actual derived type is
eea58adb 4014 stored in a symtree with the first letter of the name capitalized; the
c3f34952
TB
4015 symtree with the all lower-case name contains the associated
4016 generic function. */
f6288c24 4017 dt_name = gfc_dt_upper_string (name);
1c8bcdf7 4018 sym = NULL;
c3f34952
TB
4019 dt_sym = NULL;
4020 if (ts->kind != -1)
6de9cd9a 4021 {
c3f34952
TB
4022 gfc_get_ha_symbol (name, &sym);
4023 if (sym->generic && gfc_find_symbol (dt_name, NULL, 0, &dt_sym))
4024 {
c4100eae 4025 gfc_error ("Type name %qs at %C is ambiguous", name);
c3f34952
TB
4026 return MATCH_ERROR;
4027 }
4028 if (sym->generic && !dt_sym)
4029 dt_sym = gfc_find_dt_in_generic (sym);
18a4e7e3
PT
4030
4031 /* Host associated PDTs can get confused with their constructors
4032 because they ar instantiated in the template's namespace. */
4033 if (!dt_sym)
4034 {
4035 if (gfc_find_symbol (dt_name, NULL, 1, &dt_sym))
4036 {
4037 gfc_error ("Type name %qs at %C is ambiguous", name);
4038 return MATCH_ERROR;
4039 }
4040 if (dt_sym && !dt_sym->attr.pdt_type)
4041 dt_sym = NULL;
4042 }
6de9cd9a 4043 }
e2d29968
PT
4044 else if (ts->kind == -1)
4045 {
1c8bcdf7
PT
4046 int iface = gfc_state_stack->previous->state != COMP_INTERFACE
4047 || gfc_current_ns->has_import_set;
c3f34952
TB
4048 gfc_find_symbol (name, NULL, iface, &sym);
4049 if (sym && sym->generic && gfc_find_symbol (dt_name, NULL, 1, &dt_sym))
f5acf0f2 4050 {
c4100eae 4051 gfc_error ("Type name %qs at %C is ambiguous", name);
e2d29968
PT
4052 return MATCH_ERROR;
4053 }
c3f34952
TB
4054 if (sym && sym->generic && !dt_sym)
4055 dt_sym = gfc_find_dt_in_generic (sym);
e2d29968 4056
1c8bcdf7 4057 ts->kind = 0;
e2d29968
PT
4058 if (sym == NULL)
4059 return MATCH_NO;
4060 }
6de9cd9a 4061
f6288c24 4062 if ((sym->attr.flavor != FL_UNKNOWN && sym->attr.flavor != FL_STRUCT
c3f34952
TB
4063 && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.generic))
4064 || sym->attr.subroutine)
4065 {
fea70c99
MLI
4066 gfc_error ("Type name %qs at %C conflicts with previously declared "
4067 "entity at %L, which has the same name", name,
4068 &sym->declared_at);
c3f34952
TB
4069 return MATCH_ERROR;
4070 }
6de9cd9a 4071
5bab4c96
PT
4072 if (sym && sym->attr.flavor == FL_DERIVED
4073 && sym->attr.pdt_template
4074 && gfc_current_state () != COMP_DERIVED)
18a4e7e3
PT
4075 {
4076 m = gfc_get_pdt_instance (decl_type_param_list, &sym, NULL);
4077 if (m != MATCH_YES)
4078 return m;
4079 gcc_assert (!sym->attr.pdt_template && sym->attr.pdt_type);
4080 ts->u.derived = sym;
4081 strcpy (name, gfc_dt_lower_string (sym->name));
4082 }
5bab4c96 4083
44c57c2f 4084 gfc_save_symbol_data (sym);
1c8bcdf7 4085 gfc_set_sym_referenced (sym);
c3f34952 4086 if (!sym->attr.generic
524af0d6 4087 && !gfc_add_generic (&sym->attr, sym->name, NULL))
c3f34952
TB
4088 return MATCH_ERROR;
4089
4090 if (!sym->attr.function
524af0d6 4091 && !gfc_add_function (&sym->attr, sym->name, NULL))
c3f34952
TB
4092 return MATCH_ERROR;
4093
5bab4c96
PT
4094 if (dt_sym && dt_sym->attr.flavor == FL_DERIVED
4095 && dt_sym->attr.pdt_template
4096 && gfc_current_state () != COMP_DERIVED)
4097 {
4098 m = gfc_get_pdt_instance (decl_type_param_list, &dt_sym, NULL);
4099 if (m != MATCH_YES)
4100 return m;
4101 gcc_assert (!dt_sym->attr.pdt_template && dt_sym->attr.pdt_type);
4102 }
4103
c3f34952
TB
4104 if (!dt_sym)
4105 {
4106 gfc_interface *intr, *head;
4107
4108 /* Use upper case to save the actual derived-type symbol. */
4109 gfc_get_symbol (dt_name, NULL, &dt_sym);
51f03c6b 4110 dt_sym->name = gfc_get_string ("%s", sym->name);
c3f34952
TB
4111 head = sym->generic;
4112 intr = gfc_get_interface ();
4113 intr->sym = dt_sym;
4114 intr->where = gfc_current_locus;
4115 intr->next = head;
4116 sym->generic = intr;
4117 sym->attr.if_source = IFSRC_DECL;
4118 }
44c57c2f
MM
4119 else
4120 gfc_save_symbol_data (dt_sym);
c3f34952
TB
4121
4122 gfc_set_sym_referenced (dt_sym);
4123
f6288c24 4124 if (dt_sym->attr.flavor != FL_DERIVED && dt_sym->attr.flavor != FL_STRUCT
524af0d6 4125 && !gfc_add_flavor (&dt_sym->attr, FL_DERIVED, sym->name, NULL))
c3f34952
TB
4126 return MATCH_ERROR;
4127
4128 ts->u.derived = dt_sym;
6de9cd9a
DN
4129
4130 return MATCH_YES;
4131
4132get_kind:
0fb56814 4133 if (matched_type
524af0d6
JB
4134 && !gfc_notify_std (GFC_STD_F2008, "TYPE with "
4135 "intrinsic-type-spec at %C"))
0fb56814
TB
4136 return MATCH_ERROR;
4137
6de9cd9a
DN
4138 /* For all types except double, derived and character, look for an
4139 optional kind specifier. MATCH_NO is actually OK at this point. */
e5ddaa24 4140 if (implicit_flag == 1)
0fb56814
TB
4141 {
4142 if (matched_type && gfc_match_char (')') != MATCH_YES)
4143 return MATCH_ERROR;
4144
4145 return MATCH_YES;
4146 }
6de9cd9a 4147
0ff0dfbf
TS
4148 if (gfc_current_form == FORM_FREE)
4149 {
0b3624f6
SK
4150 c = gfc_peek_ascii_char ();
4151 if (!gfc_is_whitespace (c) && c != '*' && c != '('
636dff67 4152 && c != ':' && c != ',')
0fb56814
TB
4153 {
4154 if (matched_type && c == ')')
4155 {
4156 gfc_next_ascii_char ();
4157 return MATCH_YES;
4158 }
4159 return MATCH_NO;
4160 }
0ff0dfbf
TS
4161 }
4162
e2d29968 4163 m = gfc_match_kind_spec (ts, false);
6de9cd9a 4164 if (m == MATCH_NO && ts->type != BT_CHARACTER)
4381322d
SK
4165 {
4166 m = gfc_match_old_kind_spec (ts);
4167 if (gfc_validate_kind (ts->type, ts->kind, true) == -1)
4168 return MATCH_ERROR;
4169 }
6de9cd9a 4170
0fb56814
TB
4171 if (matched_type && gfc_match_char (')') != MATCH_YES)
4172 return MATCH_ERROR;
4173
1c8bcdf7
PT
4174 /* Defer association of the KIND expression of function results
4175 until after USE and IMPORT statements. */
4176 if ((gfc_current_state () == COMP_NONE && gfc_error_flag_test ())
4177 || gfc_matching_function)
4178 return MATCH_YES;
4179
6de9cd9a
DN
4180 if (m == MATCH_NO)
4181 m = MATCH_YES; /* No kind specifier found. */
4182
4183 return m;
4184}
4185
4186
e5ddaa24
TS
4187/* Match an IMPLICIT NONE statement. Actually, this statement is
4188 already matched in parse.c, or we would not end up here in the
4189 first place. So the only thing we need to check, is if there is
4190 trailing garbage. If not, the match is successful. */
4191
4192match
4193gfc_match_implicit_none (void)
4194{
8b7a967e
TB
4195 char c;
4196 match m;
4197 char name[GFC_MAX_SYMBOL_LEN + 1];
4198 bool type = false;
4199 bool external = false;
a6c63173
TB
4200 locus cur_loc = gfc_current_locus;
4201
4202 if (gfc_current_ns->seen_implicit_none
4203 || gfc_current_ns->has_implicit_none_export)
4204 {
4205 gfc_error ("Duplicate IMPLICIT NONE statement at %C");
4206 return MATCH_ERROR;
4207 }
8b7a967e
TB
4208
4209 gfc_gobble_whitespace ();
4210 c = gfc_peek_ascii_char ();
4211 if (c == '(')
4212 {
4213 (void) gfc_next_ascii_char ();
8179b067 4214 if (!gfc_notify_std (GFC_STD_F2018, "IMPORT NONE with spec list at %C"))
8b7a967e 4215 return MATCH_ERROR;
a6c63173
TB
4216
4217 gfc_gobble_whitespace ();
4218 if (gfc_peek_ascii_char () == ')')
8b7a967e 4219 {
a6c63173
TB
4220 (void) gfc_next_ascii_char ();
4221 type = true;
4222 }
4223 else
4224 for(;;)
4225 {
4226 m = gfc_match (" %n", name);
4227 if (m != MATCH_YES)
4228 return MATCH_ERROR;
8b7a967e 4229
a6c63173
TB
4230 if (strcmp (name, "type") == 0)
4231 type = true;
4232 else if (strcmp (name, "external") == 0)
4233 external = true;
4234 else
4235 return MATCH_ERROR;
8b7a967e 4236
a6c63173
TB
4237 gfc_gobble_whitespace ();
4238 c = gfc_next_ascii_char ();
4239 if (c == ',')
4240 continue;
4241 if (c == ')')
4242 break;
4243 return MATCH_ERROR;
4244 }
8b7a967e
TB
4245 }
4246 else
4247 type = true;
4248
4249 if (gfc_match_eos () != MATCH_YES)
4250 return MATCH_ERROR;
4251
a6c63173 4252 gfc_set_implicit_none (type, external, &cur_loc);
8b7a967e
TB
4253
4254 return MATCH_YES;
e5ddaa24
TS
4255}
4256
4257
4258/* Match the letter range(s) of an IMPLICIT statement. */
4259
4260static match
1107b970 4261match_implicit_range (void)
e5ddaa24 4262{
8fc541d3
FXC
4263 char c, c1, c2;
4264 int inner;
e5ddaa24
TS
4265 locus cur_loc;
4266
4267 cur_loc = gfc_current_locus;
4268
4269 gfc_gobble_whitespace ();
8fc541d3 4270 c = gfc_next_ascii_char ();
e5ddaa24
TS
4271 if (c != '(')
4272 {
4273 gfc_error ("Missing character range in IMPLICIT at %C");
4274 goto bad;
4275 }
4276
4277 inner = 1;
4278 while (inner)
4279 {
4280 gfc_gobble_whitespace ();
8fc541d3 4281 c1 = gfc_next_ascii_char ();
e5ddaa24
TS
4282 if (!ISALPHA (c1))
4283 goto bad;
4284
4285 gfc_gobble_whitespace ();
8fc541d3 4286 c = gfc_next_ascii_char ();
e5ddaa24
TS
4287
4288 switch (c)
4289 {
4290 case ')':
66e4ab31 4291 inner = 0; /* Fall through. */
e5ddaa24
TS
4292
4293 case ',':
4294 c2 = c1;
4295 break;
4296
4297 case '-':
4298 gfc_gobble_whitespace ();
8fc541d3 4299 c2 = gfc_next_ascii_char ();
e5ddaa24
TS
4300 if (!ISALPHA (c2))
4301 goto bad;
4302
4303 gfc_gobble_whitespace ();
8fc541d3 4304 c = gfc_next_ascii_char ();
e5ddaa24
TS
4305
4306 if ((c != ',') && (c != ')'))
4307 goto bad;
4308 if (c == ')')
4309 inner = 0;
4310
4311 break;
4312
4313 default:
4314 goto bad;
4315 }
4316
4317 if (c1 > c2)
4318 {
4319 gfc_error ("Letters must be in alphabetic order in "
4320 "IMPLICIT statement at %C");
4321 goto bad;
4322 }
4323
4324 /* See if we can add the newly matched range to the pending
636dff67
SK
4325 implicits from this IMPLICIT statement. We do not check for
4326 conflicts with whatever earlier IMPLICIT statements may have
4327 set. This is done when we've successfully finished matching
4328 the current one. */
524af0d6 4329 if (!gfc_add_new_implicit_range (c1, c2))
e5ddaa24
TS
4330 goto bad;
4331 }
4332
4333 return MATCH_YES;
4334
4335bad:
4336 gfc_syntax_error (ST_IMPLICIT);
4337
4338 gfc_current_locus = cur_loc;
4339 return MATCH_ERROR;
4340}
4341
4342
4343/* Match an IMPLICIT statement, storing the types for
4344 gfc_set_implicit() if the statement is accepted by the parser.
4345 There is a strange looking, but legal syntactic construction
4346 possible. It looks like:
4347
4348 IMPLICIT INTEGER (a-b) (c-d)
4349
4350 This is legal if "a-b" is a constant expression that happens to
4351 equal one of the legal kinds for integers. The real problem
4352 happens with an implicit specification that looks like:
4353
4354 IMPLICIT INTEGER (a-b)
4355
4356 In this case, a typespec matcher that is "greedy" (as most of the
4357 matchers are) gobbles the character range as a kindspec, leaving
4358 nothing left. We therefore have to go a bit more slowly in the
4359 matching process by inhibiting the kindspec checking during
4360 typespec matching and checking for a kind later. */
4361
4362match
4363gfc_match_implicit (void)
4364{
4365 gfc_typespec ts;
4366 locus cur_loc;
8fc541d3 4367 char c;
e5ddaa24
TS
4368 match m;
4369
8b7a967e
TB
4370 if (gfc_current_ns->seen_implicit_none)
4371 {
4372 gfc_error ("IMPLICIT statement at %C following an IMPLICIT NONE (type) "
4373 "statement");
4374 return MATCH_ERROR;
4375 }
4376
44000dbb
JD
4377 gfc_clear_ts (&ts);
4378
e5ddaa24
TS
4379 /* We don't allow empty implicit statements. */
4380 if (gfc_match_eos () == MATCH_YES)
4381 {
4382 gfc_error ("Empty IMPLICIT statement at %C");
4383 return MATCH_ERROR;
4384 }
4385
e5ddaa24
TS
4386 do
4387 {
1107b970
PB
4388 /* First cleanup. */
4389 gfc_clear_new_implicit ();
4390
e5ddaa24 4391 /* A basic type is mandatory here. */
e74f1cc8 4392 m = gfc_match_decl_type_spec (&ts, 1);
e5ddaa24
TS
4393 if (m == MATCH_ERROR)
4394 goto error;
4395 if (m == MATCH_NO)
4396 goto syntax;
4397
4398 cur_loc = gfc_current_locus;
1107b970 4399 m = match_implicit_range ();
e5ddaa24
TS
4400
4401 if (m == MATCH_YES)
4402 {
1107b970 4403 /* We may have <TYPE> (<RANGE>). */
e5ddaa24 4404 gfc_gobble_whitespace ();
a6c63173
TB
4405 c = gfc_peek_ascii_char ();
4406 if (c == ',' || c == '\n' || c == ';' || c == '!')
1107b970
PB
4407 {
4408 /* Check for CHARACTER with no length parameter. */
bc21d315 4409 if (ts.type == BT_CHARACTER && !ts.u.cl)
1107b970 4410 {
9d64df18 4411 ts.kind = gfc_default_character_kind;
b76e28c6 4412 ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
f622221a 4413 ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
b7e75771 4414 NULL, 1);
1107b970
PB
4415 }
4416
4417 /* Record the Successful match. */
524af0d6 4418 if (!gfc_merge_new_implicit (&ts))
1107b970 4419 return MATCH_ERROR;
a6c63173
TB
4420 if (c == ',')
4421 c = gfc_next_ascii_char ();
4422 else if (gfc_match_eos () == MATCH_ERROR)
4423 goto error;
1107b970
PB
4424 continue;
4425 }
e5ddaa24
TS
4426
4427 gfc_current_locus = cur_loc;
4428 }
4429
1107b970
PB
4430 /* Discard the (incorrectly) matched range. */
4431 gfc_clear_new_implicit ();
4432
4433 /* Last chance -- check <TYPE> <SELECTOR> (<RANGE>). */
4434 if (ts.type == BT_CHARACTER)
8234e5e0 4435 m = gfc_match_char_spec (&ts);
1107b970 4436 else
e5ddaa24 4437 {
e2d29968 4438 m = gfc_match_kind_spec (&ts, false);
e5ddaa24 4439 if (m == MATCH_NO)
1107b970
PB
4440 {
4441 m = gfc_match_old_kind_spec (&ts);
4442 if (m == MATCH_ERROR)
4443 goto error;
4444 if (m == MATCH_NO)
4445 goto syntax;
4446 }
e5ddaa24 4447 }
1107b970
PB
4448 if (m == MATCH_ERROR)
4449 goto error;
e5ddaa24 4450
1107b970 4451 m = match_implicit_range ();
e5ddaa24
TS
4452 if (m == MATCH_ERROR)
4453 goto error;
4454 if (m == MATCH_NO)
4455 goto syntax;
4456
4457 gfc_gobble_whitespace ();
8fc541d3 4458 c = gfc_next_ascii_char ();
a6c63173 4459 if (c != ',' && gfc_match_eos () != MATCH_YES)
e5ddaa24
TS
4460 goto syntax;
4461
524af0d6 4462 if (!gfc_merge_new_implicit (&ts))
1107b970 4463 return MATCH_ERROR;
e5ddaa24
TS
4464 }
4465 while (c == ',');
4466
1107b970 4467 return MATCH_YES;
e5ddaa24
TS
4468
4469syntax:
4470 gfc_syntax_error (ST_IMPLICIT);
4471
4472error:
4473 return MATCH_ERROR;
4474}
4475
66e4ab31 4476
8998be20
TB
4477match
4478gfc_match_import (void)
4479{
4480 char name[GFC_MAX_SYMBOL_LEN + 1];
4481 match m;
4482 gfc_symbol *sym;
4483 gfc_symtree *st;
4484
66e4ab31
SK
4485 if (gfc_current_ns->proc_name == NULL
4486 || gfc_current_ns->proc_name->attr.if_source != IFSRC_IFBODY)
8998be20
TB
4487 {
4488 gfc_error ("IMPORT statement at %C only permitted in "
4489 "an INTERFACE body");
4490 return MATCH_ERROR;
4491 }
4492
4668d6f9
PT
4493 if (gfc_current_ns->proc_name->attr.module_procedure)
4494 {
4495 gfc_error ("F2008: C1210 IMPORT statement at %C is not permitted "
4496 "in a module procedure interface body");
4497 return MATCH_ERROR;
4498 }
4499
524af0d6 4500 if (!gfc_notify_std (GFC_STD_F2003, "IMPORT statement at %C"))
8998be20
TB
4501 return MATCH_ERROR;
4502
4503 if (gfc_match_eos () == MATCH_YES)
4504 {
4505 /* All host variables should be imported. */
4506 gfc_current_ns->has_import_set = 1;
4507 return MATCH_YES;
4508 }
4509
4510 if (gfc_match (" ::") == MATCH_YES)
4511 {
4512 if (gfc_match_eos () == MATCH_YES)
636dff67
SK
4513 {
4514 gfc_error ("Expecting list of named entities at %C");
4515 return MATCH_ERROR;
4516 }
8998be20
TB
4517 }
4518
4519 for(;;)
4520 {
2e8d9212 4521 sym = NULL;
8998be20
TB
4522 m = gfc_match (" %n", name);
4523 switch (m)
4524 {
4525 case MATCH_YES:
36d3fb4c 4526 if (gfc_current_ns->parent != NULL
66e4ab31 4527 && gfc_find_symbol (name, gfc_current_ns->parent, 1, &sym))
36d3fb4c 4528 {
c4100eae 4529 gfc_error ("Type name %qs at %C is ambiguous", name);
36d3fb4c
PT
4530 return MATCH_ERROR;
4531 }
4e2cf5f5 4532 else if (!sym && gfc_current_ns->proc_name->ns->parent != NULL
66e4ab31
SK
4533 && gfc_find_symbol (name,
4534 gfc_current_ns->proc_name->ns->parent,
4535 1, &sym))
636dff67 4536 {
c4100eae 4537 gfc_error ("Type name %qs at %C is ambiguous", name);
636dff67
SK
4538 return MATCH_ERROR;
4539 }
4540
4541 if (sym == NULL)
4542 {
c4100eae 4543 gfc_error ("Cannot IMPORT %qs from host scoping unit "
636dff67
SK
4544 "at %C - does not exist.", name);
4545 return MATCH_ERROR;
4546 }
4547
dd8b9dde 4548 if (gfc_find_symtree (gfc_current_ns->sym_root, name))
636dff67 4549 {
db30e21c 4550 gfc_warning (0, "%qs is already IMPORTed from host scoping unit "
48749dbc 4551 "at %C", name);
636dff67
SK
4552 goto next_item;
4553 }
4554
dd8b9dde 4555 st = gfc_new_symtree (&gfc_current_ns->sym_root, name);
636dff67
SK
4556 st->n.sym = sym;
4557 sym->refs++;
5a8af0b4 4558 sym->attr.imported = 1;
8998be20 4559
c3f34952
TB
4560 if (sym->attr.generic && (sym = gfc_find_dt_in_generic (sym)))
4561 {
4562 /* The actual derived type is stored in a symtree with the first
eea58adb 4563 letter of the name capitalized; the symtree with the all
1cc0e193 4564 lower-case name contains the associated generic function. */
c3f34952 4565 st = gfc_new_symtree (&gfc_current_ns->sym_root,
f6288c24 4566 gfc_dt_upper_string (name));
c3f34952
TB
4567 st->n.sym = sym;
4568 sym->refs++;
4569 sym->attr.imported = 1;
4570 }
4571
8998be20
TB
4572 goto next_item;
4573
4574 case MATCH_NO:
4575 break;
4576
4577 case MATCH_ERROR:
4578 return MATCH_ERROR;
4579 }
4580
4581 next_item:
4582 if (gfc_match_eos () == MATCH_YES)
4583 break;
4584 if (gfc_match_char (',') != MATCH_YES)
4585 goto syntax;
4586 }
4587
4588 return MATCH_YES;
4589
4590syntax:
4591 gfc_error ("Syntax error in IMPORT statement at %C");
4592 return MATCH_ERROR;
4593}
e5ddaa24 4594
66e4ab31 4595
f2449db4
RS
4596/* A minimal implementation of gfc_match without whitespace, escape
4597 characters or variable arguments. Returns true if the next
4598 characters match the TARGET template exactly. */
4599
4600static bool
4601match_string_p (const char *target)
4602{
4603 const char *p;
4604
4605 for (p = target; *p; p++)
8fc541d3 4606 if ((char) gfc_next_ascii_char () != *p)
f2449db4
RS
4607 return false;
4608 return true;
4609}
4610
6de9cd9a
DN
4611/* Matches an attribute specification including array specs. If
4612 successful, leaves the variables current_attr and current_as
4613 holding the specification. Also sets the colon_seen variable for
4614 later use by matchers associated with initializations.
4615
4616 This subroutine is a little tricky in the sense that we don't know
4617 if we really have an attr-spec until we hit the double colon.
4618 Until that time, we can only return MATCH_NO. This forces us to
4619 check for duplicate specification at this level. */
4620
4621static match
4622match_attr_spec (void)
4623{
6de9cd9a 4624 /* Modifiers that can exist in a type statement. */
d75d9546 4625 enum
6de9cd9a
DN
4626 { GFC_DECL_BEGIN = 0,
4627 DECL_ALLOCATABLE = GFC_DECL_BEGIN, DECL_DIMENSION, DECL_EXTERNAL,
4628 DECL_IN, DECL_OUT, DECL_INOUT, DECL_INTRINSIC, DECL_OPTIONAL,
ee7e677f 4629 DECL_PARAMETER, DECL_POINTER, DECL_PROTECTED, DECL_PRIVATE,
34d567d1 4630 DECL_STATIC, DECL_AUTOMATIC,
ee7e677f 4631 DECL_PUBLIC, DECL_SAVE, DECL_TARGET, DECL_VALUE, DECL_VOLATILE,
fe4e525c 4632 DECL_IS_BIND_C, DECL_CODIMENSION, DECL_ASYNCHRONOUS, DECL_CONTIGUOUS,
5bab4c96 4633 DECL_LEN, DECL_KIND, DECL_NONE, GFC_DECL_END /* Sentinel */
d75d9546 4634 };
6de9cd9a
DN
4635
4636/* GFC_DECL_END is the sentinel, index starts at 0. */
4637#define NUM_DECL GFC_DECL_END
4638
6de9cd9a
DN
4639 locus start, seen_at[NUM_DECL];
4640 int seen[NUM_DECL];
09639a83 4641 unsigned int d;
6de9cd9a
DN
4642 const char *attr;
4643 match m;
524af0d6 4644 bool t;
6de9cd9a
DN
4645
4646 gfc_clear_attr (&current_attr);
63645982 4647 start = gfc_current_locus;
6de9cd9a
DN
4648
4649 current_as = NULL;
4650 colon_seen = 0;
6f855a26 4651 attr_seen = 0;
6de9cd9a
DN
4652
4653 /* See if we get all of the keywords up to the final double colon. */
4654 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
4655 seen[d] = 0;
4656
4657 for (;;)
4658 {
8fc541d3 4659 char ch;
a8b3b0b6 4660
f2449db4
RS
4661 d = DECL_NONE;
4662 gfc_gobble_whitespace ();
4663
8fc541d3 4664 ch = gfc_next_ascii_char ();
f2449db4
RS
4665 if (ch == ':')
4666 {
4667 /* This is the successful exit condition for the loop. */
8fc541d3 4668 if (gfc_next_ascii_char () == ':')
f2449db4
RS
4669 break;
4670 }
4671 else if (ch == ',')
a8b3b0b6 4672 {
a8b3b0b6 4673 gfc_gobble_whitespace ();
8fc541d3 4674 switch (gfc_peek_ascii_char ())
a8b3b0b6 4675 {
f2449db4 4676 case 'a':
1eee5628
TB
4677 gfc_next_ascii_char ();
4678 switch (gfc_next_ascii_char ())
4679 {
4680 case 'l':
4681 if (match_string_p ("locatable"))
4682 {
4683 /* Matched "allocatable". */
4684 d = DECL_ALLOCATABLE;
4685 }
4686 break;
4687
4688 case 's':
4689 if (match_string_p ("ynchronous"))
4690 {
4691 /* Matched "asynchronous". */
4692 d = DECL_ASYNCHRONOUS;
4693 }
4694 break;
34d567d1
FR
4695
4696 case 'u':
4697 if (match_string_p ("tomatic"))
4698 {
4699 /* Matched "automatic". */
4700 d = DECL_AUTOMATIC;
4701 }
4702 break;
1eee5628 4703 }
fe4e525c 4704 break;
f2449db4
RS
4705
4706 case 'b':
a8b3b0b6 4707 /* Try and match the bind(c). */
1eabf70a 4708 m = gfc_match_bind_c (NULL, true);
129d15a3 4709 if (m == MATCH_YES)
a8b3b0b6 4710 d = DECL_IS_BIND_C;
129d15a3
JW
4711 else if (m == MATCH_ERROR)
4712 goto cleanup;
f2449db4
RS
4713 break;
4714
be59db2d 4715 case 'c':
fe4e525c
TB
4716 gfc_next_ascii_char ();
4717 if ('o' != gfc_next_ascii_char ())
4718 break;
4719 switch (gfc_next_ascii_char ())
4720 {
4721 case 'd':
4722 if (match_string_p ("imension"))
4723 {
4724 d = DECL_CODIMENSION;
4725 break;
4726 }
191816a3 4727 /* FALLTHRU */
fe4e525c
TB
4728 case 'n':
4729 if (match_string_p ("tiguous"))
4730 {
4731 d = DECL_CONTIGUOUS;
4732 break;
4733 }
4734 }
be59db2d
TB
4735 break;
4736
f2449db4
RS
4737 case 'd':
4738 if (match_string_p ("dimension"))
4739 d = DECL_DIMENSION;
4740 break;
4741
4742 case 'e':
4743 if (match_string_p ("external"))
4744 d = DECL_EXTERNAL;
4745 break;
4746
4747 case 'i':
4748 if (match_string_p ("int"))
4749 {
8fc541d3 4750 ch = gfc_next_ascii_char ();
f2449db4
RS
4751 if (ch == 'e')
4752 {
4753 if (match_string_p ("nt"))
4754 {
4755 /* Matched "intent". */
4756 /* TODO: Call match_intent_spec from here. */
4757 if (gfc_match (" ( in out )") == MATCH_YES)
4758 d = DECL_INOUT;
4759 else if (gfc_match (" ( in )") == MATCH_YES)
4760 d = DECL_IN;
4761 else if (gfc_match (" ( out )") == MATCH_YES)
4762 d = DECL_OUT;
4763 }
4764 }
4765 else if (ch == 'r')
4766 {
4767 if (match_string_p ("insic"))
4768 {
4769 /* Matched "intrinsic". */
4770 d = DECL_INTRINSIC;
4771 }
4772 }
4773 }
4774 break;
4775
5bab4c96
PT
4776 case 'k':
4777 if (match_string_p ("kind"))
4778 d = DECL_KIND;
4779 break;
4780
4781 case 'l':
4782 if (match_string_p ("len"))
4783 d = DECL_LEN;
4784 break;
4785
f2449db4
RS
4786 case 'o':
4787 if (match_string_p ("optional"))
4788 d = DECL_OPTIONAL;
4789 break;
4790
4791 case 'p':
8fc541d3
FXC
4792 gfc_next_ascii_char ();
4793 switch (gfc_next_ascii_char ())
f2449db4
RS
4794 {
4795 case 'a':
4796 if (match_string_p ("rameter"))
4797 {
4798 /* Matched "parameter". */
4799 d = DECL_PARAMETER;
4800 }
4801 break;
4802
4803 case 'o':
4804 if (match_string_p ("inter"))
4805 {
4806 /* Matched "pointer". */
4807 d = DECL_POINTER;
4808 }
4809 break;
4810
4811 case 'r':
8fc541d3 4812 ch = gfc_next_ascii_char ();
f2449db4
RS
4813 if (ch == 'i')
4814 {
4815 if (match_string_p ("vate"))
4816 {
4817 /* Matched "private". */
4818 d = DECL_PRIVATE;
4819 }
4820 }
4821 else if (ch == 'o')
4822 {
4823 if (match_string_p ("tected"))
4824 {
4825 /* Matched "protected". */
4826 d = DECL_PROTECTED;
4827 }
4828 }
4829 break;
4830
4831 case 'u':
4832 if (match_string_p ("blic"))
4833 {
4834 /* Matched "public". */
4835 d = DECL_PUBLIC;
4836 }
4837 break;
4838 }
4839 break;
4840
4841 case 's':
34d567d1
FR
4842 gfc_next_ascii_char ();
4843 switch (gfc_next_ascii_char ())
4844 {
4845 case 'a':
4846 if (match_string_p ("ve"))
4847 {
4848 /* Matched "save". */
4849 d = DECL_SAVE;
4850 }
4851 break;
4852
4853 case 't':
4854 if (match_string_p ("atic"))
4855 {
4856 /* Matched "static". */
4857 d = DECL_STATIC;
4858 }
4859 break;
4860 }
f2449db4
RS
4861 break;
4862
4863 case 't':
4864 if (match_string_p ("target"))
4865 d = DECL_TARGET;
4866 break;
4867
4868 case 'v':
8fc541d3
FXC
4869 gfc_next_ascii_char ();
4870 ch = gfc_next_ascii_char ();
f2449db4
RS
4871 if (ch == 'a')
4872 {
4873 if (match_string_p ("lue"))
4874 {
4875 /* Matched "value". */
4876 d = DECL_VALUE;
4877 }
4878 }
4879 else if (ch == 'o')
4880 {
4881 if (match_string_p ("latile"))
4882 {
4883 /* Matched "volatile". */
4884 d = DECL_VOLATILE;
4885 }
4886 }
4887 break;
a8b3b0b6
CR
4888 }
4889 }
d468bcdb 4890
f2449db4
RS
4891 /* No double colon and no recognizable decl_type, so assume that
4892 we've been looking at something else the whole time. */
4893 if (d == DECL_NONE)
4894 {
4895 m = MATCH_NO;
4896 goto cleanup;
4897 }
d51347f9 4898
acb388a0
JD
4899 /* Check to make sure any parens are paired up correctly. */
4900 if (gfc_match_parens () == MATCH_ERROR)
4901 {
4902 m = MATCH_ERROR;
4903 goto cleanup;
4904 }
4905
6de9cd9a 4906 seen[d]++;
63645982 4907 seen_at[d] = gfc_current_locus;
6de9cd9a 4908
d3a9eea2 4909 if (d == DECL_DIMENSION || d == DECL_CODIMENSION)
6de9cd9a 4910 {
d3a9eea2 4911 gfc_array_spec *as = NULL;
6de9cd9a 4912
d3a9eea2
TB
4913 m = gfc_match_array_spec (&as, d == DECL_DIMENSION,
4914 d == DECL_CODIMENSION);
4915
4916 if (current_as == NULL)
4917 current_as = as;
4918 else if (m == MATCH_YES)
6de9cd9a 4919 {
524af0d6 4920 if (!merge_array_spec (as, current_as, false))
63fbf586 4921 m = MATCH_ERROR;
cede9502 4922 free (as);
6de9cd9a
DN
4923 }
4924
be59db2d
TB
4925 if (m == MATCH_NO)
4926 {
d3a9eea2
TB
4927 if (d == DECL_CODIMENSION)
4928 gfc_error ("Missing codimension specification at %C");
4929 else
4930 gfc_error ("Missing dimension specification at %C");
be59db2d
TB
4931 m = MATCH_ERROR;
4932 }
4933
4934 if (m == MATCH_ERROR)
4935 goto cleanup;
4936 }
6de9cd9a
DN
4937 }
4938
6de9cd9a
DN
4939 /* Since we've seen a double colon, we have to be looking at an
4940 attr-spec. This means that we can now issue errors. */
4941 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
4942 if (seen[d] > 1)
4943 {
4944 switch (d)
4945 {
4946 case DECL_ALLOCATABLE:
4947 attr = "ALLOCATABLE";
4948 break;
1eee5628
TB
4949 case DECL_ASYNCHRONOUS:
4950 attr = "ASYNCHRONOUS";
4951 break;
be59db2d
TB
4952 case DECL_CODIMENSION:
4953 attr = "CODIMENSION";
4954 break;
fe4e525c
TB
4955 case DECL_CONTIGUOUS:
4956 attr = "CONTIGUOUS";
4957 break;
6de9cd9a
DN
4958 case DECL_DIMENSION:
4959 attr = "DIMENSION";
4960 break;
4961 case DECL_EXTERNAL:
4962 attr = "EXTERNAL";
4963 break;
4964 case DECL_IN:
4965 attr = "INTENT (IN)";
4966 break;
4967 case DECL_OUT:
4968 attr = "INTENT (OUT)";
4969 break;
4970 case DECL_INOUT:
4971 attr = "INTENT (IN OUT)";
4972 break;
4973 case DECL_INTRINSIC:
4974 attr = "INTRINSIC";
4975 break;
4976 case DECL_OPTIONAL:
4977 attr = "OPTIONAL";
4978 break;
5bab4c96
PT
4979 case DECL_KIND:
4980 attr = "KIND";
4981 break;
4982 case DECL_LEN:
4983 attr = "LEN";
4984 break;
6de9cd9a
DN
4985 case DECL_PARAMETER:
4986 attr = "PARAMETER";
4987 break;
4988 case DECL_POINTER:
4989 attr = "POINTER";
4990 break;
ee7e677f
TB
4991 case DECL_PROTECTED:
4992 attr = "PROTECTED";
4993 break;
6de9cd9a
DN
4994 case DECL_PRIVATE:
4995 attr = "PRIVATE";
4996 break;
4997 case DECL_PUBLIC:
4998 attr = "PUBLIC";
4999 break;
5000 case DECL_SAVE:
5001 attr = "SAVE";
5002 break;
34d567d1
FR
5003 case DECL_STATIC:
5004 attr = "STATIC";
5005 break;
5006 case DECL_AUTOMATIC:
5007 attr = "AUTOMATIC";
5008 break;
6de9cd9a
DN
5009 case DECL_TARGET:
5010 attr = "TARGET";
5011 break;
a8b3b0b6
CR
5012 case DECL_IS_BIND_C:
5013 attr = "IS_BIND_C";
5014 break;
5015 case DECL_VALUE:
5016 attr = "VALUE";
5017 break;
775e6c3a
TB
5018 case DECL_VOLATILE:
5019 attr = "VOLATILE";
5020 break;
6de9cd9a 5021 default:
66e4ab31 5022 attr = NULL; /* This shouldn't happen. */
6de9cd9a
DN
5023 }
5024
5025 gfc_error ("Duplicate %s attribute at %L", attr, &seen_at[d]);
5026 m = MATCH_ERROR;
5027 goto cleanup;
5028 }
5029
5030 /* Now that we've dealt with duplicate attributes, add the attributes
5031 to the current attribute. */
5032 for (d = GFC_DECL_BEGIN; d != GFC_DECL_END; d++)
5033 {
5034 if (seen[d] == 0)
5035 continue;
6f855a26
FR
5036 else
5037 attr_seen = 1;
6de9cd9a 5038
34d567d1
FR
5039 if ((d == DECL_STATIC || d == DECL_AUTOMATIC)
5040 && !flag_dec_static)
5041 {
cf004230
FR
5042 gfc_error ("%s at %L is a DEC extension, enable with "
5043 "%<-fdec-static%>",
34d567d1
FR
5044 d == DECL_STATIC ? "STATIC" : "AUTOMATIC", &seen_at[d]);
5045 m = MATCH_ERROR;
5046 goto cleanup;
5047 }
5048 /* Allow SAVE with STATIC, but don't complain. */
5049 if (d == DECL_STATIC && seen[DECL_SAVE])
5050 continue;
5051
6de9cd9a 5052 if (gfc_current_state () == COMP_DERIVED
be59db2d
TB
5053 && d != DECL_DIMENSION && d != DECL_CODIMENSION
5054 && d != DECL_POINTER && d != DECL_PRIVATE
fe4e525c 5055 && d != DECL_PUBLIC && d != DECL_CONTIGUOUS && d != DECL_NONE)
6de9cd9a 5056 {
5046aff5
PT
5057 if (d == DECL_ALLOCATABLE)
5058 {
524af0d6
JB
5059 if (!gfc_notify_std (GFC_STD_F2003, "ALLOCATABLE "
5060 "attribute at %C in a TYPE definition"))
5046aff5
PT
5061 {
5062 m = MATCH_ERROR;
5063 goto cleanup;
5064 }
636dff67 5065 }
5bab4c96
PT
5066 else if (d == DECL_KIND)
5067 {
5068 if (!gfc_notify_std (GFC_STD_F2003, "KIND "
5069 "attribute at %C in a TYPE definition"))
5070 {
5071 m = MATCH_ERROR;
5072 goto cleanup;
5073 }
5074 if (current_ts.type != BT_INTEGER)
5075 {
5076 gfc_error ("Component with KIND attribute at %C must be "
5077 "INTEGER");
5078 m = MATCH_ERROR;
5079 goto cleanup;
5080 }
5081 if (current_ts.kind != gfc_default_integer_kind)
5082 {
5083 gfc_error ("Component with KIND attribute at %C must be "
5084 "default integer kind (%d)",
5085 gfc_default_integer_kind);
5086 m = MATCH_ERROR;
5087 goto cleanup;
5088 }
5089 }
5090 else if (d == DECL_LEN)
5091 {
5092 if (!gfc_notify_std (GFC_STD_F2003, "LEN "
5093 "attribute at %C in a TYPE definition"))
5094 {
5095 m = MATCH_ERROR;
5096 goto cleanup;
5097 }
5098 if (current_ts.type != BT_INTEGER)
5099 {
5100 gfc_error ("Component with LEN attribute at %C must be "
5101 "INTEGER");
5102 m = MATCH_ERROR;
5103 goto cleanup;
5104 }
5105 if (current_ts.kind != gfc_default_integer_kind)
5106 {
5107 gfc_error ("Component with LEN attribute at %C must be "
5108 "default integer kind (%d)",
5109 gfc_default_integer_kind);
5110 m = MATCH_ERROR;
5111 goto cleanup;
5112 }
5113 }
636dff67 5114 else
5046aff5
PT
5115 {
5116 gfc_error ("Attribute at %L is not allowed in a TYPE definition",
d51347f9 5117 &seen_at[d]);
5046aff5
PT
5118 m = MATCH_ERROR;
5119 goto cleanup;
5120 }
6de9cd9a
DN
5121 }
5122
4213f93b 5123 if ((d == DECL_PRIVATE || d == DECL_PUBLIC)
636dff67 5124 && gfc_current_state () != COMP_MODULE)
4213f93b
PT
5125 {
5126 if (d == DECL_PRIVATE)
5127 attr = "PRIVATE";
5128 else
5129 attr = "PUBLIC";
d51347f9
TB
5130 if (gfc_current_state () == COMP_DERIVED
5131 && gfc_state_stack->previous
5132 && gfc_state_stack->previous->state == COMP_MODULE)
5133 {
524af0d6 5134 if (!gfc_notify_std (GFC_STD_F2003, "Attribute %s "
70112e2a 5135 "at %L in a TYPE definition", attr,
524af0d6 5136 &seen_at[d]))
d51347f9
TB
5137 {
5138 m = MATCH_ERROR;
5139 goto cleanup;
5140 }
5141 }
5142 else
5143 {
5144 gfc_error ("%s attribute at %L is not allowed outside of the "
5145 "specification part of a module", attr, &seen_at[d]);
5146 m = MATCH_ERROR;
5147 goto cleanup;
5148 }
4213f93b
PT
5149 }
5150
5bab4c96
PT
5151 if (gfc_current_state () != COMP_DERIVED
5152 && (d == DECL_KIND || d == DECL_LEN))
5153 {
5154 gfc_error ("Attribute at %L is not allowed outside a TYPE "
5155 "definition", &seen_at[d]);
5156 m = MATCH_ERROR;
5157 goto cleanup;
5158 }
5159
6de9cd9a
DN
5160 switch (d)
5161 {
5162 case DECL_ALLOCATABLE:
5163 t = gfc_add_allocatable (&current_attr, &seen_at[d]);
5164 break;
5165
1eee5628 5166 case DECL_ASYNCHRONOUS:
524af0d6
JB
5167 if (!gfc_notify_std (GFC_STD_F2003, "ASYNCHRONOUS attribute at %C"))
5168 t = false;
1eee5628
TB
5169 else
5170 t = gfc_add_asynchronous (&current_attr, NULL, &seen_at[d]);
5171 break;
5172
be59db2d
TB
5173 case DECL_CODIMENSION:
5174 t = gfc_add_codimension (&current_attr, NULL, &seen_at[d]);
5175 break;
5176
fe4e525c 5177 case DECL_CONTIGUOUS:
524af0d6
JB
5178 if (!gfc_notify_std (GFC_STD_F2008, "CONTIGUOUS attribute at %C"))
5179 t = false;
fe4e525c
TB
5180 else
5181 t = gfc_add_contiguous (&current_attr, NULL, &seen_at[d]);
5182 break;
5183
6de9cd9a 5184 case DECL_DIMENSION:
231b2fcc 5185 t = gfc_add_dimension (&current_attr, NULL, &seen_at[d]);
6de9cd9a
DN
5186 break;
5187
5188 case DECL_EXTERNAL:
5189 t = gfc_add_external (&current_attr, &seen_at[d]);
5190 break;
5191
5192 case DECL_IN:
5193 t = gfc_add_intent (&current_attr, INTENT_IN, &seen_at[d]);
5194 break;
5195
5196 case DECL_OUT:
5197 t = gfc_add_intent (&current_attr, INTENT_OUT, &seen_at[d]);
5198 break;
5199
5200 case DECL_INOUT:
5201 t = gfc_add_intent (&current_attr, INTENT_INOUT, &seen_at[d]);
5202 break;
5203
5204 case DECL_INTRINSIC:
5205 t = gfc_add_intrinsic (&current_attr, &seen_at[d]);
5206 break;
5207
5208 case DECL_OPTIONAL:
5209 t = gfc_add_optional (&current_attr, &seen_at[d]);
5210 break;
5211
5bab4c96
PT
5212 case DECL_KIND:
5213 t = gfc_add_kind (&current_attr, &seen_at[d]);
5214 break;
5215
5216 case DECL_LEN:
5217 t = gfc_add_len (&current_attr, &seen_at[d]);
5218 break;
5219
6de9cd9a 5220 case DECL_PARAMETER:
231b2fcc 5221 t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, &seen_at[d]);
6de9cd9a
DN
5222 break;
5223
5224 case DECL_POINTER:
5225 t = gfc_add_pointer (&current_attr, &seen_at[d]);
5226 break;
5227
ee7e677f 5228 case DECL_PROTECTED:
721be0f4
SK
5229 if (gfc_current_state () != COMP_MODULE
5230 || (gfc_current_ns->proc_name
5231 && gfc_current_ns->proc_name->attr.flavor != FL_MODULE))
ee7e677f
TB
5232 {
5233 gfc_error ("PROTECTED at %C only allowed in specification "
5234 "part of a module");
524af0d6 5235 t = false;
ee7e677f
TB
5236 break;
5237 }
5238
524af0d6
JB
5239 if (!gfc_notify_std (GFC_STD_F2003, "PROTECTED attribute at %C"))
5240 t = false;
ee7e677f
TB
5241 else
5242 t = gfc_add_protected (&current_attr, NULL, &seen_at[d]);
5243 break;
5244
6de9cd9a 5245 case DECL_PRIVATE:
231b2fcc
TS
5246 t = gfc_add_access (&current_attr, ACCESS_PRIVATE, NULL,
5247 &seen_at[d]);
6de9cd9a
DN
5248 break;
5249
5250 case DECL_PUBLIC:
231b2fcc
TS
5251 t = gfc_add_access (&current_attr, ACCESS_PUBLIC, NULL,
5252 &seen_at[d]);
6de9cd9a
DN
5253 break;
5254
34d567d1 5255 case DECL_STATIC:
6de9cd9a 5256 case DECL_SAVE:
80f95228 5257 t = gfc_add_save (&current_attr, SAVE_EXPLICIT, NULL, &seen_at[d]);
6de9cd9a
DN
5258 break;
5259
34d567d1
FR
5260 case DECL_AUTOMATIC:
5261 t = gfc_add_automatic (&current_attr, NULL, &seen_at[d]);
5262 break;
5263
6de9cd9a
DN
5264 case DECL_TARGET:
5265 t = gfc_add_target (&current_attr, &seen_at[d]);
5266 break;
5267
a8b3b0b6
CR
5268 case DECL_IS_BIND_C:
5269 t = gfc_add_is_bind_c(&current_attr, NULL, &seen_at[d], 0);
5270 break;
f5acf0f2 5271
06469efd 5272 case DECL_VALUE:
524af0d6
JB
5273 if (!gfc_notify_std (GFC_STD_F2003, "VALUE attribute at %C"))
5274 t = false;
06469efd
PT
5275 else
5276 t = gfc_add_value (&current_attr, NULL, &seen_at[d]);
5277 break;
5278
775e6c3a 5279 case DECL_VOLATILE:
524af0d6
JB
5280 if (!gfc_notify_std (GFC_STD_F2003, "VOLATILE attribute at %C"))
5281 t = false;
775e6c3a
TB
5282 else
5283 t = gfc_add_volatile (&current_attr, NULL, &seen_at[d]);
5284 break;
5285
6de9cd9a
DN
5286 default:
5287 gfc_internal_error ("match_attr_spec(): Bad attribute");
5288 }
5289
524af0d6 5290 if (!t)
6de9cd9a
DN
5291 {
5292 m = MATCH_ERROR;
5293 goto cleanup;
5294 }
5295 }
5296
dab2cbf8 5297 /* Since Fortran 2008 module variables implicitly have the SAVE attribute. */
4668d6f9
PT
5298 if ((gfc_current_state () == COMP_MODULE
5299 || gfc_current_state () == COMP_SUBMODULE)
5300 && !current_attr.save
dab2cbf8 5301 && (gfc_option.allow_std & GFC_STD_F2008) != 0)
80f95228
JW
5302 current_attr.save = SAVE_IMPLICIT;
5303
6de9cd9a
DN
5304 colon_seen = 1;
5305 return MATCH_YES;
5306
5307cleanup:
63645982 5308 gfc_current_locus = start;
6de9cd9a
DN
5309 gfc_free_array_spec (current_as);
5310 current_as = NULL;
6f855a26 5311 attr_seen = 0;
6de9cd9a
DN
5312 return m;
5313}
5314
5315
a8b3b0b6
CR
5316/* Set the binding label, dest_label, either with the binding label
5317 stored in the given gfc_typespec, ts, or if none was provided, it
5318 will be the symbol name in all lower case, as required by the draft
5319 (J3/04-007, section 15.4.1). If a binding label was given and
5320 there is more than one argument (num_idents), it is an error. */
5321
524af0d6 5322static bool
f5acf0f2 5323set_binding_label (const char **dest_label, const char *sym_name,
9975a30b 5324 int num_idents)
a8b3b0b6 5325{
ad4a2f64 5326 if (num_idents > 1 && has_name_equals)
a8b3b0b6 5327 {
ad4a2f64
TB
5328 gfc_error ("Multiple identifiers provided with "
5329 "single NAME= specifier at %C");
524af0d6 5330 return false;
ad4a2f64 5331 }
a8b3b0b6 5332
62603fae 5333 if (curr_binding_label)
eea58adb 5334 /* Binding label given; store in temp holder till have sym. */
62603fae 5335 *dest_label = curr_binding_label;
a8b3b0b6
CR
5336 else
5337 {
5338 /* No binding label given, and the NAME= specifier did not exist,
5339 which means there was no NAME="". */
5340 if (sym_name != NULL && has_name_equals == 0)
62603fae 5341 *dest_label = IDENTIFIER_POINTER (get_identifier (sym_name));
a8b3b0b6 5342 }
f5acf0f2 5343
524af0d6 5344 return true;
a8b3b0b6
CR
5345}
5346
5347
5348/* Set the status of the given common block as being BIND(C) or not,
5349 depending on the given parameter, is_bind_c. */
5350
5351void
5352set_com_block_bind_c (gfc_common_head *com_block, int is_bind_c)
5353{
5354 com_block->is_bind_c = is_bind_c;
5355 return;
5356}
5357
5358
5359/* Verify that the given gfc_typespec is for a C interoperable type. */
5360
524af0d6 5361bool
00820a2a 5362gfc_verify_c_interop (gfc_typespec *ts)
a8b3b0b6 5363{
bc21d315 5364 if (ts->type == BT_DERIVED && ts->u.derived != NULL)
ba3721c1 5365 return (ts->u.derived->ts.is_c_interop || ts->u.derived->attr.is_bind_c)
524af0d6 5366 ? true : false;
00820a2a 5367 else if (ts->type == BT_CLASS)
524af0d6 5368 return false;
45a69325 5369 else if (ts->is_c_interop != 1 && ts->type != BT_ASSUMED)
524af0d6 5370 return false;
45a69325 5371
524af0d6 5372 return true;
a8b3b0b6
CR
5373}
5374
5375
5376/* Verify that the variables of a given common block, which has been
5377 defined with the attribute specifier bind(c), to be of a C
5378 interoperable type. Errors will be reported here, if
5379 encountered. */
5380
524af0d6 5381bool
a8b3b0b6
CR
5382verify_com_block_vars_c_interop (gfc_common_head *com_block)
5383{
5384 gfc_symbol *curr_sym = NULL;
524af0d6 5385 bool retval = true;
a8b3b0b6
CR
5386
5387 curr_sym = com_block->head;
f5acf0f2 5388
a8b3b0b6
CR
5389 /* Make sure we have at least one symbol. */
5390 if (curr_sym == NULL)
5391 return retval;
5392
5393 /* Here we know we have a symbol, so we'll execute this loop
5394 at least once. */
5395 do
5396 {
5397 /* The second to last param, 1, says this is in a common block. */
5398 retval = verify_bind_c_sym (curr_sym, &(curr_sym->ts), 1, com_block);
5399 curr_sym = curr_sym->common_next;
f5acf0f2 5400 } while (curr_sym != NULL);
a8b3b0b6
CR
5401
5402 return retval;
5403}
5404
5405
5406/* Verify that a given BIND(C) symbol is C interoperable. If it is not,
5407 an appropriate error message is reported. */
5408
524af0d6 5409bool
a8b3b0b6
CR
5410verify_bind_c_sym (gfc_symbol *tmp_sym, gfc_typespec *ts,
5411 int is_in_common, gfc_common_head *com_block)
5412{
8327f9c2 5413 bool bind_c_function = false;
524af0d6 5414 bool retval = true;
d8fa96e0 5415
8327f9c2
TB
5416 if (tmp_sym->attr.function && tmp_sym->attr.is_bind_c)
5417 bind_c_function = true;
5418
d8fa96e0
CR
5419 if (tmp_sym->attr.function && tmp_sym->result != NULL)
5420 {
5421 tmp_sym = tmp_sym->result;
5422 /* Make sure it wasn't an implicitly typed result. */
4daa149b 5423 if (tmp_sym->attr.implicit_type && warn_c_binding_type)
d8fa96e0 5424 {
48749dbc
MLI
5425 gfc_warning (OPT_Wc_binding_type,
5426 "Implicitly declared BIND(C) function %qs at "
d8fa96e0
CR
5427 "%L may not be C interoperable", tmp_sym->name,
5428 &tmp_sym->declared_at);
5429 tmp_sym->ts.f90_type = tmp_sym->ts.type;
5430 /* Mark it as C interoperable to prevent duplicate warnings. */
5431 tmp_sym->ts.is_c_interop = 1;
5432 tmp_sym->attr.is_c_interop = 1;
5433 }
5434 }
8327f9c2 5435
a8b3b0b6
CR
5436 /* Here, we know we have the bind(c) attribute, so if we have
5437 enough type info, then verify that it's a C interop kind.
5438 The info could be in the symbol already, or possibly still in
5439 the given ts (current_ts), so look in both. */
f5acf0f2 5440 if (tmp_sym->ts.type != BT_UNKNOWN || ts->type != BT_UNKNOWN)
a8b3b0b6 5441 {
524af0d6 5442 if (!gfc_verify_c_interop (&(tmp_sym->ts)))
a8b3b0b6
CR
5443 {
5444 /* See if we're dealing with a sym in a common block or not. */
4daa149b 5445 if (is_in_common == 1 && warn_c_binding_type)
a8b3b0b6 5446 {
48749dbc
MLI
5447 gfc_warning (OPT_Wc_binding_type,
5448 "Variable %qs in common block %qs at %L "
a8b3b0b6 5449 "may not be a C interoperable "
48749dbc 5450 "kind though common block %qs is BIND(C)",
a8b3b0b6
CR
5451 tmp_sym->name, com_block->name,
5452 &(tmp_sym->declared_at), com_block->name);
5453 }
5454 else
5455 {
5456 if (tmp_sym->ts.type == BT_DERIVED || ts->type == BT_DERIVED)
c4100eae 5457 gfc_error ("Type declaration %qs at %L is not C "
a8b3b0b6
CR
5458 "interoperable but it is BIND(C)",
5459 tmp_sym->name, &(tmp_sym->declared_at));
4daa149b 5460 else if (warn_c_binding_type)
48749dbc 5461 gfc_warning (OPT_Wc_binding_type, "Variable %qs at %L "
a8b3b0b6 5462 "may not be a C interoperable "
c4100eae 5463 "kind but it is BIND(C)",
a8b3b0b6
CR
5464 tmp_sym->name, &(tmp_sym->declared_at));
5465 }
5466 }
f5acf0f2 5467
a8b3b0b6
CR
5468 /* Variables declared w/in a common block can't be bind(c)
5469 since there's no way for C to see these variables, so there's
5470 semantically no reason for the attribute. */
5471 if (is_in_common == 1 && tmp_sym->attr.is_bind_c == 1)
5472 {
c4100eae 5473 gfc_error ("Variable %qs in common block %qs at "
a8b3b0b6
CR
5474 "%L cannot be declared with BIND(C) "
5475 "since it is not a global",
5476 tmp_sym->name, com_block->name,
5477 &(tmp_sym->declared_at));
524af0d6 5478 retval = false;
a8b3b0b6 5479 }
f5acf0f2 5480
a8b3b0b6
CR
5481 /* Scalar variables that are bind(c) can not have the pointer
5482 or allocatable attributes. */
5483 if (tmp_sym->attr.is_bind_c == 1)
5484 {
5485 if (tmp_sym->attr.pointer == 1)
5486 {
c4100eae 5487 gfc_error ("Variable %qs at %L cannot have both the "
a8b3b0b6
CR
5488 "POINTER and BIND(C) attributes",
5489 tmp_sym->name, &(tmp_sym->declared_at));
524af0d6 5490 retval = false;
a8b3b0b6
CR
5491 }
5492
5493 if (tmp_sym->attr.allocatable == 1)
5494 {
c4100eae 5495 gfc_error ("Variable %qs at %L cannot have both the "
a8b3b0b6
CR
5496 "ALLOCATABLE and BIND(C) attributes",
5497 tmp_sym->name, &(tmp_sym->declared_at));
524af0d6 5498 retval = false;
a8b3b0b6
CR
5499 }
5500
8327f9c2
TB
5501 }
5502
5503 /* If it is a BIND(C) function, make sure the return value is a
5504 scalar value. The previous tests in this function made sure
5505 the type is interoperable. */
5506 if (bind_c_function && tmp_sym->as != NULL)
c4100eae 5507 gfc_error ("Return type of BIND(C) function %qs at %L cannot "
8327f9c2
TB
5508 "be an array", tmp_sym->name, &(tmp_sym->declared_at));
5509
5510 /* BIND(C) functions can not return a character string. */
5511 if (bind_c_function && tmp_sym->ts.type == BT_CHARACTER)
bc21d315
JW
5512 if (tmp_sym->ts.u.cl == NULL || tmp_sym->ts.u.cl->length == NULL
5513 || tmp_sym->ts.u.cl->length->expr_type != EXPR_CONSTANT
5514 || mpz_cmp_si (tmp_sym->ts.u.cl->length->value.integer, 1) != 0)
c4100eae 5515 gfc_error ("Return type of BIND(C) function %qs at %L cannot "
a8b3b0b6
CR
5516 "be a character string", tmp_sym->name,
5517 &(tmp_sym->declared_at));
a8b3b0b6
CR
5518 }
5519
5520 /* See if the symbol has been marked as private. If it has, make sure
5521 there is no binding label and warn the user if there is one. */
5522 if (tmp_sym->attr.access == ACCESS_PRIVATE
62603fae 5523 && tmp_sym->binding_label)
a8b3b0b6
CR
5524 /* Use gfc_warning_now because we won't say that the symbol fails
5525 just because of this. */
db30e21c 5526 gfc_warning_now (0, "Symbol %qs at %L is marked PRIVATE but has been "
4daa149b 5527 "given the binding label %qs", tmp_sym->name,
a8b3b0b6
CR
5528 &(tmp_sym->declared_at), tmp_sym->binding_label);
5529
5530 return retval;
5531}
5532
5533
5534/* Set the appropriate fields for a symbol that's been declared as
5535 BIND(C) (the is_bind_c flag and the binding label), and verify that
5536 the type is C interoperable. Errors are reported by the functions
5537 used to set/test these fields. */
5538
524af0d6 5539bool
a8b3b0b6
CR
5540set_verify_bind_c_sym (gfc_symbol *tmp_sym, int num_idents)
5541{
524af0d6 5542 bool retval = true;
f5acf0f2 5543
a8b3b0b6
CR
5544 /* TODO: Do we need to make sure the vars aren't marked private? */
5545
5546 /* Set the is_bind_c bit in symbol_attribute. */
5547 gfc_add_is_bind_c (&(tmp_sym->attr), tmp_sym->name, &gfc_current_locus, 0);
5548
524af0d6
JB
5549 if (!set_binding_label (&tmp_sym->binding_label, tmp_sym->name, num_idents))
5550 return false;
a8b3b0b6
CR
5551
5552 return retval;
5553}
5554
5555
5556/* Set the fields marking the given common block as BIND(C), including
5557 a binding label, and report any errors encountered. */
5558
524af0d6 5559bool
a8b3b0b6
CR
5560set_verify_bind_c_com_block (gfc_common_head *com_block, int num_idents)
5561{
524af0d6 5562 bool retval = true;
f5acf0f2 5563
a8b3b0b6 5564 /* destLabel, common name, typespec (which may have binding label). */
70112e2a 5565 if (!set_binding_label (&com_block->binding_label, com_block->name,
524af0d6
JB
5566 num_idents))
5567 return false;
a8b3b0b6
CR
5568
5569 /* Set the given common block (com_block) to being bind(c) (1). */
5570 set_com_block_bind_c (com_block, 1);
5571
5572 return retval;
5573}
5574
5575
5576/* Retrieve the list of one or more identifiers that the given bind(c)
5577 attribute applies to. */
5578
524af0d6 5579bool
a8b3b0b6
CR
5580get_bind_c_idents (void)
5581{
5582 char name[GFC_MAX_SYMBOL_LEN + 1];
5583 int num_idents = 0;
5584 gfc_symbol *tmp_sym = NULL;
5585 match found_id;
5586 gfc_common_head *com_block = NULL;
f5acf0f2 5587
a8b3b0b6
CR
5588 if (gfc_match_name (name) == MATCH_YES)
5589 {
5590 found_id = MATCH_YES;
5591 gfc_get_ha_symbol (name, &tmp_sym);
5592 }
5593 else if (match_common_name (name) == MATCH_YES)
5594 {
5595 found_id = MATCH_YES;
5596 com_block = gfc_get_common (name, 0);
5597 }
5598 else
5599 {
5600 gfc_error ("Need either entity or common block name for "
5601 "attribute specification statement at %C");
524af0d6 5602 return false;
a8b3b0b6 5603 }
f5acf0f2 5604
a8b3b0b6
CR
5605 /* Save the current identifier and look for more. */
5606 do
5607 {
5608 /* Increment the number of identifiers found for this spec stmt. */
5609 num_idents++;
5610
5611 /* Make sure we have a sym or com block, and verify that it can
5612 be bind(c). Set the appropriate field(s) and look for more
5613 identifiers. */
f5acf0f2 5614 if (tmp_sym != NULL || com_block != NULL)
a8b3b0b6
CR
5615 {
5616 if (tmp_sym != NULL)
5617 {
524af0d6
JB
5618 if (!set_verify_bind_c_sym (tmp_sym, num_idents))
5619 return false;
a8b3b0b6
CR
5620 }
5621 else
5622 {
524af0d6
JB
5623 if (!set_verify_bind_c_com_block (com_block, num_idents))
5624 return false;
a8b3b0b6 5625 }
f5acf0f2 5626
a8b3b0b6
CR
5627 /* Look to see if we have another identifier. */
5628 tmp_sym = NULL;
5629 if (gfc_match_eos () == MATCH_YES)
5630 found_id = MATCH_NO;
5631 else if (gfc_match_char (',') != MATCH_YES)
5632 found_id = MATCH_NO;
5633 else if (gfc_match_name (name) == MATCH_YES)
5634 {
5635 found_id = MATCH_YES;
5636 gfc_get_ha_symbol (name, &tmp_sym);
5637 }
5638 else if (match_common_name (name) == MATCH_YES)
5639 {
5640 found_id = MATCH_YES;
5641 com_block = gfc_get_common (name, 0);
5642 }
5643 else
5644 {
5645 gfc_error ("Missing entity or common block name for "
5646 "attribute specification statement at %C");
524af0d6 5647 return false;
a8b3b0b6
CR
5648 }
5649 }
5650 else
5651 {
5652 gfc_internal_error ("Missing symbol");
5653 }
5654 } while (found_id == MATCH_YES);
5655
5656 /* if we get here we were successful */
524af0d6 5657 return true;
a8b3b0b6
CR
5658}
5659
5660
5661/* Try and match a BIND(C) attribute specification statement. */
f5acf0f2 5662
a8b3b0b6
CR
5663match
5664gfc_match_bind_c_stmt (void)
5665{
5666 match found_match = MATCH_NO;
5667 gfc_typespec *ts;
5668
5669 ts = &current_ts;
f5acf0f2 5670
a8b3b0b6
CR
5671 /* This may not be necessary. */
5672 gfc_clear_ts (ts);
5673 /* Clear the temporary binding label holder. */
62603fae 5674 curr_binding_label = NULL;
a8b3b0b6
CR
5675
5676 /* Look for the bind(c). */
1eabf70a 5677 found_match = gfc_match_bind_c (NULL, true);
a8b3b0b6
CR
5678
5679 if (found_match == MATCH_YES)
5680 {
878cdb7b
TB
5681 if (!gfc_notify_std (GFC_STD_F2003, "BIND(C) statement at %C"))
5682 return MATCH_ERROR;
5683
a8b3b0b6
CR
5684 /* Look for the :: now, but it is not required. */
5685 gfc_match (" :: ");
5686
5687 /* Get the identifier(s) that needs to be updated. This may need to
5688 change to hand the flag(s) for the attr specified so all identifiers
5689 found can have all appropriate parts updated (assuming that the same
5690 spec stmt can have multiple attrs, such as both bind(c) and
5691 allocatable...). */
524af0d6 5692 if (!get_bind_c_idents ())
a8b3b0b6
CR
5693 /* Error message should have printed already. */
5694 return MATCH_ERROR;
5695 }
5696
5697 return found_match;
5698}
5699
5700
6de9cd9a
DN
5701/* Match a data declaration statement. */
5702
5703match
5704gfc_match_data_decl (void)
5705{
5706 gfc_symbol *sym;
5707 match m;
949d5b72 5708 int elem;
6de9cd9a 5709
5bab4c96
PT
5710 type_param_spec_list = NULL;
5711 decl_type_param_list = NULL;
5712
a8b3b0b6 5713 num_idents_on_line = 0;
f5acf0f2 5714
e74f1cc8 5715 m = gfc_match_decl_type_spec (&current_ts, 0);
6de9cd9a
DN
5716 if (m != MATCH_YES)
5717 return m;
5718
2e23972e 5719 if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
f6288c24 5720 && !gfc_comp_struct (gfc_current_state ()))
6de9cd9a 5721 {
bc21d315 5722 sym = gfc_use_derived (current_ts.u.derived);
6de9cd9a
DN
5723
5724 if (sym == NULL)
5725 {
5726 m = MATCH_ERROR;
5727 goto cleanup;
5728 }
5729
bc21d315 5730 current_ts.u.derived = sym;
6de9cd9a
DN
5731 }
5732
5733 m = match_attr_spec ();
5734 if (m == MATCH_ERROR)
5735 {
5736 m = MATCH_NO;
5737 goto cleanup;
5738 }
5739
8b704316
PT
5740 if (current_ts.type == BT_CLASS
5741 && current_ts.u.derived->attr.unlimited_polymorphic)
5742 goto ok;
5743
2e23972e
JW
5744 if ((current_ts.type == BT_DERIVED || current_ts.type == BT_CLASS)
5745 && current_ts.u.derived->components == NULL
bc21d315 5746 && !current_ts.u.derived->attr.zero_comp)
6de9cd9a
DN
5747 {
5748
f6288c24 5749 if (current_attr.pointer && gfc_comp_struct (gfc_current_state ()))
6de9cd9a
DN
5750 goto ok;
5751
bf9f15ee
PT
5752 if (current_attr.allocatable && gfc_current_state () == COMP_DERIVED
5753 && current_ts.u.derived == gfc_current_block ())
5754 goto ok;
5755
bc21d315 5756 gfc_find_symbol (current_ts.u.derived->name,
dd8b9dde 5757 current_ts.u.derived->ns, 1, &sym);
6de9cd9a 5758
976e21f6 5759 /* Any symbol that we find had better be a type definition
f6288c24
FR
5760 which has its components defined, or be a structure definition
5761 actively being parsed. */
5762 if (sym != NULL && gfc_fl_struct (sym->attr.flavor)
bc21d315 5763 && (current_ts.u.derived->components != NULL
f6288c24
FR
5764 || current_ts.u.derived->attr.zero_comp
5765 || current_ts.u.derived == gfc_new_block))
6de9cd9a
DN
5766 goto ok;
5767
a1b80ec7
JW
5768 gfc_error ("Derived type at %C has not been previously defined "
5769 "and so cannot appear in a derived type definition");
5770 m = MATCH_ERROR;
5771 goto cleanup;
6de9cd9a
DN
5772 }
5773
5774ok:
5775 /* If we have an old-style character declaration, and no new-style
5776 attribute specifications, then there a comma is optional between
5777 the type specification and the variable list. */
5778 if (m == MATCH_NO && current_ts.type == BT_CHARACTER && old_char_selector)
5779 gfc_match_char (',');
5780
949d5b72
PT
5781 /* Give the types/attributes to symbols that follow. Give the element
5782 a number so that repeat character length expressions can be copied. */
5783 elem = 1;
6de9cd9a
DN
5784 for (;;)
5785 {
a8b3b0b6 5786 num_idents_on_line++;
949d5b72 5787 m = variable_decl (elem++);
6de9cd9a
DN
5788 if (m == MATCH_ERROR)
5789 goto cleanup;
5790 if (m == MATCH_NO)
5791 break;
5792
5793 if (gfc_match_eos () == MATCH_YES)
5794 goto cleanup;
5795 if (gfc_match_char (',') != MATCH_YES)
5796 break;
5797 }
5798
0f447a6e 5799 if (!gfc_error_flag_test ())
94903212
FR
5800 {
5801 /* An anonymous structure declaration is unambiguous; if we matched one
5802 according to gfc_match_structure_decl, we need to return MATCH_YES
5803 here to avoid confusing the remaining matchers, even if there was an
5804 error during variable_decl. We must flush any such errors. Note this
5805 causes the parser to gracefully continue parsing the remaining input
5806 as a structure body, which likely follows. */
5807 if (current_ts.type == BT_DERIVED && current_ts.u.derived
5808 && gfc_fl_struct (current_ts.u.derived->attr.flavor))
5809 {
5810 gfc_error_now ("Syntax error in anonymous structure declaration"
5811 " at %C");
5812 /* Skip the bad variable_decl and line up for the start of the
5813 structure body. */
5814 gfc_error_recovery ();
5815 m = MATCH_YES;
5816 goto cleanup;
5817 }
5818
5819 gfc_error ("Syntax error in data declaration at %C");
5820 }
5821
6de9cd9a
DN
5822 m = MATCH_ERROR;
5823
a9f6f1f2
JD
5824 gfc_free_data_all (gfc_current_ns);
5825
6de9cd9a 5826cleanup:
5bab4c96
PT
5827 if (saved_kind_expr)
5828 gfc_free_expr (saved_kind_expr);
5829 if (type_param_spec_list)
5830 gfc_free_actual_arglist (type_param_spec_list);
5831 if (decl_type_param_list)
5832 gfc_free_actual_arglist (decl_type_param_list);
5833 saved_kind_expr = NULL;
6de9cd9a
DN
5834 gfc_free_array_spec (current_as);
5835 current_as = NULL;
5836 return m;
5837}
5838
5839
5840/* Match a prefix associated with a function or subroutine
5841 declaration. If the typespec pointer is nonnull, then a typespec
5842 can be matched. Note that if nothing matches, MATCH_YES is
5843 returned (the null string was matched). */
5844
1c8bcdf7
PT
5845match
5846gfc_match_prefix (gfc_typespec *ts)
6de9cd9a 5847{
7389bce6 5848 bool seen_type;
e6c14898
DK
5849 bool seen_impure;
5850 bool found_prefix;
6de9cd9a
DN
5851
5852 gfc_clear_attr (&current_attr);
e6c14898
DK
5853 seen_type = false;
5854 seen_impure = false;
6de9cd9a 5855
3df684e2
DK
5856 gcc_assert (!gfc_matching_prefix);
5857 gfc_matching_prefix = true;
f37e928c 5858
e6c14898 5859 do
6de9cd9a 5860 {
e6c14898 5861 found_prefix = false;
6de9cd9a 5862
70112e2a
PT
5863 /* MODULE is a prefix like PURE, ELEMENTAL, etc., having a
5864 corresponding attribute seems natural and distinguishes these
5865 procedures from procedure types of PROC_MODULE, which these are
5866 as well. */
5867 if (gfc_match ("module% ") == MATCH_YES)
5868 {
5869 if (!gfc_notify_std (GFC_STD_F2008, "MODULE prefix at %C"))
5870 goto error;
5871
5872 current_attr.module_procedure = 1;
5873 found_prefix = true;
5874 }
5875
e6c14898
DK
5876 if (!seen_type && ts != NULL
5877 && gfc_match_decl_type_spec (ts, 0) == MATCH_YES
5878 && gfc_match_space () == MATCH_YES)
5879 {
6de9cd9a 5880
e6c14898
DK
5881 seen_type = true;
5882 found_prefix = true;
5883 }
5884
5885 if (gfc_match ("elemental% ") == MATCH_YES)
5886 {
524af0d6 5887 if (!gfc_add_elemental (&current_attr, NULL))
e6c14898
DK
5888 goto error;
5889
5890 found_prefix = true;
5891 }
5892
5893 if (gfc_match ("pure% ") == MATCH_YES)
5894 {
524af0d6 5895 if (!gfc_add_pure (&current_attr, NULL))
e6c14898
DK
5896 goto error;
5897
5898 found_prefix = true;
5899 }
6de9cd9a 5900
e6c14898
DK
5901 if (gfc_match ("recursive% ") == MATCH_YES)
5902 {
524af0d6 5903 if (!gfc_add_recursive (&current_attr, NULL))
e6c14898
DK
5904 goto error;
5905
5906 found_prefix = true;
5907 }
5908
5909 /* IMPURE is a somewhat special case, as it needs not set an actual
5910 attribute but rather only prevents ELEMENTAL routines from being
5911 automatically PURE. */
5912 if (gfc_match ("impure% ") == MATCH_YES)
5913 {
524af0d6 5914 if (!gfc_notify_std (GFC_STD_F2008, "IMPURE procedure at %C"))
e6c14898
DK
5915 goto error;
5916
5917 seen_impure = true;
5918 found_prefix = true;
5919 }
6de9cd9a 5920 }
e6c14898 5921 while (found_prefix);
6de9cd9a 5922
e6c14898
DK
5923 /* IMPURE and PURE must not both appear, of course. */
5924 if (seen_impure && current_attr.pure)
6de9cd9a 5925 {
e6c14898
DK
5926 gfc_error ("PURE and IMPURE must not appear both at %C");
5927 goto error;
6de9cd9a
DN
5928 }
5929
e6c14898
DK
5930 /* If IMPURE it not seen but the procedure is ELEMENTAL, mark it as PURE. */
5931 if (!seen_impure && current_attr.elemental && !current_attr.pure)
6de9cd9a 5932 {
524af0d6 5933 if (!gfc_add_pure (&current_attr, NULL))
f37e928c 5934 goto error;
6de9cd9a
DN
5935 }
5936
5937 /* At this point, the next item is not a prefix. */
3df684e2 5938 gcc_assert (gfc_matching_prefix);
4668d6f9 5939
3df684e2 5940 gfc_matching_prefix = false;
6de9cd9a 5941 return MATCH_YES;
f37e928c
DK
5942
5943error:
3df684e2
DK
5944 gcc_assert (gfc_matching_prefix);
5945 gfc_matching_prefix = false;
f37e928c 5946 return MATCH_ERROR;
6de9cd9a
DN
5947}
5948
5949
1c8bcdf7 5950/* Copy attributes matched by gfc_match_prefix() to attributes on a symbol. */
6de9cd9a 5951
524af0d6 5952static bool
636dff67 5953copy_prefix (symbol_attribute *dest, locus *where)
6de9cd9a 5954{
6442a6f4
PT
5955 if (dest->module_procedure)
5956 {
5957 if (current_attr.elemental)
5958 dest->elemental = 1;
5959
5960 if (current_attr.pure)
5961 dest->pure = 1;
5962
5963 if (current_attr.recursive)
5964 dest->recursive = 1;
5965
5966 /* Module procedures are unusual in that the 'dest' is copied from
5967 the interface declaration. However, this is an oportunity to
5968 check that the submodule declaration is compliant with the
5969 interface. */
5970 if (dest->elemental && !current_attr.elemental)
5971 {
5972 gfc_error ("ELEMENTAL prefix in MODULE PROCEDURE interface is "
5973 "missing at %L", where);
5974 return false;
5975 }
5976
5977 if (dest->pure && !current_attr.pure)
5978 {
5979 gfc_error ("PURE prefix in MODULE PROCEDURE interface is "
5980 "missing at %L", where);
5981 return false;
5982 }
5983
5984 if (dest->recursive && !current_attr.recursive)
5985 {
5986 gfc_error ("RECURSIVE prefix in MODULE PROCEDURE interface is "
5987 "missing at %L", where);
5988 return false;
5989 }
5990
5991 return true;
5992 }
6de9cd9a 5993
524af0d6
JB
5994 if (current_attr.elemental && !gfc_add_elemental (dest, where))
5995 return false;
6de9cd9a 5996
6442a6f4
PT
5997 if (current_attr.pure && !gfc_add_pure (dest, where))
5998 return false;
5999
524af0d6
JB
6000 if (current_attr.recursive && !gfc_add_recursive (dest, where))
6001 return false;
6de9cd9a 6002
524af0d6 6003 return true;
6de9cd9a
DN
6004}
6005
6006
5bab4c96
PT
6007/* Match a formal argument list or, if typeparam is true, a
6008 type_param_name_list. */
6de9cd9a
DN
6009
6010match
5bab4c96
PT
6011gfc_match_formal_arglist (gfc_symbol *progname, int st_flag,
6012 int null_flag, bool typeparam)
6de9cd9a
DN
6013{
6014 gfc_formal_arglist *head, *tail, *p, *q;
6015 char name[GFC_MAX_SYMBOL_LEN + 1];
6016 gfc_symbol *sym;
6017 match m;
4668d6f9 6018 gfc_formal_arglist *formal = NULL;
6de9cd9a
DN
6019
6020 head = tail = NULL;
6021
4668d6f9
PT
6022 /* Keep the interface formal argument list and null it so that the
6023 matching for the new declaration can be done. The numbers and
6024 names of the arguments are checked here. The interface formal
6025 arguments are retained in formal_arglist and the characteristics
6026 are compared in resolve.c(resolve_fl_procedure). See the remark
6027 in get_proc_name about the eventual need to copy the formal_arglist
6028 and populate the formal namespace of the interface symbol. */
6029 if (progname->attr.module_procedure
6030 && progname->attr.host_assoc)
6031 {
6032 formal = progname->formal;
6033 progname->formal = NULL;
6034 }
6035
6de9cd9a
DN
6036 if (gfc_match_char ('(') != MATCH_YES)
6037 {
6038 if (null_flag)
6039 goto ok;
6040 return MATCH_NO;
6041 }
6042
6043 if (gfc_match_char (')') == MATCH_YES)
6044 goto ok;
6045
6046 for (;;)
6047 {
6048 if (gfc_match_char ('*') == MATCH_YES)
9362a03b
JW
6049 {
6050 sym = NULL;
276515e6
PT
6051 if (!typeparam && !gfc_notify_std (GFC_STD_F95_OBS,
6052 "Alternate-return argument at %C"))
9362a03b
JW
6053 {
6054 m = MATCH_ERROR;
6055 goto cleanup;
6056 }
276515e6
PT
6057 else if (typeparam)
6058 gfc_error_now ("A parameter name is required at %C");
9362a03b 6059 }
6de9cd9a
DN
6060 else
6061 {
6062 m = gfc_match_name (name);
6063 if (m != MATCH_YES)
276515e6
PT
6064 {
6065 if(typeparam)
6066 gfc_error_now ("A parameter name is required at %C");
6067 goto cleanup;
6068 }
6de9cd9a 6069
5bab4c96
PT
6070 if (!typeparam && gfc_get_symbol (name, NULL, &sym))
6071 goto cleanup;
6072 else if (typeparam
6073 && gfc_get_symbol (name, progname->f2k_derived, &sym))
6de9cd9a
DN
6074 goto cleanup;
6075 }
6076
6077 p = gfc_get_formal_arglist ();
6078
6079 if (head == NULL)
6080 head = tail = p;
6081 else
6082 {
6083 tail->next = p;
6084 tail = p;
6085 }
6086
6087 tail->sym = sym;
6088
6089 /* We don't add the VARIABLE flavor because the name could be a
636dff67
SK
6090 dummy procedure. We don't apply these attributes to formal
6091 arguments of statement functions. */
6de9cd9a 6092 if (sym != NULL && !st_flag
524af0d6
JB
6093 && (!gfc_add_dummy(&sym->attr, sym->name, NULL)
6094 || !gfc_missing_attr (&sym->attr, NULL)))
6de9cd9a
DN
6095 {
6096 m = MATCH_ERROR;
6097 goto cleanup;
6098 }
6099
6100 /* The name of a program unit can be in a different namespace,
636dff67
SK
6101 so check for it explicitly. After the statement is accepted,
6102 the name is checked for especially in gfc_get_symbol(). */
de624bee 6103 if (gfc_new_block != NULL && sym != NULL && !typeparam
6de9cd9a
DN
6104 && strcmp (sym->name, gfc_new_block->name) == 0)
6105 {
c4100eae 6106 gfc_error ("Name %qs at %C is the name of the procedure",
6de9cd9a
DN
6107 sym->name);
6108 m = MATCH_ERROR;
6109 goto cleanup;
6110 }
6111
6112 if (gfc_match_char (')') == MATCH_YES)
6113 goto ok;
6114
6115 m = gfc_match_char (',');
6116 if (m != MATCH_YES)
6117 {
de624bee
PT
6118 if (typeparam)
6119 gfc_error_now ("Expected parameter list in type declaration "
6120 "at %C");
6121 else
6122 gfc_error ("Unexpected junk in formal argument list at %C");
6de9cd9a
DN
6123 goto cleanup;
6124 }
6125 }
6126
6127ok:
6128 /* Check for duplicate symbols in the formal argument list. */
6129 if (head != NULL)
6130 {
6131 for (p = head; p->next; p = p->next)
6132 {
6133 if (p->sym == NULL)
6134 continue;
6135
6136 for (q = p->next; q; q = q->next)
6137 if (p->sym == q->sym)
6138 {
de624bee
PT
6139 if (typeparam)
6140 gfc_error_now ("Duplicate name %qs in parameter "
6141 "list at %C", p->sym->name);
6142 else
6143 gfc_error ("Duplicate symbol %qs in formal argument "
6144 "list at %C", p->sym->name);
6de9cd9a
DN
6145
6146 m = MATCH_ERROR;
6147 goto cleanup;
6148 }
6149 }
6150 }
6151
524af0d6 6152 if (!gfc_add_explicit_interface (progname, IFSRC_DECL, head, NULL))
6de9cd9a
DN
6153 {
6154 m = MATCH_ERROR;
6155 goto cleanup;
6156 }
6157
e9d9b48d
PT
6158 /* gfc_error_now used in following and return with MATCH_YES because
6159 doing otherwise results in a cascade of extraneous errors and in
6160 some cases an ICE in symbol.c(gfc_release_symbol). */
0ef5fbc1 6161 if (progname->attr.module_procedure && progname->attr.host_assoc)
4668d6f9 6162 {
0ef5fbc1
PT
6163 bool arg_count_mismatch = false;
6164
6165 if (!formal && head)
6166 arg_count_mismatch = true;
6167
6168 /* Abbreviated module procedure declaration is not meant to have any
6169 formal arguments! */
e9d9b48d 6170 if (!progname->abr_modproc_decl && formal && !head)
0ef5fbc1
PT
6171 arg_count_mismatch = true;
6172
4668d6f9
PT
6173 for (p = formal, q = head; p && q; p = p->next, q = q->next)
6174 {
6175 if ((p->next != NULL && q->next == NULL)
6176 || (p->next == NULL && q->next != NULL))
0ef5fbc1 6177 arg_count_mismatch = true;
4668d6f9
PT
6178 else if ((p->sym == NULL && q->sym == NULL)
6179 || strcmp (p->sym->name, q->sym->name) == 0)
6180 continue;
6181 else
6182 gfc_error_now ("Mismatch in MODULE PROCEDURE formal "
6183 "argument names (%s/%s) at %C",
6184 p->sym->name, q->sym->name);
6185 }
0ef5fbc1
PT
6186
6187 if (arg_count_mismatch)
6188 gfc_error_now ("Mismatch in number of MODULE PROCEDURE "
6189 "formal arguments at %C");
4668d6f9
PT
6190 }
6191
6de9cd9a
DN
6192 return MATCH_YES;
6193
6194cleanup:
6195 gfc_free_formal_arglist (head);
6196 return m;
6197}
6198
6199
6200/* Match a RESULT specification following a function declaration or
6201 ENTRY statement. Also matches the end-of-statement. */
6202
6203static match
66e4ab31 6204match_result (gfc_symbol *function, gfc_symbol **result)
6de9cd9a
DN
6205{
6206 char name[GFC_MAX_SYMBOL_LEN + 1];
6207 gfc_symbol *r;
6208 match m;
6209
6210 if (gfc_match (" result (") != MATCH_YES)
6211 return MATCH_NO;
6212
6213 m = gfc_match_name (name);
6214 if (m != MATCH_YES)
6215 return m;
6216
a8b3b0b6
CR
6217 /* Get the right paren, and that's it because there could be the
6218 bind(c) attribute after the result clause. */
524af0d6 6219 if (gfc_match_char (')') != MATCH_YES)
6de9cd9a 6220 {
a8b3b0b6 6221 /* TODO: should report the missing right paren here. */
6de9cd9a
DN
6222 return MATCH_ERROR;
6223 }
6224
6225 if (strcmp (function->name, name) == 0)
6226 {
636dff67 6227 gfc_error ("RESULT variable at %C must be different than function name");
6de9cd9a
DN
6228 return MATCH_ERROR;
6229 }
6230
6231 if (gfc_get_symbol (name, NULL, &r))
6232 return MATCH_ERROR;
6233
524af0d6 6234 if (!gfc_add_result (&r->attr, r->name, NULL))
6de9cd9a
DN
6235 return MATCH_ERROR;
6236
6237 *result = r;
6238
6239 return MATCH_YES;
6240}
6241
6242
a8b3b0b6
CR
6243/* Match a function suffix, which could be a combination of a result
6244 clause and BIND(C), either one, or neither. The draft does not
6245 require them to come in a specific order. */
6246
6247match
6248gfc_match_suffix (gfc_symbol *sym, gfc_symbol **result)
6249{
6250 match is_bind_c; /* Found bind(c). */
6251 match is_result; /* Found result clause. */
6252 match found_match; /* Status of whether we've found a good match. */
8fc541d3 6253 char peek_char; /* Character we're going to peek at. */
1eabf70a 6254 bool allow_binding_name;
a8b3b0b6
CR
6255
6256 /* Initialize to having found nothing. */
6257 found_match = MATCH_NO;
f5acf0f2 6258 is_bind_c = MATCH_NO;
a8b3b0b6
CR
6259 is_result = MATCH_NO;
6260
6261 /* Get the next char to narrow between result and bind(c). */
6262 gfc_gobble_whitespace ();
8fc541d3 6263 peek_char = gfc_peek_ascii_char ();
a8b3b0b6 6264
1eabf70a
TB
6265 /* C binding names are not allowed for internal procedures. */
6266 if (gfc_current_state () == COMP_CONTAINS
6267 && sym->ns->proc_name->attr.flavor != FL_MODULE)
6268 allow_binding_name = false;
6269 else
6270 allow_binding_name = true;
6271
a8b3b0b6
CR
6272 switch (peek_char)
6273 {
6274 case 'r':
6275 /* Look for result clause. */
6276 is_result = match_result (sym, result);
6277 if (is_result == MATCH_YES)
6278 {
6279 /* Now see if there is a bind(c) after it. */
1eabf70a 6280 is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
a8b3b0b6
CR
6281 /* We've found the result clause and possibly bind(c). */
6282 found_match = MATCH_YES;
6283 }
6284 else
6285 /* This should only be MATCH_ERROR. */
f5acf0f2 6286 found_match = is_result;
a8b3b0b6
CR
6287 break;
6288 case 'b':
6289 /* Look for bind(c) first. */
1eabf70a 6290 is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
a8b3b0b6
CR
6291 if (is_bind_c == MATCH_YES)
6292 {
6293 /* Now see if a result clause followed it. */
6294 is_result = match_result (sym, result);
6295 found_match = MATCH_YES;
6296 }
6297 else
6298 {
6299 /* Should only be a MATCH_ERROR if we get here after seeing 'b'. */
6300 found_match = MATCH_ERROR;
6301 }
6302 break;
6303 default:
6304 gfc_error ("Unexpected junk after function declaration at %C");
6305 found_match = MATCH_ERROR;
6306 break;
6307 }
6308
a8b3b0b6 6309 if (is_bind_c == MATCH_YES)
01f4fff1 6310 {
1eabf70a 6311 /* Fortran 2008 draft allows BIND(C) for internal procedures. */
01f4fff1 6312 if (gfc_current_state () == COMP_CONTAINS
1eabf70a 6313 && sym->ns->proc_name->attr.flavor != FL_MODULE
524af0d6
JB
6314 && !gfc_notify_std (GFC_STD_F2008, "BIND(C) attribute "
6315 "at %L may not be specified for an internal "
6316 "procedure", &gfc_current_locus))
1eabf70a
TB
6317 return MATCH_ERROR;
6318
524af0d6 6319 if (!gfc_add_is_bind_c (&(sym->attr), sym->name, &gfc_current_locus, 1))
01f4fff1
TB
6320 return MATCH_ERROR;
6321 }
f5acf0f2 6322
a8b3b0b6
CR
6323 return found_match;
6324}
6325
6326
3070bab4
JW
6327/* Procedure pointer return value without RESULT statement:
6328 Add "hidden" result variable named "ppr@". */
6329
524af0d6 6330static bool
3070bab4
JW
6331add_hidden_procptr_result (gfc_symbol *sym)
6332{
6333 bool case1,case2;
6334
6335 if (gfc_notification_std (GFC_STD_F2003) == ERROR)
524af0d6 6336 return false;
3070bab4
JW
6337
6338 /* First usage case: PROCEDURE and EXTERNAL statements. */
6339 case1 = gfc_current_state () == COMP_FUNCTION && gfc_current_block ()
6340 && strcmp (gfc_current_block ()->name, sym->name) == 0
6341 && sym->attr.external;
6342 /* Second usage case: INTERFACE statements. */
6343 case2 = gfc_current_state () == COMP_INTERFACE && gfc_state_stack->previous
6344 && gfc_state_stack->previous->state == COMP_FUNCTION
6345 && strcmp (gfc_state_stack->previous->sym->name, sym->name) == 0;
6346
6347 if (case1 || case2)
6348 {
6349 gfc_symtree *stree;
6350 if (case1)
08a6b8e0 6351 gfc_get_sym_tree ("ppr@", gfc_current_ns, &stree, false);
3070bab4 6352 else if (case2)
c73b6478
JW
6353 {
6354 gfc_symtree *st2;
08a6b8e0 6355 gfc_get_sym_tree ("ppr@", gfc_current_ns->parent, &stree, false);
c73b6478
JW
6356 st2 = gfc_new_symtree (&gfc_current_ns->sym_root, "ppr@");
6357 st2->n.sym = stree->n.sym;
8c0f9dab 6358 stree->n.sym->refs++;
c73b6478 6359 }
3070bab4
JW
6360 sym->result = stree->n.sym;
6361
6362 sym->result->attr.proc_pointer = sym->attr.proc_pointer;
6363 sym->result->attr.pointer = sym->attr.pointer;
6364 sym->result->attr.external = sym->attr.external;
6365 sym->result->attr.referenced = sym->attr.referenced;
fc9c6e5d 6366 sym->result->ts = sym->ts;
3070bab4
JW
6367 sym->attr.proc_pointer = 0;
6368 sym->attr.pointer = 0;
6369 sym->attr.external = 0;
6370 if (sym->result->attr.external && sym->result->attr.pointer)
6371 {
6372 sym->result->attr.pointer = 0;
6373 sym->result->attr.proc_pointer = 1;
6374 }
6375
6376 return gfc_add_result (&sym->result->attr, sym->result->name, NULL);
6377 }
6378 /* POINTER after PROCEDURE/EXTERNAL/INTERFACE statement. */
6379 else if (sym->attr.function && !sym->attr.external && sym->attr.pointer
6380 && sym->result && sym->result != sym && sym->result->attr.external
6381 && sym == gfc_current_ns->proc_name
6382 && sym == sym->result->ns->proc_name
6383 && strcmp ("ppr@", sym->result->name) == 0)
6384 {
6385 sym->result->attr.proc_pointer = 1;
6386 sym->attr.pointer = 0;
524af0d6 6387 return true;
3070bab4
JW
6388 }
6389 else
524af0d6 6390 return false;
3070bab4
JW
6391}
6392
6393
713485cc
JW
6394/* Match the interface for a PROCEDURE declaration,
6395 including brackets (R1212). */
69773742
JW
6396
6397static match
713485cc 6398match_procedure_interface (gfc_symbol **proc_if)
69773742
JW
6399{
6400 match m;
3276e0b3 6401 gfc_symtree *st;
69773742 6402 locus old_loc, entry_loc;
3276e0b3
PT
6403 gfc_namespace *old_ns = gfc_current_ns;
6404 char name[GFC_MAX_SYMBOL_LEN + 1];
69773742 6405
3276e0b3 6406 old_loc = entry_loc = gfc_current_locus;
69773742
JW
6407 gfc_clear_ts (&current_ts);
6408
6409 if (gfc_match (" (") != MATCH_YES)
6410 {
6411 gfc_current_locus = entry_loc;
6412 return MATCH_NO;
6413 }
6414
6415 /* Get the type spec. for the procedure interface. */
6416 old_loc = gfc_current_locus;
e74f1cc8 6417 m = gfc_match_decl_type_spec (&current_ts, 0);
f4256439 6418 gfc_gobble_whitespace ();
8fc541d3 6419 if (m == MATCH_YES || (m == MATCH_NO && gfc_peek_ascii_char () == ')'))
69773742
JW
6420 goto got_ts;
6421
6422 if (m == MATCH_ERROR)
6423 return m;
6424
3276e0b3 6425 /* Procedure interface is itself a procedure. */
69773742 6426 gfc_current_locus = old_loc;
3276e0b3 6427 m = gfc_match_name (name);
69773742 6428
3276e0b3
PT
6429 /* First look to see if it is already accessible in the current
6430 namespace because it is use associated or contained. */
6431 st = NULL;
6432 if (gfc_find_sym_tree (name, NULL, 0, &st))
6433 return MATCH_ERROR;
6434
6435 /* If it is still not found, then try the parent namespace, if it
6436 exists and create the symbol there if it is still not found. */
6437 if (gfc_current_ns->parent)
6438 gfc_current_ns = gfc_current_ns->parent;
6439 if (st == NULL && gfc_get_ha_sym_tree (name, &st))
6440 return MATCH_ERROR;
6441
6442 gfc_current_ns = old_ns;
6443 *proc_if = st->n.sym;
69773742 6444
713485cc 6445 if (*proc_if)
69773742 6446 {
713485cc 6447 (*proc_if)->refs++;
bb343a6c
TB
6448 /* Resolve interface if possible. That way, attr.procedure is only set
6449 if it is declared by a later procedure-declaration-stmt, which is
0e8d854e 6450 invalid per F08:C1216 (cf. resolve_procedure_interface). */
d73e0ccf
JD
6451 while ((*proc_if)->ts.interface
6452 && *proc_if != (*proc_if)->ts.interface)
713485cc 6453 *proc_if = (*proc_if)->ts.interface;
bb343a6c 6454
0e8d854e
JW
6455 if ((*proc_if)->attr.flavor == FL_UNKNOWN
6456 && (*proc_if)->ts.type == BT_UNKNOWN
70112e2a 6457 && !gfc_add_flavor (&(*proc_if)->attr, FL_PROCEDURE,
524af0d6 6458 (*proc_if)->name, NULL))
0e8d854e 6459 return MATCH_ERROR;
69773742
JW
6460 }
6461
6462got_ts:
69773742
JW
6463 if (gfc_match (" )") != MATCH_YES)
6464 {
6465 gfc_current_locus = entry_loc;
6466 return MATCH_NO;
6467 }
6468
713485cc
JW
6469 return MATCH_YES;
6470}
6471
6472
6473/* Match a PROCEDURE declaration (R1211). */
6474
6475static match
6476match_procedure_decl (void)
6477{
6478 match m;
6479 gfc_symbol *sym, *proc_if = NULL;
6480 int num;
6481 gfc_expr *initializer = NULL;
6482
1cc0e193 6483 /* Parse interface (with brackets). */
713485cc
JW
6484 m = match_procedure_interface (&proc_if);
6485 if (m != MATCH_YES)
6486 return m;
6487
6488 /* Parse attributes (with colons). */
69773742
JW
6489 m = match_attr_spec();
6490 if (m == MATCH_ERROR)
6491 return MATCH_ERROR;
6492
0859be17
TB
6493 if (proc_if && proc_if->attr.is_bind_c && !current_attr.is_bind_c)
6494 {
6495 current_attr.is_bind_c = 1;
6496 has_name_equals = 0;
6497 curr_binding_label = NULL;
6498 }
6499
69773742
JW
6500 /* Get procedure symbols. */
6501 for(num=1;;num++)
6502 {
69773742
JW
6503 m = gfc_match_symbol (&sym, 0);
6504 if (m == MATCH_NO)
6505 goto syntax;
6506 else if (m == MATCH_ERROR)
6507 return m;
6508
6509 /* Add current_attr to the symbol attributes. */
524af0d6 6510 if (!gfc_copy_attr (&sym->attr, &current_attr, NULL))
69773742
JW
6511 return MATCH_ERROR;
6512
6513 if (sym->attr.is_bind_c)
6514 {
6515 /* Check for C1218. */
6516 if (!proc_if || !proc_if->attr.is_bind_c)
6517 {
6518 gfc_error ("BIND(C) attribute at %C requires "
6519 "an interface with BIND(C)");
6520 return MATCH_ERROR;
6521 }
6522 /* Check for C1217. */
6523 if (has_name_equals && sym->attr.pointer)
6524 {
6525 gfc_error ("BIND(C) procedure with NAME may not have "
6526 "POINTER attribute at %C");
6527 return MATCH_ERROR;
6528 }
6529 if (has_name_equals && sym->attr.dummy)
6530 {
6531 gfc_error ("Dummy procedure at %C may not have "
6532 "BIND(C) attribute with NAME");
6533 return MATCH_ERROR;
6534 }
6535 /* Set binding label for BIND(C). */
524af0d6 6536 if (!set_binding_label (&sym->binding_label, sym->name, num))
69773742
JW
6537 return MATCH_ERROR;
6538 }
6539
524af0d6 6540 if (!gfc_add_external (&sym->attr, NULL))
69773742 6541 return MATCH_ERROR;
3070bab4 6542
524af0d6 6543 if (add_hidden_procptr_result (sym))
3070bab4
JW
6544 sym = sym->result;
6545
524af0d6 6546 if (!gfc_add_proc (&sym->attr, sym->name, NULL))
69773742
JW
6547 return MATCH_ERROR;
6548
6549 /* Set interface. */
6550 if (proc_if != NULL)
6cc309c9 6551 {
1d146030
JW
6552 if (sym->ts.type != BT_UNKNOWN)
6553 {
c4100eae 6554 gfc_error ("Procedure %qs at %L already has basic type of %s",
1d146030
JW
6555 sym->name, &gfc_current_locus,
6556 gfc_basic_typename (sym->ts.type));
6557 return MATCH_ERROR;
6558 }
32d99e68 6559 sym->ts.interface = proc_if;
6cc309c9 6560 sym->attr.untyped = 1;
c73b6478 6561 sym->attr.if_source = IFSRC_IFBODY;
6cc309c9 6562 }
69773742
JW
6563 else if (current_ts.type != BT_UNKNOWN)
6564 {
524af0d6 6565 if (!gfc_add_type (sym, &current_ts, &gfc_current_locus))
1d146030 6566 return MATCH_ERROR;
32d99e68
JW
6567 sym->ts.interface = gfc_new_symbol ("", gfc_current_ns);
6568 sym->ts.interface->ts = current_ts;
d91909c0 6569 sym->ts.interface->attr.flavor = FL_PROCEDURE;
32d99e68 6570 sym->ts.interface->attr.function = 1;
d91909c0 6571 sym->attr.function = 1;
c73b6478 6572 sym->attr.if_source = IFSRC_UNKNOWN;
69773742
JW
6573 }
6574
8fb74da4
JW
6575 if (gfc_match (" =>") == MATCH_YES)
6576 {
6577 if (!current_attr.pointer)
6578 {
6579 gfc_error ("Initialization at %C isn't for a pointer variable");
6580 m = MATCH_ERROR;
6581 goto cleanup;
6582 }
6583
80f95228 6584 m = match_pointer_init (&initializer, 1);
8fb74da4
JW
6585 if (m != MATCH_YES)
6586 goto cleanup;
6587
524af0d6 6588 if (!add_init_expr_to_sym (sym->name, &initializer, &gfc_current_locus))
8fb74da4
JW
6589 goto cleanup;
6590
6591 }
6592
69773742
JW
6593 if (gfc_match_eos () == MATCH_YES)
6594 return MATCH_YES;
6595 if (gfc_match_char (',') != MATCH_YES)
6596 goto syntax;
6597 }
6598
6599syntax:
6600 gfc_error ("Syntax error in PROCEDURE statement at %C");
6601 return MATCH_ERROR;
8fb74da4
JW
6602
6603cleanup:
6604 /* Free stuff up and return. */
6605 gfc_free_expr (initializer);
6606 return m;
69773742
JW
6607}
6608
6609
713485cc
JW
6610static match
6611match_binding_attributes (gfc_typebound_proc* ba, bool generic, bool ppc);
6612
6613
6614/* Match a procedure pointer component declaration (R445). */
6615
6616static match
6617match_ppc_decl (void)
6618{
6619 match m;
6620 gfc_symbol *proc_if = NULL;
6621 gfc_typespec ts;
6622 int num;
6623 gfc_component *c;
6624 gfc_expr *initializer = NULL;
6625 gfc_typebound_proc* tb;
6626 char name[GFC_MAX_SYMBOL_LEN + 1];
6627
6628 /* Parse interface (with brackets). */
6629 m = match_procedure_interface (&proc_if);
6630 if (m != MATCH_YES)
6631 goto syntax;
6632
6633 /* Parse attributes. */
6634 tb = XCNEW (gfc_typebound_proc);
6635 tb->where = gfc_current_locus;
6636 m = match_binding_attributes (tb, false, true);
6637 if (m == MATCH_ERROR)
6638 return m;
6639
713485cc
JW
6640 gfc_clear_attr (&current_attr);
6641 current_attr.procedure = 1;
6642 current_attr.proc_pointer = 1;
6643 current_attr.access = tb->access;
6644 current_attr.flavor = FL_PROCEDURE;
6645
6646 /* Match the colons (required). */
6647 if (gfc_match (" ::") != MATCH_YES)
6648 {
a4d9b221 6649 gfc_error ("Expected %<::%> after binding-attributes at %C");
713485cc
JW
6650 return MATCH_ERROR;
6651 }
6652
6653 /* Check for C450. */
6654 if (!tb->nopass && proc_if == NULL)
6655 {
6656 gfc_error("NOPASS or explicit interface required at %C");
6657 return MATCH_ERROR;
6658 }
6659
524af0d6 6660 if (!gfc_notify_std (GFC_STD_F2003, "Procedure pointer component at %C"))
3212c187
SK
6661 return MATCH_ERROR;
6662
713485cc
JW
6663 /* Match PPC names. */
6664 ts = current_ts;
6665 for(num=1;;num++)
6666 {
6667 m = gfc_match_name (name);
6668 if (m == MATCH_NO)
6669 goto syntax;
6670 else if (m == MATCH_ERROR)
6671 return m;
6672
524af0d6 6673 if (!gfc_add_component (gfc_current_block(), name, &c))
713485cc
JW
6674 return MATCH_ERROR;
6675
6676 /* Add current_attr to the symbol attributes. */
524af0d6 6677 if (!gfc_copy_attr (&c->attr, &current_attr, NULL))
713485cc
JW
6678 return MATCH_ERROR;
6679
524af0d6 6680 if (!gfc_add_external (&c->attr, NULL))
713485cc
JW
6681 return MATCH_ERROR;
6682
524af0d6 6683 if (!gfc_add_proc (&c->attr, name, NULL))
713485cc
JW
6684 return MATCH_ERROR;
6685
2be03814
TB
6686 if (num == 1)
6687 c->tb = tb;
6688 else
6689 {
6690 c->tb = XCNEW (gfc_typebound_proc);
6691 c->tb->where = gfc_current_locus;
6692 *c->tb = *tb;
6693 }
90661f26 6694
713485cc
JW
6695 /* Set interface. */
6696 if (proc_if != NULL)
6697 {
6698 c->ts.interface = proc_if;
6699 c->attr.untyped = 1;
6700 c->attr.if_source = IFSRC_IFBODY;
6701 }
6702 else if (ts.type != BT_UNKNOWN)
6703 {
6704 c->ts = ts;
6705 c->ts.interface = gfc_new_symbol ("", gfc_current_ns);
d7fee03d 6706 c->ts.interface->result = c->ts.interface;
713485cc 6707 c->ts.interface->ts = ts;
d91909c0 6708 c->ts.interface->attr.flavor = FL_PROCEDURE;
713485cc 6709 c->ts.interface->attr.function = 1;
d91909c0 6710 c->attr.function = 1;
713485cc
JW
6711 c->attr.if_source = IFSRC_UNKNOWN;
6712 }
6713
6714 if (gfc_match (" =>") == MATCH_YES)
6715 {
80f95228 6716 m = match_pointer_init (&initializer, 1);
713485cc
JW
6717 if (m != MATCH_YES)
6718 {
6719 gfc_free_expr (initializer);
6720 return m;
6721 }
6722 c->initializer = initializer;
6723 }
6724
6725 if (gfc_match_eos () == MATCH_YES)
6726 return MATCH_YES;
6727 if (gfc_match_char (',') != MATCH_YES)
6728 goto syntax;
6729 }
6730
6731syntax:
6732 gfc_error ("Syntax error in procedure pointer component at %C");
6733 return MATCH_ERROR;
6734}
6735
6736
69773742
JW
6737/* Match a PROCEDURE declaration inside an interface (R1206). */
6738
6739static match
6740match_procedure_in_interface (void)
6741{
6742 match m;
6743 gfc_symbol *sym;
6744 char name[GFC_MAX_SYMBOL_LEN + 1];
a6fcd41a 6745 locus old_locus;
69773742
JW
6746
6747 if (current_interface.type == INTERFACE_NAMELESS
6748 || current_interface.type == INTERFACE_ABSTRACT)
6749 {
6750 gfc_error ("PROCEDURE at %C must be in a generic interface");
6751 return MATCH_ERROR;
6752 }
6753
a6fcd41a
TB
6754 /* Check if the F2008 optional double colon appears. */
6755 gfc_gobble_whitespace ();
6756 old_locus = gfc_current_locus;
6757 if (gfc_match ("::") == MATCH_YES)
6758 {
524af0d6
JB
6759 if (!gfc_notify_std (GFC_STD_F2008, "double colon in "
6760 "MODULE PROCEDURE statement at %L", &old_locus))
a6fcd41a
TB
6761 return MATCH_ERROR;
6762 }
6763 else
6764 gfc_current_locus = old_locus;
6765
69773742
JW
6766 for(;;)
6767 {
6768 m = gfc_match_name (name);
6769 if (m == MATCH_NO)
6770 goto syntax;
6771 else if (m == MATCH_ERROR)
6772 return m;
6773 if (gfc_get_symbol (name, gfc_current_ns->parent, &sym))
6774 return MATCH_ERROR;
6775
524af0d6 6776 if (!gfc_add_interface (sym))
69773742
JW
6777 return MATCH_ERROR;
6778
69773742
JW
6779 if (gfc_match_eos () == MATCH_YES)
6780 break;
6781 if (gfc_match_char (',') != MATCH_YES)
6782 goto syntax;
6783 }
6784
6785 return MATCH_YES;
6786
6787syntax:
6788 gfc_error ("Syntax error in PROCEDURE statement at %C");
6789 return MATCH_ERROR;
6790}
6791
6792
6793/* General matcher for PROCEDURE declarations. */
6794
30b608eb
DK
6795static match match_procedure_in_type (void);
6796
69773742
JW
6797match
6798gfc_match_procedure (void)
6799{
6800 match m;
6801
6802 switch (gfc_current_state ())
6803 {
6804 case COMP_NONE:
6805 case COMP_PROGRAM:
6806 case COMP_MODULE:
4668d6f9 6807 case COMP_SUBMODULE:
69773742
JW
6808 case COMP_SUBROUTINE:
6809 case COMP_FUNCTION:
3547d57e 6810 case COMP_BLOCK:
69773742
JW
6811 m = match_procedure_decl ();
6812 break;
6813 case COMP_INTERFACE:
6814 m = match_procedure_in_interface ();
6815 break;
6816 case COMP_DERIVED:
713485cc
JW
6817 m = match_ppc_decl ();
6818 break;
30b608eb
DK
6819 case COMP_DERIVED_CONTAINS:
6820 m = match_procedure_in_type ();
6821 break;
69773742
JW
6822 default:
6823 return MATCH_NO;
6824 }
6825
6826 if (m != MATCH_YES)
6827 return m;
6828
524af0d6 6829 if (!gfc_notify_std (GFC_STD_F2003, "PROCEDURE statement at %C"))
69773742
JW
6830 return MATCH_ERROR;
6831
6832 return m;
6833}
6834
6835
c3005b0f
DK
6836/* Warn if a matched procedure has the same name as an intrinsic; this is
6837 simply a wrapper around gfc_warn_intrinsic_shadow that interprets the current
6838 parser-state-stack to find out whether we're in a module. */
6839
6840static void
73e42eef 6841do_warn_intrinsic_shadow (const gfc_symbol* sym, bool func)
c3005b0f
DK
6842{
6843 bool in_module;
6844
6845 in_module = (gfc_state_stack->previous
4668d6f9
PT
6846 && (gfc_state_stack->previous->state == COMP_MODULE
6847 || gfc_state_stack->previous->state == COMP_SUBMODULE));
c3005b0f
DK
6848
6849 gfc_warn_intrinsic_shadow (sym, in_module, func);
6850}
6851
6852
6de9cd9a
DN
6853/* Match a function declaration. */
6854
6855match
6856gfc_match_function_decl (void)
6857{
6858 char name[GFC_MAX_SYMBOL_LEN + 1];
6859 gfc_symbol *sym, *result;
6860 locus old_loc;
6861 match m;
a8b3b0b6 6862 match suffix_match;
f5acf0f2 6863 match found_match; /* Status returned by match func. */
6de9cd9a
DN
6864
6865 if (gfc_current_state () != COMP_NONE
6866 && gfc_current_state () != COMP_INTERFACE
6867 && gfc_current_state () != COMP_CONTAINS)
6868 return MATCH_NO;
6869
6870 gfc_clear_ts (&current_ts);
6871
63645982 6872 old_loc = gfc_current_locus;
6de9cd9a 6873
1c8bcdf7 6874 m = gfc_match_prefix (&current_ts);
6de9cd9a
DN
6875 if (m != MATCH_YES)
6876 {
63645982 6877 gfc_current_locus = old_loc;
6de9cd9a
DN
6878 return m;
6879 }
6880
6881 if (gfc_match ("function% %n", name) != MATCH_YES)
6882 {
63645982 6883 gfc_current_locus = old_loc;
6de9cd9a
DN
6884 return MATCH_NO;
6885 }
4668d6f9 6886
1a492601 6887 if (get_proc_name (name, &sym, false))
6de9cd9a 6888 return MATCH_ERROR;
3070bab4 6889
524af0d6 6890 if (add_hidden_procptr_result (sym))
3070bab4
JW
6891 sym = sym->result;
6892
4668d6f9
PT
6893 if (current_attr.module_procedure)
6894 sym->attr.module_procedure = 1;
6895
6de9cd9a
DN
6896 gfc_new_block = sym;
6897
6898 m = gfc_match_formal_arglist (sym, 0, 0);
6899 if (m == MATCH_NO)
2b9a33ae
TS
6900 {
6901 gfc_error ("Expected formal argument list in function "
636dff67 6902 "definition at %C");
2b9a33ae
TS
6903 m = MATCH_ERROR;
6904 goto cleanup;
6905 }
6de9cd9a
DN
6906 else if (m == MATCH_ERROR)
6907 goto cleanup;
6908
6909 result = NULL;
6910
a8b3b0b6
CR
6911 /* According to the draft, the bind(c) and result clause can
6912 come in either order after the formal_arg_list (i.e., either
6913 can be first, both can exist together or by themselves or neither
6914 one). Therefore, the match_result can't match the end of the
6915 string, and check for the bind(c) or result clause in either order. */
6916 found_match = gfc_match_eos ();
6917
6918 /* Make sure that it isn't already declared as BIND(C). If it is, it
6919 must have been marked BIND(C) with a BIND(C) attribute and that is
6920 not allowed for procedures. */
6921 if (sym->attr.is_bind_c == 1)
6922 {
6923 sym->attr.is_bind_c = 0;
6924 if (sym->old_symbol != NULL)
6925 gfc_error_now ("BIND(C) attribute at %L can only be used for "
6926 "variables or common blocks",
6927 &(sym->old_symbol->declared_at));
6928 else
6929 gfc_error_now ("BIND(C) attribute at %L can only be used for "
6930 "variables or common blocks", &gfc_current_locus);
6de9cd9a
DN
6931 }
6932
a8b3b0b6 6933 if (found_match != MATCH_YES)
6de9cd9a 6934 {
a8b3b0b6
CR
6935 /* If we haven't found the end-of-statement, look for a suffix. */
6936 suffix_match = gfc_match_suffix (sym, &result);
6937 if (suffix_match == MATCH_YES)
6938 /* Need to get the eos now. */
6939 found_match = gfc_match_eos ();
6940 else
6941 found_match = suffix_match;
6de9cd9a
DN
6942 }
6943
a8b3b0b6
CR
6944 if(found_match != MATCH_YES)
6945 m = MATCH_ERROR;
6de9cd9a
DN
6946 else
6947 {
a8b3b0b6
CR
6948 /* Make changes to the symbol. */
6949 m = MATCH_ERROR;
f5acf0f2 6950
524af0d6 6951 if (!gfc_add_function (&sym->attr, sym->name, NULL))
a8b3b0b6 6952 goto cleanup;
f5acf0f2 6953
70112e2a 6954 if (!gfc_missing_attr (&sym->attr, NULL))
a8b3b0b6 6955 goto cleanup;
6de9cd9a 6956
70112e2a
PT
6957 if (!copy_prefix (&sym->attr, &sym->declared_at))
6958 {
6959 if(!sym->attr.module_procedure)
6960 goto cleanup;
6961 else
6962 gfc_error_check ();
6963 }
6964
a99d95a2 6965 /* Delay matching the function characteristics until after the
1c8bcdf7 6966 specification block by signalling kind=-1. */
a99d95a2
PT
6967 sym->declared_at = old_loc;
6968 if (current_ts.type != BT_UNKNOWN)
6969 current_ts.kind = -1;
6970 else
6971 current_ts.kind = 0;
1c8bcdf7 6972
a8b3b0b6
CR
6973 if (result == NULL)
6974 {
6de7294f 6975 if (current_ts.type != BT_UNKNOWN
524af0d6 6976 && !gfc_add_type (sym, &current_ts, &gfc_current_locus))
6de7294f 6977 goto cleanup;
a8b3b0b6
CR
6978 sym->result = sym;
6979 }
6980 else
6981 {
6de7294f 6982 if (current_ts.type != BT_UNKNOWN
524af0d6 6983 && !gfc_add_type (result, &current_ts, &gfc_current_locus))
6de7294f 6984 goto cleanup;
a8b3b0b6
CR
6985 sym->result = result;
6986 }
6987
c3005b0f 6988 /* Warn if this procedure has the same name as an intrinsic. */
73e42eef 6989 do_warn_intrinsic_shadow (sym, true);
c3005b0f 6990
a8b3b0b6
CR
6991 return MATCH_YES;
6992 }
6de9cd9a
DN
6993
6994cleanup:
63645982 6995 gfc_current_locus = old_loc;
6de9cd9a
DN
6996 return m;
6997}
6998
636dff67
SK
6999
7000/* This is mostly a copy of parse.c(add_global_procedure) but modified to
7001 pass the name of the entry, rather than the gfc_current_block name, and
7002 to return false upon finding an existing global entry. */
68ea355b
PT
7003
7004static bool
3a43b5b3
TB
7005add_global_entry (const char *name, const char *binding_label, bool sub,
7006 locus *where)
68ea355b
PT
7007{
7008 gfc_gsymbol *s;
32e8bb8e 7009 enum gfc_symbol_type type;
68ea355b 7010
7389bce6 7011 type = sub ? GSYM_SUBROUTINE : GSYM_FUNCTION;
68ea355b 7012
f11de7c5
TB
7013 /* Only in Fortran 2003: For procedures with a binding label also the Fortran
7014 name is a global identifier. */
7015 if (!binding_label || gfc_notification_std (GFC_STD_F2008))
68ea355b 7016 {
f11de7c5
TB
7017 s = gfc_get_gsymbol (name);
7018
7019 if (s->defined || (s->type != GSYM_UNKNOWN && s->type != type))
7020 {
3a43b5b3 7021 gfc_global_used (s, where);
f11de7c5
TB
7022 return false;
7023 }
7024 else
7025 {
7026 s->type = type;
77f8682b 7027 s->sym_name = name;
3a43b5b3 7028 s->where = *where;
f11de7c5
TB
7029 s->defined = 1;
7030 s->ns = gfc_current_ns;
7031 }
68ea355b 7032 }
f11de7c5
TB
7033
7034 /* Don't add the symbol multiple times. */
7035 if (binding_label
7036 && (!gfc_notification_std (GFC_STD_F2008)
7037 || strcmp (name, binding_label) != 0))
7038 {
7039 s = gfc_get_gsymbol (binding_label);
7040
7041 if (s->defined || (s->type != GSYM_UNKNOWN && s->type != type))
7042 {
3a43b5b3 7043 gfc_global_used (s, where);
f11de7c5
TB
7044 return false;
7045 }
7046 else
7047 {
7048 s->type = type;
77f8682b 7049 s->sym_name = name;
f11de7c5 7050 s->binding_label = binding_label;
3a43b5b3 7051 s->where = *where;
f11de7c5
TB
7052 s->defined = 1;
7053 s->ns = gfc_current_ns;
7054 }
7055 }
7056
7057 return true;
68ea355b 7058}
6de9cd9a 7059
636dff67 7060
6de9cd9a
DN
7061/* Match an ENTRY statement. */
7062
7063match
7064gfc_match_entry (void)
7065{
3d79abbd
PB
7066 gfc_symbol *proc;
7067 gfc_symbol *result;
7068 gfc_symbol *entry;
6de9cd9a
DN
7069 char name[GFC_MAX_SYMBOL_LEN + 1];
7070 gfc_compile_state state;
7071 match m;
3d79abbd 7072 gfc_entry_list *el;
c96cfa49 7073 locus old_loc;
1a492601 7074 bool module_procedure;
bc3e7a8c
TB
7075 char peek_char;
7076 match is_bind_c;
6de9cd9a
DN
7077
7078 m = gfc_match_name (name);
7079 if (m != MATCH_YES)
7080 return m;
7081
524af0d6 7082 if (!gfc_notify_std (GFC_STD_F2008_OBS, "ENTRY statement at %C"))
58fc89f6
TB
7083 return MATCH_ERROR;
7084
3d79abbd 7085 state = gfc_current_state ();
4c93c95a 7086 if (state != COMP_SUBROUTINE && state != COMP_FUNCTION)
3d79abbd 7087 {
4c93c95a
FXC
7088 switch (state)
7089 {
7090 case COMP_PROGRAM:
7091 gfc_error ("ENTRY statement at %C cannot appear within a PROGRAM");
7092 break;
7093 case COMP_MODULE:
7094 gfc_error ("ENTRY statement at %C cannot appear within a MODULE");
7095 break;
4668d6f9
PT
7096 case COMP_SUBMODULE:
7097 gfc_error ("ENTRY statement at %C cannot appear within a SUBMODULE");
7098 break;
4c93c95a 7099 case COMP_BLOCK_DATA:
636dff67
SK
7100 gfc_error ("ENTRY statement at %C cannot appear within "
7101 "a BLOCK DATA");
4c93c95a
FXC
7102 break;
7103 case COMP_INTERFACE:
636dff67
SK
7104 gfc_error ("ENTRY statement at %C cannot appear within "
7105 "an INTERFACE");
4c93c95a 7106 break;
f6288c24
FR
7107 case COMP_STRUCTURE:
7108 gfc_error ("ENTRY statement at %C cannot appear within "
7109 "a STRUCTURE block");
7110 break;
4c93c95a 7111 case COMP_DERIVED:
636dff67
SK
7112 gfc_error ("ENTRY statement at %C cannot appear within "
7113 "a DERIVED TYPE block");
4c93c95a
FXC
7114 break;
7115 case COMP_IF:
636dff67
SK
7116 gfc_error ("ENTRY statement at %C cannot appear within "
7117 "an IF-THEN block");
4c93c95a
FXC
7118 break;
7119 case COMP_DO:
8c6a85e3 7120 case COMP_DO_CONCURRENT:
636dff67
SK
7121 gfc_error ("ENTRY statement at %C cannot appear within "
7122 "a DO block");
4c93c95a
FXC
7123 break;
7124 case COMP_SELECT:
636dff67
SK
7125 gfc_error ("ENTRY statement at %C cannot appear within "
7126 "a SELECT block");
4c93c95a
FXC
7127 break;
7128 case COMP_FORALL:
636dff67
SK
7129 gfc_error ("ENTRY statement at %C cannot appear within "
7130 "a FORALL block");
4c93c95a
FXC
7131 break;
7132 case COMP_WHERE:
636dff67
SK
7133 gfc_error ("ENTRY statement at %C cannot appear within "
7134 "a WHERE block");
4c93c95a
FXC
7135 break;
7136 case COMP_CONTAINS:
636dff67
SK
7137 gfc_error ("ENTRY statement at %C cannot appear within "
7138 "a contained subprogram");
4c93c95a
FXC
7139 break;
7140 default:
fce523bf 7141 gfc_error ("Unexpected ENTRY statement at %C");
4c93c95a 7142 }
3d79abbd
PB
7143 return MATCH_ERROR;
7144 }
7145
5f0ba745
SK
7146 if ((state == COMP_SUBROUTINE || state == COMP_FUNCTION)
7147 && gfc_state_stack->previous->state == COMP_INTERFACE)
7148 {
7149 gfc_error ("ENTRY statement at %C cannot appear within an INTERFACE");
7150 return MATCH_ERROR;
7151 }
7152
1a492601 7153 module_procedure = gfc_current_ns->parent != NULL
636dff67
SK
7154 && gfc_current_ns->parent->proc_name
7155 && gfc_current_ns->parent->proc_name->attr.flavor
7156 == FL_MODULE;
1a492601 7157
3d79abbd
PB
7158 if (gfc_current_ns->parent != NULL
7159 && gfc_current_ns->parent->proc_name
1a492601 7160 && !module_procedure)
3d79abbd
PB
7161 {
7162 gfc_error("ENTRY statement at %C cannot appear in a "
7163 "contained procedure");
7164 return MATCH_ERROR;
7165 }
7166
1a492601
PT
7167 /* Module function entries need special care in get_proc_name
7168 because previous references within the function will have
7169 created symbols attached to the current namespace. */
7170 if (get_proc_name (name, &entry,
7171 gfc_current_ns->parent != NULL
ecd3b73c 7172 && module_procedure))
6de9cd9a
DN
7173 return MATCH_ERROR;
7174
3d79abbd
PB
7175 proc = gfc_current_block ();
7176
bc3e7a8c
TB
7177 /* Make sure that it isn't already declared as BIND(C). If it is, it
7178 must have been marked BIND(C) with a BIND(C) attribute and that is
7179 not allowed for procedures. */
7180 if (entry->attr.is_bind_c == 1)
7181 {
7182 entry->attr.is_bind_c = 0;
7183 if (entry->old_symbol != NULL)
7184 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7185 "variables or common blocks",
7186 &(entry->old_symbol->declared_at));
7187 else
7188 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7189 "variables or common blocks", &gfc_current_locus);
7190 }
f5acf0f2 7191
bc3e7a8c
TB
7192 /* Check what next non-whitespace character is so we can tell if there
7193 is the required parens if we have a BIND(C). */
3a43b5b3 7194 old_loc = gfc_current_locus;
bc3e7a8c 7195 gfc_gobble_whitespace ();
8fc541d3 7196 peek_char = gfc_peek_ascii_char ();
bc3e7a8c 7197
3d79abbd 7198 if (state == COMP_SUBROUTINE)
6de9cd9a 7199 {
6de9cd9a
DN
7200 m = gfc_match_formal_arglist (entry, 0, 1);
7201 if (m != MATCH_YES)
7202 return MATCH_ERROR;
7203
1eabf70a
TB
7204 /* Call gfc_match_bind_c with allow_binding_name = true as ENTRY can
7205 never be an internal procedure. */
7206 is_bind_c = gfc_match_bind_c (entry, true);
bc3e7a8c
TB
7207 if (is_bind_c == MATCH_ERROR)
7208 return MATCH_ERROR;
7209 if (is_bind_c == MATCH_YES)
7210 {
7211 if (peek_char != '(')
7212 {
7213 gfc_error ("Missing required parentheses before BIND(C) at %C");
7214 return MATCH_ERROR;
7215 }
70112e2a 7216 if (!gfc_add_is_bind_c (&(entry->attr), entry->name,
524af0d6 7217 &(entry->declared_at), 1))
bc3e7a8c
TB
7218 return MATCH_ERROR;
7219 }
7220
f11de7c5 7221 if (!gfc_current_ns->parent
3a43b5b3
TB
7222 && !add_global_entry (name, entry->binding_label, true,
7223 &old_loc))
f11de7c5
TB
7224 return MATCH_ERROR;
7225
7226 /* An entry in a subroutine. */
524af0d6
JB
7227 if (!gfc_add_entry (&entry->attr, entry->name, NULL)
7228 || !gfc_add_subroutine (&entry->attr, entry->name, NULL))
6de9cd9a 7229 return MATCH_ERROR;
3d79abbd
PB
7230 }
7231 else
7232 {
c96cfa49 7233 /* An entry in a function.
636dff67
SK
7234 We need to take special care because writing
7235 ENTRY f()
7236 as
7237 ENTRY f
7238 is allowed, whereas
7239 ENTRY f() RESULT (r)
7240 can't be written as
7241 ENTRY f RESULT (r). */
c96cfa49
TS
7242 if (gfc_match_eos () == MATCH_YES)
7243 {
7244 gfc_current_locus = old_loc;
7245 /* Match the empty argument list, and add the interface to
7246 the symbol. */
7247 m = gfc_match_formal_arglist (entry, 0, 1);
7248 }
7249 else
7250 m = gfc_match_formal_arglist (entry, 0, 0);
7251
6de9cd9a
DN
7252 if (m != MATCH_YES)
7253 return MATCH_ERROR;
7254
6de9cd9a
DN
7255 result = NULL;
7256
7257 if (gfc_match_eos () == MATCH_YES)
7258 {
524af0d6
JB
7259 if (!gfc_add_entry (&entry->attr, entry->name, NULL)
7260 || !gfc_add_function (&entry->attr, entry->name, NULL))
6de9cd9a
DN
7261 return MATCH_ERROR;
7262
d198b59a 7263 entry->result = entry;
6de9cd9a
DN
7264 }
7265 else
7266 {
bc3e7a8c 7267 m = gfc_match_suffix (entry, &result);
6de9cd9a
DN
7268 if (m == MATCH_NO)
7269 gfc_syntax_error (ST_ENTRY);
7270 if (m != MATCH_YES)
7271 return MATCH_ERROR;
7272
bc3e7a8c
TB
7273 if (result)
7274 {
524af0d6
JB
7275 if (!gfc_add_result (&result->attr, result->name, NULL)
7276 || !gfc_add_entry (&entry->attr, result->name, NULL)
7277 || !gfc_add_function (&entry->attr, result->name, NULL))
bc3e7a8c
TB
7278 return MATCH_ERROR;
7279 entry->result = result;
7280 }
7281 else
7282 {
524af0d6
JB
7283 if (!gfc_add_entry (&entry->attr, entry->name, NULL)
7284 || !gfc_add_function (&entry->attr, entry->name, NULL))
bc3e7a8c
TB
7285 return MATCH_ERROR;
7286 entry->result = entry;
7287 }
6de9cd9a 7288 }
f11de7c5
TB
7289
7290 if (!gfc_current_ns->parent
3a43b5b3
TB
7291 && !add_global_entry (name, entry->binding_label, false,
7292 &old_loc))
f11de7c5 7293 return MATCH_ERROR;
6de9cd9a
DN
7294 }
7295
7296 if (gfc_match_eos () != MATCH_YES)
7297 {
7298 gfc_syntax_error (ST_ENTRY);
7299 return MATCH_ERROR;
7300 }
7301
3d79abbd
PB
7302 entry->attr.recursive = proc->attr.recursive;
7303 entry->attr.elemental = proc->attr.elemental;
7304 entry->attr.pure = proc->attr.pure;
6de9cd9a 7305
3d79abbd
PB
7306 el = gfc_get_entry_list ();
7307 el->sym = entry;
7308 el->next = gfc_current_ns->entries;
7309 gfc_current_ns->entries = el;
7310 if (el->next)
7311 el->id = el->next->id + 1;
7312 else
7313 el->id = 1;
6de9cd9a 7314
3d79abbd
PB
7315 new_st.op = EXEC_ENTRY;
7316 new_st.ext.entry = el;
7317
7318 return MATCH_YES;
6de9cd9a
DN
7319}
7320
7321
7322/* Match a subroutine statement, including optional prefixes. */
7323
7324match
7325gfc_match_subroutine (void)
7326{
7327 char name[GFC_MAX_SYMBOL_LEN + 1];
7328 gfc_symbol *sym;
7329 match m;
a8b3b0b6
CR
7330 match is_bind_c;
7331 char peek_char;
1eabf70a 7332 bool allow_binding_name;
6de9cd9a
DN
7333
7334 if (gfc_current_state () != COMP_NONE
7335 && gfc_current_state () != COMP_INTERFACE
7336 && gfc_current_state () != COMP_CONTAINS)
7337 return MATCH_NO;
7338
1c8bcdf7 7339 m = gfc_match_prefix (NULL);
6de9cd9a
DN
7340 if (m != MATCH_YES)
7341 return m;
7342
7343 m = gfc_match ("subroutine% %n", name);
7344 if (m != MATCH_YES)
7345 return m;
7346
1a492601 7347 if (get_proc_name (name, &sym, false))
6de9cd9a 7348 return MATCH_ERROR;
3070bab4 7349
7fcd5ad5 7350 /* Set declared_at as it might point to, e.g., a PUBLIC statement, if
1cc0e193 7351 the symbol existed before. */
7fcd5ad5
TB
7352 sym->declared_at = gfc_current_locus;
7353
4668d6f9
PT
7354 if (current_attr.module_procedure)
7355 sym->attr.module_procedure = 1;
7356
524af0d6 7357 if (add_hidden_procptr_result (sym))
3070bab4
JW
7358 sym = sym->result;
7359
6de9cd9a
DN
7360 gfc_new_block = sym;
7361
a8b3b0b6 7362 /* Check what next non-whitespace character is so we can tell if there
bc3e7a8c 7363 is the required parens if we have a BIND(C). */
a8b3b0b6 7364 gfc_gobble_whitespace ();
8fc541d3 7365 peek_char = gfc_peek_ascii_char ();
f5acf0f2 7366
524af0d6 7367 if (!gfc_add_subroutine (&sym->attr, sym->name, NULL))
6de9cd9a
DN
7368 return MATCH_ERROR;
7369
7370 if (gfc_match_formal_arglist (sym, 0, 1) != MATCH_YES)
7371 return MATCH_ERROR;
7372
a8b3b0b6
CR
7373 /* Make sure that it isn't already declared as BIND(C). If it is, it
7374 must have been marked BIND(C) with a BIND(C) attribute and that is
7375 not allowed for procedures. */
7376 if (sym->attr.is_bind_c == 1)
7377 {
7378 sym->attr.is_bind_c = 0;
7379 if (sym->old_symbol != NULL)
7380 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7381 "variables or common blocks",
7382 &(sym->old_symbol->declared_at));
7383 else
7384 gfc_error_now ("BIND(C) attribute at %L can only be used for "
7385 "variables or common blocks", &gfc_current_locus);
7386 }
1eabf70a
TB
7387
7388 /* C binding names are not allowed for internal procedures. */
7389 if (gfc_current_state () == COMP_CONTAINS
7390 && sym->ns->proc_name->attr.flavor != FL_MODULE)
7391 allow_binding_name = false;
7392 else
7393 allow_binding_name = true;
7394
a8b3b0b6
CR
7395 /* Here, we are just checking if it has the bind(c) attribute, and if
7396 so, then we need to make sure it's all correct. If it doesn't,
7397 we still need to continue matching the rest of the subroutine line. */
1eabf70a 7398 is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
a8b3b0b6
CR
7399 if (is_bind_c == MATCH_ERROR)
7400 {
7401 /* There was an attempt at the bind(c), but it was wrong. An
7402 error message should have been printed w/in the gfc_match_bind_c
7403 so here we'll just return the MATCH_ERROR. */
7404 return MATCH_ERROR;
7405 }
7406
7407 if (is_bind_c == MATCH_YES)
7408 {
1eabf70a 7409 /* The following is allowed in the Fortran 2008 draft. */
01f4fff1 7410 if (gfc_current_state () == COMP_CONTAINS
1eabf70a 7411 && sym->ns->proc_name->attr.flavor != FL_MODULE
524af0d6
JB
7412 && !gfc_notify_std (GFC_STD_F2008, "BIND(C) attribute "
7413 "at %L may not be specified for an internal "
7414 "procedure", &gfc_current_locus))
1eabf70a
TB
7415 return MATCH_ERROR;
7416
a8b3b0b6
CR
7417 if (peek_char != '(')
7418 {
7419 gfc_error ("Missing required parentheses before BIND(C) at %C");
7420 return MATCH_ERROR;
7421 }
70112e2a 7422 if (!gfc_add_is_bind_c (&(sym->attr), sym->name,
524af0d6 7423 &(sym->declared_at), 1))
a8b3b0b6
CR
7424 return MATCH_ERROR;
7425 }
f5acf0f2 7426
6de9cd9a
DN
7427 if (gfc_match_eos () != MATCH_YES)
7428 {
7429 gfc_syntax_error (ST_SUBROUTINE);
7430 return MATCH_ERROR;
7431 }
7432
524af0d6 7433 if (!copy_prefix (&sym->attr, &sym->declared_at))
70112e2a
PT
7434 {
7435 if(!sym->attr.module_procedure)
7436 return MATCH_ERROR;
7437 else
7438 gfc_error_check ();
7439 }
6de9cd9a 7440
c3005b0f 7441 /* Warn if it has the same name as an intrinsic. */
73e42eef 7442 do_warn_intrinsic_shadow (sym, false);
c3005b0f 7443
6de9cd9a
DN
7444 return MATCH_YES;
7445}
7446
7447
3b37ccd4
FXC
7448/* Check that the NAME identifier in a BIND attribute or statement
7449 is conform to C identifier rules. */
7450
7451match
7452check_bind_name_identifier (char **name)
7453{
7454 char *n = *name, *p;
7455
7456 /* Remove leading spaces. */
7457 while (*n == ' ')
7458 n++;
7459
7460 /* On an empty string, free memory and set name to NULL. */
7461 if (*n == '\0')
7462 {
7463 free (*name);
7464 *name = NULL;
7465 return MATCH_YES;
7466 }
7467
7468 /* Remove trailing spaces. */
7469 p = n + strlen(n) - 1;
7470 while (*p == ' ')
7471 *(p--) = '\0';
7472
7473 /* Insert the identifier into the symbol table. */
7474 p = xstrdup (n);
7475 free (*name);
7476 *name = p;
7477
7478 /* Now check that identifier is valid under C rules. */
7479 if (ISDIGIT (*p))
7480 {
7481 gfc_error ("Invalid C identifier in NAME= specifier at %C");
7482 return MATCH_ERROR;
7483 }
7484
7485 for (; *p; p++)
7486 if (!(ISALNUM (*p) || *p == '_' || *p == '$'))
7487 {
7488 gfc_error ("Invalid C identifier in NAME= specifier at %C");
7489 return MATCH_ERROR;
7490 }
7491
7492 return MATCH_YES;
7493}
7494
7495
a8b3b0b6
CR
7496/* Match a BIND(C) specifier, with the optional 'name=' specifier if
7497 given, and set the binding label in either the given symbol (if not
86bf520d 7498 NULL), or in the current_ts. The symbol may be NULL because we may
a8b3b0b6
CR
7499 encounter the BIND(C) before the declaration itself. Return
7500 MATCH_NO if what we're looking at isn't a BIND(C) specifier,
7501 MATCH_ERROR if it is a BIND(C) clause but an error was encountered,
7502 or MATCH_YES if the specifier was correct and the binding label and
7503 bind(c) fields were set correctly for the given symbol or the
1eabf70a
TB
7504 current_ts. If allow_binding_name is false, no binding name may be
7505 given. */
a8b3b0b6
CR
7506
7507match
1eabf70a 7508gfc_match_bind_c (gfc_symbol *sym, bool allow_binding_name)
a8b3b0b6 7509{
3b37ccd4
FXC
7510 char *binding_label = NULL;
7511 gfc_expr *e = NULL;
a8b3b0b6 7512
f5acf0f2 7513 /* Initialize the flag that specifies whether we encountered a NAME=
a8b3b0b6
CR
7514 specifier or not. */
7515 has_name_equals = 0;
7516
a8b3b0b6
CR
7517 /* This much we have to be able to match, in this order, if
7518 there is a bind(c) label. */
7519 if (gfc_match (" bind ( c ") != MATCH_YES)
7520 return MATCH_NO;
7521
7522 /* Now see if there is a binding label, or if we've reached the
7523 end of the bind(c) attribute without one. */
7524 if (gfc_match_char (',') == MATCH_YES)
7525 {
7526 if (gfc_match (" name = ") != MATCH_YES)
7527 {
7528 gfc_error ("Syntax error in NAME= specifier for binding label "
7529 "at %C");
7530 /* should give an error message here */
7531 return MATCH_ERROR;
7532 }
7533
7534 has_name_equals = 1;
7535
3b37ccd4
FXC
7536 if (gfc_match_init_expr (&e) != MATCH_YES)
7537 {
7538 gfc_free_expr (e);
7539 return MATCH_ERROR;
7540 }
f5acf0f2 7541
3b37ccd4 7542 if (!gfc_simplify_expr(e, 0))
a8b3b0b6 7543 {
3b37ccd4
FXC
7544 gfc_error ("NAME= specifier at %C should be a constant expression");
7545 gfc_free_expr (e);
7546 return MATCH_ERROR;
a8b3b0b6 7547 }
3b37ccd4
FXC
7548
7549 if (e->expr_type != EXPR_CONSTANT || e->ts.type != BT_CHARACTER
7550 || e->ts.kind != gfc_default_character_kind || e->rank != 0)
a8b3b0b6 7551 {
3b37ccd4
FXC
7552 gfc_error ("NAME= specifier at %C should be a scalar of "
7553 "default character kind");
7554 gfc_free_expr(e);
7555 return MATCH_ERROR;
a8b3b0b6 7556 }
3b37ccd4
FXC
7557
7558 // Get a C string from the Fortran string constant
7559 binding_label = gfc_widechar_to_char (e->value.character.string,
7560 e->value.character.length);
7561 gfc_free_expr(e);
7562
7563 // Check that it is valid (old gfc_match_name_C)
7564 if (check_bind_name_identifier (&binding_label) != MATCH_YES)
7565 return MATCH_ERROR;
7566 }
a8b3b0b6
CR
7567
7568 /* Get the required right paren. */
7569 if (gfc_match_char (')') != MATCH_YES)
7570 {
7571 gfc_error ("Missing closing paren for binding label at %C");
7572 return MATCH_ERROR;
7573 }
7574
1eabf70a
TB
7575 if (has_name_equals && !allow_binding_name)
7576 {
7577 gfc_error ("No binding name is allowed in BIND(C) at %C");
7578 return MATCH_ERROR;
7579 }
7580
7581 if (has_name_equals && sym != NULL && sym->attr.dummy)
7582 {
7583 gfc_error ("For dummy procedure %s, no binding name is "
7584 "allowed in BIND(C) at %C", sym->name);
7585 return MATCH_ERROR;
7586 }
7587
7588
a8b3b0b6
CR
7589 /* Save the binding label to the symbol. If sym is null, we're
7590 probably matching the typespec attributes of a declaration and
7591 haven't gotten the name yet, and therefore, no symbol yet. */
62603fae 7592 if (binding_label)
a8b3b0b6
CR
7593 {
7594 if (sym != NULL)
62603fae 7595 sym->binding_label = binding_label;
a8b3b0b6 7596 else
62603fae 7597 curr_binding_label = binding_label;
a8b3b0b6 7598 }
1eabf70a 7599 else if (allow_binding_name)
a8b3b0b6
CR
7600 {
7601 /* No binding label, but if symbol isn't null, we
1eabf70a
TB
7602 can set the label for it here.
7603 If name="" or allow_binding_name is false, no C binding name is
1cc0e193 7604 created. */
a8b3b0b6 7605 if (sym != NULL && sym->name != NULL && has_name_equals == 0)
62603fae 7606 sym->binding_label = IDENTIFIER_POINTER (get_identifier (sym->name));
a8b3b0b6 7607 }
9e1d712c 7608
129d15a3
JW
7609 if (has_name_equals && gfc_current_state () == COMP_INTERFACE
7610 && current_interface.type == INTERFACE_ABSTRACT)
9e1d712c
TB
7611 {
7612 gfc_error ("NAME not allowed on BIND(C) for ABSTRACT INTERFACE at %C");
7613 return MATCH_ERROR;
7614 }
7615
a8b3b0b6
CR
7616 return MATCH_YES;
7617}
7618
7619
1f2959f0 7620/* Return nonzero if we're currently compiling a contained procedure. */
ddc9ce91
TS
7621
7622static int
7623contained_procedure (void)
7624{
083de129 7625 gfc_state_data *s = gfc_state_stack;
ddc9ce91 7626
083de129
TB
7627 if ((s->state == COMP_SUBROUTINE || s->state == COMP_FUNCTION)
7628 && s->previous != NULL && s->previous->state == COMP_CONTAINS)
7629 return 1;
ddc9ce91
TS
7630
7631 return 0;
7632}
7633
d51347f9 7634/* Set the kind of each enumerator. The kind is selected such that it is
25d8f0a2
TS
7635 interoperable with the corresponding C enumeration type, making
7636 sure that -fshort-enums is honored. */
7637
7638static void
7639set_enum_kind(void)
7640{
7641 enumerator_history *current_history = NULL;
7642 int kind;
7643 int i;
7644
7645 if (max_enum == NULL || enum_history == NULL)
7646 return;
7647
cab129d1 7648 if (!flag_short_enums)
d51347f9
TB
7649 return;
7650
25d8f0a2
TS
7651 i = 0;
7652 do
7653 {
7654 kind = gfc_integer_kinds[i++].kind;
7655 }
d51347f9 7656 while (kind < gfc_c_int_kind
25d8f0a2
TS
7657 && gfc_check_integer_range (max_enum->initializer->value.integer,
7658 kind) != ARITH_OK);
7659
7660 current_history = enum_history;
7661 while (current_history != NULL)
7662 {
7663 current_history->sym->ts.kind = kind;
7664 current_history = current_history->next;
7665 }
7666}
7667
636dff67 7668
6de9cd9a 7669/* Match any of the various end-block statements. Returns the type of
9abe5e56
DK
7670 END to the caller. The END INTERFACE, END IF, END DO, END SELECT
7671 and END BLOCK statements cannot be replaced by a single END statement. */
6de9cd9a
DN
7672
7673match
636dff67 7674gfc_match_end (gfc_statement *st)
6de9cd9a
DN
7675{
7676 char name[GFC_MAX_SYMBOL_LEN + 1];
7677 gfc_compile_state state;
7678 locus old_loc;
7679 const char *block_name;
7680 const char *target;
ddc9ce91 7681 int eos_ok;
6de9cd9a 7682 match m;
0cab6b73
TK
7683 gfc_namespace *parent_ns, *ns, *prev_ns;
7684 gfc_namespace **nsp;
63af1586 7685 bool abreviated_modproc_decl = false;
874108a9 7686 bool got_matching_end = false;
6de9cd9a 7687
63645982 7688 old_loc = gfc_current_locus;
6de9cd9a
DN
7689 if (gfc_match ("end") != MATCH_YES)
7690 return MATCH_NO;
7691
7692 state = gfc_current_state ();
636dff67
SK
7693 block_name = gfc_current_block () == NULL
7694 ? NULL : gfc_current_block ()->name;
6de9cd9a 7695
03af1e4c 7696 switch (state)
6de9cd9a 7697 {
03af1e4c
DK
7698 case COMP_ASSOCIATE:
7699 case COMP_BLOCK:
3a1fd30c 7700 if (!strncmp (block_name, "block@", strlen("block@")))
03af1e4c
DK
7701 block_name = NULL;
7702 break;
7703
7704 case COMP_CONTAINS:
7705 case COMP_DERIVED_CONTAINS:
6de9cd9a 7706 state = gfc_state_stack->previous->state;
636dff67
SK
7707 block_name = gfc_state_stack->previous->sym == NULL
7708 ? NULL : gfc_state_stack->previous->sym->name;
63af1586
PT
7709 abreviated_modproc_decl = gfc_state_stack->previous->sym
7710 && gfc_state_stack->previous->sym->abr_modproc_decl;
03af1e4c
DK
7711 break;
7712
7713 default:
7714 break;
6de9cd9a
DN
7715 }
7716
63af1586
PT
7717 if (!abreviated_modproc_decl)
7718 abreviated_modproc_decl = gfc_current_block ()
7719 && gfc_current_block ()->abr_modproc_decl;
4668d6f9 7720
6de9cd9a
DN
7721 switch (state)
7722 {
7723 case COMP_NONE:
7724 case COMP_PROGRAM:
7725 *st = ST_END_PROGRAM;
7726 target = " program";
ddc9ce91 7727 eos_ok = 1;
6de9cd9a
DN
7728 break;
7729
7730 case COMP_SUBROUTINE:
7731 *st = ST_END_SUBROUTINE;
4668d6f9 7732 if (!abreviated_modproc_decl)
6de9cd9a 7733 target = " subroutine";
4668d6f9
PT
7734 else
7735 target = " procedure";
ddc9ce91 7736 eos_ok = !contained_procedure ();
6de9cd9a
DN
7737 break;
7738
7739 case COMP_FUNCTION:
7740 *st = ST_END_FUNCTION;
4668d6f9 7741 if (!abreviated_modproc_decl)
6de9cd9a 7742 target = " function";
4668d6f9
PT
7743 else
7744 target = " procedure";
ddc9ce91 7745 eos_ok = !contained_procedure ();
6de9cd9a
DN
7746 break;
7747
7748 case COMP_BLOCK_DATA:
7749 *st = ST_END_BLOCK_DATA;
7750 target = " block data";
ddc9ce91 7751 eos_ok = 1;
6de9cd9a
DN
7752 break;
7753
7754 case COMP_MODULE:
7755 *st = ST_END_MODULE;
7756 target = " module";
ddc9ce91 7757 eos_ok = 1;
6de9cd9a
DN
7758 break;
7759
4668d6f9
PT
7760 case COMP_SUBMODULE:
7761 *st = ST_END_SUBMODULE;
7762 target = " submodule";
7763 eos_ok = 1;
7764 break;
7765
6de9cd9a
DN
7766 case COMP_INTERFACE:
7767 *st = ST_END_INTERFACE;
7768 target = " interface";
ddc9ce91 7769 eos_ok = 0;
6de9cd9a
DN
7770 break;
7771
f6288c24
FR
7772 case COMP_MAP:
7773 *st = ST_END_MAP;
7774 target = " map";
7775 eos_ok = 0;
7776 break;
7777
7778 case COMP_UNION:
7779 *st = ST_END_UNION;
7780 target = " union";
7781 eos_ok = 0;
7782 break;
7783
7784 case COMP_STRUCTURE:
7785 *st = ST_END_STRUCTURE;
7786 target = " structure";
7787 eos_ok = 0;
7788 break;
7789
6de9cd9a 7790 case COMP_DERIVED:
30b608eb 7791 case COMP_DERIVED_CONTAINS:
6de9cd9a
DN
7792 *st = ST_END_TYPE;
7793 target = " type";
ddc9ce91 7794 eos_ok = 0;
6de9cd9a
DN
7795 break;
7796
03af1e4c
DK
7797 case COMP_ASSOCIATE:
7798 *st = ST_END_ASSOCIATE;
7799 target = " associate";
7800 eos_ok = 0;
7801 break;
7802
9abe5e56
DK
7803 case COMP_BLOCK:
7804 *st = ST_END_BLOCK;
7805 target = " block";
7806 eos_ok = 0;
7807 break;
7808
6de9cd9a
DN
7809 case COMP_IF:
7810 *st = ST_ENDIF;
7811 target = " if";
ddc9ce91 7812 eos_ok = 0;
6de9cd9a
DN
7813 break;
7814
7815 case COMP_DO:
8c6a85e3 7816 case COMP_DO_CONCURRENT:
6de9cd9a
DN
7817 *st = ST_ENDDO;
7818 target = " do";
ddc9ce91 7819 eos_ok = 0;
6de9cd9a
DN
7820 break;
7821
d0a4a61c
TB
7822 case COMP_CRITICAL:
7823 *st = ST_END_CRITICAL;
7824 target = " critical";
7825 eos_ok = 0;
7826 break;
7827
6de9cd9a 7828 case COMP_SELECT:
cf2b3c22 7829 case COMP_SELECT_TYPE:
6de9cd9a
DN
7830 *st = ST_END_SELECT;
7831 target = " select";
ddc9ce91 7832 eos_ok = 0;
6de9cd9a
DN
7833 break;
7834
7835 case COMP_FORALL:
7836 *st = ST_END_FORALL;
7837 target = " forall";
ddc9ce91 7838 eos_ok = 0;
6de9cd9a
DN
7839 break;
7840
7841 case COMP_WHERE:
7842 *st = ST_END_WHERE;
7843 target = " where";
ddc9ce91 7844 eos_ok = 0;
6de9cd9a
DN
7845 break;
7846
25d8f0a2
TS
7847 case COMP_ENUM:
7848 *st = ST_END_ENUM;
7849 target = " enum";
7850 eos_ok = 0;
7851 last_initializer = NULL;
7852 set_enum_kind ();
7853 gfc_free_enum_history ();
7854 break;
7855
6de9cd9a
DN
7856 default:
7857 gfc_error ("Unexpected END statement at %C");
7858 goto cleanup;
7859 }
7860
3a43b5b3 7861 old_loc = gfc_current_locus;
6de9cd9a
DN
7862 if (gfc_match_eos () == MATCH_YES)
7863 {
272001a2
TB
7864 if (!eos_ok && (*st == ST_END_SUBROUTINE || *st == ST_END_FUNCTION))
7865 {
524af0d6 7866 if (!gfc_notify_std (GFC_STD_F2008, "END statement "
70112e2a 7867 "instead of %s statement at %L",
4668d6f9
PT
7868 abreviated_modproc_decl ? "END PROCEDURE"
7869 : gfc_ascii_statement(*st), &old_loc))
272001a2
TB
7870 goto cleanup;
7871 }
7872 else if (!eos_ok)
6de9cd9a 7873 {
66e4ab31 7874 /* We would have required END [something]. */
59ce85b5
TS
7875 gfc_error ("%s statement expected at %L",
7876 gfc_ascii_statement (*st), &old_loc);
6de9cd9a
DN
7877 goto cleanup;
7878 }
7879
7880 return MATCH_YES;
7881 }
7882
7883 /* Verify that we've got the sort of end-block that we're expecting. */
7884 if (gfc_match (target) != MATCH_YES)
7885 {
4668d6f9
PT
7886 gfc_error ("Expecting %s statement at %L", abreviated_modproc_decl
7887 ? "END PROCEDURE" : gfc_ascii_statement(*st), &old_loc);
6de9cd9a
DN
7888 goto cleanup;
7889 }
874108a9
AV
7890 else
7891 got_matching_end = true;
6de9cd9a 7892
3a43b5b3 7893 old_loc = gfc_current_locus;
6de9cd9a
DN
7894 /* If we're at the end, make sure a block name wasn't required. */
7895 if (gfc_match_eos () == MATCH_YES)
7896 {
7897
690af379 7898 if (*st != ST_ENDDO && *st != ST_ENDIF && *st != ST_END_SELECT
d0a4a61c 7899 && *st != ST_END_FORALL && *st != ST_END_WHERE && *st != ST_END_BLOCK
03af1e4c 7900 && *st != ST_END_ASSOCIATE && *st != ST_END_CRITICAL)
6de9cd9a
DN
7901 return MATCH_YES;
7902
9abe5e56 7903 if (!block_name)
6de9cd9a
DN
7904 return MATCH_YES;
7905
c4100eae 7906 gfc_error ("Expected block name of %qs in %s statement at %L",
3a43b5b3 7907 block_name, gfc_ascii_statement (*st), &old_loc);
6de9cd9a
DN
7908
7909 return MATCH_ERROR;
7910 }
7911
7912 /* END INTERFACE has a special handler for its several possible endings. */
7913 if (*st == ST_END_INTERFACE)
7914 return gfc_match_end_interface ();
7915
66e4ab31
SK
7916 /* We haven't hit the end of statement, so what is left must be an
7917 end-name. */
6de9cd9a
DN
7918 m = gfc_match_space ();
7919 if (m == MATCH_YES)
7920 m = gfc_match_name (name);
7921
7922 if (m == MATCH_NO)
7923 gfc_error ("Expected terminating name at %C");
7924 if (m != MATCH_YES)
7925 goto cleanup;
7926
7927 if (block_name == NULL)
7928 goto syntax;
7929
3d5dc929
PT
7930 /* We have to pick out the declared submodule name from the composite
7931 required by F2008:11.2.3 para 2, which ends in the declared name. */
7932 if (state == COMP_SUBMODULE)
7933 block_name = strchr (block_name, '.') + 1;
7934
3070bab4 7935 if (strcmp (name, block_name) != 0 && strcmp (block_name, "ppr@") != 0)
6de9cd9a 7936 {
c4100eae 7937 gfc_error ("Expected label %qs for %s statement at %C", block_name,
6de9cd9a
DN
7938 gfc_ascii_statement (*st));
7939 goto cleanup;
7940 }
3070bab4
JW
7941 /* Procedure pointer as function result. */
7942 else if (strcmp (block_name, "ppr@") == 0
7943 && strcmp (name, gfc_current_block ()->ns->proc_name->name) != 0)
7944 {
c4100eae 7945 gfc_error ("Expected label %qs for %s statement at %C",
3070bab4
JW
7946 gfc_current_block ()->ns->proc_name->name,
7947 gfc_ascii_statement (*st));
7948 goto cleanup;
7949 }
6de9cd9a
DN
7950
7951 if (gfc_match_eos () == MATCH_YES)
7952 return MATCH_YES;
7953
7954syntax:
7955 gfc_syntax_error (*st);
7956
7957cleanup:
63645982 7958 gfc_current_locus = old_loc;
0cab6b73
TK
7959
7960 /* If we are missing an END BLOCK, we created a half-ready namespace.
7961 Remove it from the parent namespace's sibling list. */
7962
874108a9 7963 while (state == COMP_BLOCK && !got_matching_end)
0cab6b73
TK
7964 {
7965 parent_ns = gfc_current_ns->parent;
7966
7967 nsp = &(gfc_state_stack->previous->tail->ext.block.ns);
7968
7969 prev_ns = NULL;
7970 ns = *nsp;
7971 while (ns)
7972 {
7973 if (ns == gfc_current_ns)
7974 {
7975 if (prev_ns == NULL)
7976 *nsp = NULL;
7977 else
7978 prev_ns->sibling = ns->sibling;
7979 }
7980 prev_ns = ns;
7981 ns = ns->sibling;
7982 }
874108a9 7983
0cab6b73
TK
7984 gfc_free_namespace (gfc_current_ns);
7985 gfc_current_ns = parent_ns;
9f7ba208
LK
7986 gfc_state_stack = gfc_state_stack->previous;
7987 state = gfc_current_state ();
0cab6b73
TK
7988 }
7989
6de9cd9a
DN
7990 return MATCH_ERROR;
7991}
7992
7993
7994
7995/***************** Attribute declaration statements ****************/
7996
7997/* Set the attribute of a single variable. */
7998
7999static match
8000attr_decl1 (void)
8001{
8002 char name[GFC_MAX_SYMBOL_LEN + 1];
8003 gfc_array_spec *as;
97440db5
ML
8004
8005 /* Workaround -Wmaybe-uninitialized false positive during
8006 profiledbootstrap by initializing them. */
8007 gfc_symbol *sym = NULL;
6de9cd9a
DN
8008 locus var_locus;
8009 match m;
8010
8011 as = NULL;
8012
8013 m = gfc_match_name (name);
8014 if (m != MATCH_YES)
8015 goto cleanup;
8016
08a6b8e0 8017 if (find_special (name, &sym, false))
6de9cd9a
DN
8018 return MATCH_ERROR;
8019
524af0d6 8020 if (!check_function_name (name))
bb9de0c4
JW
8021 {
8022 m = MATCH_ERROR;
8023 goto cleanup;
8024 }
f5acf0f2 8025
63645982 8026 var_locus = gfc_current_locus;
6de9cd9a
DN
8027
8028 /* Deal with possible array specification for certain attributes. */
8029 if (current_attr.dimension
be59db2d 8030 || current_attr.codimension
6de9cd9a
DN
8031 || current_attr.allocatable
8032 || current_attr.pointer
8033 || current_attr.target)
8034 {
be59db2d
TB
8035 m = gfc_match_array_spec (&as, !current_attr.codimension,
8036 !current_attr.dimension
8037 && !current_attr.pointer
8038 && !current_attr.target);
6de9cd9a
DN
8039 if (m == MATCH_ERROR)
8040 goto cleanup;
8041
8042 if (current_attr.dimension && m == MATCH_NO)
8043 {
636dff67
SK
8044 gfc_error ("Missing array specification at %L in DIMENSION "
8045 "statement", &var_locus);
6de9cd9a
DN
8046 m = MATCH_ERROR;
8047 goto cleanup;
8048 }
8049
1283ab12
TB
8050 if (current_attr.dimension && sym->value)
8051 {
8052 gfc_error ("Dimensions specified for %s at %L after its "
bd2c6270 8053 "initialization", sym->name, &var_locus);
1283ab12
TB
8054 m = MATCH_ERROR;
8055 goto cleanup;
8056 }
8057
be59db2d
TB
8058 if (current_attr.codimension && m == MATCH_NO)
8059 {
8060 gfc_error ("Missing array specification at %L in CODIMENSION "
8061 "statement", &var_locus);
8062 m = MATCH_ERROR;
8063 goto cleanup;
8064 }
8065
6de9cd9a
DN
8066 if ((current_attr.allocatable || current_attr.pointer)
8067 && (m == MATCH_YES) && (as->type != AS_DEFERRED))
8068 {
636dff67 8069 gfc_error ("Array specification must be deferred at %L", &var_locus);
6de9cd9a
DN
8070 m = MATCH_ERROR;
8071 goto cleanup;
8072 }
8073 }
8074
2e23972e
JW
8075 /* Update symbol table. DIMENSION attribute is set in
8076 gfc_set_array_spec(). For CLASS variables, this must be applied
b04533af 8077 to the first component, or '_data' field. */
d40477b4 8078 if (sym->ts.type == BT_CLASS && sym->ts.u.derived->attr.is_class)
6de9cd9a 8079 {
524af0d6 8080 if (!gfc_copy_attr (&CLASS_DATA(sym)->attr, &current_attr, &var_locus))
2e23972e
JW
8081 {
8082 m = MATCH_ERROR;
8083 goto cleanup;
8084 }
2e23972e
JW
8085 }
8086 else
8087 {
be59db2d 8088 if (current_attr.dimension == 0 && current_attr.codimension == 0
524af0d6 8089 && !gfc_copy_attr (&sym->attr, &current_attr, &var_locus))
2e23972e
JW
8090 {
8091 m = MATCH_ERROR;
8092 goto cleanup;
8093 }
6de9cd9a 8094 }
f5acf0f2 8095
528622fd 8096 if (sym->ts.type == BT_CLASS
9b6da3c7 8097 && !gfc_build_class_symbol (&sym->ts, &sym->attr, &sym->as))
96d9b22c
JW
8098 {
8099 m = MATCH_ERROR;
8100 goto cleanup;
8101 }
6de9cd9a 8102
524af0d6 8103 if (!gfc_set_array_spec (sym, as, &var_locus))
6de9cd9a
DN
8104 {
8105 m = MATCH_ERROR;
8106 goto cleanup;
8107 }
d51347f9 8108
83d890b9
AL
8109 if (sym->attr.cray_pointee && sym->as != NULL)
8110 {
8111 /* Fix the array spec. */
f5acf0f2 8112 m = gfc_mod_pointee_as (sym->as);
83d890b9
AL
8113 if (m == MATCH_ERROR)
8114 goto cleanup;
8115 }
6de9cd9a 8116
524af0d6 8117 if (!gfc_add_attribute (&sym->attr, &var_locus))
1902704e
PT
8118 {
8119 m = MATCH_ERROR;
8120 goto cleanup;
8121 }
8122
6de9cd9a
DN
8123 if ((current_attr.external || current_attr.intrinsic)
8124 && sym->attr.flavor != FL_PROCEDURE
524af0d6 8125 && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL))
6de9cd9a
DN
8126 {
8127 m = MATCH_ERROR;
8128 goto cleanup;
8129 }
8130
3070bab4
JW
8131 add_hidden_procptr_result (sym);
8132
6de9cd9a
DN
8133 return MATCH_YES;
8134
8135cleanup:
8136 gfc_free_array_spec (as);
8137 return m;
8138}
8139
8140
8141/* Generic attribute declaration subroutine. Used for attributes that
8142 just have a list of names. */
8143
8144static match
8145attr_decl (void)
8146{
8147 match m;
8148
8149 /* Gobble the optional double colon, by simply ignoring the result
8150 of gfc_match(). */
8151 gfc_match (" ::");
8152
8153 for (;;)
8154 {
8155 m = attr_decl1 ();
8156 if (m != MATCH_YES)
8157 break;
8158
8159 if (gfc_match_eos () == MATCH_YES)
8160 {
8161 m = MATCH_YES;
8162 break;
8163 }
8164
8165 if (gfc_match_char (',') != MATCH_YES)
8166 {
8167 gfc_error ("Unexpected character in variable list at %C");
8168 m = MATCH_ERROR;
8169 break;
8170 }
8171 }
8172
8173 return m;
8174}
8175
8176
83d890b9
AL
8177/* This routine matches Cray Pointer declarations of the form:
8178 pointer ( <pointer>, <pointee> )
8179 or
d51347f9
TB
8180 pointer ( <pointer1>, <pointee1> ), ( <pointer2>, <pointee2> ), ...
8181 The pointer, if already declared, should be an integer. Otherwise, we
83d890b9
AL
8182 set it as BT_INTEGER with kind gfc_index_integer_kind. The pointee may
8183 be either a scalar, or an array declaration. No space is allocated for
d51347f9 8184 the pointee. For the statement
83d890b9
AL
8185 pointer (ipt, ar(10))
8186 any subsequent uses of ar will be translated (in C-notation) as
d51347f9 8187 ar(i) => ((<type> *) ipt)(i)
b122dc6a 8188 After gimplification, pointee variable will disappear in the code. */
83d890b9
AL
8189
8190static match
8191cray_pointer_decl (void)
8192{
8193 match m;
be59db2d 8194 gfc_array_spec *as = NULL;
83d890b9
AL
8195 gfc_symbol *cptr; /* Pointer symbol. */
8196 gfc_symbol *cpte; /* Pointee symbol. */
8197 locus var_locus;
8198 bool done = false;
8199
8200 while (!done)
8201 {
8202 if (gfc_match_char ('(') != MATCH_YES)
8203 {
a4d9b221 8204 gfc_error ("Expected %<(%> at %C");
d51347f9 8205 return MATCH_ERROR;
83d890b9 8206 }
d51347f9 8207
83d890b9
AL
8208 /* Match pointer. */
8209 var_locus = gfc_current_locus;
8210 gfc_clear_attr (&current_attr);
8211 gfc_add_cray_pointer (&current_attr, &var_locus);
8212 current_ts.type = BT_INTEGER;
8213 current_ts.kind = gfc_index_integer_kind;
8214
d51347f9 8215 m = gfc_match_symbol (&cptr, 0);
83d890b9
AL
8216 if (m != MATCH_YES)
8217 {
8218 gfc_error ("Expected variable name at %C");
8219 return m;
8220 }
d51347f9 8221
524af0d6 8222 if (!gfc_add_cray_pointer (&cptr->attr, &var_locus))
83d890b9
AL
8223 return MATCH_ERROR;
8224
d51347f9 8225 gfc_set_sym_referenced (cptr);
83d890b9
AL
8226
8227 if (cptr->ts.type == BT_UNKNOWN) /* Override the type, if necessary. */
8228 {
8229 cptr->ts.type = BT_INTEGER;
d51347f9 8230 cptr->ts.kind = gfc_index_integer_kind;
83d890b9
AL
8231 }
8232 else if (cptr->ts.type != BT_INTEGER)
8233 {
e25a0da3 8234 gfc_error ("Cray pointer at %C must be an integer");
83d890b9
AL
8235 return MATCH_ERROR;
8236 }
8237 else if (cptr->ts.kind < gfc_index_integer_kind)
db30e21c 8238 gfc_warning (0, "Cray pointer at %C has %d bytes of precision;"
e25a0da3 8239 " memory addresses require %d bytes",
636dff67 8240 cptr->ts.kind, gfc_index_integer_kind);
83d890b9
AL
8241
8242 if (gfc_match_char (',') != MATCH_YES)
8243 {
8244 gfc_error ("Expected \",\" at %C");
d51347f9 8245 return MATCH_ERROR;
83d890b9
AL
8246 }
8247
d51347f9 8248 /* Match Pointee. */
83d890b9
AL
8249 var_locus = gfc_current_locus;
8250 gfc_clear_attr (&current_attr);
8251 gfc_add_cray_pointee (&current_attr, &var_locus);
8252 current_ts.type = BT_UNKNOWN;
8253 current_ts.kind = 0;
8254
8255 m = gfc_match_symbol (&cpte, 0);
8256 if (m != MATCH_YES)
8257 {
8258 gfc_error ("Expected variable name at %C");
8259 return m;
8260 }
d51347f9 8261
83d890b9 8262 /* Check for an optional array spec. */
be59db2d 8263 m = gfc_match_array_spec (&as, true, false);
83d890b9
AL
8264 if (m == MATCH_ERROR)
8265 {
8266 gfc_free_array_spec (as);
8267 return m;
8268 }
8269 else if (m == MATCH_NO)
8270 {
8271 gfc_free_array_spec (as);
8272 as = NULL;
f5acf0f2 8273 }
83d890b9 8274
524af0d6 8275 if (!gfc_add_cray_pointee (&cpte->attr, &var_locus))
83d890b9
AL
8276 return MATCH_ERROR;
8277
8278 gfc_set_sym_referenced (cpte);
8279
8280 if (cpte->as == NULL)
8281 {
524af0d6 8282 if (!gfc_set_array_spec (cpte, as, &var_locus))
83d890b9
AL
8283 gfc_internal_error ("Couldn't set Cray pointee array spec.");
8284 }
8285 else if (as != NULL)
8286 {
e25a0da3 8287 gfc_error ("Duplicate array spec for Cray pointee at %C");
83d890b9
AL
8288 gfc_free_array_spec (as);
8289 return MATCH_ERROR;
8290 }
f5acf0f2 8291
83d890b9 8292 as = NULL;
f5acf0f2 8293
83d890b9
AL
8294 if (cpte->as != NULL)
8295 {
8296 /* Fix array spec. */
8297 m = gfc_mod_pointee_as (cpte->as);
8298 if (m == MATCH_ERROR)
8299 return m;
f5acf0f2
PT
8300 }
8301
83d890b9 8302 /* Point the Pointee at the Pointer. */
b122dc6a 8303 cpte->cp_pointer = cptr;
83d890b9
AL
8304
8305 if (gfc_match_char (')') != MATCH_YES)
8306 {
8307 gfc_error ("Expected \")\" at %C");
f5acf0f2 8308 return MATCH_ERROR;
83d890b9
AL
8309 }
8310 m = gfc_match_char (',');
8311 if (m != MATCH_YES)
8312 done = true; /* Stop searching for more declarations. */
8313
8314 }
f5acf0f2 8315
83d890b9
AL
8316 if (m == MATCH_ERROR /* Failed when trying to find ',' above. */
8317 || gfc_match_eos () != MATCH_YES)
8318 {
a4d9b221 8319 gfc_error ("Expected %<,%> or end of statement at %C");
83d890b9
AL
8320 return MATCH_ERROR;
8321 }
8322 return MATCH_YES;
8323}
8324
8325
6de9cd9a
DN
8326match
8327gfc_match_external (void)
8328{
8329
8330 gfc_clear_attr (&current_attr);
1902704e 8331 current_attr.external = 1;
6de9cd9a
DN
8332
8333 return attr_decl ();
8334}
8335
8336
6de9cd9a
DN
8337match
8338gfc_match_intent (void)
8339{
8340 sym_intent intent;
8341
9abe5e56
DK
8342 /* This is not allowed within a BLOCK construct! */
8343 if (gfc_current_state () == COMP_BLOCK)
8344 {
8345 gfc_error ("INTENT is not allowed inside of BLOCK at %C");
8346 return MATCH_ERROR;
8347 }
8348
6de9cd9a
DN
8349 intent = match_intent_spec ();
8350 if (intent == INTENT_UNKNOWN)
8351 return MATCH_ERROR;
8352
8353 gfc_clear_attr (&current_attr);
1902704e 8354 current_attr.intent = intent;
6de9cd9a
DN
8355
8356 return attr_decl ();
8357}
8358
8359
8360match
8361gfc_match_intrinsic (void)
8362{
8363
8364 gfc_clear_attr (&current_attr);
1902704e 8365 current_attr.intrinsic = 1;
6de9cd9a
DN
8366
8367 return attr_decl ();
8368}
8369
8370
8371match
8372gfc_match_optional (void)
8373{
9abe5e56
DK
8374 /* This is not allowed within a BLOCK construct! */
8375 if (gfc_current_state () == COMP_BLOCK)
8376 {
8377 gfc_error ("OPTIONAL is not allowed inside of BLOCK at %C");
8378 return MATCH_ERROR;
8379 }
6de9cd9a
DN
8380
8381 gfc_clear_attr (&current_attr);
1902704e 8382 current_attr.optional = 1;
6de9cd9a
DN
8383
8384 return attr_decl ();
8385}
8386
8387
8388match
8389gfc_match_pointer (void)
8390{
83d890b9 8391 gfc_gobble_whitespace ();
8fc541d3 8392 if (gfc_peek_ascii_char () == '(')
83d890b9 8393 {
c61819ff 8394 if (!flag_cray_pointer)
83d890b9 8395 {
636dff67
SK
8396 gfc_error ("Cray pointer declaration at %C requires -fcray-pointer "
8397 "flag");
83d890b9
AL
8398 return MATCH_ERROR;
8399 }
8400 return cray_pointer_decl ();
8401 }
8402 else
8403 {
8404 gfc_clear_attr (&current_attr);
1902704e 8405 current_attr.pointer = 1;
f5acf0f2 8406
83d890b9
AL
8407 return attr_decl ();
8408 }
6de9cd9a
DN
8409}
8410
8411
8412match
8413gfc_match_allocatable (void)
8414{
6de9cd9a 8415 gfc_clear_attr (&current_attr);
1902704e 8416 current_attr.allocatable = 1;
6de9cd9a
DN
8417
8418 return attr_decl ();
8419}
8420
8421
be59db2d
TB
8422match
8423gfc_match_codimension (void)
8424{
8425 gfc_clear_attr (&current_attr);
8426 current_attr.codimension = 1;
8427
8428 return attr_decl ();
8429}
8430
8431
fe4e525c
TB
8432match
8433gfc_match_contiguous (void)
8434{
524af0d6 8435 if (!gfc_notify_std (GFC_STD_F2008, "CONTIGUOUS statement at %C"))
fe4e525c
TB
8436 return MATCH_ERROR;
8437
8438 gfc_clear_attr (&current_attr);
8439 current_attr.contiguous = 1;
8440
8441 return attr_decl ();
8442}
8443
8444
6de9cd9a
DN
8445match
8446gfc_match_dimension (void)
8447{
6de9cd9a 8448 gfc_clear_attr (&current_attr);
1902704e 8449 current_attr.dimension = 1;
6de9cd9a
DN
8450
8451 return attr_decl ();
8452}
8453
8454
8455match
8456gfc_match_target (void)
8457{
6de9cd9a 8458 gfc_clear_attr (&current_attr);
1902704e 8459 current_attr.target = 1;
6de9cd9a
DN
8460
8461 return attr_decl ();
8462}
8463
8464
8465/* Match the list of entities being specified in a PUBLIC or PRIVATE
8466 statement. */
8467
8468static match
8469access_attr_decl (gfc_statement st)
8470{
8471 char name[GFC_MAX_SYMBOL_LEN + 1];
8472 interface_type type;
8473 gfc_user_op *uop;
c3f34952 8474 gfc_symbol *sym, *dt_sym;
a1ee985f 8475 gfc_intrinsic_op op;
6de9cd9a
DN
8476 match m;
8477
8478 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
8479 goto done;
8480
8481 for (;;)
8482 {
a1ee985f 8483 m = gfc_match_generic_spec (&type, name, &op);
6de9cd9a
DN
8484 if (m == MATCH_NO)
8485 goto syntax;
8486 if (m == MATCH_ERROR)
8487 return MATCH_ERROR;
8488
8489 switch (type)
8490 {
8491 case INTERFACE_NAMELESS:
9e1d712c 8492 case INTERFACE_ABSTRACT:
6de9cd9a
DN
8493 goto syntax;
8494
8495 case INTERFACE_GENERIC:
e73d3ca6 8496 case INTERFACE_DTIO:
dc42a736 8497
6de9cd9a
DN
8498 if (gfc_get_symbol (name, NULL, &sym))
8499 goto done;
8500
41036686
PT
8501 if (type == INTERFACE_DTIO
8502 && gfc_current_ns->proc_name
8503 && gfc_current_ns->proc_name->attr.flavor == FL_MODULE
8504 && sym->attr.flavor == FL_UNKNOWN)
8505 sym->attr.flavor = FL_PROCEDURE;
8506
70112e2a
PT
8507 if (!gfc_add_access (&sym->attr,
8508 (st == ST_PUBLIC)
8509 ? ACCESS_PUBLIC : ACCESS_PRIVATE,
524af0d6 8510 sym->name, NULL))
6de9cd9a
DN
8511 return MATCH_ERROR;
8512
c3f34952 8513 if (sym->attr.generic && (dt_sym = gfc_find_dt_in_generic (sym))
70112e2a
PT
8514 && !gfc_add_access (&dt_sym->attr,
8515 (st == ST_PUBLIC)
8516 ? ACCESS_PUBLIC : ACCESS_PRIVATE,
524af0d6 8517 sym->name, NULL))
c3f34952
TB
8518 return MATCH_ERROR;
8519
6de9cd9a
DN
8520 break;
8521
8522 case INTERFACE_INTRINSIC_OP:
a1ee985f 8523 if (gfc_current_ns->operator_access[op] == ACCESS_UNKNOWN)
6de9cd9a 8524 {
fb03a37e
TK
8525 gfc_intrinsic_op other_op;
8526
a1ee985f 8527 gfc_current_ns->operator_access[op] =
6de9cd9a 8528 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
fb03a37e
TK
8529
8530 /* Handle the case if there is another op with the same
8531 function, for INTRINSIC_EQ vs. INTRINSIC_EQ_OS and so on. */
8532 other_op = gfc_equivalent_op (op);
8533
8534 if (other_op != INTRINSIC_NONE)
8535 gfc_current_ns->operator_access[other_op] =
8536 (st == ST_PUBLIC) ? ACCESS_PUBLIC : ACCESS_PRIVATE;
8537
6de9cd9a
DN
8538 }
8539 else
8540 {
8541 gfc_error ("Access specification of the %s operator at %C has "
a1ee985f 8542 "already been specified", gfc_op2string (op));
6de9cd9a
DN
8543 goto done;
8544 }
8545
8546 break;
8547
8548 case INTERFACE_USER_OP:
8549 uop = gfc_get_uop (name);
8550
8551 if (uop->access == ACCESS_UNKNOWN)
8552 {
636dff67
SK
8553 uop->access = (st == ST_PUBLIC)
8554 ? ACCESS_PUBLIC : ACCESS_PRIVATE;
6de9cd9a
DN
8555 }
8556 else
8557 {
636dff67
SK
8558 gfc_error ("Access specification of the .%s. operator at %C "
8559 "has already been specified", sym->name);
6de9cd9a
DN
8560 goto done;
8561 }
8562
8563 break;
8564 }
8565
8566 if (gfc_match_char (',') == MATCH_NO)
8567 break;
8568 }
8569
8570 if (gfc_match_eos () != MATCH_YES)
8571 goto syntax;
8572 return MATCH_YES;
8573
8574syntax:
8575 gfc_syntax_error (st);
8576
8577done:
8578 return MATCH_ERROR;
8579}
8580
8581
ee7e677f
TB
8582match
8583gfc_match_protected (void)
8584{
8585 gfc_symbol *sym;
8586 match m;
8587
73641c88
SK
8588 if (!gfc_current_ns->proc_name
8589 || gfc_current_ns->proc_name->attr.flavor != FL_MODULE)
ee7e677f
TB
8590 {
8591 gfc_error ("PROTECTED at %C only allowed in specification "
8592 "part of a module");
8593 return MATCH_ERROR;
8594
8595 }
8596
524af0d6 8597 if (!gfc_notify_std (GFC_STD_F2003, "PROTECTED statement at %C"))
ee7e677f
TB
8598 return MATCH_ERROR;
8599
8600 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
8601 {
8602 return MATCH_ERROR;
8603 }
8604
8605 if (gfc_match_eos () == MATCH_YES)
8606 goto syntax;
8607
8608 for(;;)
8609 {
8610 m = gfc_match_symbol (&sym, 0);
8611 switch (m)
8612 {
8613 case MATCH_YES:
524af0d6 8614 if (!gfc_add_protected (&sym->attr, sym->name, &gfc_current_locus))
ee7e677f
TB
8615 return MATCH_ERROR;
8616 goto next_item;
8617
8618 case MATCH_NO:
8619 break;
8620
8621 case MATCH_ERROR:
8622 return MATCH_ERROR;
8623 }
8624
8625 next_item:
8626 if (gfc_match_eos () == MATCH_YES)
8627 break;
8628 if (gfc_match_char (',') != MATCH_YES)
8629 goto syntax;
8630 }
8631
8632 return MATCH_YES;
8633
8634syntax:
8635 gfc_error ("Syntax error in PROTECTED statement at %C");
8636 return MATCH_ERROR;
8637}
8638
8639
86bf520d 8640/* The PRIVATE statement is a bit weird in that it can be an attribute
df2fba9e 8641 declaration, but also works as a standalone statement inside of a
6de9cd9a
DN
8642 type declaration or a module. */
8643
8644match
636dff67 8645gfc_match_private (gfc_statement *st)
6de9cd9a
DN
8646{
8647
8648 if (gfc_match ("private") != MATCH_YES)
8649 return MATCH_NO;
8650
d51347f9 8651 if (gfc_current_state () != COMP_MODULE
30b608eb
DK
8652 && !(gfc_current_state () == COMP_DERIVED
8653 && gfc_state_stack->previous
8654 && gfc_state_stack->previous->state == COMP_MODULE)
8655 && !(gfc_current_state () == COMP_DERIVED_CONTAINS
8656 && gfc_state_stack->previous && gfc_state_stack->previous->previous
8657 && gfc_state_stack->previous->previous->state == COMP_MODULE))
d51347f9
TB
8658 {
8659 gfc_error ("PRIVATE statement at %C is only allowed in the "
8660 "specification part of a module");
8661 return MATCH_ERROR;
8662 }
8663
6de9cd9a
DN
8664 if (gfc_current_state () == COMP_DERIVED)
8665 {
8666 if (gfc_match_eos () == MATCH_YES)
8667 {
8668 *st = ST_PRIVATE;
8669 return MATCH_YES;
8670 }
8671
8672 gfc_syntax_error (ST_PRIVATE);
8673 return MATCH_ERROR;
8674 }
8675
8676 if (gfc_match_eos () == MATCH_YES)
8677 {
8678 *st = ST_PRIVATE;
8679 return MATCH_YES;
8680 }
8681
8682 *st = ST_ATTR_DECL;
8683 return access_attr_decl (ST_PRIVATE);
8684}
8685
8686
8687match
636dff67 8688gfc_match_public (gfc_statement *st)
6de9cd9a
DN
8689{
8690
8691 if (gfc_match ("public") != MATCH_YES)
8692 return MATCH_NO;
8693
d51347f9
TB
8694 if (gfc_current_state () != COMP_MODULE)
8695 {
8696 gfc_error ("PUBLIC statement at %C is only allowed in the "
8697 "specification part of a module");
8698 return MATCH_ERROR;
8699 }
8700
6de9cd9a
DN
8701 if (gfc_match_eos () == MATCH_YES)
8702 {
8703 *st = ST_PUBLIC;
8704 return MATCH_YES;
8705 }
8706
8707 *st = ST_ATTR_DECL;
8708 return access_attr_decl (ST_PUBLIC);
8709}
8710
8711
8712/* Workhorse for gfc_match_parameter. */
8713
8714static match
8715do_parm (void)
8716{
8717 gfc_symbol *sym;
8718 gfc_expr *init;
8719 match m;
524af0d6 8720 bool t;
6de9cd9a
DN
8721
8722 m = gfc_match_symbol (&sym, 0);
8723 if (m == MATCH_NO)
8724 gfc_error ("Expected variable name at %C in PARAMETER statement");
8725
8726 if (m != MATCH_YES)
8727 return m;
8728
8729 if (gfc_match_char ('=') == MATCH_NO)
8730 {
8731 gfc_error ("Expected = sign in PARAMETER statement at %C");
8732 return MATCH_ERROR;
8733 }
8734
8735 m = gfc_match_init_expr (&init);
8736 if (m == MATCH_NO)
8737 gfc_error ("Expected expression at %C in PARAMETER statement");
8738 if (m != MATCH_YES)
8739 return m;
8740
8741 if (sym->ts.type == BT_UNKNOWN
524af0d6 8742 && !gfc_set_default_type (sym, 1, NULL))
6de9cd9a
DN
8743 {
8744 m = MATCH_ERROR;
8745 goto cleanup;
8746 }
8747
524af0d6
JB
8748 if (!gfc_check_assign_symbol (sym, NULL, init)
8749 || !gfc_add_flavor (&sym->attr, FL_PARAMETER, sym->name, NULL))
6de9cd9a
DN
8750 {
8751 m = MATCH_ERROR;
8752 goto cleanup;
8753 }
8754
1283ab12
TB
8755 if (sym->value)
8756 {
8757 gfc_error ("Initializing already initialized variable at %C");
8758 m = MATCH_ERROR;
8759 goto cleanup;
8760 }
8761
7919373d 8762 t = add_init_expr_to_sym (sym->name, &init, &gfc_current_locus);
524af0d6 8763 return (t) ? MATCH_YES : MATCH_ERROR;
6de9cd9a
DN
8764
8765cleanup:
8766 gfc_free_expr (init);
8767 return m;
8768}
8769
8770
8771/* Match a parameter statement, with the weird syntax that these have. */
8772
8773match
8774gfc_match_parameter (void)
8775{
35ea947f 8776 const char *term = " )%t";
6de9cd9a
DN
8777 match m;
8778
8779 if (gfc_match_char ('(') == MATCH_NO)
35ea947f
FR
8780 {
8781 /* With legacy PARAMETER statements, don't expect a terminating ')'. */
8782 if (!gfc_notify_std (GFC_STD_LEGACY, "PARAMETER without '()' at %C"))
8783 return MATCH_NO;
8784 term = " %t";
8785 }
6de9cd9a
DN
8786
8787 for (;;)
8788 {
8789 m = do_parm ();
8790 if (m != MATCH_YES)
8791 break;
8792
35ea947f 8793 if (gfc_match (term) == MATCH_YES)
6de9cd9a
DN
8794 break;
8795
8796 if (gfc_match_char (',') != MATCH_YES)
8797 {
8798 gfc_error ("Unexpected characters in PARAMETER statement at %C");
8799 m = MATCH_ERROR;
8800 break;
8801 }
8802 }
8803
8804 return m;
8805}
8806
8807
34d567d1
FR
8808match
8809gfc_match_automatic (void)
8810{
8811 gfc_symbol *sym;
8812 match m;
8813 bool seen_symbol = false;
8814
8815 if (!flag_dec_static)
8816 {
cf004230
FR
8817 gfc_error ("%s at %C is a DEC extension, enable with "
8818 "%<-fdec-static%>",
8819 "AUTOMATIC"
8820 );
34d567d1
FR
8821 return MATCH_ERROR;
8822 }
8823
8824 gfc_match (" ::");
8825
8826 for (;;)
8827 {
8828 m = gfc_match_symbol (&sym, 0);
8829 switch (m)
8830 {
8831 case MATCH_NO:
8832 break;
8833
8834 case MATCH_ERROR:
8835 return MATCH_ERROR;
8836
8837 case MATCH_YES:
8838 if (!gfc_add_automatic (&sym->attr, sym->name, &gfc_current_locus))
8839 return MATCH_ERROR;
8840 seen_symbol = true;
8841 break;
8842 }
8843
8844 if (gfc_match_eos () == MATCH_YES)
8845 break;
8846 if (gfc_match_char (',') != MATCH_YES)
8847 goto syntax;
8848 }
8849
8850 if (!seen_symbol)
8851 {
8852 gfc_error ("Expected entity-list in AUTOMATIC statement at %C");
8853 return MATCH_ERROR;
8854 }
8855
8856 return MATCH_YES;
8857
8858syntax:
8859 gfc_error ("Syntax error in AUTOMATIC statement at %C");
8860 return MATCH_ERROR;
8861}
8862
8863
8864match
8865gfc_match_static (void)
8866{
8867 gfc_symbol *sym;
8868 match m;
8869 bool seen_symbol = false;
8870
8871 if (!flag_dec_static)
8872 {
cf004230
FR
8873 gfc_error ("%s at %C is a DEC extension, enable with "
8874 "%<-fdec-static%>",
8875 "STATIC");
34d567d1
FR
8876 return MATCH_ERROR;
8877 }
8878
8879 gfc_match (" ::");
8880
8881 for (;;)
8882 {
8883 m = gfc_match_symbol (&sym, 0);
8884 switch (m)
8885 {
8886 case MATCH_NO:
8887 break;
8888
8889 case MATCH_ERROR:
8890 return MATCH_ERROR;
8891
8892 case MATCH_YES:
8893 if (!gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name,
8894 &gfc_current_locus))
8895 return MATCH_ERROR;
8896 seen_symbol = true;
8897 break;
8898 }
8899
8900 if (gfc_match_eos () == MATCH_YES)
8901 break;
8902 if (gfc_match_char (',') != MATCH_YES)
8903 goto syntax;
8904 }
8905
8906 if (!seen_symbol)
8907 {
8908 gfc_error ("Expected entity-list in STATIC statement at %C");
8909 return MATCH_ERROR;
8910 }
8911
8912 return MATCH_YES;
8913
8914syntax:
8915 gfc_error ("Syntax error in STATIC statement at %C");
8916 return MATCH_ERROR;
8917}
8918
8919
6de9cd9a
DN
8920/* Save statements have a special syntax. */
8921
8922match
8923gfc_match_save (void)
8924{
9056bd70
TS
8925 char n[GFC_MAX_SYMBOL_LEN+1];
8926 gfc_common_head *c;
6de9cd9a
DN
8927 gfc_symbol *sym;
8928 match m;
8929
8930 if (gfc_match_eos () == MATCH_YES)
8931 {
8932 if (gfc_current_ns->seen_save)
8933 {
524af0d6
JB
8934 if (!gfc_notify_std (GFC_STD_LEGACY, "Blanket SAVE statement at %C "
8935 "follows previous SAVE statement"))
09e87839 8936 return MATCH_ERROR;
6de9cd9a
DN
8937 }
8938
8939 gfc_current_ns->save_all = gfc_current_ns->seen_save = 1;
8940 return MATCH_YES;
8941 }
8942
8943 if (gfc_current_ns->save_all)
8944 {
524af0d6
JB
8945 if (!gfc_notify_std (GFC_STD_LEGACY, "SAVE statement at %C follows "
8946 "blanket SAVE statement"))
09e87839 8947 return MATCH_ERROR;
6de9cd9a
DN
8948 }
8949
8950 gfc_match (" ::");
8951
8952 for (;;)
8953 {
8954 m = gfc_match_symbol (&sym, 0);
8955 switch (m)
8956 {
8957 case MATCH_YES:
70112e2a 8958 if (!gfc_add_save (&sym->attr, SAVE_EXPLICIT, sym->name,
524af0d6 8959 &gfc_current_locus))
6de9cd9a
DN
8960 return MATCH_ERROR;
8961 goto next_item;
8962
8963 case MATCH_NO:
8964 break;
8965
8966 case MATCH_ERROR:
8967 return MATCH_ERROR;
8968 }
8969
9056bd70 8970 m = gfc_match (" / %n /", &n);
6de9cd9a
DN
8971 if (m == MATCH_ERROR)
8972 return MATCH_ERROR;
8973 if (m == MATCH_NO)
8974 goto syntax;
8975
53814b8f 8976 c = gfc_get_common (n, 0);
9056bd70
TS
8977 c->saved = 1;
8978
6de9cd9a
DN
8979 gfc_current_ns->seen_save = 1;
8980
8981 next_item:
8982 if (gfc_match_eos () == MATCH_YES)
8983 break;
8984 if (gfc_match_char (',') != MATCH_YES)
8985 goto syntax;
8986 }
8987
8988 return MATCH_YES;
8989
8990syntax:
8991 gfc_error ("Syntax error in SAVE statement at %C");
8992 return MATCH_ERROR;
8993}
8994
8995
06469efd
PT
8996match
8997gfc_match_value (void)
8998{
8999 gfc_symbol *sym;
9000 match m;
9001
9abe5e56
DK
9002 /* This is not allowed within a BLOCK construct! */
9003 if (gfc_current_state () == COMP_BLOCK)
9004 {
9005 gfc_error ("VALUE is not allowed inside of BLOCK at %C");
9006 return MATCH_ERROR;
9007 }
9008
524af0d6 9009 if (!gfc_notify_std (GFC_STD_F2003, "VALUE statement at %C"))
06469efd
PT
9010 return MATCH_ERROR;
9011
9012 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
9013 {
9014 return MATCH_ERROR;
9015 }
9016
9017 if (gfc_match_eos () == MATCH_YES)
9018 goto syntax;
9019
9020 for(;;)
9021 {
9022 m = gfc_match_symbol (&sym, 0);
9023 switch (m)
9024 {
9025 case MATCH_YES:
524af0d6 9026 if (!gfc_add_value (&sym->attr, sym->name, &gfc_current_locus))
06469efd
PT
9027 return MATCH_ERROR;
9028 goto next_item;
9029
9030 case MATCH_NO:
9031 break;
9032
9033 case MATCH_ERROR:
9034 return MATCH_ERROR;
9035 }
9036
9037 next_item:
9038 if (gfc_match_eos () == MATCH_YES)
9039 break;
9040 if (gfc_match_char (',') != MATCH_YES)
9041 goto syntax;
9042 }
9043
9044 return MATCH_YES;
9045
9046syntax:
9047 gfc_error ("Syntax error in VALUE statement at %C");
9048 return MATCH_ERROR;
9049}
9050
66e4ab31 9051
775e6c3a
TB
9052match
9053gfc_match_volatile (void)
9054{
9055 gfc_symbol *sym;
9056 match m;
9057
524af0d6 9058 if (!gfc_notify_std (GFC_STD_F2003, "VOLATILE statement at %C"))
775e6c3a
TB
9059 return MATCH_ERROR;
9060
9061 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
9062 {
9063 return MATCH_ERROR;
9064 }
9065
9066 if (gfc_match_eos () == MATCH_YES)
9067 goto syntax;
9068
9069 for(;;)
9070 {
f5acf0f2 9071 /* VOLATILE is special because it can be added to host-associated
1cc0e193 9072 symbols locally. Except for coarrays. */
9bce3c1c 9073 m = gfc_match_symbol (&sym, 1);
775e6c3a
TB
9074 switch (m)
9075 {
9076 case MATCH_YES:
be59db2d
TB
9077 /* F2008, C560+C561. VOLATILE for host-/use-associated variable or
9078 for variable in a BLOCK which is defined outside of the BLOCK. */
9079 if (sym->ns != gfc_current_ns && sym->attr.codimension)
9080 {
c4100eae 9081 gfc_error ("Specifying VOLATILE for coarray variable %qs at "
be59db2d
TB
9082 "%C, which is use-/host-associated", sym->name);
9083 return MATCH_ERROR;
9084 }
524af0d6 9085 if (!gfc_add_volatile (&sym->attr, sym->name, &gfc_current_locus))
775e6c3a
TB
9086 return MATCH_ERROR;
9087 goto next_item;
9088
9089 case MATCH_NO:
9090 break;
9091
9092 case MATCH_ERROR:
9093 return MATCH_ERROR;
9094 }
9095
9096 next_item:
9097 if (gfc_match_eos () == MATCH_YES)
9098 break;
9099 if (gfc_match_char (',') != MATCH_YES)
9100 goto syntax;
9101 }
9102
9103 return MATCH_YES;
9104
9105syntax:
9106 gfc_error ("Syntax error in VOLATILE statement at %C");
9107 return MATCH_ERROR;
9108}
9109
9110
1eee5628
TB
9111match
9112gfc_match_asynchronous (void)
9113{
9114 gfc_symbol *sym;
9115 match m;
9116
524af0d6 9117 if (!gfc_notify_std (GFC_STD_F2003, "ASYNCHRONOUS statement at %C"))
1eee5628
TB
9118 return MATCH_ERROR;
9119
9120 if (gfc_match (" ::") == MATCH_NO && gfc_match_space () == MATCH_NO)
9121 {
9122 return MATCH_ERROR;
9123 }
9124
9125 if (gfc_match_eos () == MATCH_YES)
9126 goto syntax;
9127
9128 for(;;)
9129 {
f5acf0f2 9130 /* ASYNCHRONOUS is special because it can be added to host-associated
1eee5628
TB
9131 symbols locally. */
9132 m = gfc_match_symbol (&sym, 1);
9133 switch (m)
9134 {
9135 case MATCH_YES:
524af0d6 9136 if (!gfc_add_asynchronous (&sym->attr, sym->name, &gfc_current_locus))
1eee5628
TB
9137 return MATCH_ERROR;
9138 goto next_item;
9139
9140 case MATCH_NO:
9141 break;
9142
9143 case MATCH_ERROR:
9144 return MATCH_ERROR;
9145 }
9146
9147 next_item:
9148 if (gfc_match_eos () == MATCH_YES)
9149 break;
9150 if (gfc_match_char (',') != MATCH_YES)
9151 goto syntax;
9152 }
9153
9154 return MATCH_YES;
9155
9156syntax:
9157 gfc_error ("Syntax error in ASYNCHRONOUS statement at %C");
9158 return MATCH_ERROR;
9159}
9160
9161
4668d6f9
PT
9162/* Match a module procedure statement in a submodule. */
9163
9164match
9165gfc_match_submod_proc (void)
9166{
9167 char name[GFC_MAX_SYMBOL_LEN + 1];
9168 gfc_symbol *sym, *fsym;
9169 match m;
9170 gfc_formal_arglist *formal, *head, *tail;
9171
9172 if (gfc_current_state () != COMP_CONTAINS
9173 || !(gfc_state_stack->previous
70112e2a
PT
9174 && (gfc_state_stack->previous->state == COMP_SUBMODULE
9175 || gfc_state_stack->previous->state == COMP_MODULE)))
4668d6f9
PT
9176 return MATCH_NO;
9177
9178 m = gfc_match (" module% procedure% %n", name);
9179 if (m != MATCH_YES)
9180 return m;
9181
9182 if (!gfc_notify_std (GFC_STD_F2008, "MODULE PROCEDURE declaration "
9183 "at %C"))
9184 return MATCH_ERROR;
9185
9186 if (get_proc_name (name, &sym, false))
9187 return MATCH_ERROR;
9188
9189 /* Make sure that the result field is appropriately filled, even though
9190 the result symbol will be replaced later on. */
c064374d 9191 if (sym->tlink && sym->tlink->attr.function)
4668d6f9 9192 {
c064374d
PT
9193 if (sym->tlink->result
9194 && sym->tlink->result != sym->tlink)
9195 sym->result= sym->tlink->result;
4668d6f9
PT
9196 else
9197 sym->result = sym;
9198 }
9199
9200 /* Set declared_at as it might point to, e.g., a PUBLIC statement, if
9201 the symbol existed before. */
9202 sym->declared_at = gfc_current_locus;
9203
9204 if (!sym->attr.module_procedure)
9205 return MATCH_ERROR;
9206
9207 /* Signal match_end to expect "end procedure". */
9208 sym->abr_modproc_decl = 1;
9209
9210 /* Change from IFSRC_IFBODY coming from the interface declaration. */
9211 sym->attr.if_source = IFSRC_DECL;
9212
9213 gfc_new_block = sym;
9214
9215 /* Make a new formal arglist with the symbols in the procedure
9216 namespace. */
9217 head = tail = NULL;
9218 for (formal = sym->formal; formal && formal->sym; formal = formal->next)
9219 {
9220 if (formal == sym->formal)
9221 head = tail = gfc_get_formal_arglist ();
9222 else
9223 {
9224 tail->next = gfc_get_formal_arglist ();
9225 tail = tail->next;
9226 }
9227
9228 if (gfc_copy_dummy_sym (&fsym, formal->sym, 0))
9229 goto cleanup;
9230
9231 tail->sym = fsym;
9232 gfc_set_sym_referenced (fsym);
9233 }
9234
9235 /* The dummy symbols get cleaned up, when the formal_namespace of the
9236 interface declaration is cleared. This allows us to add the
9237 explicit interface as is done for other type of procedure. */
9238 if (!gfc_add_explicit_interface (sym, IFSRC_DECL, head,
9239 &gfc_current_locus))
9240 return MATCH_ERROR;
9241
9242 if (gfc_match_eos () != MATCH_YES)
9243 {
9244 gfc_syntax_error (ST_MODULE_PROC);
9245 return MATCH_ERROR;
9246 }
9247
9248 return MATCH_YES;
9249
9250cleanup:
9251 gfc_free_formal_arglist (head);
9252 return MATCH_ERROR;
9253}
9254
9255
6de9cd9a
DN
9256/* Match a module procedure statement. Note that we have to modify
9257 symbols in the parent's namespace because the current one was there
49de9e73 9258 to receive symbols that are in an interface's formal argument list. */
6de9cd9a
DN
9259
9260match
9261gfc_match_modproc (void)
9262{
9263 char name[GFC_MAX_SYMBOL_LEN + 1];
9264 gfc_symbol *sym;
9265 match m;
162b5a21 9266 locus old_locus;
060fca4a 9267 gfc_namespace *module_ns;
2b77e908 9268 gfc_interface *old_interface_head, *interface;
6de9cd9a
DN
9269
9270 if (gfc_state_stack->state != COMP_INTERFACE
9271 || gfc_state_stack->previous == NULL
129d15a3
JW
9272 || current_interface.type == INTERFACE_NAMELESS
9273 || current_interface.type == INTERFACE_ABSTRACT)
6de9cd9a 9274 {
636dff67
SK
9275 gfc_error ("MODULE PROCEDURE at %C must be in a generic module "
9276 "interface");
6de9cd9a
DN
9277 return MATCH_ERROR;
9278 }
9279
060fca4a
PT
9280 module_ns = gfc_current_ns->parent;
9281 for (; module_ns; module_ns = module_ns->parent)
43dfd40c
SK
9282 if (module_ns->proc_name->attr.flavor == FL_MODULE
9283 || module_ns->proc_name->attr.flavor == FL_PROGRAM
9284 || (module_ns->proc_name->attr.flavor == FL_PROCEDURE
9285 && !module_ns->proc_name->attr.contained))
060fca4a
PT
9286 break;
9287
9288 if (module_ns == NULL)
9289 return MATCH_ERROR;
9290
2b77e908
FXC
9291 /* Store the current state of the interface. We will need it if we
9292 end up with a syntax error and need to recover. */
9293 old_interface_head = gfc_current_interface_head ();
9294
162b5a21
SK
9295 /* Check if the F2008 optional double colon appears. */
9296 gfc_gobble_whitespace ();
9297 old_locus = gfc_current_locus;
9298 if (gfc_match ("::") == MATCH_YES)
9299 {
524af0d6
JB
9300 if (!gfc_notify_std (GFC_STD_F2008, "double colon in "
9301 "MODULE PROCEDURE statement at %L", &old_locus))
162b5a21
SK
9302 return MATCH_ERROR;
9303 }
9304 else
9305 gfc_current_locus = old_locus;
f5acf0f2 9306
6de9cd9a
DN
9307 for (;;)
9308 {
2b77e908 9309 bool last = false;
162b5a21 9310 old_locus = gfc_current_locus;
2b77e908 9311
6de9cd9a
DN
9312 m = gfc_match_name (name);
9313 if (m == MATCH_NO)
9314 goto syntax;
9315 if (m != MATCH_YES)
9316 return MATCH_ERROR;
9317
2b77e908
FXC
9318 /* Check for syntax error before starting to add symbols to the
9319 current namespace. */
9320 if (gfc_match_eos () == MATCH_YES)
9321 last = true;
162b5a21 9322
2b77e908
FXC
9323 if (!last && gfc_match_char (',') != MATCH_YES)
9324 goto syntax;
9325
9326 /* Now we're sure the syntax is valid, we process this item
9327 further. */
060fca4a 9328 if (gfc_get_symbol (name, module_ns, &sym))
6de9cd9a
DN
9329 return MATCH_ERROR;
9330
43dfd40c
SK
9331 if (sym->attr.intrinsic)
9332 {
9333 gfc_error ("Intrinsic procedure at %L cannot be a MODULE "
9334 "PROCEDURE", &old_locus);
9335 return MATCH_ERROR;
9336 }
9337
6de9cd9a 9338 if (sym->attr.proc != PROC_MODULE
524af0d6 9339 && !gfc_add_procedure (&sym->attr, PROC_MODULE, sym->name, NULL))
6de9cd9a
DN
9340 return MATCH_ERROR;
9341
524af0d6 9342 if (!gfc_add_interface (sym))
6de9cd9a
DN
9343 return MATCH_ERROR;
9344
71f77fd7 9345 sym->attr.mod_proc = 1;
43dfd40c 9346 sym->declared_at = old_locus;
71f77fd7 9347
2b77e908 9348 if (last)
6de9cd9a 9349 break;
6de9cd9a
DN
9350 }
9351
9352 return MATCH_YES;
9353
9354syntax:
2b77e908
FXC
9355 /* Restore the previous state of the interface. */
9356 interface = gfc_current_interface_head ();
9357 gfc_set_current_interface_head (old_interface_head);
9358
9359 /* Free the new interfaces. */
9360 while (interface != old_interface_head)
9361 {
9362 gfc_interface *i = interface->next;
cede9502 9363 free (interface);
2b77e908
FXC
9364 interface = i;
9365 }
9366
9367 /* And issue a syntax error. */
6de9cd9a
DN
9368 gfc_syntax_error (ST_MODULE_PROC);
9369 return MATCH_ERROR;
9370}
9371
9372
7d1f1e61 9373/* Check a derived type that is being extended. */
42e3d759 9374
7d1f1e61
PT
9375static gfc_symbol*
9376check_extended_derived_type (char *name)
9377{
9378 gfc_symbol *extended;
9379
9380 if (gfc_find_symbol (name, gfc_current_ns, 1, &extended))
9381 {
9382 gfc_error ("Ambiguous symbol in TYPE definition at %C");
9383 return NULL;
9384 }
9385
42e3d759
JW
9386 extended = gfc_find_dt_in_generic (extended);
9387
9388 /* F08:C428. */
7d1f1e61
PT
9389 if (!extended)
9390 {
c4100eae 9391 gfc_error ("Symbol %qs at %C has not been previously defined", name);
7d1f1e61
PT
9392 return NULL;
9393 }
9394
9395 if (extended->attr.flavor != FL_DERIVED)
9396 {
c4100eae 9397 gfc_error ("%qs in EXTENDS expression at %C is not a "
7d1f1e61
PT
9398 "derived type", name);
9399 return NULL;
9400 }
9401
9402 if (extended->attr.is_bind_c)
9403 {
c4100eae 9404 gfc_error ("%qs cannot be extended at %C because it "
7d1f1e61
PT
9405 "is BIND(C)", extended->name);
9406 return NULL;
9407 }
9408
9409 if (extended->attr.sequence)
9410 {
c4100eae 9411 gfc_error ("%qs cannot be extended at %C because it "
7d1f1e61
PT
9412 "is a SEQUENCE type", extended->name);
9413 return NULL;
9414 }
9415
9416 return extended;
9417}
9418
9419
a8b3b0b6
CR
9420/* Match the optional attribute specifiers for a type declaration.
9421 Return MATCH_ERROR if an error is encountered in one of the handled
9422 attributes (public, private, bind(c)), MATCH_NO if what's found is
9423 not a handled attribute, and MATCH_YES otherwise. TODO: More error
9424 checking on attribute conflicts needs to be done. */
6de9cd9a
DN
9425
9426match
7d1f1e61 9427gfc_get_type_attr_spec (symbol_attribute *attr, char *name)
6de9cd9a 9428{
a8b3b0b6 9429 /* See if the derived type is marked as private. */
6de9cd9a
DN
9430 if (gfc_match (" , private") == MATCH_YES)
9431 {
d51347f9 9432 if (gfc_current_state () != COMP_MODULE)
6de9cd9a 9433 {
d51347f9
TB
9434 gfc_error ("Derived type at %C can only be PRIVATE in the "
9435 "specification part of a module");
6de9cd9a
DN
9436 return MATCH_ERROR;
9437 }
9438
524af0d6 9439 if (!gfc_add_access (attr, ACCESS_PRIVATE, NULL, NULL))
6de9cd9a 9440 return MATCH_ERROR;
6de9cd9a 9441 }
a8b3b0b6 9442 else if (gfc_match (" , public") == MATCH_YES)
6de9cd9a 9443 {
d51347f9 9444 if (gfc_current_state () != COMP_MODULE)
6de9cd9a 9445 {
d51347f9
TB
9446 gfc_error ("Derived type at %C can only be PUBLIC in the "
9447 "specification part of a module");
6de9cd9a
DN
9448 return MATCH_ERROR;
9449 }
9450
524af0d6 9451 if (!gfc_add_access (attr, ACCESS_PUBLIC, NULL, NULL))
6de9cd9a 9452 return MATCH_ERROR;
6de9cd9a 9453 }
52f49934 9454 else if (gfc_match (" , bind ( c )") == MATCH_YES)
a8b3b0b6
CR
9455 {
9456 /* If the type is defined to be bind(c) it then needs to make
9457 sure that all fields are interoperable. This will
9458 need to be a semantic check on the finished derived type.
9459 See 15.2.3 (lines 9-12) of F2003 draft. */
524af0d6 9460 if (!gfc_add_is_bind_c (attr, NULL, &gfc_current_locus, 0))
a8b3b0b6
CR
9461 return MATCH_ERROR;
9462
9463 /* TODO: attr conflicts need to be checked, probably in symbol.c. */
9464 }
52f49934
DK
9465 else if (gfc_match (" , abstract") == MATCH_YES)
9466 {
524af0d6 9467 if (!gfc_notify_std (GFC_STD_F2003, "ABSTRACT type at %C"))
52f49934
DK
9468 return MATCH_ERROR;
9469
524af0d6 9470 if (!gfc_add_abstract (attr, &gfc_current_locus))
52f49934
DK
9471 return MATCH_ERROR;
9472 }
524af0d6 9473 else if (name && gfc_match (" , extends ( %n )", name) == MATCH_YES)
7d1f1e61 9474 {
524af0d6 9475 if (!gfc_add_extension (attr, &gfc_current_locus))
7d1f1e61
PT
9476 return MATCH_ERROR;
9477 }
a8b3b0b6
CR
9478 else
9479 return MATCH_NO;
9480
9481 /* If we get here, something matched. */
9482 return MATCH_YES;
9483}
9484
9485
f6288c24
FR
9486/* Common function for type declaration blocks similar to derived types, such
9487 as STRUCTURES and MAPs. Unlike derived types, a structure type
9488 does NOT have a generic symbol matching the name given by the user.
9489 STRUCTUREs can share names with variables and PARAMETERs so we must allow
9490 for the creation of an independent symbol.
6442a6f4 9491 Other parameters are a message to prefix errors with, the name of the new
f6288c24
FR
9492 type to be created, and the flavor to add to the resulting symbol. */
9493
9494static bool
9495get_struct_decl (const char *name, sym_flavor fl, locus *decl,
9496 gfc_symbol **result)
9497{
9498 gfc_symbol *sym;
9499 locus where;
9500
9501 gcc_assert (name[0] == (char) TOUPPER (name[0]));
9502
9503 if (decl)
9504 where = *decl;
9505 else
9506 where = gfc_current_locus;
9507
9508 if (gfc_get_symbol (name, NULL, &sym))
9509 return false;
9510
9511 if (!sym)
9512 {
9513 gfc_internal_error ("Failed to create structure type '%s' at %C", name);
9514 return false;
9515 }
9516
9517 if (sym->components != NULL || sym->attr.zero_comp)
9518 {
2f029c08 9519 gfc_error ("Type definition of %qs at %C was already defined at %L",
f6288c24
FR
9520 sym->name, &sym->declared_at);
9521 return false;
9522 }
9523
9524 sym->declared_at = where;
9525
9526 if (sym->attr.flavor != fl
9527 && !gfc_add_flavor (&sym->attr, fl, sym->name, NULL))
9528 return false;
9529
9530 if (!sym->hash_value)
9531 /* Set the hash for the compound name for this type. */
9532 sym->hash_value = gfc_hash_value (sym);
9533
9534 /* Normally the type is expected to have been completely parsed by the time
9535 a field declaration with this type is seen. For unions, maps, and nested
9536 structure declarations, we need to indicate that it is okay that we
9537 haven't seen any components yet. This will be updated after the structure
9538 is fully parsed. */
9539 sym->attr.zero_comp = 0;
9540
9541 /* Structures always act like derived-types with the SEQUENCE attribute */
9542 gfc_add_sequence (&sym->attr, sym->name, NULL);
9543
9544 if (result) *result = sym;
9545
9546 return true;
9547}
9548
9549
9550/* Match the opening of a MAP block. Like a struct within a union in C;
9551 behaves identical to STRUCTURE blocks. */
9552
9553match
9554gfc_match_map (void)
9555{
05b8fcb4
FR
9556 /* Counter used to give unique internal names to map structures. */
9557 static unsigned int gfc_map_id = 0;
9558 char name[GFC_MAX_SYMBOL_LEN + 1];
9559 gfc_symbol *sym;
9560 locus old_loc;
f6288c24 9561
05b8fcb4 9562 old_loc = gfc_current_locus;
f6288c24 9563
05b8fcb4
FR
9564 if (gfc_match_eos () != MATCH_YES)
9565 {
9566 gfc_error ("Junk after MAP statement at %C");
9567 gfc_current_locus = old_loc;
9568 return MATCH_ERROR;
9569 }
f6288c24 9570
05b8fcb4
FR
9571 /* Map blocks are anonymous so we make up unique names for the symbol table
9572 which are invalid Fortran identifiers. */
9573 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "MM$%u", gfc_map_id++);
f6288c24 9574
05b8fcb4
FR
9575 if (!get_struct_decl (name, FL_STRUCT, &old_loc, &sym))
9576 return MATCH_ERROR;
f6288c24 9577
05b8fcb4 9578 gfc_new_block = sym;
f6288c24 9579
05b8fcb4 9580 return MATCH_YES;
f6288c24
FR
9581}
9582
9583
9584/* Match the opening of a UNION block. */
9585
9586match
9587gfc_match_union (void)
9588{
05b8fcb4
FR
9589 /* Counter used to give unique internal names to union types. */
9590 static unsigned int gfc_union_id = 0;
9591 char name[GFC_MAX_SYMBOL_LEN + 1];
9592 gfc_symbol *sym;
9593 locus old_loc;
f6288c24 9594
05b8fcb4 9595 old_loc = gfc_current_locus;
f6288c24 9596
05b8fcb4
FR
9597 if (gfc_match_eos () != MATCH_YES)
9598 {
9599 gfc_error ("Junk after UNION statement at %C");
9600 gfc_current_locus = old_loc;
9601 return MATCH_ERROR;
9602 }
f6288c24 9603
05b8fcb4
FR
9604 /* Unions are anonymous so we make up unique names for the symbol table
9605 which are invalid Fortran identifiers. */
9606 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "UU$%u", gfc_union_id++);
f6288c24 9607
05b8fcb4
FR
9608 if (!get_struct_decl (name, FL_UNION, &old_loc, &sym))
9609 return MATCH_ERROR;
f6288c24 9610
05b8fcb4 9611 gfc_new_block = sym;
f6288c24 9612
05b8fcb4 9613 return MATCH_YES;
f6288c24
FR
9614}
9615
9616
9617/* Match the beginning of a STRUCTURE declaration. This is similar to
9618 matching the beginning of a derived type declaration with a few
9619 twists. The resulting type symbol has no access control or other
9620 interesting attributes. */
9621
9622match
9623gfc_match_structure_decl (void)
9624{
05b8fcb4
FR
9625 /* Counter used to give unique internal names to anonymous structures. */
9626 static unsigned int gfc_structure_id = 0;
9627 char name[GFC_MAX_SYMBOL_LEN + 1];
9628 gfc_symbol *sym;
9629 match m;
9630 locus where;
f6288c24 9631
05b8fcb4
FR
9632 if (!flag_dec_structure)
9633 {
cf004230
FR
9634 gfc_error ("%s at %C is a DEC extension, enable with "
9635 "%<-fdec-structure%>",
9636 "STRUCTURE");
05b8fcb4
FR
9637 return MATCH_ERROR;
9638 }
f6288c24 9639
05b8fcb4 9640 name[0] = '\0';
f6288c24 9641
05b8fcb4
FR
9642 m = gfc_match (" /%n/", name);
9643 if (m != MATCH_YES)
9644 {
9645 /* Non-nested structure declarations require a structure name. */
9646 if (!gfc_comp_struct (gfc_current_state ()))
9647 {
9648 gfc_error ("Structure name expected in non-nested structure "
9649 "declaration at %C");
9650 return MATCH_ERROR;
9651 }
9652 /* This is an anonymous structure; make up a unique name for it
9653 (upper-case letters never make it to symbol names from the source).
9654 The important thing is initializing the type variable
9655 and setting gfc_new_symbol, which is immediately used by
9656 parse_structure () and variable_decl () to add components of
9657 this type. */
9658 snprintf (name, GFC_MAX_SYMBOL_LEN + 1, "SS$%u", gfc_structure_id++);
9659 }
f6288c24 9660
05b8fcb4
FR
9661 where = gfc_current_locus;
9662 /* No field list allowed after non-nested structure declaration. */
9663 if (!gfc_comp_struct (gfc_current_state ())
9664 && gfc_match_eos () != MATCH_YES)
9665 {
9666 gfc_error ("Junk after non-nested STRUCTURE statement at %C");
9667 return MATCH_ERROR;
9668 }
f6288c24 9669
05b8fcb4
FR
9670 /* Make sure the name is not the name of an intrinsic type. */
9671 if (gfc_is_intrinsic_typename (name))
9672 {
2f029c08 9673 gfc_error ("Structure name %qs at %C cannot be the same as an"
05b8fcb4
FR
9674 " intrinsic type", name);
9675 return MATCH_ERROR;
9676 }
f6288c24 9677
05b8fcb4
FR
9678 /* Store the actual type symbol for the structure with an upper-case first
9679 letter (an invalid Fortran identifier). */
f6288c24 9680
51f03c6b 9681 if (!get_struct_decl (gfc_dt_upper_string (name), FL_STRUCT, &where, &sym))
05b8fcb4 9682 return MATCH_ERROR;
f6288c24 9683
05b8fcb4
FR
9684 gfc_new_block = sym;
9685 return MATCH_YES;
f6288c24
FR
9686}
9687
90051c26
FR
9688
9689/* This function does some work to determine which matcher should be used to
9690 * match a statement beginning with "TYPE". This is used to disambiguate TYPE
9691 * as an alias for PRINT from derived type declarations, TYPE IS statements,
9692 * and derived type data declarations. */
9693
9694match
9695gfc_match_type (gfc_statement *st)
9696{
9697 char name[GFC_MAX_SYMBOL_LEN + 1];
9698 match m;
9699 locus old_loc;
9700
9701 /* Requires -fdec. */
9702 if (!flag_dec)
9703 return MATCH_NO;
9704
9705 m = gfc_match ("type");
9706 if (m != MATCH_YES)
9707 return m;
9708 /* If we already have an error in the buffer, it is probably from failing to
9709 * match a derived type data declaration. Let it happen. */
9710 else if (gfc_error_flag_test ())
9711 return MATCH_NO;
9712
9713 old_loc = gfc_current_locus;
9714 *st = ST_NONE;
9715
9716 /* If we see an attribute list before anything else it's definitely a derived
9717 * type declaration. */
9718 if (gfc_match (" ,") == MATCH_YES || gfc_match (" ::") == MATCH_YES)
9719 {
9720 gfc_current_locus = old_loc;
9721 *st = ST_DERIVED_DECL;
9722 return gfc_match_derived_decl ();
9723 }
9724
9725 /* By now "TYPE" has already been matched. If we do not see a name, this may
9726 * be something like "TYPE *" or "TYPE <fmt>". */
9727 m = gfc_match_name (name);
9728 if (m != MATCH_YES)
9729 {
9730 /* Let print match if it can, otherwise throw an error from
9731 * gfc_match_derived_decl. */
9732 gfc_current_locus = old_loc;
9733 if (gfc_match_print () == MATCH_YES)
9734 {
9735 *st = ST_WRITE;
9736 return MATCH_YES;
9737 }
9738 gfc_current_locus = old_loc;
9739 *st = ST_DERIVED_DECL;
9740 return gfc_match_derived_decl ();
9741 }
9742
9743 /* A derived type declaration requires an EOS. Without it, assume print. */
9744 m = gfc_match_eos ();
9745 if (m == MATCH_NO)
9746 {
9747 /* Check manually for TYPE IS (... - this is invalid print syntax. */
9748 if (strncmp ("is", name, 3) == 0
9749 && gfc_match (" (", name) == MATCH_YES)
9750 {
9751 gfc_current_locus = old_loc;
9752 gcc_assert (gfc_match (" is") == MATCH_YES);
9753 *st = ST_TYPE_IS;
9754 return gfc_match_type_is ();
9755 }
9756 gfc_current_locus = old_loc;
9757 *st = ST_WRITE;
9758 return gfc_match_print ();
9759 }
9760 else
9761 {
9762 /* By now we have "TYPE <name> <EOS>". Check first if the name is an
9763 * intrinsic typename - if so let gfc_match_derived_decl dump an error.
9764 * Otherwise if gfc_match_derived_decl fails it's probably an existing
9765 * symbol which can be printed. */
9766 gfc_current_locus = old_loc;
9767 m = gfc_match_derived_decl ();
9768 if (gfc_is_intrinsic_typename (name) || m == MATCH_YES)
9769 {
9770 *st = ST_DERIVED_DECL;
9771 return m;
9772 }
9773 gfc_current_locus = old_loc;
9774 *st = ST_WRITE;
9775 return gfc_match_print ();
9776 }
9777
9778 return MATCH_NO;
9779}
9780
9781
a8b3b0b6
CR
9782/* Match the beginning of a derived type declaration. If a type name
9783 was the result of a function, then it is possible to have a symbol
9784 already to be known as a derived type yet have no components. */
9785
9786match
9787gfc_match_derived_decl (void)
9788{
9789 char name[GFC_MAX_SYMBOL_LEN + 1];
7d1f1e61 9790 char parent[GFC_MAX_SYMBOL_LEN + 1];
a8b3b0b6 9791 symbol_attribute attr;
c3f34952 9792 gfc_symbol *sym, *gensym;
7d1f1e61 9793 gfc_symbol *extended;
a8b3b0b6
CR
9794 match m;
9795 match is_type_attr_spec = MATCH_NO;
e7303e85 9796 bool seen_attr = false;
c3f34952 9797 gfc_interface *intr = NULL, *head;
5bab4c96
PT
9798 bool parameterized_type = false;
9799 bool seen_colons = false;
a8b3b0b6 9800
f6288c24 9801 if (gfc_comp_struct (gfc_current_state ()))
a8b3b0b6
CR
9802 return MATCH_NO;
9803
7d1f1e61
PT
9804 name[0] = '\0';
9805 parent[0] = '\0';
a8b3b0b6 9806 gfc_clear_attr (&attr);
7d1f1e61 9807 extended = NULL;
a8b3b0b6
CR
9808
9809 do
9810 {
7d1f1e61 9811 is_type_attr_spec = gfc_get_type_attr_spec (&attr, parent);
a8b3b0b6
CR
9812 if (is_type_attr_spec == MATCH_ERROR)
9813 return MATCH_ERROR;
e7303e85
FXC
9814 if (is_type_attr_spec == MATCH_YES)
9815 seen_attr = true;
a8b3b0b6 9816 } while (is_type_attr_spec == MATCH_YES);
6de9cd9a 9817
63a3341a
PT
9818 /* Deal with derived type extensions. The extension attribute has
9819 been added to 'attr' but now the parent type must be found and
9820 checked. */
7d1f1e61
PT
9821 if (parent[0])
9822 extended = check_extended_derived_type (parent);
9823
9824 if (parent[0] && !extended)
9825 return MATCH_ERROR;
9826
5bab4c96
PT
9827 m = gfc_match (" ::");
9828 if (m == MATCH_YES)
9829 {
9830 seen_colons = true;
9831 }
9832 else if (seen_attr)
6de9cd9a
DN
9833 {
9834 gfc_error ("Expected :: in TYPE definition at %C");
9835 return MATCH_ERROR;
9836 }
9837
5bab4c96 9838 m = gfc_match (" %n ", name);
6de9cd9a
DN
9839 if (m != MATCH_YES)
9840 return m;
9841
5bab4c96
PT
9842 /* Make sure that we don't identify TYPE IS (...) as a parameterized
9843 derived type named 'is'.
9844 TODO Expand the check, when 'name' = "is" by matching " (tname) "
9845 and checking if this is a(n intrinsic) typename. his picks up
9846 misplaced TYPE IS statements such as in select_type_1.f03. */
9847 if (gfc_peek_ascii_char () == '(')
9848 {
9849 if (gfc_current_state () == COMP_SELECT_TYPE
9850 || (!seen_colons && !strcmp (name, "is")))
9851 return MATCH_NO;
9852 parameterized_type = true;
9853 }
9854
9855 m = gfc_match_eos ();
9856 if (m != MATCH_YES && !parameterized_type)
9857 return m;
9858
e9c06563
TB
9859 /* Make sure the name is not the name of an intrinsic type. */
9860 if (gfc_is_intrinsic_typename (name))
6de9cd9a 9861 {
c4100eae 9862 gfc_error ("Type name %qs at %C cannot be the same as an intrinsic "
636dff67 9863 "type", name);
6de9cd9a
DN
9864 return MATCH_ERROR;
9865 }
9866
c3f34952 9867 if (gfc_get_symbol (name, NULL, &gensym))
6de9cd9a
DN
9868 return MATCH_ERROR;
9869
c3f34952 9870 if (!gensym->attr.generic && gensym->ts.type != BT_UNKNOWN)
6de9cd9a 9871 {
c4100eae 9872 gfc_error ("Derived type name %qs at %C already has a basic type "
c3f34952
TB
9873 "of %s", gensym->name, gfc_typename (&gensym->ts));
9874 return MATCH_ERROR;
9875 }
9876
9877 if (!gensym->attr.generic
524af0d6 9878 && !gfc_add_generic (&gensym->attr, gensym->name, NULL))
c3f34952
TB
9879 return MATCH_ERROR;
9880
9881 if (!gensym->attr.function
524af0d6 9882 && !gfc_add_function (&gensym->attr, gensym->name, NULL))
c3f34952
TB
9883 return MATCH_ERROR;
9884
9885 sym = gfc_find_dt_in_generic (gensym);
9886
9887 if (sym && (sym->components != NULL || sym->attr.zero_comp))
9888 {
c4100eae 9889 gfc_error ("Derived type definition of %qs at %C has already been "
c3f34952 9890 "defined", sym->name);
6de9cd9a
DN
9891 return MATCH_ERROR;
9892 }
9893
c3f34952
TB
9894 if (!sym)
9895 {
9896 /* Use upper case to save the actual derived-type symbol. */
f6288c24 9897 gfc_get_symbol (gfc_dt_upper_string (gensym->name), NULL, &sym);
51f03c6b 9898 sym->name = gfc_get_string ("%s", gensym->name);
c3f34952
TB
9899 head = gensym->generic;
9900 intr = gfc_get_interface ();
9901 intr->sym = sym;
9902 intr->where = gfc_current_locus;
9903 intr->sym->declared_at = gfc_current_locus;
9904 intr->next = head;
9905 gensym->generic = intr;
9906 gensym->attr.if_source = IFSRC_DECL;
9907 }
9908
6de9cd9a
DN
9909 /* The symbol may already have the derived attribute without the
9910 components. The ways this can happen is via a function
9911 definition, an INTRINSIC statement or a subtype in another
9912 derived type that is a pointer. The first part of the AND clause
df2fba9e 9913 is true if the symbol is not the return value of a function. */
6de9cd9a 9914 if (sym->attr.flavor != FL_DERIVED
524af0d6 9915 && !gfc_add_flavor (&sym->attr, FL_DERIVED, sym->name, NULL))
6de9cd9a
DN
9916 return MATCH_ERROR;
9917
6de9cd9a 9918 if (attr.access != ACCESS_UNKNOWN
524af0d6 9919 && !gfc_add_access (&sym->attr, attr.access, sym->name, NULL))
6de9cd9a 9920 return MATCH_ERROR;
c3f34952
TB
9921 else if (sym->attr.access == ACCESS_UNKNOWN
9922 && gensym->attr.access != ACCESS_UNKNOWN
70112e2a 9923 && !gfc_add_access (&sym->attr, gensym->attr.access,
524af0d6 9924 sym->name, NULL))
c3f34952
TB
9925 return MATCH_ERROR;
9926
9927 if (sym->attr.access != ACCESS_UNKNOWN
9928 && gensym->attr.access == ACCESS_UNKNOWN)
9929 gensym->attr.access = sym->attr.access;
6de9cd9a 9930
a8b3b0b6
CR
9931 /* See if the derived type was labeled as bind(c). */
9932 if (attr.is_bind_c != 0)
9933 sym->attr.is_bind_c = attr.is_bind_c;
9934
34523524
DK
9935 /* Construct the f2k_derived namespace if it is not yet there. */
9936 if (!sym->f2k_derived)
9937 sym->f2k_derived = gfc_get_namespace (NULL, 0);
f5acf0f2 9938
5bab4c96
PT
9939 if (parameterized_type)
9940 {
276515e6
PT
9941 /* Ignore error or mismatches by going to the end of the statement
9942 in order to avoid the component declarations causing problems. */
9943 m = gfc_match_formal_arglist (sym, 0, 0, true);
9944 if (m != MATCH_YES)
9945 gfc_error_recovery ();
5bab4c96
PT
9946 m = gfc_match_eos ();
9947 if (m != MATCH_YES)
f59986b2
PT
9948 {
9949 gfc_error_recovery ();
9950 gfc_error_now ("Garbage after PARAMETERIZED TYPE declaration at %C");
9951 }
5bab4c96
PT
9952 sym->attr.pdt_template = 1;
9953 }
9954
7d1f1e61
PT
9955 if (extended && !sym->components)
9956 {
9957 gfc_component *p;
5bab4c96 9958 gfc_formal_arglist *f, *g, *h;
7d1f1e61
PT
9959
9960 /* Add the extended derived type as the first component. */
9961 gfc_add_component (sym, parent, &p);
7d1f1e61
PT
9962 extended->refs++;
9963 gfc_set_sym_referenced (extended);
9964
9965 p->ts.type = BT_DERIVED;
bc21d315 9966 p->ts.u.derived = extended;
7d1f1e61 9967 p->initializer = gfc_default_initializer (&p->ts);
f5acf0f2 9968
7c1dab0d
JW
9969 /* Set extension level. */
9970 if (extended->attr.extension == 255)
9971 {
9972 /* Since the extension field is 8 bit wide, we can only have
9973 up to 255 extension levels. */
c4100eae 9974 gfc_error ("Maximum extension level reached with type %qs at %L",
7c1dab0d
JW
9975 extended->name, &extended->declared_at);
9976 return MATCH_ERROR;
9977 }
9978 sym->attr.extension = extended->attr.extension + 1;
7d1f1e61
PT
9979
9980 /* Provide the links between the extended type and its extension. */
9981 if (!extended->f2k_derived)
9982 extended->f2k_derived = gfc_get_namespace (NULL, 0);
5bab4c96
PT
9983
9984 /* Copy the extended type-param-name-list from the extended type,
9985 append those of the extension and add the whole lot to the
9986 extension. */
9987 if (extended->attr.pdt_template)
9988 {
9989 g = h = NULL;
9990 sym->attr.pdt_template = 1;
9991 for (f = extended->formal; f; f = f->next)
9992 {
9993 if (f == extended->formal)
9994 {
9995 g = gfc_get_formal_arglist ();
9996 h = g;
9997 }
9998 else
9999 {
10000 g->next = gfc_get_formal_arglist ();
10001 g = g->next;
10002 }
10003 g->sym = f->sym;
10004 }
10005 g->next = sym->formal;
10006 sym->formal = h;
10007 }
7d1f1e61
PT
10008 }
10009
7c1dab0d
JW
10010 if (!sym->hash_value)
10011 /* Set the hash for the compound name for this type. */
4fa02692 10012 sym->hash_value = gfc_hash_value (sym);
cf2b3c22 10013
52f49934
DK
10014 /* Take over the ABSTRACT attribute. */
10015 sym->attr.abstract = attr.abstract;
10016
6de9cd9a
DN
10017 gfc_new_block = sym;
10018
10019 return MATCH_YES;
10020}
83d890b9
AL
10021
10022
f5acf0f2 10023/* Cray Pointees can be declared as:
b3aefde2 10024 pointer (ipt, a (n,m,...,*)) */
83d890b9 10025
32e8bb8e 10026match
83d890b9
AL
10027gfc_mod_pointee_as (gfc_array_spec *as)
10028{
10029 as->cray_pointee = true; /* This will be useful to know later. */
10030 if (as->type == AS_ASSUMED_SIZE)
b3aefde2 10031 as->cp_was_assumed = true;
83d890b9
AL
10032 else if (as->type == AS_ASSUMED_SHAPE)
10033 {
10034 gfc_error ("Cray Pointee at %C cannot be assumed shape array");
10035 return MATCH_ERROR;
10036 }
10037 return MATCH_YES;
10038}
25d8f0a2
TS
10039
10040
f5acf0f2
PT
10041/* Match the enum definition statement, here we are trying to match
10042 the first line of enum definition statement.
25d8f0a2
TS
10043 Returns MATCH_YES if match is found. */
10044
10045match
10046gfc_match_enum (void)
10047{
10048 match m;
f5acf0f2 10049
25d8f0a2
TS
10050 m = gfc_match_eos ();
10051 if (m != MATCH_YES)
10052 return m;
10053
524af0d6 10054 if (!gfc_notify_std (GFC_STD_F2003, "ENUM and ENUMERATOR at %C"))
25d8f0a2
TS
10055 return MATCH_ERROR;
10056
10057 return MATCH_YES;
10058}
10059
10060
31224396
SK
10061/* Returns an initializer whose value is one higher than the value of the
10062 LAST_INITIALIZER argument. If the argument is NULL, the
10063 initializers value will be set to zero. The initializer's kind
10064 will be set to gfc_c_int_kind.
10065
10066 If -fshort-enums is given, the appropriate kind will be selected
10067 later after all enumerators have been parsed. A warning is issued
10068 here if an initializer exceeds gfc_c_int_kind. */
10069
10070static gfc_expr *
10071enum_initializer (gfc_expr *last_initializer, locus where)
10072{
10073 gfc_expr *result;
b7e75771 10074 result = gfc_get_constant_expr (BT_INTEGER, gfc_c_int_kind, &where);
31224396
SK
10075
10076 mpz_init (result->value.integer);
10077
10078 if (last_initializer != NULL)
10079 {
10080 mpz_add_ui (result->value.integer, last_initializer->value.integer, 1);
10081 result->where = last_initializer->where;
10082
10083 if (gfc_check_integer_range (result->value.integer,
10084 gfc_c_int_kind) != ARITH_OK)
10085 {
10086 gfc_error ("Enumerator exceeds the C integer type at %C");
10087 return NULL;
10088 }
10089 }
10090 else
10091 {
10092 /* Control comes here, if it's the very first enumerator and no
10093 initializer has been given. It will be initialized to zero. */
10094 mpz_set_si (result->value.integer, 0);
10095 }
10096
10097 return result;
10098}
10099
10100
6133c68a
TS
10101/* Match a variable name with an optional initializer. When this
10102 subroutine is called, a variable is expected to be parsed next.
10103 Depending on what is happening at the moment, updates either the
10104 symbol table or the current interface. */
10105
10106static match
10107enumerator_decl (void)
10108{
10109 char name[GFC_MAX_SYMBOL_LEN + 1];
10110 gfc_expr *initializer;
10111 gfc_array_spec *as = NULL;
10112 gfc_symbol *sym;
10113 locus var_locus;
10114 match m;
524af0d6 10115 bool t;
6133c68a
TS
10116 locus old_locus;
10117
10118 initializer = NULL;
10119 old_locus = gfc_current_locus;
10120
10121 /* When we get here, we've just matched a list of attributes and
10122 maybe a type and a double colon. The next thing we expect to see
10123 is the name of the symbol. */
10124 m = gfc_match_name (name);
10125 if (m != MATCH_YES)
10126 goto cleanup;
10127
10128 var_locus = gfc_current_locus;
10129
10130 /* OK, we've successfully matched the declaration. Now put the
10131 symbol in the current namespace. If we fail to create the symbol,
10132 bail out. */
524af0d6 10133 if (!build_sym (name, NULL, false, &as, &var_locus))
6133c68a
TS
10134 {
10135 m = MATCH_ERROR;
10136 goto cleanup;
10137 }
10138
10139 /* The double colon must be present in order to have initializers.
10140 Otherwise the statement is ambiguous with an assignment statement. */
10141 if (colon_seen)
10142 {
10143 if (gfc_match_char ('=') == MATCH_YES)
10144 {
10145 m = gfc_match_init_expr (&initializer);
10146 if (m == MATCH_NO)
10147 {
10148 gfc_error ("Expected an initialization expression at %C");
10149 m = MATCH_ERROR;
10150 }
10151
10152 if (m != MATCH_YES)
10153 goto cleanup;
10154 }
10155 }
10156
10157 /* If we do not have an initializer, the initialization value of the
10158 previous enumerator (stored in last_initializer) is incremented
10159 by 1 and is used to initialize the current enumerator. */
10160 if (initializer == NULL)
31224396 10161 initializer = enum_initializer (last_initializer, old_locus);
d51347f9 10162
6133c68a
TS
10163 if (initializer == NULL || initializer->ts.type != BT_INTEGER)
10164 {
01e64c3d
JJ
10165 gfc_error ("ENUMERATOR %L not initialized with integer expression",
10166 &var_locus);
d51347f9 10167 m = MATCH_ERROR;
6133c68a
TS
10168 goto cleanup;
10169 }
10170
10171 /* Store this current initializer, for the next enumerator variable
10172 to be parsed. add_init_expr_to_sym() zeros initializer, so we
10173 use last_initializer below. */
10174 last_initializer = initializer;
10175 t = add_init_expr_to_sym (name, &initializer, &var_locus);
10176
10177 /* Maintain enumerator history. */
10178 gfc_find_symbol (name, NULL, 0, &sym);
10179 create_enum_history (sym, last_initializer);
10180
524af0d6 10181 return (t) ? MATCH_YES : MATCH_ERROR;
6133c68a
TS
10182
10183cleanup:
10184 /* Free stuff up and return. */
10185 gfc_free_expr (initializer);
10186
10187 return m;
10188}
10189
10190
66e4ab31 10191/* Match the enumerator definition statement. */
25d8f0a2
TS
10192
10193match
10194gfc_match_enumerator_def (void)
10195{
10196 match m;
524af0d6 10197 bool t;
d51347f9 10198
25d8f0a2 10199 gfc_clear_ts (&current_ts);
d51347f9 10200
25d8f0a2
TS
10201 m = gfc_match (" enumerator");
10202 if (m != MATCH_YES)
10203 return m;
6133c68a
TS
10204
10205 m = gfc_match (" :: ");
10206 if (m == MATCH_ERROR)
10207 return m;
10208
10209 colon_seen = (m == MATCH_YES);
d51347f9 10210
25d8f0a2
TS
10211 if (gfc_current_state () != COMP_ENUM)
10212 {
10213 gfc_error ("ENUM definition statement expected before %C");
10214 gfc_free_enum_history ();
10215 return MATCH_ERROR;
10216 }
10217
10218 (&current_ts)->type = BT_INTEGER;
10219 (&current_ts)->kind = gfc_c_int_kind;
d51347f9 10220
6133c68a
TS
10221 gfc_clear_attr (&current_attr);
10222 t = gfc_add_flavor (&current_attr, FL_PARAMETER, NULL, NULL);
524af0d6 10223 if (!t)
25d8f0a2 10224 {
6133c68a 10225 m = MATCH_ERROR;
25d8f0a2
TS
10226 goto cleanup;
10227 }
10228
25d8f0a2
TS
10229 for (;;)
10230 {
6133c68a 10231 m = enumerator_decl ();
25d8f0a2 10232 if (m == MATCH_ERROR)
01e64c3d
JJ
10233 {
10234 gfc_free_enum_history ();
10235 goto cleanup;
10236 }
25d8f0a2
TS
10237 if (m == MATCH_NO)
10238 break;
10239
10240 if (gfc_match_eos () == MATCH_YES)
10241 goto cleanup;
10242 if (gfc_match_char (',') != MATCH_YES)
10243 break;
10244 }
10245
10246 if (gfc_current_state () == COMP_ENUM)
10247 {
10248 gfc_free_enum_history ();
10249 gfc_error ("Syntax error in ENUMERATOR definition at %C");
10250 m = MATCH_ERROR;
10251 }
10252
10253cleanup:
10254 gfc_free_array_spec (current_as);
10255 current_as = NULL;
10256 return m;
10257
10258}
10259
f6fad28e 10260
30b608eb
DK
10261/* Match binding attributes. */
10262
10263static match
713485cc 10264match_binding_attributes (gfc_typebound_proc* ba, bool generic, bool ppc)
30b608eb
DK
10265{
10266 bool found_passing = false;
713485cc 10267 bool seen_ptr = false;
90661f26 10268 match m = MATCH_YES;
30b608eb 10269
eea58adb 10270 /* Initialize to defaults. Do so even before the MATCH_NO check so that in
30b608eb
DK
10271 this case the defaults are in there. */
10272 ba->access = ACCESS_UNKNOWN;
10273 ba->pass_arg = NULL;
10274 ba->pass_arg_num = 0;
10275 ba->nopass = 0;
10276 ba->non_overridable = 0;
b0e5fa94 10277 ba->deferred = 0;
90661f26 10278 ba->ppc = ppc;
30b608eb
DK
10279
10280 /* If we find a comma, we believe there are binding attributes. */
90661f26
JW
10281 m = gfc_match_char (',');
10282 if (m == MATCH_NO)
10283 goto done;
30b608eb
DK
10284
10285 do
10286 {
e157f736
DK
10287 /* Access specifier. */
10288
10289 m = gfc_match (" public");
30b608eb
DK
10290 if (m == MATCH_ERROR)
10291 goto error;
10292 if (m == MATCH_YES)
10293 {
e157f736 10294 if (ba->access != ACCESS_UNKNOWN)
30b608eb 10295 {
e157f736 10296 gfc_error ("Duplicate access-specifier at %C");
30b608eb
DK
10297 goto error;
10298 }
10299
e157f736 10300 ba->access = ACCESS_PUBLIC;
30b608eb
DK
10301 continue;
10302 }
10303
e157f736 10304 m = gfc_match (" private");
30b608eb
DK
10305 if (m == MATCH_ERROR)
10306 goto error;
10307 if (m == MATCH_YES)
10308 {
e157f736 10309 if (ba->access != ACCESS_UNKNOWN)
30b608eb 10310 {
e157f736 10311 gfc_error ("Duplicate access-specifier at %C");
30b608eb
DK
10312 goto error;
10313 }
10314
e157f736 10315 ba->access = ACCESS_PRIVATE;
30b608eb
DK
10316 continue;
10317 }
10318
e157f736
DK
10319 /* If inside GENERIC, the following is not allowed. */
10320 if (!generic)
30b608eb 10321 {
30b608eb 10322
e157f736
DK
10323 /* NOPASS flag. */
10324 m = gfc_match (" nopass");
10325 if (m == MATCH_ERROR)
10326 goto error;
10327 if (m == MATCH_YES)
30b608eb 10328 {
e157f736
DK
10329 if (found_passing)
10330 {
10331 gfc_error ("Binding attributes already specify passing,"
10332 " illegal NOPASS at %C");
10333 goto error;
10334 }
10335
10336 found_passing = true;
10337 ba->nopass = 1;
10338 continue;
30b608eb
DK
10339 }
10340
e157f736
DK
10341 /* PASS possibly including argument. */
10342 m = gfc_match (" pass");
10343 if (m == MATCH_ERROR)
10344 goto error;
10345 if (m == MATCH_YES)
30b608eb 10346 {
e157f736
DK
10347 char arg[GFC_MAX_SYMBOL_LEN + 1];
10348
10349 if (found_passing)
10350 {
10351 gfc_error ("Binding attributes already specify passing,"
10352 " illegal PASS at %C");
10353 goto error;
10354 }
10355
10356 m = gfc_match (" ( %n )", arg);
10357 if (m == MATCH_ERROR)
10358 goto error;
10359 if (m == MATCH_YES)
51f03c6b 10360 ba->pass_arg = gfc_get_string ("%s", arg);
e157f736
DK
10361 gcc_assert ((m == MATCH_YES) == (ba->pass_arg != NULL));
10362
10363 found_passing = true;
10364 ba->nopass = 0;
10365 continue;
30b608eb
DK
10366 }
10367
713485cc
JW
10368 if (ppc)
10369 {
10370 /* POINTER flag. */
10371 m = gfc_match (" pointer");
10372 if (m == MATCH_ERROR)
10373 goto error;
10374 if (m == MATCH_YES)
10375 {
10376 if (seen_ptr)
10377 {
10378 gfc_error ("Duplicate POINTER attribute at %C");
10379 goto error;
10380 }
10381
10382 seen_ptr = true;
713485cc
JW
10383 continue;
10384 }
10385 }
10386 else
10387 {
10388 /* NON_OVERRIDABLE flag. */
10389 m = gfc_match (" non_overridable");
10390 if (m == MATCH_ERROR)
10391 goto error;
10392 if (m == MATCH_YES)
10393 {
10394 if (ba->non_overridable)
10395 {
10396 gfc_error ("Duplicate NON_OVERRIDABLE at %C");
10397 goto error;
10398 }
10399
10400 ba->non_overridable = 1;
10401 continue;
10402 }
10403
10404 /* DEFERRED flag. */
10405 m = gfc_match (" deferred");
10406 if (m == MATCH_ERROR)
10407 goto error;
10408 if (m == MATCH_YES)
10409 {
10410 if (ba->deferred)
10411 {
10412 gfc_error ("Duplicate DEFERRED at %C");
10413 goto error;
10414 }
10415
10416 ba->deferred = 1;
10417 continue;
10418 }
10419 }
10420
30b608eb
DK
10421 }
10422
10423 /* Nothing matching found. */
e157f736
DK
10424 if (generic)
10425 gfc_error ("Expected access-specifier at %C");
10426 else
10427 gfc_error ("Expected binding attribute at %C");
30b608eb
DK
10428 goto error;
10429 }
10430 while (gfc_match_char (',') == MATCH_YES);
10431
b0e5fa94
DK
10432 /* NON_OVERRIDABLE and DEFERRED exclude themselves. */
10433 if (ba->non_overridable && ba->deferred)
10434 {
10435 gfc_error ("NON_OVERRIDABLE and DEFERRED can't both appear at %C");
10436 goto error;
10437 }
10438
90661f26
JW
10439 m = MATCH_YES;
10440
10441done:
e157f736
DK
10442 if (ba->access == ACCESS_UNKNOWN)
10443 ba->access = gfc_typebound_default_access;
10444
713485cc
JW
10445 if (ppc && !seen_ptr)
10446 {
10447 gfc_error ("POINTER attribute is required for procedure pointer component"
10448 " at %C");
10449 goto error;
10450 }
10451
90661f26 10452 return m;
30b608eb
DK
10453
10454error:
30b608eb
DK
10455 return MATCH_ERROR;
10456}
10457
10458
10459/* Match a PROCEDURE specific binding inside a derived type. */
10460
10461static match
10462match_procedure_in_type (void)
10463{
10464 char name[GFC_MAX_SYMBOL_LEN + 1];
10465 char target_buf[GFC_MAX_SYMBOL_LEN + 1];
1be17993 10466 char* target = NULL, *ifc = NULL;
3e15518b 10467 gfc_typebound_proc tb;
30b608eb
DK
10468 bool seen_colons;
10469 bool seen_attrs;
10470 match m;
10471 gfc_symtree* stree;
10472 gfc_namespace* ns;
10473 gfc_symbol* block;
1be17993 10474 int num;
30b608eb
DK
10475
10476 /* Check current state. */
10477 gcc_assert (gfc_state_stack->state == COMP_DERIVED_CONTAINS);
10478 block = gfc_state_stack->previous->sym;
10479 gcc_assert (block);
10480
b0e5fa94 10481 /* Try to match PROCEDURE(interface). */
30b608eb
DK
10482 if (gfc_match (" (") == MATCH_YES)
10483 {
b0e5fa94
DK
10484 m = gfc_match_name (target_buf);
10485 if (m == MATCH_ERROR)
10486 return m;
10487 if (m != MATCH_YES)
10488 {
a4d9b221 10489 gfc_error ("Interface-name expected after %<(%> at %C");
b0e5fa94
DK
10490 return MATCH_ERROR;
10491 }
10492
10493 if (gfc_match (" )") != MATCH_YES)
10494 {
a4d9b221 10495 gfc_error ("%<)%> expected at %C");
b0e5fa94
DK
10496 return MATCH_ERROR;
10497 }
10498
1be17993 10499 ifc = target_buf;
30b608eb
DK
10500 }
10501
10502 /* Construct the data structure. */
ff5b6492 10503 memset (&tb, 0, sizeof (tb));
3e15518b 10504 tb.where = gfc_current_locus;
30b608eb
DK
10505
10506 /* Match binding attributes. */
3e15518b 10507 m = match_binding_attributes (&tb, false, false);
30b608eb
DK
10508 if (m == MATCH_ERROR)
10509 return m;
10510 seen_attrs = (m == MATCH_YES);
10511
1be17993 10512 /* Check that attribute DEFERRED is given if an interface is specified. */
3e15518b 10513 if (tb.deferred && !ifc)
b0e5fa94
DK
10514 {
10515 gfc_error ("Interface must be specified for DEFERRED binding at %C");
10516 return MATCH_ERROR;
10517 }
3e15518b 10518 if (ifc && !tb.deferred)
b0e5fa94
DK
10519 {
10520 gfc_error ("PROCEDURE(interface) at %C should be declared DEFERRED");
10521 return MATCH_ERROR;
10522 }
10523
30b608eb
DK
10524 /* Match the colons. */
10525 m = gfc_match (" ::");
10526 if (m == MATCH_ERROR)
10527 return m;
10528 seen_colons = (m == MATCH_YES);
10529 if (seen_attrs && !seen_colons)
10530 {
a4d9b221 10531 gfc_error ("Expected %<::%> after binding-attributes at %C");
30b608eb
DK
10532 return MATCH_ERROR;
10533 }
10534
f5acf0f2 10535 /* Match the binding names. */
1be17993 10536 for(num=1;;num++)
30b608eb 10537 {
1be17993
JW
10538 m = gfc_match_name (name);
10539 if (m == MATCH_ERROR)
10540 return m;
10541 if (m == MATCH_NO)
b0e5fa94 10542 {
1be17993 10543 gfc_error ("Expected binding name at %C");
b0e5fa94
DK
10544 return MATCH_ERROR;
10545 }
10546
524af0d6 10547 if (num>1 && !gfc_notify_std (GFC_STD_F2008, "PROCEDURE list at %C"))
1be17993 10548 return MATCH_ERROR;
30b608eb 10549
1be17993
JW
10550 /* Try to match the '=> target', if it's there. */
10551 target = ifc;
10552 m = gfc_match (" =>");
30b608eb
DK
10553 if (m == MATCH_ERROR)
10554 return m;
1be17993 10555 if (m == MATCH_YES)
30b608eb 10556 {
3e15518b 10557 if (tb.deferred)
1be17993 10558 {
a4d9b221 10559 gfc_error ("%<=> target%> is invalid for DEFERRED binding at %C");
1be17993
JW
10560 return MATCH_ERROR;
10561 }
10562
10563 if (!seen_colons)
10564 {
a4d9b221 10565 gfc_error ("%<::%> needed in PROCEDURE binding with explicit target"
1be17993
JW
10566 " at %C");
10567 return MATCH_ERROR;
10568 }
10569
10570 m = gfc_match_name (target_buf);
10571 if (m == MATCH_ERROR)
10572 return m;
10573 if (m == MATCH_NO)
10574 {
a4d9b221 10575 gfc_error ("Expected binding target after %<=>%> at %C");
1be17993
JW
10576 return MATCH_ERROR;
10577 }
10578 target = target_buf;
30b608eb 10579 }
30b608eb 10580
1be17993
JW
10581 /* If no target was found, it has the same name as the binding. */
10582 if (!target)
10583 target = name;
30b608eb 10584
1be17993
JW
10585 /* Get the namespace to insert the symbols into. */
10586 ns = block->f2k_derived;
10587 gcc_assert (ns);
30b608eb 10588
1be17993 10589 /* If the binding is DEFERRED, check that the containing type is ABSTRACT. */
3e15518b 10590 if (tb.deferred && !block->attr.abstract)
1be17993 10591 {
c4100eae 10592 gfc_error ("Type %qs containing DEFERRED binding at %C "
1be17993
JW
10593 "is not ABSTRACT", block->name);
10594 return MATCH_ERROR;
10595 }
30b608eb 10596
1be17993 10597 /* See if we already have a binding with this name in the symtree which
6bd2c800 10598 would be an error. If a GENERIC already targeted this binding, it may
1be17993
JW
10599 be already there but then typebound is still NULL. */
10600 stree = gfc_find_symtree (ns->tb_sym_root, name);
9f23af48 10601 if (stree && stree->n.tb)
1be17993 10602 {
c4100eae
MLI
10603 gfc_error ("There is already a procedure with binding name %qs for "
10604 "the derived type %qs at %C", name, block->name);
1be17993
JW
10605 return MATCH_ERROR;
10606 }
b0e5fa94 10607
1be17993 10608 /* Insert it and set attributes. */
30b608eb 10609
9f23af48
MM
10610 if (!stree)
10611 {
10612 stree = gfc_new_symtree (&ns->tb_sym_root, name);
10613 gcc_assert (stree);
10614 }
3e15518b 10615 stree->n.tb = gfc_get_typebound_proc (&tb);
e34ccb4c 10616
3e15518b
JW
10617 if (gfc_get_sym_tree (target, gfc_current_ns, &stree->n.tb->u.specific,
10618 false))
1be17993 10619 return MATCH_ERROR;
3e15518b 10620 gfc_set_sym_referenced (stree->n.tb->u.specific->n.sym);
f9d49cd1
JW
10621 gfc_add_flavor(&stree->n.tb->u.specific->n.sym->attr, FL_PROCEDURE,
10622 target, &stree->n.tb->u.specific->n.sym->declared_at);
f5acf0f2 10623
1be17993
JW
10624 if (gfc_match_eos () == MATCH_YES)
10625 return MATCH_YES;
10626 if (gfc_match_char (',') != MATCH_YES)
10627 goto syntax;
e34ccb4c 10628 }
30b608eb 10629
1be17993
JW
10630syntax:
10631 gfc_error ("Syntax error in PROCEDURE statement at %C");
10632 return MATCH_ERROR;
30b608eb
DK
10633}
10634
10635
e157f736
DK
10636/* Match a GENERIC procedure binding inside a derived type. */
10637
10638match
10639gfc_match_generic (void)
10640{
10641 char name[GFC_MAX_SYMBOL_LEN + 1];
94747289 10642 char bind_name[GFC_MAX_SYMBOL_LEN + 16]; /* Allow space for OPERATOR(...). */
e157f736
DK
10643 gfc_symbol* block;
10644 gfc_typebound_proc tbattr; /* Used for match_binding_attributes. */
10645 gfc_typebound_proc* tb;
e157f736 10646 gfc_namespace* ns;
94747289
DK
10647 interface_type op_type;
10648 gfc_intrinsic_op op;
e157f736
DK
10649 match m;
10650
10651 /* Check current state. */
10652 if (gfc_current_state () == COMP_DERIVED)
10653 {
10654 gfc_error ("GENERIC at %C must be inside a derived-type CONTAINS");
10655 return MATCH_ERROR;
10656 }
10657 if (gfc_current_state () != COMP_DERIVED_CONTAINS)
10658 return MATCH_NO;
10659 block = gfc_state_stack->previous->sym;
10660 ns = block->f2k_derived;
10661 gcc_assert (block && ns);
10662
ff5b6492
MM
10663 memset (&tbattr, 0, sizeof (tbattr));
10664 tbattr.where = gfc_current_locus;
10665
e157f736 10666 /* See if we get an access-specifier. */
713485cc 10667 m = match_binding_attributes (&tbattr, true, false);
e157f736
DK
10668 if (m == MATCH_ERROR)
10669 goto error;
10670
10671 /* Now the colons, those are required. */
10672 if (gfc_match (" ::") != MATCH_YES)
10673 {
a4d9b221 10674 gfc_error ("Expected %<::%> at %C");
e157f736
DK
10675 goto error;
10676 }
10677
94747289
DK
10678 /* Match the binding name; depending on type (operator / generic) format
10679 it for future error messages into bind_name. */
f5acf0f2 10680
94747289 10681 m = gfc_match_generic_spec (&op_type, name, &op);
e157f736
DK
10682 if (m == MATCH_ERROR)
10683 return MATCH_ERROR;
10684 if (m == MATCH_NO)
10685 {
94747289 10686 gfc_error ("Expected generic name or operator descriptor at %C");
e157f736
DK
10687 goto error;
10688 }
10689
94747289 10690 switch (op_type)
e157f736 10691 {
94747289 10692 case INTERFACE_GENERIC:
e73d3ca6 10693 case INTERFACE_DTIO:
94747289
DK
10694 snprintf (bind_name, sizeof (bind_name), "%s", name);
10695 break;
f5acf0f2 10696
94747289
DK
10697 case INTERFACE_USER_OP:
10698 snprintf (bind_name, sizeof (bind_name), "OPERATOR(.%s.)", name);
10699 break;
f5acf0f2 10700
94747289
DK
10701 case INTERFACE_INTRINSIC_OP:
10702 snprintf (bind_name, sizeof (bind_name), "OPERATOR(%s)",
10703 gfc_op2string (op));
10704 break;
10705
377e37c1
SK
10706 case INTERFACE_NAMELESS:
10707 gfc_error ("Malformed GENERIC statement at %C");
10708 goto error;
10709 break;
10710
94747289
DK
10711 default:
10712 gcc_unreachable ();
10713 }
e34ccb4c 10714
94747289
DK
10715 /* Match the required =>. */
10716 if (gfc_match (" =>") != MATCH_YES)
10717 {
a4d9b221 10718 gfc_error ("Expected %<=>%> at %C");
94747289
DK
10719 goto error;
10720 }
f5acf0f2 10721
94747289
DK
10722 /* Try to find existing GENERIC binding with this name / for this operator;
10723 if there is something, check that it is another GENERIC and then extend
10724 it rather than building a new node. Otherwise, create it and put it
10725 at the right position. */
10726
10727 switch (op_type)
10728 {
e73d3ca6 10729 case INTERFACE_DTIO:
94747289
DK
10730 case INTERFACE_USER_OP:
10731 case INTERFACE_GENERIC:
10732 {
10733 const bool is_op = (op_type == INTERFACE_USER_OP);
10734 gfc_symtree* st;
10735
10736 st = gfc_find_symtree (is_op ? ns->tb_uop_root : ns->tb_sym_root, name);
b93d8a3f 10737 tb = st ? st->n.tb : NULL;
94747289
DK
10738 break;
10739 }
10740
10741 case INTERFACE_INTRINSIC_OP:
10742 tb = ns->tb_op[op];
10743 break;
10744
10745 default:
10746 gcc_unreachable ();
10747 }
10748
10749 if (tb)
10750 {
e34ccb4c 10751 if (!tb->is_generic)
e157f736 10752 {
94747289 10753 gcc_assert (op_type == INTERFACE_GENERIC);
e157f736 10754 gfc_error ("There's already a non-generic procedure with binding name"
c4100eae 10755 " %qs for the derived type %qs at %C",
94747289 10756 bind_name, block->name);
e157f736
DK
10757 goto error;
10758 }
10759
e157f736
DK
10760 if (tb->access != tbattr.access)
10761 {
10762 gfc_error ("Binding at %C must have the same access as already"
c4100eae 10763 " defined binding %qs", bind_name);
e157f736
DK
10764 goto error;
10765 }
10766 }
10767 else
10768 {
3e15518b 10769 tb = gfc_get_typebound_proc (NULL);
e157f736
DK
10770 tb->where = gfc_current_locus;
10771 tb->access = tbattr.access;
10772 tb->is_generic = 1;
10773 tb->u.generic = NULL;
94747289
DK
10774
10775 switch (op_type)
10776 {
e73d3ca6 10777 case INTERFACE_DTIO:
94747289
DK
10778 case INTERFACE_GENERIC:
10779 case INTERFACE_USER_OP:
10780 {
10781 const bool is_op = (op_type == INTERFACE_USER_OP);
b93d8a3f
JW
10782 gfc_symtree* st = gfc_get_tbp_symtree (is_op ? &ns->tb_uop_root :
10783 &ns->tb_sym_root, name);
94747289
DK
10784 gcc_assert (st);
10785 st->n.tb = tb;
10786
10787 break;
10788 }
f5acf0f2 10789
94747289
DK
10790 case INTERFACE_INTRINSIC_OP:
10791 ns->tb_op[op] = tb;
10792 break;
10793
10794 default:
10795 gcc_unreachable ();
10796 }
e157f736
DK
10797 }
10798
10799 /* Now, match all following names as specific targets. */
10800 do
10801 {
10802 gfc_symtree* target_st;
10803 gfc_tbp_generic* target;
10804
10805 m = gfc_match_name (name);
10806 if (m == MATCH_ERROR)
10807 goto error;
10808 if (m == MATCH_NO)
10809 {
10810 gfc_error ("Expected specific binding name at %C");
10811 goto error;
10812 }
10813
e34ccb4c 10814 target_st = gfc_get_tbp_symtree (&ns->tb_sym_root, name);
e157f736
DK
10815
10816 /* See if this is a duplicate specification. */
10817 for (target = tb->u.generic; target; target = target->next)
10818 if (target_st == target->specific_st)
10819 {
c4100eae
MLI
10820 gfc_error ("%qs already defined as specific binding for the"
10821 " generic %qs at %C", name, bind_name);
e157f736
DK
10822 goto error;
10823 }
10824
e157f736
DK
10825 target = gfc_get_tbp_generic ();
10826 target->specific_st = target_st;
10827 target->specific = NULL;
10828 target->next = tb->u.generic;
218e1228
TB
10829 target->is_operator = ((op_type == INTERFACE_USER_OP)
10830 || (op_type == INTERFACE_INTRINSIC_OP));
e157f736
DK
10831 tb->u.generic = target;
10832 }
10833 while (gfc_match (" ,") == MATCH_YES);
10834
10835 /* Here should be the end. */
10836 if (gfc_match_eos () != MATCH_YES)
10837 {
10838 gfc_error ("Junk after GENERIC binding at %C");
10839 goto error;
10840 }
10841
10842 return MATCH_YES;
10843
10844error:
10845 return MATCH_ERROR;
10846}
10847
10848
34523524
DK
10849/* Match a FINAL declaration inside a derived type. */
10850
10851match
10852gfc_match_final_decl (void)
10853{
10854 char name[GFC_MAX_SYMBOL_LEN + 1];
10855 gfc_symbol* sym;
10856 match m;
10857 gfc_namespace* module_ns;
10858 bool first, last;
30b608eb 10859 gfc_symbol* block;
34523524 10860
33344e0f
JW
10861 if (gfc_current_form == FORM_FREE)
10862 {
10863 char c = gfc_peek_ascii_char ();
10864 if (!gfc_is_whitespace (c) && c != ':')
10865 return MATCH_NO;
10866 }
f5acf0f2 10867
30b608eb 10868 if (gfc_state_stack->state != COMP_DERIVED_CONTAINS)
34523524 10869 {
33344e0f
JW
10870 if (gfc_current_form == FORM_FIXED)
10871 return MATCH_NO;
10872
34523524 10873 gfc_error ("FINAL declaration at %C must be inside a derived type "
30b608eb 10874 "CONTAINS section");
34523524
DK
10875 return MATCH_ERROR;
10876 }
10877
30b608eb
DK
10878 block = gfc_state_stack->previous->sym;
10879 gcc_assert (block);
34523524 10880
30b608eb
DK
10881 if (!gfc_state_stack->previous || !gfc_state_stack->previous->previous
10882 || gfc_state_stack->previous->previous->state != COMP_MODULE)
34523524
DK
10883 {
10884 gfc_error ("Derived type declaration with FINAL at %C must be in the"
10885 " specification part of a MODULE");
10886 return MATCH_ERROR;
10887 }
10888
10889 module_ns = gfc_current_ns;
10890 gcc_assert (module_ns);
10891 gcc_assert (module_ns->proc_name->attr.flavor == FL_MODULE);
10892
10893 /* Match optional ::, don't care about MATCH_YES or MATCH_NO. */
10894 if (gfc_match (" ::") == MATCH_ERROR)
10895 return MATCH_ERROR;
10896
10897 /* Match the sequence of procedure names. */
10898 first = true;
10899 last = false;
10900 do
10901 {
10902 gfc_finalizer* f;
10903
10904 if (first && gfc_match_eos () == MATCH_YES)
10905 {
10906 gfc_error ("Empty FINAL at %C");
10907 return MATCH_ERROR;
10908 }
10909
10910 m = gfc_match_name (name);
10911 if (m == MATCH_NO)
10912 {
10913 gfc_error ("Expected module procedure name at %C");
10914 return MATCH_ERROR;
10915 }
10916 else if (m != MATCH_YES)
10917 return MATCH_ERROR;
10918
10919 if (gfc_match_eos () == MATCH_YES)
10920 last = true;
10921 if (!last && gfc_match_char (',') != MATCH_YES)
10922 {
a4d9b221 10923 gfc_error ("Expected %<,%> at %C");
34523524
DK
10924 return MATCH_ERROR;
10925 }
10926
10927 if (gfc_get_symbol (name, module_ns, &sym))
10928 {
c4100eae 10929 gfc_error ("Unknown procedure name %qs at %C", name);
34523524
DK
10930 return MATCH_ERROR;
10931 }
10932
10933 /* Mark the symbol as module procedure. */
10934 if (sym->attr.proc != PROC_MODULE
524af0d6 10935 && !gfc_add_procedure (&sym->attr, PROC_MODULE, sym->name, NULL))
34523524
DK
10936 return MATCH_ERROR;
10937
10938 /* Check if we already have this symbol in the list, this is an error. */
30b608eb 10939 for (f = block->f2k_derived->finalizers; f; f = f->next)
f6fad28e 10940 if (f->proc_sym == sym)
34523524 10941 {
546c8974 10942 gfc_error ("%qs at %C is already defined as FINAL procedure",
34523524
DK
10943 name);
10944 return MATCH_ERROR;
10945 }
10946
10947 /* Add this symbol to the list of finalizers. */
30b608eb 10948 gcc_assert (block->f2k_derived);
2050626a 10949 sym->refs++;
ece3f663 10950 f = XCNEW (gfc_finalizer);
f6fad28e
DK
10951 f->proc_sym = sym;
10952 f->proc_tree = NULL;
34523524 10953 f->where = gfc_current_locus;
30b608eb
DK
10954 f->next = block->f2k_derived->finalizers;
10955 block->f2k_derived->finalizers = f;
34523524
DK
10956
10957 first = false;
10958 }
10959 while (!last);
10960
10961 return MATCH_YES;
10962}
08a6b8e0
TB
10963
10964
10965const ext_attr_t ext_attr_list[] = {
e7ac6a7c
TB
10966 { "dllimport", EXT_ATTR_DLLIMPORT, "dllimport" },
10967 { "dllexport", EXT_ATTR_DLLEXPORT, "dllexport" },
10968 { "cdecl", EXT_ATTR_CDECL, "cdecl" },
10969 { "stdcall", EXT_ATTR_STDCALL, "stdcall" },
10970 { "fastcall", EXT_ATTR_FASTCALL, "fastcall" },
10971 { "no_arg_check", EXT_ATTR_NO_ARG_CHECK, NULL },
10972 { NULL, EXT_ATTR_LAST, NULL }
08a6b8e0
TB
10973};
10974
10975/* Match a !GCC$ ATTRIBUTES statement of the form:
10976 !GCC$ ATTRIBUTES attribute-list :: var-name [, var-name] ...
10977 When we come here, we have already matched the !GCC$ ATTRIBUTES string.
10978
10979 TODO: We should support all GCC attributes using the same syntax for
10980 the attribute list, i.e. the list in C
10981 __attributes(( attribute-list ))
10982 matches then
10983 !GCC$ ATTRIBUTES attribute-list ::
10984 Cf. c-parser.c's c_parser_attributes; the data can then directly be
10985 saved into a TREE.
10986
10987 As there is absolutely no risk of confusion, we should never return
10988 MATCH_NO. */
10989match
10990gfc_match_gcc_attributes (void)
f5acf0f2 10991{
08a6b8e0
TB
10992 symbol_attribute attr;
10993 char name[GFC_MAX_SYMBOL_LEN + 1];
10994 unsigned id;
10995 gfc_symbol *sym;
10996 match m;
10997
10998 gfc_clear_attr (&attr);
10999 for(;;)
11000 {
11001 char ch;
11002
11003 if (gfc_match_name (name) != MATCH_YES)
11004 return MATCH_ERROR;
11005
11006 for (id = 0; id < EXT_ATTR_LAST; id++)
11007 if (strcmp (name, ext_attr_list[id].name) == 0)
11008 break;
11009
11010 if (id == EXT_ATTR_LAST)
11011 {
11012 gfc_error ("Unknown attribute in !GCC$ ATTRIBUTES statement at %C");
11013 return MATCH_ERROR;
11014 }
11015
524af0d6 11016 if (!gfc_add_ext_attribute (&attr, (ext_attr_id_t)id, &gfc_current_locus))
08a6b8e0
TB
11017 return MATCH_ERROR;
11018
11019 gfc_gobble_whitespace ();
11020 ch = gfc_next_ascii_char ();
11021 if (ch == ':')
11022 {
11023 /* This is the successful exit condition for the loop. */
11024 if (gfc_next_ascii_char () == ':')
11025 break;
11026 }
11027
11028 if (ch == ',')
11029 continue;
11030
11031 goto syntax;
11032 }
11033
11034 if (gfc_match_eos () == MATCH_YES)
11035 goto syntax;
11036
11037 for(;;)
11038 {
11039 m = gfc_match_name (name);
11040 if (m != MATCH_YES)
11041 return m;
11042
11043 if (find_special (name, &sym, true))
11044 return MATCH_ERROR;
f5acf0f2 11045
08a6b8e0
TB
11046 sym->attr.ext_attr |= attr.ext_attr;
11047
11048 if (gfc_match_eos () == MATCH_YES)
11049 break;
11050
11051 if (gfc_match_char (',') != MATCH_YES)
11052 goto syntax;
11053 }
11054
11055 return MATCH_YES;
11056
11057syntax:
11058 gfc_error ("Syntax error in !GCC$ ATTRIBUTES statement at %C");
11059 return MATCH_ERROR;
11060}
170a8bd6
EB
11061
11062
11063/* Match a !GCC$ UNROLL statement of the form:
11064 !GCC$ UNROLL n
11065
11066 The parameter n is the number of times we are supposed to unroll.
11067
11068 When we come here, we have already matched the !GCC$ UNROLL string. */
11069match
11070gfc_match_gcc_unroll (void)
11071{
11072 int value;
11073
11074 if (gfc_match_small_int (&value) == MATCH_YES)
11075 {
11076 if (value < 0 || value > USHRT_MAX)
11077 {
11078 gfc_error ("%<GCC unroll%> directive requires a"
11079 " non-negative integral constant"
11080 " less than or equal to %u at %C",
11081 USHRT_MAX
11082 );
11083 return MATCH_ERROR;
11084 }
11085 if (gfc_match_eos () == MATCH_YES)
11086 {
11087 directive_unroll = value == 0 ? 1 : value;
11088 return MATCH_YES;
11089 }
11090 }
11091
11092 gfc_error ("Syntax error in !GCC$ UNROLL directive at %C");
11093 return MATCH_ERROR;
11094}