expr.c 121 KB
Newer Older
1
/* Routines for manipulation of expression nodes.
Jakub Jelinek committed
2
   Copyright (C) 2000-2015 Free Software Foundation, Inc.
3 4
   Contributed by Andy Vaught

5
This file is part of GCC.
6

7 8
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
9
Software Foundation; either version 3, or (at your option) any later
10
version.
11

12 13 14 15
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
16 17

You should have received a copy of the GNU General Public License
18 19
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
20 21

#include "config.h"
22
#include "system.h"
23
#include "coretypes.h"
24
#include "flags.h"
25 26 27
#include "gfortran.h"
#include "arith.h"
#include "match.h"
28
#include "target-memory.h" /* for gfc_convert_boz */
Jerry DeLisle committed
29
#include "constructor.h"
30

Jerry DeLisle committed
31 32 33 34 35 36 37 38 39 40 41

/* The following set of functions provide access to gfc_expr* of
   various types - actual all but EXPR_FUNCTION and EXPR_VARIABLE.

   There are two functions available elsewhere that provide
   slightly different flavours of variables.  Namely:
     expr.c (gfc_get_variable_expr)
     symbol.c (gfc_lval_expr_from_sym)
   TODO: Merge these functions, if possible.  */

/* Get a new expression node.  */
42 43 44 45 46 47

gfc_expr *
gfc_get_expr (void)
{
  gfc_expr *e;

48
  e = XCNEW (gfc_expr);
49 50 51 52 53 54 55 56
  gfc_clear_ts (&e->ts);
  e->shape = NULL;
  e->ref = NULL;
  e->symtree = NULL;
  return e;
}


Jerry DeLisle committed
57 58
/* Get a new expression node that is an array constructor
   of given type and kind.  */
59

Jerry DeLisle committed
60 61
gfc_expr *
gfc_get_array_expr (bt type, int kind, locus *where)
62
{
Jerry DeLisle committed
63
  gfc_expr *e;
64

Jerry DeLisle committed
65 66 67 68 69 70 71 72 73 74 75 76
  e = gfc_get_expr ();
  e->expr_type = EXPR_ARRAY;
  e->value.constructor = NULL;
  e->rank = 1;
  e->shape = NULL;

  e->ts.type = type;
  e->ts.kind = kind;
  if (where)
    e->where = *where;

  return e;
77 78 79
}


Jerry DeLisle committed
80
/* Get a new expression node that is the NULL expression.  */
81

Jerry DeLisle committed
82 83
gfc_expr *
gfc_get_null_expr (locus *where)
84
{
Jerry DeLisle committed
85
  gfc_expr *e;
86

Jerry DeLisle committed
87 88 89
  e = gfc_get_expr ();
  e->expr_type = EXPR_NULL;
  e->ts.type = BT_UNKNOWN;
90

Jerry DeLisle committed
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
  if (where)
    e->where = *where;

  return e;
}


/* Get a new expression node that is an operator expression node.  */

gfc_expr *
gfc_get_operator_expr (locus *where, gfc_intrinsic_op op,
                      gfc_expr *op1, gfc_expr *op2)
{
  gfc_expr *e;

  e = gfc_get_expr ();
  e->expr_type = EXPR_OP;
  e->value.op.op = op;
  e->value.op.op1 = op1;
  e->value.op.op2 = op2;

  if (where)
    e->where = *where;

  return e;
}


/* Get a new expression node that is an structure constructor
   of given type and kind.  */

gfc_expr *
gfc_get_structure_constructor_expr (bt type, int kind, locus *where)
{
  gfc_expr *e;

  e = gfc_get_expr ();
  e->expr_type = EXPR_STRUCTURE;
  e->value.constructor = NULL;

  e->ts.type = type;
  e->ts.kind = kind;
  if (where)
    e->where = *where;

  return e;
}


/* Get a new expression node that is an constant of given type and kind.  */

gfc_expr *
gfc_get_constant_expr (bt type, int kind, locus *where)
{
  gfc_expr *e;

  if (!where)
148 149
    gfc_internal_error ("gfc_get_constant_expr(): locus %<where%> cannot be "
			"NULL");
Jerry DeLisle committed
150 151 152 153 154 155 156 157 158

  e = gfc_get_expr ();

  e->expr_type = EXPR_CONSTANT;
  e->ts.type = type;
  e->ts.kind = kind;
  e->where = *where;

  switch (type)
159
    {
Jerry DeLisle committed
160 161 162
    case BT_INTEGER:
      mpz_init (e->value.integer);
      break;
163

Jerry DeLisle committed
164 165 166 167
    case BT_REAL:
      gfc_set_model_kind (kind);
      mpfr_init (e->value.real);
      break;
168

Jerry DeLisle committed
169 170 171 172
    case BT_COMPLEX:
      gfc_set_model_kind (kind);
      mpc_init2 (e->value.complex, mpfr_get_default_prec());
      break;
173

Jerry DeLisle committed
174 175
    default:
      break;
176 177
    }

Jerry DeLisle committed
178
  return e;
179 180 181
}


Jerry DeLisle committed
182 183 184
/* Get a new expression node that is an string constant.
   If no string is passed, a string of len is allocated,
   blanked and null-terminated.  */
185

Jerry DeLisle committed
186 187
gfc_expr *
gfc_get_character_expr (int kind, locus *where, const char *src, int len)
188
{
Jerry DeLisle committed
189 190
  gfc_expr *e;
  gfc_char_t *dest;
191

Jerry DeLisle committed
192
  if (!src)
193
    {
Jerry DeLisle committed
194 195 196 197 198 199
      dest = gfc_get_wide_string (len + 1);
      gfc_wide_memset (dest, ' ', len);
      dest[len] = '\0';
    }
  else
    dest = gfc_char_to_widechar (src);
200

Jerry DeLisle committed
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
  e = gfc_get_constant_expr (BT_CHARACTER, kind,
                            where ? where : &gfc_current_locus);
  e->value.character.string = dest;
  e->value.character.length = len;

  return e;
}


/* Get a new expression node that is an integer constant.  */

gfc_expr *
gfc_get_int_expr (int kind, locus *where, int value)
{
  gfc_expr *p;
  p = gfc_get_constant_expr (BT_INTEGER, kind,
			     where ? where : &gfc_current_locus);

219
  mpz_set_si (p->value.integer, value);
Jerry DeLisle committed
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286

  return p;
}


/* Get a new expression node that is a logical constant.  */

gfc_expr *
gfc_get_logical_expr (int kind, locus *where, bool value)
{
  gfc_expr *p;
  p = gfc_get_constant_expr (BT_LOGICAL, kind,
			     where ? where : &gfc_current_locus);

  p->value.logical = value;

  return p;
}


gfc_expr *
gfc_get_iokind_expr (locus *where, io_kind k)
{
  gfc_expr *e;

  /* Set the types to something compatible with iokind. This is needed to
     get through gfc_free_expr later since iokind really has no Basic Type,
     BT, of its own.  */

  e = gfc_get_expr ();
  e->expr_type = EXPR_CONSTANT;
  e->ts.type = BT_LOGICAL;
  e->value.iokind = k;
  e->where = *where;

  return e;
}


/* Given an expression pointer, return a copy of the expression.  This
   subroutine is recursive.  */

gfc_expr *
gfc_copy_expr (gfc_expr *p)
{
  gfc_expr *q;
  gfc_char_t *s;
  char *c;

  if (p == NULL)
    return NULL;

  q = gfc_get_expr ();
  *q = *p;

  switch (q->expr_type)
    {
    case EXPR_SUBSTRING:
      s = gfc_get_wide_string (p->value.character.length + 1);
      q->value.character.string = s;
      memcpy (s, p->value.character.string,
	      (p->value.character.length + 1) * sizeof (gfc_char_t));
      break;

    case EXPR_CONSTANT:
      /* Copy target representation, if it exists.  */
      if (p->representation.string)
287
	{
Jerry DeLisle committed
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316
	  c = XCNEWVEC (char, p->representation.length + 1);
	  q->representation.string = c;
	  memcpy (c, p->representation.string, (p->representation.length + 1));
	}

      /* Copy the values of any pointer components of p->value.  */
      switch (q->ts.type)
	{
	case BT_INTEGER:
	  mpz_init_set (q->value.integer, p->value.integer);
	  break;

	case BT_REAL:
	  gfc_set_model_kind (q->ts.kind);
	  mpfr_init (q->value.real);
	  mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
	  break;

	case BT_COMPLEX:
	  gfc_set_model_kind (q->ts.kind);
	  mpc_init2 (q->value.complex, mpfr_get_default_prec());
	  mpc_set (q->value.complex, p->value.complex, GFC_MPC_RND_MODE);
	  break;

	case BT_CHARACTER:
	  if (p->representation.string)
	    q->value.character.string
	      = gfc_char_to_widechar (q->representation.string);
	  else
317
	    {
Jerry DeLisle committed
318 319
	      s = gfc_get_wide_string (p->value.character.length + 1);
	      q->value.character.string = s;
320

Jerry DeLisle committed
321 322 323 324 325 326 327 328 329 330 331 332 333
	      /* This is the case for the C_NULL_CHAR named constant.  */
	      if (p->value.character.length == 0
		  && (p->ts.is_c_interop || p->ts.is_iso_c))
		{
		  *s = '\0';
		  /* Need to set the length to 1 to make sure the NUL
		     terminator is copied.  */
		  q->value.character.length = 1;
		}
	      else
		memcpy (s, p->value.character.string,
			(p->value.character.length + 1) * sizeof (gfc_char_t));
	    }
334 335
	  break;

Jerry DeLisle committed
336 337 338 339
	case BT_HOLLERITH:
	case BT_LOGICAL:
	case BT_DERIVED:
	case BT_CLASS:
340
	case BT_ASSUMED:
Jerry DeLisle committed
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
	  break;		/* Already done.  */

	case BT_PROCEDURE:
        case BT_VOID:
           /* Should never be reached.  */
	case BT_UNKNOWN:
	  gfc_internal_error ("gfc_copy_expr(): Bad expr node");
	  /* Not reached.  */
	}

      break;

    case EXPR_OP:
      switch (q->value.op.op)
	{
	case INTRINSIC_NOT:
	case INTRINSIC_PARENTHESES:
	case INTRINSIC_UPLUS:
	case INTRINSIC_UMINUS:
	  q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
361 362
	  break;

Jerry DeLisle committed
363 364 365
	default:		/* Binary operators.  */
	  q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
	  q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
366 367 368
	  break;
	}

Jerry DeLisle committed
369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390
      break;

    case EXPR_FUNCTION:
      q->value.function.actual =
	gfc_copy_actual_arglist (p->value.function.actual);
      break;

    case EXPR_COMPCALL:
    case EXPR_PPC:
      q->value.compcall.actual =
	gfc_copy_actual_arglist (p->value.compcall.actual);
      q->value.compcall.tbp = p->value.compcall.tbp;
      break;

    case EXPR_STRUCTURE:
    case EXPR_ARRAY:
      q->value.constructor = gfc_constructor_copy (p->value.constructor);
      break;

    case EXPR_VARIABLE:
    case EXPR_NULL:
      break;
391
    }
Jerry DeLisle committed
392 393 394 395 396 397

  q->shape = gfc_copy_shape (p->shape, p->rank);

  q->ref = gfc_copy_ref (p->ref);

  return q;
398 399 400
}


401 402 403 404 405 406 407 408 409 410 411 412 413
void
gfc_clear_shape (mpz_t *shape, int rank)
{
  int i;

  for (i = 0; i < rank; i++)
    mpz_clear (shape[i]);
}


void
gfc_free_shape (mpz_t **shape, int rank)
{
414 415 416
  if (*shape == NULL)
    return;

417 418 419 420 421 422
  gfc_clear_shape (*shape, rank);
  free (*shape);
  *shape = NULL;
}


423 424 425 426 427 428
/* Workhorse function for gfc_free_expr() that frees everything
   beneath an expression node, but not the node itself.  This is
   useful when we want to simplify a node and replace it with
   something else or the expression node belongs to another structure.  */

static void
429
free_expr0 (gfc_expr *e)
430 431 432 433
{
  switch (e->expr_type)
    {
    case EXPR_CONSTANT:
434
      /* Free any parts of the value that need freeing.  */
435 436 437 438 439 440 441
      switch (e->ts.type)
	{
	case BT_INTEGER:
	  mpz_clear (e->value.integer);
	  break;

	case BT_REAL:
442
	  mpfr_clear (e->value.real);
443 444 445
	  break;

	case BT_CHARACTER:
446
	  free (e->value.character.string);
447 448 449
	  break;

	case BT_COMPLEX:
450
	  mpc_clear (e->value.complex);
451 452 453 454 455 456
	  break;

	default:
	  break;
	}

457
      /* Free the representation.  */
458
      free (e->representation.string);
459

460 461 462
      break;

    case EXPR_OP:
463 464 465 466
      if (e->value.op.op1 != NULL)
	gfc_free_expr (e->value.op.op1);
      if (e->value.op.op2 != NULL)
	gfc_free_expr (e->value.op.op2);
467 468 469 470 471 472
      break;

    case EXPR_FUNCTION:
      gfc_free_actual_arglist (e->value.function.actual);
      break;

473
    case EXPR_COMPCALL:
474
    case EXPR_PPC:
475 476 477
      gfc_free_actual_arglist (e->value.compcall.actual);
      break;

478 479 480 481 482
    case EXPR_VARIABLE:
      break;

    case EXPR_ARRAY:
    case EXPR_STRUCTURE:
Jerry DeLisle committed
483
      gfc_constructor_free (e->value.constructor);
484 485 486
      break;

    case EXPR_SUBSTRING:
487
      free (e->value.character.string);
488 489 490 491 492 493 494 495 496 497
      break;

    case EXPR_NULL:
      break;

    default:
      gfc_internal_error ("free_expr0(): Bad expr type");
    }

  /* Free a shape array.  */
498
  gfc_free_shape (&e->shape, e->rank);
Jerry DeLisle committed
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513

  gfc_free_ref_list (e->ref);

  memset (e, '\0', sizeof (gfc_expr));
}


/* Free an expression node and everything beneath it.  */

void
gfc_free_expr (gfc_expr *e)
{
  if (e == NULL)
    return;
  free_expr0 (e);
514
  free (e);
Jerry DeLisle committed
515 516 517 518 519 520 521 522 523 524 525 526 527 528
}


/* Free an argument list and everything below it.  */

void
gfc_free_actual_arglist (gfc_actual_arglist *a1)
{
  gfc_actual_arglist *a2;

  while (a1)
    {
      a2 = a1->next;
      gfc_free_expr (a1->expr);
529
      free (a1);
Jerry DeLisle committed
530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
      a1 = a2;
    }
}


/* Copy an arglist structure and all of the arguments.  */

gfc_actual_arglist *
gfc_copy_actual_arglist (gfc_actual_arglist *p)
{
  gfc_actual_arglist *head, *tail, *new_arg;

  head = tail = NULL;

  for (; p; p = p->next)
    {
      new_arg = gfc_get_actual_arglist ();
      *new_arg = *p;

      new_arg->expr = gfc_copy_expr (p->expr);
      new_arg->next = NULL;

      if (head == NULL)
	head = new_arg;
      else
	tail->next = new_arg;

      tail = new_arg;
    }

  return head;
}


/* Free a list of reference structures.  */

void
gfc_free_ref_list (gfc_ref *p)
{
  gfc_ref *q;
  int i;

  for (; p; p = q)
    {
      q = p->next;
575

Jerry DeLisle committed
576 577 578 579 580 581 582 583 584
      switch (p->type)
	{
	case REF_ARRAY:
	  for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
	    {
	      gfc_free_expr (p->u.ar.start[i]);
	      gfc_free_expr (p->u.ar.end[i]);
	      gfc_free_expr (p->u.ar.stride[i]);
	    }
585

Jerry DeLisle committed
586
	  break;
587

Jerry DeLisle committed
588 589 590 591
	case REF_SUBSTRING:
	  gfc_free_expr (p->u.ss.start);
	  gfc_free_expr (p->u.ss.end);
	  break;
592

Jerry DeLisle committed
593 594 595
	case REF_COMPONENT:
	  break;
	}
596

597
      free (p);
Jerry DeLisle committed
598
    }
599 600 601 602 603 604
}


/* Graft the *src expression onto the *dest subexpression.  */

void
605
gfc_replace_expr (gfc_expr *dest, gfc_expr *src)
606 607 608
{
  free_expr0 (dest);
  *dest = *src;
609
  free (src);
610 611 612 613 614
}


/* Try to extract an integer constant from the passed expression node.
   Returns an error message or NULL if the result is set.  It is
615
   tempting to generate an error and return true or false, but
616 617 618
   failure is OK for some callers.  */

const char *
619
gfc_extract_int (gfc_expr *expr, int *result)
620 621
{
  if (expr->expr_type != EXPR_CONSTANT)
622
    return _("Constant expression required at %C");
623 624

  if (expr->ts.type != BT_INTEGER)
625
    return _("Integer expression required at %C");
626 627 628 629

  if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
      || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
    {
630
      return _("Integer value too large in expression at %C");
631 632 633 634 635 636 637 638 639 640
    }

  *result = (int) mpz_get_si (expr->value.integer);

  return NULL;
}


/* Recursively copy a list of reference structures.  */

641 642
gfc_ref *
gfc_copy_ref (gfc_ref *src)
643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
{
  gfc_array_ref *ar;
  gfc_ref *dest;

  if (src == NULL)
    return NULL;

  dest = gfc_get_ref ();
  dest->type = src->type;

  switch (src->type)
    {
    case REF_ARRAY:
      ar = gfc_copy_array_ref (&src->u.ar);
      dest->u.ar = *ar;
658
      free (ar);
659 660 661 662 663 664 665 666 667 668 669 670 671
      break;

    case REF_COMPONENT:
      dest->u.c = src->u.c;
      break;

    case REF_SUBSTRING:
      dest->u.ss = src->u.ss;
      dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
      dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
      break;
    }

672
  dest->next = gfc_copy_ref (src->next);
673 674 675 676 677

  return dest;
}


678
/* Detect whether an expression has any vector index array references.  */
679 680 681 682

int
gfc_has_vector_index (gfc_expr *e)
{
683
  gfc_ref *ref;
684 685 686 687 688 689 690 691 692 693
  int i;
  for (ref = e->ref; ref; ref = ref->next)
    if (ref->type == REF_ARRAY)
      for (i = 0; i < ref->u.ar.dimen; i++)
	if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
	  return 1;
  return 0;
}


694 695 696
/* Copy a shape array.  */

mpz_t *
697
gfc_copy_shape (mpz_t *shape, int rank)
698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713
{
  mpz_t *new_shape;
  int n;

  if (shape == NULL)
    return NULL;

  new_shape = gfc_get_shape (rank);

  for (n = 0; n < rank; n++)
    mpz_init_set (new_shape[n], shape[n]);

  return new_shape;
}


714
/* Copy a shape array excluding dimension N, where N is an integer
715
   constant expression.  Dimensions are numbered in Fortran style --
716 717 718 719 720 721 722 723
   starting with ONE.

   So, if the original shape array contains R elements
      { s1 ... sN-1  sN  sN+1 ... sR-1 sR}
   the result contains R-1 elements:
      { s1 ... sN-1  sN+1    ...  sR-1}

   If anything goes wrong -- N is not a constant, its value is out
724
   of range -- or anything else, just returns NULL.  */
725 726

mpz_t *
727
gfc_copy_shape_excluding (mpz_t *shape, int rank, gfc_expr *dim)
728 729 730 731
{
  mpz_t *new_shape, *s;
  int i, n;

732
  if (shape == NULL
733 734
      || rank <= 1
      || dim == NULL
735
      || dim->expr_type != EXPR_CONSTANT
736 737 738 739
      || dim->ts.type != BT_INTEGER)
    return NULL;

  n = mpz_get_si (dim->value.integer);
740
  n--; /* Convert to zero based index.  */
741
  if (n < 0 || n >= rank)
742 743
    return NULL;

744
  s = new_shape = gfc_get_shape (rank - 1);
745 746 747 748

  for (i = 0; i < rank; i++)
    {
      if (i == n)
749
	continue;
750 751 752 753 754 755 756
      mpz_init_set (*s, shape[i]);
      s++;
    }

  return new_shape;
}

757

758 759 760 761
/* Return the maximum kind of two expressions.  In general, higher
   kind numbers mean more precision for numeric types.  */

int
762
gfc_kind_max (gfc_expr *e1, gfc_expr *e2)
763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779
{
  return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
}


/* Returns nonzero if the type is numeric, zero otherwise.  */

static int
numeric_type (bt type)
{
  return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
}


/* Returns nonzero if the typespec is a numeric type, zero otherwise.  */

int
780
gfc_numeric_ts (gfc_typespec *ts)
781 782 783 784 785 786 787 788 789 790
{
  return numeric_type (ts->type);
}


/* Return an expression node with an optional argument list attached.
   A variable number of gfc_expr pointers are strung together in an
   argument list with a NULL pointer terminating the list.  */

gfc_expr *
791
gfc_build_conversion (gfc_expr *e)
792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808
{
  gfc_expr *p;

  p = gfc_get_expr ();
  p->expr_type = EXPR_FUNCTION;
  p->symtree = NULL;
  p->value.function.actual = NULL;

  p->value.function.actual = gfc_get_actual_arglist ();
  p->value.function.actual->expr = e;

  return p;
}


/* Given an expression node with some sort of numeric binary
   expression, insert type conversions required to make the operands
809 810
   have the same type. Conversion warnings are disabled if wconversion
   is set to 0.
811 812 813 814

   The exception is that the operands of an exponential don't have to
   have the same type.  If possible, the base is promoted to the type
   of the exponent.  For example, 1**2.3 becomes 1.0**2.3, but
815
   1.0**2 stays as it is.  */
816 817

void
818
gfc_type_convert_binary (gfc_expr *e, int wconversion)
819 820 821
{
  gfc_expr *op1, *op2;

822 823
  op1 = e->value.op.op1;
  op2 = e->value.op.op2;
824 825 826 827 828 829 830 831 832 833 834 835

  if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
    {
      gfc_clear_ts (&e->ts);
      return;
    }

  /* Kind conversions of same type.  */
  if (op1->ts.type == op2->ts.type)
    {
      if (op1->ts.kind == op2->ts.kind)
	{
836
	  /* No type conversions.  */
837 838 839 840 841
	  e->ts = op1->ts;
	  goto done;
	}

      if (op1->ts.kind > op2->ts.kind)
842
	gfc_convert_type_warn (op2, &op1->ts, 2, wconversion);
843
      else
844
	gfc_convert_type_warn (op1, &op2->ts, 2, wconversion);
845 846 847 848 849 850 851 852 853 854

      e->ts = op1->ts;
      goto done;
    }

  /* Integer combined with real or complex.  */
  if (op2->ts.type == BT_INTEGER)
    {
      e->ts = op1->ts;

855
      /* Special case for ** operator.  */
856
      if (e->value.op.op == INTRINSIC_POWER)
857 858
	goto done;

859
      gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
860 861 862 863 864 865
      goto done;
    }

  if (op1->ts.type == BT_INTEGER)
    {
      e->ts = op2->ts;
866
      gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
867 868 869 870 871 872 873 874 875 876
      goto done;
    }

  /* Real combined with complex.  */
  e->ts.type = BT_COMPLEX;
  if (op1->ts.kind > op2->ts.kind)
    e->ts.kind = op1->ts.kind;
  else
    e->ts.kind = op2->ts.kind;
  if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
877
    gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
878
  if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
879
    gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
880 881 882 883 884 885 886 887 888 889

done:
  return;
}


/* Function to determine if an expression is constant or not.  This
   function expects that the expression has already been simplified.  */

int
890
gfc_is_constant_expr (gfc_expr *e)
891 892 893
{
  gfc_constructor *c;
  gfc_actual_arglist *arg;
894
  gfc_symbol *sym;
895 896 897 898 899 900 901

  if (e == NULL)
    return 1;

  switch (e->expr_type)
    {
    case EXPR_OP:
Jerry DeLisle committed
902 903 904
      return (gfc_is_constant_expr (e->value.op.op1)
	      && (e->value.op.op2 == NULL
		  || gfc_is_constant_expr (e->value.op.op2)));
905 906

    case EXPR_VARIABLE:
Jerry DeLisle committed
907
      return 0;
908 909

    case EXPR_FUNCTION:
910 911
    case EXPR_PPC:
    case EXPR_COMPCALL:
912 913 914
      gcc_assert (e->symtree || e->value.function.esym
		  || e->value.function.isym);

915 916 917 918
      /* Call to intrinsic with at least one argument.  */
      if (e->value.function.isym && e->value.function.actual)
	{
	  for (arg = e->value.function.actual; arg; arg = arg->next)
Jerry DeLisle committed
919 920
	    if (!gfc_is_constant_expr (arg->expr))
	      return 0;
921
	}
922 923 924

      /* Specification functions are constant.  */
      /* F95, 7.1.6.2; F2003, 7.1.7  */
925 926 927 928 929 930
      sym = NULL;
      if (e->symtree)
	sym = e->symtree->n.sym;
      if (e->value.function.esym)
	sym = e->value.function.esym;

931 932 933 934 935 936 937 938
      if (sym
	  && sym->attr.function
	  && sym->attr.pure
	  && !sym->attr.intrinsic
	  && !sym->attr.recursive
	  && sym->attr.proc != PROC_INTERNAL
	  && sym->attr.proc != PROC_ST_FUNCTION
	  && sym->attr.proc != PROC_UNKNOWN
939
	  && gfc_sym_get_dummy_args (sym) == NULL)
940 941 942 943 944 945 946 947 948 949
	return 1;

      if (e->value.function.isym
	  && (e->value.function.isym->elemental
	      || e->value.function.isym->pure
	      || e->value.function.isym->inquiry
	      || e->value.function.isym->transformational))
	return 1;

      return 0;
950 951 952

    case EXPR_CONSTANT:
    case EXPR_NULL:
Jerry DeLisle committed
953
      return 1;
954 955

    case EXPR_SUBSTRING:
Jerry DeLisle committed
956 957
      return e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start)
				&& gfc_is_constant_expr (e->ref->u.ss.end));
958

959
    case EXPR_ARRAY:
960
    case EXPR_STRUCTURE:
961 962 963 964 965
      c = gfc_constructor_first (e->value.constructor);
      if ((e->expr_type == EXPR_ARRAY) && c && c->iterator)
        return gfc_constant_ac (e);

      for (; c; c = gfc_constructor_next (c))
966
	if (!gfc_is_constant_expr (c->expr))
Jerry DeLisle committed
967
	  return 0;
968

Jerry DeLisle committed
969
      return 1;
970 971 972 973


    default:
      gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
Jerry DeLisle committed
974
      return 0;
975 976 977 978
    }
}


979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007
/* Is true if an array reference is followed by a component or substring
   reference.  */
bool
is_subref_array (gfc_expr * e)
{
  gfc_ref * ref;
  bool seen_array;

  if (e->expr_type != EXPR_VARIABLE)
    return false;

  if (e->symtree->n.sym->attr.subref_array_pointer)
    return true;

  seen_array = false;
  for (ref = e->ref; ref; ref = ref->next)
    {
      if (ref->type == REF_ARRAY
	    && ref->u.ar.type != AR_ELEMENT)
	seen_array = true;

      if (seen_array
	    && ref->type != REF_ARRAY)
	return seen_array;
    }
  return false;
}


1008 1009
/* Try to collapse intrinsic expressions.  */

1010
static bool
1011
simplify_intrinsic_op (gfc_expr *p, int type)
1012
{
1013
  gfc_intrinsic_op op;
1014 1015
  gfc_expr *op1, *op2, *result;

1016
  if (p->value.op.op == INTRINSIC_USER)
1017
    return true;
1018

1019 1020
  op1 = p->value.op.op1;
  op2 = p->value.op.op2;
1021
  op  = p->value.op.op;
1022

1023 1024 1025 1026
  if (!gfc_simplify_expr (op1, type))
    return false;
  if (!gfc_simplify_expr (op2, type))
    return false;
1027 1028 1029

  if (!gfc_is_constant_expr (op1)
      || (op2 != NULL && !gfc_is_constant_expr (op2)))
1030
    return true;
1031

1032
  /* Rip p apart.  */
1033 1034
  p->value.op.op1 = NULL;
  p->value.op.op2 = NULL;
1035

1036
  switch (op)
1037
    {
1038
    case INTRINSIC_PARENTHESES:
1039 1040 1041 1042
      result = gfc_parentheses (op1);
      break;

    case INTRINSIC_UPLUS:
1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074
      result = gfc_uplus (op1);
      break;

    case INTRINSIC_UMINUS:
      result = gfc_uminus (op1);
      break;

    case INTRINSIC_PLUS:
      result = gfc_add (op1, op2);
      break;

    case INTRINSIC_MINUS:
      result = gfc_subtract (op1, op2);
      break;

    case INTRINSIC_TIMES:
      result = gfc_multiply (op1, op2);
      break;

    case INTRINSIC_DIVIDE:
      result = gfc_divide (op1, op2);
      break;

    case INTRINSIC_POWER:
      result = gfc_power (op1, op2);
      break;

    case INTRINSIC_CONCAT:
      result = gfc_concat (op1, op2);
      break;

    case INTRINSIC_EQ:
1075 1076
    case INTRINSIC_EQ_OS:
      result = gfc_eq (op1, op2, op);
1077 1078 1079
      break;

    case INTRINSIC_NE:
1080 1081
    case INTRINSIC_NE_OS:
      result = gfc_ne (op1, op2, op);
1082 1083 1084
      break;

    case INTRINSIC_GT:
1085 1086
    case INTRINSIC_GT_OS:
      result = gfc_gt (op1, op2, op);
1087 1088 1089
      break;

    case INTRINSIC_GE:
1090 1091
    case INTRINSIC_GE_OS:
      result = gfc_ge (op1, op2, op);
1092 1093 1094
      break;

    case INTRINSIC_LT:
1095 1096
    case INTRINSIC_LT_OS:
      result = gfc_lt (op1, op2, op);
1097 1098 1099
      break;

    case INTRINSIC_LE:
1100 1101
    case INTRINSIC_LE_OS:
      result = gfc_le (op1, op2, op);
1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131
      break;

    case INTRINSIC_NOT:
      result = gfc_not (op1);
      break;

    case INTRINSIC_AND:
      result = gfc_and (op1, op2);
      break;

    case INTRINSIC_OR:
      result = gfc_or (op1, op2);
      break;

    case INTRINSIC_EQV:
      result = gfc_eqv (op1, op2);
      break;

    case INTRINSIC_NEQV:
      result = gfc_neqv (op1, op2);
      break;

    default:
      gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
    }

  if (result == NULL)
    {
      gfc_free_expr (op1);
      gfc_free_expr (op2);
1132
      return false;
1133 1134
    }

1135 1136
  result->rank = p->rank;
  result->where = p->where;
1137 1138
  gfc_replace_expr (p, result);

1139
  return true;
1140 1141 1142 1143 1144 1145
}


/* Subroutine to simplify constructor expressions.  Mutually recursive
   with gfc_simplify_expr().  */

1146
static bool
Jerry DeLisle committed
1147
simplify_constructor (gfc_constructor_base base, int type)
1148
{
Jerry DeLisle committed
1149
  gfc_constructor *c;
1150 1151
  gfc_expr *p;

Jerry DeLisle committed
1152
  for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
1153 1154
    {
      if (c->iterator
1155 1156 1157 1158
	  && (!gfc_simplify_expr(c->iterator->start, type)
	      || !gfc_simplify_expr (c->iterator->end, type)
	      || !gfc_simplify_expr (c->iterator->step, type)))
	return false;
1159

1160 1161 1162 1163 1164 1165 1166
      if (c->expr)
	{
	  /* Try and simplify a copy.  Replace the original if successful
	     but keep going through the constructor at all costs.  Not
	     doing so can make a dog's dinner of complicated things.  */
	  p = gfc_copy_expr (c->expr);

1167
	  if (!gfc_simplify_expr (p, type))
1168 1169 1170 1171 1172 1173 1174
	    {
	      gfc_free_expr (p);
	      continue;
	    }

	  gfc_replace_expr (c->expr, p);
	}
1175 1176
    }

1177
  return true;
1178 1179 1180 1181 1182
}


/* Pull a single array element out of an array constructor.  */

1183
static bool
Jerry DeLisle committed
1184
find_array_element (gfc_constructor_base base, gfc_array_ref *ar,
1185
		    gfc_constructor **rval)
1186 1187 1188 1189 1190
{
  unsigned long nelemen;
  int i;
  mpz_t delta;
  mpz_t offset;
1191 1192
  mpz_t span;
  mpz_t tmp;
Jerry DeLisle committed
1193
  gfc_constructor *cons;
1194
  gfc_expr *e;
1195
  bool t;
1196

1197
  t = true;
1198
  e = NULL;
1199 1200 1201

  mpz_init_set_ui (offset, 0);
  mpz_init (delta);
1202 1203
  mpz_init (tmp);
  mpz_init_set_ui (span, 1);
1204 1205
  for (i = 0; i < ar->dimen; i++)
    {
1206 1207
      if (!gfc_reduce_init_expr (ar->as->lower[i])
	  || !gfc_reduce_init_expr (ar->as->upper[i]))
1208
	{
1209
	  t = false;
1210 1211 1212 1213
	  cons = NULL;
	  goto depart;
	}

1214
      e = ar->start[i];
1215
      if (e->expr_type != EXPR_CONSTANT)
1216 1217
	{
	  cons = NULL;
1218
	  goto depart;
1219
	}
1220

1221 1222 1223
      gcc_assert (ar->as->upper[i]->expr_type == EXPR_CONSTANT
		  && ar->as->lower[i]->expr_type == EXPR_CONSTANT);

1224
      /* Check the bounds.  */
1225
      if ((ar->as->upper[i]
1226 1227
	   && mpz_cmp (e->value.integer,
		       ar->as->upper[i]->value.integer) > 0)
1228 1229
	  || (mpz_cmp (e->value.integer,
		       ar->as->lower[i]->value.integer) < 0))
1230
	{
1231
	  gfc_error ("Index in dimension %d is out of bounds "
1232 1233
		     "at %L", i + 1, &ar->c_where[i]);
	  cons = NULL;
1234
	  t = false;
1235 1236 1237
	  goto depart;
	}

1238
      mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
1239
      mpz_mul (delta, delta, span);
1240
      mpz_add (offset, offset, delta);
1241 1242 1243 1244 1245

      mpz_set_ui (tmp, 1);
      mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
      mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
      mpz_mul (span, span, tmp);
1246 1247
    }

Jerry DeLisle committed
1248 1249
  for (cons = gfc_constructor_first (base), nelemen = mpz_get_ui (offset);
       cons && nelemen > 0; cons = gfc_constructor_next (cons), nelemen--)
1250
    {
Jerry DeLisle committed
1251
      if (cons->iterator)
1252
	{
Jerry DeLisle committed
1253 1254
	  cons = NULL;
	  goto depart;
1255 1256
	}
    }
1257

1258
depart:
1259 1260
  mpz_clear (delta);
  mpz_clear (offset);
1261 1262
  mpz_clear (span);
  mpz_clear (tmp);
1263 1264
  *rval = cons;
  return t;
1265 1266 1267 1268 1269 1270
}


/* Find a component of a structure constructor.  */

static gfc_constructor *
Jerry DeLisle committed
1271
find_component_ref (gfc_constructor_base base, gfc_ref *ref)
1272
{
1273
  gfc_component *pick = ref->u.c.component;
Jerry DeLisle committed
1274
  gfc_constructor *c = gfc_constructor_first (base);
1275

1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289
  gfc_symbol *dt = ref->u.c.sym;
  int ext = dt->attr.extension;

  /* For extended types, check if the desired component is in one of the
   * parent types.  */
  while (ext > 0 && gfc_find_component (dt->components->ts.u.derived,
					pick->name, true, true))
    {
      dt = dt->components->ts.u.derived;
      c = gfc_constructor_first (c->expr->value.constructor);
      ext--;
    }

  gfc_component *comp = dt->components;
1290 1291 1292
  while (comp != pick)
    {
      comp = comp->next;
Jerry DeLisle committed
1293
      c = gfc_constructor_next (c);
1294 1295
    }

Jerry DeLisle committed
1296
  return c;
1297 1298 1299 1300 1301 1302 1303
}


/* Replace an expression with the contents of a constructor, removing
   the subobject reference in the process.  */

static void
1304
remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
1305 1306 1307
{
  gfc_expr *e;

1308 1309 1310 1311 1312 1313 1314
  if (cons)
    {
      e = cons->expr;
      cons->expr = NULL;
    }
  else
    e = gfc_copy_expr (p);
1315 1316 1317 1318 1319 1320
  e->ref = p->ref->next;
  p->ref->next =  NULL;
  gfc_replace_expr (p, e);
}


1321 1322
/* Pull an array section out of an array constructor.  */

1323
static bool
1324 1325 1326 1327 1328
find_array_section (gfc_expr *expr, gfc_ref *ref)
{
  int idx;
  int rank;
  int d;
1329
  int shape_i;
1330
  int limit;
1331
  long unsigned one = 1;
1332
  bool incr_ctr;
1333
  mpz_t start[GFC_MAX_DIMENSIONS];
1334 1335 1336 1337 1338 1339 1340 1341
  mpz_t end[GFC_MAX_DIMENSIONS];
  mpz_t stride[GFC_MAX_DIMENSIONS];
  mpz_t delta[GFC_MAX_DIMENSIONS];
  mpz_t ctr[GFC_MAX_DIMENSIONS];
  mpz_t delta_mpz;
  mpz_t tmp_mpz;
  mpz_t nelts;
  mpz_t ptr;
Jerry DeLisle committed
1342 1343
  gfc_constructor_base base;
  gfc_constructor *cons, *vecsub[GFC_MAX_DIMENSIONS];
1344 1345 1346 1347 1348
  gfc_expr *begin;
  gfc_expr *finish;
  gfc_expr *step;
  gfc_expr *upper;
  gfc_expr *lower;
1349
  bool t;
1350

1351
  t = true;
1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369

  base = expr->value.constructor;
  expr->value.constructor = NULL;

  rank = ref->u.ar.as->rank;

  if (expr->shape == NULL)
    expr->shape = gfc_get_shape (rank);

  mpz_init_set_ui (delta_mpz, one);
  mpz_init_set_ui (nelts, one);
  mpz_init (tmp_mpz);

  /* Do the initialization now, so that we can cleanup without
     keeping track of where we were.  */
  for (d = 0; d < rank; d++)
    {
      mpz_init (delta[d]);
1370
      mpz_init (start[d]);
1371 1372 1373
      mpz_init (end[d]);
      mpz_init (ctr[d]);
      mpz_init (stride[d]);
1374
      vecsub[d] = NULL;
1375 1376 1377
    }

  /* Build the counters to clock through the array reference.  */
1378
  shape_i = 0;
1379 1380 1381 1382 1383 1384 1385 1386 1387
  for (d = 0; d < rank; d++)
    {
      /* Make this stretch of code easier on the eye!  */
      begin = ref->u.ar.start[d];
      finish = ref->u.ar.end[d];
      step = ref->u.ar.stride[d];
      lower = ref->u.ar.as->lower[d];
      upper = ref->u.ar.as->upper[d];

1388
      if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR)  /* Vector subscript.  */
1389
	{
Jerry DeLisle committed
1390
	  gfc_constructor *ci;
1391
	  gcc_assert (begin);
Tobias Burnus committed
1392

1393
	  if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
Tobias Burnus committed
1394
	    {
1395
	      t = false;
Tobias Burnus committed
1396 1397 1398
	      goto cleanup;
	    }

1399
	  gcc_assert (begin->rank == 1);
1400
	  /* Zero-sized arrays have no shape and no elements, stop early.  */
1401
	  if (!begin->shape)
1402 1403 1404 1405
	    {
	      mpz_init_set_ui (nelts, 0);
	      break;
	    }
1406

Jerry DeLisle committed
1407
	  vecsub[d] = gfc_constructor_first (begin->value.constructor);
1408 1409 1410
	  mpz_set (ctr[d], vecsub[d]->expr->value.integer);
	  mpz_mul (nelts, nelts, begin->shape[0]);
	  mpz_set (expr->shape[shape_i++], begin->shape[0]);
1411

1412
	  /* Check bounds.  */
Jerry DeLisle committed
1413
	  for (ci = vecsub[d]; ci; ci = gfc_constructor_next (ci))
1414
	    {
Jerry DeLisle committed
1415 1416
	      if (mpz_cmp (ci->expr->value.integer, upper->value.integer) > 0
		  || mpz_cmp (ci->expr->value.integer,
1417
			      lower->value.integer) < 0)
1418 1419 1420
		{
		  gfc_error ("index in dimension %d is out of bounds "
			     "at %L", d + 1, &ref->u.ar.c_where[d]);
1421
		  t = false;
1422 1423 1424
		  goto cleanup;
		}
	    }
1425
	}
1426
      else
1427
	{
1428
	  if ((begin && begin->expr_type != EXPR_CONSTANT)
1429 1430
	      || (finish && finish->expr_type != EXPR_CONSTANT)
	      || (step && step->expr_type != EXPR_CONSTANT))
1431
	    {
1432
	      t = false;
1433 1434
	      goto cleanup;
	    }
1435

1436 1437 1438 1439 1440
	  /* Obtain the stride.  */
	  if (step)
	    mpz_set (stride[d], step->value.integer);
	  else
	    mpz_set_ui (stride[d], one);
1441

1442 1443
	  if (mpz_cmp_ui (stride[d], 0) == 0)
	    mpz_set_ui (stride[d], one);
1444

1445 1446 1447 1448 1449
	  /* Obtain the start value for the index.  */
	  if (begin)
	    mpz_set (start[d], begin->value.integer);
	  else
	    mpz_set (start[d], lower->value.integer);
1450

1451
	  mpz_set (ctr[d], start[d]);
1452

1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471
	  /* Obtain the end value for the index.  */
	  if (finish)
	    mpz_set (end[d], finish->value.integer);
	  else
	    mpz_set (end[d], upper->value.integer);

	  /* Separate 'if' because elements sometimes arrive with
	     non-null end.  */
	  if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
	    mpz_set (end [d], begin->value.integer);

	  /* Check the bounds.  */
	  if (mpz_cmp (ctr[d], upper->value.integer) > 0
	      || mpz_cmp (end[d], upper->value.integer) > 0
	      || mpz_cmp (ctr[d], lower->value.integer) < 0
	      || mpz_cmp (end[d], lower->value.integer) < 0)
	    {
	      gfc_error ("index in dimension %d is out of bounds "
			 "at %L", d + 1, &ref->u.ar.c_where[d]);
1472
	      t = false;
1473 1474
	      goto cleanup;
	    }
1475

1476
	  /* Calculate the number of elements and the shape.  */
1477
	  mpz_set (tmp_mpz, stride[d]);
1478 1479 1480 1481 1482
	  mpz_add (tmp_mpz, end[d], tmp_mpz);
	  mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
	  mpz_div (tmp_mpz, tmp_mpz, stride[d]);
	  mpz_mul (nelts, nelts, tmp_mpz);

1483 1484
	  /* An element reference reduces the rank of the expression; don't
	     add anything to the shape array.  */
1485
	  if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT)
1486 1487
	    mpz_set (expr->shape[shape_i++], tmp_mpz);
	}
1488 1489 1490 1491 1492 1493 1494 1495 1496 1497

      /* Calculate the 'stride' (=delta) for conversion of the
	 counter values into the index along the constructor.  */
      mpz_set (delta[d], delta_mpz);
      mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
      mpz_add_ui (tmp_mpz, tmp_mpz, one);
      mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
    }

  mpz_init (ptr);
Jerry DeLisle committed
1498
  cons = gfc_constructor_first (base);
1499 1500 1501

  /* Now clock through the array reference, calculating the index in
     the source constructor and transferring the elements to the new
1502
     constructor.  */
1503
  for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
1504
    {
1505
      mpz_init_set_ui (ptr, 0);
1506

1507
      incr_ctr = true;
1508 1509 1510
      for (d = 0; d < rank; d++)
	{
	  mpz_set (tmp_mpz, ctr[d]);
1511
	  mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
1512 1513 1514
	  mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
	  mpz_add (ptr, ptr, tmp_mpz);

1515
	  if (!incr_ctr) continue;
1516

1517
	  if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript.  */
1518 1519 1520
	    {
	      gcc_assert(vecsub[d]);

Jerry DeLisle committed
1521 1522
	      if (!gfc_constructor_next (vecsub[d]))
		vecsub[d] = gfc_constructor_first (ref->u.ar.start[d]->value.constructor);
1523 1524
	      else
		{
Jerry DeLisle committed
1525
		  vecsub[d] = gfc_constructor_next (vecsub[d]);
1526 1527 1528 1529
		  incr_ctr = false;
		}
	      mpz_set (ctr[d], vecsub[d]->expr->value.integer);
	    }
1530
	  else
1531
	    {
1532
	      mpz_add (ctr[d], ctr[d], stride[d]);
1533

1534 1535 1536
	      if (mpz_cmp_ui (stride[d], 0) > 0
		  ? mpz_cmp (ctr[d], end[d]) > 0
		  : mpz_cmp (ctr[d], end[d]) < 0)
1537 1538 1539 1540
		mpz_set (ctr[d], start[d]);
	      else
		incr_ctr = false;
	    }
1541 1542
	}

1543
      limit = mpz_get_ui (ptr);
1544
      if (limit >= flag_max_array_constructor)
1545 1546 1547 1548
        {
	  gfc_error ("The number of elements in the array constructor "
		     "at %L requires an increase of the allowed %d "
		     "upper limit.   See -fmax-array-constructor "
1549
		     "option", &expr->where, flag_max_array_constructor);
1550
	  return false;
1551 1552 1553
	}

      cons = gfc_constructor_lookup (base, limit);
Jerry DeLisle committed
1554 1555 1556
      gcc_assert (cons);
      gfc_constructor_append_expr (&expr->value.constructor,
				   gfc_copy_expr (cons->expr), NULL);
1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568
    }

  mpz_clear (ptr);

cleanup:

  mpz_clear (delta_mpz);
  mpz_clear (tmp_mpz);
  mpz_clear (nelts);
  for (d = 0; d < rank; d++)
    {
      mpz_clear (delta[d]);
1569
      mpz_clear (start[d]);
1570 1571 1572 1573
      mpz_clear (end[d]);
      mpz_clear (ctr[d]);
      mpz_clear (stride[d]);
    }
Jerry DeLisle committed
1574
  gfc_constructor_free (base);
1575 1576 1577 1578 1579
  return t;
}

/* Pull a substring out of an expression.  */

1580
static bool
1581 1582 1583 1584
find_substring_ref (gfc_expr *p, gfc_expr **newp)
{
  int end;
  int start;
1585
  int length;
1586
  gfc_char_t *chr;
1587 1588

  if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1589
      || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1590
    return false;
1591 1592

  *newp = gfc_copy_expr (p);
1593
  free ((*newp)->value.character.string);
1594

1595 1596
  end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
  start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
1597
  length = end - start + 1;
1598

1599
  chr = (*newp)->value.character.string = gfc_get_wide_string (length + 1);
1600
  (*newp)->value.character.length = length;
1601 1602
  memcpy (chr, &p->value.character.string[start - 1],
	  length * sizeof (gfc_char_t));
1603
  chr[length] = '\0';
1604
  return true;
1605 1606 1607 1608
}



1609 1610 1611
/* Simplify a subobject reference of a constructor.  This occurs when
   parameter variable values are substituted.  */

1612
static bool
1613
simplify_const_ref (gfc_expr *p)
1614
{
Jerry DeLisle committed
1615
  gfc_constructor *cons, *c;
1616
  gfc_expr *newp;
1617
  gfc_ref *last_ref;
1618 1619 1620 1621 1622 1623 1624 1625 1626

  while (p->ref)
    {
      switch (p->ref->type)
	{
	case REF_ARRAY:
	  switch (p->ref->u.ar.type)
	    {
	    case AR_ELEMENT:
1627 1628 1629 1630 1631 1632 1633
	      /* <type/kind spec>, parameter :: x(<int>) = scalar_expr
		 will generate this.  */
	      if (p->expr_type != EXPR_ARRAY)
		{
		  remove_subobject_ref (p, NULL);
		  break;
		}
1634 1635
	      if (!find_array_element (p->value.constructor, &p->ref->u.ar, &cons))
		return false;
1636

1637
	      if (!cons)
1638
		return true;
1639

1640 1641 1642
	      remove_subobject_ref (p, cons);
	      break;

1643
	    case AR_SECTION:
1644 1645
	      if (!find_array_section (p, p->ref))
		return false;
1646 1647
	      p->ref->u.ar.type = AR_FULL;

1648
	    /* Fall through.  */
1649

1650
	    case AR_FULL:
1651
	      if (p->ref->next != NULL
1652
		  && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1653
		{
Jerry DeLisle committed
1654 1655
		  for (c = gfc_constructor_first (p->value.constructor);
		       c; c = gfc_constructor_next (c))
1656
		    {
Jerry DeLisle committed
1657
		      c->expr->ref = gfc_copy_ref (p->ref->next);
1658 1659
		      if (!simplify_const_ref (c->expr))
			return false;
1660 1661
		    }

1662 1663
		  if (p->ts.type == BT_DERIVED
			&& p->ref->next
Jerry DeLisle committed
1664
			&& (c = gfc_constructor_first (p->value.constructor)))
1665
		    {
1666
		      /* There may have been component references.  */
Jerry DeLisle committed
1667
		      p->ts = c->expr->ts;
1668
		    }
1669

1670 1671
		  last_ref = p->ref;
		  for (; last_ref->next; last_ref = last_ref->next) {};
1672

1673 1674 1675 1676 1677 1678 1679 1680
		  if (p->ts.type == BT_CHARACTER
			&& last_ref->type == REF_SUBSTRING)
		    {
		      /* If this is a CHARACTER array and we possibly took
			 a substring out of it, update the type-spec's
			 character length according to the first element
			 (as all should have the same length).  */
		      int string_len;
Jerry DeLisle committed
1681
		      if ((c = gfc_constructor_first (p->value.constructor)))
1682
			{
Jerry DeLisle committed
1683
			  const gfc_expr* first = c->expr;
1684 1685 1686 1687 1688 1689 1690
			  gcc_assert (first->expr_type == EXPR_CONSTANT);
			  gcc_assert (first->ts.type == BT_CHARACTER);
			  string_len = first->value.character.length;
			}
		      else
			string_len = 0;

1691
		      if (!p->ts.u.cl)
1692 1693 1694 1695 1696
			p->ts.u.cl = gfc_new_charlen (p->symtree->n.sym->ns,
						      NULL);
		      else
			gfc_free_expr (p->ts.u.cl->length);

Jerry DeLisle committed
1697 1698 1699
		      p->ts.u.cl->length
			= gfc_get_int_expr (gfc_default_integer_kind,
					    NULL, string_len);
1700
		    }
1701
		}
1702 1703
	      gfc_free_ref_list (p->ref);
	      p->ref = NULL;
1704 1705 1706
	      break;

	    default:
1707
	      return true;
1708 1709 1710 1711 1712 1713 1714 1715 1716 1717
	    }

	  break;

	case REF_COMPONENT:
	  cons = find_component_ref (p->value.constructor, p->ref);
	  remove_subobject_ref (p, cons);
	  break;

	case REF_SUBSTRING:
1718 1719
  	  if (!find_substring_ref (p, &newp))
	    return false;
1720 1721 1722 1723 1724

	  gfc_replace_expr (p, newp);
	  gfc_free_ref_list (p->ref);
	  p->ref = NULL;
	  break;
1725 1726 1727
	}
    }

1728
  return true;
1729 1730 1731 1732 1733
}


/* Simplify a chain of references.  */

1734
static bool
1735
simplify_ref_chain (gfc_ref *ref, int type)
1736 1737 1738 1739 1740 1741 1742 1743 1744 1745
{
  int n;

  for (; ref; ref = ref->next)
    {
      switch (ref->type)
	{
	case REF_ARRAY:
	  for (n = 0; n < ref->u.ar.dimen; n++)
	    {
1746 1747 1748 1749 1750 1751
	      if (!gfc_simplify_expr (ref->u.ar.start[n], type))
		return false;
	      if (!gfc_simplify_expr (ref->u.ar.end[n], type))
		return false;
	      if (!gfc_simplify_expr (ref->u.ar.stride[n], type))
		return false;
1752 1753 1754 1755
	    }
	  break;

	case REF_SUBSTRING:
1756 1757 1758 1759
	  if (!gfc_simplify_expr (ref->u.ss.start, type))
	    return false;
	  if (!gfc_simplify_expr (ref->u.ss.end, type))
	    return false;
1760 1761 1762 1763 1764 1765
	  break;

	default:
	  break;
	}
    }
1766
  return true;
1767 1768 1769 1770
}


/* Try to substitute the value of a parameter variable.  */
1771

1772
static bool
1773
simplify_parameter_variable (gfc_expr *p, int type)
1774 1775
{
  gfc_expr *e;
1776
  bool t;
1777 1778

  e = gfc_copy_expr (p->symtree->n.sym->value);
1779
  if (e == NULL)
1780
    return false;
1781

1782 1783
  e->rank = p->rank;

1784 1785
  /* Do not copy subobject refs for constant.  */
  if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1786
    e->ref = gfc_copy_ref (p->ref);
1787 1788
  t = gfc_simplify_expr (e, type);

1789
  /* Only use the simplification if it eliminated all subobject references.  */
1790
  if (t && !e->ref)
1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812
    gfc_replace_expr (p, e);
  else
    gfc_free_expr (e);

  return t;
}

/* Given an expression, simplify it by collapsing constant
   expressions.  Most simplification takes place when the expression
   tree is being constructed.  If an intrinsic function is simplified
   at some point, we get called again to collapse the result against
   other constants.

   We work by recursively simplifying expression nodes, simplifying
   intrinsic functions where possible, which can lead to further
   constant collapsing.  If an operator has constant operand(s), we
   rip the expression apart, and rebuild it, hoping that it becomes
   something simpler.

   The expression type is defined for:
     0   Basic expression parsing
     1   Simplifying array constructors -- will substitute
1813
	 iterator values.
1814 1815
   Returns false on error, true otherwise.
   NOTE: Will return true even if the expression can not be simplified.  */
1816

1817
bool
1818
gfc_simplify_expr (gfc_expr *p, int type)
1819 1820 1821 1822
{
  gfc_actual_arglist *ap;

  if (p == NULL)
1823
    return true;
1824 1825 1826 1827 1828 1829 1830 1831 1832

  switch (p->expr_type)
    {
    case EXPR_CONSTANT:
    case EXPR_NULL:
      break;

    case EXPR_FUNCTION:
      for (ap = p->value.function.actual; ap; ap = ap->next)
1833 1834
	if (!gfc_simplify_expr (ap->expr, type))
	  return false;
1835 1836 1837

      if (p->value.function.isym != NULL
	  && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1838
	return false;
1839 1840 1841 1842

      break;

    case EXPR_SUBSTRING:
1843 1844
      if (!simplify_ref_chain (p->ref, type))
	return false;
1845

1846 1847
      if (gfc_is_constant_expr (p))
	{
1848
	  gfc_char_t *s;
1849 1850
	  int start, end;

1851
	  start = 0;
1852 1853 1854 1855 1856 1857
	  if (p->ref && p->ref->u.ss.start)
	    {
	      gfc_extract_int (p->ref->u.ss.start, &start);
	      start--;  /* Convert from one-based to zero-based.  */
	    }

1858
	  end = p->value.character.length;
1859 1860 1861
	  if (p->ref && p->ref->u.ss.end)
	    gfc_extract_int (p->ref->u.ss.end, &end);

1862 1863
	  if (end < start)
	    end = start;
1864

1865 1866 1867
	  s = gfc_get_wide_string (end - start + 2);
	  memcpy (s, p->value.character.string + start,
		  (end - start) * sizeof (gfc_char_t));
1868
	  s[end - start + 1] = '\0';  /* TODO: C-style string.  */
1869
	  free (p->value.character.string);
1870 1871
	  p->value.character.string = s;
	  p->value.character.length = end - start;
1872
	  p->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
Jerry DeLisle committed
1873 1874 1875
	  p->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
						 NULL,
						 p->value.character.length);
1876 1877 1878 1879
	  gfc_free_ref_list (p->ref);
	  p->ref = NULL;
	  p->expr_type = EXPR_CONSTANT;
	}
1880 1881 1882
      break;

    case EXPR_OP:
1883 1884
      if (!simplify_intrinsic_op (p, type))
	return false;
1885 1886 1887 1888
      break;

    case EXPR_VARIABLE:
      /* Only substitute array parameter variables if we are in an
1889
	 initialization expression, or we want a subsection.  */
1890
      if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1891
	  && (gfc_init_expr_flag || p->ref
1892
	      || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1893
	{
1894 1895
	  if (!simplify_parameter_variable (p, type))
	    return false;
1896 1897 1898 1899 1900 1901 1902 1903 1904
	  break;
	}

      if (type == 1)
	{
	  gfc_simplify_iterator_var (p);
	}

      /* Simplify subcomponent references.  */
1905 1906
      if (!simplify_ref_chain (p->ref, type))
	return false;
1907 1908 1909 1910 1911

      break;

    case EXPR_STRUCTURE:
    case EXPR_ARRAY:
1912 1913
      if (!simplify_ref_chain (p->ref, type))
	return false;
1914

1915 1916
      if (!simplify_constructor (p->value.constructor, type))
	return false;
1917

1918 1919
      if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
	  && p->ref->u.ar.type == AR_FULL)
1920
	  gfc_expand_constructor (p, false);
1921

1922 1923
      if (!simplify_const_ref (p))
	return false;
1924 1925

      break;
1926 1927

    case EXPR_COMPCALL:
1928
    case EXPR_PPC:
1929
      break;
1930 1931
    }

1932
  return true;
1933 1934 1935 1936 1937 1938 1939 1940
}


/* Returns the type of an expression with the exception that iterator
   variables are automatically integers no matter what else they may
   be declared as.  */

static bt
1941
et0 (gfc_expr *e)
1942
{
1943
  if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e))
1944 1945 1946 1947 1948 1949
    return BT_INTEGER;

  return e->ts.type;
}


1950 1951
/* Scalarize an expression for an elemental intrinsic call.  */

1952
static bool
1953 1954 1955
scalarize_intrinsic_call (gfc_expr *e)
{
  gfc_actual_arglist *a, *b;
Jerry DeLisle committed
1956 1957 1958
  gfc_constructor_base ctor;
  gfc_constructor *args[5];
  gfc_constructor *ci, *new_ctor;
1959
  gfc_expr *expr, *old;
Paul Thomas committed
1960
  int n, i, rank[5], array_arg;
1961

Paul Thomas committed
1962 1963 1964 1965
  /* Find which, if any, arguments are arrays.  Assume that the old
     expression carries the type information and that the first arg
     that is an array expression carries all the shape information.*/
  n = array_arg = 0;
1966
  a = e->value.function.actual;
Paul Thomas committed
1967 1968 1969
  for (; a; a = a->next)
    {
      n++;
1970
      if (!a->expr || a->expr->expr_type != EXPR_ARRAY)
Paul Thomas committed
1971 1972 1973 1974 1975 1976 1977
	continue;
      array_arg = n;
      expr = gfc_copy_expr (a->expr);
      break;
    }

  if (!array_arg)
1978
    return false;
1979 1980

  old = gfc_copy_expr (e);
Paul Thomas committed
1981

Jerry DeLisle committed
1982
  gfc_constructor_free (expr->value.constructor);
1983 1984
  expr->value.constructor = NULL;
  expr->ts = old->ts;
Paul Thomas committed
1985
  expr->where = old->where;
1986 1987 1988 1989 1990 1991 1992 1993 1994
  expr->expr_type = EXPR_ARRAY;

  /* Copy the array argument constructors into an array, with nulls
     for the scalars.  */
  n = 0;
  a = old->value.function.actual;
  for (; a; a = a->next)
    {
      /* Check that this is OK for an initialization expression.  */
1995
      if (a->expr && !gfc_check_init_expr (a->expr))
1996 1997 1998 1999 2000 2001 2002
	goto cleanup;

      rank[n] = 0;
      if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
	{
	  rank[n] = a->expr->rank;
	  ctor = a->expr->symtree->n.sym->value->value.constructor;
Jerry DeLisle committed
2003
	  args[n] = gfc_constructor_first (ctor);
2004 2005 2006 2007 2008 2009 2010
	}
      else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
	{
	  if (a->expr->rank)
	    rank[n] = a->expr->rank;
	  else
	    rank[n] = 1;
Jerry DeLisle committed
2011 2012
	  ctor = gfc_constructor_copy (a->expr->value.constructor);
	  args[n] = gfc_constructor_first (ctor);
2013 2014 2015
	}
      else
	args[n] = NULL;
Jerry DeLisle committed
2016

2017 2018 2019 2020
      n++;
    }


2021
  /* Using the array argument as the master, step through the array
2022 2023
     calling the function for each element and advancing the array
     constructors together.  */
Jerry DeLisle committed
2024
  for (ci = args[array_arg - 1]; ci; ci = gfc_constructor_next (ci))
2025
    {
Jerry DeLisle committed
2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036
      new_ctor = gfc_constructor_append_expr (&expr->value.constructor,
					      gfc_copy_expr (old), NULL);

      gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
      a = NULL;
      b = old->value.function.actual;
      for (i = 0; i < n; i++)
	{
	  if (a == NULL)
	    new_ctor->expr->value.function.actual
			= a = gfc_get_actual_arglist ();
2037 2038
	  else
	    {
Jerry DeLisle committed
2039 2040
	      a->next = gfc_get_actual_arglist ();
	      a = a->next;
2041 2042
	    }

Jerry DeLisle committed
2043 2044 2045 2046 2047 2048 2049
	  if (args[i])
	    a->expr = gfc_copy_expr (args[i]->expr);
	  else
	    a->expr = gfc_copy_expr (b->expr);

	  b = b->next;
	}
2050

Jerry DeLisle committed
2051 2052 2053 2054
      /* Simplify the function calls.  If the simplification fails, the
	 error will be flagged up down-stream or the library will deal
	 with it.  */
      gfc_simplify_expr (new_ctor->expr, 0);
2055

Jerry DeLisle committed
2056 2057 2058
      for (i = 0; i < n; i++)
	if (args[i])
	  args[i] = gfc_constructor_next (args[i]);
2059

Jerry DeLisle committed
2060 2061 2062 2063
      for (i = 1; i < n; i++)
	if (rank[i] && ((args[i] != NULL && args[array_arg - 1] == NULL)
			|| (args[i] == NULL && args[array_arg - 1] != NULL)))
	  goto compliance;
2064 2065 2066 2067
    }

  free_expr0 (e);
  *e = *expr;
2068 2069
  /* Free "expr" but not the pointers it contains.  */
  free (expr);
2070
  gfc_free_expr (old);
2071
  return true;
2072 2073 2074 2075 2076 2077 2078

compliance:
  gfc_error_now ("elemental function arguments at %C are not compliant");

cleanup:
  gfc_free_expr (expr);
  gfc_free_expr (old);
2079
  return false;
2080 2081 2082
}


2083 2084
static bool
check_intrinsic_op (gfc_expr *e, bool (*check_function) (gfc_expr *))
2085
{
2086 2087
  gfc_expr *op1 = e->value.op.op1;
  gfc_expr *op2 = e->value.op.op2;
2088

2089 2090
  if (!(*check_function)(op1))
    return false;
2091

2092
  switch (e->value.op.op)
2093 2094 2095
    {
    case INTRINSIC_UPLUS:
    case INTRINSIC_UMINUS:
2096
      if (!numeric_type (et0 (op1)))
2097 2098 2099 2100
	goto not_numeric;
      break;

    case INTRINSIC_EQ:
2101
    case INTRINSIC_EQ_OS:
2102
    case INTRINSIC_NE:
2103
    case INTRINSIC_NE_OS:
2104
    case INTRINSIC_GT:
2105
    case INTRINSIC_GT_OS:
2106
    case INTRINSIC_GE:
2107
    case INTRINSIC_GE_OS:
2108
    case INTRINSIC_LT:
2109
    case INTRINSIC_LT_OS:
2110
    case INTRINSIC_LE:
2111
    case INTRINSIC_LE_OS:
2112 2113
      if (!(*check_function)(op2))
	return false;
2114

2115 2116
      if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
	  && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
2117 2118 2119
	{
	  gfc_error ("Numeric or CHARACTER operands are required in "
		     "expression at %L", &e->where);
2120
	 return false;
2121 2122
	}
      break;
2123 2124 2125 2126 2127 2128

    case INTRINSIC_PLUS:
    case INTRINSIC_MINUS:
    case INTRINSIC_TIMES:
    case INTRINSIC_DIVIDE:
    case INTRINSIC_POWER:
2129 2130
      if (!(*check_function)(op2))
	return false;
2131

2132
      if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
2133 2134 2135 2136 2137
	goto not_numeric;

      break;

    case INTRINSIC_CONCAT:
2138 2139
      if (!(*check_function)(op2))
	return false;
2140

2141
      if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
2142 2143
	{
	  gfc_error ("Concatenation operator in expression at %L "
2144
		     "must have two CHARACTER operands", &op1->where);
2145
	  return false;
2146 2147
	}

2148
      if (op1->ts.kind != op2->ts.kind)
2149 2150 2151
	{
	  gfc_error ("Concat operator at %L must concatenate strings of the "
		     "same kind", &e->where);
2152
	  return false;
2153 2154 2155 2156 2157
	}

      break;

    case INTRINSIC_NOT:
2158
      if (et0 (op1) != BT_LOGICAL)
2159 2160
	{
	  gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
2161
		     "operand", &op1->where);
2162
	  return false;
2163 2164 2165 2166 2167 2168 2169 2170
	}

      break;

    case INTRINSIC_AND:
    case INTRINSIC_OR:
    case INTRINSIC_EQV:
    case INTRINSIC_NEQV:
2171 2172
      if (!(*check_function)(op2))
	return false;
2173

2174
      if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
2175 2176 2177
	{
	  gfc_error ("LOGICAL operands are required in expression at %L",
		     &e->where);
2178
	  return false;
2179 2180 2181 2182
	}

      break;

2183 2184 2185
    case INTRINSIC_PARENTHESES:
      break;

2186 2187 2188
    default:
      gfc_error ("Only intrinsic operators can be used in expression at %L",
		 &e->where);
2189
      return false;
2190 2191
    }

2192
  return true;
2193 2194 2195 2196

not_numeric:
  gfc_error ("Numeric operands are required in expression at %L", &e->where);

2197
  return false;
2198 2199
}

2200 2201
/* F2003, 7.1.7 (3): In init expression, allocatable components
   must not be data-initialized.  */
2202
static bool
2203 2204
check_alloc_comp_init (gfc_expr *e)
{
Jerry DeLisle committed
2205
  gfc_component *comp;
2206 2207 2208 2209 2210
  gfc_constructor *ctor;

  gcc_assert (e->expr_type == EXPR_STRUCTURE);
  gcc_assert (e->ts.type == BT_DERIVED);

Jerry DeLisle committed
2211 2212 2213
  for (comp = e->ts.u.derived->components,
       ctor = gfc_constructor_first (e->value.constructor);
       comp; comp = comp->next, ctor = gfc_constructor_next (ctor))
2214
    {
2215
      if (comp->attr.allocatable && ctor->expr
2216 2217
          && ctor->expr->expr_type != EXPR_NULL)
        {
2218 2219 2220
	  gfc_error ("Invalid initialization expression for ALLOCATABLE "
		     "component %qs in structure constructor at %L",
		     comp->name, &ctor->expr->where);
2221
	  return false;
2222 2223 2224
	}
    }

2225
  return true;
2226
}
2227

2228 2229 2230 2231
static match
check_init_expr_arguments (gfc_expr *e)
{
  gfc_actual_arglist *ap;
2232

2233
  for (ap = e->value.function.actual; ap; ap = ap->next)
2234
    if (!gfc_check_init_expr (ap->expr))
2235
      return MATCH_ERROR;
2236

2237 2238 2239
  return MATCH_YES;
}

2240
static bool check_restricted (gfc_expr *);
2241

2242 2243 2244 2245
/* F95, 7.1.6.1, Initialization expressions, (7)
   F2003, 7.1.7 Initialization expression, (8)  */

static match
2246
check_inquiry (gfc_expr *e, int not_restricted)
2247 2248
{
  const char *name;
2249 2250 2251 2252 2253 2254 2255 2256 2257
  const char *const *functions;

  static const char *const inquiry_func_f95[] = {
    "lbound", "shape", "size", "ubound",
    "bit_size", "len", "kind",
    "digits", "epsilon", "huge", "maxexponent", "minexponent",
    "precision", "radix", "range", "tiny",
    NULL
  };
2258

2259 2260 2261 2262 2263 2264
  static const char *const inquiry_func_f2003[] = {
    "lbound", "shape", "size", "ubound",
    "bit_size", "len", "kind",
    "digits", "epsilon", "huge", "maxexponent", "minexponent",
    "precision", "radix", "range", "tiny",
    "new_line", NULL
2265 2266
  };

2267
  int i = 0;
2268 2269 2270 2271 2272
  gfc_actual_arglist *ap;

  if (!e->value.function.isym
      || !e->value.function.isym->inquiry)
    return MATCH_NO;
2273

2274 2275
  /* An undeclared parameter will get us here (PR25018).  */
  if (e->symtree == NULL)
2276
    return MATCH_NO;
2277

2278 2279 2280 2281 2282 2283
  if (e->symtree->n.sym->from_intmod)
    {
      if (e->symtree->n.sym->from_intmod == INTMOD_ISO_FORTRAN_ENV
	  && e->symtree->n.sym->intmod_sym_id != ISOFORTRAN_COMPILER_OPTIONS
	  && e->symtree->n.sym->intmod_sym_id != ISOFORTRAN_COMPILER_VERSION)
	return MATCH_NO;
2284

2285 2286 2287 2288 2289 2290 2291 2292 2293
      if (e->symtree->n.sym->from_intmod == INTMOD_ISO_C_BINDING
	  && e->symtree->n.sym->intmod_sym_id != ISOCBINDING_C_SIZEOF)
	return MATCH_NO;
    }
  else
    {
      name = e->symtree->n.sym->name;

      functions = (gfc_option.warn_std & GFC_STD_F2003)
2294
		? inquiry_func_f2003 : inquiry_func_f95;
2295

2296 2297 2298
      for (i = 0; functions[i]; i++)
	if (strcmp (functions[i], name) == 0)
	  break;
2299

2300 2301 2302
	if (functions[i] == NULL)
	  return MATCH_ERROR;
    }
2303

2304 2305
  /* At this point we have an inquiry function with a variable argument.  The
     type of the variable might be undefined, but we need it now, because the
2306
     arguments of these functions are not allowed to be undefined.  */
2307

2308
  for (ap = e->value.function.actual; ap; ap = ap->next)
2309
    {
2310 2311 2312 2313 2314 2315
      if (!ap->expr)
	continue;

      if (ap->expr->ts.type == BT_UNKNOWN)
	{
	  if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2316
	      && !gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns))
2317
	    return MATCH_NO;
2318

2319 2320 2321 2322 2323 2324 2325
	  ap->expr->ts = ap->expr->symtree->n.sym->ts;
	}

	/* Assumed character length will not reduce to a constant expression
	   with LEN, as required by the standard.  */
	if (i == 5 && not_restricted
	    && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
Steven G. Kargl committed
2326 2327
	    && (ap->expr->symtree->n.sym->ts.u.cl->length == NULL
		|| ap->expr->symtree->n.sym->ts.deferred))
2328
	  {
2329
	    gfc_error ("Assumed or deferred character length variable %qs "
Steven G. Kargl committed
2330 2331 2332
			" in constant expression at %L",
			ap->expr->symtree->n.sym->name,
			&ap->expr->where);
2333 2334
	      return MATCH_ERROR;
	  }
2335
	else if (not_restricted && !gfc_check_init_expr (ap->expr))
2336
	  return MATCH_ERROR;
2337 2338 2339

	if (not_restricted == 0
	      && ap->expr->expr_type != EXPR_VARIABLE
2340
	      && !check_restricted (ap->expr))
2341
	  return MATCH_ERROR;
2342 2343 2344 2345 2346 2347

	if (not_restricted == 0
	    && ap->expr->expr_type == EXPR_VARIABLE
	    && ap->expr->symtree->n.sym->attr.dummy
	    && ap->expr->symtree->n.sym->attr.optional)
	  return MATCH_NO;
2348 2349
    }

2350 2351 2352
  return MATCH_YES;
}

2353

2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364
/* F95, 7.1.6.1, Initialization expressions, (5)
   F2003, 7.1.7 Initialization expression, (5)  */

static match
check_transformational (gfc_expr *e)
{
  static const char * const trans_func_f95[] = {
    "repeat", "reshape", "selected_int_kind",
    "selected_real_kind", "transfer", "trim", NULL
  };

2365
  static const char * const trans_func_f2003[] =  {
2366 2367
    "all", "any", "count", "dot_product", "matmul", "null", "pack",
    "product", "repeat", "reshape", "selected_char_kind", "selected_int_kind",
2368 2369
    "selected_real_kind", "spread", "sum", "transfer", "transpose",
    "trim", "unpack", NULL
2370 2371
  };

2372 2373
  int i;
  const char *name;
2374
  const char *const *functions;
2375 2376 2377 2378 2379 2380 2381

  if (!e->value.function.isym
      || !e->value.function.isym->transformational)
    return MATCH_NO;

  name = e->symtree->n.sym->name;

2382
  functions = (gfc_option.allow_std & GFC_STD_F2003)
2383 2384
		? trans_func_f2003 : trans_func_f95;

2385 2386 2387 2388
  /* NULL() is dealt with below.  */
  if (strcmp ("null", name) == 0)
    return MATCH_NO;

2389 2390 2391
  for (i = 0; functions[i]; i++)
    if (strcmp (functions[i], name) == 0)
       break;
2392

2393
  if (functions[i] == NULL)
2394
    {
2395 2396
      gfc_error ("transformational intrinsic %qs at %L is not permitted "
		 "in an initialization expression", name, &e->where);
2397 2398
      return MATCH_ERROR;
    }
2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423

  return check_init_expr_arguments (e);
}


/* F95, 7.1.6.1, Initialization expressions, (6)
   F2003, 7.1.7 Initialization expression, (6)  */

static match
check_null (gfc_expr *e)
{
  if (strcmp ("null", e->symtree->n.sym->name) != 0)
    return MATCH_NO;

  return check_init_expr_arguments (e);
}


static match
check_elemental (gfc_expr *e)
{
  if (!e->value.function.isym
      || !e->value.function.isym->elemental)
    return MATCH_NO;

2424 2425
  if (e->ts.type != BT_INTEGER
      && e->ts.type != BT_CHARACTER
2426 2427
      && !gfc_notify_std (GFC_STD_F2003, "Evaluation of nonstandard "
			  "initialization expression at %L", &e->where))
2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441
    return MATCH_ERROR;

  return check_init_expr_arguments (e);
}


static match
check_conversion (gfc_expr *e)
{
  if (!e->value.function.isym
      || !e->value.function.isym->conversion)
    return MATCH_NO;

  return check_init_expr_arguments (e);
2442 2443 2444 2445 2446 2447 2448 2449
}


/* Verify that an expression is an initialization expression.  A side
   effect is that the expression tree is reduced to a single constant
   node if all goes well.  This would normally happen when the
   expression is constructed but function references are assumed to be
   intrinsics in the context of initialization expressions.  If
2450
   false is returned an error message has been generated.  */
2451

2452
bool
2453
gfc_check_init_expr (gfc_expr *e)
2454 2455
{
  match m;
2456
  bool t;
2457 2458

  if (e == NULL)
2459
    return true;
2460 2461 2462 2463

  switch (e->expr_type)
    {
    case EXPR_OP:
2464
      t = check_intrinsic_op (e, gfc_check_init_expr);
2465
      if (t)
2466 2467 2468 2469 2470
	t = gfc_simplify_expr (e, 0);

      break;

    case EXPR_FUNCTION:
2471
      t = false;
2472

2473 2474
      {
	gfc_intrinsic_sym* isym;
2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490
	gfc_symbol* sym = e->symtree->n.sym;

	/* Special case for IEEE_SELECTED_REAL_KIND from the intrinsic
	   module IEEE_ARITHMETIC, which is allowed in initialization
	   expressions.  */
	if (!strcmp(sym->name, "ieee_selected_real_kind")
	    && sym->from_intmod == INTMOD_IEEE_ARITHMETIC)
	  {
	    gfc_expr *new_expr = gfc_simplify_ieee_selected_real_kind (e);
	    if (new_expr)
	      {
		gfc_replace_expr (e, new_expr);
		t = true;
		break;
	      }
	  }
2491

2492 2493 2494
	if (!gfc_is_intrinsic (sym, 0, e->where)
	    || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
	  {
2495
	    gfc_error ("Function %qs in initialization expression at %L "
2496 2497 2498 2499
		       "must be an intrinsic function",
		       e->symtree->n.sym->name, &e->where);
	    break;
	  }
2500

2501 2502 2503 2504 2505 2506
	if ((m = check_conversion (e)) == MATCH_NO
	    && (m = check_inquiry (e, 1)) == MATCH_NO
	    && (m = check_null (e)) == MATCH_NO
	    && (m = check_transformational (e)) == MATCH_NO
	    && (m = check_elemental (e)) == MATCH_NO)
	  {
2507
	    gfc_error ("Intrinsic function %qs at %L is not permitted "
2508 2509 2510 2511
		       "in an initialization expression",
		       e->symtree->n.sym->name, &e->where);
	    m = MATCH_ERROR;
	  }
2512

2513
	if (m == MATCH_ERROR)
2514
	  return false;
2515

2516 2517 2518 2519
	/* Try to scalarize an elemental intrinsic function that has an
	   array argument.  */
	isym = gfc_find_function (e->symtree->n.sym->name);
	if (isym && isym->elemental
2520
	    && (t = scalarize_intrinsic_call(e)))
2521 2522
	  break;
      }
2523

2524
      if (m == MATCH_YES)
2525
	t = gfc_simplify_expr (e, 0);
2526

2527 2528 2529
      break;

    case EXPR_VARIABLE:
2530
      t = true;
2531

2532
      if (gfc_check_iter_variable (e))
2533 2534 2535 2536
	break;

      if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
	{
2537 2538 2539 2540 2541
	  /* A PARAMETER shall not be used to define itself, i.e.
		REAL, PARAMETER :: x = transfer(0, x)
	     is invalid.  */
	  if (!e->symtree->n.sym->value)
	    {
2542 2543
	      gfc_error ("PARAMETER %qs is used at %L before its definition "
			 "is complete", e->symtree->n.sym->name, &e->where);
2544
	      t = false;
2545 2546 2547 2548
	    }
	  else
	    t = simplify_parameter_variable (e, 0);

2549 2550 2551
	  break;
	}

2552 2553 2554
      if (gfc_in_match_data ())
	break;

2555
      t = false;
2556 2557 2558 2559 2560 2561

      if (e->symtree->n.sym->as)
	{
	  switch (e->symtree->n.sym->as->type)
	    {
	      case AS_ASSUMED_SIZE:
2562
		gfc_error ("Assumed size array %qs at %L is not permitted "
2563 2564
			   "in an initialization expression",
			   e->symtree->n.sym->name, &e->where);
2565
		break;
2566 2567

	      case AS_ASSUMED_SHAPE:
2568
		gfc_error ("Assumed shape array %qs at %L is not permitted "
2569 2570
			   "in an initialization expression",
			   e->symtree->n.sym->name, &e->where);
2571
		break;
2572 2573

	      case AS_DEFERRED:
2574
		gfc_error ("Deferred array %qs at %L is not permitted "
2575 2576
			   "in an initialization expression",
			   e->symtree->n.sym->name, &e->where);
2577
		break;
2578

2579
	      case AS_EXPLICIT:
2580
		gfc_error ("Array %qs at %L is a variable, which does "
2581 2582 2583 2584
			   "not reduce to a constant expression",
			   e->symtree->n.sym->name, &e->where);
		break;

2585 2586 2587 2588 2589
	      default:
		gcc_unreachable();
	  }
	}
      else
2590
	gfc_error ("Parameter %qs at %L has not been declared or is "
2591 2592 2593
		   "a variable, which does not reduce to a constant "
		   "expression", e->symtree->n.sym->name, &e->where);

2594 2595 2596 2597
      break;

    case EXPR_CONSTANT:
    case EXPR_NULL:
2598
      t = true;
2599 2600 2601
      break;

    case EXPR_SUBSTRING:
2602
      t = gfc_check_init_expr (e->ref->u.ss.start);
2603
      if (!t)
2604 2605
	break;

2606
      t = gfc_check_init_expr (e->ref->u.ss.end);
2607
      if (t)
2608 2609 2610 2611 2612
	t = gfc_simplify_expr (e, 0);

      break;

    case EXPR_STRUCTURE:
2613 2614
      t = e->ts.is_iso_c ? true : false;
      if (t)
2615 2616 2617
	break;

      t = check_alloc_comp_init (e);
2618
      if (!t)
2619 2620
	break;

2621
      t = gfc_check_constructor (e, gfc_check_init_expr);
2622
      if (!t)
2623 2624
	break;

2625 2626 2627
      break;

    case EXPR_ARRAY:
2628
      t = gfc_check_constructor (e, gfc_check_init_expr);
2629
      if (!t)
2630 2631
	break;

2632
      t = gfc_expand_constructor (e, true);
2633
      if (!t)
2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645
	break;

      t = gfc_check_constructor_type (e);
      break;

    default:
      gfc_internal_error ("check_init_expr(): Unknown expression type");
    }

  return t;
}

2646 2647
/* Reduces a general expression to an initialization expression (a constant).
   This used to be part of gfc_match_init_expr.
2648
   Note that this function doesn't free the given expression on false.  */
2649

2650
bool
2651
gfc_reduce_init_expr (gfc_expr *expr)
2652
{
2653
  bool t;
2654

2655
  gfc_init_expr_flag = true;
2656
  t = gfc_resolve_expr (expr);
2657
  if (t)
2658
    t = gfc_check_init_expr (expr);
2659
  gfc_init_expr_flag = false;
2660

2661 2662
  if (!t)
    return false;
2663

2664
  if (expr->expr_type == EXPR_ARRAY)
2665
    {
2666 2667 2668 2669
      if (!gfc_check_constructor_type (expr))
	return false;
      if (!gfc_expand_constructor (expr, true))
	return false;
2670 2671
    }

2672
  return true;
2673 2674 2675 2676
}


/* Match an initialization expression.  We work by first matching an
2677
   expression, then reducing it to a constant.  */
2678 2679 2680 2681 2682 2683

match
gfc_match_init_expr (gfc_expr **result)
{
  gfc_expr *expr;
  match m;
2684
  bool t;
2685 2686 2687

  expr = NULL;

2688
  gfc_init_expr_flag = true;
2689

2690 2691
  m = gfc_match_expr (&expr);
  if (m != MATCH_YES)
2692
    {
2693
      gfc_init_expr_flag = false;
2694 2695
      return m;
    }
2696 2697

  t = gfc_reduce_init_expr (expr);
2698
  if (!t)
2699 2700
    {
      gfc_free_expr (expr);
2701
      gfc_init_expr_flag = false;
2702 2703
      return MATCH_ERROR;
    }
2704 2705

  *result = expr;
2706
  gfc_init_expr_flag = false;
2707 2708 2709 2710 2711 2712 2713 2714 2715

  return MATCH_YES;
}


/* Given an actual argument list, test to see that each argument is a
   restricted expression and optionally if the expression type is
   integer or character.  */

2716
static bool
2717
restricted_args (gfc_actual_arglist *a)
2718 2719 2720
{
  for (; a; a = a->next)
    {
2721 2722
      if (!check_restricted (a->expr))
	return false;
2723 2724
    }

2725
  return true;
2726 2727 2728 2729 2730 2731 2732 2733
}


/************* Restricted/specification expressions *************/


/* Make sure a non-intrinsic function is a specification function.  */

2734
static bool
2735
external_spec_function (gfc_expr *e)
2736 2737 2738 2739 2740 2741 2742
{
  gfc_symbol *f;

  f = e->value.function.esym;

  if (f->attr.proc == PROC_ST_FUNCTION)
    {
2743
      gfc_error ("Specification function %qs at %L cannot be a statement "
2744
		 "function", f->name, &e->where);
2745
      return false;
2746 2747 2748 2749
    }

  if (f->attr.proc == PROC_INTERNAL)
    {
2750
      gfc_error ("Specification function %qs at %L cannot be an internal "
2751
		 "function", f->name, &e->where);
2752
      return false;
2753 2754
    }

2755
  if (!f->attr.pure && !f->attr.elemental)
2756
    {
2757
      gfc_error ("Specification function %qs at %L must be PURE", f->name,
2758
		 &e->where);
2759
      return false;
2760 2761 2762 2763
    }

  if (f->attr.recursive)
    {
2764
      gfc_error ("Specification function %qs at %L cannot be RECURSIVE",
2765
		 f->name, &e->where);
2766
      return false;
2767 2768
    }

2769
  return restricted_args (e->value.function.actual);
2770 2771 2772 2773
}


/* Check to see that a function reference to an intrinsic is a
2774
   restricted expression.  */
2775

2776
static bool
2777
restricted_intrinsic (gfc_expr *e)
2778
{
2779
  /* TODO: Check constraints on inquiry functions.  7.1.6.2 (7).  */
2780
  if (check_inquiry (e, 0) == MATCH_YES)
2781
    return true;
2782

2783
  return restricted_args (e->value.function.actual);
2784 2785 2786
}


2787 2788
/* Check the expressions of an actual arglist.  Used by check_restricted.  */

2789 2790
static bool
check_arglist (gfc_actual_arglist* arg, bool (*checker) (gfc_expr*))
2791 2792
{
  for (; arg; arg = arg->next)
2793 2794
    if (!checker (arg->expr))
      return false;
2795

2796
  return true;
2797 2798 2799 2800 2801 2802
}


/* Check the subscription expressions of a reference chain with a checking
   function; used by check_restricted.  */

2803 2804
static bool
check_references (gfc_ref* ref, bool (*checker) (gfc_expr*))
2805 2806 2807 2808
{
  int dim;

  if (!ref)
2809
    return true;
2810 2811 2812 2813 2814 2815

  switch (ref->type)
    {
    case REF_ARRAY:
      for (dim = 0; dim != ref->u.ar.dimen; ++dim)
	{
2816 2817 2818 2819 2820 2821
	  if (!checker (ref->u.ar.start[dim]))
	    return false;
	  if (!checker (ref->u.ar.end[dim]))
	    return false;
	  if (!checker (ref->u.ar.stride[dim]))
	    return false;
2822 2823 2824 2825 2826 2827 2828 2829
	}
      break;

    case REF_COMPONENT:
      /* Nothing needed, just proceed to next reference.  */
      break;

    case REF_SUBSTRING:
2830 2831 2832 2833
      if (!checker (ref->u.ss.start))
	return false;
      if (!checker (ref->u.ss.end))
	return false;
2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844
      break;

    default:
      gcc_unreachable ();
      break;
    }

  return check_references (ref->next, checker);
}


2845 2846
/* Verify that an expression is a restricted expression.  Like its
   cousin check_init_expr(), an error message is generated if we
2847
   return false.  */
2848

2849
static bool
2850
check_restricted (gfc_expr *e)
2851
{
2852
  gfc_symbol* sym;
2853
  bool t;
2854 2855

  if (e == NULL)
2856
    return true;
2857 2858 2859 2860 2861

  switch (e->expr_type)
    {
    case EXPR_OP:
      t = check_intrinsic_op (e, check_restricted);
2862
      if (t)
2863 2864 2865 2866 2867
	t = gfc_simplify_expr (e, 0);

      break;

    case EXPR_FUNCTION:
2868 2869 2870
      if (e->value.function.esym)
	{
	  t = check_arglist (e->value.function.actual, &check_restricted);
2871
	  if (t)
2872 2873 2874 2875 2876
	    t = external_spec_function (e);
	}
      else
	{
	  if (e->value.function.isym && e->value.function.isym->inquiry)
2877
	    t = true;
2878 2879 2880
	  else
	    t = check_arglist (e->value.function.actual, &check_restricted);

2881
	  if (t)
2882 2883
	    t = restricted_intrinsic (e);
	}
2884 2885 2886 2887
      break;

    case EXPR_VARIABLE:
      sym = e->symtree->n.sym;
2888
      t = false;
2889

2890 2891 2892 2893 2894 2895 2896 2897
      /* If a dummy argument appears in a context that is valid for a
	 restricted expression in an elemental procedure, it will have
	 already been simplified away once we get here.  Therefore we
	 don't need to jump through hoops to distinguish valid from
	 invalid cases.  */
      if (sym->attr.dummy && sym->ns == gfc_current_ns
	  && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
	{
2898
	  gfc_error ("Dummy argument %qs not allowed in expression at %L",
2899 2900 2901 2902
		     sym->name, &e->where);
	  break;
	}

2903 2904
      if (sym->attr.optional)
	{
2905
	  gfc_error ("Dummy argument %qs at %L cannot be OPTIONAL",
2906 2907 2908 2909 2910 2911
		     sym->name, &e->where);
	  break;
	}

      if (sym->attr.intent == INTENT_OUT)
	{
2912
	  gfc_error ("Dummy argument %qs at %L cannot be INTENT(OUT)",
2913 2914 2915 2916
		     sym->name, &e->where);
	  break;
	}

2917
      /* Check reference chain if any.  */
2918
      if (!check_references (e->ref, &check_restricted))
2919 2920
	break;

2921 2922 2923 2924 2925
      /* gfc_is_formal_arg broadcasts that a formal argument list is being
	 processed in resolve.c(resolve_formal_arglist).  This is done so
	 that host associated dummy array indices are accepted (PR23446).
	 This mechanism also does the same for the specification expressions
	 of array-valued functions.  */
2926 2927 2928 2929 2930
      if (e->error
	    || sym->attr.in_common
	    || sym->attr.use_assoc
	    || sym->attr.dummy
	    || sym->attr.implied_index
2931
	    || sym->attr.flavor == FL_PARAMETER
2932 2933 2934 2935 2936 2937
	    || (sym->ns && sym->ns == gfc_current_ns->parent)
	    || (sym->ns && gfc_current_ns->parent
		  && sym->ns == gfc_current_ns->parent->parent)
	    || (sym->ns->proc_name != NULL
		  && sym->ns->proc_name->attr.flavor == FL_MODULE)
	    || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2938
	{
2939
	  t = true;
2940 2941 2942
	  break;
	}

2943
      gfc_error ("Variable %qs cannot appear in the expression at %L",
2944
		 sym->name, &e->where);
2945 2946
      /* Prevent a repetition of the error.  */
      e->error = 1;
2947 2948 2949 2950
      break;

    case EXPR_NULL:
    case EXPR_CONSTANT:
2951
      t = true;
2952 2953 2954
      break;

    case EXPR_SUBSTRING:
2955
      t = gfc_specification_expr (e->ref->u.ss.start);
2956
      if (!t)
2957 2958
	break;

2959
      t = gfc_specification_expr (e->ref->u.ss.end);
2960
      if (t)
2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981
	t = gfc_simplify_expr (e, 0);

      break;

    case EXPR_STRUCTURE:
      t = gfc_check_constructor (e, check_restricted);
      break;

    case EXPR_ARRAY:
      t = gfc_check_constructor (e, check_restricted);
      break;

    default:
      gfc_internal_error ("check_restricted(): Unknown expression type");
    }

  return t;
}


/* Check to see that an expression is a specification expression.  If
2982
   we return false, an error has been generated.  */
2983

2984
bool
2985
gfc_specification_expr (gfc_expr *e)
2986
{
2987
  gfc_component *comp;
2988

2989
  if (e == NULL)
2990
    return true;
2991 2992 2993

  if (e->ts.type != BT_INTEGER)
    {
2994 2995
      gfc_error ("Expression at %L must be of INTEGER type, found %s",
		 &e->where, gfc_basic_typename (e->ts.type));
2996
      return false;
2997 2998
    }

2999
  comp = gfc_get_proc_ptr_comp (e);
3000
  if (e->expr_type == EXPR_FUNCTION
3001 3002 3003 3004
      && !e->value.function.isym
      && !e->value.function.esym
      && !gfc_pure (e->symtree->n.sym)
      && (!comp || !comp->attr.pure))
3005
    {
3006
      gfc_error ("Function %qs at %L must be PURE",
3007 3008 3009
		 e->symtree->n.sym->name, &e->where);
      /* Prevent repeat error messages.  */
      e->symtree->n.sym->attr.pure = 1;
3010
      return false;
3011 3012
    }

3013 3014 3015
  if (e->rank != 0)
    {
      gfc_error ("Expression at %L must be scalar", &e->where);
3016
      return false;
3017 3018
    }

3019 3020
  if (!gfc_simplify_expr (e, 0))
    return false;
3021 3022 3023 3024 3025 3026 3027 3028 3029

  return check_restricted (e);
}


/************** Expression conformance checks.  *************/

/* Given two expressions, make sure that the arrays are conformable.  */

3030
bool
3031
gfc_check_conformance (gfc_expr *op1, gfc_expr *op2, const char *optype_msgid, ...)
3032 3033 3034
{
  int op1_flag, op2_flag, d;
  mpz_t op1_size, op2_size;
3035
  bool t;
3036

3037 3038 3039
  va_list argp;
  char buffer[240];

3040
  if (op1->rank == 0 || op2->rank == 0)
3041
    return true;
3042

3043 3044 3045 3046
  va_start (argp, optype_msgid);
  vsnprintf (buffer, 240, optype_msgid, argp);
  va_end (argp);

3047 3048
  if (op1->rank != op2->rank)
    {
3049
      gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(buffer),
3050
		 op1->rank, op2->rank, &op1->where);
3051
      return false;
3052 3053
    }

3054
  t = true;
3055 3056 3057

  for (d = 0; d < op1->rank; d++)
    {
3058 3059
      op1_flag = gfc_array_dimen_size(op1, d, &op1_size);
      op2_flag = gfc_array_dimen_size(op2, d, &op2_size);
3060 3061 3062

      if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
	{
3063
	  gfc_error ("Different shape for %s at %L on dimension %d "
3064
		     "(%d and %d)", _(buffer), &op1->where, d + 1,
3065
		     (int) mpz_get_si (op1_size),
3066 3067
		     (int) mpz_get_si (op2_size));

3068
	  t = false;
3069 3070 3071 3072 3073 3074 3075
	}

      if (op1_flag)
	mpz_clear (op1_size);
      if (op2_flag)
	mpz_clear (op2_size);

3076 3077
      if (!t)
	return false;
3078 3079
    }

3080
  return true;
3081 3082 3083 3084 3085 3086
}


/* Given an assignable expression and an arbitrary expression, make
   sure that the assignment can take place.  */

3087
bool
3088
gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
3089 3090
{
  gfc_symbol *sym;
3091 3092
  gfc_ref *ref;
  int has_pointer;
3093 3094 3095

  sym = lvalue->symtree->n.sym;

3096
  /* See if this is the component or subcomponent of a pointer.  */
3097 3098
  has_pointer = sym->attr.pointer;
  for (ref = lvalue->ref; ref; ref = ref->next)
3099
    if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
3100 3101 3102 3103 3104
      {
	has_pointer = 1;
	break;
      }

3105 3106 3107 3108 3109
  /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
     variable local to a function subprogram.  Its existence begins when
     execution of the function is initiated and ends when execution of the
     function is terminated...
     Therefore, the left hand side is no longer a variable, when it is:  */
3110 3111
  if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
      && !sym->attr.external)
Paul Thomas committed
3112
    {
3113 3114 3115
      bool bad_proc;
      bad_proc = false;

3116
      /* (i) Use associated;  */
3117 3118 3119
      if (sym->attr.use_assoc)
	bad_proc = true;

3120
      /* (ii) The assignment is in the main program; or  */
3121 3122 3123
      if (gfc_current_ns->proc_name->attr.is_main_program)
	bad_proc = true;

3124
      /* (iii) A module or internal procedure...  */
3125
      if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
3126
	   || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
3127 3128
	  && gfc_current_ns->parent
	  && (!(gfc_current_ns->parent->proc_name->attr.function
3129
		|| gfc_current_ns->parent->proc_name->attr.subroutine)
3130 3131
	      || gfc_current_ns->parent->proc_name->attr.is_main_program))
	{
3132
	  /* ... that is not a function...  */
3133 3134 3135
	  if (!gfc_current_ns->proc_name->attr.function)
	    bad_proc = true;

3136
	  /* ... or is not an entry and has a different name.  */
3137 3138 3139
	  if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
	    bad_proc = true;
	}
Paul Thomas committed
3140

3141 3142 3143 3144 3145 3146 3147 3148 3149
      /* (iv) Host associated and not the function symbol or the
	      parent result.  This picks up sibling references, which
	      cannot be entries.  */
      if (!sym->attr.entry
	    && sym->ns == gfc_current_ns->parent
	    && sym != gfc_current_ns->proc_name
	    && sym != gfc_current_ns->parent->proc_name->result)
	bad_proc = true;

3150 3151
      if (bad_proc)
	{
3152
	  gfc_error ("%qs at %L is not a VALUE", sym->name, &lvalue->where);
3153
	  return false;
3154 3155
	}
    }
Paul Thomas committed
3156

3157 3158
  if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
    {
3159 3160
      gfc_error ("Incompatible ranks %d and %d in assignment at %L",
		 lvalue->rank, rvalue->rank, &lvalue->where);
3161
      return false;
3162 3163 3164 3165 3166 3167
    }

  if (lvalue->ts.type == BT_UNKNOWN)
    {
      gfc_error ("Variable type is UNKNOWN in assignment at %L",
		 &lvalue->where);
3168
      return false;
3169 3170
    }

3171
  if (rvalue->expr_type == EXPR_NULL)
3172
    {
3173
      if (has_pointer && (ref == NULL || ref->next == NULL)
3174
	  && lvalue->symtree->n.sym->attr.data)
3175
        return true;
3176 3177 3178 3179
      else
	{
	  gfc_error ("NULL appears on right-hand side in assignment at %L",
		     &rvalue->where);
3180
	  return false;
3181 3182
	}
    }
3183

3184
  /* This is possibly a typo: x = f() instead of x => f().  */
3185
  if (warn_surprising
3186
      && rvalue->expr_type == EXPR_FUNCTION && gfc_expr_attr (rvalue).pointer)
3187 3188
    gfc_warning (OPT_Wsurprising,
		 "POINTER-valued function appears on right-hand side of "
3189 3190
		 "assignment at %L", &rvalue->where);

3191 3192
  /* Check size of array assignments.  */
  if (lvalue->rank != 0 && rvalue->rank != 0
3193 3194
      && !gfc_check_conformance (lvalue, rvalue, "array assignment"))
    return false;
3195

3196 3197
  if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
      && lvalue->symtree->n.sym->attr.data
3198
      && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L used to "
3199
			  "initialize non-integer variable %qs", 
3200 3201
			  &rvalue->where, lvalue->symtree->n.sym->name))
    return false;
3202
  else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
3203 3204 3205 3206
      && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L outside "
			  "a DATA statement and outside INT/REAL/DBLE/CMPLX",
			  &rvalue->where))
    return false;
3207 3208 3209 3210

  /* Handle the case of a BOZ literal on the RHS.  */
  if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
    {
3211
      int rc;
3212
      if (warn_surprising)
3213 3214 3215 3216
	gfc_warning (OPT_Wsurprising,
		     "BOZ literal at %L is bitwise transferred "
		     "non-integer symbol %qs", &rvalue->where,
		     lvalue->symtree->n.sym->name);
3217
      if (!gfc_convert_boz (rvalue, &lvalue->ts))
3218
	return false;
3219 3220 3221 3222 3223
      if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
	{
	  if (rc == ARITH_UNDERFLOW)
	    gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
		       ". This check can be disabled with the option "
3224
		       "%<-fno-range-check%>", &rvalue->where);
3225 3226 3227
	  else if (rc == ARITH_OVERFLOW)
	    gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
		       ". This check can be disabled with the option "
3228
		       "%<-fno-range-check%>", &rvalue->where);
3229 3230 3231
	  else if (rc == ARITH_NAN)
	    gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
		       ". This check can be disabled with the option "
3232
		       "%<-fno-range-check%>", &rvalue->where);
3233
	  return false;
3234
	}
3235 3236
    }

3237 3238 3239 3240 3241 3242 3243
  /*  Warn about type-changing conversions for REAL or COMPLEX constants.
      If lvalue and rvalue are mixed REAL and complex, gfc_compare_types
      will warn anyway, so there is no need to to so here.  */

  if (rvalue->expr_type == EXPR_CONSTANT && lvalue->ts.type == rvalue->ts.type
      && (lvalue->ts.type == BT_REAL || lvalue->ts.type == BT_COMPLEX))
    {
3244
      if (lvalue->ts.kind < rvalue->ts.kind && warn_conversion)
3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256
	{
	  /* As a special bonus, don't warn about REAL rvalues which are not
	     changed by the conversion if -Wconversion is specified.  */
	  if (rvalue->ts.type == BT_REAL && mpfr_number_p (rvalue->value.real))
	    {
	      /* Calculate the difference between the constant and the rounded
		 value and check it against zero.  */
	      mpfr_t rv, diff;
	      gfc_set_model_kind (lvalue->ts.kind);
	      mpfr_init (rv);
	      gfc_set_model_kind (rvalue->ts.kind);
	      mpfr_init (diff);
3257

3258 3259
	      mpfr_set (rv, rvalue->value.real, GFC_RND_MODE);
	      mpfr_sub (diff, rv, rvalue->value.real, GFC_RND_MODE);
3260

3261
	      if (!mpfr_zero_p (diff))
3262 3263 3264
		gfc_warning (OPT_Wconversion, 
			     "Change of value in conversion from "
			     " %qs to %qs at %L", gfc_typename (&rvalue->ts),
3265
			     gfc_typename (&lvalue->ts), &rvalue->where);
3266

3267 3268 3269 3270
	      mpfr_clear (rv);
	      mpfr_clear (diff);
	    }
	  else
3271 3272 3273
	    gfc_warning (OPT_Wconversion,
			 "Possible change of value in conversion from %qs "
			 "to %qs at %L", gfc_typename (&rvalue->ts),
3274 3275 3276
			 gfc_typename (&lvalue->ts), &rvalue->where);

	}
3277
      else if (warn_conversion_extra && lvalue->ts.kind > rvalue->ts.kind)
3278
	{
3279 3280
	  gfc_warning (OPT_Wconversion_extra,
		       "Conversion from %qs to %qs at %L",
3281 3282 3283 3284 3285
		       gfc_typename (&rvalue->ts),
		       gfc_typename (&lvalue->ts), &rvalue->where);
	}
    }

3286
  if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
3287
    return true;
3288

3289
  /* Only DATA Statements come here.  */
3290 3291
  if (!conform)
    {
3292 3293 3294 3295
      /* Numeric can be converted to any other numeric. And Hollerith can be
	 converted to any other type.  */
      if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
	  || rvalue->ts.type == BT_HOLLERITH)
3296
	return true;
3297

3298
      if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
3299
	return true;
3300

3301 3302 3303
      gfc_error ("Incompatible types in DATA statement at %L; attempted "
		 "conversion of %s to %s", &lvalue->where,
		 gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3304

3305
      return false;
3306 3307
    }

3308 3309 3310 3311 3312 3313 3314
  /* Assignment is the only case where character variables of different
     kind values can be converted into one another.  */
  if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
    {
      if (lvalue->ts.kind != rvalue->ts.kind)
	gfc_convert_chartype (rvalue, &lvalue->ts);

3315
      return true;
3316 3317
    }

3318 3319 3320 3321 3322 3323 3324 3325
  return gfc_convert_type (rvalue, &lvalue->ts, 1);
}


/* Check that a pointer assignment is OK.  We first check lvalue, and
   we only check rvalue if it's not an assignment to NULL() or a
   NULLIFY statement.  */

3326
bool
3327
gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
3328
{
3329
  symbol_attribute attr, lhs_attr;
3330
  gfc_ref *ref;
3331
  bool is_pure, is_implicit_pure, rank_remap;
3332
  int proc_pointer;
3333

3334 3335
  lhs_attr = gfc_expr_attr (lvalue);
  if (lvalue->ts.type == BT_UNKNOWN && !lhs_attr.proc_pointer)
3336 3337 3338
    {
      gfc_error ("Pointer assignment target is not a POINTER at %L",
		 &lvalue->where);
3339
      return false;
3340 3341
    }

3342 3343
  if (lhs_attr.flavor == FL_PROCEDURE && lhs_attr.use_assoc
      && !lhs_attr.proc_pointer)
Paul Thomas committed
3344
    {
3345
      gfc_error ("%qs in the pointer assignment at %L cannot be an "
Paul Thomas committed
3346 3347
		 "l-value since it is a procedure",
		 lvalue->symtree->n.sym->name, &lvalue->where);
3348
      return false;
Paul Thomas committed
3349 3350
    }

3351
  proc_pointer = lvalue->symtree->n.sym->attr.proc_pointer;
3352

3353
  rank_remap = false;
3354 3355
  for (ref = lvalue->ref; ref; ref = ref->next)
    {
3356
      if (ref->type == REF_COMPONENT)
3357
	proc_pointer = ref->u.c.component->attr.proc_pointer;
3358 3359 3360

      if (ref->type == REF_ARRAY && ref->next == NULL)
	{
3361 3362
	  int dim;

3363 3364 3365 3366 3367
	  if (ref->u.ar.type == AR_FULL)
	    break;

	  if (ref->u.ar.type != AR_SECTION)
	    {
3368
	      gfc_error ("Expected bounds specification for %qs at %L",
3369
			 lvalue->symtree->n.sym->name, &lvalue->where);
3370
	      return false;
3371 3372
	    }

3373
	  if (!gfc_notify_std (GFC_STD_F2003, "Bounds specification "
3374
			       "for %qs in pointer assignment at %L", 
3375 3376
			       lvalue->symtree->n.sym->name, &lvalue->where))
	    return false;
3377

3378 3379 3380 3381 3382
	  /* When bounds are given, all lbounds are necessary and either all
	     or none of the upper bounds; no strides are allowed.  If the
	     upper bounds are present, we may do rank remapping.  */
	  for (dim = 0; dim < ref->u.ar.dimen; ++dim)
	    {
3383 3384
	      if (!ref->u.ar.start[dim]
		  || ref->u.ar.dimen_type[dim] != DIMEN_RANGE)
3385 3386 3387
		{
		  gfc_error ("Lower bound has to be present at %L",
			     &lvalue->where);
3388
		  return false;
3389 3390 3391 3392 3393
		}
	      if (ref->u.ar.stride[dim])
		{
		  gfc_error ("Stride must not be present at %L",
			     &lvalue->where);
3394
		  return false;
3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405
		}

	      if (dim == 0)
		rank_remap = (ref->u.ar.end[dim] != NULL);
	      else
		{
		  if ((rank_remap && !ref->u.ar.end[dim])
		      || (!rank_remap && ref->u.ar.end[dim]))
		    {
		      gfc_error ("Either all or none of the upper bounds"
				 " must be specified at %L", &lvalue->where);
3406
		      return false;
3407 3408 3409
		    }
		}
	    }
3410
	}
3411 3412
    }

3413
  is_pure = gfc_pure (NULL);
3414
  is_implicit_pure = gfc_implicit_pure (NULL);
3415 3416 3417 3418

  /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
     kind, etc for lvalue and rvalue must match, and rvalue must be a
     pure variable if we're in a pure function.  */
3419
  if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
3420
    return true;
3421

3422 3423 3424 3425 3426 3427 3428 3429 3430 3431
  /* F2008, C723 (pointer) and C726 (proc-pointer); for PURE also C1283.  */
  if (lvalue->expr_type == EXPR_VARIABLE
      && gfc_is_coindexed (lvalue))
    {
      gfc_ref *ref;
      for (ref = lvalue->ref; ref; ref = ref->next)
	if (ref->type == REF_ARRAY && ref->u.ar.codimen)
	  {
	    gfc_error ("Pointer object at %L shall not have a coindex",
		       &lvalue->where);
3432
	    return false;
3433 3434 3435
	  }
    }

3436
  /* Checks on rvalue for procedure pointer assignments.  */
3437
  if (proc_pointer)
3438
    {
3439
      char err[200];
3440 3441 3442 3443
      gfc_symbol *s1,*s2;
      gfc_component *comp;
      const char *name;

3444 3445 3446
      attr = gfc_expr_attr (rvalue);
      if (!((rvalue->expr_type == EXPR_NULL)
	    || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
3447
	    || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
3448 3449 3450 3451 3452
	    || (rvalue->expr_type == EXPR_VARIABLE
		&& attr.flavor == FL_PROCEDURE)))
	{
	  gfc_error ("Invalid procedure pointer assignment at %L",
		     &rvalue->where);
3453
	  return false;
3454
	}
3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466
      if (rvalue->expr_type == EXPR_VARIABLE && !attr.proc_pointer)
	{
      	  /* Check for intrinsics.  */
	  gfc_symbol *sym = rvalue->symtree->n.sym;
	  if (!sym->attr.intrinsic
	      && (gfc_is_intrinsic (sym, 0, sym->declared_at)
		  || gfc_is_intrinsic (sym, 1, sym->declared_at)))
	    {
	      sym->attr.intrinsic = 1;
	      gfc_resolve_intrinsic (sym, &rvalue->where);
	      attr = gfc_expr_attr (rvalue);
	    }
3467
	  /* Check for result of embracing function.  */
3468
	  if (sym->attr.function && sym->result == sym)
3469
	    {
3470 3471 3472 3473 3474
	      gfc_namespace *ns;

	      for (ns = gfc_current_ns; ns; ns = ns->parent)
		if (sym == ns->proc_name)
		  {
3475
		    gfc_error ("Function result %qs is invalid as proc-target "
3476 3477
			       "in procedure pointer assignment at %L",
			       sym->name, &rvalue->where);
3478
		    return false;
3479
		  }
3480
	    }
3481
	}
3482 3483
      if (attr.abstract)
	{
3484
	  gfc_error ("Abstract interface %qs is invalid "
3485 3486
		     "in procedure pointer assignment at %L",
		     rvalue->symtree->name, &rvalue->where);
3487
	  return false;
3488
	}
3489
      /* Check for F08:C729.  */
3490 3491 3492 3493
      if (attr.flavor == FL_PROCEDURE)
	{
	  if (attr.proc == PROC_ST_FUNCTION)
	    {
3494
	      gfc_error ("Statement function %qs is invalid "
3495 3496
			 "in procedure pointer assignment at %L",
			 rvalue->symtree->name, &rvalue->where);
3497
	      return false;
3498 3499
	    }
	  if (attr.proc == PROC_INTERNAL &&
3500
	      !gfc_notify_std(GFC_STD_F2008, "Internal procedure %qs "
3501 3502 3503
			      "is invalid in procedure pointer assignment "
			      "at %L", rvalue->symtree->name, &rvalue->where))
	    return false;
3504 3505 3506
	  if (attr.intrinsic && gfc_intrinsic_actual_ok (rvalue->symtree->name,
							 attr.subroutine) == 0)
	    {
3507
	      gfc_error ("Intrinsic %qs at %L is invalid in procedure pointer "
3508
			 "assignment", rvalue->symtree->name, &rvalue->where);
3509
	      return false;
3510
	    }
3511
	}
3512 3513 3514
      /* Check for F08:C730.  */
      if (attr.elemental && !attr.intrinsic)
	{
3515
	  gfc_error ("Nonintrinsic elemental procedure %qs is invalid "
3516
		     "in procedure pointer assignment at %L",
3517
		     rvalue->symtree->name, &rvalue->where);
3518
	  return false;
3519
	}
3520 3521 3522 3523 3524 3525 3526 3527

      /* Ensure that the calling convention is the same. As other attributes
	 such as DLLEXPORT may differ, one explicitly only tests for the
	 calling conventions.  */
      if (rvalue->expr_type == EXPR_VARIABLE
	  && lvalue->symtree->n.sym->attr.ext_attr
	       != rvalue->symtree->n.sym->attr.ext_attr)
	{
3528
	  symbol_attribute calls;
3529

3530 3531 3532 3533
	  calls.ext_attr = 0;
	  gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
	  gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
	  gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
3534

3535 3536
	  if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
	      != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
3537 3538 3539 3540
	    {
	      gfc_error ("Mismatch in the procedure pointer assignment "
			 "at %L: mismatch in the calling convention",
			 &rvalue->where);
3541
	  return false;
3542 3543 3544
	    }
	}

3545 3546
      comp = gfc_get_proc_ptr_comp (lvalue);
      if (comp)
3547 3548
	s1 = comp->ts.interface;
      else
3549 3550 3551 3552 3553
	{
	  s1 = lvalue->symtree->n.sym;
	  if (s1->ts.interface)
	    s1 = s1->ts.interface;
	}
3554

3555 3556
      comp = gfc_get_proc_ptr_comp (rvalue);
      if (comp)
3557
	{
3558 3559 3560
	  if (rvalue->expr_type == EXPR_FUNCTION)
	    {
	      s2 = comp->ts.interface->result;
3561
	      name = s2->name;
3562 3563 3564 3565 3566 3567
	    }
	  else
	    {
	      s2 = comp->ts.interface;
	      name = comp->name;
	    }
3568 3569 3570
	}
      else if (rvalue->expr_type == EXPR_FUNCTION)
	{
3571 3572 3573 3574 3575
	  if (rvalue->value.function.esym)
	    s2 = rvalue->value.function.esym->result;
	  else
	    s2 = rvalue->symtree->n.sym->result;

3576
	  name = s2->name;
3577 3578 3579 3580
	}
      else
	{
	  s2 = rvalue->symtree->n.sym;
3581 3582 3583
	  name = s2->name;
	}

3584
      if (s2 && s2->attr.proc_pointer && s2->ts.interface)
3585 3586 3587
	s2 = s2->ts.interface;

      if (s1 == s2 || !s1 || !s2)
3588
	return true;
3589

3590 3591 3592 3593
      /* F08:7.2.2.4 (4)  */
      if (s1->attr.if_source == IFSRC_UNKNOWN
	  && gfc_explicit_interface_required (s2, err, sizeof(err)))
	{
3594
	  gfc_error ("Explicit interface required for %qs at %L: %s",
3595 3596 3597 3598 3599 3600
		     s1->name, &lvalue->where, err);
	  return false;
	}
      if (s2->attr.if_source == IFSRC_UNKNOWN
	  && gfc_explicit_interface_required (s1, err, sizeof(err)))
	{
3601
	  gfc_error ("Explicit interface required for %qs at %L: %s",
3602 3603 3604 3605
		     s2->name, &rvalue->where, err);
	  return false;
	}

3606 3607 3608 3609 3610
      if (!gfc_compare_interfaces (s1, s2, name, 0, 1,
				   err, sizeof(err), NULL, NULL))
	{
	  gfc_error ("Interface mismatch in procedure pointer assignment "
		     "at %L: %s", &rvalue->where, err);
3611
	  return false;
3612 3613
	}

3614 3615 3616 3617
      /* Check F2008Cor2, C729.  */
      if (!s2->attr.intrinsic && s2->attr.if_source == IFSRC_UNKNOWN
	  && !s2->attr.external && !s2->attr.subroutine && !s2->attr.function)
	{
3618
	  gfc_error ("Procedure pointer target %qs at %L must be either an "
3619 3620 3621 3622 3623
		     "intrinsic, host or use associated, referenced or have "
		     "the EXTERNAL attribute", s2->name, &rvalue->where);
	  return false;
	}

3624
      return true;
3625
    }
3626

3627
  if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
3628
    {
3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644
      /* Check for F03:C717.  */
      if (UNLIMITED_POLY (rvalue)
	  && !(UNLIMITED_POLY (lvalue)
	       || (lvalue->ts.type == BT_DERIVED
		   && (lvalue->ts.u.derived->attr.is_bind_c
		       || lvalue->ts.u.derived->attr.sequence))))
	gfc_error ("Data-pointer-object &L must be unlimited "
		   "polymorphic, a sequence derived type or of a "
		   "type with the BIND attribute assignment at %L "
		   "to be compatible with an unlimited polymorphic "
		   "target", &lvalue->where);
      else
	gfc_error ("Different types in pointer assignment at %L; "
		   "attempted assignment of %s to %s", &lvalue->where,
		   gfc_typename (&rvalue->ts),
		   gfc_typename (&lvalue->ts));
3645
      return false;
3646
    }
3647

3648
  if (lvalue->ts.type != BT_CLASS && lvalue->ts.kind != rvalue->ts.kind)
3649
    {
3650
      gfc_error ("Different kind type parameters in pointer "
3651
		 "assignment at %L", &lvalue->where);
3652
      return false;
3653
    }
3654

3655
  if (lvalue->rank != rvalue->rank && !rank_remap)
3656
    {
3657
      gfc_error ("Different ranks in pointer assignment at %L", &lvalue->where);
3658
      return false;
3659 3660
    }

3661 3662 3663
  /* Make sure the vtab is present.  */
  if (lvalue->ts.type == BT_CLASS && !UNLIMITED_POLY (rvalue))
    gfc_find_vtab (&rvalue->ts);
3664

3665 3666 3667 3668 3669 3670 3671
  /* Check rank remapping.  */
  if (rank_remap)
    {
      mpz_t lsize, rsize;

      /* If this can be determined, check that the target must be at least as
	 large as the pointer assigned to it is.  */
3672 3673
      if (gfc_array_size (lvalue, &lsize)
	  && gfc_array_size (rvalue, &rsize)
3674 3675 3676 3677 3678 3679
	  && mpz_cmp (rsize, lsize) < 0)
	{
	  gfc_error ("Rank remapping target is smaller than size of the"
		     " pointer (%ld < %ld) at %L",
		     mpz_get_si (rsize), mpz_get_si (lsize),
		     &lvalue->where);
3680
	  return false;
3681 3682 3683 3684 3685 3686 3687 3688 3689 3690
	}

      /* The target must be either rank one or it must be simply contiguous
	 and F2008 must be allowed.  */
      if (rvalue->rank != 1)
	{
	  if (!gfc_is_simply_contiguous (rvalue, true))
	    {
	      gfc_error ("Rank remapping target must be rank 1 or"
			 " simply contiguous at %L", &rvalue->where);
3691
	      return false;
3692
	    }
3693 3694 3695
	  if (!gfc_notify_std (GFC_STD_F2008, "Rank remapping target is not "
			       "rank 1 at %L", &rvalue->where))
	    return false;
3696 3697 3698
	}
    }

3699 3700
  /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X).  */
  if (rvalue->expr_type == EXPR_NULL)
3701
    return true;
3702

3703
  if (lvalue->ts.type == BT_CHARACTER)
Paul Thomas committed
3704
    {
3705 3706 3707
      bool t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
      if (!t)
	return false;
Paul Thomas committed
3708 3709
    }

3710 3711 3712
  if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
    lvalue->symtree->n.sym->attr.subref_array_pointer = 1;

3713
  attr = gfc_expr_attr (rvalue);
3714 3715 3716 3717 3718 3719

  if (rvalue->expr_type == EXPR_FUNCTION && !attr.pointer)
    {
      gfc_error ("Target expression in pointer assignment "
		 "at %L must deliver a pointer result",
		 &rvalue->where);
3720
      return false;
3721 3722
    }

3723 3724
  if (!attr.target && !attr.pointer)
    {
3725
      gfc_error ("Pointer assignment target is neither TARGET "
3726
		 "nor POINTER at %L", &rvalue->where);
3727
      return false;
3728
    }
3729

3730 3731
  if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
    {
3732
      gfc_error ("Bad target in pointer assignment in PURE "
3733 3734
		 "procedure at %L", &rvalue->where);
    }
3735

3736
  if (is_implicit_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3737
    gfc_unset_implicit_pure (gfc_current_ns->proc_name);
3738

3739 3740 3741 3742
  if (gfc_has_vector_index (rvalue))
    {
      gfc_error ("Pointer assignment with vector subscript "
		 "on rhs at %L", &rvalue->where);
3743
      return false;
3744 3745
    }

3746 3747
  if (attr.is_protected && attr.use_assoc
      && !(attr.pointer || attr.proc_pointer))
3748
    {
3749
      gfc_error ("Pointer assignment target has PROTECTED "
3750
		 "attribute at %L", &rvalue->where);
3751
      return false;
3752 3753
    }

3754 3755 3756 3757 3758 3759 3760 3761 3762 3763
  /* F2008, C725. For PURE also C1283.  */
  if (rvalue->expr_type == EXPR_VARIABLE
      && gfc_is_coindexed (rvalue))
    {
      gfc_ref *ref;
      for (ref = rvalue->ref; ref; ref = ref->next)
	if (ref->type == REF_ARRAY && ref->u.ar.codimen)
	  {
	    gfc_error ("Data target at %L shall not have a coindex",
		       &rvalue->where);
3764
	    return false;
3765 3766 3767
	  }
    }

3768
  /* Warn if it is the LHS pointer may lives longer than the RHS target.  */
3769
  if (warn_target_lifetime
3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781
      && rvalue->expr_type == EXPR_VARIABLE
      && !rvalue->symtree->n.sym->attr.save
      && !attr.pointer && !rvalue->symtree->n.sym->attr.host_assoc
      && !rvalue->symtree->n.sym->attr.in_common
      && !rvalue->symtree->n.sym->attr.use_assoc
      && !rvalue->symtree->n.sym->attr.dummy)
    {
      bool warn;
      gfc_namespace *ns;

      warn = lvalue->symtree->n.sym->attr.dummy
	     || lvalue->symtree->n.sym->attr.result
3782
	     || lvalue->symtree->n.sym->attr.function
3783 3784 3785
	     || (lvalue->symtree->n.sym->attr.host_assoc
		 && lvalue->symtree->n.sym->ns
		    != rvalue->symtree->n.sym->ns)
3786 3787 3788 3789 3790 3791 3792
	     || lvalue->symtree->n.sym->attr.use_assoc
	     || lvalue->symtree->n.sym->attr.in_common;

      if (rvalue->symtree->n.sym->ns->proc_name
	  && rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROCEDURE
	  && rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROGRAM)
       for (ns = rvalue->symtree->n.sym->ns;
3793
	    ns && ns->proc_name && ns->proc_name->attr.flavor != FL_PROCEDURE;
3794 3795
	    ns = ns->parent)
	if (ns->parent == lvalue->symtree->n.sym->ns)
3796 3797 3798 3799
	  {
	    warn = true;
	    break;
	  }
3800 3801

      if (warn)
3802 3803
	gfc_warning (OPT_Wtarget_lifetime,
		     "Pointer at %L in pointer assignment might outlive the "
3804 3805 3806
		     "pointer target", &lvalue->where);
    }

3807
  return true;
3808 3809 3810 3811
}


/* Relative of gfc_check_assign() except that the lvalue is a single
3812
   symbol.  Used for initialization assignments.  */
3813

3814
bool
3815
gfc_check_assign_symbol (gfc_symbol *sym, gfc_component *comp, gfc_expr *rvalue)
3816 3817
{
  gfc_expr lvalue;
3818
  bool r;
3819
  bool pointer, proc_pointer;
3820 3821 3822 3823 3824 3825 3826

  memset (&lvalue, '\0', sizeof (gfc_expr));

  lvalue.expr_type = EXPR_VARIABLE;
  lvalue.ts = sym->ts;
  if (sym->as)
    lvalue.rank = sym->as->rank;
3827
  lvalue.symtree = XCNEW (gfc_symtree);
3828 3829 3830
  lvalue.symtree->n.sym = sym;
  lvalue.where = sym->declared_at;

3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851
  if (comp)
    {
      lvalue.ref = gfc_get_ref ();
      lvalue.ref->type = REF_COMPONENT;
      lvalue.ref->u.c.component = comp;
      lvalue.ref->u.c.sym = sym;
      lvalue.ts = comp->ts;
      lvalue.rank = comp->as ? comp->as->rank : 0;
      lvalue.where = comp->loc;
      pointer = comp->ts.type == BT_CLASS &&  CLASS_DATA (comp)
		? CLASS_DATA (comp)->attr.class_pointer : comp->attr.pointer;
      proc_pointer = comp->attr.proc_pointer;
    }
  else
    {
      pointer = sym->ts.type == BT_CLASS &&  CLASS_DATA (sym)
		? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer;
      proc_pointer = sym->attr.proc_pointer;
    }

  if (pointer || proc_pointer)
3852 3853 3854
    r = gfc_check_pointer_assign (&lvalue, rvalue);
  else
    r = gfc_check_assign (&lvalue, rvalue, 1);
3855

3856
  free (lvalue.symtree);
3857
  free (lvalue.ref);
3858

3859
  if (!r)
3860
    return r;
3861

3862
  if (pointer && rvalue->expr_type != EXPR_NULL)
3863 3864 3865 3866 3867 3868
    {
      /* F08:C461. Additional checks for pointer initialization.  */
      symbol_attribute attr;
      attr = gfc_expr_attr (rvalue);
      if (attr.allocatable)
	{
3869 3870
	  gfc_error ("Pointer initialization target at %L "
	             "must not be ALLOCATABLE", &rvalue->where);
3871
	  return false;
3872
	}
3873
      if (!attr.target || attr.pointer)
3874
	{
3875 3876
	  gfc_error ("Pointer initialization target at %L "
		     "must have the TARGET attribute", &rvalue->where);
3877
	  return false;
3878
	}
3879 3880 3881 3882 3883 3884 3885 3886 3887

      if (!attr.save && rvalue->expr_type == EXPR_VARIABLE
	  && rvalue->symtree->n.sym->ns->proc_name
	  && rvalue->symtree->n.sym->ns->proc_name->attr.is_main_program)
	{
	  rvalue->symtree->n.sym->ns->proc_name->attr.save = SAVE_IMPLICIT;
	  attr.save = SAVE_IMPLICIT;
	}

3888 3889
      if (!attr.save)
	{
3890 3891
	  gfc_error ("Pointer initialization target at %L "
		     "must have the SAVE attribute", &rvalue->where);
3892
	  return false;
3893 3894
	}
    }
3895

3896
  if (proc_pointer && rvalue->expr_type != EXPR_NULL)
3897 3898 3899 3900 3901 3902 3903
    {
      /* F08:C1220. Additional checks for procedure pointer initialization.  */
      symbol_attribute attr = gfc_expr_attr (rvalue);
      if (attr.proc_pointer)
	{
	  gfc_error ("Procedure pointer initialization target at %L "
		     "may not be a procedure pointer", &rvalue->where);
3904
	  return false;
3905 3906
	}
    }
3907

3908
  return true;
3909
}
3910 3911


3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926
/* Check for default initializer; sym->value is not enough
   as it is also set for EXPR_NULL of allocatables.  */

bool
gfc_has_default_initializer (gfc_symbol *der)
{
  gfc_component *c;

  gcc_assert (der->attr.flavor == FL_DERIVED);
  for (c = der->components; c; c = c->next)
    if (c->ts.type == BT_DERIVED)
      {
        if (!c->attr.pointer
	     && gfc_has_default_initializer (c->ts.u.derived))
	  return true;
3927 3928
	if (c->attr.pointer && c->initializer)
	  return true;
3929 3930 3931 3932 3933 3934 3935 3936 3937 3938
      }
    else
      {
        if (c->initializer)
	  return true;
      }

  return false;
}

3939

3940 3941 3942 3943 3944 3945
/* Get an expression for a default initializer.  */

gfc_expr *
gfc_default_initializer (gfc_typespec *ts)
{
  gfc_expr *init;
Jerry DeLisle committed
3946
  gfc_component *comp;
3947

3948 3949
  /* See if we have a default initializer in this, but not in nested
     types (otherwise we could use gfc_has_default_initializer()).  */
Jerry DeLisle committed
3950
  for (comp = ts->u.derived->components; comp; comp = comp->next)
3951
    if (comp->initializer || comp->attr.allocatable
3952 3953
	|| (comp->ts.type == BT_CLASS && CLASS_DATA (comp)
	    && CLASS_DATA (comp)->attr.allocatable))
3954
      break;
3955

Jerry DeLisle committed
3956
  if (!comp)
3957 3958
    return NULL;

Jerry DeLisle committed
3959 3960
  init = gfc_get_structure_constructor_expr (ts->type, ts->kind,
					     &ts->u.derived->declared_at);
3961
  init->ts = *ts;
3962

Jerry DeLisle committed
3963
  for (comp = ts->u.derived->components; comp; comp = comp->next)
3964
    {
Jerry DeLisle committed
3965
      gfc_constructor *ctor = gfc_constructor_get();
3966

Jerry DeLisle committed
3967
      if (comp->initializer)
3968 3969 3970 3971 3972 3973 3974
	{
	  ctor->expr = gfc_copy_expr (comp->initializer);
	  if ((comp->ts.type != comp->initializer->ts.type
	       || comp->ts.kind != comp->initializer->ts.kind)
	      && !comp->attr.pointer && !comp->attr.proc_pointer)
	    gfc_convert_type_warn (ctor->expr, &comp->ts, 2, false);
	}
Paul Thomas committed
3975

3976 3977
      if (comp->attr.allocatable
	  || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
Paul Thomas committed
3978
	{
Jerry DeLisle committed
3979 3980 3981
	  ctor->expr = gfc_get_expr ();
	  ctor->expr->expr_type = EXPR_NULL;
	  ctor->expr->ts = comp->ts;
Paul Thomas committed
3982
	}
Jerry DeLisle committed
3983 3984

      gfc_constructor_append (&init->value.constructor, ctor);
3985
    }
Jerry DeLisle committed
3986

3987 3988
  return init;
}
3989 3990 3991 3992 3993 3994 3995


/* Given a symbol, create an expression node with that symbol as a
   variable. If the symbol is array valued, setup a reference of the
   whole array.  */

gfc_expr *
3996
gfc_get_variable_expr (gfc_symtree *var)
3997 3998 3999 4000 4001 4002 4003 4004
{
  gfc_expr *e;

  e = gfc_get_expr ();
  e->expr_type = EXPR_VARIABLE;
  e->symtree = var;
  e->ts = var->n.sym->ts;

4005 4006 4007 4008
  if (var->n.sym->attr.flavor != FL_PROCEDURE
      && ((var->n.sym->as != NULL && var->n.sym->ts.type != BT_CLASS)
	   || (var->n.sym->ts.type == BT_CLASS && CLASS_DATA (var->n.sym)
	       && CLASS_DATA (var->n.sym)->as)))
4009
    {
4010 4011
      e->rank = var->n.sym->ts.type == BT_CLASS
		? CLASS_DATA (var->n.sym)->as->rank : var->n.sym->as->rank;
4012 4013 4014
      e->ref = gfc_get_ref ();
      e->ref->type = REF_ARRAY;
      e->ref->u.ar.type = AR_FULL;
4015 4016 4017
      e->ref->u.ar.as = gfc_copy_array_spec (var->n.sym->ts.type == BT_CLASS
					     ? CLASS_DATA (var->n.sym)->as
					     : var->n.sym->as);
4018 4019 4020 4021 4022
    }

  return e;
}

4023

4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050
/* Adds a full array reference to an expression, as needed.  */

void
gfc_add_full_array_ref (gfc_expr *e, gfc_array_spec *as)
{
  gfc_ref *ref;
  for (ref = e->ref; ref; ref = ref->next)
    if (!ref->next)
      break;
  if (ref)
    {
      ref->next = gfc_get_ref ();
      ref = ref->next;
    }
  else
    {
      e->ref = gfc_get_ref ();
      ref = e->ref;
    }
  ref->type = REF_ARRAY;
  ref->u.ar.type = AR_FULL;
  ref->u.ar.dimen = e->rank;
  ref->u.ar.where = e->where;
  ref->u.ar.as = as;
}


4051 4052 4053 4054
gfc_expr *
gfc_lval_expr_from_sym (gfc_symbol *sym)
{
  gfc_expr *lval;
Andre Vehreschild committed
4055
  gfc_array_spec *as;
4056 4057 4058 4059 4060 4061 4062
  lval = gfc_get_expr ();
  lval->expr_type = EXPR_VARIABLE;
  lval->where = sym->declared_at;
  lval->ts = sym->ts;
  lval->symtree = gfc_find_symtree (sym->ns->sym_root, sym->name);

  /* It will always be a full array.  */
Andre Vehreschild committed
4063 4064
  as = IS_CLASS_ARRAY (sym) ? CLASS_DATA (sym)->as : sym->as;
  lval->rank = as ? as->rank : 0;
4065
  if (lval->rank)
Andre Vehreschild committed
4066
    gfc_add_full_array_ref (lval, as);
4067 4068 4069 4070
  return lval;
}


4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122
/* Returns the array_spec of a full array expression.  A NULL is
   returned otherwise.  */
gfc_array_spec *
gfc_get_full_arrayspec_from_expr (gfc_expr *expr)
{
  gfc_array_spec *as;
  gfc_ref *ref;

  if (expr->rank == 0)
    return NULL;

  /* Follow any component references.  */
  if (expr->expr_type == EXPR_VARIABLE
      || expr->expr_type == EXPR_CONSTANT)
    {
      as = expr->symtree->n.sym->as;
      for (ref = expr->ref; ref; ref = ref->next)
	{
	  switch (ref->type)
	    {
	    case REF_COMPONENT:
	      as = ref->u.c.component->as;
	      continue;

	    case REF_SUBSTRING:
	      continue;

	    case REF_ARRAY:
	      {
		switch (ref->u.ar.type)
		  {
		  case AR_ELEMENT:
		  case AR_SECTION:
		  case AR_UNKNOWN:
		    as = NULL;
		    continue;

		  case AR_FULL:
		    break;
		  }
		break;
	      }
	    }
	}
    }
  else
    as = NULL;

  return as;
}


Paul Thomas committed
4123
/* General expression traversal function.  */
4124

Paul Thomas committed
4125 4126 4127 4128
bool
gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
		   bool (*func)(gfc_expr *, gfc_symbol *, int*),
		   int f)
4129
{
Paul Thomas committed
4130
  gfc_array_ref ar;
4131
  gfc_ref *ref;
Paul Thomas committed
4132 4133
  gfc_actual_arglist *args;
  gfc_constructor *c;
4134 4135
  int i;

Paul Thomas committed
4136 4137
  if (!expr)
    return false;
4138

4139 4140
  if ((*func) (expr, sym, &f))
    return true;
4141

4142
  if (expr->ts.type == BT_CHARACTER
4143 4144 4145 4146
	&& expr->ts.u.cl
	&& expr->ts.u.cl->length
	&& expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
	&& gfc_traverse_expr (expr->ts.u.cl->length, sym, func, f))
4147
    return true;
4148

4149 4150
  switch (expr->expr_type)
    {
4151 4152
    case EXPR_PPC:
    case EXPR_COMPCALL:
Paul Thomas committed
4153 4154 4155 4156 4157 4158
    case EXPR_FUNCTION:
      for (args = expr->value.function.actual; args; args = args->next)
	{
	  if (gfc_traverse_expr (args->expr, sym, func, f))
	    return true;
	}
4159 4160
      break;

4161
    case EXPR_VARIABLE:
4162 4163 4164 4165 4166 4167 4168
    case EXPR_CONSTANT:
    case EXPR_NULL:
    case EXPR_SUBSTRING:
      break;

    case EXPR_STRUCTURE:
    case EXPR_ARRAY:
Jerry DeLisle committed
4169 4170
      for (c = gfc_constructor_first (expr->value.constructor);
	   c; c = gfc_constructor_next (c))
4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185
	{
	  if (gfc_traverse_expr (c->expr, sym, func, f))
	    return true;
	  if (c->iterator)
	    {
	      if (gfc_traverse_expr (c->iterator->var, sym, func, f))
		return true;
	      if (gfc_traverse_expr (c->iterator->start, sym, func, f))
		return true;
	      if (gfc_traverse_expr (c->iterator->end, sym, func, f))
		return true;
	      if (gfc_traverse_expr (c->iterator->step, sym, func, f))
		return true;
	    }
	}
4186 4187
      break;

Paul Thomas committed
4188 4189 4190 4191 4192 4193 4194
    case EXPR_OP:
      if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
	return true;
      if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
	return true;
      break;

4195 4196 4197 4198 4199
    default:
      gcc_unreachable ();
      break;
    }

Paul Thomas committed
4200 4201 4202
  ref = expr->ref;
  while (ref != NULL)
    {
4203
      switch (ref->type)
4204
	{
Paul Thomas committed
4205 4206 4207
	case  REF_ARRAY:
	  ar = ref->u.ar;
	  for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
4208
	    {
Paul Thomas committed
4209 4210 4211 4212 4213 4214
	      if (gfc_traverse_expr (ar.start[i], sym, func, f))
		return true;
	      if (gfc_traverse_expr (ar.end[i], sym, func, f))
		return true;
	      if (gfc_traverse_expr (ar.stride[i], sym, func, f))
		return true;
4215 4216
	    }
	  break;
Paul Thomas committed
4217

4218
	case REF_SUBSTRING:
Paul Thomas committed
4219 4220 4221 4222
	  if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
	    return true;
	  if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
	    return true;
4223
	  break;
Paul Thomas committed
4224

4225 4226
	case REF_COMPONENT:
	  if (ref->u.c.component->ts.type == BT_CHARACTER
4227 4228 4229
		&& ref->u.c.component->ts.u.cl
		&& ref->u.c.component->ts.u.cl->length
		&& ref->u.c.component->ts.u.cl->length->expr_type
4230
		     != EXPR_CONSTANT
4231
		&& gfc_traverse_expr (ref->u.c.component->ts.u.cl->length,
4232 4233 4234 4235
				      sym, func, f))
	    return true;

	  if (ref->u.c.component->as)
4236 4237
	    for (i = 0; i < ref->u.c.component->as->rank
			    + ref->u.c.component->as->corank; i++)
4238 4239 4240 4241 4242 4243 4244 4245 4246
	      {
		if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
				       sym, func, f))
		  return true;
		if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
				       sym, func, f))
		  return true;
	      }
	  break;
Paul Thomas committed
4247

4248 4249 4250
	default:
	  gcc_unreachable ();
	}
Paul Thomas committed
4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262
      ref = ref->next;
    }
  return false;
}

/* Traverse expr, marking all EXPR_VARIABLE symbols referenced.  */

static bool
expr_set_symbols_referenced (gfc_expr *expr,
			     gfc_symbol *sym ATTRIBUTE_UNUSED,
			     int *f ATTRIBUTE_UNUSED)
{
4263 4264
  if (expr->expr_type != EXPR_VARIABLE)
    return false;
Paul Thomas committed
4265 4266 4267 4268 4269 4270 4271 4272
  gfc_set_sym_referenced (expr->symtree->n.sym);
  return false;
}

void
gfc_expr_set_symbols_referenced (gfc_expr *expr)
{
  gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
4273
}
4274 4275


4276 4277
/* Determine if an expression is a procedure pointer component and return
   the component in that case.  Otherwise return NULL.  */
4278

4279 4280
gfc_component *
gfc_get_proc_ptr_comp (gfc_expr *expr)
4281 4282 4283 4284
{
  gfc_ref *ref;

  if (!expr || !expr->ref)
4285
    return NULL;
4286 4287 4288 4289 4290

  ref = expr->ref;
  while (ref->next)
    ref = ref->next;

4291 4292 4293 4294 4295 4296 4297
  if (ref->type == REF_COMPONENT
      && ref->u.c.component->attr.proc_pointer)
    return ref->u.c.component;

  return NULL;
}

4298

4299 4300 4301 4302 4303 4304
/* Determine if an expression is a procedure pointer component.  */

bool
gfc_is_proc_ptr_comp (gfc_expr *expr)
{
  return (gfc_get_proc_ptr_comp (expr) != NULL);
4305 4306 4307
}


4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341
/* Determine if an expression is a function with an allocatable class scalar
   result.  */
bool
gfc_is_alloc_class_scalar_function (gfc_expr *expr)
{
  if (expr->expr_type == EXPR_FUNCTION
      && expr->value.function.esym
      && expr->value.function.esym->result
      && expr->value.function.esym->result->ts.type == BT_CLASS
      && !CLASS_DATA (expr->value.function.esym->result)->attr.dimension
      && CLASS_DATA (expr->value.function.esym->result)->attr.allocatable)
    return true;

  return false;
}


/* Determine if an expression is a function with an allocatable class array
   result.  */
bool
gfc_is_alloc_class_array_function (gfc_expr *expr)
{
  if (expr->expr_type == EXPR_FUNCTION
      && expr->value.function.esym
      && expr->value.function.esym->result
      && expr->value.function.esym->result->ts.type == BT_CLASS
      && CLASS_DATA (expr->value.function.esym->result)->attr.dimension
      && CLASS_DATA (expr->value.function.esym->result)->attr.allocatable)
    return true;

  return false;
}


4342 4343
/* Walk an expression tree and check each variable encountered for being typed.
   If strict is not set, a top-level variable is tolerated untyped in -std=gnu
4344 4345
   mode as is a basic arithmetic expression using those; this is for things in
   legacy-code like:
4346 4347

     INTEGER :: arr(n), n
4348
     INTEGER :: arr(n + 1), n
4349 4350 4351

   The namespace is needed for IMPLICIT typing.  */

4352 4353 4354 4355 4356
static gfc_namespace* check_typed_ns;

static bool
expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
                       int* f ATTRIBUTE_UNUSED)
4357
{
4358
  bool t;
4359

4360 4361
  if (e->expr_type != EXPR_VARIABLE)
    return false;
4362

4363 4364 4365
  gcc_assert (e->symtree);
  t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
                              true, e->where);
4366

4367
  return (!t);
4368
}
4369

4370
bool
4371 4372 4373
gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
{
  bool error_found;
4374

4375 4376 4377 4378 4379 4380 4381 4382 4383
  /* If this is a top-level variable or EXPR_OP, do the check with strict given
     to us.  */
  if (!strict)
    {
      if (e->expr_type == EXPR_VARIABLE && !e->ref)
	return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);

      if (e->expr_type == EXPR_OP)
	{
4384
	  bool t = true;
4385 4386 4387 4388

	  gcc_assert (e->value.op.op1);
	  t = gfc_expr_check_typed (e->value.op.op1, ns, strict);

4389
	  if (t && e->value.op.op2)
4390 4391 4392 4393 4394
	    t = gfc_expr_check_typed (e->value.op.op2, ns, strict);

	  return t;
	}
    }
4395

4396 4397 4398
  /* Otherwise, walk the expression and do it strictly.  */
  check_typed_ns = ns;
  error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
4399

4400
  return error_found ? false : true;
4401
}
4402

4403

4404
bool
4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419
gfc_ref_this_image (gfc_ref *ref)
{
  int n;

  gcc_assert (ref->type == REF_ARRAY && ref->u.ar.codimen > 0);

  for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
    if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
      return false;

  return true;
}


bool
4420 4421 4422 4423 4424 4425
gfc_is_coindexed (gfc_expr *e)
{
  gfc_ref *ref;

  for (ref = e->ref; ref; ref = ref->next)
    if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4426
      return !gfc_ref_this_image (ref);
4427 4428 4429 4430 4431

  return false;
}


4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462
/* Coarrays are variables with a corank but not being coindexed. However, also
   the following is a coarray: A subobject of a coarray is a coarray if it does
   not have any cosubscripts, vector subscripts, allocatable component
   selection, or pointer component selection. (F2008, 2.4.7)  */

bool
gfc_is_coarray (gfc_expr *e)
{
  gfc_ref *ref;
  gfc_symbol *sym;
  gfc_component *comp;
  bool coindexed;
  bool coarray;
  int i;

  if (e->expr_type != EXPR_VARIABLE)
    return false;

  coindexed = false;
  sym = e->symtree->n.sym;

  if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
    coarray = CLASS_DATA (sym)->attr.codimension;
  else
    coarray = sym->attr.codimension;

  for (ref = e->ref; ref; ref = ref->next)
    switch (ref->type)
    {
      case REF_COMPONENT:
	comp = ref->u.c.component;
4463 4464 4465
	if (comp->ts.type == BT_CLASS && comp->attr.class_ok
	    && (CLASS_DATA (comp)->attr.class_pointer
		|| CLASS_DATA (comp)->attr.allocatable))
4466 4467
	  {
	    coindexed = false;
4468 4469 4470 4471 4472 4473
	    coarray = CLASS_DATA (comp)->attr.codimension;
	  }
        else if (comp->attr.pointer || comp->attr.allocatable)
	  {
	    coindexed = false;
	    coarray = comp->attr.codimension;
4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502
	  }
        break;

     case REF_ARRAY:
	if (!coarray)
	  break;

	if (ref->u.ar.codimen > 0 && !gfc_ref_this_image (ref))
	  {
	    coindexed = true;
	    break;
	  }

	for (i = 0; i < ref->u.ar.dimen; i++)
	  if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
	    {
	      coarray = false;
	      break;
	    }
	break;

     case REF_SUBSTRING:
	break;
    }

  return coarray && !coindexed;
}


4503
int
4504 4505 4506 4507
gfc_get_corank (gfc_expr *e)
{
  int corank;
  gfc_ref *ref;
4508 4509 4510 4511

  if (!gfc_is_coarray (e))
    return 0;

4512 4513 4514
  if (e->ts.type == BT_CLASS && e->ts.u.derived->components)
    corank = e->ts.u.derived->components->as
	     ? e->ts.u.derived->components->as->corank : 0;
4515
  else
4516
    corank = e->symtree->n.sym->as ? e->symtree->n.sym->as->corank : 0;
4517

4518 4519 4520 4521 4522 4523
  for (ref = e->ref; ref; ref = ref->next)
    {
      if (ref->type == REF_ARRAY)
	corank = ref->u.ar.as->corank;
      gcc_assert (ref->type != REF_SUBSTRING);
    }
4524

4525 4526 4527 4528
  return corank;
}


4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543
/* Check whether the expression has an ultimate allocatable component.
   Being itself allocatable does not count.  */
bool
gfc_has_ultimate_allocatable (gfc_expr *e)
{
  gfc_ref *ref, *last = NULL;

  if (e->expr_type != EXPR_VARIABLE)
    return false;

  for (ref = e->ref; ref; ref = ref->next)
    if (ref->type == REF_COMPONENT)
      last = ref;

  if (last && last->u.c.component->ts.type == BT_CLASS)
4544
    return CLASS_DATA (last->u.c.component)->attr.alloc_comp;
4545 4546 4547 4548 4549 4550
  else if (last && last->u.c.component->ts.type == BT_DERIVED)
    return last->u.c.component->ts.u.derived->attr.alloc_comp;
  else if (last)
    return false;

  if (e->ts.type == BT_CLASS)
4551
    return CLASS_DATA (e)->attr.alloc_comp;
4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571
  else if (e->ts.type == BT_DERIVED)
    return e->ts.u.derived->attr.alloc_comp;
  else
    return false;
}


/* Check whether the expression has an pointer component.
   Being itself a pointer does not count.  */
bool
gfc_has_ultimate_pointer (gfc_expr *e)
{
  gfc_ref *ref, *last = NULL;

  if (e->expr_type != EXPR_VARIABLE)
    return false;

  for (ref = e->ref; ref; ref = ref->next)
    if (ref->type == REF_COMPONENT)
      last = ref;
4572

4573
  if (last && last->u.c.component->ts.type == BT_CLASS)
4574
    return CLASS_DATA (last->u.c.component)->attr.pointer_comp;
4575 4576 4577 4578 4579 4580
  else if (last && last->u.c.component->ts.type == BT_DERIVED)
    return last->u.c.component->ts.u.derived->attr.pointer_comp;
  else if (last)
    return false;

  if (e->ts.type == BT_CLASS)
4581
    return CLASS_DATA (e)->attr.pointer_comp;
4582 4583 4584 4585 4586
  else if (e->ts.type == BT_DERIVED)
    return e->ts.u.derived->attr.pointer_comp;
  else
    return false;
}
4587 4588 4589 4590


/* Check whether an expression is "simply contiguous", cf. F2008, 6.5.4.
   Note: A scalar is not regarded as "simply contiguous" by the standard.
4591
   if bool is not strict, some further checks are done - for instance,
4592 4593 4594 4595 4596 4597 4598 4599 4600
   a "(::1)" is accepted.  */

bool
gfc_is_simply_contiguous (gfc_expr *expr, bool strict)
{
  bool colon;
  int i;
  gfc_array_ref *ar = NULL;
  gfc_ref *ref, *part_ref = NULL;
4601
  gfc_symbol *sym;
4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614

  if (expr->expr_type == EXPR_FUNCTION)
    return expr->value.function.esym
	   ? expr->value.function.esym->result->attr.contiguous : false;
  else if (expr->expr_type != EXPR_VARIABLE)
    return false;

  if (expr->rank == 0)
    return false;

  for (ref = expr->ref; ref; ref = ref->next)
    {
      if (ar)
4615
	return false; /* Array shall be last part-ref.  */
4616 4617 4618 4619 4620 4621 4622 4623 4624

      if (ref->type == REF_COMPONENT)
	part_ref  = ref;
      else if (ref->type == REF_SUBSTRING)
	return false;
      else if (ref->u.ar.type != AR_ELEMENT)
	ar = &ref->u.ar;
    }

4625 4626 4627 4628 4629 4630 4631 4632
  sym = expr->symtree->n.sym;
  if (expr->ts.type != BT_CLASS
	&& ((part_ref
		&& !part_ref->u.c.component->attr.contiguous
		&& part_ref->u.c.component->attr.pointer)
	    || (!part_ref
		&& !sym->attr.contiguous
		&& (sym->attr.pointer
4633 4634
		    || sym->as->type == AS_ASSUMED_RANK
		    || sym->as->type == AS_ASSUMED_SHAPE))))
4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668
    return false;

  if (!ar || ar->type == AR_FULL)
    return true;

  gcc_assert (ar->type == AR_SECTION);

  /* Check for simply contiguous array */
  colon = true;
  for (i = 0; i < ar->dimen; i++)
    {
      if (ar->dimen_type[i] == DIMEN_VECTOR)
	return false;

      if (ar->dimen_type[i] == DIMEN_ELEMENT)
	{
	  colon = false;
	  continue;
	}

      gcc_assert (ar->dimen_type[i] == DIMEN_RANGE);


      /* If the previous section was not contiguous, that's an error,
	 unless we have effective only one element and checking is not
	 strict.  */
      if (!colon && (strict || !ar->start[i] || !ar->end[i]
		     || ar->start[i]->expr_type != EXPR_CONSTANT
		     || ar->end[i]->expr_type != EXPR_CONSTANT
		     || mpz_cmp (ar->start[i]->value.integer,
				 ar->end[i]->value.integer) != 0))
	return false;

      /* Following the standard, "(::1)" or - if known at compile time -
4669
	 "(lbound:ubound)" are not simply contiguous; if strict
4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691
	 is false, they are regarded as simply contiguous.  */
      if (ar->stride[i] && (strict || ar->stride[i]->expr_type != EXPR_CONSTANT
			    || ar->stride[i]->ts.type != BT_INTEGER
			    || mpz_cmp_si (ar->stride[i]->value.integer, 1) != 0))
	return false;

      if (ar->start[i]
	  && (strict || ar->start[i]->expr_type != EXPR_CONSTANT
	      || !ar->as->lower[i]
	      || ar->as->lower[i]->expr_type != EXPR_CONSTANT
	      || mpz_cmp (ar->start[i]->value.integer,
			  ar->as->lower[i]->value.integer) != 0))
	colon = false;

      if (ar->end[i]
	  && (strict || ar->end[i]->expr_type != EXPR_CONSTANT
	      || !ar->as->upper[i]
	      || ar->as->upper[i]->expr_type != EXPR_CONSTANT
	      || mpz_cmp (ar->end[i]->value.integer,
			  ar->as->upper[i]->value.integer) != 0))
	colon = false;
    }
4692

4693 4694
  return true;
}
4695 4696 4697 4698 4699 4700 4701


/* Build call to an intrinsic procedure.  The number of arguments has to be
   passed (rather than ending the list with a NULL value) because we may
   want to add arguments but with a NULL-expression.  */

gfc_expr*
4702 4703
gfc_build_intrinsic_call (gfc_namespace *ns, gfc_isym_id id, const char* name,
			  locus where, unsigned numarg, ...)
4704 4705 4706 4707 4708 4709
{
  gfc_expr* result;
  gfc_actual_arglist* atail;
  gfc_intrinsic_sym* isym;
  va_list ap;
  unsigned i;
4710
  const char *mangled_name = gfc_get_string (GFC_PREFIX ("%s"), name);
4711

4712
  isym = gfc_intrinsic_function_by_id (id);
4713
  gcc_assert (isym);
4714

4715 4716 4717 4718
  result = gfc_get_expr ();
  result->expr_type = EXPR_FUNCTION;
  result->ts = isym->ts;
  result->where = where;
4719
  result->value.function.name = mangled_name;
4720 4721
  result->value.function.isym = isym;

4722 4723
  gfc_get_sym_tree (mangled_name, ns, &result->symtree, false);
  gfc_commit_symbol (result->symtree->n.sym);
4724 4725 4726
  gcc_assert (result->symtree
	      && (result->symtree->n.sym->attr.flavor == FL_PROCEDURE
		  || result->symtree->n.sym->attr.flavor == FL_UNKNOWN));
4727 4728 4729
  result->symtree->n.sym->intmod_sym_id = id;
  result->symtree->n.sym->attr.flavor = FL_PROCEDURE;
  result->symtree->n.sym->attr.intrinsic = 1;
4730
  result->symtree->n.sym->attr.artificial = 1;
4731

4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749
  va_start (ap, numarg);
  atail = NULL;
  for (i = 0; i < numarg; ++i)
    {
      if (atail)
	{
	  atail->next = gfc_get_actual_arglist ();
	  atail = atail->next;
	}
      else
	atail = result->value.function.actual = gfc_get_actual_arglist ();

      atail->expr = va_arg (ap, gfc_expr*);
    }
  va_end (ap);

  return result;
}
4750 4751 4752 4753 4754 4755


/* Check if an expression may appear in a variable definition context
   (F2008, 16.6.7) or pointer association context (F2008, 16.6.8).
   This is called from the various places when resolving
   the pieces that make up such a context.
4756 4757
   If own_scope is true (applies to, e.g., ac-implied-do/data-implied-do
   variables), some checks are not performed.
4758 4759

   Optionally, a possible error message can be suppressed if context is NULL
4760
   and just the return status (true / false) be requested.  */
4761

4762
bool
4763
gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj,
4764
			  bool own_scope, const char* context)
4765
{
4766
  gfc_symbol* sym = NULL;
4767 4768 4769 4770 4771
  bool is_pointer;
  bool check_intentin;
  bool ptr_component;
  symbol_attribute attr;
  gfc_ref* ref;
4772
  int i;
4773

4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784
  if (e->expr_type == EXPR_VARIABLE)
    {
      gcc_assert (e->symtree);
      sym = e->symtree->n.sym;
    }
  else if (e->expr_type == EXPR_FUNCTION)
    {
      gcc_assert (e->symtree);
      sym = e->value.function.esym ? e->value.function.esym : e->symtree->n.sym;
    }

4785 4786
  attr = gfc_expr_attr (e);
  if (!pointer && e->expr_type == EXPR_FUNCTION && attr.pointer)
4787 4788 4789 4790 4791 4792
    {
      if (!(gfc_option.allow_std & GFC_STD_F2008))
	{
	  if (context)
	    gfc_error ("Fortran 2008: Pointer functions in variable definition"
		       " context (%s) at %L", context, &e->where);
4793
	  return false;
4794 4795 4796
	}
    }
  else if (e->expr_type != EXPR_VARIABLE)
4797 4798 4799 4800
    {
      if (context)
	gfc_error ("Non-variable expression in variable definition context (%s)"
		   " at %L", context, &e->where);
4801
      return false;
4802 4803 4804 4805 4806
    }

  if (!pointer && sym->attr.flavor == FL_PARAMETER)
    {
      if (context)
4807
	gfc_error ("Named constant %qs in variable definition context (%s)"
4808
		   " at %L", sym->name, context, &e->where);
4809
      return false;
4810 4811 4812 4813 4814 4815
    }
  if (!pointer && sym->attr.flavor != FL_VARIABLE
      && !(sym->attr.flavor == FL_PROCEDURE && sym == sym->result)
      && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
    {
      if (context)
4816
	gfc_error ("%qs in variable definition context (%s) at %L is not"
4817
		   " a variable", sym->name, context, &e->where);
4818
      return false;
4819 4820 4821 4822 4823
    }

  /* Find out whether the expr is a pointer; this also means following
     component references to the last one.  */
  is_pointer = (attr.pointer || attr.proc_pointer);
4824
  if (pointer && !is_pointer)
4825 4826 4827 4828
    {
      if (context)
	gfc_error ("Non-POINTER in pointer association context (%s)"
		   " at %L", context, &e->where);
4829
      return false;
4830 4831
    }

4832 4833 4834 4835 4836 4837 4838 4839 4840 4841
  /* F2008, C1303.  */
  if (!alloc_obj
      && (attr.lock_comp
	  || (e->ts.type == BT_DERIVED
	      && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
	      && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)))
    {
      if (context)
	gfc_error ("LOCK_TYPE in variable definition context (%s) at %L",
		   context, &e->where);
4842
      return false;
4843 4844
    }

Tobias Burnus committed
4845 4846 4847 4848 4849
  /* INTENT(IN) dummy argument.  Check this, unless the object itself is the
     component of sub-component of a pointer; we need to distinguish
     assignment to a pointer component from pointer-assignment to a pointer
     component.  Note that (normal) assignment to procedure pointers is not
     possible.  */
4850
  check_intentin = !own_scope;
4851 4852
  ptr_component = (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
		  ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer;
4853 4854 4855 4856 4857
  for (ref = e->ref; ref && check_intentin; ref = ref->next)
    {
      if (ptr_component && ref->type == REF_COMPONENT)
	check_intentin = false;
      if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
Tobias Burnus committed
4858 4859 4860 4861 4862
	{
	  ptr_component = true;
	  if (!pointer)
	    check_intentin = false;
	}
4863 4864 4865 4866 4867 4868
    }
  if (check_intentin && sym->attr.intent == INTENT_IN)
    {
      if (pointer && is_pointer)
	{
	  if (context)
4869
	    gfc_error ("Dummy argument %qs with INTENT(IN) in pointer"
4870 4871
		       " association context (%s) at %L",
		       sym->name, context, &e->where);
4872
	  return false;
4873
	}
4874
      if (!pointer && !is_pointer && !sym->attr.pointer)
4875 4876
	{
	  if (context)
4877
	    gfc_error ("Dummy argument %qs with INTENT(IN) in variable"
4878 4879
		       " definition context (%s) at %L",
		       sym->name, context, &e->where);
4880
	  return false;
4881 4882 4883 4884
	}
    }

  /* PROTECTED and use-associated.  */
4885
  if (sym->attr.is_protected && sym->attr.use_assoc && check_intentin)
4886 4887 4888 4889
    {
      if (pointer && is_pointer)
	{
	  if (context)
4890
	    gfc_error ("Variable %qs is PROTECTED and can not appear in a"
4891 4892
		       " pointer association context (%s) at %L",
		       sym->name, context, &e->where);
4893
	  return false;
4894 4895 4896 4897
	}
      if (!pointer && !is_pointer)
	{
	  if (context)
4898
	    gfc_error ("Variable %qs is PROTECTED and can not appear in a"
4899 4900
		       " variable definition context (%s) at %L",
		       sym->name, context, &e->where);
4901
	  return false;
4902 4903 4904 4905 4906
	}
    }

  /* Variable not assignable from a PURE procedure but appears in
     variable definition context.  */
4907
  if (!pointer && !own_scope && gfc_pure (NULL) && gfc_impure_variable (sym))
4908 4909
    {
      if (context)
4910
	gfc_error ("Variable %qs can not appear in a variable definition"
4911 4912
		   " context (%s) at %L in PURE procedure",
		   sym->name, context, &e->where);
4913
      return false;
4914 4915
    }

4916 4917 4918 4919 4920
  if (!pointer && context && gfc_implicit_pure (NULL)
      && gfc_impure_variable (sym))
    {
      gfc_namespace *ns;
      gfc_symbol *sym;
4921

4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933
      for (ns = gfc_current_ns; ns; ns = ns->parent)
	{
	  sym = ns->proc_name;
	  if (sym == NULL)
	    break;
	  if (sym->attr.flavor == FL_PROCEDURE)
	    {
	      sym->attr.implicit_pure = 0;
	      break;
	    }
	}
    }
4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968
  /* Check variable definition context for associate-names.  */
  if (!pointer && sym->assoc)
    {
      const char* name;
      gfc_association_list* assoc;

      gcc_assert (sym->assoc->target);

      /* If this is a SELECT TYPE temporary (the association is used internally
	 for SELECT TYPE), silently go over to the target.  */
      if (sym->attr.select_type_temporary)
	{
	  gfc_expr* t = sym->assoc->target;

	  gcc_assert (t->expr_type == EXPR_VARIABLE);
	  name = t->symtree->name;

	  if (t->symtree->n.sym->assoc)
	    assoc = t->symtree->n.sym->assoc;
	  else
	    assoc = sym->assoc;
	}
      else
	{
	  name = sym->name;
	  assoc = sym->assoc;
	}
      gcc_assert (name && assoc);

      /* Is association to a valid variable?  */
      if (!assoc->variable)
	{
	  if (context)
	    {
	      if (assoc->target->expr_type == EXPR_VARIABLE)
4969
		gfc_error ("%qs at %L associated to vector-indexed target can"
4970 4971 4972
			   " not be used in a variable definition context (%s)",
			   name, &e->where, context);
	      else
4973
		gfc_error ("%qs at %L associated to expression can"
4974 4975 4976
			   " not be used in a variable definition context (%s)",
			   name, &e->where, context);
	    }
4977
	  return false;
4978 4979 4980
	}

      /* Target must be allowed to appear in a variable definition context.  */
4981
      if (!gfc_check_vardef_context (assoc->target, pointer, false, false, NULL))
4982 4983
	{
	  if (context)
4984
	    gfc_error_1 ("Associate-name '%s' can not appear in a variable"
4985 4986 4987 4988
		       " definition context (%s) at %L because its target"
		       " at %L can not, either",
		       name, context, &e->where,
		       &assoc->target->where);
4989
	  return false;
4990 4991 4992
	}
    }

4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024
  /* Check for same value in vector expression subscript.  */

  if (e->rank > 0)
    for (ref = e->ref; ref != NULL; ref = ref->next)
      if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
	for (i = 0; i < GFC_MAX_DIMENSIONS
	       && ref->u.ar.dimen_type[i] != 0; i++)
	  if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
	    {
	      gfc_expr *arr = ref->u.ar.start[i];
	      if (arr->expr_type == EXPR_ARRAY)
		{
		  gfc_constructor *c, *n;
		  gfc_expr *ec, *en;
		  
		  for (c = gfc_constructor_first (arr->value.constructor);
		       c != NULL; c = gfc_constructor_next (c))
		    {
		      if (c == NULL || c->iterator != NULL)
			continue;
		      
		      ec = c->expr;

		      for (n = gfc_constructor_next (c); n != NULL;
			   n = gfc_constructor_next (n))
			{
			  if (n->iterator != NULL)
			    continue;
			  
			  en = n->expr;
			  if (gfc_dep_compare_expr (ec, en) == 0)
			    {
5025
			      if (context)
5026 5027 5028 5029 5030 5031
				gfc_error_now_1 ("Elements with the same value "
						 "at %L and %L in vector "
						 "subscript in a variable "
						 "definition context (%s)",
						 &(ec->where), &(en->where),
						 context);
5032 5033 5034 5035 5036 5037 5038
			      return false;
			    }
			}
		    }
		}
	    }
  
5039
  return true;
5040
}