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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [fortran/] [expr.c] - Blame information for rev 801

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

Line No. Rev Author Line
1 712 jeremybenn
/* Routines for manipulation of expression nodes.
2
   Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3
   2009, 2010, 2011, 2012
4
   Free Software Foundation, Inc.
5
   Contributed by Andy Vaught
6
 
7
This file is part of GCC.
8
 
9
GCC is free software; you can redistribute it and/or modify it under
10
the terms of the GNU General Public License as published by the Free
11
Software Foundation; either version 3, or (at your option) any later
12
version.
13
 
14
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15
WARRANTY; without even the implied warranty of MERCHANTABILITY or
16
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17
for more details.
18
 
19
You should have received a copy of the GNU General Public License
20
along with GCC; see the file COPYING3.  If not see
21
<http://www.gnu.org/licenses/>.  */
22
 
23
#include "config.h"
24
#include "system.h"
25
#include "gfortran.h"
26
#include "arith.h"
27
#include "match.h"
28
#include "target-memory.h" /* for gfc_convert_boz */
29
#include "constructor.h"
30
 
31
 
32
/* The following set of functions provide access to gfc_expr* of
33
   various types - actual all but EXPR_FUNCTION and EXPR_VARIABLE.
34
 
35
   There are two functions available elsewhere that provide
36
   slightly different flavours of variables.  Namely:
37
     expr.c (gfc_get_variable_expr)
38
     symbol.c (gfc_lval_expr_from_sym)
39
   TODO: Merge these functions, if possible.  */
40
 
41
/* Get a new expression node.  */
42
 
43
gfc_expr *
44
gfc_get_expr (void)
45
{
46
  gfc_expr *e;
47
 
48
  e = XCNEW (gfc_expr);
49
  gfc_clear_ts (&e->ts);
50
  e->shape = NULL;
51
  e->ref = NULL;
52
  e->symtree = NULL;
53
  return e;
54
}
55
 
56
 
57
/* Get a new expression node that is an array constructor
58
   of given type and kind.  */
59
 
60
gfc_expr *
61
gfc_get_array_expr (bt type, int kind, locus *where)
62
{
63
  gfc_expr *e;
64
 
65
  e = gfc_get_expr ();
66
  e->expr_type = EXPR_ARRAY;
67
  e->value.constructor = NULL;
68
  e->rank = 1;
69
  e->shape = NULL;
70
 
71
  e->ts.type = type;
72
  e->ts.kind = kind;
73
  if (where)
74
    e->where = *where;
75
 
76
  return e;
77
}
78
 
79
 
80
/* Get a new expression node that is the NULL expression.  */
81
 
82
gfc_expr *
83
gfc_get_null_expr (locus *where)
84
{
85
  gfc_expr *e;
86
 
87
  e = gfc_get_expr ();
88
  e->expr_type = EXPR_NULL;
89
  e->ts.type = BT_UNKNOWN;
90
 
91
  if (where)
92
    e->where = *where;
93
 
94
  return e;
95
}
96
 
97
 
98
/* Get a new expression node that is an operator expression node.  */
99
 
100
gfc_expr *
101
gfc_get_operator_expr (locus *where, gfc_intrinsic_op op,
102
                      gfc_expr *op1, gfc_expr *op2)
103
{
104
  gfc_expr *e;
105
 
106
  e = gfc_get_expr ();
107
  e->expr_type = EXPR_OP;
108
  e->value.op.op = op;
109
  e->value.op.op1 = op1;
110
  e->value.op.op2 = op2;
111
 
112
  if (where)
113
    e->where = *where;
114
 
115
  return e;
116
}
117
 
118
 
119
/* Get a new expression node that is an structure constructor
120
   of given type and kind.  */
121
 
122
gfc_expr *
123
gfc_get_structure_constructor_expr (bt type, int kind, locus *where)
124
{
125
  gfc_expr *e;
126
 
127
  e = gfc_get_expr ();
128
  e->expr_type = EXPR_STRUCTURE;
129
  e->value.constructor = NULL;
130
 
131
  e->ts.type = type;
132
  e->ts.kind = kind;
133
  if (where)
134
    e->where = *where;
135
 
136
  return e;
137
}
138
 
139
 
140
/* Get a new expression node that is an constant of given type and kind.  */
141
 
142
gfc_expr *
143
gfc_get_constant_expr (bt type, int kind, locus *where)
144
{
145
  gfc_expr *e;
146
 
147
  if (!where)
148
    gfc_internal_error ("gfc_get_constant_expr(): locus 'where' cannot be NULL");
149
 
150
  e = gfc_get_expr ();
151
 
152
  e->expr_type = EXPR_CONSTANT;
153
  e->ts.type = type;
154
  e->ts.kind = kind;
155
  e->where = *where;
156
 
157
  switch (type)
158
    {
159
    case BT_INTEGER:
160
      mpz_init (e->value.integer);
161
      break;
162
 
163
    case BT_REAL:
164
      gfc_set_model_kind (kind);
165
      mpfr_init (e->value.real);
166
      break;
167
 
168
    case BT_COMPLEX:
169
      gfc_set_model_kind (kind);
170
      mpc_init2 (e->value.complex, mpfr_get_default_prec());
171
      break;
172
 
173
    default:
174
      break;
175
    }
176
 
177
  return e;
178
}
179
 
180
 
181
/* Get a new expression node that is an string constant.
182
   If no string is passed, a string of len is allocated,
183
   blanked and null-terminated.  */
184
 
185
gfc_expr *
186
gfc_get_character_expr (int kind, locus *where, const char *src, int len)
187
{
188
  gfc_expr *e;
189
  gfc_char_t *dest;
190
 
191
  if (!src)
192
    {
193
      dest = gfc_get_wide_string (len + 1);
194
      gfc_wide_memset (dest, ' ', len);
195
      dest[len] = '\0';
196
    }
197
  else
198
    dest = gfc_char_to_widechar (src);
199
 
200
  e = gfc_get_constant_expr (BT_CHARACTER, kind,
201
                            where ? where : &gfc_current_locus);
202
  e->value.character.string = dest;
203
  e->value.character.length = len;
204
 
205
  return e;
206
}
207
 
208
 
209
/* Get a new expression node that is an integer constant.  */
210
 
211
gfc_expr *
212
gfc_get_int_expr (int kind, locus *where, int value)
213
{
214
  gfc_expr *p;
215
  p = gfc_get_constant_expr (BT_INTEGER, kind,
216
                             where ? where : &gfc_current_locus);
217
 
218
  mpz_set_si (p->value.integer, value);
219
 
220
  return p;
221
}
222
 
223
 
224
/* Get a new expression node that is a logical constant.  */
225
 
226
gfc_expr *
227
gfc_get_logical_expr (int kind, locus *where, bool value)
228
{
229
  gfc_expr *p;
230
  p = gfc_get_constant_expr (BT_LOGICAL, kind,
231
                             where ? where : &gfc_current_locus);
232
 
233
  p->value.logical = value;
234
 
235
  return p;
236
}
237
 
238
 
239
gfc_expr *
240
gfc_get_iokind_expr (locus *where, io_kind k)
241
{
242
  gfc_expr *e;
243
 
244
  /* Set the types to something compatible with iokind. This is needed to
245
     get through gfc_free_expr later since iokind really has no Basic Type,
246
     BT, of its own.  */
247
 
248
  e = gfc_get_expr ();
249
  e->expr_type = EXPR_CONSTANT;
250
  e->ts.type = BT_LOGICAL;
251
  e->value.iokind = k;
252
  e->where = *where;
253
 
254
  return e;
255
}
256
 
257
 
258
/* Given an expression pointer, return a copy of the expression.  This
259
   subroutine is recursive.  */
260
 
261
gfc_expr *
262
gfc_copy_expr (gfc_expr *p)
263
{
264
  gfc_expr *q;
265
  gfc_char_t *s;
266
  char *c;
267
 
268
  if (p == NULL)
269
    return NULL;
270
 
271
  q = gfc_get_expr ();
272
  *q = *p;
273
 
274
  switch (q->expr_type)
275
    {
276
    case EXPR_SUBSTRING:
277
      s = gfc_get_wide_string (p->value.character.length + 1);
278
      q->value.character.string = s;
279
      memcpy (s, p->value.character.string,
280
              (p->value.character.length + 1) * sizeof (gfc_char_t));
281
      break;
282
 
283
    case EXPR_CONSTANT:
284
      /* Copy target representation, if it exists.  */
285
      if (p->representation.string)
286
        {
287
          c = XCNEWVEC (char, p->representation.length + 1);
288
          q->representation.string = c;
289
          memcpy (c, p->representation.string, (p->representation.length + 1));
290
        }
291
 
292
      /* Copy the values of any pointer components of p->value.  */
293
      switch (q->ts.type)
294
        {
295
        case BT_INTEGER:
296
          mpz_init_set (q->value.integer, p->value.integer);
297
          break;
298
 
299
        case BT_REAL:
300
          gfc_set_model_kind (q->ts.kind);
301
          mpfr_init (q->value.real);
302
          mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
303
          break;
304
 
305
        case BT_COMPLEX:
306
          gfc_set_model_kind (q->ts.kind);
307
          mpc_init2 (q->value.complex, mpfr_get_default_prec());
308
          mpc_set (q->value.complex, p->value.complex, GFC_MPC_RND_MODE);
309
          break;
310
 
311
        case BT_CHARACTER:
312
          if (p->representation.string)
313
            q->value.character.string
314
              = gfc_char_to_widechar (q->representation.string);
315
          else
316
            {
317
              s = gfc_get_wide_string (p->value.character.length + 1);
318
              q->value.character.string = s;
319
 
320
              /* This is the case for the C_NULL_CHAR named constant.  */
321
              if (p->value.character.length == 0
322
                  && (p->ts.is_c_interop || p->ts.is_iso_c))
323
                {
324
                  *s = '\0';
325
                  /* Need to set the length to 1 to make sure the NUL
326
                     terminator is copied.  */
327
                  q->value.character.length = 1;
328
                }
329
              else
330
                memcpy (s, p->value.character.string,
331
                        (p->value.character.length + 1) * sizeof (gfc_char_t));
332
            }
333
          break;
334
 
335
        case BT_HOLLERITH:
336
        case BT_LOGICAL:
337
        case BT_DERIVED:
338
        case BT_CLASS:
339
          break;                /* Already done.  */
340
 
341
        case BT_PROCEDURE:
342
        case BT_VOID:
343
           /* Should never be reached.  */
344
        case BT_UNKNOWN:
345
          gfc_internal_error ("gfc_copy_expr(): Bad expr node");
346
          /* Not reached.  */
347
        }
348
 
349
      break;
350
 
351
    case EXPR_OP:
352
      switch (q->value.op.op)
353
        {
354
        case INTRINSIC_NOT:
355
        case INTRINSIC_PARENTHESES:
356
        case INTRINSIC_UPLUS:
357
        case INTRINSIC_UMINUS:
358
          q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
359
          break;
360
 
361
        default:                /* Binary operators.  */
362
          q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
363
          q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
364
          break;
365
        }
366
 
367
      break;
368
 
369
    case EXPR_FUNCTION:
370
      q->value.function.actual =
371
        gfc_copy_actual_arglist (p->value.function.actual);
372
      break;
373
 
374
    case EXPR_COMPCALL:
375
    case EXPR_PPC:
376
      q->value.compcall.actual =
377
        gfc_copy_actual_arglist (p->value.compcall.actual);
378
      q->value.compcall.tbp = p->value.compcall.tbp;
379
      break;
380
 
381
    case EXPR_STRUCTURE:
382
    case EXPR_ARRAY:
383
      q->value.constructor = gfc_constructor_copy (p->value.constructor);
384
      break;
385
 
386
    case EXPR_VARIABLE:
387
    case EXPR_NULL:
388
      break;
389
    }
390
 
391
  q->shape = gfc_copy_shape (p->shape, p->rank);
392
 
393
  q->ref = gfc_copy_ref (p->ref);
394
 
395
  return q;
396
}
397
 
398
 
399
void
400
gfc_clear_shape (mpz_t *shape, int rank)
401
{
402
  int i;
403
 
404
  for (i = 0; i < rank; i++)
405
    mpz_clear (shape[i]);
406
}
407
 
408
 
409
void
410
gfc_free_shape (mpz_t **shape, int rank)
411
{
412
  if (*shape == NULL)
413
    return;
414
 
415
  gfc_clear_shape (*shape, rank);
416
  free (*shape);
417
  *shape = NULL;
418
}
419
 
420
 
421
/* Workhorse function for gfc_free_expr() that frees everything
422
   beneath an expression node, but not the node itself.  This is
423
   useful when we want to simplify a node and replace it with
424
   something else or the expression node belongs to another structure.  */
425
 
426
static void
427
free_expr0 (gfc_expr *e)
428
{
429
  switch (e->expr_type)
430
    {
431
    case EXPR_CONSTANT:
432
      /* Free any parts of the value that need freeing.  */
433
      switch (e->ts.type)
434
        {
435
        case BT_INTEGER:
436
          mpz_clear (e->value.integer);
437
          break;
438
 
439
        case BT_REAL:
440
          mpfr_clear (e->value.real);
441
          break;
442
 
443
        case BT_CHARACTER:
444
          free (e->value.character.string);
445
          break;
446
 
447
        case BT_COMPLEX:
448
          mpc_clear (e->value.complex);
449
          break;
450
 
451
        default:
452
          break;
453
        }
454
 
455
      /* Free the representation.  */
456
      free (e->representation.string);
457
 
458
      break;
459
 
460
    case EXPR_OP:
461
      if (e->value.op.op1 != NULL)
462
        gfc_free_expr (e->value.op.op1);
463
      if (e->value.op.op2 != NULL)
464
        gfc_free_expr (e->value.op.op2);
465
      break;
466
 
467
    case EXPR_FUNCTION:
468
      gfc_free_actual_arglist (e->value.function.actual);
469
      break;
470
 
471
    case EXPR_COMPCALL:
472
    case EXPR_PPC:
473
      gfc_free_actual_arglist (e->value.compcall.actual);
474
      break;
475
 
476
    case EXPR_VARIABLE:
477
      break;
478
 
479
    case EXPR_ARRAY:
480
    case EXPR_STRUCTURE:
481
      gfc_constructor_free (e->value.constructor);
482
      break;
483
 
484
    case EXPR_SUBSTRING:
485
      free (e->value.character.string);
486
      break;
487
 
488
    case EXPR_NULL:
489
      break;
490
 
491
    default:
492
      gfc_internal_error ("free_expr0(): Bad expr type");
493
    }
494
 
495
  /* Free a shape array.  */
496
  gfc_free_shape (&e->shape, e->rank);
497
 
498
  gfc_free_ref_list (e->ref);
499
 
500
  memset (e, '\0', sizeof (gfc_expr));
501
}
502
 
503
 
504
/* Free an expression node and everything beneath it.  */
505
 
506
void
507
gfc_free_expr (gfc_expr *e)
508
{
509
  if (e == NULL)
510
    return;
511
  free_expr0 (e);
512
  free (e);
513
}
514
 
515
 
516
/* Free an argument list and everything below it.  */
517
 
518
void
519
gfc_free_actual_arglist (gfc_actual_arglist *a1)
520
{
521
  gfc_actual_arglist *a2;
522
 
523
  while (a1)
524
    {
525
      a2 = a1->next;
526
      gfc_free_expr (a1->expr);
527
      free (a1);
528
      a1 = a2;
529
    }
530
}
531
 
532
 
533
/* Copy an arglist structure and all of the arguments.  */
534
 
535
gfc_actual_arglist *
536
gfc_copy_actual_arglist (gfc_actual_arglist *p)
537
{
538
  gfc_actual_arglist *head, *tail, *new_arg;
539
 
540
  head = tail = NULL;
541
 
542
  for (; p; p = p->next)
543
    {
544
      new_arg = gfc_get_actual_arglist ();
545
      *new_arg = *p;
546
 
547
      new_arg->expr = gfc_copy_expr (p->expr);
548
      new_arg->next = NULL;
549
 
550
      if (head == NULL)
551
        head = new_arg;
552
      else
553
        tail->next = new_arg;
554
 
555
      tail = new_arg;
556
    }
557
 
558
  return head;
559
}
560
 
561
 
562
/* Free a list of reference structures.  */
563
 
564
void
565
gfc_free_ref_list (gfc_ref *p)
566
{
567
  gfc_ref *q;
568
  int i;
569
 
570
  for (; p; p = q)
571
    {
572
      q = p->next;
573
 
574
      switch (p->type)
575
        {
576
        case REF_ARRAY:
577
          for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
578
            {
579
              gfc_free_expr (p->u.ar.start[i]);
580
              gfc_free_expr (p->u.ar.end[i]);
581
              gfc_free_expr (p->u.ar.stride[i]);
582
            }
583
 
584
          break;
585
 
586
        case REF_SUBSTRING:
587
          gfc_free_expr (p->u.ss.start);
588
          gfc_free_expr (p->u.ss.end);
589
          break;
590
 
591
        case REF_COMPONENT:
592
          break;
593
        }
594
 
595
      free (p);
596
    }
597
}
598
 
599
 
600
/* Graft the *src expression onto the *dest subexpression.  */
601
 
602
void
603
gfc_replace_expr (gfc_expr *dest, gfc_expr *src)
604
{
605
  free_expr0 (dest);
606
  *dest = *src;
607
  free (src);
608
}
609
 
610
 
611
/* Try to extract an integer constant from the passed expression node.
612
   Returns an error message or NULL if the result is set.  It is
613
   tempting to generate an error and return SUCCESS or FAILURE, but
614
   failure is OK for some callers.  */
615
 
616
const char *
617
gfc_extract_int (gfc_expr *expr, int *result)
618
{
619
  if (expr->expr_type != EXPR_CONSTANT)
620
    return _("Constant expression required at %C");
621
 
622
  if (expr->ts.type != BT_INTEGER)
623
    return _("Integer expression required at %C");
624
 
625
  if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
626
      || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
627
    {
628
      return _("Integer value too large in expression at %C");
629
    }
630
 
631
  *result = (int) mpz_get_si (expr->value.integer);
632
 
633
  return NULL;
634
}
635
 
636
 
637
/* Recursively copy a list of reference structures.  */
638
 
639
gfc_ref *
640
gfc_copy_ref (gfc_ref *src)
641
{
642
  gfc_array_ref *ar;
643
  gfc_ref *dest;
644
 
645
  if (src == NULL)
646
    return NULL;
647
 
648
  dest = gfc_get_ref ();
649
  dest->type = src->type;
650
 
651
  switch (src->type)
652
    {
653
    case REF_ARRAY:
654
      ar = gfc_copy_array_ref (&src->u.ar);
655
      dest->u.ar = *ar;
656
      free (ar);
657
      break;
658
 
659
    case REF_COMPONENT:
660
      dest->u.c = src->u.c;
661
      break;
662
 
663
    case REF_SUBSTRING:
664
      dest->u.ss = src->u.ss;
665
      dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
666
      dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
667
      break;
668
    }
669
 
670
  dest->next = gfc_copy_ref (src->next);
671
 
672
  return dest;
673
}
674
 
675
 
676
/* Detect whether an expression has any vector index array references.  */
677
 
678
int
679
gfc_has_vector_index (gfc_expr *e)
680
{
681
  gfc_ref *ref;
682
  int i;
683
  for (ref = e->ref; ref; ref = ref->next)
684
    if (ref->type == REF_ARRAY)
685
      for (i = 0; i < ref->u.ar.dimen; i++)
686
        if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
687
          return 1;
688
  return 0;
689
}
690
 
691
 
692
/* Copy a shape array.  */
693
 
694
mpz_t *
695
gfc_copy_shape (mpz_t *shape, int rank)
696
{
697
  mpz_t *new_shape;
698
  int n;
699
 
700
  if (shape == NULL)
701
    return NULL;
702
 
703
  new_shape = gfc_get_shape (rank);
704
 
705
  for (n = 0; n < rank; n++)
706
    mpz_init_set (new_shape[n], shape[n]);
707
 
708
  return new_shape;
709
}
710
 
711
 
712
/* Copy a shape array excluding dimension N, where N is an integer
713
   constant expression.  Dimensions are numbered in fortran style --
714
   starting with ONE.
715
 
716
   So, if the original shape array contains R elements
717
      { s1 ... sN-1  sN  sN+1 ... sR-1 sR}
718
   the result contains R-1 elements:
719
      { s1 ... sN-1  sN+1    ...  sR-1}
720
 
721
   If anything goes wrong -- N is not a constant, its value is out
722
   of range -- or anything else, just returns NULL.  */
723
 
724
mpz_t *
725
gfc_copy_shape_excluding (mpz_t *shape, int rank, gfc_expr *dim)
726
{
727
  mpz_t *new_shape, *s;
728
  int i, n;
729
 
730
  if (shape == NULL
731
      || rank <= 1
732
      || dim == NULL
733
      || dim->expr_type != EXPR_CONSTANT
734
      || dim->ts.type != BT_INTEGER)
735
    return NULL;
736
 
737
  n = mpz_get_si (dim->value.integer);
738
  n--; /* Convert to zero based index.  */
739
  if (n < 0 || n >= rank)
740
    return NULL;
741
 
742
  s = new_shape = gfc_get_shape (rank - 1);
743
 
744
  for (i = 0; i < rank; i++)
745
    {
746
      if (i == n)
747
        continue;
748
      mpz_init_set (*s, shape[i]);
749
      s++;
750
    }
751
 
752
  return new_shape;
753
}
754
 
755
 
756
/* Return the maximum kind of two expressions.  In general, higher
757
   kind numbers mean more precision for numeric types.  */
758
 
759
int
760
gfc_kind_max (gfc_expr *e1, gfc_expr *e2)
761
{
762
  return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
763
}
764
 
765
 
766
/* Returns nonzero if the type is numeric, zero otherwise.  */
767
 
768
static int
769
numeric_type (bt type)
770
{
771
  return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
772
}
773
 
774
 
775
/* Returns nonzero if the typespec is a numeric type, zero otherwise.  */
776
 
777
int
778
gfc_numeric_ts (gfc_typespec *ts)
779
{
780
  return numeric_type (ts->type);
781
}
782
 
783
 
784
/* Return an expression node with an optional argument list attached.
785
   A variable number of gfc_expr pointers are strung together in an
786
   argument list with a NULL pointer terminating the list.  */
787
 
788
gfc_expr *
789
gfc_build_conversion (gfc_expr *e)
790
{
791
  gfc_expr *p;
792
 
793
  p = gfc_get_expr ();
794
  p->expr_type = EXPR_FUNCTION;
795
  p->symtree = NULL;
796
  p->value.function.actual = NULL;
797
 
798
  p->value.function.actual = gfc_get_actual_arglist ();
799
  p->value.function.actual->expr = e;
800
 
801
  return p;
802
}
803
 
804
 
805
/* Given an expression node with some sort of numeric binary
806
   expression, insert type conversions required to make the operands
807
   have the same type. Conversion warnings are disabled if wconversion
808
   is set to 0.
809
 
810
   The exception is that the operands of an exponential don't have to
811
   have the same type.  If possible, the base is promoted to the type
812
   of the exponent.  For example, 1**2.3 becomes 1.0**2.3, but
813
   1.0**2 stays as it is.  */
814
 
815
void
816
gfc_type_convert_binary (gfc_expr *e, int wconversion)
817
{
818
  gfc_expr *op1, *op2;
819
 
820
  op1 = e->value.op.op1;
821
  op2 = e->value.op.op2;
822
 
823
  if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
824
    {
825
      gfc_clear_ts (&e->ts);
826
      return;
827
    }
828
 
829
  /* Kind conversions of same type.  */
830
  if (op1->ts.type == op2->ts.type)
831
    {
832
      if (op1->ts.kind == op2->ts.kind)
833
        {
834
          /* No type conversions.  */
835
          e->ts = op1->ts;
836
          goto done;
837
        }
838
 
839
      if (op1->ts.kind > op2->ts.kind)
840
        gfc_convert_type_warn (op2, &op1->ts, 2, wconversion);
841
      else
842
        gfc_convert_type_warn (op1, &op2->ts, 2, wconversion);
843
 
844
      e->ts = op1->ts;
845
      goto done;
846
    }
847
 
848
  /* Integer combined with real or complex.  */
849
  if (op2->ts.type == BT_INTEGER)
850
    {
851
      e->ts = op1->ts;
852
 
853
      /* Special case for ** operator.  */
854
      if (e->value.op.op == INTRINSIC_POWER)
855
        goto done;
856
 
857
      gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
858
      goto done;
859
    }
860
 
861
  if (op1->ts.type == BT_INTEGER)
862
    {
863
      e->ts = op2->ts;
864
      gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
865
      goto done;
866
    }
867
 
868
  /* Real combined with complex.  */
869
  e->ts.type = BT_COMPLEX;
870
  if (op1->ts.kind > op2->ts.kind)
871
    e->ts.kind = op1->ts.kind;
872
  else
873
    e->ts.kind = op2->ts.kind;
874
  if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
875
    gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
876
  if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
877
    gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
878
 
879
done:
880
  return;
881
}
882
 
883
 
884
/* Function to determine if an expression is constant or not.  This
885
   function expects that the expression has already been simplified.  */
886
 
887
int
888
gfc_is_constant_expr (gfc_expr *e)
889
{
890
  gfc_constructor *c;
891
  gfc_actual_arglist *arg;
892
  gfc_symbol *sym;
893
 
894
  if (e == NULL)
895
    return 1;
896
 
897
  switch (e->expr_type)
898
    {
899
    case EXPR_OP:
900
      return (gfc_is_constant_expr (e->value.op.op1)
901
              && (e->value.op.op2 == NULL
902
                  || gfc_is_constant_expr (e->value.op.op2)));
903
 
904
    case EXPR_VARIABLE:
905
      return 0;
906
 
907
    case EXPR_FUNCTION:
908
    case EXPR_PPC:
909
    case EXPR_COMPCALL:
910
      gcc_assert (e->symtree || e->value.function.esym
911
                  || e->value.function.isym);
912
 
913
      /* Call to intrinsic with at least one argument.  */
914
      if (e->value.function.isym && e->value.function.actual)
915
        {
916
          for (arg = e->value.function.actual; arg; arg = arg->next)
917
            if (!gfc_is_constant_expr (arg->expr))
918
              return 0;
919
        }
920
 
921
      /* Specification functions are constant.  */
922
      /* F95, 7.1.6.2; F2003, 7.1.7  */
923
      sym = NULL;
924
      if (e->symtree)
925
        sym = e->symtree->n.sym;
926
      if (e->value.function.esym)
927
        sym = e->value.function.esym;
928
 
929
      if (sym
930
          && sym->attr.function
931
          && sym->attr.pure
932
          && !sym->attr.intrinsic
933
          && !sym->attr.recursive
934
          && sym->attr.proc != PROC_INTERNAL
935
          && sym->attr.proc != PROC_ST_FUNCTION
936
          && sym->attr.proc != PROC_UNKNOWN
937
          && sym->formal == NULL)
938
        return 1;
939
 
940
      if (e->value.function.isym
941
          && (e->value.function.isym->elemental
942
              || e->value.function.isym->pure
943
              || e->value.function.isym->inquiry
944
              || e->value.function.isym->transformational))
945
        return 1;
946
 
947
      return 0;
948
 
949
    case EXPR_CONSTANT:
950
    case EXPR_NULL:
951
      return 1;
952
 
953
    case EXPR_SUBSTRING:
954
      return e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start)
955
                                && gfc_is_constant_expr (e->ref->u.ss.end));
956
 
957
    case EXPR_ARRAY:
958
    case EXPR_STRUCTURE:
959
      c = gfc_constructor_first (e->value.constructor);
960
      if ((e->expr_type == EXPR_ARRAY) && c && c->iterator)
961
        return gfc_constant_ac (e);
962
 
963
      for (; c; c = gfc_constructor_next (c))
964
        if (!gfc_is_constant_expr (c->expr))
965
          return 0;
966
 
967
      return 1;
968
 
969
 
970
    default:
971
      gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
972
      return 0;
973
    }
974
}
975
 
976
 
977
/* Is true if an array reference is followed by a component or substring
978
   reference.  */
979
bool
980
is_subref_array (gfc_expr * e)
981
{
982
  gfc_ref * ref;
983
  bool seen_array;
984
 
985
  if (e->expr_type != EXPR_VARIABLE)
986
    return false;
987
 
988
  if (e->symtree->n.sym->attr.subref_array_pointer)
989
    return true;
990
 
991
  seen_array = false;
992
  for (ref = e->ref; ref; ref = ref->next)
993
    {
994
      if (ref->type == REF_ARRAY
995
            && ref->u.ar.type != AR_ELEMENT)
996
        seen_array = true;
997
 
998
      if (seen_array
999
            && ref->type != REF_ARRAY)
1000
        return seen_array;
1001
    }
1002
  return false;
1003
}
1004
 
1005
 
1006
/* Try to collapse intrinsic expressions.  */
1007
 
1008
static gfc_try
1009
simplify_intrinsic_op (gfc_expr *p, int type)
1010
{
1011
  gfc_intrinsic_op op;
1012
  gfc_expr *op1, *op2, *result;
1013
 
1014
  if (p->value.op.op == INTRINSIC_USER)
1015
    return SUCCESS;
1016
 
1017
  op1 = p->value.op.op1;
1018
  op2 = p->value.op.op2;
1019
  op  = p->value.op.op;
1020
 
1021
  if (gfc_simplify_expr (op1, type) == FAILURE)
1022
    return FAILURE;
1023
  if (gfc_simplify_expr (op2, type) == FAILURE)
1024
    return FAILURE;
1025
 
1026
  if (!gfc_is_constant_expr (op1)
1027
      || (op2 != NULL && !gfc_is_constant_expr (op2)))
1028
    return SUCCESS;
1029
 
1030
  /* Rip p apart.  */
1031
  p->value.op.op1 = NULL;
1032
  p->value.op.op2 = NULL;
1033
 
1034
  switch (op)
1035
    {
1036
    case INTRINSIC_PARENTHESES:
1037
      result = gfc_parentheses (op1);
1038
      break;
1039
 
1040
    case INTRINSIC_UPLUS:
1041
      result = gfc_uplus (op1);
1042
      break;
1043
 
1044
    case INTRINSIC_UMINUS:
1045
      result = gfc_uminus (op1);
1046
      break;
1047
 
1048
    case INTRINSIC_PLUS:
1049
      result = gfc_add (op1, op2);
1050
      break;
1051
 
1052
    case INTRINSIC_MINUS:
1053
      result = gfc_subtract (op1, op2);
1054
      break;
1055
 
1056
    case INTRINSIC_TIMES:
1057
      result = gfc_multiply (op1, op2);
1058
      break;
1059
 
1060
    case INTRINSIC_DIVIDE:
1061
      result = gfc_divide (op1, op2);
1062
      break;
1063
 
1064
    case INTRINSIC_POWER:
1065
      result = gfc_power (op1, op2);
1066
      break;
1067
 
1068
    case INTRINSIC_CONCAT:
1069
      result = gfc_concat (op1, op2);
1070
      break;
1071
 
1072
    case INTRINSIC_EQ:
1073
    case INTRINSIC_EQ_OS:
1074
      result = gfc_eq (op1, op2, op);
1075
      break;
1076
 
1077
    case INTRINSIC_NE:
1078
    case INTRINSIC_NE_OS:
1079
      result = gfc_ne (op1, op2, op);
1080
      break;
1081
 
1082
    case INTRINSIC_GT:
1083
    case INTRINSIC_GT_OS:
1084
      result = gfc_gt (op1, op2, op);
1085
      break;
1086
 
1087
    case INTRINSIC_GE:
1088
    case INTRINSIC_GE_OS:
1089
      result = gfc_ge (op1, op2, op);
1090
      break;
1091
 
1092
    case INTRINSIC_LT:
1093
    case INTRINSIC_LT_OS:
1094
      result = gfc_lt (op1, op2, op);
1095
      break;
1096
 
1097
    case INTRINSIC_LE:
1098
    case INTRINSIC_LE_OS:
1099
      result = gfc_le (op1, op2, op);
1100
      break;
1101
 
1102
    case INTRINSIC_NOT:
1103
      result = gfc_not (op1);
1104
      break;
1105
 
1106
    case INTRINSIC_AND:
1107
      result = gfc_and (op1, op2);
1108
      break;
1109
 
1110
    case INTRINSIC_OR:
1111
      result = gfc_or (op1, op2);
1112
      break;
1113
 
1114
    case INTRINSIC_EQV:
1115
      result = gfc_eqv (op1, op2);
1116
      break;
1117
 
1118
    case INTRINSIC_NEQV:
1119
      result = gfc_neqv (op1, op2);
1120
      break;
1121
 
1122
    default:
1123
      gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
1124
    }
1125
 
1126
  if (result == NULL)
1127
    {
1128
      gfc_free_expr (op1);
1129
      gfc_free_expr (op2);
1130
      return FAILURE;
1131
    }
1132
 
1133
  result->rank = p->rank;
1134
  result->where = p->where;
1135
  gfc_replace_expr (p, result);
1136
 
1137
  return SUCCESS;
1138
}
1139
 
1140
 
1141
/* Subroutine to simplify constructor expressions.  Mutually recursive
1142
   with gfc_simplify_expr().  */
1143
 
1144
static gfc_try
1145
simplify_constructor (gfc_constructor_base base, int type)
1146
{
1147
  gfc_constructor *c;
1148
  gfc_expr *p;
1149
 
1150
  for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
1151
    {
1152
      if (c->iterator
1153
          && (gfc_simplify_expr (c->iterator->start, type) == FAILURE
1154
              || gfc_simplify_expr (c->iterator->end, type) == FAILURE
1155
              || gfc_simplify_expr (c->iterator->step, type) == FAILURE))
1156
        return FAILURE;
1157
 
1158
      if (c->expr)
1159
        {
1160
          /* Try and simplify a copy.  Replace the original if successful
1161
             but keep going through the constructor at all costs.  Not
1162
             doing so can make a dog's dinner of complicated things.  */
1163
          p = gfc_copy_expr (c->expr);
1164
 
1165
          if (gfc_simplify_expr (p, type) == FAILURE)
1166
            {
1167
              gfc_free_expr (p);
1168
              continue;
1169
            }
1170
 
1171
          gfc_replace_expr (c->expr, p);
1172
        }
1173
    }
1174
 
1175
  return SUCCESS;
1176
}
1177
 
1178
 
1179
/* Pull a single array element out of an array constructor.  */
1180
 
1181
static gfc_try
1182
find_array_element (gfc_constructor_base base, gfc_array_ref *ar,
1183
                    gfc_constructor **rval)
1184
{
1185
  unsigned long nelemen;
1186
  int i;
1187
  mpz_t delta;
1188
  mpz_t offset;
1189
  mpz_t span;
1190
  mpz_t tmp;
1191
  gfc_constructor *cons;
1192
  gfc_expr *e;
1193
  gfc_try t;
1194
 
1195
  t = SUCCESS;
1196
  e = NULL;
1197
 
1198
  mpz_init_set_ui (offset, 0);
1199
  mpz_init (delta);
1200
  mpz_init (tmp);
1201
  mpz_init_set_ui (span, 1);
1202
  for (i = 0; i < ar->dimen; i++)
1203
    {
1204
      if (gfc_reduce_init_expr (ar->as->lower[i]) == FAILURE
1205
          || gfc_reduce_init_expr (ar->as->upper[i]) == FAILURE)
1206
        {
1207
          t = FAILURE;
1208
          cons = NULL;
1209
          goto depart;
1210
        }
1211
 
1212
      e = gfc_copy_expr (ar->start[i]);
1213
      if (e->expr_type != EXPR_CONSTANT)
1214
        {
1215
          cons = NULL;
1216
          goto depart;
1217
        }
1218
 
1219
      gcc_assert (ar->as->upper[i]->expr_type == EXPR_CONSTANT
1220
                  && ar->as->lower[i]->expr_type == EXPR_CONSTANT);
1221
 
1222
      /* Check the bounds.  */
1223
      if ((ar->as->upper[i]
1224
           && mpz_cmp (e->value.integer,
1225
                       ar->as->upper[i]->value.integer) > 0)
1226
          || (mpz_cmp (e->value.integer,
1227
                       ar->as->lower[i]->value.integer) < 0))
1228
        {
1229
          gfc_error ("Index in dimension %d is out of bounds "
1230
                     "at %L", i + 1, &ar->c_where[i]);
1231
          cons = NULL;
1232
          t = FAILURE;
1233
          goto depart;
1234
        }
1235
 
1236
      mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
1237
      mpz_mul (delta, delta, span);
1238
      mpz_add (offset, offset, delta);
1239
 
1240
      mpz_set_ui (tmp, 1);
1241
      mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
1242
      mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
1243
      mpz_mul (span, span, tmp);
1244
    }
1245
 
1246
  for (cons = gfc_constructor_first (base), nelemen = mpz_get_ui (offset);
1247
       cons && nelemen > 0; cons = gfc_constructor_next (cons), nelemen--)
1248
    {
1249
      if (cons->iterator)
1250
        {
1251
          cons = NULL;
1252
          goto depart;
1253
        }
1254
    }
1255
 
1256
depart:
1257
  mpz_clear (delta);
1258
  mpz_clear (offset);
1259
  mpz_clear (span);
1260
  mpz_clear (tmp);
1261
  if (e)
1262
    gfc_free_expr (e);
1263
  *rval = cons;
1264
  return t;
1265
}
1266
 
1267
 
1268
/* Find a component of a structure constructor.  */
1269
 
1270
static gfc_constructor *
1271
find_component_ref (gfc_constructor_base base, gfc_ref *ref)
1272
{
1273
  gfc_component *comp;
1274
  gfc_component *pick;
1275
  gfc_constructor *c = gfc_constructor_first (base);
1276
 
1277
  comp = ref->u.c.sym->components;
1278
  pick = ref->u.c.component;
1279
  while (comp != pick)
1280
    {
1281
      comp = comp->next;
1282
      c = gfc_constructor_next (c);
1283
    }
1284
 
1285
  return c;
1286
}
1287
 
1288
 
1289
/* Replace an expression with the contents of a constructor, removing
1290
   the subobject reference in the process.  */
1291
 
1292
static void
1293
remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
1294
{
1295
  gfc_expr *e;
1296
 
1297
  if (cons)
1298
    {
1299
      e = cons->expr;
1300
      cons->expr = NULL;
1301
    }
1302
  else
1303
    e = gfc_copy_expr (p);
1304
  e->ref = p->ref->next;
1305
  p->ref->next =  NULL;
1306
  gfc_replace_expr (p, e);
1307
}
1308
 
1309
 
1310
/* Pull an array section out of an array constructor.  */
1311
 
1312
static gfc_try
1313
find_array_section (gfc_expr *expr, gfc_ref *ref)
1314
{
1315
  int idx;
1316
  int rank;
1317
  int d;
1318
  int shape_i;
1319
  int limit;
1320
  long unsigned one = 1;
1321
  bool incr_ctr;
1322
  mpz_t start[GFC_MAX_DIMENSIONS];
1323
  mpz_t end[GFC_MAX_DIMENSIONS];
1324
  mpz_t stride[GFC_MAX_DIMENSIONS];
1325
  mpz_t delta[GFC_MAX_DIMENSIONS];
1326
  mpz_t ctr[GFC_MAX_DIMENSIONS];
1327
  mpz_t delta_mpz;
1328
  mpz_t tmp_mpz;
1329
  mpz_t nelts;
1330
  mpz_t ptr;
1331
  gfc_constructor_base base;
1332
  gfc_constructor *cons, *vecsub[GFC_MAX_DIMENSIONS];
1333
  gfc_expr *begin;
1334
  gfc_expr *finish;
1335
  gfc_expr *step;
1336
  gfc_expr *upper;
1337
  gfc_expr *lower;
1338
  gfc_try t;
1339
 
1340
  t = SUCCESS;
1341
 
1342
  base = expr->value.constructor;
1343
  expr->value.constructor = NULL;
1344
 
1345
  rank = ref->u.ar.as->rank;
1346
 
1347
  if (expr->shape == NULL)
1348
    expr->shape = gfc_get_shape (rank);
1349
 
1350
  mpz_init_set_ui (delta_mpz, one);
1351
  mpz_init_set_ui (nelts, one);
1352
  mpz_init (tmp_mpz);
1353
 
1354
  /* Do the initialization now, so that we can cleanup without
1355
     keeping track of where we were.  */
1356
  for (d = 0; d < rank; d++)
1357
    {
1358
      mpz_init (delta[d]);
1359
      mpz_init (start[d]);
1360
      mpz_init (end[d]);
1361
      mpz_init (ctr[d]);
1362
      mpz_init (stride[d]);
1363
      vecsub[d] = NULL;
1364
    }
1365
 
1366
  /* Build the counters to clock through the array reference.  */
1367
  shape_i = 0;
1368
  for (d = 0; d < rank; d++)
1369
    {
1370
      /* Make this stretch of code easier on the eye!  */
1371
      begin = ref->u.ar.start[d];
1372
      finish = ref->u.ar.end[d];
1373
      step = ref->u.ar.stride[d];
1374
      lower = ref->u.ar.as->lower[d];
1375
      upper = ref->u.ar.as->upper[d];
1376
 
1377
      if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR)  /* Vector subscript.  */
1378
        {
1379
          gfc_constructor *ci;
1380
          gcc_assert (begin);
1381
 
1382
          if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
1383
            {
1384
              t = FAILURE;
1385
              goto cleanup;
1386
            }
1387
 
1388
          gcc_assert (begin->rank == 1);
1389
          /* Zero-sized arrays have no shape and no elements, stop early.  */
1390
          if (!begin->shape)
1391
            {
1392
              mpz_init_set_ui (nelts, 0);
1393
              break;
1394
            }
1395
 
1396
          vecsub[d] = gfc_constructor_first (begin->value.constructor);
1397
          mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1398
          mpz_mul (nelts, nelts, begin->shape[0]);
1399
          mpz_set (expr->shape[shape_i++], begin->shape[0]);
1400
 
1401
          /* Check bounds.  */
1402
          for (ci = vecsub[d]; ci; ci = gfc_constructor_next (ci))
1403
            {
1404
              if (mpz_cmp (ci->expr->value.integer, upper->value.integer) > 0
1405
                  || mpz_cmp (ci->expr->value.integer,
1406
                              lower->value.integer) < 0)
1407
                {
1408
                  gfc_error ("index in dimension %d is out of bounds "
1409
                             "at %L", d + 1, &ref->u.ar.c_where[d]);
1410
                  t = FAILURE;
1411
                  goto cleanup;
1412
                }
1413
            }
1414
        }
1415
      else
1416
        {
1417
          if ((begin && begin->expr_type != EXPR_CONSTANT)
1418
              || (finish && finish->expr_type != EXPR_CONSTANT)
1419
              || (step && step->expr_type != EXPR_CONSTANT))
1420
            {
1421
              t = FAILURE;
1422
              goto cleanup;
1423
            }
1424
 
1425
          /* Obtain the stride.  */
1426
          if (step)
1427
            mpz_set (stride[d], step->value.integer);
1428
          else
1429
            mpz_set_ui (stride[d], one);
1430
 
1431
          if (mpz_cmp_ui (stride[d], 0) == 0)
1432
            mpz_set_ui (stride[d], one);
1433
 
1434
          /* Obtain the start value for the index.  */
1435
          if (begin)
1436
            mpz_set (start[d], begin->value.integer);
1437
          else
1438
            mpz_set (start[d], lower->value.integer);
1439
 
1440
          mpz_set (ctr[d], start[d]);
1441
 
1442
          /* Obtain the end value for the index.  */
1443
          if (finish)
1444
            mpz_set (end[d], finish->value.integer);
1445
          else
1446
            mpz_set (end[d], upper->value.integer);
1447
 
1448
          /* Separate 'if' because elements sometimes arrive with
1449
             non-null end.  */
1450
          if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1451
            mpz_set (end [d], begin->value.integer);
1452
 
1453
          /* Check the bounds.  */
1454
          if (mpz_cmp (ctr[d], upper->value.integer) > 0
1455
              || mpz_cmp (end[d], upper->value.integer) > 0
1456
              || mpz_cmp (ctr[d], lower->value.integer) < 0
1457
              || mpz_cmp (end[d], lower->value.integer) < 0)
1458
            {
1459
              gfc_error ("index in dimension %d is out of bounds "
1460
                         "at %L", d + 1, &ref->u.ar.c_where[d]);
1461
              t = FAILURE;
1462
              goto cleanup;
1463
            }
1464
 
1465
          /* Calculate the number of elements and the shape.  */
1466
          mpz_set (tmp_mpz, stride[d]);
1467
          mpz_add (tmp_mpz, end[d], tmp_mpz);
1468
          mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1469
          mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1470
          mpz_mul (nelts, nelts, tmp_mpz);
1471
 
1472
          /* An element reference reduces the rank of the expression; don't
1473
             add anything to the shape array.  */
1474
          if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT)
1475
            mpz_set (expr->shape[shape_i++], tmp_mpz);
1476
        }
1477
 
1478
      /* Calculate the 'stride' (=delta) for conversion of the
1479
         counter values into the index along the constructor.  */
1480
      mpz_set (delta[d], delta_mpz);
1481
      mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1482
      mpz_add_ui (tmp_mpz, tmp_mpz, one);
1483
      mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1484
    }
1485
 
1486
  mpz_init (ptr);
1487
  cons = gfc_constructor_first (base);
1488
 
1489
  /* Now clock through the array reference, calculating the index in
1490
     the source constructor and transferring the elements to the new
1491
     constructor.  */
1492
  for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
1493
    {
1494
      if (ref->u.ar.offset)
1495
        mpz_set (ptr, ref->u.ar.offset->value.integer);
1496
      else
1497
        mpz_init_set_ui (ptr, 0);
1498
 
1499
      incr_ctr = true;
1500
      for (d = 0; d < rank; d++)
1501
        {
1502
          mpz_set (tmp_mpz, ctr[d]);
1503
          mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
1504
          mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1505
          mpz_add (ptr, ptr, tmp_mpz);
1506
 
1507
          if (!incr_ctr) continue;
1508
 
1509
          if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript.  */
1510
            {
1511
              gcc_assert(vecsub[d]);
1512
 
1513
              if (!gfc_constructor_next (vecsub[d]))
1514
                vecsub[d] = gfc_constructor_first (ref->u.ar.start[d]->value.constructor);
1515
              else
1516
                {
1517
                  vecsub[d] = gfc_constructor_next (vecsub[d]);
1518
                  incr_ctr = false;
1519
                }
1520
              mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1521
            }
1522
          else
1523
            {
1524
              mpz_add (ctr[d], ctr[d], stride[d]);
1525
 
1526
              if (mpz_cmp_ui (stride[d], 0) > 0
1527
                  ? mpz_cmp (ctr[d], end[d]) > 0
1528
                  : mpz_cmp (ctr[d], end[d]) < 0)
1529
                mpz_set (ctr[d], start[d]);
1530
              else
1531
                incr_ctr = false;
1532
            }
1533
        }
1534
 
1535
      limit = mpz_get_ui (ptr);
1536
      if (limit >= gfc_option.flag_max_array_constructor)
1537
        {
1538
          gfc_error ("The number of elements in the array constructor "
1539
                     "at %L requires an increase of the allowed %d "
1540
                     "upper limit.   See -fmax-array-constructor "
1541
                     "option", &expr->where,
1542
                     gfc_option.flag_max_array_constructor);
1543
          return FAILURE;
1544
        }
1545
 
1546
      cons = gfc_constructor_lookup (base, limit);
1547
      gcc_assert (cons);
1548
      gfc_constructor_append_expr (&expr->value.constructor,
1549
                                   gfc_copy_expr (cons->expr), NULL);
1550
    }
1551
 
1552
  mpz_clear (ptr);
1553
 
1554
cleanup:
1555
 
1556
  mpz_clear (delta_mpz);
1557
  mpz_clear (tmp_mpz);
1558
  mpz_clear (nelts);
1559
  for (d = 0; d < rank; d++)
1560
    {
1561
      mpz_clear (delta[d]);
1562
      mpz_clear (start[d]);
1563
      mpz_clear (end[d]);
1564
      mpz_clear (ctr[d]);
1565
      mpz_clear (stride[d]);
1566
    }
1567
  gfc_constructor_free (base);
1568
  return t;
1569
}
1570
 
1571
/* Pull a substring out of an expression.  */
1572
 
1573
static gfc_try
1574
find_substring_ref (gfc_expr *p, gfc_expr **newp)
1575
{
1576
  int end;
1577
  int start;
1578
  int length;
1579
  gfc_char_t *chr;
1580
 
1581
  if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1582
      || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1583
    return FAILURE;
1584
 
1585
  *newp = gfc_copy_expr (p);
1586
  free ((*newp)->value.character.string);
1587
 
1588
  end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1589
  start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
1590
  length = end - start + 1;
1591
 
1592
  chr = (*newp)->value.character.string = gfc_get_wide_string (length + 1);
1593
  (*newp)->value.character.length = length;
1594
  memcpy (chr, &p->value.character.string[start - 1],
1595
          length * sizeof (gfc_char_t));
1596
  chr[length] = '\0';
1597
  return SUCCESS;
1598
}
1599
 
1600
 
1601
 
1602
/* Simplify a subobject reference of a constructor.  This occurs when
1603
   parameter variable values are substituted.  */
1604
 
1605
static gfc_try
1606
simplify_const_ref (gfc_expr *p)
1607
{
1608
  gfc_constructor *cons, *c;
1609
  gfc_expr *newp;
1610
  gfc_ref *last_ref;
1611
 
1612
  while (p->ref)
1613
    {
1614
      switch (p->ref->type)
1615
        {
1616
        case REF_ARRAY:
1617
          switch (p->ref->u.ar.type)
1618
            {
1619
            case AR_ELEMENT:
1620
              /* <type/kind spec>, parameter :: x(<int>) = scalar_expr
1621
                 will generate this.  */
1622
              if (p->expr_type != EXPR_ARRAY)
1623
                {
1624
                  remove_subobject_ref (p, NULL);
1625
                  break;
1626
                }
1627
              if (find_array_element (p->value.constructor, &p->ref->u.ar,
1628
                                      &cons) == FAILURE)
1629
                return FAILURE;
1630
 
1631
              if (!cons)
1632
                return SUCCESS;
1633
 
1634
              remove_subobject_ref (p, cons);
1635
              break;
1636
 
1637
            case AR_SECTION:
1638
              if (find_array_section (p, p->ref) == FAILURE)
1639
                return FAILURE;
1640
              p->ref->u.ar.type = AR_FULL;
1641
 
1642
            /* Fall through.  */
1643
 
1644
            case AR_FULL:
1645
              if (p->ref->next != NULL
1646
                  && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1647
                {
1648
                  for (c = gfc_constructor_first (p->value.constructor);
1649
                       c; c = gfc_constructor_next (c))
1650
                    {
1651
                      c->expr->ref = gfc_copy_ref (p->ref->next);
1652
                      if (simplify_const_ref (c->expr) == FAILURE)
1653
                        return FAILURE;
1654
                    }
1655
 
1656
                  if (p->ts.type == BT_DERIVED
1657
                        && p->ref->next
1658
                        && (c = gfc_constructor_first (p->value.constructor)))
1659
                    {
1660
                      /* There may have been component references.  */
1661
                      p->ts = c->expr->ts;
1662
                    }
1663
 
1664
                  last_ref = p->ref;
1665
                  for (; last_ref->next; last_ref = last_ref->next) {};
1666
 
1667
                  if (p->ts.type == BT_CHARACTER
1668
                        && last_ref->type == REF_SUBSTRING)
1669
                    {
1670
                      /* If this is a CHARACTER array and we possibly took
1671
                         a substring out of it, update the type-spec's
1672
                         character length according to the first element
1673
                         (as all should have the same length).  */
1674
                      int string_len;
1675
                      if ((c = gfc_constructor_first (p->value.constructor)))
1676
                        {
1677
                          const gfc_expr* first = c->expr;
1678
                          gcc_assert (first->expr_type == EXPR_CONSTANT);
1679
                          gcc_assert (first->ts.type == BT_CHARACTER);
1680
                          string_len = first->value.character.length;
1681
                        }
1682
                      else
1683
                        string_len = 0;
1684
 
1685
                      if (!p->ts.u.cl)
1686
                        p->ts.u.cl = gfc_new_charlen (p->symtree->n.sym->ns,
1687
                                                      NULL);
1688
                      else
1689
                        gfc_free_expr (p->ts.u.cl->length);
1690
 
1691
                      p->ts.u.cl->length
1692
                        = gfc_get_int_expr (gfc_default_integer_kind,
1693
                                            NULL, string_len);
1694
                    }
1695
                }
1696
              gfc_free_ref_list (p->ref);
1697
              p->ref = NULL;
1698
              break;
1699
 
1700
            default:
1701
              return SUCCESS;
1702
            }
1703
 
1704
          break;
1705
 
1706
        case REF_COMPONENT:
1707
          cons = find_component_ref (p->value.constructor, p->ref);
1708
          remove_subobject_ref (p, cons);
1709
          break;
1710
 
1711
        case REF_SUBSTRING:
1712
          if (find_substring_ref (p, &newp) == FAILURE)
1713
            return FAILURE;
1714
 
1715
          gfc_replace_expr (p, newp);
1716
          gfc_free_ref_list (p->ref);
1717
          p->ref = NULL;
1718
          break;
1719
        }
1720
    }
1721
 
1722
  return SUCCESS;
1723
}
1724
 
1725
 
1726
/* Simplify a chain of references.  */
1727
 
1728
static gfc_try
1729
simplify_ref_chain (gfc_ref *ref, int type)
1730
{
1731
  int n;
1732
 
1733
  for (; ref; ref = ref->next)
1734
    {
1735
      switch (ref->type)
1736
        {
1737
        case REF_ARRAY:
1738
          for (n = 0; n < ref->u.ar.dimen; n++)
1739
            {
1740
              if (gfc_simplify_expr (ref->u.ar.start[n], type) == FAILURE)
1741
                return FAILURE;
1742
              if (gfc_simplify_expr (ref->u.ar.end[n], type) == FAILURE)
1743
                return FAILURE;
1744
              if (gfc_simplify_expr (ref->u.ar.stride[n], type) == FAILURE)
1745
                return FAILURE;
1746
            }
1747
          break;
1748
 
1749
        case REF_SUBSTRING:
1750
          if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1751
            return FAILURE;
1752
          if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1753
            return FAILURE;
1754
          break;
1755
 
1756
        default:
1757
          break;
1758
        }
1759
    }
1760
  return SUCCESS;
1761
}
1762
 
1763
 
1764
/* Try to substitute the value of a parameter variable.  */
1765
 
1766
static gfc_try
1767
simplify_parameter_variable (gfc_expr *p, int type)
1768
{
1769
  gfc_expr *e;
1770
  gfc_try t;
1771
 
1772
  e = gfc_copy_expr (p->symtree->n.sym->value);
1773
  if (e == NULL)
1774
    return FAILURE;
1775
 
1776
  e->rank = p->rank;
1777
 
1778
  /* Do not copy subobject refs for constant.  */
1779
  if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1780
    e->ref = gfc_copy_ref (p->ref);
1781
  t = gfc_simplify_expr (e, type);
1782
 
1783
  /* Only use the simplification if it eliminated all subobject references.  */
1784
  if (t == SUCCESS && !e->ref)
1785
    gfc_replace_expr (p, e);
1786
  else
1787
    gfc_free_expr (e);
1788
 
1789
  return t;
1790
}
1791
 
1792
/* Given an expression, simplify it by collapsing constant
1793
   expressions.  Most simplification takes place when the expression
1794
   tree is being constructed.  If an intrinsic function is simplified
1795
   at some point, we get called again to collapse the result against
1796
   other constants.
1797
 
1798
   We work by recursively simplifying expression nodes, simplifying
1799
   intrinsic functions where possible, which can lead to further
1800
   constant collapsing.  If an operator has constant operand(s), we
1801
   rip the expression apart, and rebuild it, hoping that it becomes
1802
   something simpler.
1803
 
1804
   The expression type is defined for:
1805
 
1806
     1   Simplifying array constructors -- will substitute
1807
         iterator values.
1808
   Returns FAILURE on error, SUCCESS otherwise.
1809
   NOTE: Will return SUCCESS even if the expression can not be simplified.  */
1810
 
1811
gfc_try
1812
gfc_simplify_expr (gfc_expr *p, int type)
1813
{
1814
  gfc_actual_arglist *ap;
1815
 
1816
  if (p == NULL)
1817
    return SUCCESS;
1818
 
1819
  switch (p->expr_type)
1820
    {
1821
    case EXPR_CONSTANT:
1822
    case EXPR_NULL:
1823
      break;
1824
 
1825
    case EXPR_FUNCTION:
1826
      for (ap = p->value.function.actual; ap; ap = ap->next)
1827
        if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1828
          return FAILURE;
1829
 
1830
      if (p->value.function.isym != NULL
1831
          && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1832
        return FAILURE;
1833
 
1834
      break;
1835
 
1836
    case EXPR_SUBSTRING:
1837
      if (simplify_ref_chain (p->ref, type) == FAILURE)
1838
        return FAILURE;
1839
 
1840
      if (gfc_is_constant_expr (p))
1841
        {
1842
          gfc_char_t *s;
1843
          int start, end;
1844
 
1845
          start = 0;
1846
          if (p->ref && p->ref->u.ss.start)
1847
            {
1848
              gfc_extract_int (p->ref->u.ss.start, &start);
1849
              start--;  /* Convert from one-based to zero-based.  */
1850
            }
1851
 
1852
          end = p->value.character.length;
1853
          if (p->ref && p->ref->u.ss.end)
1854
            gfc_extract_int (p->ref->u.ss.end, &end);
1855
 
1856
          if (end < start)
1857
            end = start;
1858
 
1859
          s = gfc_get_wide_string (end - start + 2);
1860
          memcpy (s, p->value.character.string + start,
1861
                  (end - start) * sizeof (gfc_char_t));
1862
          s[end - start + 1] = '\0';  /* TODO: C-style string.  */
1863
          free (p->value.character.string);
1864
          p->value.character.string = s;
1865
          p->value.character.length = end - start;
1866
          p->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1867
          p->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
1868
                                                 NULL,
1869
                                                 p->value.character.length);
1870
          gfc_free_ref_list (p->ref);
1871
          p->ref = NULL;
1872
          p->expr_type = EXPR_CONSTANT;
1873
        }
1874
      break;
1875
 
1876
    case EXPR_OP:
1877
      if (simplify_intrinsic_op (p, type) == FAILURE)
1878
        return FAILURE;
1879
      break;
1880
 
1881
    case EXPR_VARIABLE:
1882
      /* Only substitute array parameter variables if we are in an
1883
         initialization expression, or we want a subsection.  */
1884
      if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1885
          && (gfc_init_expr_flag || p->ref
1886
              || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1887
        {
1888
          if (simplify_parameter_variable (p, type) == FAILURE)
1889
            return FAILURE;
1890
          break;
1891
        }
1892
 
1893
      if (type == 1)
1894
        {
1895
          gfc_simplify_iterator_var (p);
1896
        }
1897
 
1898
      /* Simplify subcomponent references.  */
1899
      if (simplify_ref_chain (p->ref, type) == FAILURE)
1900
        return FAILURE;
1901
 
1902
      break;
1903
 
1904
    case EXPR_STRUCTURE:
1905
    case EXPR_ARRAY:
1906
      if (simplify_ref_chain (p->ref, type) == FAILURE)
1907
        return FAILURE;
1908
 
1909
      if (simplify_constructor (p->value.constructor, type) == FAILURE)
1910
        return FAILURE;
1911
 
1912
      if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1913
          && p->ref->u.ar.type == AR_FULL)
1914
          gfc_expand_constructor (p, false);
1915
 
1916
      if (simplify_const_ref (p) == FAILURE)
1917
        return FAILURE;
1918
 
1919
      break;
1920
 
1921
    case EXPR_COMPCALL:
1922
    case EXPR_PPC:
1923
      gcc_unreachable ();
1924
      break;
1925
    }
1926
 
1927
  return SUCCESS;
1928
}
1929
 
1930
 
1931
/* Returns the type of an expression with the exception that iterator
1932
   variables are automatically integers no matter what else they may
1933
   be declared as.  */
1934
 
1935
static bt
1936
et0 (gfc_expr *e)
1937
{
1938
  if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1939
    return BT_INTEGER;
1940
 
1941
  return e->ts.type;
1942
}
1943
 
1944
 
1945
/* Check an intrinsic arithmetic operation to see if it is consistent
1946
   with some type of expression.  */
1947
 
1948
static gfc_try check_init_expr (gfc_expr *);
1949
 
1950
 
1951
/* Scalarize an expression for an elemental intrinsic call.  */
1952
 
1953
static gfc_try
1954
scalarize_intrinsic_call (gfc_expr *e)
1955
{
1956
  gfc_actual_arglist *a, *b;
1957
  gfc_constructor_base ctor;
1958
  gfc_constructor *args[5];
1959
  gfc_constructor *ci, *new_ctor;
1960
  gfc_expr *expr, *old;
1961
  int n, i, rank[5], array_arg;
1962
 
1963
  /* Find which, if any, arguments are arrays.  Assume that the old
1964
     expression carries the type information and that the first arg
1965
     that is an array expression carries all the shape information.*/
1966
  n = array_arg = 0;
1967
  a = e->value.function.actual;
1968
  for (; a; a = a->next)
1969
    {
1970
      n++;
1971
      if (a->expr->expr_type != EXPR_ARRAY)
1972
        continue;
1973
      array_arg = n;
1974
      expr = gfc_copy_expr (a->expr);
1975
      break;
1976
    }
1977
 
1978
  if (!array_arg)
1979
    return FAILURE;
1980
 
1981
  old = gfc_copy_expr (e);
1982
 
1983
  gfc_constructor_free (expr->value.constructor);
1984
  expr->value.constructor = NULL;
1985
  expr->ts = old->ts;
1986
  expr->where = old->where;
1987
  expr->expr_type = EXPR_ARRAY;
1988
 
1989
  /* Copy the array argument constructors into an array, with nulls
1990
     for the scalars.  */
1991
  n = 0;
1992
  a = old->value.function.actual;
1993
  for (; a; a = a->next)
1994
    {
1995
      /* Check that this is OK for an initialization expression.  */
1996
      if (a->expr && check_init_expr (a->expr) == FAILURE)
1997
        goto cleanup;
1998
 
1999
      rank[n] = 0;
2000
      if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
2001
        {
2002
          rank[n] = a->expr->rank;
2003
          ctor = a->expr->symtree->n.sym->value->value.constructor;
2004
          args[n] = gfc_constructor_first (ctor);
2005
        }
2006
      else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
2007
        {
2008
          if (a->expr->rank)
2009
            rank[n] = a->expr->rank;
2010
          else
2011
            rank[n] = 1;
2012
          ctor = gfc_constructor_copy (a->expr->value.constructor);
2013
          args[n] = gfc_constructor_first (ctor);
2014
        }
2015
      else
2016
        args[n] = NULL;
2017
 
2018
      n++;
2019
    }
2020
 
2021
 
2022
  /* Using the array argument as the master, step through the array
2023
     calling the function for each element and advancing the array
2024
     constructors together.  */
2025
  for (ci = args[array_arg - 1]; ci; ci = gfc_constructor_next (ci))
2026
    {
2027
      new_ctor = gfc_constructor_append_expr (&expr->value.constructor,
2028
                                              gfc_copy_expr (old), NULL);
2029
 
2030
      gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
2031
      a = NULL;
2032
      b = old->value.function.actual;
2033
      for (i = 0; i < n; i++)
2034
        {
2035
          if (a == NULL)
2036
            new_ctor->expr->value.function.actual
2037
                        = a = gfc_get_actual_arglist ();
2038
          else
2039
            {
2040
              a->next = gfc_get_actual_arglist ();
2041
              a = a->next;
2042
            }
2043
 
2044
          if (args[i])
2045
            a->expr = gfc_copy_expr (args[i]->expr);
2046
          else
2047
            a->expr = gfc_copy_expr (b->expr);
2048
 
2049
          b = b->next;
2050
        }
2051
 
2052
      /* Simplify the function calls.  If the simplification fails, the
2053
         error will be flagged up down-stream or the library will deal
2054
         with it.  */
2055
      gfc_simplify_expr (new_ctor->expr, 0);
2056
 
2057
      for (i = 0; i < n; i++)
2058
        if (args[i])
2059
          args[i] = gfc_constructor_next (args[i]);
2060
 
2061
      for (i = 1; i < n; i++)
2062
        if (rank[i] && ((args[i] != NULL && args[array_arg - 1] == NULL)
2063
                        || (args[i] == NULL && args[array_arg - 1] != NULL)))
2064
          goto compliance;
2065
    }
2066
 
2067
  free_expr0 (e);
2068
  *e = *expr;
2069
  gfc_free_expr (old);
2070
  return SUCCESS;
2071
 
2072
compliance:
2073
  gfc_error_now ("elemental function arguments at %C are not compliant");
2074
 
2075
cleanup:
2076
  gfc_free_expr (expr);
2077
  gfc_free_expr (old);
2078
  return FAILURE;
2079
}
2080
 
2081
 
2082
static gfc_try
2083
check_intrinsic_op (gfc_expr *e, gfc_try (*check_function) (gfc_expr *))
2084
{
2085
  gfc_expr *op1 = e->value.op.op1;
2086
  gfc_expr *op2 = e->value.op.op2;
2087
 
2088
  if ((*check_function) (op1) == FAILURE)
2089
    return FAILURE;
2090
 
2091
  switch (e->value.op.op)
2092
    {
2093
    case INTRINSIC_UPLUS:
2094
    case INTRINSIC_UMINUS:
2095
      if (!numeric_type (et0 (op1)))
2096
        goto not_numeric;
2097
      break;
2098
 
2099
    case INTRINSIC_EQ:
2100
    case INTRINSIC_EQ_OS:
2101
    case INTRINSIC_NE:
2102
    case INTRINSIC_NE_OS:
2103
    case INTRINSIC_GT:
2104
    case INTRINSIC_GT_OS:
2105
    case INTRINSIC_GE:
2106
    case INTRINSIC_GE_OS:
2107
    case INTRINSIC_LT:
2108
    case INTRINSIC_LT_OS:
2109
    case INTRINSIC_LE:
2110
    case INTRINSIC_LE_OS:
2111
      if ((*check_function) (op2) == FAILURE)
2112
        return FAILURE;
2113
 
2114
      if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
2115
          && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
2116
        {
2117
          gfc_error ("Numeric or CHARACTER operands are required in "
2118
                     "expression at %L", &e->where);
2119
         return FAILURE;
2120
        }
2121
      break;
2122
 
2123
    case INTRINSIC_PLUS:
2124
    case INTRINSIC_MINUS:
2125
    case INTRINSIC_TIMES:
2126
    case INTRINSIC_DIVIDE:
2127
    case INTRINSIC_POWER:
2128
      if ((*check_function) (op2) == FAILURE)
2129
        return FAILURE;
2130
 
2131
      if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
2132
        goto not_numeric;
2133
 
2134
      break;
2135
 
2136
    case INTRINSIC_CONCAT:
2137
      if ((*check_function) (op2) == FAILURE)
2138
        return FAILURE;
2139
 
2140
      if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
2141
        {
2142
          gfc_error ("Concatenation operator in expression at %L "
2143
                     "must have two CHARACTER operands", &op1->where);
2144
          return FAILURE;
2145
        }
2146
 
2147
      if (op1->ts.kind != op2->ts.kind)
2148
        {
2149
          gfc_error ("Concat operator at %L must concatenate strings of the "
2150
                     "same kind", &e->where);
2151
          return FAILURE;
2152
        }
2153
 
2154
      break;
2155
 
2156
    case INTRINSIC_NOT:
2157
      if (et0 (op1) != BT_LOGICAL)
2158
        {
2159
          gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
2160
                     "operand", &op1->where);
2161
          return FAILURE;
2162
        }
2163
 
2164
      break;
2165
 
2166
    case INTRINSIC_AND:
2167
    case INTRINSIC_OR:
2168
    case INTRINSIC_EQV:
2169
    case INTRINSIC_NEQV:
2170
      if ((*check_function) (op2) == FAILURE)
2171
        return FAILURE;
2172
 
2173
      if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
2174
        {
2175
          gfc_error ("LOGICAL operands are required in expression at %L",
2176
                     &e->where);
2177
          return FAILURE;
2178
        }
2179
 
2180
      break;
2181
 
2182
    case INTRINSIC_PARENTHESES:
2183
      break;
2184
 
2185
    default:
2186
      gfc_error ("Only intrinsic operators can be used in expression at %L",
2187
                 &e->where);
2188
      return FAILURE;
2189
    }
2190
 
2191
  return SUCCESS;
2192
 
2193
not_numeric:
2194
  gfc_error ("Numeric operands are required in expression at %L", &e->where);
2195
 
2196
  return FAILURE;
2197
}
2198
 
2199
/* F2003, 7.1.7 (3): In init expression, allocatable components
2200
   must not be data-initialized.  */
2201
static gfc_try
2202
check_alloc_comp_init (gfc_expr *e)
2203
{
2204
  gfc_component *comp;
2205
  gfc_constructor *ctor;
2206
 
2207
  gcc_assert (e->expr_type == EXPR_STRUCTURE);
2208
  gcc_assert (e->ts.type == BT_DERIVED);
2209
 
2210
  for (comp = e->ts.u.derived->components,
2211
       ctor = gfc_constructor_first (e->value.constructor);
2212
       comp; comp = comp->next, ctor = gfc_constructor_next (ctor))
2213
    {
2214
      if (comp->attr.allocatable
2215
          && ctor->expr->expr_type != EXPR_NULL)
2216
        {
2217
          gfc_error("Invalid initialization expression for ALLOCATABLE "
2218
                    "component '%s' in structure constructor at %L",
2219
                    comp->name, &ctor->expr->where);
2220
          return FAILURE;
2221
        }
2222
    }
2223
 
2224
  return SUCCESS;
2225
}
2226
 
2227
static match
2228
check_init_expr_arguments (gfc_expr *e)
2229
{
2230
  gfc_actual_arglist *ap;
2231
 
2232
  for (ap = e->value.function.actual; ap; ap = ap->next)
2233
    if (check_init_expr (ap->expr) == FAILURE)
2234
      return MATCH_ERROR;
2235
 
2236
  return MATCH_YES;
2237
}
2238
 
2239
static gfc_try check_restricted (gfc_expr *);
2240
 
2241
/* F95, 7.1.6.1, Initialization expressions, (7)
2242
   F2003, 7.1.7 Initialization expression, (8)  */
2243
 
2244
static match
2245
check_inquiry (gfc_expr *e, int not_restricted)
2246
{
2247
  const char *name;
2248
  const char *const *functions;
2249
 
2250
  static const char *const inquiry_func_f95[] = {
2251
    "lbound", "shape", "size", "ubound",
2252
    "bit_size", "len", "kind",
2253
    "digits", "epsilon", "huge", "maxexponent", "minexponent",
2254
    "precision", "radix", "range", "tiny",
2255
    NULL
2256
  };
2257
 
2258
  static const char *const inquiry_func_f2003[] = {
2259
    "lbound", "shape", "size", "ubound",
2260
    "bit_size", "len", "kind",
2261
    "digits", "epsilon", "huge", "maxexponent", "minexponent",
2262
    "precision", "radix", "range", "tiny",
2263
    "new_line", NULL
2264
  };
2265
 
2266
  int i;
2267
  gfc_actual_arglist *ap;
2268
 
2269
  if (!e->value.function.isym
2270
      || !e->value.function.isym->inquiry)
2271
    return MATCH_NO;
2272
 
2273
  /* An undeclared parameter will get us here (PR25018).  */
2274
  if (e->symtree == NULL)
2275
    return MATCH_NO;
2276
 
2277
  name = e->symtree->n.sym->name;
2278
 
2279
  functions = (gfc_option.warn_std & GFC_STD_F2003)
2280
                ? inquiry_func_f2003 : inquiry_func_f95;
2281
 
2282
  for (i = 0; functions[i]; i++)
2283
    if (strcmp (functions[i], name) == 0)
2284
      break;
2285
 
2286
  if (functions[i] == NULL)
2287
    return MATCH_ERROR;
2288
 
2289
  /* At this point we have an inquiry function with a variable argument.  The
2290
     type of the variable might be undefined, but we need it now, because the
2291
     arguments of these functions are not allowed to be undefined.  */
2292
 
2293
  for (ap = e->value.function.actual; ap; ap = ap->next)
2294
    {
2295
      if (!ap->expr)
2296
        continue;
2297
 
2298
      if (ap->expr->ts.type == BT_UNKNOWN)
2299
        {
2300
          if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2301
              && gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns)
2302
              == FAILURE)
2303
            return MATCH_NO;
2304
 
2305
          ap->expr->ts = ap->expr->symtree->n.sym->ts;
2306
        }
2307
 
2308
        /* Assumed character length will not reduce to a constant expression
2309
           with LEN, as required by the standard.  */
2310
        if (i == 5 && not_restricted
2311
            && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2312
            && (ap->expr->symtree->n.sym->ts.u.cl->length == NULL
2313
                || ap->expr->symtree->n.sym->ts.deferred))
2314
          {
2315
            gfc_error ("Assumed or deferred character length variable '%s' "
2316
                        " in constant expression at %L",
2317
                        ap->expr->symtree->n.sym->name,
2318
                        &ap->expr->where);
2319
              return MATCH_ERROR;
2320
          }
2321
        else if (not_restricted && check_init_expr (ap->expr) == FAILURE)
2322
          return MATCH_ERROR;
2323
 
2324
        if (not_restricted == 0
2325
              && ap->expr->expr_type != EXPR_VARIABLE
2326
              && check_restricted (ap->expr) == FAILURE)
2327
          return MATCH_ERROR;
2328
 
2329
        if (not_restricted == 0
2330
            && ap->expr->expr_type == EXPR_VARIABLE
2331
            && ap->expr->symtree->n.sym->attr.dummy
2332
            && ap->expr->symtree->n.sym->attr.optional)
2333
          return MATCH_NO;
2334
    }
2335
 
2336
  return MATCH_YES;
2337
}
2338
 
2339
 
2340
/* F95, 7.1.6.1, Initialization expressions, (5)
2341
   F2003, 7.1.7 Initialization expression, (5)  */
2342
 
2343
static match
2344
check_transformational (gfc_expr *e)
2345
{
2346
  static const char * const trans_func_f95[] = {
2347
    "repeat", "reshape", "selected_int_kind",
2348
    "selected_real_kind", "transfer", "trim", NULL
2349
  };
2350
 
2351
  static const char * const trans_func_f2003[] =  {
2352
    "all", "any", "count", "dot_product", "matmul", "null", "pack",
2353
    "product", "repeat", "reshape", "selected_char_kind", "selected_int_kind",
2354
    "selected_real_kind", "spread", "sum", "transfer", "transpose",
2355
    "trim", "unpack", NULL
2356
  };
2357
 
2358
  int i;
2359
  const char *name;
2360
  const char *const *functions;
2361
 
2362
  if (!e->value.function.isym
2363
      || !e->value.function.isym->transformational)
2364
    return MATCH_NO;
2365
 
2366
  name = e->symtree->n.sym->name;
2367
 
2368
  functions = (gfc_option.allow_std & GFC_STD_F2003)
2369
                ? trans_func_f2003 : trans_func_f95;
2370
 
2371
  /* NULL() is dealt with below.  */
2372
  if (strcmp ("null", name) == 0)
2373
    return MATCH_NO;
2374
 
2375
  for (i = 0; functions[i]; i++)
2376
    if (strcmp (functions[i], name) == 0)
2377
       break;
2378
 
2379
  if (functions[i] == NULL)
2380
    {
2381
      gfc_error("transformational intrinsic '%s' at %L is not permitted "
2382
                "in an initialization expression", name, &e->where);
2383
      return MATCH_ERROR;
2384
    }
2385
 
2386
  return check_init_expr_arguments (e);
2387
}
2388
 
2389
 
2390
/* F95, 7.1.6.1, Initialization expressions, (6)
2391
   F2003, 7.1.7 Initialization expression, (6)  */
2392
 
2393
static match
2394
check_null (gfc_expr *e)
2395
{
2396
  if (strcmp ("null", e->symtree->n.sym->name) != 0)
2397
    return MATCH_NO;
2398
 
2399
  return check_init_expr_arguments (e);
2400
}
2401
 
2402
 
2403
static match
2404
check_elemental (gfc_expr *e)
2405
{
2406
  if (!e->value.function.isym
2407
      || !e->value.function.isym->elemental)
2408
    return MATCH_NO;
2409
 
2410
  if (e->ts.type != BT_INTEGER
2411
      && e->ts.type != BT_CHARACTER
2412
      && gfc_notify_std (GFC_STD_F2003, "Extension: Evaluation of "
2413
                        "nonstandard initialization expression at %L",
2414
                        &e->where) == FAILURE)
2415
    return MATCH_ERROR;
2416
 
2417
  return check_init_expr_arguments (e);
2418
}
2419
 
2420
 
2421
static match
2422
check_conversion (gfc_expr *e)
2423
{
2424
  if (!e->value.function.isym
2425
      || !e->value.function.isym->conversion)
2426
    return MATCH_NO;
2427
 
2428
  return check_init_expr_arguments (e);
2429
}
2430
 
2431
 
2432
/* Verify that an expression is an initialization expression.  A side
2433
   effect is that the expression tree is reduced to a single constant
2434
   node if all goes well.  This would normally happen when the
2435
   expression is constructed but function references are assumed to be
2436
   intrinsics in the context of initialization expressions.  If
2437
   FAILURE is returned an error message has been generated.  */
2438
 
2439
static gfc_try
2440
check_init_expr (gfc_expr *e)
2441
{
2442
  match m;
2443
  gfc_try t;
2444
 
2445
  if (e == NULL)
2446
    return SUCCESS;
2447
 
2448
  switch (e->expr_type)
2449
    {
2450
    case EXPR_OP:
2451
      t = check_intrinsic_op (e, check_init_expr);
2452
      if (t == SUCCESS)
2453
        t = gfc_simplify_expr (e, 0);
2454
 
2455
      break;
2456
 
2457
    case EXPR_FUNCTION:
2458
      t = FAILURE;
2459
 
2460
      {
2461
        gfc_intrinsic_sym* isym;
2462
        gfc_symbol* sym;
2463
 
2464
        sym = e->symtree->n.sym;
2465
        if (!gfc_is_intrinsic (sym, 0, e->where)
2466
            || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
2467
          {
2468
            gfc_error ("Function '%s' in initialization expression at %L "
2469
                       "must be an intrinsic function",
2470
                       e->symtree->n.sym->name, &e->where);
2471
            break;
2472
          }
2473
 
2474
        if ((m = check_conversion (e)) == MATCH_NO
2475
            && (m = check_inquiry (e, 1)) == MATCH_NO
2476
            && (m = check_null (e)) == MATCH_NO
2477
            && (m = check_transformational (e)) == MATCH_NO
2478
            && (m = check_elemental (e)) == MATCH_NO)
2479
          {
2480
            gfc_error ("Intrinsic function '%s' at %L is not permitted "
2481
                       "in an initialization expression",
2482
                       e->symtree->n.sym->name, &e->where);
2483
            m = MATCH_ERROR;
2484
          }
2485
 
2486
        if (m == MATCH_ERROR)
2487
          return FAILURE;
2488
 
2489
        /* Try to scalarize an elemental intrinsic function that has an
2490
           array argument.  */
2491
        isym = gfc_find_function (e->symtree->n.sym->name);
2492
        if (isym && isym->elemental
2493
            && (t = scalarize_intrinsic_call (e)) == SUCCESS)
2494
          break;
2495
      }
2496
 
2497
      if (m == MATCH_YES)
2498
        t = gfc_simplify_expr (e, 0);
2499
 
2500
      break;
2501
 
2502
    case EXPR_VARIABLE:
2503
      t = SUCCESS;
2504
 
2505
      if (gfc_check_iter_variable (e) == SUCCESS)
2506
        break;
2507
 
2508
      if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2509
        {
2510
          /* A PARAMETER shall not be used to define itself, i.e.
2511
                REAL, PARAMETER :: x = transfer(0, x)
2512
             is invalid.  */
2513
          if (!e->symtree->n.sym->value)
2514
            {
2515
              gfc_error("PARAMETER '%s' is used at %L before its definition "
2516
                        "is complete", e->symtree->n.sym->name, &e->where);
2517
              t = FAILURE;
2518
            }
2519
          else
2520
            t = simplify_parameter_variable (e, 0);
2521
 
2522
          break;
2523
        }
2524
 
2525
      if (gfc_in_match_data ())
2526
        break;
2527
 
2528
      t = FAILURE;
2529
 
2530
      if (e->symtree->n.sym->as)
2531
        {
2532
          switch (e->symtree->n.sym->as->type)
2533
            {
2534
              case AS_ASSUMED_SIZE:
2535
                gfc_error ("Assumed size array '%s' at %L is not permitted "
2536
                           "in an initialization expression",
2537
                           e->symtree->n.sym->name, &e->where);
2538
                break;
2539
 
2540
              case AS_ASSUMED_SHAPE:
2541
                gfc_error ("Assumed shape array '%s' at %L is not permitted "
2542
                           "in an initialization expression",
2543
                           e->symtree->n.sym->name, &e->where);
2544
                break;
2545
 
2546
              case AS_DEFERRED:
2547
                gfc_error ("Deferred array '%s' at %L is not permitted "
2548
                           "in an initialization expression",
2549
                           e->symtree->n.sym->name, &e->where);
2550
                break;
2551
 
2552
              case AS_EXPLICIT:
2553
                gfc_error ("Array '%s' at %L is a variable, which does "
2554
                           "not reduce to a constant expression",
2555
                           e->symtree->n.sym->name, &e->where);
2556
                break;
2557
 
2558
              default:
2559
                gcc_unreachable();
2560
          }
2561
        }
2562
      else
2563
        gfc_error ("Parameter '%s' at %L has not been declared or is "
2564
                   "a variable, which does not reduce to a constant "
2565
                   "expression", e->symtree->n.sym->name, &e->where);
2566
 
2567
      break;
2568
 
2569
    case EXPR_CONSTANT:
2570
    case EXPR_NULL:
2571
      t = SUCCESS;
2572
      break;
2573
 
2574
    case EXPR_SUBSTRING:
2575
      t = check_init_expr (e->ref->u.ss.start);
2576
      if (t == FAILURE)
2577
        break;
2578
 
2579
      t = check_init_expr (e->ref->u.ss.end);
2580
      if (t == SUCCESS)
2581
        t = gfc_simplify_expr (e, 0);
2582
 
2583
      break;
2584
 
2585
    case EXPR_STRUCTURE:
2586
      t = e->ts.is_iso_c ? SUCCESS : FAILURE;
2587
      if (t == SUCCESS)
2588
        break;
2589
 
2590
      t = check_alloc_comp_init (e);
2591
      if (t == FAILURE)
2592
        break;
2593
 
2594
      t = gfc_check_constructor (e, check_init_expr);
2595
      if (t == FAILURE)
2596
        break;
2597
 
2598
      break;
2599
 
2600
    case EXPR_ARRAY:
2601
      t = gfc_check_constructor (e, check_init_expr);
2602
      if (t == FAILURE)
2603
        break;
2604
 
2605
      t = gfc_expand_constructor (e, true);
2606
      if (t == FAILURE)
2607
        break;
2608
 
2609
      t = gfc_check_constructor_type (e);
2610
      break;
2611
 
2612
    default:
2613
      gfc_internal_error ("check_init_expr(): Unknown expression type");
2614
    }
2615
 
2616
  return t;
2617
}
2618
 
2619
/* Reduces a general expression to an initialization expression (a constant).
2620
   This used to be part of gfc_match_init_expr.
2621
   Note that this function doesn't free the given expression on FAILURE.  */
2622
 
2623
gfc_try
2624
gfc_reduce_init_expr (gfc_expr *expr)
2625
{
2626
  gfc_try t;
2627
 
2628
  gfc_init_expr_flag = true;
2629
  t = gfc_resolve_expr (expr);
2630
  if (t == SUCCESS)
2631
    t = check_init_expr (expr);
2632
  gfc_init_expr_flag = false;
2633
 
2634
  if (t == FAILURE)
2635
    return FAILURE;
2636
 
2637
  if (expr->expr_type == EXPR_ARRAY)
2638
    {
2639
      if (gfc_check_constructor_type (expr) == FAILURE)
2640
        return FAILURE;
2641
      if (gfc_expand_constructor (expr, true) == FAILURE)
2642
        return FAILURE;
2643
    }
2644
 
2645
  return SUCCESS;
2646
}
2647
 
2648
 
2649
/* Match an initialization expression.  We work by first matching an
2650
   expression, then reducing it to a constant.  */
2651
 
2652
match
2653
gfc_match_init_expr (gfc_expr **result)
2654
{
2655
  gfc_expr *expr;
2656
  match m;
2657
  gfc_try t;
2658
 
2659
  expr = NULL;
2660
 
2661
  gfc_init_expr_flag = true;
2662
 
2663
  m = gfc_match_expr (&expr);
2664
  if (m != MATCH_YES)
2665
    {
2666
      gfc_init_expr_flag = false;
2667
      return m;
2668
    }
2669
 
2670
  t = gfc_reduce_init_expr (expr);
2671
  if (t != SUCCESS)
2672
    {
2673
      gfc_free_expr (expr);
2674
      gfc_init_expr_flag = false;
2675
      return MATCH_ERROR;
2676
    }
2677
 
2678
  *result = expr;
2679
  gfc_init_expr_flag = false;
2680
 
2681
  return MATCH_YES;
2682
}
2683
 
2684
 
2685
/* Given an actual argument list, test to see that each argument is a
2686
   restricted expression and optionally if the expression type is
2687
   integer or character.  */
2688
 
2689
static gfc_try
2690
restricted_args (gfc_actual_arglist *a)
2691
{
2692
  for (; a; a = a->next)
2693
    {
2694
      if (check_restricted (a->expr) == FAILURE)
2695
        return FAILURE;
2696
    }
2697
 
2698
  return SUCCESS;
2699
}
2700
 
2701
 
2702
/************* Restricted/specification expressions *************/
2703
 
2704
 
2705
/* Make sure a non-intrinsic function is a specification function.  */
2706
 
2707
static gfc_try
2708
external_spec_function (gfc_expr *e)
2709
{
2710
  gfc_symbol *f;
2711
 
2712
  f = e->value.function.esym;
2713
 
2714
  if (f->attr.proc == PROC_ST_FUNCTION)
2715
    {
2716
      gfc_error ("Specification function '%s' at %L cannot be a statement "
2717
                 "function", f->name, &e->where);
2718
      return FAILURE;
2719
    }
2720
 
2721
  if (f->attr.proc == PROC_INTERNAL)
2722
    {
2723
      gfc_error ("Specification function '%s' at %L cannot be an internal "
2724
                 "function", f->name, &e->where);
2725
      return FAILURE;
2726
    }
2727
 
2728
  if (!f->attr.pure && !f->attr.elemental)
2729
    {
2730
      gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2731
                 &e->where);
2732
      return FAILURE;
2733
    }
2734
 
2735
  if (f->attr.recursive)
2736
    {
2737
      gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2738
                 f->name, &e->where);
2739
      return FAILURE;
2740
    }
2741
 
2742
  return restricted_args (e->value.function.actual);
2743
}
2744
 
2745
 
2746
/* Check to see that a function reference to an intrinsic is a
2747
   restricted expression.  */
2748
 
2749
static gfc_try
2750
restricted_intrinsic (gfc_expr *e)
2751
{
2752
  /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
2753
  if (check_inquiry (e, 0) == MATCH_YES)
2754
    return SUCCESS;
2755
 
2756
  return restricted_args (e->value.function.actual);
2757
}
2758
 
2759
 
2760
/* Check the expressions of an actual arglist.  Used by check_restricted.  */
2761
 
2762
static gfc_try
2763
check_arglist (gfc_actual_arglist* arg, gfc_try (*checker) (gfc_expr*))
2764
{
2765
  for (; arg; arg = arg->next)
2766
    if (checker (arg->expr) == FAILURE)
2767
      return FAILURE;
2768
 
2769
  return SUCCESS;
2770
}
2771
 
2772
 
2773
/* Check the subscription expressions of a reference chain with a checking
2774
   function; used by check_restricted.  */
2775
 
2776
static gfc_try
2777
check_references (gfc_ref* ref, gfc_try (*checker) (gfc_expr*))
2778
{
2779
  int dim;
2780
 
2781
  if (!ref)
2782
    return SUCCESS;
2783
 
2784
  switch (ref->type)
2785
    {
2786
    case REF_ARRAY:
2787
      for (dim = 0; dim != ref->u.ar.dimen; ++dim)
2788
        {
2789
          if (checker (ref->u.ar.start[dim]) == FAILURE)
2790
            return FAILURE;
2791
          if (checker (ref->u.ar.end[dim]) == FAILURE)
2792
            return FAILURE;
2793
          if (checker (ref->u.ar.stride[dim]) == FAILURE)
2794
            return FAILURE;
2795
        }
2796
      break;
2797
 
2798
    case REF_COMPONENT:
2799
      /* Nothing needed, just proceed to next reference.  */
2800
      break;
2801
 
2802
    case REF_SUBSTRING:
2803
      if (checker (ref->u.ss.start) == FAILURE)
2804
        return FAILURE;
2805
      if (checker (ref->u.ss.end) == FAILURE)
2806
        return FAILURE;
2807
      break;
2808
 
2809
    default:
2810
      gcc_unreachable ();
2811
      break;
2812
    }
2813
 
2814
  return check_references (ref->next, checker);
2815
}
2816
 
2817
 
2818
/* Verify that an expression is a restricted expression.  Like its
2819
   cousin check_init_expr(), an error message is generated if we
2820
   return FAILURE.  */
2821
 
2822
static gfc_try
2823
check_restricted (gfc_expr *e)
2824
{
2825
  gfc_symbol* sym;
2826
  gfc_try t;
2827
 
2828
  if (e == NULL)
2829
    return SUCCESS;
2830
 
2831
  switch (e->expr_type)
2832
    {
2833
    case EXPR_OP:
2834
      t = check_intrinsic_op (e, check_restricted);
2835
      if (t == SUCCESS)
2836
        t = gfc_simplify_expr (e, 0);
2837
 
2838
      break;
2839
 
2840
    case EXPR_FUNCTION:
2841
      if (e->value.function.esym)
2842
        {
2843
          t = check_arglist (e->value.function.actual, &check_restricted);
2844
          if (t == SUCCESS)
2845
            t = external_spec_function (e);
2846
        }
2847
      else
2848
        {
2849
          if (e->value.function.isym && e->value.function.isym->inquiry)
2850
            t = SUCCESS;
2851
          else
2852
            t = check_arglist (e->value.function.actual, &check_restricted);
2853
 
2854
          if (t == SUCCESS)
2855
            t = restricted_intrinsic (e);
2856
        }
2857
      break;
2858
 
2859
    case EXPR_VARIABLE:
2860
      sym = e->symtree->n.sym;
2861
      t = FAILURE;
2862
 
2863
      /* If a dummy argument appears in a context that is valid for a
2864
         restricted expression in an elemental procedure, it will have
2865
         already been simplified away once we get here.  Therefore we
2866
         don't need to jump through hoops to distinguish valid from
2867
         invalid cases.  */
2868
      if (sym->attr.dummy && sym->ns == gfc_current_ns
2869
          && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2870
        {
2871
          gfc_error ("Dummy argument '%s' not allowed in expression at %L",
2872
                     sym->name, &e->where);
2873
          break;
2874
        }
2875
 
2876
      if (sym->attr.optional)
2877
        {
2878
          gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2879
                     sym->name, &e->where);
2880
          break;
2881
        }
2882
 
2883
      if (sym->attr.intent == INTENT_OUT)
2884
        {
2885
          gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2886
                     sym->name, &e->where);
2887
          break;
2888
        }
2889
 
2890
      /* Check reference chain if any.  */
2891
      if (check_references (e->ref, &check_restricted) == FAILURE)
2892
        break;
2893
 
2894
      /* gfc_is_formal_arg broadcasts that a formal argument list is being
2895
         processed in resolve.c(resolve_formal_arglist).  This is done so
2896
         that host associated dummy array indices are accepted (PR23446).
2897
         This mechanism also does the same for the specification expressions
2898
         of array-valued functions.  */
2899
      if (e->error
2900
            || sym->attr.in_common
2901
            || sym->attr.use_assoc
2902
            || sym->attr.dummy
2903
            || sym->attr.implied_index
2904
            || sym->attr.flavor == FL_PARAMETER
2905
            || (sym->ns && sym->ns == gfc_current_ns->parent)
2906
            || (sym->ns && gfc_current_ns->parent
2907
                  && sym->ns == gfc_current_ns->parent->parent)
2908
            || (sym->ns->proc_name != NULL
2909
                  && sym->ns->proc_name->attr.flavor == FL_MODULE)
2910
            || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2911
        {
2912
          t = SUCCESS;
2913
          break;
2914
        }
2915
 
2916
      gfc_error ("Variable '%s' cannot appear in the expression at %L",
2917
                 sym->name, &e->where);
2918
      /* Prevent a repetition of the error.  */
2919
      e->error = 1;
2920
      break;
2921
 
2922
    case EXPR_NULL:
2923
    case EXPR_CONSTANT:
2924
      t = SUCCESS;
2925
      break;
2926
 
2927
    case EXPR_SUBSTRING:
2928
      t = gfc_specification_expr (e->ref->u.ss.start);
2929
      if (t == FAILURE)
2930
        break;
2931
 
2932
      t = gfc_specification_expr (e->ref->u.ss.end);
2933
      if (t == SUCCESS)
2934
        t = gfc_simplify_expr (e, 0);
2935
 
2936
      break;
2937
 
2938
    case EXPR_STRUCTURE:
2939
      t = gfc_check_constructor (e, check_restricted);
2940
      break;
2941
 
2942
    case EXPR_ARRAY:
2943
      t = gfc_check_constructor (e, check_restricted);
2944
      break;
2945
 
2946
    default:
2947
      gfc_internal_error ("check_restricted(): Unknown expression type");
2948
    }
2949
 
2950
  return t;
2951
}
2952
 
2953
 
2954
/* Check to see that an expression is a specification expression.  If
2955
   we return FAILURE, an error has been generated.  */
2956
 
2957
gfc_try
2958
gfc_specification_expr (gfc_expr *e)
2959
{
2960
  gfc_component *comp;
2961
 
2962
  if (e == NULL)
2963
    return SUCCESS;
2964
 
2965
  if (e->ts.type != BT_INTEGER)
2966
    {
2967
      gfc_error ("Expression at %L must be of INTEGER type, found %s",
2968
                 &e->where, gfc_basic_typename (e->ts.type));
2969
      return FAILURE;
2970
    }
2971
 
2972
  if (e->expr_type == EXPR_FUNCTION
2973
          && !e->value.function.isym
2974
          && !e->value.function.esym
2975
          && !gfc_pure (e->symtree->n.sym)
2976
          && (!gfc_is_proc_ptr_comp (e, &comp)
2977
              || !comp->attr.pure))
2978
    {
2979
      gfc_error ("Function '%s' at %L must be PURE",
2980
                 e->symtree->n.sym->name, &e->where);
2981
      /* Prevent repeat error messages.  */
2982
      e->symtree->n.sym->attr.pure = 1;
2983
      return FAILURE;
2984
    }
2985
 
2986
  if (e->rank != 0)
2987
    {
2988
      gfc_error ("Expression at %L must be scalar", &e->where);
2989
      return FAILURE;
2990
    }
2991
 
2992
  if (gfc_simplify_expr (e, 0) == FAILURE)
2993
    return FAILURE;
2994
 
2995
  return check_restricted (e);
2996
}
2997
 
2998
 
2999
/************** Expression conformance checks.  *************/
3000
 
3001
/* Given two expressions, make sure that the arrays are conformable.  */
3002
 
3003
gfc_try
3004
gfc_check_conformance (gfc_expr *op1, gfc_expr *op2, const char *optype_msgid, ...)
3005
{
3006
  int op1_flag, op2_flag, d;
3007
  mpz_t op1_size, op2_size;
3008
  gfc_try t;
3009
 
3010
  va_list argp;
3011
  char buffer[240];
3012
 
3013
  if (op1->rank == 0 || op2->rank == 0)
3014
    return SUCCESS;
3015
 
3016
  va_start (argp, optype_msgid);
3017
  vsnprintf (buffer, 240, optype_msgid, argp);
3018
  va_end (argp);
3019
 
3020
  if (op1->rank != op2->rank)
3021
    {
3022
      gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(buffer),
3023
                 op1->rank, op2->rank, &op1->where);
3024
      return FAILURE;
3025
    }
3026
 
3027
  t = SUCCESS;
3028
 
3029
  for (d = 0; d < op1->rank; d++)
3030
    {
3031
      op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
3032
      op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
3033
 
3034
      if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
3035
        {
3036
          gfc_error ("Different shape for %s at %L on dimension %d "
3037
                     "(%d and %d)", _(buffer), &op1->where, d + 1,
3038
                     (int) mpz_get_si (op1_size),
3039
                     (int) mpz_get_si (op2_size));
3040
 
3041
          t = FAILURE;
3042
        }
3043
 
3044
      if (op1_flag)
3045
        mpz_clear (op1_size);
3046
      if (op2_flag)
3047
        mpz_clear (op2_size);
3048
 
3049
      if (t == FAILURE)
3050
        return FAILURE;
3051
    }
3052
 
3053
  return SUCCESS;
3054
}
3055
 
3056
 
3057
/* Given an assignable expression and an arbitrary expression, make
3058
   sure that the assignment can take place.  */
3059
 
3060
gfc_try
3061
gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
3062
{
3063
  gfc_symbol *sym;
3064
  gfc_ref *ref;
3065
  int has_pointer;
3066
 
3067
  sym = lvalue->symtree->n.sym;
3068
 
3069
  /* See if this is the component or subcomponent of a pointer.  */
3070
  has_pointer = sym->attr.pointer;
3071
  for (ref = lvalue->ref; ref; ref = ref->next)
3072
    if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
3073
      {
3074
        has_pointer = 1;
3075
        break;
3076
      }
3077
 
3078
  /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
3079
     variable local to a function subprogram.  Its existence begins when
3080
     execution of the function is initiated and ends when execution of the
3081
     function is terminated...
3082
     Therefore, the left hand side is no longer a variable, when it is:  */
3083
  if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
3084
      && !sym->attr.external)
3085
    {
3086
      bool bad_proc;
3087
      bad_proc = false;
3088
 
3089
      /* (i) Use associated;  */
3090
      if (sym->attr.use_assoc)
3091
        bad_proc = true;
3092
 
3093
      /* (ii) The assignment is in the main program; or  */
3094
      if (gfc_current_ns->proc_name->attr.is_main_program)
3095
        bad_proc = true;
3096
 
3097
      /* (iii) A module or internal procedure...  */
3098
      if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
3099
           || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
3100
          && gfc_current_ns->parent
3101
          && (!(gfc_current_ns->parent->proc_name->attr.function
3102
                || gfc_current_ns->parent->proc_name->attr.subroutine)
3103
              || gfc_current_ns->parent->proc_name->attr.is_main_program))
3104
        {
3105
          /* ... that is not a function...  */
3106
          if (!gfc_current_ns->proc_name->attr.function)
3107
            bad_proc = true;
3108
 
3109
          /* ... or is not an entry and has a different name.  */
3110
          if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
3111
            bad_proc = true;
3112
        }
3113
 
3114
      /* (iv) Host associated and not the function symbol or the
3115
              parent result.  This picks up sibling references, which
3116
              cannot be entries.  */
3117
      if (!sym->attr.entry
3118
            && sym->ns == gfc_current_ns->parent
3119
            && sym != gfc_current_ns->proc_name
3120
            && sym != gfc_current_ns->parent->proc_name->result)
3121
        bad_proc = true;
3122
 
3123
      if (bad_proc)
3124
        {
3125
          gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
3126
          return FAILURE;
3127
        }
3128
    }
3129
 
3130
  if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
3131
    {
3132
      gfc_error ("Incompatible ranks %d and %d in assignment at %L",
3133
                 lvalue->rank, rvalue->rank, &lvalue->where);
3134
      return FAILURE;
3135
    }
3136
 
3137
  if (lvalue->ts.type == BT_UNKNOWN)
3138
    {
3139
      gfc_error ("Variable type is UNKNOWN in assignment at %L",
3140
                 &lvalue->where);
3141
      return FAILURE;
3142
    }
3143
 
3144
  if (rvalue->expr_type == EXPR_NULL)
3145
    {
3146
      if (has_pointer && (ref == NULL || ref->next == NULL)
3147
          && lvalue->symtree->n.sym->attr.data)
3148
        return SUCCESS;
3149
      else
3150
        {
3151
          gfc_error ("NULL appears on right-hand side in assignment at %L",
3152
                     &rvalue->where);
3153
          return FAILURE;
3154
        }
3155
    }
3156
 
3157
  /* This is possibly a typo: x = f() instead of x => f().  */
3158
  if (gfc_option.warn_surprising
3159
      && rvalue->expr_type == EXPR_FUNCTION
3160
      && rvalue->symtree->n.sym->attr.pointer)
3161
    gfc_warning ("POINTER valued function appears on right-hand side of "
3162
                 "assignment at %L", &rvalue->where);
3163
 
3164
  /* Check size of array assignments.  */
3165
  if (lvalue->rank != 0 && rvalue->rank != 0
3166
      && gfc_check_conformance (lvalue, rvalue, "array assignment") != SUCCESS)
3167
    return FAILURE;
3168
 
3169
  if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
3170
      && lvalue->symtree->n.sym->attr.data
3171
      && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L used to "
3172
                         "initialize non-integer variable '%s'",
3173
                         &rvalue->where, lvalue->symtree->n.sym->name)
3174
         == FAILURE)
3175
    return FAILURE;
3176
  else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
3177
      && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
3178
                         "a DATA statement and outside INT/REAL/DBLE/CMPLX",
3179
                         &rvalue->where) == FAILURE)
3180
    return FAILURE;
3181
 
3182
  /* Handle the case of a BOZ literal on the RHS.  */
3183
  if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
3184
    {
3185
      int rc;
3186
      if (gfc_option.warn_surprising)
3187
        gfc_warning ("BOZ literal at %L is bitwise transferred "
3188
                     "non-integer symbol '%s'", &rvalue->where,
3189
                     lvalue->symtree->n.sym->name);
3190
      if (!gfc_convert_boz (rvalue, &lvalue->ts))
3191
        return FAILURE;
3192
      if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
3193
        {
3194
          if (rc == ARITH_UNDERFLOW)
3195
            gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
3196
                       ". This check can be disabled with the option "
3197
                       "-fno-range-check", &rvalue->where);
3198
          else if (rc == ARITH_OVERFLOW)
3199
            gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
3200
                       ". This check can be disabled with the option "
3201
                       "-fno-range-check", &rvalue->where);
3202
          else if (rc == ARITH_NAN)
3203
            gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
3204
                       ". This check can be disabled with the option "
3205
                       "-fno-range-check", &rvalue->where);
3206
          return FAILURE;
3207
        }
3208
    }
3209
 
3210
  /*  Warn about type-changing conversions for REAL or COMPLEX constants.
3211
      If lvalue and rvalue are mixed REAL and complex, gfc_compare_types
3212
      will warn anyway, so there is no need to to so here.  */
3213
 
3214
  if (rvalue->expr_type == EXPR_CONSTANT && lvalue->ts.type == rvalue->ts.type
3215
      && (lvalue->ts.type == BT_REAL || lvalue->ts.type == BT_COMPLEX))
3216
    {
3217
      if (lvalue->ts.kind < rvalue->ts.kind && gfc_option.gfc_warn_conversion)
3218
        {
3219
          /* As a special bonus, don't warn about REAL rvalues which are not
3220
             changed by the conversion if -Wconversion is specified.  */
3221
          if (rvalue->ts.type == BT_REAL && mpfr_number_p (rvalue->value.real))
3222
            {
3223
              /* Calculate the difference between the constant and the rounded
3224
                 value and check it against zero.  */
3225
              mpfr_t rv, diff;
3226
              gfc_set_model_kind (lvalue->ts.kind);
3227
              mpfr_init (rv);
3228
              gfc_set_model_kind (rvalue->ts.kind);
3229
              mpfr_init (diff);
3230
 
3231
              mpfr_set (rv, rvalue->value.real, GFC_RND_MODE);
3232
              mpfr_sub (diff, rv, rvalue->value.real, GFC_RND_MODE);
3233
 
3234
              if (!mpfr_zero_p (diff))
3235
                gfc_warning ("Change of value in conversion from "
3236
                             " %s to %s at %L", gfc_typename (&rvalue->ts),
3237
                             gfc_typename (&lvalue->ts), &rvalue->where);
3238
 
3239
              mpfr_clear (rv);
3240
              mpfr_clear (diff);
3241
            }
3242
          else
3243
            gfc_warning ("Possible change of value in conversion from %s "
3244
                         "to %s at %L",gfc_typename (&rvalue->ts),
3245
                         gfc_typename (&lvalue->ts), &rvalue->where);
3246
 
3247
        }
3248
      else if (gfc_option.warn_conversion_extra
3249
               && lvalue->ts.kind > rvalue->ts.kind)
3250
        {
3251
          gfc_warning ("Conversion from %s to %s at %L",
3252
                       gfc_typename (&rvalue->ts),
3253
                       gfc_typename (&lvalue->ts), &rvalue->where);
3254
        }
3255
    }
3256
 
3257
  if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
3258
    return SUCCESS;
3259
 
3260
  /* Only DATA Statements come here.  */
3261
  if (!conform)
3262
    {
3263
      /* Numeric can be converted to any other numeric. And Hollerith can be
3264
         converted to any other type.  */
3265
      if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
3266
          || rvalue->ts.type == BT_HOLLERITH)
3267
        return SUCCESS;
3268
 
3269
      if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
3270
        return SUCCESS;
3271
 
3272
      gfc_error ("Incompatible types in DATA statement at %L; attempted "
3273
                 "conversion of %s to %s", &lvalue->where,
3274
                 gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3275
 
3276
      return FAILURE;
3277
    }
3278
 
3279
  /* Assignment is the only case where character variables of different
3280
     kind values can be converted into one another.  */
3281
  if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
3282
    {
3283
      if (lvalue->ts.kind != rvalue->ts.kind)
3284
        gfc_convert_chartype (rvalue, &lvalue->ts);
3285
 
3286
      return SUCCESS;
3287
    }
3288
 
3289
  return gfc_convert_type (rvalue, &lvalue->ts, 1);
3290
}
3291
 
3292
 
3293
/* Check that a pointer assignment is OK.  We first check lvalue, and
3294
   we only check rvalue if it's not an assignment to NULL() or a
3295
   NULLIFY statement.  */
3296
 
3297
gfc_try
3298
gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
3299
{
3300
  symbol_attribute attr;
3301
  gfc_ref *ref;
3302
  bool is_pure, is_implicit_pure, rank_remap;
3303
  int proc_pointer;
3304
 
3305
  if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN
3306
      && !lvalue->symtree->n.sym->attr.proc_pointer)
3307
    {
3308
      gfc_error ("Pointer assignment target is not a POINTER at %L",
3309
                 &lvalue->where);
3310
      return FAILURE;
3311
    }
3312
 
3313
  if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
3314
      && lvalue->symtree->n.sym->attr.use_assoc
3315
      && !lvalue->symtree->n.sym->attr.proc_pointer)
3316
    {
3317
      gfc_error ("'%s' in the pointer assignment at %L cannot be an "
3318
                 "l-value since it is a procedure",
3319
                 lvalue->symtree->n.sym->name, &lvalue->where);
3320
      return FAILURE;
3321
    }
3322
 
3323
  proc_pointer = lvalue->symtree->n.sym->attr.proc_pointer;
3324
 
3325
  rank_remap = false;
3326
  for (ref = lvalue->ref; ref; ref = ref->next)
3327
    {
3328
      if (ref->type == REF_COMPONENT)
3329
        proc_pointer = ref->u.c.component->attr.proc_pointer;
3330
 
3331
      if (ref->type == REF_ARRAY && ref->next == NULL)
3332
        {
3333
          int dim;
3334
 
3335
          if (ref->u.ar.type == AR_FULL)
3336
            break;
3337
 
3338
          if (ref->u.ar.type != AR_SECTION)
3339
            {
3340
              gfc_error ("Expected bounds specification for '%s' at %L",
3341
                         lvalue->symtree->n.sym->name, &lvalue->where);
3342
              return FAILURE;
3343
            }
3344
 
3345
          if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Bounds "
3346
                              "specification for '%s' in pointer assignment "
3347
                              "at %L", lvalue->symtree->n.sym->name,
3348
                              &lvalue->where) == FAILURE)
3349
            return FAILURE;
3350
 
3351
          /* When bounds are given, all lbounds are necessary and either all
3352
             or none of the upper bounds; no strides are allowed.  If the
3353
             upper bounds are present, we may do rank remapping.  */
3354
          for (dim = 0; dim < ref->u.ar.dimen; ++dim)
3355
            {
3356
              if (!ref->u.ar.start[dim]
3357
                  || ref->u.ar.dimen_type[dim] != DIMEN_RANGE)
3358
                {
3359
                  gfc_error ("Lower bound has to be present at %L",
3360
                             &lvalue->where);
3361
                  return FAILURE;
3362
                }
3363
              if (ref->u.ar.stride[dim])
3364
                {
3365
                  gfc_error ("Stride must not be present at %L",
3366
                             &lvalue->where);
3367
                  return FAILURE;
3368
                }
3369
 
3370
              if (dim == 0)
3371
                rank_remap = (ref->u.ar.end[dim] != NULL);
3372
              else
3373
                {
3374
                  if ((rank_remap && !ref->u.ar.end[dim])
3375
                      || (!rank_remap && ref->u.ar.end[dim]))
3376
                    {
3377
                      gfc_error ("Either all or none of the upper bounds"
3378
                                 " must be specified at %L", &lvalue->where);
3379
                      return FAILURE;
3380
                    }
3381
                }
3382
            }
3383
        }
3384
    }
3385
 
3386
  is_pure = gfc_pure (NULL);
3387
  is_implicit_pure = gfc_implicit_pure (NULL);
3388
 
3389
  /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
3390
     kind, etc for lvalue and rvalue must match, and rvalue must be a
3391
     pure variable if we're in a pure function.  */
3392
  if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
3393
    return SUCCESS;
3394
 
3395
  /* F2008, C723 (pointer) and C726 (proc-pointer); for PURE also C1283.  */
3396
  if (lvalue->expr_type == EXPR_VARIABLE
3397
      && gfc_is_coindexed (lvalue))
3398
    {
3399
      gfc_ref *ref;
3400
      for (ref = lvalue->ref; ref; ref = ref->next)
3401
        if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3402
          {
3403
            gfc_error ("Pointer object at %L shall not have a coindex",
3404
                       &lvalue->where);
3405
            return FAILURE;
3406
          }
3407
    }
3408
 
3409
  /* Checks on rvalue for procedure pointer assignments.  */
3410
  if (proc_pointer)
3411
    {
3412
      char err[200];
3413
      gfc_symbol *s1,*s2;
3414
      gfc_component *comp;
3415
      const char *name;
3416
 
3417
      attr = gfc_expr_attr (rvalue);
3418
      if (!((rvalue->expr_type == EXPR_NULL)
3419
            || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
3420
            || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
3421
            || (rvalue->expr_type == EXPR_VARIABLE
3422
                && attr.flavor == FL_PROCEDURE)))
3423
        {
3424
          gfc_error ("Invalid procedure pointer assignment at %L",
3425
                     &rvalue->where);
3426
          return FAILURE;
3427
        }
3428
      if (attr.abstract)
3429
        {
3430
          gfc_error ("Abstract interface '%s' is invalid "
3431
                     "in procedure pointer assignment at %L",
3432
                     rvalue->symtree->name, &rvalue->where);
3433
          return FAILURE;
3434
        }
3435
      /* Check for F08:C729.  */
3436
      if (attr.flavor == FL_PROCEDURE)
3437
        {
3438
          if (attr.proc == PROC_ST_FUNCTION)
3439
            {
3440
              gfc_error ("Statement function '%s' is invalid "
3441
                         "in procedure pointer assignment at %L",
3442
                         rvalue->symtree->name, &rvalue->where);
3443
              return FAILURE;
3444
            }
3445
          if (attr.proc == PROC_INTERNAL &&
3446
              gfc_notify_std (GFC_STD_F2008, "Internal procedure '%s' is "
3447
                              "invalid in procedure pointer assignment at %L",
3448
                              rvalue->symtree->name, &rvalue->where) == FAILURE)
3449
            return FAILURE;
3450
        }
3451
      /* Check for F08:C730.  */
3452
      if (attr.elemental && !attr.intrinsic)
3453
        {
3454
          gfc_error ("Nonintrinsic elemental procedure '%s' is invalid "
3455
                     "in procedure pointer assigment at %L",
3456
                     rvalue->symtree->name, &rvalue->where);
3457
          return FAILURE;
3458
        }
3459
 
3460
      /* Ensure that the calling convention is the same. As other attributes
3461
         such as DLLEXPORT may differ, one explicitly only tests for the
3462
         calling conventions.  */
3463
      if (rvalue->expr_type == EXPR_VARIABLE
3464
          && lvalue->symtree->n.sym->attr.ext_attr
3465
               != rvalue->symtree->n.sym->attr.ext_attr)
3466
        {
3467
          symbol_attribute calls;
3468
 
3469
          calls.ext_attr = 0;
3470
          gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
3471
          gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
3472
          gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
3473
 
3474
          if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
3475
              != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
3476
            {
3477
              gfc_error ("Mismatch in the procedure pointer assignment "
3478
                         "at %L: mismatch in the calling convention",
3479
                         &rvalue->where);
3480
          return FAILURE;
3481
            }
3482
        }
3483
 
3484
      if (gfc_is_proc_ptr_comp (lvalue, &comp))
3485
        s1 = comp->ts.interface;
3486
      else
3487
        s1 = lvalue->symtree->n.sym;
3488
 
3489
      if (gfc_is_proc_ptr_comp (rvalue, &comp))
3490
        {
3491
          s2 = comp->ts.interface;
3492
          name = comp->name;
3493
        }
3494
      else if (rvalue->expr_type == EXPR_FUNCTION)
3495
        {
3496
          s2 = rvalue->symtree->n.sym->result;
3497
          name = rvalue->symtree->n.sym->result->name;
3498
        }
3499
      else
3500
        {
3501
          s2 = rvalue->symtree->n.sym;
3502
          name = rvalue->symtree->n.sym->name;
3503
        }
3504
 
3505
      if (s1 && s2 && !gfc_compare_interfaces (s1, s2, name, 0, 1,
3506
                                               err, sizeof(err)))
3507
        {
3508
          gfc_error ("Interface mismatch in procedure pointer assignment "
3509
                     "at %L: %s", &rvalue->where, err);
3510
          return FAILURE;
3511
        }
3512
 
3513
      return SUCCESS;
3514
    }
3515
 
3516
  if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
3517
    {
3518
      gfc_error ("Different types in pointer assignment at %L; attempted "
3519
                 "assignment of %s to %s", &lvalue->where,
3520
                 gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3521
      return FAILURE;
3522
    }
3523
 
3524
  if (lvalue->ts.type != BT_CLASS && lvalue->ts.kind != rvalue->ts.kind)
3525
    {
3526
      gfc_error ("Different kind type parameters in pointer "
3527
                 "assignment at %L", &lvalue->where);
3528
      return FAILURE;
3529
    }
3530
 
3531
  if (lvalue->rank != rvalue->rank && !rank_remap)
3532
    {
3533
      gfc_error ("Different ranks in pointer assignment at %L", &lvalue->where);
3534
      return FAILURE;
3535
    }
3536
 
3537
  if (lvalue->ts.type == BT_CLASS && rvalue->ts.type == BT_DERIVED)
3538
    /* Make sure the vtab is present.  */
3539
    gfc_find_derived_vtab (rvalue->ts.u.derived);
3540
 
3541
  /* Check rank remapping.  */
3542
  if (rank_remap)
3543
    {
3544
      mpz_t lsize, rsize;
3545
 
3546
      /* If this can be determined, check that the target must be at least as
3547
         large as the pointer assigned to it is.  */
3548
      if (gfc_array_size (lvalue, &lsize) == SUCCESS
3549
          && gfc_array_size (rvalue, &rsize) == SUCCESS
3550
          && mpz_cmp (rsize, lsize) < 0)
3551
        {
3552
          gfc_error ("Rank remapping target is smaller than size of the"
3553
                     " pointer (%ld < %ld) at %L",
3554
                     mpz_get_si (rsize), mpz_get_si (lsize),
3555
                     &lvalue->where);
3556
          return FAILURE;
3557
        }
3558
 
3559
      /* The target must be either rank one or it must be simply contiguous
3560
         and F2008 must be allowed.  */
3561
      if (rvalue->rank != 1)
3562
        {
3563
          if (!gfc_is_simply_contiguous (rvalue, true))
3564
            {
3565
              gfc_error ("Rank remapping target must be rank 1 or"
3566
                         " simply contiguous at %L", &rvalue->where);
3567
              return FAILURE;
3568
            }
3569
          if (gfc_notify_std (GFC_STD_F2008, "Fortran 2008: Rank remapping"
3570
                              " target is not rank 1 at %L", &rvalue->where)
3571
                == FAILURE)
3572
            return FAILURE;
3573
        }
3574
    }
3575
 
3576
  /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
3577
  if (rvalue->expr_type == EXPR_NULL)
3578
    return SUCCESS;
3579
 
3580
  if (lvalue->ts.type == BT_CHARACTER)
3581
    {
3582
      gfc_try t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
3583
      if (t == FAILURE)
3584
        return FAILURE;
3585
    }
3586
 
3587
  if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
3588
    lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
3589
 
3590
  attr = gfc_expr_attr (rvalue);
3591
 
3592
  if (rvalue->expr_type == EXPR_FUNCTION && !attr.pointer)
3593
    {
3594
      gfc_error ("Target expression in pointer assignment "
3595
                 "at %L must deliver a pointer result",
3596
                 &rvalue->where);
3597
      return FAILURE;
3598
    }
3599
 
3600
  if (!attr.target && !attr.pointer)
3601
    {
3602
      gfc_error ("Pointer assignment target is neither TARGET "
3603
                 "nor POINTER at %L", &rvalue->where);
3604
      return FAILURE;
3605
    }
3606
 
3607
  if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3608
    {
3609
      gfc_error ("Bad target in pointer assignment in PURE "
3610
                 "procedure at %L", &rvalue->where);
3611
    }
3612
 
3613
  if (is_implicit_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3614
    gfc_current_ns->proc_name->attr.implicit_pure = 0;
3615
 
3616
 
3617
  if (gfc_has_vector_index (rvalue))
3618
    {
3619
      gfc_error ("Pointer assignment with vector subscript "
3620
                 "on rhs at %L", &rvalue->where);
3621
      return FAILURE;
3622
    }
3623
 
3624
  if (attr.is_protected && attr.use_assoc
3625
      && !(attr.pointer || attr.proc_pointer))
3626
    {
3627
      gfc_error ("Pointer assignment target has PROTECTED "
3628
                 "attribute at %L", &rvalue->where);
3629
      return FAILURE;
3630
    }
3631
 
3632
  /* F2008, C725. For PURE also C1283.  */
3633
  if (rvalue->expr_type == EXPR_VARIABLE
3634
      && gfc_is_coindexed (rvalue))
3635
    {
3636
      gfc_ref *ref;
3637
      for (ref = rvalue->ref; ref; ref = ref->next)
3638
        if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3639
          {
3640
            gfc_error ("Data target at %L shall not have a coindex",
3641
                       &rvalue->where);
3642
            return FAILURE;
3643
          }
3644
    }
3645
 
3646
  return SUCCESS;
3647
}
3648
 
3649
 
3650
/* Relative of gfc_check_assign() except that the lvalue is a single
3651
   symbol.  Used for initialization assignments.  */
3652
 
3653
gfc_try
3654
gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
3655
{
3656
  gfc_expr lvalue;
3657
  gfc_try r;
3658
 
3659
  memset (&lvalue, '\0', sizeof (gfc_expr));
3660
 
3661
  lvalue.expr_type = EXPR_VARIABLE;
3662
  lvalue.ts = sym->ts;
3663
  if (sym->as)
3664
    lvalue.rank = sym->as->rank;
3665
  lvalue.symtree = XCNEW (gfc_symtree);
3666
  lvalue.symtree->n.sym = sym;
3667
  lvalue.where = sym->declared_at;
3668
 
3669
  if (sym->attr.pointer || sym->attr.proc_pointer
3670
      || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->attr.class_pointer
3671
          && rvalue->expr_type == EXPR_NULL))
3672
    r = gfc_check_pointer_assign (&lvalue, rvalue);
3673
  else
3674
    r = gfc_check_assign (&lvalue, rvalue, 1);
3675
 
3676
  free (lvalue.symtree);
3677
 
3678
  if (r == FAILURE)
3679
    return r;
3680
 
3681
  if (sym->attr.pointer && rvalue->expr_type != EXPR_NULL)
3682
    {
3683
      /* F08:C461. Additional checks for pointer initialization.  */
3684
      symbol_attribute attr;
3685
      attr = gfc_expr_attr (rvalue);
3686
      if (attr.allocatable)
3687
        {
3688
          gfc_error ("Pointer initialization target at %C "
3689
                     "must not be ALLOCATABLE ");
3690
          return FAILURE;
3691
        }
3692
      if (!attr.target || attr.pointer)
3693
        {
3694
          gfc_error ("Pointer initialization target at %C "
3695
                     "must have the TARGET attribute");
3696
          return FAILURE;
3697
        }
3698
      if (!attr.save)
3699
        {
3700
          gfc_error ("Pointer initialization target at %C "
3701
                     "must have the SAVE attribute");
3702
          return FAILURE;
3703
        }
3704
    }
3705
 
3706
  if (sym->attr.proc_pointer && rvalue->expr_type != EXPR_NULL)
3707
    {
3708
      /* F08:C1220. Additional checks for procedure pointer initialization.  */
3709
      symbol_attribute attr = gfc_expr_attr (rvalue);
3710
      if (attr.proc_pointer)
3711
        {
3712
          gfc_error ("Procedure pointer initialization target at %L "
3713
                     "may not be a procedure pointer", &rvalue->where);
3714
          return FAILURE;
3715
        }
3716
    }
3717
 
3718
  return SUCCESS;
3719
}
3720
 
3721
 
3722
/* Check for default initializer; sym->value is not enough
3723
   as it is also set for EXPR_NULL of allocatables.  */
3724
 
3725
bool
3726
gfc_has_default_initializer (gfc_symbol *der)
3727
{
3728
  gfc_component *c;
3729
 
3730
  gcc_assert (der->attr.flavor == FL_DERIVED);
3731
  for (c = der->components; c; c = c->next)
3732
    if (c->ts.type == BT_DERIVED)
3733
      {
3734
        if (!c->attr.pointer
3735
             && gfc_has_default_initializer (c->ts.u.derived))
3736
          return true;
3737
        if (c->attr.pointer && c->initializer)
3738
          return true;
3739
      }
3740
    else
3741
      {
3742
        if (c->initializer)
3743
          return true;
3744
      }
3745
 
3746
  return false;
3747
}
3748
 
3749
 
3750
/* Get an expression for a default initializer.  */
3751
 
3752
gfc_expr *
3753
gfc_default_initializer (gfc_typespec *ts)
3754
{
3755
  gfc_expr *init;
3756
  gfc_component *comp;
3757
 
3758
  /* See if we have a default initializer in this, but not in nested
3759
     types (otherwise we could use gfc_has_default_initializer()).  */
3760
  for (comp = ts->u.derived->components; comp; comp = comp->next)
3761
    if (comp->initializer || comp->attr.allocatable
3762
        || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
3763
      break;
3764
 
3765
  if (!comp)
3766
    return NULL;
3767
 
3768
  init = gfc_get_structure_constructor_expr (ts->type, ts->kind,
3769
                                             &ts->u.derived->declared_at);
3770
  init->ts = *ts;
3771
 
3772
  for (comp = ts->u.derived->components; comp; comp = comp->next)
3773
    {
3774
      gfc_constructor *ctor = gfc_constructor_get();
3775
 
3776
      if (comp->initializer)
3777
        {
3778
          ctor->expr = gfc_copy_expr (comp->initializer);
3779
          if ((comp->ts.type != comp->initializer->ts.type
3780
               || comp->ts.kind != comp->initializer->ts.kind)
3781
              && !comp->attr.pointer && !comp->attr.proc_pointer)
3782
            gfc_convert_type_warn (ctor->expr, &comp->ts, 2, false);
3783
        }
3784
 
3785
      if (comp->attr.allocatable
3786
          || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
3787
        {
3788
          ctor->expr = gfc_get_expr ();
3789
          ctor->expr->expr_type = EXPR_NULL;
3790
          ctor->expr->ts = comp->ts;
3791
        }
3792
 
3793
      gfc_constructor_append (&init->value.constructor, ctor);
3794
    }
3795
 
3796
  return init;
3797
}
3798
 
3799
 
3800
/* Given a symbol, create an expression node with that symbol as a
3801
   variable. If the symbol is array valued, setup a reference of the
3802
   whole array.  */
3803
 
3804
gfc_expr *
3805
gfc_get_variable_expr (gfc_symtree *var)
3806
{
3807
  gfc_expr *e;
3808
 
3809
  e = gfc_get_expr ();
3810
  e->expr_type = EXPR_VARIABLE;
3811
  e->symtree = var;
3812
  e->ts = var->n.sym->ts;
3813
 
3814
  if ((var->n.sym->as != NULL && var->n.sym->ts.type != BT_CLASS)
3815
      || (var->n.sym->ts.type == BT_CLASS && CLASS_DATA (var->n.sym)
3816
          && CLASS_DATA (var->n.sym)->as))
3817
    {
3818
      e->rank = var->n.sym->ts.type == BT_CLASS
3819
                ? CLASS_DATA (var->n.sym)->as->rank : var->n.sym->as->rank;
3820
      e->ref = gfc_get_ref ();
3821
      e->ref->type = REF_ARRAY;
3822
      e->ref->u.ar.type = AR_FULL;
3823
    }
3824
 
3825
  return e;
3826
}
3827
 
3828
 
3829
gfc_expr *
3830
gfc_lval_expr_from_sym (gfc_symbol *sym)
3831
{
3832
  gfc_expr *lval;
3833
  lval = gfc_get_expr ();
3834
  lval->expr_type = EXPR_VARIABLE;
3835
  lval->where = sym->declared_at;
3836
  lval->ts = sym->ts;
3837
  lval->symtree = gfc_find_symtree (sym->ns->sym_root, sym->name);
3838
 
3839
  /* It will always be a full array.  */
3840
  lval->rank = sym->as ? sym->as->rank : 0;
3841
  if (lval->rank)
3842
    {
3843
      lval->ref = gfc_get_ref ();
3844
      lval->ref->type = REF_ARRAY;
3845
      lval->ref->u.ar.type = AR_FULL;
3846
      lval->ref->u.ar.dimen = lval->rank;
3847
      lval->ref->u.ar.where = sym->declared_at;
3848
      lval->ref->u.ar.as = sym->ts.type == BT_CLASS
3849
                           ? CLASS_DATA (sym)->as : sym->as;
3850
    }
3851
 
3852
  return lval;
3853
}
3854
 
3855
 
3856
/* Returns the array_spec of a full array expression.  A NULL is
3857
   returned otherwise.  */
3858
gfc_array_spec *
3859
gfc_get_full_arrayspec_from_expr (gfc_expr *expr)
3860
{
3861
  gfc_array_spec *as;
3862
  gfc_ref *ref;
3863
 
3864
  if (expr->rank == 0)
3865
    return NULL;
3866
 
3867
  /* Follow any component references.  */
3868
  if (expr->expr_type == EXPR_VARIABLE
3869
      || expr->expr_type == EXPR_CONSTANT)
3870
    {
3871
      as = expr->symtree->n.sym->as;
3872
      for (ref = expr->ref; ref; ref = ref->next)
3873
        {
3874
          switch (ref->type)
3875
            {
3876
            case REF_COMPONENT:
3877
              as = ref->u.c.component->as;
3878
              continue;
3879
 
3880
            case REF_SUBSTRING:
3881
              continue;
3882
 
3883
            case REF_ARRAY:
3884
              {
3885
                switch (ref->u.ar.type)
3886
                  {
3887
                  case AR_ELEMENT:
3888
                  case AR_SECTION:
3889
                  case AR_UNKNOWN:
3890
                    as = NULL;
3891
                    continue;
3892
 
3893
                  case AR_FULL:
3894
                    break;
3895
                  }
3896
                break;
3897
              }
3898
            }
3899
        }
3900
    }
3901
  else
3902
    as = NULL;
3903
 
3904
  return as;
3905
}
3906
 
3907
 
3908
/* General expression traversal function.  */
3909
 
3910
bool
3911
gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3912
                   bool (*func)(gfc_expr *, gfc_symbol *, int*),
3913
                   int f)
3914
{
3915
  gfc_array_ref ar;
3916
  gfc_ref *ref;
3917
  gfc_actual_arglist *args;
3918
  gfc_constructor *c;
3919
  int i;
3920
 
3921
  if (!expr)
3922
    return false;
3923
 
3924
  if ((*func) (expr, sym, &f))
3925
    return true;
3926
 
3927
  if (expr->ts.type == BT_CHARACTER
3928
        && expr->ts.u.cl
3929
        && expr->ts.u.cl->length
3930
        && expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
3931
        && gfc_traverse_expr (expr->ts.u.cl->length, sym, func, f))
3932
    return true;
3933
 
3934
  switch (expr->expr_type)
3935
    {
3936
    case EXPR_PPC:
3937
    case EXPR_COMPCALL:
3938
    case EXPR_FUNCTION:
3939
      for (args = expr->value.function.actual; args; args = args->next)
3940
        {
3941
          if (gfc_traverse_expr (args->expr, sym, func, f))
3942
            return true;
3943
        }
3944
      break;
3945
 
3946
    case EXPR_VARIABLE:
3947
    case EXPR_CONSTANT:
3948
    case EXPR_NULL:
3949
    case EXPR_SUBSTRING:
3950
      break;
3951
 
3952
    case EXPR_STRUCTURE:
3953
    case EXPR_ARRAY:
3954
      for (c = gfc_constructor_first (expr->value.constructor);
3955
           c; c = gfc_constructor_next (c))
3956
        {
3957
          if (gfc_traverse_expr (c->expr, sym, func, f))
3958
            return true;
3959
          if (c->iterator)
3960
            {
3961
              if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3962
                return true;
3963
              if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3964
                return true;
3965
              if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3966
                return true;
3967
              if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3968
                return true;
3969
            }
3970
        }
3971
      break;
3972
 
3973
    case EXPR_OP:
3974
      if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3975
        return true;
3976
      if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3977
        return true;
3978
      break;
3979
 
3980
    default:
3981
      gcc_unreachable ();
3982
      break;
3983
    }
3984
 
3985
  ref = expr->ref;
3986
  while (ref != NULL)
3987
    {
3988
      switch (ref->type)
3989
        {
3990
        case  REF_ARRAY:
3991
          ar = ref->u.ar;
3992
          for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3993
            {
3994
              if (gfc_traverse_expr (ar.start[i], sym, func, f))
3995
                return true;
3996
              if (gfc_traverse_expr (ar.end[i], sym, func, f))
3997
                return true;
3998
              if (gfc_traverse_expr (ar.stride[i], sym, func, f))
3999
                return true;
4000
            }
4001
          break;
4002
 
4003
        case REF_SUBSTRING:
4004
          if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
4005
            return true;
4006
          if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
4007
            return true;
4008
          break;
4009
 
4010
        case REF_COMPONENT:
4011
          if (ref->u.c.component->ts.type == BT_CHARACTER
4012
                && ref->u.c.component->ts.u.cl
4013
                && ref->u.c.component->ts.u.cl->length
4014
                && ref->u.c.component->ts.u.cl->length->expr_type
4015
                     != EXPR_CONSTANT
4016
                && gfc_traverse_expr (ref->u.c.component->ts.u.cl->length,
4017
                                      sym, func, f))
4018
            return true;
4019
 
4020
          if (ref->u.c.component->as)
4021
            for (i = 0; i < ref->u.c.component->as->rank
4022
                            + ref->u.c.component->as->corank; i++)
4023
              {
4024
                if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
4025
                                       sym, func, f))
4026
                  return true;
4027
                if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
4028
                                       sym, func, f))
4029
                  return true;
4030
              }
4031
          break;
4032
 
4033
        default:
4034
          gcc_unreachable ();
4035
        }
4036
      ref = ref->next;
4037
    }
4038
  return false;
4039
}
4040
 
4041
/* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */
4042
 
4043
static bool
4044
expr_set_symbols_referenced (gfc_expr *expr,
4045
                             gfc_symbol *sym ATTRIBUTE_UNUSED,
4046
                             int *f ATTRIBUTE_UNUSED)
4047
{
4048
  if (expr->expr_type != EXPR_VARIABLE)
4049
    return false;
4050
  gfc_set_sym_referenced (expr->symtree->n.sym);
4051
  return false;
4052
}
4053
 
4054
void
4055
gfc_expr_set_symbols_referenced (gfc_expr *expr)
4056
{
4057
  gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
4058
}
4059
 
4060
 
4061
/* Determine if an expression is a procedure pointer component. If yes, the
4062
   argument 'comp' will point to the component (provided that 'comp' was
4063
   provided).  */
4064
 
4065
bool
4066
gfc_is_proc_ptr_comp (gfc_expr *expr, gfc_component **comp)
4067
{
4068
  gfc_ref *ref;
4069
  bool ppc = false;
4070
 
4071
  if (!expr || !expr->ref)
4072
    return false;
4073
 
4074
  ref = expr->ref;
4075
  while (ref->next)
4076
    ref = ref->next;
4077
 
4078
  if (ref->type == REF_COMPONENT)
4079
    {
4080
      ppc = ref->u.c.component->attr.proc_pointer;
4081
      if (ppc && comp)
4082
        *comp = ref->u.c.component;
4083
    }
4084
 
4085
  return ppc;
4086
}
4087
 
4088
 
4089
/* Walk an expression tree and check each variable encountered for being typed.
4090
   If strict is not set, a top-level variable is tolerated untyped in -std=gnu
4091
   mode as is a basic arithmetic expression using those; this is for things in
4092
   legacy-code like:
4093
 
4094
     INTEGER :: arr(n), n
4095
     INTEGER :: arr(n + 1), n
4096
 
4097
   The namespace is needed for IMPLICIT typing.  */
4098
 
4099
static gfc_namespace* check_typed_ns;
4100
 
4101
static bool
4102
expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
4103
                       int* f ATTRIBUTE_UNUSED)
4104
{
4105
  gfc_try t;
4106
 
4107
  if (e->expr_type != EXPR_VARIABLE)
4108
    return false;
4109
 
4110
  gcc_assert (e->symtree);
4111
  t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
4112
                              true, e->where);
4113
 
4114
  return (t == FAILURE);
4115
}
4116
 
4117
gfc_try
4118
gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
4119
{
4120
  bool error_found;
4121
 
4122
  /* If this is a top-level variable or EXPR_OP, do the check with strict given
4123
     to us.  */
4124
  if (!strict)
4125
    {
4126
      if (e->expr_type == EXPR_VARIABLE && !e->ref)
4127
        return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
4128
 
4129
      if (e->expr_type == EXPR_OP)
4130
        {
4131
          gfc_try t = SUCCESS;
4132
 
4133
          gcc_assert (e->value.op.op1);
4134
          t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
4135
 
4136
          if (t == SUCCESS && e->value.op.op2)
4137
            t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
4138
 
4139
          return t;
4140
        }
4141
    }
4142
 
4143
  /* Otherwise, walk the expression and do it strictly.  */
4144
  check_typed_ns = ns;
4145
  error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
4146
 
4147
  return error_found ? FAILURE : SUCCESS;
4148
}
4149
 
4150
 
4151
/* Walk an expression tree and replace all dummy symbols by the corresponding
4152
   symbol in the formal_ns of "sym". Needed for copying interfaces in PROCEDURE
4153
   statements. The boolean return value is required by gfc_traverse_expr.  */
4154
 
4155
static bool
4156
replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
4157
{
4158
  if ((expr->expr_type == EXPR_VARIABLE
4159
       || (expr->expr_type == EXPR_FUNCTION
4160
           && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
4161
      && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns
4162
      && expr->symtree->n.sym->attr.dummy)
4163
    {
4164
      gfc_symtree *root = sym->formal_ns ? sym->formal_ns->sym_root
4165
                                         : gfc_current_ns->sym_root;
4166
      gfc_symtree *stree = gfc_find_symtree (root, expr->symtree->n.sym->name);
4167
      gcc_assert (stree);
4168
      stree->n.sym->attr = expr->symtree->n.sym->attr;
4169
      expr->symtree = stree;
4170
    }
4171
  return false;
4172
}
4173
 
4174
void
4175
gfc_expr_replace_symbols (gfc_expr *expr, gfc_symbol *dest)
4176
{
4177
  gfc_traverse_expr (expr, dest, &replace_symbol, 0);
4178
}
4179
 
4180
 
4181
/* The following is analogous to 'replace_symbol', and needed for copying
4182
   interfaces for procedure pointer components. The argument 'sym' must formally
4183
   be a gfc_symbol, so that the function can be passed to gfc_traverse_expr.
4184
   However, it gets actually passed a gfc_component (i.e. the procedure pointer
4185
   component in whose formal_ns the arguments have to be).  */
4186
 
4187
static bool
4188
replace_comp (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
4189
{
4190
  gfc_component *comp;
4191
  comp = (gfc_component *)sym;
4192
  if ((expr->expr_type == EXPR_VARIABLE
4193
       || (expr->expr_type == EXPR_FUNCTION
4194
           && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where)))
4195
      && expr->symtree->n.sym->ns == comp->ts.interface->formal_ns)
4196
    {
4197
      gfc_symtree *stree;
4198
      gfc_namespace *ns = comp->formal_ns;
4199
      /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find
4200
         the symtree rather than create a new one (and probably fail later).  */
4201
      stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root,
4202
                                expr->symtree->n.sym->name);
4203
      gcc_assert (stree);
4204
      stree->n.sym->attr = expr->symtree->n.sym->attr;
4205
      expr->symtree = stree;
4206
    }
4207
  return false;
4208
}
4209
 
4210
void
4211
gfc_expr_replace_comp (gfc_expr *expr, gfc_component *dest)
4212
{
4213
  gfc_traverse_expr (expr, (gfc_symbol *)dest, &replace_comp, 0);
4214
}
4215
 
4216
 
4217
bool
4218
gfc_ref_this_image (gfc_ref *ref)
4219
{
4220
  int n;
4221
 
4222
  gcc_assert (ref->type == REF_ARRAY && ref->u.ar.codimen > 0);
4223
 
4224
  for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
4225
    if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
4226
      return false;
4227
 
4228
  return true;
4229
}
4230
 
4231
 
4232
bool
4233
gfc_is_coindexed (gfc_expr *e)
4234
{
4235
  gfc_ref *ref;
4236
 
4237
  for (ref = e->ref; ref; ref = ref->next)
4238
    if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4239
      return !gfc_ref_this_image (ref);
4240
 
4241
  return false;
4242
}
4243
 
4244
 
4245
/* Coarrays are variables with a corank but not being coindexed. However, also
4246
   the following is a coarray: A subobject of a coarray is a coarray if it does
4247
   not have any cosubscripts, vector subscripts, allocatable component
4248
   selection, or pointer component selection. (F2008, 2.4.7)  */
4249
 
4250
bool
4251
gfc_is_coarray (gfc_expr *e)
4252
{
4253
  gfc_ref *ref;
4254
  gfc_symbol *sym;
4255
  gfc_component *comp;
4256
  bool coindexed;
4257
  bool coarray;
4258
  int i;
4259
 
4260
  if (e->expr_type != EXPR_VARIABLE)
4261
    return false;
4262
 
4263
  coindexed = false;
4264
  sym = e->symtree->n.sym;
4265
 
4266
  if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
4267
    coarray = CLASS_DATA (sym)->attr.codimension;
4268
  else
4269
    coarray = sym->attr.codimension;
4270
 
4271
  for (ref = e->ref; ref; ref = ref->next)
4272
    switch (ref->type)
4273
    {
4274
      case REF_COMPONENT:
4275
        comp = ref->u.c.component;
4276
        if (comp->ts.type == BT_CLASS && comp->attr.class_ok
4277
            && (CLASS_DATA (comp)->attr.class_pointer
4278
                || CLASS_DATA (comp)->attr.allocatable))
4279
          {
4280
            coindexed = false;
4281
            coarray = CLASS_DATA (comp)->attr.codimension;
4282
          }
4283
        else if (comp->attr.pointer || comp->attr.allocatable)
4284
          {
4285
            coindexed = false;
4286
            coarray = comp->attr.codimension;
4287
          }
4288
        break;
4289
 
4290
     case REF_ARRAY:
4291
        if (!coarray)
4292
          break;
4293
 
4294
        if (ref->u.ar.codimen > 0 && !gfc_ref_this_image (ref))
4295
          {
4296
            coindexed = true;
4297
            break;
4298
          }
4299
 
4300
        for (i = 0; i < ref->u.ar.dimen; i++)
4301
          if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
4302
            {
4303
              coarray = false;
4304
              break;
4305
            }
4306
        break;
4307
 
4308
     case REF_SUBSTRING:
4309
        break;
4310
    }
4311
 
4312
  return coarray && !coindexed;
4313
}
4314
 
4315
 
4316
int
4317
gfc_get_corank (gfc_expr *e)
4318
{
4319
  int corank;
4320
  gfc_ref *ref;
4321
 
4322
  if (!gfc_is_coarray (e))
4323
    return 0;
4324
 
4325
  if (e->ts.type == BT_CLASS && e->ts.u.derived->components)
4326
    corank = e->ts.u.derived->components->as
4327
             ? e->ts.u.derived->components->as->corank : 0;
4328
  else
4329
    corank = e->symtree->n.sym->as ? e->symtree->n.sym->as->corank : 0;
4330
 
4331
  for (ref = e->ref; ref; ref = ref->next)
4332
    {
4333
      if (ref->type == REF_ARRAY)
4334
        corank = ref->u.ar.as->corank;
4335
      gcc_assert (ref->type != REF_SUBSTRING);
4336
    }
4337
 
4338
  return corank;
4339
}
4340
 
4341
 
4342
/* Check whether the expression has an ultimate allocatable component.
4343
   Being itself allocatable does not count.  */
4344
bool
4345
gfc_has_ultimate_allocatable (gfc_expr *e)
4346
{
4347
  gfc_ref *ref, *last = NULL;
4348
 
4349
  if (e->expr_type != EXPR_VARIABLE)
4350
    return false;
4351
 
4352
  for (ref = e->ref; ref; ref = ref->next)
4353
    if (ref->type == REF_COMPONENT)
4354
      last = ref;
4355
 
4356
  if (last && last->u.c.component->ts.type == BT_CLASS)
4357
    return CLASS_DATA (last->u.c.component)->attr.alloc_comp;
4358
  else if (last && last->u.c.component->ts.type == BT_DERIVED)
4359
    return last->u.c.component->ts.u.derived->attr.alloc_comp;
4360
  else if (last)
4361
    return false;
4362
 
4363
  if (e->ts.type == BT_CLASS)
4364
    return CLASS_DATA (e)->attr.alloc_comp;
4365
  else if (e->ts.type == BT_DERIVED)
4366
    return e->ts.u.derived->attr.alloc_comp;
4367
  else
4368
    return false;
4369
}
4370
 
4371
 
4372
/* Check whether the expression has an pointer component.
4373
   Being itself a pointer does not count.  */
4374
bool
4375
gfc_has_ultimate_pointer (gfc_expr *e)
4376
{
4377
  gfc_ref *ref, *last = NULL;
4378
 
4379
  if (e->expr_type != EXPR_VARIABLE)
4380
    return false;
4381
 
4382
  for (ref = e->ref; ref; ref = ref->next)
4383
    if (ref->type == REF_COMPONENT)
4384
      last = ref;
4385
 
4386
  if (last && last->u.c.component->ts.type == BT_CLASS)
4387
    return CLASS_DATA (last->u.c.component)->attr.pointer_comp;
4388
  else if (last && last->u.c.component->ts.type == BT_DERIVED)
4389
    return last->u.c.component->ts.u.derived->attr.pointer_comp;
4390
  else if (last)
4391
    return false;
4392
 
4393
  if (e->ts.type == BT_CLASS)
4394
    return CLASS_DATA (e)->attr.pointer_comp;
4395
  else if (e->ts.type == BT_DERIVED)
4396
    return e->ts.u.derived->attr.pointer_comp;
4397
  else
4398
    return false;
4399
}
4400
 
4401
 
4402
/* Check whether an expression is "simply contiguous", cf. F2008, 6.5.4.
4403
   Note: A scalar is not regarded as "simply contiguous" by the standard.
4404
   if bool is not strict, some futher checks are done - for instance,
4405
   a "(::1)" is accepted.  */
4406
 
4407
bool
4408
gfc_is_simply_contiguous (gfc_expr *expr, bool strict)
4409
{
4410
  bool colon;
4411
  int i;
4412
  gfc_array_ref *ar = NULL;
4413
  gfc_ref *ref, *part_ref = NULL;
4414
  gfc_symbol *sym;
4415
 
4416
  if (expr->expr_type == EXPR_FUNCTION)
4417
    return expr->value.function.esym
4418
           ? expr->value.function.esym->result->attr.contiguous : false;
4419
  else if (expr->expr_type != EXPR_VARIABLE)
4420
    return false;
4421
 
4422
  if (expr->rank == 0)
4423
    return false;
4424
 
4425
  for (ref = expr->ref; ref; ref = ref->next)
4426
    {
4427
      if (ar)
4428
        return false; /* Array shall be last part-ref. */
4429
 
4430
      if (ref->type == REF_COMPONENT)
4431
        part_ref  = ref;
4432
      else if (ref->type == REF_SUBSTRING)
4433
        return false;
4434
      else if (ref->u.ar.type != AR_ELEMENT)
4435
        ar = &ref->u.ar;
4436
    }
4437
 
4438
  sym = expr->symtree->n.sym;
4439
  if (expr->ts.type != BT_CLASS
4440
        && ((part_ref
4441
                && !part_ref->u.c.component->attr.contiguous
4442
                && part_ref->u.c.component->attr.pointer)
4443
            || (!part_ref
4444
                && !sym->attr.contiguous
4445
                && (sym->attr.pointer
4446
                      || sym->as->type == AS_ASSUMED_SHAPE))))
4447
    return false;
4448
 
4449
  if (!ar || ar->type == AR_FULL)
4450
    return true;
4451
 
4452
  gcc_assert (ar->type == AR_SECTION);
4453
 
4454
  /* Check for simply contiguous array */
4455
  colon = true;
4456
  for (i = 0; i < ar->dimen; i++)
4457
    {
4458
      if (ar->dimen_type[i] == DIMEN_VECTOR)
4459
        return false;
4460
 
4461
      if (ar->dimen_type[i] == DIMEN_ELEMENT)
4462
        {
4463
          colon = false;
4464
          continue;
4465
        }
4466
 
4467
      gcc_assert (ar->dimen_type[i] == DIMEN_RANGE);
4468
 
4469
 
4470
      /* If the previous section was not contiguous, that's an error,
4471
         unless we have effective only one element and checking is not
4472
         strict.  */
4473
      if (!colon && (strict || !ar->start[i] || !ar->end[i]
4474
                     || ar->start[i]->expr_type != EXPR_CONSTANT
4475
                     || ar->end[i]->expr_type != EXPR_CONSTANT
4476
                     || mpz_cmp (ar->start[i]->value.integer,
4477
                                 ar->end[i]->value.integer) != 0))
4478
        return false;
4479
 
4480
      /* Following the standard, "(::1)" or - if known at compile time -
4481
         "(lbound:ubound)" are not simply contigous; if strict
4482
         is false, they are regarded as simply contiguous.  */
4483
      if (ar->stride[i] && (strict || ar->stride[i]->expr_type != EXPR_CONSTANT
4484
                            || ar->stride[i]->ts.type != BT_INTEGER
4485
                            || mpz_cmp_si (ar->stride[i]->value.integer, 1) != 0))
4486
        return false;
4487
 
4488
      if (ar->start[i]
4489
          && (strict || ar->start[i]->expr_type != EXPR_CONSTANT
4490
              || !ar->as->lower[i]
4491
              || ar->as->lower[i]->expr_type != EXPR_CONSTANT
4492
              || mpz_cmp (ar->start[i]->value.integer,
4493
                          ar->as->lower[i]->value.integer) != 0))
4494
        colon = false;
4495
 
4496
      if (ar->end[i]
4497
          && (strict || ar->end[i]->expr_type != EXPR_CONSTANT
4498
              || !ar->as->upper[i]
4499
              || ar->as->upper[i]->expr_type != EXPR_CONSTANT
4500
              || mpz_cmp (ar->end[i]->value.integer,
4501
                          ar->as->upper[i]->value.integer) != 0))
4502
        colon = false;
4503
    }
4504
 
4505
  return true;
4506
}
4507
 
4508
 
4509
/* Build call to an intrinsic procedure.  The number of arguments has to be
4510
   passed (rather than ending the list with a NULL value) because we may
4511
   want to add arguments but with a NULL-expression.  */
4512
 
4513
gfc_expr*
4514
gfc_build_intrinsic_call (const char* name, locus where, unsigned numarg, ...)
4515
{
4516
  gfc_expr* result;
4517
  gfc_actual_arglist* atail;
4518
  gfc_intrinsic_sym* isym;
4519
  va_list ap;
4520
  unsigned i;
4521
 
4522
  isym = gfc_find_function (name);
4523
  gcc_assert (isym);
4524
 
4525
  result = gfc_get_expr ();
4526
  result->expr_type = EXPR_FUNCTION;
4527
  result->ts = isym->ts;
4528
  result->where = where;
4529
  result->value.function.name = name;
4530
  result->value.function.isym = isym;
4531
 
4532
  result->symtree = gfc_find_symtree (gfc_current_ns->sym_root, name);
4533
  gcc_assert (result->symtree
4534
              && (result->symtree->n.sym->attr.flavor == FL_PROCEDURE
4535
                  || result->symtree->n.sym->attr.flavor == FL_UNKNOWN));
4536
 
4537
  va_start (ap, numarg);
4538
  atail = NULL;
4539
  for (i = 0; i < numarg; ++i)
4540
    {
4541
      if (atail)
4542
        {
4543
          atail->next = gfc_get_actual_arglist ();
4544
          atail = atail->next;
4545
        }
4546
      else
4547
        atail = result->value.function.actual = gfc_get_actual_arglist ();
4548
 
4549
      atail->expr = va_arg (ap, gfc_expr*);
4550
    }
4551
  va_end (ap);
4552
 
4553
  return result;
4554
}
4555
 
4556
 
4557
/* Check if an expression may appear in a variable definition context
4558
   (F2008, 16.6.7) or pointer association context (F2008, 16.6.8).
4559
   This is called from the various places when resolving
4560
   the pieces that make up such a context.
4561
 
4562
   Optionally, a possible error message can be suppressed if context is NULL
4563
   and just the return status (SUCCESS / FAILURE) be requested.  */
4564
 
4565
gfc_try
4566
gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj,
4567
                          const char* context)
4568
{
4569
  gfc_symbol* sym = NULL;
4570
  bool is_pointer;
4571
  bool check_intentin;
4572
  bool ptr_component;
4573
  symbol_attribute attr;
4574
  gfc_ref* ref;
4575
 
4576
  if (e->expr_type == EXPR_VARIABLE)
4577
    {
4578
      gcc_assert (e->symtree);
4579
      sym = e->symtree->n.sym;
4580
    }
4581
  else if (e->expr_type == EXPR_FUNCTION)
4582
    {
4583
      gcc_assert (e->symtree);
4584
      sym = e->value.function.esym ? e->value.function.esym : e->symtree->n.sym;
4585
    }
4586
 
4587
  attr = gfc_expr_attr (e);
4588
  if (!pointer && e->expr_type == EXPR_FUNCTION && attr.pointer)
4589
    {
4590
      if (!(gfc_option.allow_std & GFC_STD_F2008))
4591
        {
4592
          if (context)
4593
            gfc_error ("Fortran 2008: Pointer functions in variable definition"
4594
                       " context (%s) at %L", context, &e->where);
4595
          return FAILURE;
4596
        }
4597
    }
4598
  else if (e->expr_type != EXPR_VARIABLE)
4599
    {
4600
      if (context)
4601
        gfc_error ("Non-variable expression in variable definition context (%s)"
4602
                   " at %L", context, &e->where);
4603
      return FAILURE;
4604
    }
4605
 
4606
  if (!pointer && sym->attr.flavor == FL_PARAMETER)
4607
    {
4608
      if (context)
4609
        gfc_error ("Named constant '%s' in variable definition context (%s)"
4610
                   " at %L", sym->name, context, &e->where);
4611
      return FAILURE;
4612
    }
4613
  if (!pointer && sym->attr.flavor != FL_VARIABLE
4614
      && !(sym->attr.flavor == FL_PROCEDURE && sym == sym->result)
4615
      && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
4616
    {
4617
      if (context)
4618
        gfc_error ("'%s' in variable definition context (%s) at %L is not"
4619
                   " a variable", sym->name, context, &e->where);
4620
      return FAILURE;
4621
    }
4622
 
4623
  /* Find out whether the expr is a pointer; this also means following
4624
     component references to the last one.  */
4625
  is_pointer = (attr.pointer || attr.proc_pointer);
4626
  if (pointer && !is_pointer)
4627
    {
4628
      if (context)
4629
        gfc_error ("Non-POINTER in pointer association context (%s)"
4630
                   " at %L", context, &e->where);
4631
      return FAILURE;
4632
    }
4633
 
4634
  /* F2008, C1303.  */
4635
  if (!alloc_obj
4636
      && (attr.lock_comp
4637
          || (e->ts.type == BT_DERIVED
4638
              && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
4639
              && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)))
4640
    {
4641
      if (context)
4642
        gfc_error ("LOCK_TYPE in variable definition context (%s) at %L",
4643
                   context, &e->where);
4644
      return FAILURE;
4645
    }
4646
 
4647
  /* INTENT(IN) dummy argument.  Check this, unless the object itself is
4648
     the component of sub-component of a pointer.  Obviously,
4649
     procedure pointers are of no interest here.  */
4650
  check_intentin = true;
4651
  ptr_component = sym->attr.pointer;
4652
  for (ref = e->ref; ref && check_intentin; ref = ref->next)
4653
    {
4654
      if (ptr_component && ref->type == REF_COMPONENT)
4655
        check_intentin = false;
4656
      if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
4657
        ptr_component = true;
4658
    }
4659
  if (check_intentin && sym->attr.intent == INTENT_IN)
4660
    {
4661
      if (pointer && is_pointer)
4662
        {
4663
          if (context)
4664
            gfc_error ("Dummy argument '%s' with INTENT(IN) in pointer"
4665
                       " association context (%s) at %L",
4666
                       sym->name, context, &e->where);
4667
          return FAILURE;
4668
        }
4669
      if (!pointer && !is_pointer && !sym->attr.pointer)
4670
        {
4671
          if (context)
4672
            gfc_error ("Dummy argument '%s' with INTENT(IN) in variable"
4673
                       " definition context (%s) at %L",
4674
                       sym->name, context, &e->where);
4675
          return FAILURE;
4676
        }
4677
    }
4678
 
4679
  /* PROTECTED and use-associated.  */
4680
  if (sym->attr.is_protected && sym->attr.use_assoc  && check_intentin)
4681
    {
4682
      if (pointer && is_pointer)
4683
        {
4684
          if (context)
4685
            gfc_error ("Variable '%s' is PROTECTED and can not appear in a"
4686
                       " pointer association context (%s) at %L",
4687
                       sym->name, context, &e->where);
4688
          return FAILURE;
4689
        }
4690
      if (!pointer && !is_pointer)
4691
        {
4692
          if (context)
4693
            gfc_error ("Variable '%s' is PROTECTED and can not appear in a"
4694
                       " variable definition context (%s) at %L",
4695
                       sym->name, context, &e->where);
4696
          return FAILURE;
4697
        }
4698
    }
4699
 
4700
  /* Variable not assignable from a PURE procedure but appears in
4701
     variable definition context.  */
4702
  if (!pointer && gfc_pure (NULL) && gfc_impure_variable (sym))
4703
    {
4704
      if (context)
4705
        gfc_error ("Variable '%s' can not appear in a variable definition"
4706
                   " context (%s) at %L in PURE procedure",
4707
                   sym->name, context, &e->where);
4708
      return FAILURE;
4709
    }
4710
 
4711
  if (!pointer && context && gfc_implicit_pure (NULL)
4712
      && gfc_impure_variable (sym))
4713
    {
4714
      gfc_namespace *ns;
4715
      gfc_symbol *sym;
4716
 
4717
      for (ns = gfc_current_ns; ns; ns = ns->parent)
4718
        {
4719
          sym = ns->proc_name;
4720
          if (sym == NULL)
4721
            break;
4722
          if (sym->attr.flavor == FL_PROCEDURE)
4723
            {
4724
              sym->attr.implicit_pure = 0;
4725
              break;
4726
            }
4727
        }
4728
    }
4729
  /* Check variable definition context for associate-names.  */
4730
  if (!pointer && sym->assoc)
4731
    {
4732
      const char* name;
4733
      gfc_association_list* assoc;
4734
 
4735
      gcc_assert (sym->assoc->target);
4736
 
4737
      /* If this is a SELECT TYPE temporary (the association is used internally
4738
         for SELECT TYPE), silently go over to the target.  */
4739
      if (sym->attr.select_type_temporary)
4740
        {
4741
          gfc_expr* t = sym->assoc->target;
4742
 
4743
          gcc_assert (t->expr_type == EXPR_VARIABLE);
4744
          name = t->symtree->name;
4745
 
4746
          if (t->symtree->n.sym->assoc)
4747
            assoc = t->symtree->n.sym->assoc;
4748
          else
4749
            assoc = sym->assoc;
4750
        }
4751
      else
4752
        {
4753
          name = sym->name;
4754
          assoc = sym->assoc;
4755
        }
4756
      gcc_assert (name && assoc);
4757
 
4758
      /* Is association to a valid variable?  */
4759
      if (!assoc->variable)
4760
        {
4761
          if (context)
4762
            {
4763
              if (assoc->target->expr_type == EXPR_VARIABLE)
4764
                gfc_error ("'%s' at %L associated to vector-indexed target can"
4765
                           " not be used in a variable definition context (%s)",
4766
                           name, &e->where, context);
4767
              else
4768
                gfc_error ("'%s' at %L associated to expression can"
4769
                           " not be used in a variable definition context (%s)",
4770
                           name, &e->where, context);
4771
            }
4772
          return FAILURE;
4773
        }
4774
 
4775
      /* Target must be allowed to appear in a variable definition context.  */
4776
      if (gfc_check_vardef_context (assoc->target, pointer, false, NULL)
4777
          == FAILURE)
4778
        {
4779
          if (context)
4780
            gfc_error ("Associate-name '%s' can not appear in a variable"
4781
                       " definition context (%s) at %L because its target"
4782
                       " at %L can not, either",
4783
                       name, context, &e->where,
4784
                       &assoc->target->where);
4785
          return FAILURE;
4786
        }
4787
    }
4788
 
4789
  return SUCCESS;
4790
}

powered by: WebSVN 2.1.0

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