LCOV - code coverage report
Current view: top level - gcc/fortran - primary.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 94.4 % 2306 2176
Test Date: 2026-04-20 14:57:17 Functions: 100.0 % 46 46
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Primary expression subroutines
       2              :    Copyright (C) 2000-2026 Free Software Foundation, Inc.
       3              :    Contributed by Andy Vaught
       4              : 
       5              : This file is part of GCC.
       6              : 
       7              : GCC is free software; you can redistribute it and/or modify it under
       8              : 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              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15              : for more details.
      16              : 
      17              : You should have received a copy of the GNU General Public License
      18              : along with GCC; see the file COPYING3.  If not see
      19              : <http://www.gnu.org/licenses/>.  */
      20              : 
      21              : #include "config.h"
      22              : #include "system.h"
      23              : #include "coretypes.h"
      24              : #include "options.h"
      25              : #include "gfortran.h"
      26              : #include "arith.h"
      27              : #include "match.h"
      28              : #include "parse.h"
      29              : #include "constructor.h"
      30              : 
      31              : int matching_actual_arglist = 0;
      32              : 
      33              : /* Matches a kind-parameter expression, which is either a named
      34              :    symbolic constant or a nonnegative integer constant.  If
      35              :    successful, sets the kind value to the correct integer.
      36              :    The argument 'is_iso_c' signals whether the kind is an ISO_C_BINDING
      37              :    symbol like e.g. 'c_int'.  */
      38              : 
      39              : static match
      40       472304 : match_kind_param (int *kind, int *is_iso_c)
      41              : {
      42       472304 :   char name[GFC_MAX_SYMBOL_LEN + 1];
      43       472304 :   gfc_symbol *sym;
      44       472304 :   match m;
      45              : 
      46       472304 :   *is_iso_c = 0;
      47              : 
      48       472304 :   m = gfc_match_small_literal_int (kind, NULL, false);
      49       472304 :   if (m != MATCH_NO)
      50              :     return m;
      51              : 
      52        94744 :   m = gfc_match_name (name, false);
      53        94744 :   if (m != MATCH_YES)
      54              :     return m;
      55              : 
      56        93012 :   if (gfc_find_symbol (name, NULL, 1, &sym))
      57              :     return MATCH_ERROR;
      58              : 
      59        93012 :   if (sym == NULL)
      60              :     return MATCH_NO;
      61              : 
      62        93011 :   *is_iso_c = sym->attr.is_iso_c;
      63              : 
      64        93011 :   if (sym->attr.flavor != FL_PARAMETER)
      65              :     return MATCH_NO;
      66              : 
      67        93011 :   if (sym->value == NULL)
      68              :     return MATCH_NO;
      69              : 
      70        93010 :   if (gfc_extract_int (sym->value, kind))
      71              :     return MATCH_NO;
      72              : 
      73        93010 :   gfc_set_sym_referenced (sym);
      74              : 
      75        93010 :   if (*kind < 0)
      76              :     return MATCH_NO;
      77              : 
      78              :   return MATCH_YES;
      79              : }
      80              : 
      81              : 
      82              : /* Get a trailing kind-specification for non-character variables.
      83              :    Returns:
      84              :      * the integer kind value or
      85              :      * -1 if an error was generated,
      86              :      * -2 if no kind was found.
      87              :    The argument 'is_iso_c' signals whether the kind is an ISO_C_BINDING
      88              :    symbol like e.g. 'c_int'.  */
      89              : 
      90              : static int
      91      4566774 : get_kind (int *is_iso_c)
      92              : {
      93      4566774 :   int kind;
      94      4566774 :   match m;
      95              : 
      96      4566774 :   *is_iso_c = 0;
      97              : 
      98      4566774 :   if (gfc_match_char ('_', false) != MATCH_YES)
      99              :     return -2;
     100              : 
     101       472304 :   m = match_kind_param (&kind, is_iso_c);
     102       472304 :   if (m == MATCH_NO)
     103         1734 :     gfc_error ("Missing kind-parameter at %C");
     104              : 
     105       472304 :   return (m == MATCH_YES) ? kind : -1;
     106              : }
     107              : 
     108              : 
     109              : /* Given a character and a radix, see if the character is a valid
     110              :    digit in that radix.  */
     111              : 
     112              : bool
     113     30761866 : gfc_check_digit (char c, int radix)
     114              : {
     115     30761866 :   bool r;
     116              : 
     117     30761866 :   switch (radix)
     118              :     {
     119        15638 :     case 2:
     120        15638 :       r = ('0' <= c && c <= '1');
     121        15638 :       break;
     122              : 
     123        19182 :     case 8:
     124        19182 :       r = ('0' <= c && c <= '7');
     125        19182 :       break;
     126              : 
     127     30662263 :     case 10:
     128     30662263 :       r = ('0' <= c && c <= '9');
     129     30662263 :       break;
     130              : 
     131        64783 :     case 16:
     132        64783 :       r = ISXDIGIT (c);
     133        64783 :       break;
     134              : 
     135            0 :     default:
     136            0 :       gfc_internal_error ("gfc_check_digit(): bad radix");
     137              :     }
     138              : 
     139     30761866 :   return r;
     140              : }
     141              : 
     142              : 
     143              : /* Match the digit string part of an integer if signflag is not set,
     144              :    the signed digit string part if signflag is set.  If the buffer
     145              :    is NULL, we just count characters for the resolution pass.  Returns
     146              :    the number of characters matched, -1 for no match.  */
     147              : 
     148              : static int
     149     17968481 : match_digits (int signflag, int radix, char *buffer)
     150              : {
     151     17968481 :   locus old_loc;
     152     17968481 :   int length;
     153     17968481 :   char c;
     154              : 
     155     17968481 :   length = 0;
     156     17968481 :   c = gfc_next_ascii_char ();
     157              : 
     158     17968481 :   if (signflag && (c == '+' || c == '-'))
     159              :     {
     160         5716 :       if (buffer != NULL)
     161         2285 :         *buffer++ = c;
     162         5716 :       gfc_gobble_whitespace ();
     163         5716 :       c = gfc_next_ascii_char ();
     164         5716 :       length++;
     165              :     }
     166              : 
     167     17968481 :   if (!gfc_check_digit (c, radix))
     168              :     return -1;
     169              : 
     170      8608648 :   length++;
     171      8608648 :   if (buffer != NULL)
     172      4296167 :     *buffer++ = c;
     173              : 
     174     16927658 :   for (;;)
     175              :     {
     176     12768153 :       old_loc = gfc_current_locus;
     177     12768153 :       c = gfc_next_ascii_char ();
     178              : 
     179     12768153 :       if (!gfc_check_digit (c, radix))
     180              :         break;
     181              : 
     182      4159505 :       if (buffer != NULL)
     183      2077481 :         *buffer++ = c;
     184      4159505 :       length++;
     185              :     }
     186              : 
     187      8608648 :   gfc_current_locus = old_loc;
     188              : 
     189      8608648 :   return length;
     190              : }
     191              : 
     192              : /* Convert an integer string to an expression node.  */
     193              : 
     194              : static gfc_expr *
     195      4188904 : convert_integer (const char *buffer, int kind, int radix, locus *where)
     196              : {
     197      4188904 :   gfc_expr *e;
     198      4188904 :   const char *t;
     199              : 
     200      4188904 :   e = gfc_get_constant_expr (BT_INTEGER, kind, where);
     201              :   /* A leading plus is allowed, but not by mpz_set_str.  */
     202      4188904 :   if (buffer[0] == '+')
     203           21 :     t = buffer + 1;
     204              :   else
     205              :     t = buffer;
     206      4188904 :   mpz_set_str (e->value.integer, t, radix);
     207              : 
     208      4188904 :   return e;
     209              : }
     210              : 
     211              : 
     212              : /* Convert an unsigned string to an expression node.  XXX:
     213              :    This needs a calculation modulo 2^n.  TODO: Implement restriction
     214              :    that no unary minus is permitted.  */
     215              : static gfc_expr *
     216       101372 : convert_unsigned (const char *buffer, int kind, int radix, locus *where)
     217              : {
     218       101372 :   gfc_expr *e;
     219       101372 :   const char *t;
     220       101372 :   int k;
     221       101372 :   arith rc;
     222              : 
     223       101372 :   e = gfc_get_constant_expr (BT_UNSIGNED, kind, where);
     224              :   /* A leading plus is allowed, but not by mpz_set_str.  */
     225       101372 :   if (buffer[0] == '+')
     226            0 :     t = buffer + 1;
     227              :   else
     228              :     t = buffer;
     229              : 
     230       101372 :   mpz_set_str (e->value.integer, t, radix);
     231              : 
     232       101372 :   k = gfc_validate_kind (BT_UNSIGNED, kind, false);
     233              : 
     234              :   /* TODO Maybe move this somewhere else.  */
     235       101372 :   rc = gfc_range_check (e);
     236       101372 :   if (rc != ARITH_OK)
     237              :     {
     238            2 :     if (pedantic)
     239            1 :       gfc_error_now (gfc_arith_error (rc), &e->where);
     240              :     else
     241            1 :       gfc_warning (0, gfc_arith_error (rc), &e->where);
     242              :     }
     243              : 
     244       101372 :   gfc_convert_mpz_to_unsigned (e->value.integer, gfc_unsigned_kinds[k].bit_size,
     245              :                                false);
     246              : 
     247       101372 :   return e;
     248              : }
     249              : 
     250              : /* Convert a real string to an expression node.  */
     251              : 
     252              : static gfc_expr *
     253       218173 : convert_real (const char *buffer, int kind, locus *where)
     254              : {
     255       218173 :   gfc_expr *e;
     256              : 
     257       218173 :   e = gfc_get_constant_expr (BT_REAL, kind, where);
     258       218173 :   mpfr_set_str (e->value.real, buffer, 10, GFC_RND_MODE);
     259              : 
     260       218173 :   return e;
     261              : }
     262              : 
     263              : 
     264              : /* Convert a pair of real, constant expression nodes to a single
     265              :    complex expression node.  */
     266              : 
     267              : static gfc_expr *
     268         6987 : convert_complex (gfc_expr *real, gfc_expr *imag, int kind)
     269              : {
     270         6987 :   gfc_expr *e;
     271              : 
     272         6987 :   e = gfc_get_constant_expr (BT_COMPLEX, kind, &real->where);
     273         6987 :   mpc_set_fr_fr (e->value.complex, real->value.real, imag->value.real,
     274              :                  GFC_MPC_RND_MODE);
     275              : 
     276         6987 :   return e;
     277              : }
     278              : 
     279              : 
     280              : /* Match an integer (digit string and optional kind).
     281              :    A sign will be accepted if signflag is set.  */
     282              : 
     283              : static match
     284     13079160 : match_integer_constant (gfc_expr **result, int signflag)
     285              : {
     286     13079160 :   int length, kind, is_iso_c;
     287     13079160 :   locus old_loc;
     288     13079160 :   char *buffer;
     289     13079160 :   gfc_expr *e;
     290              : 
     291     13079160 :   old_loc = gfc_current_locus;
     292     13079160 :   gfc_gobble_whitespace ();
     293              : 
     294     13079160 :   length = match_digits (signflag, 10, NULL);
     295     13079160 :   gfc_current_locus = old_loc;
     296     13079160 :   if (length == -1)
     297              :     return MATCH_NO;
     298              : 
     299      4190638 :   buffer = (char *) alloca (length + 1);
     300      4190638 :   memset (buffer, '\0', length + 1);
     301              : 
     302      4190638 :   gfc_gobble_whitespace ();
     303              : 
     304      4190638 :   match_digits (signflag, 10, buffer);
     305              : 
     306      4190638 :   kind = get_kind (&is_iso_c);
     307      4190638 :   if (kind == -2)
     308      3883070 :     kind = gfc_default_integer_kind;
     309      4190638 :   if (kind == -1)
     310              :     return MATCH_ERROR;
     311              : 
     312      4188908 :   if (kind == 4 && flag_integer4_kind == 8)
     313            0 :     kind = 8;
     314              : 
     315      4188908 :   if (gfc_validate_kind (BT_INTEGER, kind, true) < 0)
     316              :     {
     317            4 :       gfc_error ("Integer kind %d at %C not available", kind);
     318            4 :       return MATCH_ERROR;
     319              :     }
     320              : 
     321      4188904 :   e = convert_integer (buffer, kind, 10, &gfc_current_locus);
     322      4188904 :   e->ts.is_c_interop = is_iso_c;
     323              : 
     324      4188904 :   if (gfc_range_check (e) != ARITH_OK)
     325              :     {
     326         9586 :       gfc_error ("Integer too big for its kind at %C. This check can be "
     327              :                  "disabled with the option %<-fno-range-check%>");
     328              : 
     329         9586 :       gfc_free_expr (e);
     330         9586 :       return MATCH_ERROR;
     331              :     }
     332              : 
     333      4179318 :   *result = e;
     334      4179318 :   return MATCH_YES;
     335              : }
     336              : 
     337              : /* Match an unsigned constant (an integer with suffix u).  No sign
     338              :    is currently accepted, in accordance with 24-116.txt, but that
     339              :    could be changed later.  This is very much like the integer
     340              :    constant matching above, but with enough differences to put it into
     341              :    its own function.  */
     342              : 
     343              : static match
     344       588996 : match_unsigned_constant (gfc_expr **result)
     345              : {
     346       588996 :   int length, kind, is_iso_c;
     347       588996 :   locus old_loc;
     348       588996 :   char *buffer;
     349       588996 :   gfc_expr *e;
     350       588996 :   match m;
     351              : 
     352       588996 :   old_loc = gfc_current_locus;
     353       588996 :   gfc_gobble_whitespace ();
     354              : 
     355       588996 :   length = match_digits (/* signflag = */ false, 10, NULL);
     356              : 
     357       588996 :   if (length == -1)
     358       471311 :     goto fail;
     359              : 
     360       117685 :   m = gfc_match_char ('u');
     361       117685 :   if (m == MATCH_NO)
     362        16313 :     goto fail;
     363              : 
     364       101372 :   gfc_current_locus = old_loc;
     365              : 
     366       101372 :   buffer = (char *) alloca (length + 1);
     367       101372 :   memset (buffer, '\0', length + 1);
     368              : 
     369       101372 :   gfc_gobble_whitespace ();
     370              : 
     371       101372 :   match_digits (false, 10, buffer);
     372              : 
     373       101372 :   m = gfc_match_char ('u');
     374       101372 :   if (m == MATCH_NO)
     375            0 :     goto fail;
     376              : 
     377       101372 :   kind = get_kind (&is_iso_c);
     378       101372 :   if (kind == -2)
     379         8357 :     kind = gfc_default_unsigned_kind;
     380       101372 :   if (kind == -1)
     381              :     return MATCH_ERROR;
     382              : 
     383       101372 :   if (kind == 4 && flag_integer4_kind == 8)
     384            0 :     kind = 8;
     385              : 
     386       101372 :   if (gfc_validate_kind (BT_UNSIGNED, kind, true) < 0)
     387              :     {
     388            0 :       gfc_error ("Unsigned kind %d at %C not available", kind);
     389            0 :       return MATCH_ERROR;
     390              :     }
     391              : 
     392       101372 :   e = convert_unsigned (buffer, kind, 10, &gfc_current_locus);
     393       101372 :   e->ts.is_c_interop = is_iso_c;
     394              : 
     395       101372 :   *result = e;
     396       101372 :   return MATCH_YES;
     397              : 
     398       487624 :  fail:
     399       487624 :   gfc_current_locus = old_loc;
     400       487624 :   return MATCH_NO;
     401              : }
     402              : 
     403              : /* Match a Hollerith constant.  */
     404              : 
     405              : static match
     406      6545097 : match_hollerith_constant (gfc_expr **result)
     407              : {
     408      6545097 :   locus old_loc;
     409      6545097 :   gfc_expr *e = NULL;
     410      6545097 :   int num, pad;
     411      6545097 :   int i;
     412              : 
     413      6545097 :   old_loc = gfc_current_locus;
     414      6545097 :   gfc_gobble_whitespace ();
     415              : 
     416      6545097 :   if (match_integer_constant (&e, 0) == MATCH_YES
     417      6545097 :       && gfc_match_char ('h') == MATCH_YES)
     418              :     {
     419         2636 :       if (!gfc_notify_std (GFC_STD_LEGACY, "Hollerith constant at %C"))
     420           14 :         goto cleanup;
     421              : 
     422         2622 :       if (gfc_extract_int (e, &num, 1))
     423            0 :         goto cleanup;
     424         2622 :       if (num == 0)
     425              :         {
     426            1 :           gfc_error ("Invalid Hollerith constant: %L must contain at least "
     427              :                      "one character", &old_loc);
     428            1 :           goto cleanup;
     429              :         }
     430         2621 :       if (e->ts.kind != gfc_default_integer_kind)
     431              :         {
     432            1 :           gfc_error ("Invalid Hollerith constant: Integer kind at %L "
     433              :                      "should be default", &old_loc);
     434            1 :           goto cleanup;
     435              :         }
     436              :       else
     437              :         {
     438         2620 :           gfc_free_expr (e);
     439         2620 :           e = gfc_get_constant_expr (BT_HOLLERITH, gfc_default_character_kind,
     440              :                                      &gfc_current_locus);
     441              : 
     442              :           /* Calculate padding needed to fit default integer memory.  */
     443         2620 :           pad = gfc_default_integer_kind - (num % gfc_default_integer_kind);
     444              : 
     445         2620 :           e->representation.string = XCNEWVEC (char, num + pad + 1);
     446              : 
     447        14886 :           for (i = 0; i < num; i++)
     448              :             {
     449        12266 :               gfc_char_t c = gfc_next_char_literal (INSTRING_WARN);
     450        12266 :               if (! gfc_wide_fits_in_byte (c))
     451              :                 {
     452            0 :                   gfc_error ("Invalid Hollerith constant at %L contains a "
     453              :                              "wide character", &old_loc);
     454            0 :                   goto cleanup;
     455              :                 }
     456              : 
     457        12266 :               e->representation.string[i] = (unsigned char) c;
     458              :             }
     459              : 
     460              :           /* Now pad with blanks and end with a null char.  */
     461        11762 :           for (i = 0; i < pad; i++)
     462         9142 :             e->representation.string[num + i] = ' ';
     463              : 
     464         2620 :           e->representation.string[num + i] = '\0';
     465         2620 :           e->representation.length = num + pad;
     466         2620 :           e->ts.u.pad = pad;
     467              : 
     468         2620 :           *result = e;
     469         2620 :           return MATCH_YES;
     470              :         }
     471              :     }
     472              : 
     473      6542461 :   gfc_free_expr (e);
     474      6542461 :   gfc_current_locus = old_loc;
     475      6542461 :   return MATCH_NO;
     476              : 
     477           16 : cleanup:
     478           16 :   gfc_free_expr (e);
     479           16 :   return MATCH_ERROR;
     480              : }
     481              : 
     482              : 
     483              : /* Match a binary, octal or hexadecimal constant that can be found in
     484              :    a DATA statement.  The standard permits b'010...', o'73...', and
     485              :    z'a1...' where b, o, and z can be capital letters.  This function
     486              :    also accepts postfixed forms of the constants: '01...'b, '73...'o,
     487              :    and 'a1...'z.  An additional extension is the use of x for z.  */
     488              : 
     489              : static match
     490      6753123 : match_boz_constant (gfc_expr **result)
     491              : {
     492      6753123 :   int radix, length, x_hex;
     493      6753123 :   locus old_loc, start_loc;
     494      6753123 :   char *buffer, post, delim;
     495      6753123 :   gfc_expr *e;
     496              : 
     497      6753123 :   start_loc = old_loc = gfc_current_locus;
     498      6753123 :   gfc_gobble_whitespace ();
     499              : 
     500      6753123 :   x_hex = 0;
     501      6753123 :   switch (post = gfc_next_ascii_char ())
     502              :     {
     503              :     case 'b':
     504              :       radix = 2;
     505              :       post = 0;
     506              :       break;
     507        54660 :     case 'o':
     508        54660 :       radix = 8;
     509        54660 :       post = 0;
     510        54660 :       break;
     511        90641 :     case 'x':
     512        90641 :       x_hex = 1;
     513              :       /* Fall through.  */
     514              :     case 'z':
     515              :       radix = 16;
     516              :       post = 0;
     517              :       break;
     518              :     case '\'':
     519              :       /* Fall through.  */
     520              :     case '\"':
     521              :       delim = post;
     522              :       post = 1;
     523              :       radix = 16;  /* Set to accept any valid digit string.  */
     524              :       break;
     525      6468845 :     default:
     526      6468845 :       goto backup;
     527              :     }
     528              : 
     529              :   /* No whitespace allowed here.  */
     530              : 
     531        54660 :   if (post == 0)
     532       284253 :     delim = gfc_next_ascii_char ();
     533              : 
     534       284278 :   if (delim != '\'' && delim != '\"')
     535       280118 :     goto backup;
     536              : 
     537         4160 :   if (x_hex
     538         4160 :       && gfc_invalid_boz (G_("Hexadecimal constant at %L uses "
     539              :                           "nonstandard X instead of Z"), &gfc_current_locus))
     540              :     return MATCH_ERROR;
     541              : 
     542         4158 :   old_loc = gfc_current_locus;
     543              : 
     544         4158 :   length = match_digits (0, radix, NULL);
     545         4158 :   if (length == -1)
     546              :     {
     547            0 :       gfc_error ("Empty set of digits in BOZ constant at %C");
     548            0 :       return MATCH_ERROR;
     549              :     }
     550              : 
     551         4158 :   if (gfc_next_ascii_char () != delim)
     552              :     {
     553            0 :       gfc_error ("Illegal character in BOZ constant at %C");
     554            0 :       return MATCH_ERROR;
     555              :     }
     556              : 
     557         4158 :   if (post == 1)
     558              :     {
     559           25 :       switch (gfc_next_ascii_char ())
     560              :         {
     561              :         case 'b':
     562              :           radix = 2;
     563              :           break;
     564            6 :         case 'o':
     565            6 :           radix = 8;
     566            6 :           break;
     567           13 :         case 'x':
     568              :           /* Fall through.  */
     569           13 :         case 'z':
     570           13 :           radix = 16;
     571           13 :           break;
     572            0 :         default:
     573            0 :           goto backup;
     574              :         }
     575              : 
     576           25 :       if (gfc_invalid_boz (G_("BOZ constant at %C uses nonstandard postfix "
     577              :                            "syntax"), &gfc_current_locus))
     578              :         return MATCH_ERROR;
     579              :     }
     580              : 
     581         4157 :   gfc_current_locus = old_loc;
     582              : 
     583         4157 :   buffer = (char *) alloca (length + 1);
     584         4157 :   memset (buffer, '\0', length + 1);
     585              : 
     586         4157 :   match_digits (0, radix, buffer);
     587         4157 :   gfc_next_ascii_char ();    /* Eat delimiter.  */
     588         4157 :   if (post == 1)
     589           24 :     gfc_next_ascii_char ();  /* Eat postfixed b, o, z, or x.  */
     590              : 
     591         4157 :   e = gfc_get_expr ();
     592         4157 :   e->expr_type = EXPR_CONSTANT;
     593         4157 :   e->ts.type = BT_BOZ;
     594         4157 :   e->where = gfc_current_locus;
     595         4157 :   e->boz.rdx = radix;
     596         4157 :   e->boz.len = length;
     597         4157 :   e->boz.str = XCNEWVEC (char, length + 1);
     598         4157 :   strncpy (e->boz.str, buffer, length);
     599              : 
     600         4157 :   if (!gfc_in_match_data ()
     601         4157 :       && (!gfc_notify_std(GFC_STD_F2003, "BOZ used outside a DATA "
     602              :                           "statement at %L", &e->where)))
     603              :     return MATCH_ERROR;
     604              : 
     605         4152 :   *result = e;
     606         4152 :   return MATCH_YES;
     607              : 
     608      6748963 : backup:
     609      6748963 :   gfc_current_locus = start_loc;
     610      6748963 :   return MATCH_NO;
     611              : }
     612              : 
     613              : 
     614              : /* Match a real constant of some sort.  Allow a signed constant if signflag
     615              :    is nonzero.  */
     616              : 
     617              : static match
     618      6856258 : match_real_constant (gfc_expr **result, int signflag)
     619              : {
     620      6856258 :   int kind, count, seen_dp, seen_digits, is_iso_c, default_exponent;
     621      6856258 :   locus old_loc, temp_loc;
     622      6856258 :   char *p, *buffer, c, exp_char;
     623      6856258 :   gfc_expr *e;
     624      6856258 :   bool negate;
     625              : 
     626      6856258 :   old_loc = gfc_current_locus;
     627      6856258 :   gfc_gobble_whitespace ();
     628              : 
     629      6856258 :   e = NULL;
     630              : 
     631      6856258 :   default_exponent = 0;
     632      6856258 :   count = 0;
     633      6856258 :   seen_dp = 0;
     634      6856258 :   seen_digits = 0;
     635      6856258 :   exp_char = ' ';
     636      6856258 :   negate = false;
     637              : 
     638      6856258 :   c = gfc_next_ascii_char ();
     639      6856258 :   if (signflag && (c == '+' || c == '-'))
     640              :     {
     641         6468 :       if (c == '-')
     642         6332 :         negate = true;
     643              : 
     644         6468 :       gfc_gobble_whitespace ();
     645         6468 :       c = gfc_next_ascii_char ();
     646              :     }
     647              : 
     648              :   /* Scan significand.  */
     649      3910976 :   for (;; c = gfc_next_ascii_char (), count++)
     650              :     {
     651     10767234 :       if (c == '.')
     652              :         {
     653       278614 :           if (seen_dp)
     654          204 :             goto done;
     655              : 
     656              :           /* Check to see if "." goes with a following operator like
     657              :              ".eq.".  */
     658       278410 :           temp_loc = gfc_current_locus;
     659       278410 :           c = gfc_next_ascii_char ();
     660              : 
     661       278410 :           if (c == 'e' || c == 'd' || c == 'q')
     662              :             {
     663        17710 :               c = gfc_next_ascii_char ();
     664        17710 :               if (c == '.')
     665            0 :                 goto done;      /* Operator named .e. or .d.  */
     666              :             }
     667              : 
     668       278410 :           if (ISALPHA (c))
     669        66895 :             goto done;          /* Distinguish 1.e9 from 1.eq.2 */
     670              : 
     671       211515 :           gfc_current_locus = temp_loc;
     672       211515 :           seen_dp = 1;
     673       211515 :           continue;
     674              :         }
     675              : 
     676     10488620 :       if (ISDIGIT (c))
     677              :         {
     678      3699461 :           seen_digits = 1;
     679      3699461 :           continue;
     680              :         }
     681              : 
     682      6789159 :       break;
     683              :     }
     684              : 
     685      6789159 :   if (!seen_digits || (c != 'e' && c != 'd' && c != 'q'))
     686      2330042 :     goto done;
     687        37579 :   exp_char = c;
     688              : 
     689              : 
     690        37579 :   if (c == 'q')
     691              :     {
     692            0 :       if (!gfc_notify_std (GFC_STD_GNU, "exponent-letter %<q%> in "
     693              :                            "real-literal-constant at %C"))
     694              :         return MATCH_ERROR;
     695            0 :       else if (warn_real_q_constant)
     696            0 :         gfc_warning (OPT_Wreal_q_constant,
     697              :                      "Extension: exponent-letter %<q%> in real-literal-constant "
     698              :                      "at %C");
     699              :     }
     700              : 
     701              :   /* Scan exponent.  */
     702        37579 :   c = gfc_next_ascii_char ();
     703        37579 :   count++;
     704              : 
     705        37579 :   if (c == '+' || c == '-')
     706              :     {                           /* optional sign */
     707         6983 :       c = gfc_next_ascii_char ();
     708         6983 :       count++;
     709              :     }
     710              : 
     711        37579 :   if (!ISDIGIT (c))
     712              :     {
     713              :       /* With -fdec, default exponent to 0 instead of complaining.  */
     714           40 :       if (flag_dec)
     715        37569 :         default_exponent = 1;
     716              :       else
     717              :         {
     718           10 :           gfc_error ("Missing exponent in real number at %C");
     719           10 :           return MATCH_ERROR;
     720              :         }
     721              :     }
     722              : 
     723        77929 :   while (ISDIGIT (c))
     724              :     {
     725        40360 :       c = gfc_next_ascii_char ();
     726        40360 :       count++;
     727              :     }
     728              : 
     729      6856248 : done:
     730              :   /* Check that we have a numeric constant.  */
     731      6856248 :   if (!seen_digits || (!seen_dp && exp_char == ' '))
     732              :     {
     733      6638071 :       gfc_current_locus = old_loc;
     734      6638071 :       return MATCH_NO;
     735              :     }
     736              : 
     737              :   /* Convert the number.  */
     738       218177 :   gfc_current_locus = old_loc;
     739       218177 :   gfc_gobble_whitespace ();
     740              : 
     741       218177 :   buffer = (char *) alloca (count + default_exponent + 1);
     742       218177 :   memset (buffer, '\0', count + default_exponent + 1);
     743              : 
     744       218177 :   p = buffer;
     745       218177 :   c = gfc_next_ascii_char ();
     746       218177 :   if (c == '+' || c == '-')
     747              :     {
     748         3037 :       gfc_gobble_whitespace ();
     749         3037 :       c = gfc_next_ascii_char ();
     750              :     }
     751              : 
     752              :   /* Hack for mpfr_set_str().  */
     753      1408957 :   for (;;)
     754              :     {
     755       813567 :       if (c == 'd' || c == 'q')
     756        29962 :         *p = 'e';
     757              :       else
     758       783605 :         *p = c;
     759       813567 :       p++;
     760       813567 :       if (--count == 0)
     761              :         break;
     762              : 
     763       595390 :       c = gfc_next_ascii_char ();
     764              :     }
     765       218177 :   if (default_exponent)
     766           30 :     *p++ = '0';
     767              : 
     768       218177 :   kind = get_kind (&is_iso_c);
     769       218177 :   if (kind == -1)
     770            4 :     goto cleanup;
     771              : 
     772       218173 :   if (kind == 4)
     773              :     {
     774        20358 :       if (flag_real4_kind == 8)
     775          192 :         kind = 8;
     776        20358 :       if (flag_real4_kind == 10)
     777          192 :         kind = 10;
     778        20358 :       if (flag_real4_kind == 16)
     779          384 :         kind = 16;
     780              :     }
     781       197815 :   else if (kind == 8)
     782              :     {
     783        26822 :       if (flag_real8_kind == 4)
     784          192 :         kind = 4;
     785        26822 :       if (flag_real8_kind == 10)
     786          192 :         kind = 10;
     787        26822 :       if (flag_real8_kind == 16)
     788          384 :         kind = 16;
     789              :     }
     790              : 
     791       218173 :   switch (exp_char)
     792              :     {
     793        29962 :     case 'd':
     794        29962 :       if (kind != -2)
     795              :         {
     796            0 :           gfc_error ("Real number at %C has a %<d%> exponent and an explicit "
     797              :                      "kind");
     798            0 :           goto cleanup;
     799              :         }
     800        29962 :       kind = gfc_default_double_kind;
     801        29962 :       break;
     802              : 
     803            0 :     case 'q':
     804            0 :       if (kind != -2)
     805              :         {
     806            0 :           gfc_error ("Real number at %C has a %<q%> exponent and an explicit "
     807              :                      "kind");
     808            0 :           goto cleanup;
     809              :         }
     810              : 
     811              :       /* The maximum possible real kind type parameter is 16.  First, try
     812              :          that for the kind, then fallback to trying kind=10 (Intel 80 bit)
     813              :          extended precision.  If neither value works, just given up.  */
     814            0 :       kind = 16;
     815            0 :       if (gfc_validate_kind (BT_REAL, kind, true) < 0)
     816              :         {
     817            0 :           kind = 10;
     818            0 :           if (gfc_validate_kind (BT_REAL, kind, true) < 0)
     819              :             {
     820            0 :               gfc_error ("Invalid exponent-letter %<q%> in "
     821              :                          "real-literal-constant at %C");
     822            0 :               goto cleanup;
     823              :             }
     824              :         }
     825              :       break;
     826              : 
     827       188211 :     default:
     828       188211 :       if (kind == -2)
     829       116983 :         kind = gfc_default_real_kind;
     830              : 
     831       188211 :       if (gfc_validate_kind (BT_REAL, kind, true) < 0)
     832              :         {
     833            0 :           gfc_error ("Invalid real kind %d at %C", kind);
     834            0 :           goto cleanup;
     835              :         }
     836              :     }
     837              : 
     838       218173 :   e = convert_real (buffer, kind, &gfc_current_locus);
     839       218173 :   if (negate)
     840         2932 :     mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
     841       218173 :   e->ts.is_c_interop = is_iso_c;
     842              : 
     843       218173 :   switch (gfc_range_check (e))
     844              :     {
     845              :     case ARITH_OK:
     846              :       break;
     847            1 :     case ARITH_OVERFLOW:
     848            1 :       gfc_error ("Real constant overflows its kind at %C");
     849            1 :       goto cleanup;
     850              : 
     851            0 :     case ARITH_UNDERFLOW:
     852            0 :       if (warn_underflow)
     853            0 :         gfc_warning (OPT_Wunderflow, "Real constant underflows its kind at %C");
     854            0 :       mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
     855            0 :       break;
     856              : 
     857            0 :     default:
     858            0 :       gfc_internal_error ("gfc_range_check() returned bad value");
     859              :     }
     860              : 
     861              :   /* Warn about trailing digits which suggest the user added too many
     862              :      trailing digits, which may cause the appearance of higher precision
     863              :      than the kind can support.
     864              : 
     865              :      This is done by replacing the rightmost non-zero digit with zero
     866              :      and comparing with the original value.  If these are equal, we
     867              :      assume the user supplied more digits than intended (or forgot to
     868              :      convert to the correct kind).
     869              :   */
     870              : 
     871       218172 :   if (warn_conversion_extra)
     872              :     {
     873           21 :       mpfr_t r;
     874           21 :       char *c1;
     875           21 :       bool did_break;
     876              : 
     877           21 :       c1 = strchr (buffer, 'e');
     878           21 :       if (c1 == NULL)
     879           18 :         c1 = buffer + strlen(buffer);
     880              : 
     881           30 :       did_break = false;
     882           30 :       for (p = c1; p > buffer;)
     883              :         {
     884           30 :           p--;
     885           30 :           if (*p == '.')
     886            7 :             continue;
     887              : 
     888           23 :           if (*p != '0')
     889              :             {
     890           21 :               *p = '0';
     891           21 :               did_break = true;
     892           21 :               break;
     893              :             }
     894              :         }
     895              : 
     896           21 :       if (did_break)
     897              :         {
     898           21 :           mpfr_init (r);
     899           21 :           mpfr_set_str (r, buffer, 10, GFC_RND_MODE);
     900           21 :           if (negate)
     901            0 :             mpfr_neg (r, r, GFC_RND_MODE);
     902              : 
     903           21 :           mpfr_sub (r, r, e->value.real, GFC_RND_MODE);
     904              : 
     905           21 :           if (mpfr_cmp_ui (r, 0) == 0)
     906            1 :             gfc_warning (OPT_Wconversion_extra, "Non-significant digits "
     907              :                          "in %qs number at %C, maybe incorrect KIND",
     908              :                          gfc_typename (&e->ts));
     909              : 
     910           21 :           mpfr_clear (r);
     911              :         }
     912              :     }
     913              : 
     914       218172 :   *result = e;
     915       218172 :   return MATCH_YES;
     916              : 
     917            5 : cleanup:
     918            5 :   gfc_free_expr (e);
     919            5 :   return MATCH_ERROR;
     920              : }
     921              : 
     922              : 
     923              : /* Match a substring reference.  */
     924              : 
     925              : static match
     926       607336 : match_substring (gfc_charlen *cl, int init, gfc_ref **result, bool deferred)
     927              : {
     928       607336 :   gfc_expr *start, *end;
     929       607336 :   locus old_loc;
     930       607336 :   gfc_ref *ref;
     931       607336 :   match m;
     932              : 
     933       607336 :   start = NULL;
     934       607336 :   end = NULL;
     935              : 
     936       607336 :   old_loc = gfc_current_locus;
     937              : 
     938       607336 :   m = gfc_match_char ('(');
     939       607336 :   if (m != MATCH_YES)
     940              :     return MATCH_NO;
     941              : 
     942        15236 :   if (gfc_match_char (':') != MATCH_YES)
     943              :     {
     944        14358 :       if (init)
     945            0 :         m = gfc_match_init_expr (&start);
     946              :       else
     947        14358 :         m = gfc_match_expr (&start);
     948              : 
     949        14358 :       if (m != MATCH_YES)
     950              :         {
     951          154 :           m = MATCH_NO;
     952          154 :           goto cleanup;
     953              :         }
     954              : 
     955        14204 :       m = gfc_match_char (':');
     956        14204 :       if (m != MATCH_YES)
     957          460 :         goto cleanup;
     958              :     }
     959              : 
     960        14622 :   if (gfc_match_char (')') != MATCH_YES)
     961              :     {
     962        13693 :       if (init)
     963            0 :         m = gfc_match_init_expr (&end);
     964              :       else
     965        13693 :         m = gfc_match_expr (&end);
     966              : 
     967        13693 :       if (m == MATCH_NO)
     968            2 :         goto syntax;
     969        13691 :       if (m == MATCH_ERROR)
     970            0 :         goto cleanup;
     971              : 
     972        13691 :       m = gfc_match_char (')');
     973        13691 :       if (m == MATCH_NO)
     974            3 :         goto syntax;
     975              :     }
     976              : 
     977              :   /* Optimize away the (:) reference.  */
     978        14617 :   if (start == NULL && end == NULL && !deferred)
     979              :     ref = NULL;
     980              :   else
     981              :     {
     982        14412 :       ref = gfc_get_ref ();
     983              : 
     984        14412 :       ref->type = REF_SUBSTRING;
     985        14412 :       if (start == NULL)
     986          671 :         start = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
     987        14412 :       ref->u.ss.start = start;
     988        14412 :       if (end == NULL && cl)
     989          722 :         end = gfc_copy_expr (cl->length);
     990        14412 :       ref->u.ss.end = end;
     991        14412 :       ref->u.ss.length = cl;
     992              :     }
     993              : 
     994        14617 :   *result = ref;
     995        14617 :   return MATCH_YES;
     996              : 
     997            5 : syntax:
     998            5 :   gfc_error ("Syntax error in SUBSTRING specification at %C");
     999            5 :   m = MATCH_ERROR;
    1000              : 
    1001          619 : cleanup:
    1002          619 :   gfc_free_expr (start);
    1003          619 :   gfc_free_expr (end);
    1004              : 
    1005          619 :   gfc_current_locus = old_loc;
    1006          619 :   return m;
    1007              : }
    1008              : 
    1009              : 
    1010              : /* Reads the next character of a string constant, taking care to
    1011              :    return doubled delimiters on the input as a single instance of
    1012              :    the delimiter.
    1013              : 
    1014              :    Special return values for "ret" argument are:
    1015              :      -1   End of the string, as determined by the delimiter
    1016              :      -2   Unterminated string detected
    1017              : 
    1018              :    Backslash codes are also expanded at this time.  */
    1019              : 
    1020              : static gfc_char_t
    1021      4175415 : next_string_char (gfc_char_t delimiter, int *ret)
    1022              : {
    1023      4175415 :   locus old_locus;
    1024      4175415 :   gfc_char_t c;
    1025              : 
    1026      4175415 :   c = gfc_next_char_literal (INSTRING_WARN);
    1027      4175415 :   *ret = 0;
    1028              : 
    1029      4175415 :   if (c == '\n')
    1030              :     {
    1031            4 :       *ret = -2;
    1032            4 :       return 0;
    1033              :     }
    1034              : 
    1035      4175411 :   if (flag_backslash && c == '\\')
    1036              :     {
    1037        12180 :       old_locus = gfc_current_locus;
    1038              : 
    1039        12180 :       if (gfc_match_special_char (&c) == MATCH_NO)
    1040            0 :         gfc_current_locus = old_locus;
    1041              : 
    1042        12180 :       if (!(gfc_option.allow_std & GFC_STD_GNU) && !inhibit_warnings)
    1043            0 :         gfc_warning (0, "Extension: backslash character at %C");
    1044              :     }
    1045              : 
    1046      4175411 :   if (c != delimiter)
    1047              :     return c;
    1048              : 
    1049       604396 :   old_locus = gfc_current_locus;
    1050       604396 :   c = gfc_next_char_literal (NONSTRING);
    1051              : 
    1052       604396 :   if (c == delimiter)
    1053              :     return c;
    1054       603578 :   gfc_current_locus = old_locus;
    1055              : 
    1056       603578 :   *ret = -1;
    1057       603578 :   return 0;
    1058              : }
    1059              : 
    1060              : 
    1061              : /* Special case of gfc_match_name() that matches a parameter kind name
    1062              :    before a string constant.  This takes case of the weird but legal
    1063              :    case of:
    1064              : 
    1065              :      kind_____'string'
    1066              : 
    1067              :    where kind____ is a parameter. gfc_match_name() will happily slurp
    1068              :    up all the underscores, which leads to problems.  If we return
    1069              :    MATCH_YES, the parse pointer points to the final underscore, which
    1070              :    is not part of the name.  We never return MATCH_ERROR-- errors in
    1071              :    the name will be detected later.  */
    1072              : 
    1073              : static match
    1074      4411490 : match_charkind_name (char *name)
    1075              : {
    1076      4411490 :   locus old_loc;
    1077      4411490 :   char c, peek;
    1078      4411490 :   int len;
    1079              : 
    1080      4411490 :   gfc_gobble_whitespace ();
    1081      4411490 :   c = gfc_next_ascii_char ();
    1082      4411490 :   if (!ISALPHA (c))
    1083              :     return MATCH_NO;
    1084              : 
    1085      4007568 :   *name++ = c;
    1086      4007568 :   len = 1;
    1087              : 
    1088     16263389 :   for (;;)
    1089              :     {
    1090     16263389 :       old_loc = gfc_current_locus;
    1091     16263389 :       c = gfc_next_ascii_char ();
    1092              : 
    1093     16263389 :       if (c == '_')
    1094              :         {
    1095       521742 :           peek = gfc_peek_ascii_char ();
    1096              : 
    1097       521742 :           if (peek == '\'' || peek == '\"')
    1098              :             {
    1099          996 :               gfc_current_locus = old_loc;
    1100          996 :               *name = '\0';
    1101          996 :               return MATCH_YES;
    1102              :             }
    1103              :         }
    1104              : 
    1105     16262393 :       if (!ISALNUM (c)
    1106      4527318 :           && c != '_'
    1107      4006572 :           && (c != '$' || !flag_dollar_ok))
    1108              :         break;
    1109              : 
    1110     12255821 :       *name++ = c;
    1111     12255821 :       if (++len > GFC_MAX_SYMBOL_LEN)
    1112              :         break;
    1113              :     }
    1114              : 
    1115              :   return MATCH_NO;
    1116              : }
    1117              : 
    1118              : 
    1119              : /* See if the current input matches a character constant.  Lots of
    1120              :    contortions have to be done to match the kind parameter which comes
    1121              :    before the actual string.  The main consideration is that we don't
    1122              :    want to error out too quickly.  For example, we don't actually do
    1123              :    any validation of the kinds until we have actually seen a legal
    1124              :    delimiter.  Using match_kind_param() generates errors too quickly.  */
    1125              : 
    1126              : static match
    1127      7054906 : match_string_constant (gfc_expr **result)
    1128              : {
    1129      7054906 :   char name[GFC_MAX_SYMBOL_LEN + 1], peek;
    1130      7054906 :   size_t length;
    1131      7054906 :   int kind,save_warn_ampersand, ret;
    1132      7054906 :   locus old_locus, start_locus;
    1133      7054906 :   gfc_symbol *sym;
    1134      7054906 :   gfc_expr *e;
    1135      7054906 :   match m;
    1136      7054906 :   gfc_char_t c, delimiter, *p;
    1137              : 
    1138      7054906 :   old_locus = gfc_current_locus;
    1139              : 
    1140      7054906 :   gfc_gobble_whitespace ();
    1141              : 
    1142      7054906 :   c = gfc_next_char ();
    1143      7054906 :   if (c == '\'' || c == '"')
    1144              :     {
    1145       261359 :       kind = gfc_default_character_kind;
    1146       261359 :       start_locus = gfc_current_locus;
    1147       261359 :       goto got_delim;
    1148              :     }
    1149              : 
    1150      6793547 :   if (gfc_wide_is_digit (c))
    1151              :     {
    1152      2382057 :       kind = 0;
    1153              : 
    1154      5719834 :       while (gfc_wide_is_digit (c))
    1155              :         {
    1156      3351221 :           kind = kind * 10 + c - '0';
    1157      3351221 :           if (kind > 9999999)
    1158        13444 :             goto no_match;
    1159      3337777 :           c = gfc_next_char ();
    1160              :         }
    1161              : 
    1162              :     }
    1163              :   else
    1164              :     {
    1165      4411490 :       gfc_current_locus = old_locus;
    1166              : 
    1167      4411490 :       m = match_charkind_name (name);
    1168      4411490 :       if (m != MATCH_YES)
    1169      4410494 :         goto no_match;
    1170              : 
    1171          996 :       if (gfc_find_symbol (name, NULL, 1, &sym)
    1172          996 :           || sym == NULL
    1173         1991 :           || sym->attr.flavor != FL_PARAMETER)
    1174            1 :         goto no_match;
    1175              : 
    1176          995 :       kind = -1;
    1177          995 :       c = gfc_next_char ();
    1178              :     }
    1179              : 
    1180      2369608 :   if (c != '_')
    1181      2180333 :     goto no_match;
    1182              : 
    1183       189275 :   c = gfc_next_char ();
    1184       189275 :   if (c != '\'' && c != '"')
    1185       148826 :     goto no_match;
    1186              : 
    1187        40449 :   start_locus = gfc_current_locus;
    1188              : 
    1189        40449 :   if (kind == -1)
    1190              :     {
    1191          995 :       if (gfc_extract_int (sym->value, &kind, 1))
    1192              :         return MATCH_ERROR;
    1193          995 :       gfc_set_sym_referenced (sym);
    1194              :     }
    1195              : 
    1196        40449 :   if (gfc_validate_kind (BT_CHARACTER, kind, true) < 0)
    1197              :     {
    1198            0 :       gfc_error ("Invalid kind %d for CHARACTER constant at %C", kind);
    1199            0 :       return MATCH_ERROR;
    1200              :     }
    1201              : 
    1202        40449 : got_delim:
    1203              :   /* Scan the string into a block of memory by first figuring out how
    1204              :      long it is, allocating the structure, then re-reading it.  This
    1205              :      isn't particularly efficient, but string constants aren't that
    1206              :      common in most code.  TODO: Use obstacks?  */
    1207              : 
    1208       301808 :   delimiter = c;
    1209       301808 :   length = 0;
    1210              : 
    1211      3873950 :   for (;;)
    1212              :     {
    1213      2087879 :       c = next_string_char (delimiter, &ret);
    1214      2087879 :       if (ret == -1)
    1215              :         break;
    1216      1786075 :       if (ret == -2)
    1217              :         {
    1218            4 :           gfc_current_locus = start_locus;
    1219            4 :           gfc_error ("Unterminated character constant beginning at %C");
    1220            4 :           return MATCH_ERROR;
    1221              :         }
    1222              : 
    1223      1786071 :       length++;
    1224              :     }
    1225              : 
    1226              :   /* Peek at the next character to see if it is a b, o, z, or x for the
    1227              :      postfixed BOZ literal constants.  */
    1228       301804 :   peek = gfc_peek_ascii_char ();
    1229       301804 :   if (peek == 'b' || peek == 'o' || peek =='z' || peek == 'x')
    1230           25 :     goto no_match;
    1231              : 
    1232       301779 :   e = gfc_get_character_expr (kind, &start_locus, NULL, length);
    1233              : 
    1234       301779 :   gfc_current_locus = start_locus;
    1235              : 
    1236              :   /* We disable the warning for the following loop as the warning has already
    1237              :      been printed in the loop above.  */
    1238       301779 :   save_warn_ampersand = warn_ampersand;
    1239       301779 :   warn_ampersand = false;
    1240              : 
    1241       301779 :   p = e->value.character.string;
    1242      2087536 :   for (size_t i = 0; i < length; i++)
    1243              :     {
    1244      1785762 :       c = next_string_char (delimiter, &ret);
    1245              : 
    1246      1785762 :       if (!gfc_check_character_range (c, kind))
    1247              :         {
    1248            5 :           gfc_free_expr (e);
    1249            5 :           gfc_error ("Character %qs in string at %C is not representable "
    1250              :                      "in character kind %d", gfc_print_wide_char (c), kind);
    1251            5 :           return MATCH_ERROR;
    1252              :         }
    1253              : 
    1254      1785757 :       *p++ = c;
    1255              :     }
    1256              : 
    1257       301774 :   *p = '\0';    /* TODO: C-style string is for development/debug purposes.  */
    1258       301774 :   warn_ampersand = save_warn_ampersand;
    1259              : 
    1260       301774 :   next_string_char (delimiter, &ret);
    1261       301774 :   if (ret != -1)
    1262            0 :     gfc_internal_error ("match_string_constant(): Delimiter not found");
    1263              : 
    1264       301774 :   if (match_substring (NULL, 0, &e->ref, false) != MATCH_NO)
    1265          307 :     e->expr_type = EXPR_SUBSTRING;
    1266              : 
    1267              :   /* Substrings with constant starting and ending points are eligible as
    1268              :      designators (F2018, section 9.1).  Simplify substrings to make them usable
    1269              :      e.g. in data statements.  */
    1270       301774 :   if (e->expr_type == EXPR_SUBSTRING
    1271          307 :       && e->ref && e->ref->type == REF_SUBSTRING
    1272          303 :       && e->ref->u.ss.start->expr_type == EXPR_CONSTANT
    1273           76 :       && (e->ref->u.ss.end == NULL
    1274           74 :           || e->ref->u.ss.end->expr_type == EXPR_CONSTANT))
    1275              :     {
    1276           74 :       gfc_expr *res;
    1277           74 :       ptrdiff_t istart, iend;
    1278           74 :       size_t length;
    1279           74 :       bool equal_length = false;
    1280              : 
    1281              :       /* Basic checks on substring starting and ending indices.  */
    1282           74 :       if (!gfc_resolve_substring (e->ref, &equal_length))
    1283            6 :         return MATCH_ERROR;
    1284              : 
    1285           71 :       length = e->value.character.length;
    1286           71 :       istart = gfc_mpz_get_hwi (e->ref->u.ss.start->value.integer);
    1287           71 :       if (e->ref->u.ss.end == NULL)
    1288              :         iend = length;
    1289              :       else
    1290           69 :         iend = gfc_mpz_get_hwi (e->ref->u.ss.end->value.integer);
    1291              : 
    1292           71 :       if (istart <= iend)
    1293              :         {
    1294           66 :           if (istart < 1)
    1295              :             {
    1296            2 :               gfc_error ("Substring start index (%td) at %L below 1",
    1297            2 :                          istart, &e->ref->u.ss.start->where);
    1298            2 :               return MATCH_ERROR;
    1299              :             }
    1300           64 :           if (iend > (ssize_t) length)
    1301              :             {
    1302            1 :               gfc_error ("Substring end index (%td) at %L exceeds string "
    1303            1 :                          "length", iend, &e->ref->u.ss.end->where);
    1304            1 :               return MATCH_ERROR;
    1305              :             }
    1306           63 :           length = iend - istart + 1;
    1307              :         }
    1308              :       else
    1309              :         length = 0;
    1310              : 
    1311           68 :       res = gfc_get_constant_expr (BT_CHARACTER, e->ts.kind, &e->where);
    1312           68 :       res->value.character.string = gfc_get_wide_string (length + 1);
    1313           68 :       res->value.character.length = length;
    1314           68 :       if (length > 0)
    1315           63 :         memcpy (res->value.character.string,
    1316           63 :                 &e->value.character.string[istart - 1],
    1317              :                 length * sizeof (gfc_char_t));
    1318           68 :       res->value.character.string[length] = '\0';
    1319           68 :       e = res;
    1320              :     }
    1321              : 
    1322       301768 :   *result = e;
    1323              : 
    1324       301768 :   return MATCH_YES;
    1325              : 
    1326      6753123 : no_match:
    1327      6753123 :   gfc_current_locus = old_locus;
    1328      6753123 :   return MATCH_NO;
    1329              : }
    1330              : 
    1331              : 
    1332              : /* Match a .true. or .false.  Returns 1 if a .true. was found,
    1333              :    0 if a .false. was found, and -1 otherwise.  */
    1334              : static int
    1335      4405314 : match_logical_constant_string (void)
    1336              : {
    1337      4405314 :   locus orig_loc = gfc_current_locus;
    1338              : 
    1339      4405314 :   gfc_gobble_whitespace ();
    1340      4405314 :   if (gfc_next_ascii_char () == '.')
    1341              :     {
    1342        56588 :       char ch = gfc_next_ascii_char ();
    1343        56588 :       if (ch == 'f')
    1344              :         {
    1345        28869 :           if (gfc_next_ascii_char () == 'a'
    1346        28869 :               && gfc_next_ascii_char () == 'l'
    1347        28869 :               && gfc_next_ascii_char () == 's'
    1348        28869 :               && gfc_next_ascii_char () == 'e'
    1349        57738 :               && gfc_next_ascii_char () == '.')
    1350              :             /* Matched ".false.".  */
    1351              :             return 0;
    1352              :         }
    1353        27719 :       else if (ch == 't')
    1354              :         {
    1355        27718 :           if (gfc_next_ascii_char () == 'r'
    1356        27718 :               && gfc_next_ascii_char () == 'u'
    1357        27718 :               && gfc_next_ascii_char () == 'e'
    1358        55436 :               && gfc_next_ascii_char () == '.')
    1359              :             /* Matched ".true.".  */
    1360              :             return 1;
    1361              :         }
    1362              :     }
    1363      4348727 :   gfc_current_locus = orig_loc;
    1364      4348727 :   return -1;
    1365              : }
    1366              : 
    1367              : /* Match a .true. or .false.  */
    1368              : 
    1369              : static match
    1370      4405314 : match_logical_constant (gfc_expr **result)
    1371              : {
    1372      4405314 :   gfc_expr *e;
    1373      4405314 :   int i, kind, is_iso_c;
    1374              : 
    1375      4405314 :   i = match_logical_constant_string ();
    1376      4405314 :   if (i == -1)
    1377              :     return MATCH_NO;
    1378              : 
    1379        56587 :   kind = get_kind (&is_iso_c);
    1380        56587 :   if (kind == -1)
    1381              :     return MATCH_ERROR;
    1382        56587 :   if (kind == -2)
    1383        56098 :     kind = gfc_default_logical_kind;
    1384              : 
    1385        56587 :   if (gfc_validate_kind (BT_LOGICAL, kind, true) < 0)
    1386              :     {
    1387            4 :       gfc_error ("Bad kind for logical constant at %C");
    1388            4 :       return MATCH_ERROR;
    1389              :     }
    1390              : 
    1391        56583 :   e = gfc_get_logical_expr (kind, &gfc_current_locus, i);
    1392        56583 :   e->ts.is_c_interop = is_iso_c;
    1393              : 
    1394        56583 :   *result = e;
    1395        56583 :   return MATCH_YES;
    1396              : }
    1397              : 
    1398              : 
    1399              : /* Match a real or imaginary part of a complex constant that is a
    1400              :    symbolic constant.  */
    1401              : 
    1402              : static match
    1403       140797 : match_sym_complex_part (gfc_expr **result)
    1404              : {
    1405       140797 :   char name[GFC_MAX_SYMBOL_LEN + 1];
    1406       140797 :   gfc_symbol *sym;
    1407       140797 :   gfc_expr *e;
    1408       140797 :   match m;
    1409              : 
    1410       140797 :   m = gfc_match_name (name);
    1411       140797 :   if (m != MATCH_YES)
    1412              :     return m;
    1413              : 
    1414        38890 :   if (gfc_find_symbol (name, NULL, 1, &sym) || sym == NULL)
    1415              :     return MATCH_NO;
    1416              : 
    1417        36210 :   if (sym->attr.flavor != FL_PARAMETER)
    1418              :     {
    1419              :       /* Give the matcher for implied do-loops a chance to run.  This yields
    1420              :          a much saner error message for "write(*,*) (i, i=1, 6" where the
    1421              :          right parenthesis is missing.  */
    1422        34741 :       char c;
    1423        34741 :       gfc_gobble_whitespace ();
    1424        34741 :       c = gfc_peek_ascii_char ();
    1425        34741 :       if (c == '=' || c == ',')
    1426              :         {
    1427              :           m = MATCH_NO;
    1428              :         }
    1429              :       else
    1430              :         {
    1431        32033 :           gfc_error ("Expected PARAMETER symbol in complex constant at %C");
    1432        32033 :           m = MATCH_ERROR;
    1433              :         }
    1434        34741 :       return m;
    1435              :     }
    1436              : 
    1437         1469 :   if (!sym->value)
    1438            2 :     goto error;
    1439              : 
    1440         1467 :   if (!gfc_numeric_ts (&sym->value->ts))
    1441              :     {
    1442          332 :       gfc_error ("Numeric PARAMETER required in complex constant at %C");
    1443          332 :       return MATCH_ERROR;
    1444              :     }
    1445              : 
    1446         1135 :   if (sym->value->rank != 0)
    1447              :     {
    1448          174 :       gfc_error ("Scalar PARAMETER required in complex constant at %C");
    1449          174 :       return MATCH_ERROR;
    1450              :     }
    1451              : 
    1452          961 :   if (!gfc_notify_std (GFC_STD_F2003, "PARAMETER symbol in "
    1453              :                        "complex constant at %C"))
    1454              :     return MATCH_ERROR;
    1455              : 
    1456          958 :   switch (sym->value->ts.type)
    1457              :     {
    1458           68 :     case BT_REAL:
    1459           68 :       e = gfc_copy_expr (sym->value);
    1460           68 :       break;
    1461              : 
    1462            1 :     case BT_COMPLEX:
    1463            1 :       e = gfc_complex2real (sym->value, sym->value->ts.kind);
    1464            1 :       if (e == NULL)
    1465            0 :         goto error;
    1466              :       break;
    1467              : 
    1468          887 :     case BT_INTEGER:
    1469          887 :       e = gfc_int2real (sym->value, gfc_default_real_kind);
    1470          887 :       if (e == NULL)
    1471            0 :         goto error;
    1472              :       break;
    1473              : 
    1474            2 :     case BT_UNSIGNED:
    1475            2 :       goto error;
    1476              : 
    1477            0 :     default:
    1478            0 :       gfc_internal_error ("gfc_match_sym_complex_part(): Bad type");
    1479              :     }
    1480              : 
    1481          956 :   *result = e;          /* e is a scalar, real, constant expression.  */
    1482          956 :   return MATCH_YES;
    1483              : 
    1484            4 : error:
    1485            4 :   gfc_error ("Error converting PARAMETER constant in complex constant at %C");
    1486            4 :   return MATCH_ERROR;
    1487              : }
    1488              : 
    1489              : 
    1490              : /* Match a real or imaginary part of a complex number.  */
    1491              : 
    1492              : static match
    1493       140797 : match_complex_part (gfc_expr **result)
    1494              : {
    1495       140797 :   match m;
    1496              : 
    1497       140797 :   m = match_sym_complex_part (result);
    1498       140797 :   if (m != MATCH_NO)
    1499              :     return m;
    1500              : 
    1501       107295 :   m = match_real_constant (result, 1);
    1502       107295 :   if (m != MATCH_NO)
    1503              :     return m;
    1504              : 
    1505        92974 :   return match_integer_constant (result, 1);
    1506              : }
    1507              : 
    1508              : 
    1509              : /* Try to match a complex constant.  */
    1510              : 
    1511              : static match
    1512      7065166 : match_complex_constant (gfc_expr **result)
    1513              : {
    1514      7065166 :   gfc_expr *e, *real, *imag;
    1515      7065166 :   gfc_error_buffer old_error;
    1516      7065166 :   gfc_typespec target;
    1517      7065166 :   locus old_loc;
    1518      7065166 :   int kind;
    1519      7065166 :   match m;
    1520              : 
    1521      7065166 :   old_loc = gfc_current_locus;
    1522      7065166 :   real = imag = e = NULL;
    1523              : 
    1524      7065166 :   m = gfc_match_char ('(');
    1525      7065166 :   if (m != MATCH_YES)
    1526              :     return m;
    1527              : 
    1528       130541 :   gfc_push_error (&old_error);
    1529              : 
    1530       130541 :   m = match_complex_part (&real);
    1531       130541 :   if (m == MATCH_NO)
    1532              :     {
    1533        74693 :       gfc_free_error (&old_error);
    1534        74693 :       goto cleanup;
    1535              :     }
    1536              : 
    1537        55848 :   if (gfc_match_char (',') == MATCH_NO)
    1538              :     {
    1539              :       /* It is possible that gfc_int2real issued a warning when
    1540              :          converting an integer to real.  Throw this away here.  */
    1541              : 
    1542        45588 :       gfc_clear_warning ();
    1543        45588 :       gfc_pop_error (&old_error);
    1544        45588 :       m = MATCH_NO;
    1545        45588 :       goto cleanup;
    1546              :     }
    1547              : 
    1548              :   /* If m is error, then something was wrong with the real part and we
    1549              :      assume we have a complex constant because we've seen the ','.  An
    1550              :      ambiguous case here is the start of an iterator list of some
    1551              :      sort. These sort of lists are matched prior to coming here.  */
    1552              : 
    1553        10260 :   if (m == MATCH_ERROR)
    1554              :     {
    1555            4 :       gfc_free_error (&old_error);
    1556            4 :       goto cleanup;
    1557              :     }
    1558        10256 :   gfc_pop_error (&old_error);
    1559              : 
    1560        10256 :   m = match_complex_part (&imag);
    1561        10256 :   if (m == MATCH_NO)
    1562         3123 :     goto syntax;
    1563         7133 :   if (m == MATCH_ERROR)
    1564          133 :     goto cleanup;
    1565              : 
    1566         7000 :   m = gfc_match_char (')');
    1567         7000 :   if (m == MATCH_NO)
    1568              :     {
    1569              :       /* Give the matcher for implied do-loops a chance to run.  This
    1570              :          yields a much saner error message for (/ (i, 4=i, 6) /).  */
    1571           13 :       if (gfc_peek_ascii_char () == '=')
    1572              :         {
    1573            0 :           m = MATCH_ERROR;
    1574            0 :           goto cleanup;
    1575              :         }
    1576              :       else
    1577           13 :     goto syntax;
    1578              :     }
    1579              : 
    1580         6987 :   if (m == MATCH_ERROR)
    1581            0 :     goto cleanup;
    1582              : 
    1583              :   /* Decide on the kind of this complex number.  */
    1584         6987 :   if (real->ts.type == BT_REAL)
    1585              :     {
    1586         6553 :       if (imag->ts.type == BT_REAL)
    1587         6528 :         kind = gfc_kind_max (real, imag);
    1588              :       else
    1589           25 :         kind = real->ts.kind;
    1590              :     }
    1591              :   else
    1592              :     {
    1593          434 :       if (imag->ts.type == BT_REAL)
    1594            7 :         kind = imag->ts.kind;
    1595              :       else
    1596          427 :         kind = gfc_default_real_kind;
    1597              :     }
    1598         6987 :   gfc_clear_ts (&target);
    1599         6987 :   target.type = BT_REAL;
    1600         6987 :   target.kind = kind;
    1601              : 
    1602         6987 :   if (real->ts.type != BT_REAL || kind != real->ts.kind)
    1603          435 :     gfc_convert_type (real, &target, 2);
    1604         6987 :   if (imag->ts.type != BT_REAL || kind != imag->ts.kind)
    1605          490 :     gfc_convert_type (imag, &target, 2);
    1606              : 
    1607         6987 :   e = convert_complex (real, imag, kind);
    1608         6987 :   e->where = gfc_current_locus;
    1609              : 
    1610         6987 :   gfc_free_expr (real);
    1611         6987 :   gfc_free_expr (imag);
    1612              : 
    1613         6987 :   *result = e;
    1614         6987 :   return MATCH_YES;
    1615              : 
    1616         3136 : syntax:
    1617         3136 :   gfc_error ("Syntax error in COMPLEX constant at %C");
    1618         3136 :   m = MATCH_ERROR;
    1619              : 
    1620       123554 : cleanup:
    1621       123554 :   gfc_free_expr (e);
    1622       123554 :   gfc_free_expr (real);
    1623       123554 :   gfc_free_expr (imag);
    1624       123554 :   gfc_current_locus = old_loc;
    1625              : 
    1626       123554 :   return m;
    1627      7065166 : }
    1628              : 
    1629              : 
    1630              : /* Match constants in any of several forms.  Returns nonzero for a
    1631              :    match, zero for no match.  */
    1632              : 
    1633              : match
    1634      7065166 : gfc_match_literal_constant (gfc_expr **result, int signflag)
    1635              : {
    1636      7065166 :   match m;
    1637              : 
    1638      7065166 :   m = match_complex_constant (result);
    1639      7065166 :   if (m != MATCH_NO)
    1640              :     return m;
    1641              : 
    1642      7054906 :   m = match_string_constant (result);
    1643      7054906 :   if (m != MATCH_NO)
    1644              :     return m;
    1645              : 
    1646      6753123 :   m = match_boz_constant (result);
    1647      6753123 :   if (m != MATCH_NO)
    1648              :     return m;
    1649              : 
    1650      6748963 :   m = match_real_constant (result, signflag);
    1651      6748963 :   if (m != MATCH_NO)
    1652              :     return m;
    1653              : 
    1654      6545097 :   m = match_hollerith_constant (result);
    1655      6545097 :   if (m != MATCH_NO)
    1656              :     return m;
    1657              : 
    1658      6542461 :   if (flag_unsigned)
    1659              :     {
    1660       588996 :       m = match_unsigned_constant (result);
    1661       588996 :       if (m != MATCH_NO)
    1662              :         return m;
    1663              :     }
    1664              : 
    1665      6441089 :   m = match_integer_constant (result, signflag);
    1666      6441089 :   if (m != MATCH_NO)
    1667              :     return m;
    1668              : 
    1669      4405314 :   m = match_logical_constant (result);
    1670      4405314 :   if (m != MATCH_NO)
    1671              :     return m;
    1672              : 
    1673              :   return MATCH_NO;
    1674              : }
    1675              : 
    1676              : 
    1677              : /* This checks if a symbol is the return value of an encompassing function.
    1678              :    Function nesting can be maximally two levels deep, but we may have
    1679              :    additional local namespaces like BLOCK etc.  */
    1680              : 
    1681              : bool
    1682       777699 : gfc_is_function_return_value (gfc_symbol *sym, gfc_namespace *ns)
    1683              : {
    1684       777699 :   if (!sym->attr.function || (sym->result != sym))
    1685              :     return false;
    1686      1629717 :   while (ns)
    1687              :     {
    1688       922671 :       if (ns->proc_name == sym)
    1689              :         return true;
    1690       911009 :       ns = ns->parent;
    1691              :     }
    1692              :   return false;
    1693              : }
    1694              : 
    1695              : 
    1696              : /* Match a single actual argument value.  An actual argument is
    1697              :    usually an expression, but can also be a procedure name.  If the
    1698              :    argument is a single name, it is not always possible to tell
    1699              :    whether the name is a dummy procedure or not.  We treat these cases
    1700              :    by creating an argument that looks like a dummy procedure and
    1701              :    fixing things later during resolution.  */
    1702              : 
    1703              : static match
    1704      2006086 : match_actual_arg (gfc_expr **result)
    1705              : {
    1706      2006086 :   char name[GFC_MAX_SYMBOL_LEN + 1];
    1707      2006086 :   gfc_symtree *symtree;
    1708      2006086 :   locus where, w;
    1709      2006086 :   gfc_expr *e;
    1710      2006086 :   char c;
    1711              : 
    1712      2006086 :   gfc_gobble_whitespace ();
    1713      2006086 :   where = gfc_current_locus;
    1714              : 
    1715      2006086 :   switch (gfc_match_name (name))
    1716              :     {
    1717              :     case MATCH_ERROR:
    1718              :       return MATCH_ERROR;
    1719              : 
    1720              :     case MATCH_NO:
    1721              :       break;
    1722              : 
    1723      1309392 :     case MATCH_YES:
    1724      1309392 :       w = gfc_current_locus;
    1725      1309392 :       gfc_gobble_whitespace ();
    1726      1309392 :       c = gfc_next_ascii_char ();
    1727      1309392 :       gfc_current_locus = w;
    1728              : 
    1729      1309392 :       if (c != ',' && c != ')')
    1730              :         break;
    1731              : 
    1732       688327 :       if (gfc_find_sym_tree (name, NULL, 1, &symtree))
    1733              :         break;
    1734              :       /* Handle error elsewhere.  */
    1735              : 
    1736              :       /* Eliminate a couple of common cases where we know we don't
    1737              :          have a function argument.  */
    1738       688327 :       if (symtree == NULL)
    1739              :         {
    1740        13969 :           gfc_get_sym_tree (name, NULL, &symtree, false);
    1741        13969 :           gfc_set_sym_referenced (symtree->n.sym);
    1742              :         }
    1743              :       else
    1744              :         {
    1745       674358 :           gfc_symbol *sym;
    1746              : 
    1747       674358 :           sym = symtree->n.sym;
    1748       674358 :           gfc_set_sym_referenced (sym);
    1749       674358 :           if (sym->attr.flavor == FL_NAMELIST)
    1750              :             {
    1751         1121 :               gfc_error ("Namelist %qs cannot be an argument at %L",
    1752              :               sym->name, &where);
    1753         1121 :               break;
    1754              :             }
    1755       673237 :           if (sym->attr.flavor != FL_PROCEDURE
    1756       635822 :               && sym->attr.flavor != FL_UNKNOWN)
    1757              :             break;
    1758              : 
    1759       189928 :           if (sym->attr.in_common && !sym->attr.proc_pointer)
    1760              :             {
    1761          224 :               if (!gfc_add_flavor (&sym->attr, FL_VARIABLE,
    1762              :                                    sym->name, &sym->declared_at))
    1763              :                 return MATCH_ERROR;
    1764              :               break;
    1765              :             }
    1766              : 
    1767              :           /* If the symbol is a function with itself as the result and
    1768              :              is being defined, then we have a variable.  */
    1769       189704 :           if (sym->attr.function && sym->result == sym)
    1770              :             {
    1771         3777 :               if (gfc_is_function_return_value (sym, gfc_current_ns))
    1772              :                 break;
    1773              : 
    1774         3123 :               if (sym->attr.entry
    1775           55 :                   && (sym->ns == gfc_current_ns
    1776            2 :                       || sym->ns == gfc_current_ns->parent))
    1777              :                 {
    1778           54 :                   gfc_entry_list *el = NULL;
    1779              : 
    1780           54 :                   for (el = sym->ns->entries; el; el = el->next)
    1781           54 :                     if (sym == el->sym)
    1782              :                       break;
    1783              : 
    1784           54 :                   if (el)
    1785              :                     break;
    1786              :                 }
    1787              :             }
    1788              :         }
    1789              : 
    1790       202965 :       e = gfc_get_expr ();      /* Leave it unknown for now */
    1791       202965 :       e->symtree = symtree;
    1792       202965 :       e->expr_type = EXPR_VARIABLE;
    1793       202965 :       e->ts.type = BT_PROCEDURE;
    1794       202965 :       e->where = where;
    1795              : 
    1796       202965 :       *result = e;
    1797       202965 :       return MATCH_YES;
    1798              :     }
    1799              : 
    1800      1803121 :   gfc_current_locus = where;
    1801      1803121 :   return gfc_match_expr (result);
    1802              : }
    1803              : 
    1804              : 
    1805              : /* Match a keyword argument or type parameter spec list..  */
    1806              : 
    1807              : static match
    1808      1998020 : match_keyword_arg (gfc_actual_arglist *actual, gfc_actual_arglist *base, bool pdt)
    1809              : {
    1810      1998020 :   char name[GFC_MAX_SYMBOL_LEN + 1];
    1811      1998020 :   gfc_actual_arglist *a;
    1812      1998020 :   locus name_locus;
    1813      1998020 :   match m;
    1814              : 
    1815      1998020 :   name_locus = gfc_current_locus;
    1816      1998020 :   m = gfc_match_name (name);
    1817              : 
    1818      1998020 :   if (m != MATCH_YES)
    1819       587556 :     goto cleanup;
    1820      1410464 :   if (gfc_match_char ('=') != MATCH_YES)
    1821              :     {
    1822      1250433 :       m = MATCH_NO;
    1823      1250433 :       goto cleanup;
    1824              :     }
    1825              : 
    1826       160031 :   if (pdt)
    1827              :     {
    1828          466 :       if (gfc_match_char ('*') == MATCH_YES)
    1829              :         {
    1830           86 :           actual->spec_type = SPEC_ASSUMED;
    1831           86 :           goto add_name;
    1832              :         }
    1833          380 :       else if (gfc_match_char (':') == MATCH_YES)
    1834              :         {
    1835           55 :           actual->spec_type = SPEC_DEFERRED;
    1836           55 :           goto add_name;
    1837              :         }
    1838              :       else
    1839          325 :         actual->spec_type = SPEC_EXPLICIT;
    1840              :     }
    1841              : 
    1842       159890 :   m = match_actual_arg (&actual->expr);
    1843       159890 :   if (m != MATCH_YES)
    1844        11199 :     goto cleanup;
    1845              : 
    1846              :   /* Make sure this name has not appeared yet.  */
    1847       148691 : add_name:
    1848       148832 :   if (name[0] != '\0')
    1849              :     {
    1850       479340 :       for (a = base; a; a = a->next)
    1851       330522 :         if (a->name != NULL && strcmp (a->name, name) == 0)
    1852              :           {
    1853           14 :             gfc_error ("Keyword %qs at %C has already appeared in the "
    1854              :                        "current argument list", name);
    1855           14 :             return MATCH_ERROR;
    1856              :           }
    1857              :     }
    1858              : 
    1859       148818 :   actual->name = gfc_get_string ("%s", name);
    1860       148818 :   return MATCH_YES;
    1861              : 
    1862      1849188 : cleanup:
    1863      1849188 :   gfc_current_locus = name_locus;
    1864      1849188 :   return m;
    1865              : }
    1866              : 
    1867              : 
    1868              : /* Match an argument list function, such as %VAL.  */
    1869              : 
    1870              : static match
    1871      1959154 : match_arg_list_function (gfc_actual_arglist *result)
    1872              : {
    1873      1959154 :   char name[GFC_MAX_SYMBOL_LEN + 1];
    1874      1959154 :   locus old_locus;
    1875      1959154 :   match m;
    1876              : 
    1877      1959154 :   old_locus = gfc_current_locus;
    1878              : 
    1879      1959154 :   if (gfc_match_char ('%') != MATCH_YES)
    1880              :     {
    1881      1959089 :       m = MATCH_NO;
    1882      1959089 :       goto cleanup;
    1883              :     }
    1884              : 
    1885           65 :   m = gfc_match ("%n (", name);
    1886           65 :   if (m != MATCH_YES)
    1887            0 :     goto cleanup;
    1888              : 
    1889           65 :   if (name[0] != '\0')
    1890              :     {
    1891           65 :       switch (name[0])
    1892              :         {
    1893           16 :         case 'l':
    1894           16 :           if (startswith (name, "loc"))
    1895              :             {
    1896           16 :               result->name = "%LOC";
    1897           16 :               break;
    1898              :             }
    1899              :           /* FALLTHRU */
    1900           12 :         case 'r':
    1901           12 :           if (startswith (name, "ref"))
    1902              :             {
    1903           12 :               result->name = "%REF";
    1904           12 :               break;
    1905              :             }
    1906              :           /* FALLTHRU */
    1907           37 :         case 'v':
    1908           37 :           if (startswith (name, "val"))
    1909              :             {
    1910           37 :               result->name = "%VAL";
    1911           37 :               break;
    1912              :             }
    1913              :           /* FALLTHRU */
    1914            0 :         default:
    1915            0 :           m = MATCH_ERROR;
    1916            0 :           goto cleanup;
    1917              :         }
    1918              :     }
    1919              : 
    1920           65 :   if (!gfc_notify_std (GFC_STD_GNU, "argument list function at %C"))
    1921              :     {
    1922            1 :       m = MATCH_ERROR;
    1923            1 :       goto cleanup;
    1924              :     }
    1925              : 
    1926           64 :   m = match_actual_arg (&result->expr);
    1927           64 :   if (m != MATCH_YES)
    1928            0 :     goto cleanup;
    1929              : 
    1930           64 :   if (gfc_match_char (')') != MATCH_YES)
    1931              :     {
    1932            0 :       m = MATCH_NO;
    1933            0 :       goto cleanup;
    1934              :     }
    1935              : 
    1936              :   return MATCH_YES;
    1937              : 
    1938      1959090 : cleanup:
    1939      1959090 :   gfc_current_locus = old_locus;
    1940      1959090 :   return m;
    1941              : }
    1942              : 
    1943              : 
    1944              : /* Matches an actual argument list of a function or subroutine, from
    1945              :    the opening parenthesis to the closing parenthesis.  The argument
    1946              :    list is assumed to allow keyword arguments because we don't know if
    1947              :    the symbol associated with the procedure has an implicit interface
    1948              :    or not.  We make sure keywords are unique. If sub_flag is set,
    1949              :    we're matching the argument list of a subroutine.
    1950              : 
    1951              :    NOTE: An alternative use for this function is to match type parameter
    1952              :    spec lists, which are so similar to actual argument lists that the
    1953              :    machinery can be reused. This use is flagged by the optional argument
    1954              :    'pdt'.  */
    1955              : 
    1956              : match
    1957      2070470 : gfc_match_actual_arglist (int sub_flag, gfc_actual_arglist **argp, bool pdt)
    1958              : {
    1959      2070470 :   gfc_actual_arglist *head, *tail;
    1960      2070470 :   int seen_keyword;
    1961      2070470 :   gfc_st_label *label;
    1962      2070470 :   locus old_loc;
    1963      2070470 :   match m;
    1964              : 
    1965      2070470 :   *argp = tail = NULL;
    1966      2070470 :   old_loc = gfc_current_locus;
    1967              : 
    1968      2070470 :   seen_keyword = 0;
    1969              : 
    1970      2070470 :   if (gfc_match_char ('(') == MATCH_NO)
    1971      1221875 :     return (sub_flag) ? MATCH_YES : MATCH_NO;
    1972              : 
    1973      1442831 :   if (gfc_match_char (')') == MATCH_YES)
    1974              :     return MATCH_YES;
    1975              : 
    1976      1415268 :   head = NULL;
    1977              : 
    1978      1415268 :   matching_actual_arglist++;
    1979              : 
    1980      1997584 :   for (;;)
    1981              :     {
    1982      1997584 :       if (head == NULL)
    1983      1415268 :         head = tail = gfc_get_actual_arglist ();
    1984              :       else
    1985              :         {
    1986       582316 :           tail->next = gfc_get_actual_arglist ();
    1987       582316 :           tail = tail->next;
    1988              :         }
    1989              : 
    1990      1997584 :       if (sub_flag && !pdt && gfc_match_char ('*') == MATCH_YES)
    1991              :         {
    1992          238 :           m = gfc_match_st_label (&label);
    1993          238 :           if (m == MATCH_NO)
    1994            0 :             gfc_error ("Expected alternate return label at %C");
    1995          238 :           if (m != MATCH_YES)
    1996            0 :             goto cleanup;
    1997              : 
    1998          238 :           if (!gfc_notify_std (GFC_STD_F95_OBS, "Alternate-return argument "
    1999              :                                "at %C"))
    2000            0 :             goto cleanup;
    2001              : 
    2002          238 :           tail->label = label;
    2003          238 :           goto next;
    2004              :         }
    2005              : 
    2006      1997346 :       if (pdt && !seen_keyword)
    2007              :         {
    2008         1495 :           if (gfc_match_char (':') == MATCH_YES)
    2009              :             {
    2010           84 :               tail->spec_type = SPEC_DEFERRED;
    2011           84 :               goto next;
    2012              :             }
    2013         1411 :           else if (gfc_match_char ('*') == MATCH_YES)
    2014              :             {
    2015          123 :               tail->spec_type = SPEC_ASSUMED;
    2016          123 :               goto next;
    2017              :             }
    2018              :           else
    2019         1288 :             tail->spec_type = SPEC_EXPLICIT;
    2020              : 
    2021         1288 :           m = match_keyword_arg (tail, head, pdt);
    2022         1288 :           if (m == MATCH_YES)
    2023              :             {
    2024          342 :               seen_keyword = 1;
    2025          342 :               goto next;
    2026              :             }
    2027          946 :           if (m == MATCH_ERROR)
    2028            0 :             goto cleanup;
    2029              :         }
    2030              : 
    2031              :       /* After the first keyword argument is seen, the following
    2032              :          arguments must also have keywords.  */
    2033      1996797 :       if (seen_keyword)
    2034              :         {
    2035        37643 :           m = match_keyword_arg (tail, head, pdt);
    2036              : 
    2037        37643 :           if (m == MATCH_ERROR)
    2038           34 :             goto cleanup;
    2039        37609 :           if (m == MATCH_NO)
    2040              :             {
    2041         1368 :               gfc_error ("Missing keyword name in actual argument list at %C");
    2042         1368 :               goto cleanup;
    2043              :             }
    2044              : 
    2045              :         }
    2046              :       else
    2047              :         {
    2048              :           /* Try an argument list function, like %VAL.  */
    2049      1959154 :           m = match_arg_list_function (tail);
    2050      1959154 :           if (m == MATCH_ERROR)
    2051            1 :             goto cleanup;
    2052              : 
    2053              :           /* See if we have the first keyword argument.  */
    2054      1959153 :           if (m == MATCH_NO)
    2055              :             {
    2056      1959089 :               m = match_keyword_arg (tail, head, false);
    2057      1959089 :               if (m == MATCH_YES)
    2058              :                 seen_keyword = 1;
    2059      1846854 :               if (m == MATCH_ERROR)
    2060          722 :                 goto cleanup;
    2061              :             }
    2062              : 
    2063      1958367 :           if (m == MATCH_NO)
    2064              :             {
    2065              :               /* Try for a non-keyword argument.  */
    2066      1846132 :               m = match_actual_arg (&tail->expr);
    2067      1846132 :               if (m == MATCH_ERROR)
    2068         1944 :                 goto cleanup;
    2069      1844188 :               if (m == MATCH_NO)
    2070        19774 :                 goto syntax;
    2071              :             }
    2072              :         }
    2073              : 
    2074              :     /* PDT kind expressions are acceptable as initialization expressions.
    2075              :        However, intrinsics with a KIND argument reject them. Convert the
    2076              :        expression now by use of the component initializer.  */
    2077      1972954 :     if (tail->expr
    2078      1972870 :         && tail->expr->expr_type == EXPR_VARIABLE
    2079      3945824 :         && gfc_expr_attr (tail->expr).pdt_kind)
    2080              :       {
    2081          326 :         gfc_ref *ref;
    2082          326 :         gfc_expr *tmp = NULL;
    2083          348 :         for (ref = tail->expr->ref; ref; ref = ref->next)
    2084           22 :              if (!ref->next && ref->type == REF_COMPONENT
    2085           22 :                  && ref->u.c.component->attr.pdt_kind
    2086           22 :                  && ref->u.c.component->initializer)
    2087           22 :           tmp = gfc_copy_expr (ref->u.c.component->initializer);
    2088          326 :         if (tmp)
    2089           22 :           gfc_replace_expr (tail->expr, tmp);
    2090              :       }
    2091              : 
    2092      1973741 :     next:
    2093      1973741 :       if (gfc_match_char (')') == MATCH_YES)
    2094              :         break;
    2095       590840 :       if (gfc_match_char (',') != MATCH_YES)
    2096         8524 :         goto syntax;
    2097              :     }
    2098              : 
    2099      1382901 :   *argp = head;
    2100      1382901 :   matching_actual_arglist--;
    2101      1382901 :   return MATCH_YES;
    2102              : 
    2103        28298 : syntax:
    2104        28298 :   gfc_error ("Syntax error in argument list at %C");
    2105              : 
    2106        32367 : cleanup:
    2107        32367 :   gfc_free_actual_arglist (head);
    2108        32367 :   gfc_current_locus = old_loc;
    2109        32367 :   matching_actual_arglist--;
    2110        32367 :   return MATCH_ERROR;
    2111              : }
    2112              : 
    2113              : 
    2114              : /* Used by gfc_match_varspec() to extend the reference list by one
    2115              :    element.  */
    2116              : 
    2117              : static gfc_ref *
    2118       736073 : extend_ref (gfc_expr *primary, gfc_ref *tail)
    2119              : {
    2120       736073 :   if (primary->ref == NULL)
    2121       669929 :     primary->ref = tail = gfc_get_ref ();
    2122        66144 :   else if (tail == NULL)
    2123              :     {
    2124              :       /* Set tail to end of reference chain.  */
    2125           23 :       for (gfc_ref *ref = primary->ref; ref; ref = ref->next)
    2126           23 :         if (ref->next == NULL)
    2127              :           {
    2128              :             tail = ref;
    2129              :             break;
    2130              :           }
    2131              :     }
    2132              :   else
    2133              :     {
    2134        66130 :       tail->next = gfc_get_ref ();
    2135        66130 :       tail = tail->next;
    2136              :     }
    2137              : 
    2138       736073 :   return tail;
    2139              : }
    2140              : 
    2141              : 
    2142              : /* Used by gfc_match_varspec() to match an inquiry reference.  */
    2143              : 
    2144              : bool
    2145         4119 : is_inquiry_ref (const char *name, gfc_ref **ref)
    2146              : {
    2147         4119 :   inquiry_type type;
    2148              : 
    2149         4119 :   if (name == NULL)
    2150              :     return false;
    2151              : 
    2152         4119 :   if (ref) *ref = NULL;
    2153              : 
    2154         4119 :   if (strcmp (name, "re") == 0)
    2155              :     type = INQUIRY_RE;
    2156         2770 :   else if (strcmp (name, "im") == 0)
    2157              :     type = INQUIRY_IM;
    2158         1888 :   else if (strcmp (name, "kind") == 0)
    2159              :     type = INQUIRY_KIND;
    2160         1381 :   else if (strcmp (name, "len") == 0)
    2161              :     type = INQUIRY_LEN;
    2162              :   else
    2163              :     return false;
    2164              : 
    2165         3180 :   if (ref)
    2166              :     {
    2167         1797 :       *ref = gfc_get_ref ();
    2168         1797 :       (*ref)->type = REF_INQUIRY;
    2169         1797 :       (*ref)->u.i = type;
    2170              :     }
    2171              : 
    2172              :   return true;
    2173              : }
    2174              : 
    2175              : 
    2176              : /* Check to see if functions in operator expressions can be resolved now.  */
    2177              : 
    2178              : static bool
    2179          126 : resolvable_fcns (gfc_expr *e,
    2180              :                   gfc_symbol *sym ATTRIBUTE_UNUSED,
    2181              :                   int *f ATTRIBUTE_UNUSED)
    2182              : {
    2183          126 :   bool p;
    2184          126 :   gfc_symbol *s;
    2185              : 
    2186          126 :   if (e->expr_type != EXPR_FUNCTION)
    2187              :     return false;
    2188              : 
    2189           54 :   s = e && e->symtree && e->symtree->n.sym ? e->symtree->n.sym : NULL;
    2190           54 :   p = s && (s->attr.use_assoc
    2191           54 :             || s->attr.host_assoc
    2192           54 :             || s->attr.if_source == IFSRC_DECL
    2193           54 :             || s->attr.proc == PROC_INTRINSIC
    2194           24 :             || gfc_is_intrinsic (s, 0, e->where));
    2195           54 :   return !p;
    2196              : }
    2197              : 
    2198              : 
    2199              : /* Match any additional specifications associated with the current
    2200              :    variable like member references or substrings.  If equiv_flag is
    2201              :    set we only match stuff that is allowed inside an EQUIVALENCE
    2202              :    statement.  sub_flag tells whether we expect a type-bound procedure found
    2203              :    to be a subroutine as part of CALL or a FUNCTION. For procedure pointer
    2204              :    components, 'ppc_arg' determines whether the PPC may be called (with an
    2205              :    argument list), or whether it may just be referred to as a pointer.  */
    2206              : 
    2207              : match
    2208      5050701 : gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
    2209              :                    bool ppc_arg)
    2210              : {
    2211      5050701 :   char name[GFC_MAX_SYMBOL_LEN + 1];
    2212      5050701 :   gfc_ref *substring, *tail, *tmp;
    2213      5050701 :   gfc_component *component = NULL;
    2214      5050701 :   gfc_component *previous = NULL;
    2215      5050701 :   gfc_symbol *sym = primary->symtree->n.sym;
    2216      5050701 :   gfc_expr *tgt_expr = NULL;
    2217      5050701 :   match m;
    2218      5050701 :   bool unknown;
    2219      5050701 :   bool inquiry;
    2220      5050701 :   bool intrinsic;
    2221      5050701 :   bool inferred_type;
    2222      5050701 :   locus old_loc;
    2223      5050701 :   char peeked_char;
    2224              : 
    2225      5050701 :   tail = NULL;
    2226              : 
    2227      5050701 :   gfc_gobble_whitespace ();
    2228              : 
    2229      5050701 :   if (gfc_peek_ascii_char () == '[')
    2230              :     {
    2231         3209 :       if ((sym->ts.type != BT_CLASS && sym->attr.dimension)
    2232         3209 :           || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
    2233          135 :               && CLASS_DATA (sym)->attr.dimension))
    2234              :         {
    2235            0 :           gfc_error ("Array section designator, e.g. %<(:)%>, is required "
    2236              :                      "besides the coarray designator %<[...]%> at %C");
    2237            0 :           return MATCH_ERROR;
    2238              :         }
    2239         3209 :       if ((sym->ts.type != BT_CLASS && !sym->attr.codimension)
    2240         3208 :           || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
    2241          135 :               && !CLASS_DATA (sym)->attr.codimension))
    2242              :         {
    2243            1 :           gfc_error ("Coarray designator at %C but %qs is not a coarray",
    2244              :                      sym->name);
    2245            1 :           return MATCH_ERROR;
    2246              :         }
    2247              :     }
    2248              : 
    2249      5050700 :   if (sym->assoc && sym->assoc->target)
    2250      5050700 :     tgt_expr = sym->assoc->target;
    2251              : 
    2252      5050700 :   inferred_type = IS_INFERRED_TYPE (primary);
    2253              : 
    2254              :   /* SELECT TYPE temporaries within an ASSOCIATE block, whose selector has not
    2255              :      been parsed, can generate errors with array refs.. The SELECT TYPE
    2256              :      namespace is marked with 'assoc_name_inferred'. During resolution, this is
    2257              :      detected and gfc_fixup_inferred_type_refs is called.  */
    2258      5049825 :   if (!inferred_type
    2259      5049825 :       && sym->attr.select_type_temporary
    2260        23448 :       && sym->ns->assoc_name_inferred
    2261          344 :       && !sym->attr.select_rank_temporary)
    2262         1219 :     inferred_type = true;
    2263              : 
    2264              :   /* Try to resolve a typebound generic procedure so that the associate name
    2265              :      has a chance to get a type before being used in a second, nested associate
    2266              :      statement. Note that a copy is used for resolution so that failure does
    2267              :      not result in a mutilated selector expression further down the line.  */
    2268         6614 :   if (tgt_expr && !sym->assoc->dangling
    2269         6614 :       && tgt_expr->ts.type == BT_UNKNOWN
    2270         1787 :       && tgt_expr->symtree
    2271         1348 :       && tgt_expr->symtree->n.sym
    2272      5050773 :       && gfc_expr_attr (tgt_expr).generic
    2273      5050773 :       && ((sym->ts.type == BT_DERIVED && sym->ts.u.derived->attr.pdt_template)
    2274           72 :           || (sym->ts.type == BT_CLASS
    2275            0 :               && CLASS_DATA (sym)->ts.u.derived->attr.pdt_template)))
    2276              :     {
    2277            1 :         gfc_expr *cpy = gfc_copy_expr (tgt_expr);
    2278            1 :         if (gfc_resolve_expr (cpy)
    2279            1 :             && cpy->ts.type != BT_UNKNOWN)
    2280              :           {
    2281            1 :             gfc_replace_expr (tgt_expr, cpy);
    2282            1 :             sym->ts = tgt_expr->ts;
    2283              :           }
    2284              :         else
    2285            0 :           gfc_free_expr (cpy);
    2286            1 :         if (gfc_expr_attr (tgt_expr).generic)
    2287      5050700 :           inferred_type = true;
    2288              :     }
    2289              : 
    2290              :   /* For associate names, we may not yet know whether they are arrays or not.
    2291              :      If the selector expression is unambiguously an array; eg. a full array
    2292              :      or an array section, then the associate name must be an array and we can
    2293              :      fix it now. Otherwise, if parentheses follow and it is not a character
    2294              :      type, we have to assume that it actually is one for now.  The final
    2295              :      decision will be made at resolution, of course.  */
    2296      5050700 :   if (sym->assoc
    2297        30062 :       && gfc_peek_ascii_char () == '('
    2298         9622 :       && sym->ts.type != BT_CLASS
    2299      5060121 :       && !sym->attr.dimension)
    2300              :     {
    2301          386 :       gfc_ref *ref = NULL;
    2302              : 
    2303          386 :       if (!sym->assoc->dangling && tgt_expr)
    2304              :         {
    2305          326 :            if (tgt_expr->expr_type == EXPR_VARIABLE)
    2306           21 :              gfc_resolve_expr (tgt_expr);
    2307              : 
    2308          326 :            ref = tgt_expr->ref;
    2309          340 :            for (; ref; ref = ref->next)
    2310           14 :               if (ref->type == REF_ARRAY
    2311            7 :                   && (ref->u.ar.type == AR_FULL
    2312            7 :                       || ref->u.ar.type == AR_SECTION))
    2313              :                 break;
    2314              :         }
    2315              : 
    2316          386 :       if (ref || (!(sym->assoc->dangling || sym->ts.type == BT_CHARACTER)
    2317          260 :                   && sym->assoc->st
    2318          260 :                   && sym->assoc->st->n.sym
    2319          260 :                   && sym->assoc->st->n.sym->attr.dimension == 0))
    2320              :         {
    2321          260 :           sym->attr.dimension = 1;
    2322          260 :           if (sym->as == NULL
    2323          260 :               && sym->assoc->st
    2324          260 :               && sym->assoc->st->n.sym
    2325          260 :               && sym->assoc->st->n.sym->as)
    2326            0 :             sym->as = gfc_copy_array_spec (sym->assoc->st->n.sym->as);
    2327              :         }
    2328              :     }
    2329      5050314 :   else if (sym->ts.type == BT_CLASS
    2330        44402 :            && !(sym->assoc && sym->assoc->ar)
    2331        44330 :            && tgt_expr
    2332          266 :            && tgt_expr->expr_type == EXPR_VARIABLE
    2333          140 :            && sym->ts.u.derived != tgt_expr->ts.u.derived)
    2334              :     {
    2335           19 :       gfc_resolve_expr (tgt_expr);
    2336           19 :       if (tgt_expr->rank)
    2337            0 :         sym->ts.u.derived = tgt_expr->ts.u.derived;
    2338              :     }
    2339              : 
    2340      5050700 :   peeked_char = gfc_peek_ascii_char ();
    2341         1219 :   if ((inferred_type && !sym->as && peeked_char == '(')
    2342      5050479 :       || (equiv_flag && peeked_char == '(') || peeked_char == '['
    2343      5045700 :       || sym->attr.codimension
    2344      5028128 :       || (sym->attr.dimension && sym->ts.type != BT_CLASS
    2345       629613 :           && !sym->attr.proc_pointer && !gfc_is_proc_ptr_comp (primary)
    2346       629598 :           && !(gfc_matching_procptr_assignment
    2347           32 :                && sym->attr.flavor == FL_PROCEDURE))
    2348      9449250 :       || (sym->ts.type == BT_CLASS && sym->attr.class_ok
    2349        44219 :           && sym->ts.u.derived && CLASS_DATA (sym)
    2350        44215 :           && (CLASS_DATA (sym)->attr.dimension
    2351        26916 :               || CLASS_DATA (sym)->attr.codimension)))
    2352              :     {
    2353       669932 :       gfc_array_spec *as;
    2354        20645 :       bool coarray_only = sym->attr.codimension && !sym->attr.dimension
    2355       680408 :                           && sym->ts.type == BT_CHARACTER;
    2356       669932 :       gfc_ref *ref, *strarr = NULL;
    2357              : 
    2358       669932 :       tail = extend_ref (primary, tail);
    2359       669932 :       if (sym->ts.type == BT_CHARACTER && tail->type == REF_SUBSTRING)
    2360              :         {
    2361            3 :           gcc_assert (sym->attr.dimension);
    2362              :           /* Find array reference for substrings of character arrays.  */
    2363            3 :           for (ref = primary->ref; ref && ref->next; ref = ref->next)
    2364            3 :             if (ref->type == REF_ARRAY && ref->next->type == REF_SUBSTRING)
    2365              :               {
    2366              :                 strarr = ref;
    2367              :                 break;
    2368              :               }
    2369              :         }
    2370              :       else
    2371       669929 :         tail->type = REF_ARRAY;
    2372              : 
    2373              :       /* In EQUIVALENCE, we don't know yet whether we are seeing
    2374              :          an array, character variable or array of character
    2375              :          variables.  We'll leave the decision till resolve time.  */
    2376              : 
    2377       669932 :       if (equiv_flag)
    2378              :         as = NULL;
    2379       667931 :       else if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
    2380        17918 :         as = CLASS_DATA (sym)->as;
    2381              :       else
    2382       650013 :         as = sym->as;
    2383              : 
    2384       669932 :       ref = strarr ? strarr : tail;
    2385       669932 :       m = gfc_match_array_ref (&ref->u.ar, as, equiv_flag, as ? as->corank : 0,
    2386              :                                coarray_only);
    2387       669932 :       if (m != MATCH_YES)
    2388              :         return m;
    2389              : 
    2390       669840 :       gfc_gobble_whitespace ();
    2391       669840 :       if (coarray_only)
    2392              :         {
    2393         2011 :           primary->ts = sym->ts;
    2394         2011 :           goto check_substring;
    2395              :         }
    2396              : 
    2397       667829 :       if (equiv_flag && gfc_peek_ascii_char () == '(')
    2398              :         {
    2399           74 :           tail = extend_ref (primary, tail);
    2400           74 :           tail->type = REF_ARRAY;
    2401              : 
    2402           74 :           m = gfc_match_array_ref (&tail->u.ar, NULL, equiv_flag, 0);
    2403           74 :           if (m != MATCH_YES)
    2404              :             return m;
    2405              :         }
    2406              :     }
    2407              : 
    2408      5048597 :   primary->ts = sym->ts;
    2409              : 
    2410      5048597 :   if (equiv_flag)
    2411              :     return MATCH_YES;
    2412              : 
    2413              :   /* With DEC extensions, member separator may be '.' or '%'.  */
    2414      5045651 :   peeked_char = gfc_peek_ascii_char ();
    2415      5045651 :   m = gfc_match_member_sep (sym);
    2416      5045651 :   if (m == MATCH_ERROR)
    2417              :     return MATCH_ERROR;
    2418              : 
    2419      5045650 :   inquiry = false;
    2420      5045650 :   if (m == MATCH_YES && peeked_char == '%' && primary->ts.type != BT_CLASS
    2421       131775 :       && (primary->ts.type != BT_DERIVED || inferred_type))
    2422              :     {
    2423         2317 :       match mm;
    2424         2317 :       old_loc = gfc_current_locus;
    2425         2317 :       mm = gfc_match_name (name);
    2426              : 
    2427              :       /* Check to see if this has a default complex.  */
    2428          484 :       if (sym->ts.type == BT_UNKNOWN && tgt_expr == NULL
    2429         2336 :           && gfc_get_default_type (sym->name, sym->ns)->type != BT_UNKNOWN)
    2430              :         {
    2431            7 :           gfc_set_default_type (sym, 0, sym->ns);
    2432            7 :           primary->ts = sym->ts;
    2433              :         }
    2434              : 
    2435              :       /* This is a usable inquiry reference, if the symbol is already known
    2436              :          to have a type or no derived types with a component of this name
    2437              :          can be found.  If this was an inquiry reference with the same name
    2438              :          as a derived component and the associate-name type is not derived
    2439              :          or class, this is fixed up in 'gfc_fixup_inferred_type_refs'.  */
    2440         2317 :       if (mm == MATCH_YES && is_inquiry_ref (name, NULL)
    2441         3910 :           && !(sym->ts.type == BT_UNKNOWN
    2442          210 :                 && gfc_find_derived_types (sym, gfc_current_ns, name)))
    2443              :         inquiry = true;
    2444         2317 :       gfc_current_locus = old_loc;
    2445              :     }
    2446              : 
    2447              :   /* Use the default type if there is one.  */
    2448      2664976 :   if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES
    2449      5046127 :       && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
    2450            0 :     gfc_set_default_type (sym, 0, sym->ns);
    2451              : 
    2452              :   /* See if the type can be determined by resolution of the selector expression,
    2453              :      if allowable now, or inferred from references.  */
    2454      5045650 :   if ((sym->ts.type == BT_UNKNOWN || inferred_type)
    2455      2665919 :       && m == MATCH_YES)
    2456              :     {
    2457         1257 :       bool sym_present, resolved = false;
    2458         1257 :       gfc_symbol *tgt_sym;
    2459              : 
    2460         1257 :       sym_present = tgt_expr && tgt_expr->symtree && tgt_expr->symtree->n.sym;
    2461         1257 :       tgt_sym = sym_present ? tgt_expr->symtree->n.sym : NULL;
    2462              : 
    2463              :       /* These target expressions can be resolved at any time:
    2464              :          (i) With a declared symbol or intrinsic function; or
    2465              :          (ii) An operator expression,
    2466              :          just as long as (iii) all the functions in the expression have been
    2467              :          declared or are intrinsic.  */
    2468         1257 :       if (((sym_present                                               // (i)
    2469          877 :             && (tgt_sym->attr.use_assoc
    2470          877 :                 || tgt_sym->attr.host_assoc
    2471          877 :                 || tgt_sym->attr.if_source == IFSRC_DECL
    2472          877 :                 || tgt_sym->attr.proc == PROC_INTRINSIC
    2473          877 :                 || gfc_is_intrinsic (tgt_sym, 0, tgt_expr->where)))
    2474         1245 :            || (tgt_expr && tgt_expr->expr_type == EXPR_OP))        // (ii)
    2475           24 :           && !gfc_traverse_expr (tgt_expr, NULL, resolvable_fcns, 0)  // (iii)
    2476           18 :           && gfc_resolve_expr (tgt_expr))
    2477              :         {
    2478           18 :           sym->ts = tgt_expr->ts;
    2479           18 :           primary->ts = sym->ts;
    2480           18 :           resolved = true;
    2481              :         }
    2482              : 
    2483              :       /* If this hasn't done the trick and the target expression is a function,
    2484              :          or an unresolved operator expression, then this must be a derived type
    2485              :          if 'name' matches an accessible type both in this namespace and in the
    2486              :          as yet unparsed contained function. In principle, the type could have
    2487              :          already been inferred to be complex and yet a derived type with a
    2488              :          component name 're' or 'im' could be found.  */
    2489           18 :       if (tgt_expr
    2490          901 :           && (tgt_expr->expr_type == EXPR_FUNCTION
    2491           85 :               || tgt_expr->expr_type == EXPR_ARRAY
    2492           73 :               || (!resolved && tgt_expr->expr_type == EXPR_OP))
    2493          834 :           && (sym->ts.type == BT_UNKNOWN
    2494          388 :               || (inferred_type && sym->ts.type != BT_COMPLEX))
    2495         2025 :           && gfc_find_derived_types (sym, gfc_current_ns, name, true))
    2496              :         {
    2497          594 :           sym->assoc->inferred_type = 1;
    2498              :           /* The first returned type is as good as any at this stage. The final
    2499              :              determination is made in 'gfc_fixup_inferred_type_refs'*/
    2500          594 :           gfc_symbol **dts = &sym->assoc->derived_types;
    2501          594 :           tgt_expr->ts.type = BT_DERIVED;
    2502          594 :           tgt_expr->ts.kind = 0;
    2503          594 :           tgt_expr->ts.u.derived = *dts;
    2504          594 :           sym->ts = tgt_expr->ts;
    2505          594 :           primary->ts = sym->ts;
    2506              :           /* Delete the dt list even if this process has to be done again for
    2507              :              another primary expression.  */
    2508         1218 :           while (*dts && (*dts)->dt_next)
    2509              :             {
    2510          624 :               gfc_symbol **tmp = &(*dts)->dt_next;
    2511          624 :               *dts = NULL;
    2512          624 :               dts = tmp;
    2513              :             }
    2514              :         }
    2515              :       /* If there is a usable inquiry reference not there are no matching
    2516              :          derived types, force the inquiry reference by setting unknown the
    2517              :          type of the primary expression.  */
    2518          258 :       else if (inquiry && (sym->ts.type == BT_DERIVED && inferred_type)
    2519          711 :                && !gfc_find_derived_types (sym, gfc_current_ns, name))
    2520           48 :         primary->ts.type = BT_UNKNOWN;
    2521              : 
    2522              :       /* Otherwise try resolving a copy of a component call. If it succeeds,
    2523              :          use that for the selector expression.  */
    2524          615 :       else if (tgt_expr && tgt_expr->expr_type == EXPR_COMPCALL)
    2525              :           {
    2526            1 :              gfc_expr *cpy = gfc_copy_expr (tgt_expr);
    2527            1 :              if (gfc_resolve_expr (cpy))
    2528              :                 {
    2529            1 :                   gfc_replace_expr (tgt_expr, cpy);
    2530            1 :                   sym->ts = tgt_expr->ts;
    2531              :                 }
    2532              :               else
    2533            0 :                 gfc_free_expr (cpy);
    2534              :           }
    2535              : 
    2536              :       /* An inquiry reference might determine the type, otherwise we have an
    2537              :          error.  */
    2538         1257 :       if (sym->ts.type == BT_UNKNOWN && !inquiry)
    2539              :         {
    2540           12 :           gfc_error ("Symbol %qs at %C has no IMPLICIT type", sym->name);
    2541           12 :           return MATCH_ERROR;
    2542              :         }
    2543              :     }
    2544      5044393 :   else if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
    2545      4814259 :            && m == MATCH_YES && !inquiry)
    2546              :     {
    2547            7 :       gfc_error ("Unexpected %<%c%> for nonderived-type variable %qs at %C",
    2548              :                  peeked_char, sym->name);
    2549            7 :       return MATCH_ERROR;
    2550              :     }
    2551              : 
    2552      5045631 :   if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS && !inquiry)
    2553       232432 :       || m != MATCH_YES)
    2554      4894487 :     goto check_substring;
    2555              : 
    2556       151144 :   if (!inquiry)
    2557       149833 :     sym = sym->ts.u.derived;
    2558              :   else
    2559              :     sym = NULL;
    2560              : 
    2561       175795 :   for (;;)
    2562              :     {
    2563       175795 :       bool t;
    2564       175795 :       gfc_symtree *tbp;
    2565       175795 :       gfc_typespec *ts = &primary->ts;
    2566              : 
    2567       175795 :       m = gfc_match_name (name);
    2568       175795 :       if (m == MATCH_NO)
    2569            0 :         gfc_error ("Expected structure component name at %C");
    2570       175795 :       if (m != MATCH_YES)
    2571          135 :         return MATCH_ERROR;
    2572              : 
    2573              :       /* For derived type components find typespec of ultimate component.  */
    2574       175795 :       if (ts->type == BT_DERIVED && primary->ref)
    2575              :         {
    2576       147231 :           for (gfc_ref *ref = primary->ref; ref; ref = ref->next)
    2577              :             {
    2578        84755 :               if (ref->type == REF_COMPONENT && ref->u.c.component)
    2579        24764 :                 ts = &ref->u.c.component->ts;
    2580              :             }
    2581              :         }
    2582              : 
    2583       175795 :       intrinsic = false;
    2584       175795 :       if (ts->type != BT_CLASS && ts->type != BT_DERIVED)
    2585              :         {
    2586         1790 :           inquiry = is_inquiry_ref (name, &tmp);
    2587         1790 :           if (inquiry)
    2588         1785 :             sym = NULL;
    2589              : 
    2590         1790 :           if (peeked_char == '%')
    2591              :             {
    2592         1790 :               if (tmp)
    2593              :                 {
    2594         1785 :                   gfc_symbol *s;
    2595         1785 :                   switch (tmp->u.i)
    2596              :                     {
    2597         1242 :                     case INQUIRY_RE:
    2598         1242 :                     case INQUIRY_IM:
    2599         1242 :                       if (!gfc_notify_std (GFC_STD_F2008,
    2600              :                                            "RE or IM part_ref at %C"))
    2601              :                         return MATCH_ERROR;
    2602              :                       break;
    2603              : 
    2604          288 :                     case INQUIRY_KIND:
    2605          288 :                       if (!gfc_notify_std (GFC_STD_F2003,
    2606              :                                            "KIND part_ref at %C"))
    2607              :                         return MATCH_ERROR;
    2608              :                       break;
    2609              : 
    2610          255 :                     case INQUIRY_LEN:
    2611          255 :                       if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
    2612              :                         return MATCH_ERROR;
    2613              :                       break;
    2614              :                     }
    2615              : 
    2616              :                   /* If necessary, infer the type of the primary expression
    2617              :                      and the associate-name using the the inquiry ref..  */
    2618         1776 :                   s = primary->symtree ? primary->symtree->n.sym : NULL;
    2619         1748 :                   if (s && s->assoc && s->assoc->target
    2620          258 :                       && (s->ts.type == BT_UNKNOWN
    2621          138 :                           || (primary->ts.type == BT_UNKNOWN
    2622           48 :                               && s->assoc->inferred_type
    2623           48 :                               && s->ts.type == BT_DERIVED)))
    2624              :                     {
    2625          168 :                       if (tmp->u.i == INQUIRY_RE || tmp->u.i == INQUIRY_IM)
    2626              :                         {
    2627           72 :                           s->ts.type = BT_COMPLEX;
    2628           72 :                           s->ts.kind = gfc_default_real_kind;;
    2629           72 :                           s->assoc->inferred_type = 1;
    2630           72 :                           primary->ts = s->ts;
    2631              :                         }
    2632           96 :                       else if (tmp->u.i == INQUIRY_LEN)
    2633              :                         {
    2634           48 :                           s->ts.type = BT_CHARACTER;
    2635           48 :                           s->ts.kind = gfc_default_character_kind;;
    2636           48 :                           s->assoc->inferred_type = 1;
    2637           48 :                           primary->ts = s->ts;
    2638              :                         }
    2639           48 :                       else if (s->ts.type == BT_UNKNOWN)
    2640              :                         {
    2641              :                           /* KIND inquiry gives no clue as to symbol type.  */
    2642           48 :                           primary->ref = tmp;
    2643           48 :                           primary->ts.type = BT_INTEGER;
    2644           48 :                           primary->ts.kind = gfc_default_integer_kind;
    2645           48 :                           return MATCH_YES;
    2646              :                         }
    2647              :                     }
    2648              : 
    2649         1728 :                   if ((tmp->u.i == INQUIRY_RE || tmp->u.i == INQUIRY_IM)
    2650         1238 :                       && primary->ts.type != BT_COMPLEX)
    2651              :                     {
    2652           12 :                         gfc_error ("The RE or IM part_ref at %C must be "
    2653              :                                    "applied to a COMPLEX expression");
    2654           12 :                         return MATCH_ERROR;
    2655              :                     }
    2656         1716 :                   else if (tmp->u.i == INQUIRY_LEN
    2657          253 :                            && ts->type != BT_CHARACTER)
    2658              :                     {
    2659            5 :                         gfc_error ("The LEN part_ref at %C must be applied "
    2660              :                                    "to a CHARACTER expression");
    2661            5 :                         return MATCH_ERROR;
    2662              :                     }
    2663              :                 }
    2664         1716 :               if (primary->ts.type != BT_UNKNOWN)
    2665       175721 :                 intrinsic = true;
    2666              :             }
    2667              :         }
    2668              :       else
    2669              :         inquiry = false;
    2670              : 
    2671       175721 :       if (sym && sym->f2k_derived)
    2672       171206 :         tbp = gfc_find_typebound_proc (sym, &t, name, false, &gfc_current_locus);
    2673              :       else
    2674              :         tbp = NULL;
    2675              : 
    2676       171206 :       if (tbp)
    2677              :         {
    2678         4049 :           gfc_symbol* tbp_sym;
    2679              : 
    2680         4049 :           if (!t)
    2681              :             return MATCH_ERROR;
    2682              : 
    2683         4047 :           gcc_assert (!tail || !tail->next);
    2684              : 
    2685         4047 :           if (!(primary->expr_type == EXPR_VARIABLE
    2686              :                 || (primary->expr_type == EXPR_STRUCTURE
    2687            1 :                     && primary->symtree && primary->symtree->n.sym
    2688            1 :                     && primary->symtree->n.sym->attr.flavor)))
    2689              :             return MATCH_ERROR;
    2690              : 
    2691         4045 :           if (tbp->n.tb->is_generic)
    2692              :             tbp_sym = NULL;
    2693              :           else
    2694         3270 :             tbp_sym = tbp->n.tb->u.specific->n.sym;
    2695              : 
    2696         4045 :           primary->expr_type = EXPR_COMPCALL;
    2697         4045 :           primary->value.compcall.tbp = tbp->n.tb;
    2698         4045 :           primary->value.compcall.name = tbp->name;
    2699         4045 :           primary->value.compcall.ignore_pass = 0;
    2700         4045 :           primary->value.compcall.assign = 0;
    2701         4045 :           primary->value.compcall.base_object = NULL;
    2702         4045 :           gcc_assert (primary->symtree->n.sym->attr.referenced);
    2703         4045 :           if (tbp_sym)
    2704         3270 :             primary->ts = tbp_sym->ts;
    2705              :           else
    2706          775 :             gfc_clear_ts (&primary->ts);
    2707              : 
    2708         4045 :           m = gfc_match_actual_arglist (tbp->n.tb->subroutine,
    2709              :                                         &primary->value.compcall.actual);
    2710         4045 :           if (m == MATCH_ERROR)
    2711              :             return MATCH_ERROR;
    2712         4045 :           if (m == MATCH_NO)
    2713              :             {
    2714          174 :               if (sub_flag)
    2715          173 :                 primary->value.compcall.actual = NULL;
    2716              :               else
    2717              :                 {
    2718            1 :                   gfc_error ("Expected argument list at %C");
    2719            1 :                   return MATCH_ERROR;
    2720              :                 }
    2721              :             }
    2722              : 
    2723       151009 :           break;
    2724              :         }
    2725              : 
    2726       171672 :       previous = component;
    2727              : 
    2728       171672 :       if (!inquiry && !intrinsic)
    2729       169958 :         component = gfc_find_component (sym, name, false, false, &tmp);
    2730              :       else
    2731              :         component = NULL;
    2732              : 
    2733       171672 :       if (previous && inquiry
    2734          415 :           && (previous->attr.pdt_kind || previous->attr.pdt_len))
    2735              :         {
    2736            4 :           gfc_error_now ("R901: A type parameter ref is not a designator and "
    2737              :                      "cannot be followed by the type inquiry ref at %C");
    2738            4 :           return MATCH_ERROR;
    2739              :         }
    2740              : 
    2741       171668 :       if (intrinsic && !inquiry)
    2742              :         {
    2743            3 :           if (previous)
    2744            2 :             gfc_error ("%qs at %C is not an inquiry reference to an intrinsic "
    2745              :                         "type component %qs", name, previous->name);
    2746              :           else
    2747            1 :             gfc_error ("%qs at %C is not an inquiry reference to an intrinsic "
    2748              :                         "type component", name);
    2749            3 :           return MATCH_ERROR;
    2750              :         }
    2751       171665 :       else if (component == NULL && !inquiry)
    2752              :         return MATCH_ERROR;
    2753              : 
    2754              :       /* Extend the reference chain determined by gfc_find_component or
    2755              :          is_inquiry_ref.  */
    2756       171618 :       if (primary->ref == NULL)
    2757       102099 :         primary->ref = tmp;
    2758              :       else
    2759              :         {
    2760              :           /* Find end of reference chain if inquiry reference and tail not
    2761              :              set.  */
    2762        69519 :           if (tail == NULL && inquiry && tmp)
    2763           11 :             tail = extend_ref (primary, tail);
    2764              : 
    2765              :           /* Set by the for loop below for the last component ref.  */
    2766        69519 :           gcc_assert (tail != NULL);
    2767        69519 :           tail->next = tmp;
    2768              :         }
    2769              : 
    2770              :       /* The reference chain may be longer than one hop for union
    2771              :          subcomponents; find the new tail.  */
    2772       173594 :       for (tail = tmp; tail->next; tail = tail->next)
    2773              :         ;
    2774              : 
    2775       171618 :       if (tmp && tmp->type == REF_INQUIRY)
    2776              :         {
    2777         1707 :           if (!primary->where.u.lb || !primary->where.nextc)
    2778         1523 :             primary->where = gfc_current_locus;
    2779         1707 :           gfc_simplify_expr (primary, 0);
    2780              : 
    2781         1707 :           if (primary->expr_type == EXPR_CONSTANT)
    2782          354 :             goto check_done;
    2783              : 
    2784         1353 :           if (primary->ref == NULL)
    2785           60 :             goto check_done;
    2786              : 
    2787         1293 :           switch (tmp->u.i)
    2788              :             {
    2789         1082 :             case INQUIRY_RE:
    2790         1082 :             case INQUIRY_IM:
    2791         1082 :               if (!gfc_notify_std (GFC_STD_F2008, "RE or IM part_ref at %C"))
    2792              :                 return MATCH_ERROR;
    2793              : 
    2794         1082 :               if (primary->ts.type != BT_COMPLEX)
    2795              :                 {
    2796            0 :                   gfc_error ("The RE or IM part_ref at %C must be "
    2797              :                              "applied to a COMPLEX expression");
    2798            0 :                   return MATCH_ERROR;
    2799              :                 }
    2800         1082 :               primary->ts.type = BT_REAL;
    2801         1082 :               break;
    2802              : 
    2803          159 :             case INQUIRY_LEN:
    2804          159 :               if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
    2805              :                 return MATCH_ERROR;
    2806              : 
    2807          159 :               if (primary->ts.type != BT_CHARACTER)
    2808              :                 {
    2809            0 :                   gfc_error ("The LEN part_ref at %C must be applied "
    2810              :                              "to a CHARACTER expression");
    2811            0 :                   return MATCH_ERROR;
    2812              :                 }
    2813          159 :               primary->ts.u.cl = NULL;
    2814          159 :               primary->ts.type = BT_INTEGER;
    2815          159 :               primary->ts.kind = gfc_default_integer_kind;
    2816          159 :               break;
    2817              : 
    2818           52 :             case INQUIRY_KIND:
    2819           52 :               if (!gfc_notify_std (GFC_STD_F2003, "KIND part_ref at %C"))
    2820              :                 return MATCH_ERROR;
    2821              : 
    2822           52 :               if (primary->ts.type == BT_CLASS
    2823           52 :                   || primary->ts.type == BT_DERIVED)
    2824              :                 {
    2825            0 :                   gfc_error ("The KIND part_ref at %C must be applied "
    2826              :                              "to an expression of intrinsic type");
    2827            0 :                   return MATCH_ERROR;
    2828              :                 }
    2829           52 :               primary->ts.type = BT_INTEGER;
    2830           52 :               primary->ts.kind = gfc_default_integer_kind;
    2831           52 :               break;
    2832              : 
    2833            0 :             default:
    2834            0 :               gcc_unreachable ();
    2835              :             }
    2836              : 
    2837         1293 :           goto check_done;
    2838              :         }
    2839              : 
    2840       169911 :       primary->ts = component->ts;
    2841              : 
    2842       169911 :       if (component->attr.proc_pointer && ppc_arg)
    2843              :         {
    2844              :           /* Procedure pointer component call: Look for argument list.  */
    2845         1092 :           m = gfc_match_actual_arglist (sub_flag,
    2846              :                                         &primary->value.compcall.actual);
    2847         1092 :           if (m == MATCH_ERROR)
    2848              :             return MATCH_ERROR;
    2849              : 
    2850         1092 :           if (m == MATCH_NO && !gfc_matching_ptr_assignment
    2851          271 :               && !gfc_matching_procptr_assignment && !matching_actual_arglist)
    2852              :             {
    2853            2 :               gfc_error ("Procedure pointer component %qs requires an "
    2854              :                          "argument list at %C", component->name);
    2855            2 :               return MATCH_ERROR;
    2856              :             }
    2857              : 
    2858         1090 :           if (m == MATCH_YES)
    2859          820 :             primary->expr_type = EXPR_PPC;
    2860              : 
    2861              :           break;
    2862              :         }
    2863              : 
    2864       168819 :       if (component->as != NULL && !component->attr.proc_pointer)
    2865              :         {
    2866        60990 :           tail = extend_ref (primary, tail);
    2867        60990 :           tail->type = REF_ARRAY;
    2868              : 
    2869       121980 :           m = gfc_match_array_ref (&tail->u.ar, component->as, equiv_flag,
    2870        60990 :                           component->as->corank);
    2871        60990 :           if (m != MATCH_YES)
    2872              :             return m;
    2873              :         }
    2874       107829 :       else if (component->ts.type == BT_CLASS && component->attr.class_ok
    2875        10649 :                && CLASS_DATA (component)->as && !component->attr.proc_pointer)
    2876              :         {
    2877         5066 :           tail = extend_ref (primary, tail);
    2878         5066 :           tail->type = REF_ARRAY;
    2879              : 
    2880        10132 :           m = gfc_match_array_ref (&tail->u.ar, CLASS_DATA (component)->as,
    2881              :                                    equiv_flag,
    2882         5066 :                                    CLASS_DATA (component)->as->corank);
    2883         5066 :           if (m != MATCH_YES)
    2884              :             return m;
    2885              :         }
    2886              : 
    2887       102763 : check_done:
    2888              :       /* In principle, we could have eg. expr%re%kind so we must allow for
    2889              :          this possibility.  */
    2890       170526 :       if (gfc_match_char ('%') == MATCH_YES)
    2891              :         {
    2892        24281 :           if (component && (component->ts.type == BT_DERIVED
    2893         3298 :                             || component->ts.type == BT_CLASS))
    2894        23806 :             sym = component->ts.u.derived;
    2895        24281 :           continue;
    2896              :         }
    2897       146245 :       else if (inquiry)
    2898              :         break;
    2899              : 
    2900       134757 :       if ((component->ts.type != BT_DERIVED && component->ts.type != BT_CLASS)
    2901       152364 :           || gfc_match_member_sep (component->ts.u.derived) != MATCH_YES)
    2902              :         break;
    2903              : 
    2904          370 :       if (component->ts.type == BT_DERIVED || component->ts.type == BT_CLASS)
    2905          370 :         sym = component->ts.u.derived;
    2906              :     }
    2907              : 
    2908      5047507 : check_substring:
    2909      5047507 :   unknown = false;
    2910      5047507 :   if (primary->ts.type == BT_UNKNOWN && !gfc_fl_struct (sym->attr.flavor))
    2911              :     {
    2912      2664499 :       if (gfc_get_default_type (sym->name, sym->ns)->type == BT_CHARACTER)
    2913              :        {
    2914          352 :          gfc_set_default_type (sym, 0, sym->ns);
    2915          352 :          primary->ts = sym->ts;
    2916          352 :          unknown = true;
    2917              :        }
    2918              :     }
    2919              : 
    2920      5047507 :   if (primary->ts.type == BT_CHARACTER)
    2921              :     {
    2922       304187 :       bool def = primary->ts.deferred == 1;
    2923       304187 :       switch (match_substring (primary->ts.u.cl, equiv_flag, &substring, def))
    2924              :         {
    2925        13403 :         case MATCH_YES:
    2926        13403 :           if (tail == NULL)
    2927         8227 :             primary->ref = substring;
    2928              :           else
    2929         5176 :             tail->next = substring;
    2930              : 
    2931        13403 :           if (primary->expr_type == EXPR_CONSTANT)
    2932          755 :             primary->expr_type = EXPR_SUBSTRING;
    2933              : 
    2934        13403 :           if (substring)
    2935        13223 :             primary->ts.u.cl = NULL;
    2936              : 
    2937        13403 :           gfc_gobble_whitespace ();
    2938        13403 :           if (gfc_peek_ascii_char () == '(')
    2939              :             {
    2940            5 :               gfc_error_now ("Unexpected array/substring ref at %C");
    2941            5 :               return MATCH_ERROR;
    2942              :             }
    2943              :           break;
    2944              : 
    2945       290784 :         case MATCH_NO:
    2946       290784 :           if (unknown)
    2947              :             {
    2948          351 :               gfc_clear_ts (&primary->ts);
    2949          351 :               gfc_clear_ts (&sym->ts);
    2950              :             }
    2951              :           break;
    2952              : 
    2953              :         case MATCH_ERROR:
    2954              :           return MATCH_ERROR;
    2955              :         }
    2956              :     }
    2957              : 
    2958              :   /* F08:C611.  */
    2959      5047502 :   if (primary->ts.type == BT_DERIVED && primary->ref
    2960        29063 :       && primary->ts.u.derived && primary->ts.u.derived->attr.abstract)
    2961              :     {
    2962            6 :       gfc_error ("Nonpolymorphic reference to abstract type at %C");
    2963            6 :       return MATCH_ERROR;
    2964              :     }
    2965              : 
    2966              :   /* F08:C727.  */
    2967      5047496 :   if (primary->expr_type == EXPR_PPC && gfc_is_coindexed (primary))
    2968              :     {
    2969            3 :       gfc_error ("Coindexed procedure-pointer component at %C");
    2970            3 :       return MATCH_ERROR;
    2971              :     }
    2972              : 
    2973              :   return MATCH_YES;
    2974              : }
    2975              : 
    2976              : 
    2977              : /* Given an expression that is a variable, figure out what the
    2978              :    ultimate variable's type and attribute is, traversing the reference
    2979              :    structures if necessary.
    2980              : 
    2981              :    This subroutine is trickier than it looks.  We start at the base
    2982              :    symbol and store the attribute.  Component references load a
    2983              :    completely new attribute.
    2984              : 
    2985              :    A couple of rules come into play.  Subobjects of targets are always
    2986              :    targets themselves.  If we see a component that goes through a
    2987              :    pointer, then the expression must also be a target, since the
    2988              :    pointer is associated with something (if it isn't core will soon be
    2989              :    dumped).  If we see a full part or section of an array, the
    2990              :    expression is also an array.
    2991              : 
    2992              :    We can have at most one full array reference.  */
    2993              : 
    2994              : symbol_attribute
    2995      5171193 : gfc_variable_attr (gfc_expr *expr, gfc_typespec *ts)
    2996              : {
    2997      5171193 :   int dimension, codimension, pointer, allocatable, target, optional;
    2998      5171193 :   symbol_attribute attr;
    2999      5171193 :   gfc_ref *ref;
    3000      5171193 :   gfc_symbol *sym;
    3001      5171193 :   gfc_component *comp;
    3002      5171193 :   bool has_inquiry_part;
    3003      5171193 :   bool has_substring_ref = false;
    3004              : 
    3005      5171193 :   if (expr->expr_type != EXPR_VARIABLE
    3006        55236 :       && expr->expr_type != EXPR_FUNCTION
    3007            9 :       && !(expr->expr_type == EXPR_NULL && expr->ts.type != BT_UNKNOWN))
    3008            0 :     gfc_internal_error ("gfc_variable_attr(): Expression isn't a variable");
    3009              : 
    3010      5171193 :   sym = expr->symtree->n.sym;
    3011      5171193 :   attr = sym->attr;
    3012              : 
    3013      5171193 :   optional = attr.optional;
    3014      5171193 :   if (sym->ts.type == BT_CLASS && sym->attr.class_ok && sym->ts.u.derived)
    3015              :     {
    3016       169329 :       dimension = CLASS_DATA (sym)->attr.dimension;
    3017       169329 :       codimension = CLASS_DATA (sym)->attr.codimension;
    3018       169329 :       pointer = CLASS_DATA (sym)->attr.class_pointer;
    3019       169329 :       allocatable = CLASS_DATA (sym)->attr.allocatable;
    3020              :     }
    3021              :   else
    3022              :     {
    3023      5001864 :       dimension = attr.dimension;
    3024      5001864 :       codimension = attr.codimension;
    3025      5001864 :       pointer = attr.pointer;
    3026      5001864 :       allocatable = attr.allocatable;
    3027              :     }
    3028              : 
    3029      5171193 :   target = attr.target;
    3030      5171193 :   if (pointer || attr.proc_pointer)
    3031       253538 :     target = 1;
    3032              : 
    3033              :   /* F2018:11.1.3.3: Other attributes of associate names
    3034              :      "The associating entity does not have the ALLOCATABLE or POINTER
    3035              :      attributes; it has the TARGET attribute if and only if the selector is
    3036              :      a variable and has either the TARGET or POINTER attribute."  */
    3037      5171193 :   if (sym->attr.associate_var && sym->assoc && sym->assoc->target)
    3038              :     {
    3039        33620 :       if (sym->assoc->target->expr_type == EXPR_VARIABLE)
    3040              :         {
    3041        30390 :           symbol_attribute tgt_attr;
    3042        30390 :           tgt_attr = gfc_expr_attr (sym->assoc->target);
    3043        39382 :           target = (tgt_attr.pointer || tgt_attr.target);
    3044              :         }
    3045              :       else
    3046              :         target = 0;
    3047              :     }
    3048              : 
    3049      5171193 :   if (ts != NULL && expr->ts.type == BT_UNKNOWN)
    3050        52110 :     *ts = sym->ts;
    3051              : 
    3052              :   /* Catch left-overs from match_actual_arg, where an actual argument of a
    3053              :      procedure is given a temporary ts.type == BT_PROCEDURE.  The fixup is
    3054              :      needed for structure constructors in DATA statements, where a pointer
    3055              :      is associated with a data target, and the argument has not been fully
    3056              :      resolved yet.  Components references are dealt with further below.  */
    3057        52110 :   if (ts != NULL
    3058      1308430 :       && expr->ts.type == BT_PROCEDURE
    3059         3039 :       && expr->ref == NULL
    3060         3039 :       && attr.flavor != FL_PROCEDURE
    3061          107 :       && attr.target)
    3062            1 :     *ts = sym->ts;
    3063              : 
    3064      5171193 :   has_inquiry_part = false;
    3065      7019322 :   for (ref = expr->ref; ref; ref = ref->next)
    3066      1849863 :     if (ref->type == REF_SUBSTRING)
    3067              :       {
    3068              :         has_substring_ref = true;
    3069              :         optional = false;
    3070              :       }
    3071      1831072 :     else if (ref->type == REF_INQUIRY)
    3072              :       {
    3073              :         has_inquiry_part = true;
    3074              :         optional = false;
    3075              :         break;
    3076              :       }
    3077              : 
    3078      7021063 :   for (ref = expr->ref; ref; ref = ref->next)
    3079      1849870 :     switch (ref->type)
    3080              :       {
    3081      1443535 :       case REF_ARRAY:
    3082              : 
    3083      1443535 :         switch (ref->u.ar.type)
    3084              :           {
    3085              :           case AR_FULL:
    3086      1849870 :             dimension = 1;
    3087              :             break;
    3088              : 
    3089       117194 :           case AR_SECTION:
    3090       117194 :             allocatable = pointer = 0;
    3091       117194 :             dimension = 1;
    3092       117194 :             optional = false;
    3093       117194 :             break;
    3094              : 
    3095       330450 :           case AR_ELEMENT:
    3096              :             /* Handle coarrays.  */
    3097       330450 :             if (ref->u.ar.dimen > 0)
    3098      1849870 :               allocatable = pointer = optional = false;
    3099              :             break;
    3100              : 
    3101              :           case AR_UNKNOWN:
    3102              :             /* For standard conforming code, AR_UNKNOWN should not happen.
    3103              :                For nonconforming code, gfortran can end up here.  Treat it
    3104              :                as a no-op.  */
    3105              :             break;
    3106              :           }
    3107              : 
    3108              :         break;
    3109              : 
    3110       385803 :       case REF_COMPONENT:
    3111       385803 :         optional = false;
    3112       385803 :         comp = ref->u.c.component;
    3113       385803 :         attr = comp->attr;
    3114       385803 :         if (ts != NULL && !has_inquiry_part)
    3115              :           {
    3116        86322 :             *ts = comp->ts;
    3117              :             /* Don't set the string length if a substring reference
    3118              :                follows.  */
    3119        86322 :             if (ts->type == BT_CHARACTER && has_substring_ref)
    3120          294 :               ts->u.cl = NULL;
    3121              :           }
    3122              : 
    3123       385803 :         if (comp->ts.type == BT_CLASS)
    3124              :           {
    3125        29358 :             dimension = CLASS_DATA (comp)->attr.dimension;
    3126        29358 :             codimension = CLASS_DATA (comp)->attr.codimension;
    3127        29358 :             pointer = CLASS_DATA (comp)->attr.class_pointer;
    3128        29358 :             allocatable = CLASS_DATA (comp)->attr.allocatable;
    3129              :           }
    3130              :         else
    3131              :           {
    3132       356445 :             dimension = comp->attr.dimension;
    3133       356445 :             codimension = comp->attr.codimension;
    3134       356445 :             if (expr->ts.type == BT_CLASS && strcmp (comp->name, "_data") == 0)
    3135        19311 :               pointer = comp->attr.class_pointer;
    3136              :             else
    3137       337134 :               pointer = comp->attr.pointer;
    3138       356445 :             allocatable = comp->attr.allocatable;
    3139              :           }
    3140       385803 :         if (pointer || attr.proc_pointer)
    3141        70628 :           target = 1;
    3142              : 
    3143              :         break;
    3144              : 
    3145        20532 :       case REF_INQUIRY:
    3146        20532 :       case REF_SUBSTRING:
    3147        20532 :         allocatable = pointer = optional = false;
    3148        20532 :         break;
    3149              :       }
    3150              : 
    3151      5171193 :   attr.dimension = dimension;
    3152      5171193 :   attr.codimension = codimension;
    3153      5171193 :   attr.pointer = pointer;
    3154      5171193 :   attr.allocatable = allocatable;
    3155      5171193 :   attr.target = target;
    3156      5171193 :   attr.save = sym->attr.save;
    3157      5171193 :   attr.optional = optional;
    3158              : 
    3159      5171193 :   return attr;
    3160              : }
    3161              : 
    3162              : 
    3163              : /* Return the attribute from a general expression.  */
    3164              : 
    3165              : symbol_attribute
    3166      4788113 : gfc_expr_attr (gfc_expr *e)
    3167              : {
    3168      4788113 :   symbol_attribute attr;
    3169              : 
    3170      4788113 :   switch (e->expr_type)
    3171              :     {
    3172      3798702 :     case EXPR_VARIABLE:
    3173      3798702 :       attr = gfc_variable_attr (e, NULL);
    3174      3798702 :       break;
    3175              : 
    3176        80086 :     case EXPR_FUNCTION:
    3177        80086 :       gfc_clear_attr (&attr);
    3178              : 
    3179        80086 :       if (e->value.function.esym && e->value.function.esym->result)
    3180              :         {
    3181        24537 :           gfc_symbol *sym = e->value.function.esym->result;
    3182        24537 :           attr = sym->attr;
    3183        24537 :           if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
    3184              :             {
    3185         2203 :               attr.dimension = CLASS_DATA (sym)->attr.dimension;
    3186         2203 :               attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
    3187         2203 :               attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
    3188              :             }
    3189              :         }
    3190        55549 :       else if (e->value.function.isym
    3191        52914 :                && e->value.function.isym->transformational
    3192        22887 :                && e->ts.type == BT_CLASS)
    3193          330 :         attr = CLASS_DATA (e)->attr;
    3194        55219 :       else if (e->symtree)
    3195        55213 :         attr = gfc_variable_attr (e, NULL);
    3196              : 
    3197              :       /* TODO: NULL() returns pointers.  May have to take care of this
    3198              :          here.  */
    3199              : 
    3200              :       break;
    3201              : 
    3202       909325 :     default:
    3203       909325 :       gfc_clear_attr (&attr);
    3204       909325 :       break;
    3205              :     }
    3206              : 
    3207      4788113 :   return attr;
    3208              : }
    3209              : 
    3210              : 
    3211              : /* Given an expression, figure out what the ultimate expression
    3212              :    attribute is.  This routine is similar to gfc_variable_attr with
    3213              :    parts of gfc_expr_attr, but focuses more on the needs of
    3214              :    coarrays.  For coarrays a codimension attribute is kind of
    3215              :    "infectious" being propagated once set and never cleared.
    3216              :    The coarray_comp is only set, when the expression refs a coarray
    3217              :    component.  REFS_COMP is set when present to true only, when this EXPR
    3218              :    refs a (non-_data) component.  To check whether EXPR refs an allocatable
    3219              :    component in a derived type coarray *refs_comp needs to be set and
    3220              :    coarray_comp has to false.  */
    3221              : 
    3222              : static symbol_attribute
    3223        16010 : caf_variable_attr (gfc_expr *expr, bool in_allocate, bool *refs_comp)
    3224              : {
    3225        16010 :   int dimension, codimension, pointer, allocatable, target, coarray_comp;
    3226        16010 :   symbol_attribute attr;
    3227        16010 :   gfc_ref *ref;
    3228        16010 :   gfc_symbol *sym;
    3229        16010 :   gfc_component *comp;
    3230              : 
    3231        16010 :   if (expr->expr_type != EXPR_VARIABLE && expr->expr_type != EXPR_FUNCTION)
    3232            0 :     gfc_internal_error ("gfc_caf_attr(): Expression isn't a variable");
    3233              : 
    3234        16010 :   sym = expr->symtree->n.sym;
    3235        16010 :   gfc_clear_attr (&attr);
    3236              : 
    3237        16010 :   if (refs_comp)
    3238        10829 :     *refs_comp = false;
    3239              : 
    3240        16010 :   if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
    3241              :     {
    3242          410 :       dimension = CLASS_DATA (sym)->attr.dimension;
    3243          410 :       codimension = CLASS_DATA (sym)->attr.codimension;
    3244          410 :       pointer = CLASS_DATA (sym)->attr.class_pointer;
    3245          410 :       allocatable = CLASS_DATA (sym)->attr.allocatable;
    3246          410 :       attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
    3247          410 :       attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived->attr.pointer_comp;
    3248              :     }
    3249              :   else
    3250              :     {
    3251        15600 :       dimension = sym->attr.dimension;
    3252        15600 :       codimension = sym->attr.codimension;
    3253        15600 :       pointer = sym->attr.pointer;
    3254        15600 :       allocatable = sym->attr.allocatable;
    3255        31200 :       attr.alloc_comp = sym->ts.type == BT_DERIVED
    3256        15600 :           ? sym->ts.u.derived->attr.alloc_comp : 0;
    3257        15600 :       attr.pointer_comp = sym->ts.type == BT_DERIVED
    3258        15600 :           ? sym->ts.u.derived->attr.pointer_comp : 0;
    3259              :     }
    3260              : 
    3261        16010 :   target = coarray_comp = 0;
    3262        16010 :   if (pointer || attr.proc_pointer)
    3263          628 :     target = 1;
    3264              : 
    3265        28137 :   for (ref = expr->ref; ref; ref = ref->next)
    3266        12127 :     switch (ref->type)
    3267              :       {
    3268         8434 :       case REF_ARRAY:
    3269              : 
    3270         8434 :         switch (ref->u.ar.type)
    3271              :           {
    3272              :           case AR_FULL:
    3273              :           case AR_SECTION:
    3274              :             dimension = 1;
    3275         8434 :             break;
    3276              : 
    3277         3945 :           case AR_ELEMENT:
    3278              :             /* Handle coarrays.  */
    3279         3945 :             if (ref->u.ar.dimen > 0 && !in_allocate)
    3280         8434 :               allocatable = pointer = 0;
    3281              :             break;
    3282              : 
    3283            0 :           case AR_UNKNOWN:
    3284              :             /* If any of start, end or stride is not integer, there will
    3285              :                already have been an error issued.  */
    3286            0 :             int errors;
    3287            0 :             gfc_get_errors (NULL, &errors);
    3288            0 :             if (errors == 0)
    3289            0 :               gfc_internal_error ("gfc_caf_attr(): Bad array reference");
    3290              :           }
    3291              : 
    3292              :         break;
    3293              : 
    3294         3691 :       case REF_COMPONENT:
    3295         3691 :         comp = ref->u.c.component;
    3296              : 
    3297         3691 :         if (comp->ts.type == BT_CLASS)
    3298              :           {
    3299              :             /* Set coarray_comp only, when this component introduces the
    3300              :                coarray.  */
    3301           13 :             coarray_comp = !codimension && CLASS_DATA (comp)->attr.codimension;
    3302           13 :             codimension |= CLASS_DATA (comp)->attr.codimension;
    3303           13 :             pointer = CLASS_DATA (comp)->attr.class_pointer;
    3304           13 :             allocatable = CLASS_DATA (comp)->attr.allocatable;
    3305              :           }
    3306              :         else
    3307              :           {
    3308              :             /* Set coarray_comp only, when this component introduces the
    3309              :                coarray.  */
    3310         3678 :             coarray_comp = !codimension && comp->attr.codimension;
    3311         3678 :             codimension |= comp->attr.codimension;
    3312         3678 :             pointer = comp->attr.pointer;
    3313         3678 :             allocatable = comp->attr.allocatable;
    3314              :           }
    3315              : 
    3316         3691 :         if (refs_comp && strcmp (comp->name, "_data") != 0
    3317         2179 :             && (ref->next == NULL
    3318         1650 :                 || (ref->next->type == REF_ARRAY && ref->next->next == NULL)))
    3319         1610 :           *refs_comp = true;
    3320              : 
    3321         3691 :         if (pointer || attr.proc_pointer)
    3322          690 :           target = 1;
    3323              : 
    3324              :         break;
    3325              : 
    3326              :       case REF_SUBSTRING:
    3327              :       case REF_INQUIRY:
    3328        12127 :         allocatable = pointer = 0;
    3329              :         break;
    3330              :       }
    3331              : 
    3332        16010 :   attr.dimension = dimension;
    3333        16010 :   attr.codimension = codimension;
    3334        16010 :   attr.pointer = pointer;
    3335        16010 :   attr.allocatable = allocatable;
    3336        16010 :   attr.target = target;
    3337        16010 :   attr.save = sym->attr.save;
    3338        16010 :   attr.coarray_comp = coarray_comp;
    3339              : 
    3340        16010 :   return attr;
    3341              : }
    3342              : 
    3343              : 
    3344              : symbol_attribute
    3345        20000 : gfc_caf_attr (gfc_expr *e, bool in_allocate, bool *refs_comp)
    3346              : {
    3347        20000 :   symbol_attribute attr;
    3348              : 
    3349        20000 :   switch (e->expr_type)
    3350              :     {
    3351        14436 :     case EXPR_VARIABLE:
    3352        14436 :       attr = caf_variable_attr (e, in_allocate, refs_comp);
    3353        14436 :       break;
    3354              : 
    3355         1580 :     case EXPR_FUNCTION:
    3356         1580 :       gfc_clear_attr (&attr);
    3357              : 
    3358         1580 :       if (e->value.function.esym && e->value.function.esym->result)
    3359              :         {
    3360            6 :           gfc_symbol *sym = e->value.function.esym->result;
    3361            6 :           attr = sym->attr;
    3362            6 :           if (sym->ts.type == BT_CLASS)
    3363              :             {
    3364            0 :               attr.dimension = CLASS_DATA (sym)->attr.dimension;
    3365            0 :               attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
    3366            0 :               attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
    3367            0 :               attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
    3368            0 :               attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived
    3369            0 :                   ->attr.pointer_comp;
    3370              :             }
    3371              :         }
    3372         1574 :       else if (e->symtree)
    3373         1574 :         attr = caf_variable_attr (e, in_allocate, refs_comp);
    3374              :       else
    3375            0 :         gfc_clear_attr (&attr);
    3376              :       break;
    3377              : 
    3378         3984 :     default:
    3379         3984 :       gfc_clear_attr (&attr);
    3380         3984 :       break;
    3381              :     }
    3382              : 
    3383        20000 :   return attr;
    3384              : }
    3385              : 
    3386              : 
    3387              : /* Match a structure constructor.  The initial symbol has already been
    3388              :    seen.  */
    3389              : 
    3390              : typedef struct gfc_structure_ctor_component
    3391              : {
    3392              :   char* name;
    3393              :   gfc_expr* val;
    3394              :   locus where;
    3395              :   struct gfc_structure_ctor_component* next;
    3396              : }
    3397              : gfc_structure_ctor_component;
    3398              : 
    3399              : #define gfc_get_structure_ctor_component() XCNEW (gfc_structure_ctor_component)
    3400              : 
    3401              : static void
    3402        10515 : gfc_free_structure_ctor_component (gfc_structure_ctor_component *comp)
    3403              : {
    3404        10515 :   free (comp->name);
    3405        10515 :   gfc_free_expr (comp->val);
    3406        10515 :   free (comp);
    3407        10515 : }
    3408              : 
    3409              : 
    3410              : /* Translate the component list into the actual constructor by sorting it in
    3411              :    the order required; this also checks along the way that each and every
    3412              :    component actually has an initializer and handles default initializers
    3413              :    for components without explicit value given.  */
    3414              : static bool
    3415         7315 : build_actual_constructor (gfc_structure_ctor_component **comp_head,
    3416              :                           gfc_constructor_base *ctor_head, gfc_symbol *sym)
    3417              : {
    3418         7315 :   gfc_structure_ctor_component *comp_iter;
    3419         7315 :   gfc_component *comp;
    3420              : 
    3421        19231 :   for (comp = sym->components; comp; comp = comp->next)
    3422              :     {
    3423        11928 :       gfc_structure_ctor_component **next_ptr;
    3424        11928 :       gfc_expr *value = NULL;
    3425              : 
    3426              :       /* Try to find the initializer for the current component by name.  */
    3427        11928 :       next_ptr = comp_head;
    3428        13101 :       for (comp_iter = *comp_head; comp_iter; comp_iter = comp_iter->next)
    3429              :         {
    3430        11664 :           if (!strcmp (comp_iter->name, comp->name))
    3431              :             break;
    3432         1173 :           next_ptr = &comp_iter->next;
    3433              :         }
    3434              : 
    3435              :       /* If an extension, try building the parent derived type by building
    3436              :          a value expression for the parent derived type and calling self.  */
    3437        11928 :       if (!comp_iter && comp == sym->components && sym->attr.extension)
    3438              :         {
    3439          106 :           value = gfc_get_structure_constructor_expr (comp->ts.type,
    3440              :                                                       comp->ts.kind,
    3441              :                                                       &gfc_current_locus);
    3442          106 :           value->ts = comp->ts;
    3443              : 
    3444          106 :           if (!build_actual_constructor (comp_head,
    3445              :                                          &value->value.constructor,
    3446          106 :                                          comp->ts.u.derived))
    3447              :             {
    3448            0 :               gfc_free_expr (value);
    3449            0 :               return false;
    3450              :             }
    3451              : 
    3452          106 :           gfc_constructor_append_expr (ctor_head, value, NULL);
    3453          106 :           continue;
    3454              :         }
    3455              : 
    3456              :       /* If it was not found, apply NULL expression to set the component as
    3457              :          unallocated. Then try the default initializer if there's any;
    3458              :          otherwise, it's an error unless this is a deferred parameter.  */
    3459         1331 :       if (!comp_iter)
    3460              :         {
    3461              :           /* F2018 7.5.10: If an allocatable component has no corresponding
    3462              :              component-data-source, then that component has an allocation
    3463              :              status of unallocated....  */
    3464         1331 :           if (comp->attr.allocatable
    3465         1196 :               || (comp->ts.type == BT_CLASS
    3466           15 :                   && CLASS_DATA (comp)->attr.allocatable))
    3467              :             {
    3468          144 :               if (!gfc_notify_std (GFC_STD_F2008, "No initializer for "
    3469              :                                    "allocatable component %qs given in the "
    3470              :                                    "structure constructor at %C", comp->name))
    3471              :                 return false;
    3472          144 :               value = gfc_get_null_expr (&gfc_current_locus);
    3473              :             }
    3474              :           /* ....(Preceding sentence) If a component with default
    3475              :              initialization has no corresponding component-data-source, then
    3476              :              the default initialization is applied to that component.  */
    3477         1187 :           else if (comp->initializer)
    3478              :             {
    3479          667 :               if (!gfc_notify_std (GFC_STD_F2003, "Structure constructor "
    3480              :                                    "with missing optional arguments at %C"))
    3481              :                 return false;
    3482          665 :               value = gfc_copy_expr (comp->initializer);
    3483              :             }
    3484              :           /* Do not trap components such as the string length for deferred
    3485              :              length character components.  */
    3486          520 :           else if (!comp->attr.artificial)
    3487              :             {
    3488           10 :               gfc_error ("No initializer for component %qs given in the"
    3489              :                          " structure constructor at %C", comp->name);
    3490           10 :               return false;
    3491              :             }
    3492              :         }
    3493              :       else
    3494        10491 :         value = comp_iter->val;
    3495              : 
    3496              :       /* Add the value to the constructor chain built.  */
    3497        11810 :       gfc_constructor_append_expr (ctor_head, value, NULL);
    3498              : 
    3499              :       /* Remove the entry from the component list.  We don't want the expression
    3500              :          value to be free'd, so set it to NULL.  */
    3501        11810 :       if (comp_iter)
    3502              :         {
    3503        10491 :           *next_ptr = comp_iter->next;
    3504        10491 :           comp_iter->val = NULL;
    3505        10491 :           gfc_free_structure_ctor_component (comp_iter);
    3506              :         }
    3507              :     }
    3508              :   return true;
    3509              : }
    3510              : 
    3511              : 
    3512              : bool
    3513         7224 : gfc_convert_to_structure_constructor (gfc_expr *e, gfc_symbol *sym, gfc_expr **cexpr,
    3514              :                                       gfc_actual_arglist **arglist,
    3515              :                                       bool parent)
    3516              : {
    3517         7224 :   gfc_actual_arglist *actual;
    3518         7224 :   gfc_structure_ctor_component *comp_tail, *comp_head, *comp_iter;
    3519         7224 :   gfc_constructor_base ctor_head = NULL;
    3520         7224 :   gfc_component *comp; /* Is set NULL when named component is first seen */
    3521         7224 :   const char* last_name = NULL;
    3522         7224 :   locus old_locus;
    3523         7224 :   gfc_expr *expr;
    3524              : 
    3525         7224 :   expr = parent ? *cexpr : e;
    3526         7224 :   old_locus = gfc_current_locus;
    3527         7224 :   if (parent)
    3528              :     ; /* gfc_current_locus = *arglist->expr ? ->where;*/
    3529              :   else
    3530         6492 :     gfc_current_locus = expr->where;
    3531              : 
    3532         7224 :   comp_tail = comp_head = NULL;
    3533              : 
    3534         7224 :   if (!parent && sym->attr.abstract)
    3535              :     {
    3536            1 :       gfc_error ("Cannot construct ABSTRACT type %qs at %L",
    3537              :                  sym->name, &expr->where);
    3538            1 :       goto cleanup;
    3539              :     }
    3540              : 
    3541         7223 :   comp = sym->components;
    3542         7223 :   actual = parent ? *arglist : expr->value.function.actual;
    3543        17119 :   for ( ; actual; )
    3544              :     {
    3545        10515 :       gfc_component *this_comp = NULL;
    3546              : 
    3547        10515 :       if (!comp_head)
    3548         6803 :         comp_tail = comp_head = gfc_get_structure_ctor_component ();
    3549              :       else
    3550              :         {
    3551         3712 :           comp_tail->next = gfc_get_structure_ctor_component ();
    3552         3712 :           comp_tail = comp_tail->next;
    3553              :         }
    3554        10515 :       if (actual->name)
    3555              :         {
    3556         1351 :           if (!gfc_notify_std (GFC_STD_F2003, "Structure"
    3557              :                                " constructor with named arguments at %C"))
    3558            1 :             goto cleanup;
    3559              : 
    3560         1350 :           comp_tail->name = xstrdup (actual->name);
    3561         1350 :           last_name = comp_tail->name;
    3562         1350 :           comp = NULL;
    3563              :         }
    3564              :       else
    3565              :         {
    3566              :           /* Components without name are not allowed after the first named
    3567              :              component initializer!  */
    3568         9164 :           if (!comp || comp->attr.artificial)
    3569              :             {
    3570            2 :               if (last_name)
    3571            0 :                 gfc_error ("Component initializer without name after component"
    3572              :                            " named %s at %L", last_name,
    3573            0 :                            actual->expr ? &actual->expr->where
    3574              :                                         : &gfc_current_locus);
    3575              :               else
    3576            2 :                 gfc_error ("Too many components in structure constructor at "
    3577            2 :                            "%L", actual->expr ? &actual->expr->where
    3578              :                                               : &gfc_current_locus);
    3579            2 :               goto cleanup;
    3580              :             }
    3581              : 
    3582         9162 :           comp_tail->name = xstrdup (comp->name);
    3583              :         }
    3584              : 
    3585              :       /* Find the current component in the structure definition and check
    3586              :          its access is not private.  */
    3587        10512 :       if (comp)
    3588         9162 :         this_comp = gfc_find_component (sym, comp->name, false, false, NULL);
    3589              :       else
    3590              :         {
    3591         1350 :           this_comp = gfc_find_component (sym, (const char *)comp_tail->name,
    3592              :                                           false, false, NULL);
    3593         1350 :           comp = NULL; /* Reset needed!  */
    3594              :         }
    3595              : 
    3596              :       /* Here we can check if a component name is given which does not
    3597              :          correspond to any component of the defined structure.  */
    3598        10512 :       if (!this_comp)
    3599            8 :         goto cleanup;
    3600              : 
    3601              :       /* For a constant string constructor, make sure the length is
    3602              :          correct; truncate or fill with blanks if needed.  */
    3603        10504 :       if (this_comp->ts.type == BT_CHARACTER && !this_comp->attr.allocatable
    3604         1113 :           && this_comp->ts.u.cl && this_comp->ts.u.cl->length
    3605         1111 :           && this_comp->ts.u.cl->length->expr_type == EXPR_CONSTANT
    3606         1093 :           && this_comp->ts.u.cl->length->ts.type == BT_INTEGER
    3607         1092 :           && actual->expr
    3608         1088 :           && actual->expr->ts.type == BT_CHARACTER
    3609          970 :           && actual->expr->expr_type == EXPR_CONSTANT)
    3610              :         {
    3611          747 :           ptrdiff_t c, e1;
    3612          747 :           c = gfc_mpz_get_hwi (this_comp->ts.u.cl->length->value.integer);
    3613          747 :           e1 = actual->expr->value.character.length;
    3614              : 
    3615          747 :           if (c != e1)
    3616              :             {
    3617          249 :               ptrdiff_t i, to;
    3618          249 :               gfc_char_t *dest;
    3619          249 :               dest = gfc_get_wide_string (c + 1);
    3620              : 
    3621          249 :               to = e1 < c ? e1 : c;
    3622         4482 :               for (i = 0; i < to; i++)
    3623         4233 :                 dest[i] = actual->expr->value.character.string[i];
    3624              : 
    3625         5812 :               for (i = e1; i < c; i++)
    3626         5563 :                 dest[i] = ' ';
    3627              : 
    3628          249 :               dest[c] = '\0';
    3629          249 :               free (actual->expr->value.character.string);
    3630              : 
    3631          249 :               actual->expr->value.character.length = c;
    3632          249 :               actual->expr->value.character.string = dest;
    3633              : 
    3634          249 :               if (warn_line_truncation && c < e1)
    3635           14 :                 gfc_warning_now (OPT_Wcharacter_truncation,
    3636              :                                  "CHARACTER expression will be truncated "
    3637              :                                  "in constructor (%td/%td) at %L", c,
    3638              :                                  e1, &actual->expr->where);
    3639              :             }
    3640              :         }
    3641              : 
    3642        10504 :       comp_tail->val = actual->expr;
    3643        10504 :       if (actual->expr != NULL)
    3644        10499 :         comp_tail->where = actual->expr->where;
    3645        10504 :       actual->expr = NULL;
    3646              : 
    3647              :       /* Check if this component is already given a value.  */
    3648        16699 :       for (comp_iter = comp_head; comp_iter != comp_tail;
    3649         6195 :            comp_iter = comp_iter->next)
    3650              :         {
    3651         6196 :           gcc_assert (comp_iter);
    3652         6196 :           if (!strcmp (comp_iter->name, comp_tail->name))
    3653              :             {
    3654            1 :               gfc_error ("Component %qs is initialized twice in the structure"
    3655              :                          " constructor at %L", comp_tail->name,
    3656              :                          comp_tail->val ? &comp_tail->where
    3657              :                                         : &gfc_current_locus);
    3658            1 :               goto cleanup;
    3659              :             }
    3660              :         }
    3661              : 
    3662              :       /* F2008, R457/C725, for PURE C1283.  */
    3663           72 :       if (this_comp->attr.pointer && comp_tail->val
    3664        10575 :           && gfc_is_coindexed (comp_tail->val))
    3665              :         {
    3666            2 :           gfc_error ("Coindexed expression to pointer component %qs in "
    3667              :                      "structure constructor at %L", comp_tail->name,
    3668              :                      &comp_tail->where);
    3669            2 :           goto cleanup;
    3670              :         }
    3671              : 
    3672              :           /* If not explicitly a parent constructor, gather up the components
    3673              :              and build one.  */
    3674        10501 :           if (comp && comp == sym->components
    3675         6357 :               && sym->attr.extension
    3676          780 :               && comp_tail->val
    3677          780 :               && (!gfc_bt_struct (comp_tail->val->ts.type)
    3678           78 :                   || comp_tail->val->ts.u.derived != this_comp->ts.u.derived))
    3679              :             {
    3680          732 :               bool m;
    3681          732 :               gfc_actual_arglist *arg_null = NULL;
    3682              : 
    3683          732 :               actual->expr = comp_tail->val;
    3684          732 :               comp_tail->val = NULL;
    3685              : #define shorter gfc_convert_to_structure_constructor
    3686          732 :               m = shorter (NULL, comp->ts.u.derived, &comp_tail->val,
    3687          732 :                            comp->ts.u.derived->attr.zero_comp ? &arg_null :
    3688              :                                                                 &actual, true);
    3689              : #undef shorter
    3690              : 
    3691          732 :               if (!m)
    3692            0 :                 goto cleanup;
    3693              : 
    3694          732 :               if (comp->ts.u.derived->attr.zero_comp)
    3695              :                 {
    3696          126 :                   comp = comp->next;
    3697          126 :                   continue;
    3698              :                 }
    3699              :             }
    3700              : 
    3701          606 :       if (comp)
    3702         9028 :         comp = comp->next;
    3703        10375 :       if (parent && !comp)
    3704              :         break;
    3705              : 
    3706         9770 :       if (actual)
    3707         9769 :         actual = actual->next;
    3708              :     }
    3709              : 
    3710         7209 :   if (!build_actual_constructor (&comp_head, &ctor_head, sym))
    3711           12 :     goto cleanup;
    3712              : 
    3713              :   /* No component should be left, as this should have caused an error in the
    3714              :      loop constructing the component-list (name that does not correspond to any
    3715              :      component in the structure definition).  */
    3716         7197 :   if (comp_head && sym->attr.extension)
    3717              :     {
    3718            2 :       for (comp_iter = comp_head; comp_iter; comp_iter = comp_iter->next)
    3719              :         {
    3720            1 :           gfc_error ("component %qs at %L has already been set by a "
    3721              :                      "parent derived type constructor", comp_iter->name,
    3722              :                      &comp_iter->where);
    3723              :         }
    3724            1 :       goto cleanup;
    3725              :     }
    3726              :   else
    3727         7196 :     gcc_assert (!comp_head);
    3728              : 
    3729         7196 :   if (parent)
    3730              :     {
    3731          732 :       expr = gfc_get_structure_constructor_expr (BT_DERIVED, 0, &gfc_current_locus);
    3732          732 :       expr->ts.u.derived = sym;
    3733          732 :       expr->value.constructor = ctor_head;
    3734          732 :       *cexpr = expr;
    3735              :     }
    3736              :   else
    3737              :     {
    3738         6464 :       expr->ts.u.derived = sym;
    3739         6464 :       expr->ts.kind = 0;
    3740         6464 :       expr->ts.type = BT_DERIVED;
    3741         6464 :       expr->value.constructor = ctor_head;
    3742         6464 :       expr->expr_type = EXPR_STRUCTURE;
    3743              :     }
    3744              : 
    3745         7196 :   gfc_current_locus = old_locus;
    3746         7196 :   if (parent)
    3747          732 :     *arglist = actual;
    3748              :   return true;
    3749              : 
    3750           28 :   cleanup:
    3751           28 :   gfc_current_locus = old_locus;
    3752              : 
    3753           52 :   for (comp_iter = comp_head; comp_iter; )
    3754              :     {
    3755           24 :       gfc_structure_ctor_component *next = comp_iter->next;
    3756           24 :       gfc_free_structure_ctor_component (comp_iter);
    3757           24 :       comp_iter = next;
    3758              :     }
    3759           28 :   gfc_constructor_free (ctor_head);
    3760              : 
    3761           28 :   return false;
    3762              : }
    3763              : 
    3764              : 
    3765              : match
    3766           60 : gfc_match_structure_constructor (gfc_symbol *sym, gfc_symtree *symtree,
    3767              :                                  gfc_expr **result)
    3768              : {
    3769           60 :   match m;
    3770           60 :   gfc_expr *e;
    3771           60 :   bool t = true;
    3772              : 
    3773           60 :   e = gfc_get_expr ();
    3774           60 :   e->expr_type = EXPR_FUNCTION;
    3775           60 :   e->symtree = symtree;
    3776           60 :   e->where = gfc_current_locus;
    3777              : 
    3778           60 :   gcc_assert (gfc_fl_struct (sym->attr.flavor)
    3779              :               && symtree->n.sym->attr.flavor == FL_PROCEDURE);
    3780           60 :   e->value.function.esym = sym;
    3781           60 :   e->symtree->n.sym->attr.generic = 1;
    3782              : 
    3783           60 :   m = gfc_match_actual_arglist (0, &e->value.function.actual);
    3784           60 :   if (m != MATCH_YES)
    3785              :     {
    3786            0 :       gfc_free_expr (e);
    3787            0 :       return m;
    3788              :     }
    3789              : 
    3790           60 :   if (!gfc_convert_to_structure_constructor (e, sym, NULL, NULL, false))
    3791              :     {
    3792            1 :       gfc_free_expr (e);
    3793            1 :       return MATCH_ERROR;
    3794              :     }
    3795              : 
    3796              :   /* If a structure constructor is in a DATA statement, then each entity
    3797              :      in the structure constructor must be a constant.  Try to reduce the
    3798              :      expression here.  */
    3799           59 :   if (gfc_in_match_data ())
    3800           59 :     t = gfc_reduce_init_expr (e);
    3801              : 
    3802           59 :   if (t)
    3803              :     {
    3804           49 :       *result = e;
    3805           49 :       return MATCH_YES;
    3806              :     }
    3807              :   else
    3808              :     {
    3809           10 :       gfc_free_expr (e);
    3810           10 :       return MATCH_ERROR;
    3811              :     }
    3812              : }
    3813              : 
    3814              : 
    3815              : /* If the symbol is an implicit do loop index and implicitly typed,
    3816              :    it should not be host associated.  Provide a symtree from the
    3817              :    current namespace.  */
    3818              : static match
    3819      6841145 : check_for_implicit_index (gfc_symtree **st, gfc_symbol **sym)
    3820              : {
    3821      6841145 :   if ((*sym)->attr.flavor == FL_VARIABLE
    3822      1984601 :       && (*sym)->ns != gfc_current_ns
    3823        60253 :       && (*sym)->attr.implied_index
    3824          588 :       && (*sym)->attr.implicit_type
    3825           32 :       && !(*sym)->attr.use_assoc)
    3826              :     {
    3827           32 :       int i;
    3828           32 :       i = gfc_get_sym_tree ((*sym)->name, NULL, st, false);
    3829           32 :       if (i)
    3830              :         return MATCH_ERROR;
    3831           32 :       *sym = (*st)->n.sym;
    3832              :     }
    3833              :   return MATCH_YES;
    3834              : }
    3835              : 
    3836              : 
    3837              : /* Procedure pointer as function result: Replace the function symbol by the
    3838              :    auto-generated hidden result variable named "ppr@".  */
    3839              : 
    3840              : static bool
    3841      5108780 : replace_hidden_procptr_result (gfc_symbol **sym, gfc_symtree **st)
    3842              : {
    3843              :   /* Check for procedure pointer result variable.  */
    3844      5108780 :   if ((*sym)->attr.function && !(*sym)->attr.external
    3845      1395631 :       && (*sym)->result && (*sym)->result != *sym
    3846        10652 :       && (*sym)->result->attr.proc_pointer
    3847          337 :       && (*sym) == gfc_current_ns->proc_name
    3848          285 :       && (*sym) == (*sym)->result->ns->proc_name
    3849          285 :       && strcmp ("ppr@", (*sym)->result->name) == 0)
    3850              :     {
    3851              :       /* Automatic replacement with "hidden" result variable.  */
    3852          285 :       (*sym)->result->attr.referenced = (*sym)->attr.referenced;
    3853          285 :       *sym = (*sym)->result;
    3854          285 :       *st = gfc_find_symtree ((*sym)->ns->sym_root, (*sym)->name);
    3855          285 :       return true;
    3856              :     }
    3857              :   return false;
    3858              : }
    3859              : 
    3860              : 
    3861              : /* Matches a variable name followed by anything that might follow it--
    3862              :    array reference, argument list of a function, etc.  */
    3863              : 
    3864              : match
    3865      4216448 : gfc_match_rvalue (gfc_expr **result)
    3866              : {
    3867      4216448 :   gfc_actual_arglist *actual_arglist;
    3868      4216448 :   char name[GFC_MAX_SYMBOL_LEN + 1], argname[GFC_MAX_SYMBOL_LEN + 1];
    3869      4216448 :   gfc_state_data *st;
    3870      4216448 :   gfc_symbol *sym;
    3871      4216448 :   gfc_symtree *symtree;
    3872      4216448 :   locus where, old_loc;
    3873      4216448 :   gfc_expr *e;
    3874      4216448 :   match m, m2;
    3875      4216448 :   int i;
    3876      4216448 :   gfc_typespec *ts;
    3877      4216448 :   bool implicit_char;
    3878      4216448 :   gfc_ref *ref;
    3879      4216448 :   gfc_symtree *pdt_st;
    3880              : 
    3881      4216448 :   m = gfc_match ("%%loc");
    3882      4216448 :   if (m == MATCH_YES)
    3883              :     {
    3884        10878 :       if (!gfc_notify_std (GFC_STD_LEGACY, "%%LOC() as an rvalue at %C"))
    3885              :         return MATCH_ERROR;
    3886        10877 :       strncpy (name, "loc", 4);
    3887              :     }
    3888              : 
    3889              :   else
    3890              :     {
    3891      4205570 :       m = gfc_match_name (name);
    3892      4205570 :       if (m != MATCH_YES)
    3893              :         return m;
    3894              :     }
    3895              : 
    3896              :   /* Check if the symbol exists.  */
    3897      4013376 :   if (gfc_find_sym_tree (name, NULL, 1, &symtree))
    3898              :     return MATCH_ERROR;
    3899              : 
    3900              :   /* If the symbol doesn't exist, create it unless the name matches a FL_STRUCT
    3901              :      type. For derived types we create a generic symbol which links to the
    3902              :      derived type symbol; STRUCTUREs are simpler and must not conflict with
    3903              :      variables.  */
    3904      4013374 :   if (!symtree)
    3905       177719 :     if (gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree))
    3906              :       return MATCH_ERROR;
    3907      4013374 :   if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
    3908              :     {
    3909      4013374 :       if (gfc_find_state (COMP_INTERFACE)
    3910      4013374 :           && !gfc_current_ns->has_import_set)
    3911        91990 :         i = gfc_get_sym_tree (name, NULL, &symtree, false);
    3912              :       else
    3913      3921384 :         i = gfc_get_ha_sym_tree (name, &symtree);
    3914      4013374 :       if (i)
    3915              :         return MATCH_ERROR;
    3916              :     }
    3917              : 
    3918              : 
    3919      4013374 :   sym = symtree->n.sym;
    3920      4013374 :   e = NULL;
    3921      4013374 :   where = gfc_current_locus;
    3922              : 
    3923      4013374 :   replace_hidden_procptr_result (&sym, &symtree);
    3924              : 
    3925              :   /* If this is an implicit do loop index and implicitly typed,
    3926              :      it should not be host associated.  */
    3927      4013374 :   m = check_for_implicit_index (&symtree, &sym);
    3928      4013374 :   if (m != MATCH_YES)
    3929              :     return m;
    3930              : 
    3931      4013374 :   gfc_set_sym_referenced (sym);
    3932      4013374 :   sym->attr.implied_index = 0;
    3933              : 
    3934      4013374 :   if (sym->attr.function && sym->result == sym)
    3935              :     {
    3936              :       /* See if this is a directly recursive function call.  */
    3937       701611 :       gfc_gobble_whitespace ();
    3938       701611 :       if (sym->attr.recursive
    3939          100 :           && gfc_peek_ascii_char () == '('
    3940           93 :           && gfc_current_ns->proc_name == sym
    3941       701618 :           && !sym->attr.dimension)
    3942              :         {
    3943            4 :           gfc_error ("%qs at %C is the name of a recursive function "
    3944              :                      "and so refers to the result variable. Use an "
    3945              :                      "explicit RESULT variable for direct recursion "
    3946              :                      "(12.5.2.1)", sym->name);
    3947            4 :           return MATCH_ERROR;
    3948              :         }
    3949              : 
    3950       701607 :       if (gfc_is_function_return_value (sym, gfc_current_ns))
    3951         1701 :         goto variable;
    3952              : 
    3953       699906 :       if (sym->attr.entry
    3954          187 :           && (sym->ns == gfc_current_ns
    3955           27 :               || sym->ns == gfc_current_ns->parent))
    3956              :         {
    3957          180 :           gfc_entry_list *el = NULL;
    3958              : 
    3959          180 :           for (el = sym->ns->entries; el; el = el->next)
    3960          180 :             if (sym == el->sym)
    3961          180 :               goto variable;
    3962              :         }
    3963              :     }
    3964              : 
    3965      4011489 :   if (gfc_matching_procptr_assignment)
    3966              :     {
    3967              :       /* It can be a procedure or a derived-type procedure or a not-yet-known
    3968              :          type.  */
    3969         1333 :       if (sym->attr.flavor != FL_UNKNOWN
    3970          991 :           && sym->attr.flavor != FL_PROCEDURE
    3971              :           && sym->attr.flavor != FL_PARAMETER
    3972              :           && sym->attr.flavor != FL_VARIABLE)
    3973              :         {
    3974            2 :           gfc_error ("Symbol at %C is not appropriate for an expression");
    3975            2 :           return MATCH_ERROR;
    3976              :         }
    3977         1331 :       goto procptr0;
    3978              :     }
    3979              : 
    3980      4010156 :   if (sym->attr.function || sym->attr.external || sym->attr.intrinsic)
    3981       714173 :     goto function0;
    3982              : 
    3983      3295983 :   if (sym->attr.generic)
    3984        67880 :     goto generic_function;
    3985              : 
    3986      3228103 :   switch (sym->attr.flavor)
    3987              :     {
    3988      1719318 :     case FL_VARIABLE:
    3989      1719318 :     variable:
    3990      1719318 :       e = gfc_get_expr ();
    3991              : 
    3992      1719318 :       e->expr_type = EXPR_VARIABLE;
    3993      1719318 :       e->symtree = symtree;
    3994              : 
    3995      1719318 :       m = gfc_match_varspec (e, 0, false, true);
    3996      1719318 :       break;
    3997              : 
    3998       218951 :     case FL_PARAMETER:
    3999              :       /* A statement of the form "REAL, parameter :: a(0:10) = 1" will
    4000              :          end up here.  Unfortunately, sym->value->expr_type is set to
    4001              :          EXPR_CONSTANT, and so the if () branch would be followed without
    4002              :          the !sym->as check.  */
    4003       218951 :       if (sym->value && sym->value->expr_type != EXPR_ARRAY && !sym->as)
    4004       184389 :         e = gfc_copy_expr (sym->value);
    4005              :       else
    4006              :         {
    4007        34562 :           e = gfc_get_expr ();
    4008        34562 :           e->expr_type = EXPR_VARIABLE;
    4009              :         }
    4010              : 
    4011       218951 :       e->symtree = symtree;
    4012       218951 :       m = gfc_match_varspec (e, 0, false, true);
    4013              : 
    4014       218951 :       if (sym->ts.is_c_interop || sym->ts.is_iso_c)
    4015              :         break;
    4016              : 
    4017              :       /* Variable array references to derived type parameters cause
    4018              :          all sorts of headaches in simplification. Treating such
    4019              :          expressions as variable works just fine for all array
    4020              :          references.  */
    4021       170588 :       if (sym->value && sym->ts.type == BT_DERIVED && e->ref)
    4022              :         {
    4023         2828 :           for (ref = e->ref; ref; ref = ref->next)
    4024         2642 :             if (ref->type == REF_ARRAY)
    4025              :               break;
    4026              : 
    4027         2597 :           if (ref == NULL || ref->u.ar.type == AR_FULL)
    4028              :             break;
    4029              : 
    4030         1002 :           ref = e->ref;
    4031         1002 :           e->ref = NULL;
    4032         1002 :           gfc_free_expr (e);
    4033         1002 :           e = gfc_get_expr ();
    4034         1002 :           e->expr_type = EXPR_VARIABLE;
    4035         1002 :           e->symtree = symtree;
    4036         1002 :           e->ref = ref;
    4037              :         }
    4038              : 
    4039              :       break;
    4040              : 
    4041            0 :     case FL_STRUCT:
    4042            0 :     case FL_DERIVED:
    4043            0 :       sym = gfc_use_derived (sym);
    4044            0 :       if (sym == NULL)
    4045              :         m = MATCH_ERROR;
    4046              :       else
    4047            0 :         goto generic_function;
    4048              :       break;
    4049              : 
    4050              :     /* If we're here, then the name is known to be the name of a
    4051              :        procedure, yet it is not sure to be the name of a function.  */
    4052      1005474 :     case FL_PROCEDURE:
    4053              : 
    4054              :     /* Procedure Pointer Assignments.  */
    4055      1005474 :     procptr0:
    4056      1005474 :       if (gfc_matching_procptr_assignment)
    4057              :         {
    4058         1331 :           gfc_gobble_whitespace ();
    4059         1331 :           if (!sym->attr.dimension && gfc_peek_ascii_char () == '(')
    4060              :             /* Parse functions returning a procptr.  */
    4061          210 :             goto function0;
    4062              : 
    4063         1121 :           e = gfc_get_expr ();
    4064         1121 :           e->expr_type = EXPR_VARIABLE;
    4065         1121 :           e->symtree = symtree;
    4066         1121 :           m = gfc_match_varspec (e, 0, false, true);
    4067         1053 :           if (!e->ref && sym->attr.flavor == FL_UNKNOWN
    4068          197 :               && sym->ts.type == BT_UNKNOWN
    4069         1308 :               && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL))
    4070              :             {
    4071              :               m = MATCH_ERROR;
    4072              :               break;
    4073              :             }
    4074              :           break;
    4075              :         }
    4076              : 
    4077      1004143 :       if (sym->attr.subroutine)
    4078              :         {
    4079           57 :           gfc_error ("Unexpected use of subroutine name %qs at %C",
    4080              :                      sym->name);
    4081           57 :           m = MATCH_ERROR;
    4082           57 :           break;
    4083              :         }
    4084              : 
    4085              :       /* At this point, the name has to be a non-statement function.
    4086              :          If the name is the same as the current function being
    4087              :          compiled, then we have a variable reference (to the function
    4088              :          result) if the name is non-recursive.  */
    4089              : 
    4090      1004086 :       st = gfc_enclosing_unit (NULL);
    4091              : 
    4092      1004086 :       if (st != NULL
    4093       960072 :           && st->state == COMP_FUNCTION
    4094        83109 :           && st->sym == sym
    4095            0 :           && !sym->attr.recursive)
    4096              :         {
    4097            0 :           e = gfc_get_expr ();
    4098            0 :           e->symtree = symtree;
    4099            0 :           e->expr_type = EXPR_VARIABLE;
    4100              : 
    4101            0 :           m = gfc_match_varspec (e, 0, false, true);
    4102            0 :           break;
    4103              :         }
    4104              : 
    4105              :     /* Match a function reference.  */
    4106      1004086 :     function0:
    4107      1718469 :       m = gfc_match_actual_arglist (0, &actual_arglist);
    4108      1718469 :       if (m == MATCH_NO)
    4109              :         {
    4110       593731 :           if (sym->attr.proc == PROC_ST_FUNCTION)
    4111            1 :             gfc_error ("Statement function %qs requires argument list at %C",
    4112              :                        sym->name);
    4113              :           else
    4114       593730 :             gfc_error ("Function %qs requires an argument list at %C",
    4115              :                        sym->name);
    4116              : 
    4117              :           m = MATCH_ERROR;
    4118              :           break;
    4119              :         }
    4120              : 
    4121      1124738 :       if (m != MATCH_YES)
    4122              :         {
    4123              :           m = MATCH_ERROR;
    4124              :           break;
    4125              :         }
    4126              : 
    4127              :       /* Check to see if this is a PDT constructor.  The format of these
    4128              :          constructors is rather unusual:
    4129              :                 name [(type_params)](component_values)
    4130              :          where, component_values excludes the type_params. With the present
    4131              :          gfortran representation this is rather awkward because the two are not
    4132              :          distinguished, other than by their attributes.
    4133              : 
    4134              :          Even if 'name' is that of a PDT template, priority has to be given to
    4135              :          specific procedures, other than the constructor, in the generic
    4136              :          interface.  */
    4137              : 
    4138      1092511 :       gfc_gobble_whitespace ();
    4139      1092511 :       gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &pdt_st);
    4140        10925 :       if (sym->attr.generic && pdt_st != NULL
    4141      1101480 :           && !(sym->generic->next && gfc_peek_ascii_char() != '('))
    4142              :         {
    4143         8681 :           gfc_symbol *pdt_sym;
    4144         8681 :           gfc_actual_arglist *ctr_arglist = NULL, *tmp;
    4145         8681 :           gfc_component *c;
    4146              : 
    4147              :           /* Use the template.  */
    4148         8681 :           if (pdt_st->n.sym && pdt_st->n.sym->attr.pdt_template)
    4149              :             {
    4150          986 :               bool type_spec_list = false;
    4151          986 :               pdt_sym = pdt_st->n.sym;
    4152          986 :               gfc_gobble_whitespace ();
    4153              :               /* Look for a second actual arglist. If present, try the first
    4154              :                  for the type parameters. Otherwise, or if there is no match,
    4155              :                  depend on default values by setting the type parameters to
    4156              :                  NULL.  */
    4157          986 :               if (gfc_peek_ascii_char() == '(')
    4158          213 :                 type_spec_list = true;
    4159          986 :               if (!actual_arglist && !type_spec_list)
    4160              :                 {
    4161            3 :                   gfc_error_now ("F2023 R755: The empty type specification at %C "
    4162              :                                  "is not allowed");
    4163            3 :                   m = MATCH_ERROR;
    4164            3 :                   break;
    4165              :                 }
    4166              :               /* Generate this instance using the type parameters from the
    4167              :                  first argument list and return the parameter list in
    4168              :                  ctr_arglist.  */
    4169          983 :               m = gfc_get_pdt_instance (actual_arglist, &pdt_sym, &ctr_arglist);
    4170          983 :               if (m != MATCH_YES || !ctr_arglist)
    4171              :                 {
    4172           43 :                   if (ctr_arglist)
    4173            0 :                     gfc_free_actual_arglist (ctr_arglist);
    4174              :                   /* See if all the type parameters have default values.  */
    4175           43 :                   m = gfc_get_pdt_instance (NULL, &pdt_sym, &ctr_arglist);
    4176           43 :                   if (m != MATCH_YES)
    4177              :                     {
    4178              :                       m = MATCH_NO;
    4179              :                       break;
    4180              :                     }
    4181              :                 }
    4182              : 
    4183              :               /* Now match the component_values if the type parameters were
    4184              :                  present.  */
    4185          974 :               if (type_spec_list)
    4186              :                 {
    4187          213 :                   m = gfc_match_actual_arglist (0, &actual_arglist);
    4188          213 :                   if (m != MATCH_YES)
    4189              :                     {
    4190              :                       m = MATCH_ERROR;
    4191              :                       break;
    4192              :                     }
    4193              :                 }
    4194              : 
    4195              :               /* Make sure that the component names are in place so that this
    4196              :                  list can be safely appended to the type parameters.  */
    4197          974 :               tmp = actual_arglist;
    4198         3269 :               for (c = pdt_sym->components; c && tmp; c = c->next)
    4199              :                 {
    4200         2295 :                   if (c->attr.pdt_kind || c->attr.pdt_len)
    4201         1223 :                     continue;
    4202         1072 :                   tmp->name = c->name;
    4203         1072 :                   tmp = tmp->next;
    4204              :                 }
    4205              : 
    4206          974 :               gfc_find_sym_tree (gfc_dt_lower_string (pdt_sym->name),
    4207              :                                  NULL, 1, &symtree);
    4208          974 :               if (!symtree)
    4209              :                 {
    4210          435 :                   gfc_get_ha_sym_tree (gfc_dt_lower_string (pdt_sym->name) ,
    4211              :                                        &symtree);
    4212          435 :                   symtree->n.sym = pdt_sym;
    4213          435 :                   symtree->n.sym->ts.u.derived = pdt_sym;
    4214          435 :                   symtree->n.sym->ts.type = BT_DERIVED;
    4215              :                 }
    4216              : 
    4217          974 :               if (type_spec_list)
    4218              :                 {
    4219              :                   /* Append the type_params and the component_values.  */
    4220          239 :                   for (tmp = ctr_arglist; tmp && tmp->next;)
    4221              :                     tmp = tmp->next;
    4222          213 :                   tmp->next = actual_arglist;
    4223          213 :                   actual_arglist = ctr_arglist;
    4224          213 :                   tmp = actual_arglist;
    4225              :                   /* Can now add all the component names.  */
    4226          697 :                   for (c = pdt_sym->components; c && tmp; c = c->next)
    4227              :                     {
    4228          484 :                       tmp->name = c->name;
    4229          484 :                       tmp = tmp->next;
    4230              :                     }
    4231              :                 }
    4232              :             }
    4233              :         }
    4234              : 
    4235      1092499 :       gfc_get_ha_sym_tree (name, &symtree); /* Can't fail */
    4236      1092499 :       sym = symtree->n.sym;
    4237              : 
    4238      1092499 :       replace_hidden_procptr_result (&sym, &symtree);
    4239              : 
    4240      1092499 :       e = gfc_get_expr ();
    4241      1092499 :       e->symtree = symtree;
    4242      1092499 :       e->expr_type = EXPR_FUNCTION;
    4243      1092499 :       e->value.function.actual = actual_arglist;
    4244      1092499 :       e->where = gfc_current_locus;
    4245              : 
    4246      1092499 :       if (sym->ts.type == BT_CLASS && sym->attr.class_ok
    4247          206 :           && CLASS_DATA (sym)->as)
    4248              :         {
    4249           91 :           e->rank = CLASS_DATA (sym)->as->rank;
    4250           91 :           e->corank = CLASS_DATA (sym)->as->corank;
    4251              :         }
    4252      1092408 :       else if (sym->as != NULL)
    4253              :         {
    4254         1157 :           e->rank = sym->as->rank;
    4255         1157 :           e->corank = sym->as->corank;
    4256              :         }
    4257              : 
    4258      1092499 :       if (!sym->attr.function
    4259      1092499 :           && !gfc_add_function (&sym->attr, sym->name, NULL))
    4260              :         {
    4261              :           m = MATCH_ERROR;
    4262              :           break;
    4263              :         }
    4264              : 
    4265              :       /* Check here for the existence of at least one argument for the
    4266              :          iso_c_binding functions C_LOC, C_FUNLOC, and C_ASSOCIATED.  */
    4267      1092499 :       if (sym->attr.is_iso_c == 1
    4268            2 :           && (sym->from_intmod == INTMOD_ISO_C_BINDING
    4269            2 :               && (sym->intmod_sym_id == ISOCBINDING_LOC
    4270            2 :                   || sym->intmod_sym_id == ISOCBINDING_F_C_STRING
    4271            2 :                   || sym->intmod_sym_id == ISOCBINDING_FUNLOC
    4272            2 :                   || sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)))
    4273              :         {
    4274              :           /* make sure we were given a param */
    4275            0 :           if (actual_arglist == NULL)
    4276              :             {
    4277            0 :               gfc_error ("Missing argument to %qs at %C", sym->name);
    4278            0 :               m = MATCH_ERROR;
    4279            0 :               break;
    4280              :             }
    4281              :         }
    4282              : 
    4283      1092499 :       if (sym->result == NULL)
    4284       386083 :         sym->result = sym;
    4285              : 
    4286      1092499 :       gfc_gobble_whitespace ();
    4287              :       /* F08:C612.  */
    4288      1092499 :       if (gfc_peek_ascii_char() == '%')
    4289              :         {
    4290           12 :           gfc_error ("The leftmost part-ref in a data-ref cannot be a "
    4291              :                      "function reference at %C");
    4292           12 :           m = MATCH_ERROR;
    4293           12 :           break;
    4294              :         }
    4295              : 
    4296              :       m = MATCH_YES;
    4297              :       break;
    4298              : 
    4299       286046 :     case FL_UNKNOWN:
    4300              : 
    4301              :       /* Special case for derived type variables that get their types
    4302              :          via an IMPLICIT statement.  This can't wait for the
    4303              :          resolution phase.  */
    4304              : 
    4305       286046 :       old_loc = gfc_current_locus;
    4306       286046 :       if (gfc_match_member_sep (sym) == MATCH_YES
    4307        10226 :           && sym->ts.type == BT_UNKNOWN
    4308       286052 :           && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
    4309            0 :         gfc_set_default_type (sym, 0, sym->ns);
    4310       286046 :       gfc_current_locus = old_loc;
    4311              : 
    4312              :       /* If the symbol has a (co)dimension attribute, the expression is a
    4313              :          variable.  */
    4314              : 
    4315       286046 :       if (sym->attr.dimension || sym->attr.codimension)
    4316              :         {
    4317        35284 :           if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
    4318              :             {
    4319              :               m = MATCH_ERROR;
    4320              :               break;
    4321              :             }
    4322              : 
    4323        35284 :           e = gfc_get_expr ();
    4324        35284 :           e->symtree = symtree;
    4325        35284 :           e->expr_type = EXPR_VARIABLE;
    4326        35284 :           m = gfc_match_varspec (e, 0, false, true);
    4327        35284 :           break;
    4328              :         }
    4329              : 
    4330       250762 :       if (sym->ts.type == BT_CLASS && sym->attr.class_ok
    4331         4791 :           && (CLASS_DATA (sym)->attr.dimension
    4332         3330 :               || CLASS_DATA (sym)->attr.codimension))
    4333              :         {
    4334         1558 :           if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
    4335              :             {
    4336              :               m = MATCH_ERROR;
    4337              :               break;
    4338              :             }
    4339              : 
    4340         1558 :           e = gfc_get_expr ();
    4341         1558 :           e->symtree = symtree;
    4342         1558 :           e->expr_type = EXPR_VARIABLE;
    4343         1558 :           m = gfc_match_varspec (e, 0, false, true);
    4344         1558 :           break;
    4345              :         }
    4346              : 
    4347              :       /* Name is not an array, so we peek to see if a '(' implies a
    4348              :          function call or a substring reference.  Otherwise the
    4349              :          variable is just a scalar.  */
    4350              : 
    4351       249204 :       gfc_gobble_whitespace ();
    4352       249204 :       if (gfc_peek_ascii_char () != '(')
    4353              :         {
    4354              :           /* Assume a scalar variable */
    4355        75995 :           e = gfc_get_expr ();
    4356        75995 :           e->symtree = symtree;
    4357        75995 :           e->expr_type = EXPR_VARIABLE;
    4358              : 
    4359        75995 :           if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
    4360              :             {
    4361              :               m = MATCH_ERROR;
    4362              :               break;
    4363              :             }
    4364              : 
    4365              :           /*FIXME:??? gfc_match_varspec does set this for us: */
    4366        75995 :           e->ts = sym->ts;
    4367        75995 :           m = gfc_match_varspec (e, 0, false, true);
    4368        75995 :           break;
    4369              :         }
    4370              : 
    4371              :       /* See if this is a function reference with a keyword argument
    4372              :          as first argument. We do this because otherwise a spurious
    4373              :          symbol would end up in the symbol table.  */
    4374              : 
    4375       173209 :       old_loc = gfc_current_locus;
    4376       173209 :       m2 = gfc_match (" ( %n =", argname);
    4377       173209 :       gfc_current_locus = old_loc;
    4378              : 
    4379       173209 :       e = gfc_get_expr ();
    4380       173209 :       e->symtree = symtree;
    4381              : 
    4382       173209 :       if (m2 != MATCH_YES)
    4383              :         {
    4384              :           /* Try to figure out whether we're dealing with a character type.
    4385              :              We're peeking ahead here, because we don't want to call
    4386              :              match_substring if we're dealing with an implicitly typed
    4387              :              non-character variable.  */
    4388       172125 :           implicit_char = false;
    4389       172125 :           if (sym->ts.type == BT_UNKNOWN)
    4390              :             {
    4391       167424 :               ts = gfc_get_default_type (sym->name, NULL);
    4392       167424 :               if (ts->type == BT_CHARACTER)
    4393              :                 implicit_char = true;
    4394              :             }
    4395              : 
    4396              :           /* See if this could possibly be a substring reference of a name
    4397              :              that we're not sure is a variable yet.  */
    4398              : 
    4399       172108 :           if ((implicit_char || sym->ts.type == BT_CHARACTER)
    4400         1375 :               && match_substring (sym->ts.u.cl, 0, &e->ref, false) == MATCH_YES)
    4401              :             {
    4402              : 
    4403          911 :               e->expr_type = EXPR_VARIABLE;
    4404              : 
    4405          911 :               if (sym->attr.flavor != FL_VARIABLE
    4406          911 :                   && !gfc_add_flavor (&sym->attr, FL_VARIABLE,
    4407              :                                       sym->name, NULL))
    4408              :                 {
    4409              :                   m = MATCH_ERROR;
    4410              :                   break;
    4411              :                 }
    4412              : 
    4413          911 :               if (sym->ts.type == BT_UNKNOWN
    4414          911 :                   && !gfc_set_default_type (sym, 1, NULL))
    4415              :                 {
    4416              :                   m = MATCH_ERROR;
    4417              :                   break;
    4418              :                 }
    4419              : 
    4420          911 :               e->ts = sym->ts;
    4421          911 :               if (e->ref)
    4422          886 :                 e->ts.u.cl = NULL;
    4423              :               m = MATCH_YES;
    4424              :               break;
    4425              :             }
    4426              :         }
    4427              : 
    4428              :       /* Give up, assume we have a function.  */
    4429              : 
    4430       172298 :       gfc_get_sym_tree (name, NULL, &symtree, false);       /* Can't fail */
    4431       172298 :       sym = symtree->n.sym;
    4432       172298 :       e->expr_type = EXPR_FUNCTION;
    4433              : 
    4434       172298 :       if (!sym->attr.function
    4435       172298 :           && !gfc_add_function (&sym->attr, sym->name, NULL))
    4436              :         {
    4437              :           m = MATCH_ERROR;
    4438              :           break;
    4439              :         }
    4440              : 
    4441       172298 :       sym->result = sym;
    4442              : 
    4443       172298 :       m = gfc_match_actual_arglist (0, &e->value.function.actual);
    4444       172298 :       if (m == MATCH_NO)
    4445            0 :         gfc_error ("Missing argument list in function %qs at %C", sym->name);
    4446              : 
    4447       172298 :       if (m != MATCH_YES)
    4448              :         {
    4449              :           m = MATCH_ERROR;
    4450              :           break;
    4451              :         }
    4452              : 
    4453              :       /* If our new function returns a character, array or structure
    4454              :          type, it might have subsequent references.  */
    4455              : 
    4456       172168 :       m = gfc_match_varspec (e, 0, false, true);
    4457       172168 :       if (m == MATCH_NO)
    4458              :         m = MATCH_YES;
    4459              : 
    4460              :       break;
    4461              : 
    4462        67880 :     generic_function:
    4463              :       /* Look for symbol first; if not found, look for STRUCTURE type symbol
    4464              :          specially. Creates a generic symbol for derived types.  */
    4465        67880 :       gfc_find_sym_tree (name, NULL, 1, &symtree);
    4466        67880 :       if (!symtree)
    4467            0 :         gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree);
    4468        67880 :       if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
    4469        67880 :         gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
    4470              : 
    4471        67880 :       e = gfc_get_expr ();
    4472        67880 :       e->symtree = symtree;
    4473        67880 :       e->expr_type = EXPR_FUNCTION;
    4474              : 
    4475        67880 :       if (gfc_fl_struct (sym->attr.flavor))
    4476              :         {
    4477            0 :           e->value.function.esym = sym;
    4478            0 :           e->symtree->n.sym->attr.generic = 1;
    4479              :         }
    4480              : 
    4481        67880 :       m = gfc_match_actual_arglist (0, &e->value.function.actual);
    4482        67880 :       break;
    4483              : 
    4484              :     case FL_NAMELIST:
    4485              :       m = MATCH_ERROR;
    4486              :       break;
    4487              : 
    4488            5 :     default:
    4489            5 :       gfc_error ("Symbol at %C is not appropriate for an expression");
    4490            5 :       return MATCH_ERROR;
    4491              :     }
    4492              : 
    4493              :   /* Scan for possible inquiry references.  */
    4494           81 :   if (m == MATCH_YES
    4495      3385488 :       && e->expr_type == EXPR_VARIABLE
    4496      4157347 :       && gfc_peek_ascii_char () == '%')
    4497              :       {
    4498           14 :         m = gfc_match_varspec (e, 0, false, false);
    4499           14 :         if (m == MATCH_NO)
    4500              :           m = MATCH_YES;
    4501              :       }
    4502              : 
    4503      4013363 :   if (m == MATCH_YES)
    4504              :     {
    4505      3385488 :       e->where = where;
    4506      3385488 :       *result = e;
    4507              :     }
    4508              :   else
    4509       627875 :     gfc_free_expr (e);
    4510              : 
    4511              :   return m;
    4512              : }
    4513              : 
    4514              : 
    4515              : /* Match a variable, i.e. something that can be assigned to.  This
    4516              :    starts as a symbol, can be a structure component or an array
    4517              :    reference.  It can be a function if the function doesn't have a
    4518              :    separate RESULT variable.  If the symbol has not been previously
    4519              :    seen, we assume it is a variable.
    4520              : 
    4521              :    This function is called by two interface functions:
    4522              :    gfc_match_variable, which has host_flag = 1, and
    4523              :    gfc_match_equiv_variable, with host_flag = 0, to restrict the
    4524              :    match of the symbol to the local scope.  */
    4525              : 
    4526              : static match
    4527      2827797 : match_variable (gfc_expr **result, int equiv_flag, int host_flag)
    4528              : {
    4529      2827797 :   gfc_symbol *sym, *dt_sym;
    4530      2827797 :   gfc_symtree *st;
    4531      2827797 :   gfc_expr *expr;
    4532      2827797 :   locus where, old_loc;
    4533      2827797 :   match m;
    4534              : 
    4535      2827797 :   *result = NULL;
    4536              : 
    4537              :   /* Since nothing has any business being an lvalue in a module
    4538              :      specification block, an interface block or a contains section,
    4539              :      we force the changed_symbols mechanism to work by setting
    4540              :      host_flag to 0. This prevents valid symbols that have the name
    4541              :      of keywords, such as 'end', being turned into variables by
    4542              :      failed matching to assignments for, e.g., END INTERFACE.  */
    4543      2827797 :   if (gfc_current_state () == COMP_MODULE
    4544      2827797 :       || gfc_current_state () == COMP_SUBMODULE
    4545              :       || gfc_current_state () == COMP_INTERFACE
    4546              :       || gfc_current_state () == COMP_CONTAINS)
    4547       194010 :     host_flag = 0;
    4548              : 
    4549      2827797 :   where = gfc_current_locus;
    4550      2827797 :   m = gfc_match_sym_tree (&st, host_flag);
    4551      2827796 :   if (m != MATCH_YES)
    4552              :     return m;
    4553              : 
    4554      2827771 :   sym = st->n.sym;
    4555              : 
    4556              :   /* If this is an implicit do loop index and implicitly typed,
    4557              :      it should not be host associated.  */
    4558      2827771 :   m = check_for_implicit_index (&st, &sym);
    4559      2827771 :   if (m != MATCH_YES)
    4560              :     return m;
    4561              : 
    4562      2827771 :   sym->attr.implied_index = 0;
    4563              : 
    4564      2827771 :   gfc_set_sym_referenced (sym);
    4565              : 
    4566              :   /* STRUCTUREs may share names with variables, but derived types may not.  */
    4567        14338 :   if (sym->attr.flavor == FL_PROCEDURE && sym->generic
    4568      2827837 :       && (dt_sym = gfc_find_dt_in_generic (sym)))
    4569              :     {
    4570            5 :       if (dt_sym->attr.flavor == FL_DERIVED)
    4571            5 :         gfc_error ("Derived type %qs cannot be used as a variable at %C",
    4572              :                    sym->name);
    4573            5 :       return MATCH_ERROR;
    4574              :     }
    4575              : 
    4576      2827766 :   switch (sym->attr.flavor)
    4577              :     {
    4578              :     case FL_VARIABLE:
    4579              :       /* Everything is alright.  */
    4580              :       break;
    4581              : 
    4582      2546150 :     case FL_UNKNOWN:
    4583      2546150 :       {
    4584      2546150 :         sym_flavor flavor = FL_UNKNOWN;
    4585              : 
    4586      2546150 :         gfc_gobble_whitespace ();
    4587              : 
    4588      2546150 :         if (sym->attr.external || sym->attr.procedure
    4589      2546118 :             || sym->attr.function || sym->attr.subroutine)
    4590              :           flavor = FL_PROCEDURE;
    4591              : 
    4592              :         /* If it is not a procedure, is not typed and is host associated,
    4593              :            we cannot give it a flavor yet.  */
    4594      2546118 :         else if (sym->ns == gfc_current_ns->parent
    4595         2799 :                    && sym->ts.type == BT_UNKNOWN)
    4596              :           break;
    4597              : 
    4598              :         /* These are definitive indicators that this is a variable.  */
    4599      3390036 :         else if (gfc_peek_ascii_char () != '(' || sym->ts.type != BT_UNKNOWN
    4600      3372254 :                  || sym->attr.pointer || sym->as != NULL)
    4601              :           flavor = FL_VARIABLE;
    4602              : 
    4603              :         if (flavor != FL_UNKNOWN
    4604      1720618 :             && !gfc_add_flavor (&sym->attr, flavor, sym->name, NULL))
    4605              :           return MATCH_ERROR;
    4606              :       }
    4607              :       break;
    4608              : 
    4609           17 :     case FL_PARAMETER:
    4610           17 :       if (equiv_flag)
    4611              :         {
    4612            0 :           gfc_error ("Named constant at %C in an EQUIVALENCE");
    4613            0 :           return MATCH_ERROR;
    4614              :         }
    4615           17 :       if (gfc_in_match_data())
    4616              :         {
    4617            4 :           gfc_error ("PARAMETER %qs shall not appear in a DATA statement at %C",
    4618              :                       sym->name);
    4619            4 :           return MATCH_ERROR;
    4620              :         }
    4621              :         /* Otherwise this is checked for an error given in the
    4622              :            variable definition context checks.  */
    4623              :       break;
    4624              : 
    4625        14333 :     case FL_PROCEDURE:
    4626              :       /* Check for a nonrecursive function result variable.  */
    4627        14333 :       if (sym->attr.function
    4628        12256 :           && (!sym->attr.external || sym->abr_modproc_decl)
    4629        11859 :           && sym->result == sym
    4630        25839 :           && (gfc_is_function_return_value (sym, gfc_current_ns)
    4631         2201 :               || (sym->attr.entry
    4632          499 :                   && sym->ns == gfc_current_ns)
    4633         1709 :               || (sym->attr.entry
    4634            7 :                   && sym->ns == gfc_current_ns->parent)))
    4635              :         {
    4636              :           /* If a function result is a derived type, then the derived
    4637              :              type may still have to be resolved.  */
    4638              : 
    4639         9804 :           if (sym->ts.type == BT_DERIVED
    4640         9804 :               && gfc_use_derived (sym->ts.u.derived) == NULL)
    4641              :             return MATCH_ERROR;
    4642              :           break;
    4643              :         }
    4644              : 
    4645         4529 :       if (sym->attr.proc_pointer
    4646         4529 :           || replace_hidden_procptr_result (&sym, &st))
    4647              :         break;
    4648              : 
    4649              :       /* Fall through to error */
    4650         2872 :       gcc_fallthrough ();
    4651              : 
    4652         2872 :     default:
    4653         2872 :       gfc_error ("%qs at %C is not a variable", sym->name);
    4654         2872 :       return MATCH_ERROR;
    4655              :     }
    4656              : 
    4657              :   /* Special case for derived type variables that get their types
    4658              :      via an IMPLICIT statement.  This can't wait for the
    4659              :      resolution phase.  */
    4660              : 
    4661      2824886 :     {
    4662      2824886 :       gfc_namespace * implicit_ns;
    4663              : 
    4664      2824886 :       if (gfc_current_ns->proc_name == sym)
    4665              :         implicit_ns = gfc_current_ns;
    4666              :       else
    4667      2815957 :         implicit_ns = sym->ns;
    4668              : 
    4669      2824886 :       old_loc = gfc_current_locus;
    4670      2824886 :       if (gfc_match_member_sep (sym) == MATCH_YES
    4671        21119 :           && sym->ts.type == BT_UNKNOWN
    4672      2824898 :           && gfc_get_default_type (sym->name, implicit_ns)->type == BT_DERIVED)
    4673            3 :         gfc_set_default_type (sym, 0, implicit_ns);
    4674      2824886 :       gfc_current_locus = old_loc;
    4675              :     }
    4676              : 
    4677      2824886 :   expr = gfc_get_expr ();
    4678              : 
    4679      2824886 :   expr->expr_type = EXPR_VARIABLE;
    4680      2824886 :   expr->symtree = st;
    4681      2824886 :   expr->ts = sym->ts;
    4682              : 
    4683              :   /* Now see if we have to do more.  */
    4684      2824886 :   m = gfc_match_varspec (expr, equiv_flag, false, false);
    4685      2824886 :   if (m != MATCH_YES)
    4686              :     {
    4687           83 :       gfc_free_expr (expr);
    4688           83 :       return m;
    4689              :     }
    4690              : 
    4691      2824803 :   expr->where = gfc_get_location_range (NULL, 0, &where, 1, &gfc_current_locus);
    4692      2824803 :   *result = expr;
    4693      2824803 :   return MATCH_YES;
    4694              : }
    4695              : 
    4696              : 
    4697              : match
    4698      2824850 : gfc_match_variable (gfc_expr **result, int equiv_flag)
    4699              : {
    4700      2824850 :   return match_variable (result, equiv_flag, 1);
    4701              : }
    4702              : 
    4703              : 
    4704              : match
    4705         2947 : gfc_match_equiv_variable (gfc_expr **result)
    4706              : {
    4707         2947 :   return match_variable (result, 1, 0);
    4708              : }
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.