OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [gcc/] [fortran/] [decl.c] - Blame information for rev 304

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.