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