LCOV - code coverage report
Current view: top level - gcc/fortran - primary.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 94.1 % 2317 2180
Test Date: 2026-06-20 15:32:29 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       473508 : match_kind_param (int *kind, int *is_iso_c)
      41              : {
      42       473508 :   char name[GFC_MAX_SYMBOL_LEN + 1];
      43       473508 :   gfc_symbol *sym;
      44       473508 :   match m;
      45              : 
      46       473508 :   *is_iso_c = 0;
      47              : 
      48       473508 :   m = gfc_match_small_literal_int (kind, NULL, false);
      49       473508 :   if (m != MATCH_NO)
      50              :     return m;
      51              : 
      52        95026 :   m = gfc_match_name (name, false);
      53        95026 :   if (m != MATCH_YES)
      54              :     return m;
      55              : 
      56        93294 :   if (gfc_find_symbol (name, NULL, 1, &sym))
      57              :     return MATCH_ERROR;
      58              : 
      59        93294 :   if (sym == NULL)
      60              :     return MATCH_NO;
      61              : 
      62        93293 :   *is_iso_c = sym->attr.is_iso_c;
      63              : 
      64        93293 :   if (sym->attr.flavor != FL_PARAMETER)
      65              :     return MATCH_NO;
      66              : 
      67        93293 :   if (sym->value == NULL)
      68              :     return MATCH_NO;
      69              : 
      70        93292 :   if (gfc_extract_int (sym->value, kind))
      71              :     return MATCH_NO;
      72              : 
      73        93292 :   gfc_set_sym_referenced (sym);
      74              : 
      75        93292 :   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      4608150 : get_kind (int *is_iso_c)
      92              : {
      93      4608150 :   int kind;
      94      4608150 :   match m;
      95              : 
      96      4608150 :   *is_iso_c = 0;
      97              : 
      98      4608150 :   if (gfc_match_char ('_', false) != MATCH_YES)
      99              :     return -2;
     100              : 
     101       473508 :   m = match_kind_param (&kind, is_iso_c);
     102       473508 :   if (m == MATCH_NO)
     103         1734 :     gfc_error ("Missing kind-parameter at %C");
     104              : 
     105       473508 :   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     31015808 : gfc_check_digit (char c, int radix)
     114              : {
     115     31015808 :   bool r;
     116              : 
     117     31015808 :   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     30916205 :     case 10:
     128     30916205 :       r = ('0' <= c && c <= '9');
     129     30916205 :       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     31015808 :   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     18121127 : match_digits (int signflag, int radix, char *buffer)
     150              : {
     151     18121127 :   locus old_loc;
     152     18121127 :   int length;
     153     18121127 :   char c;
     154              : 
     155     18121127 :   length = 0;
     156     18121127 :   c = gfc_next_ascii_char ();
     157              : 
     158     18121127 :   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     18121127 :   if (!gfc_check_digit (c, radix))
     168              :     return -1;
     169              : 
     170      8687304 :   length++;
     171      8687304 :   if (buffer != NULL)
     172      4335495 :     *buffer++ = c;
     173              : 
     174     17051594 :   for (;;)
     175              :     {
     176     12869449 :       old_loc = gfc_current_locus;
     177     12869449 :       c = gfc_next_ascii_char ();
     178              : 
     179     12869449 :       if (!gfc_check_digit (c, radix))
     180              :         break;
     181              : 
     182      4182145 :       if (buffer != NULL)
     183      2088801 :         *buffer++ = c;
     184      4182145 :       length++;
     185              :     }
     186              : 
     187      8687304 :   gfc_current_locus = old_loc;
     188              : 
     189      8687304 :   return length;
     190              : }
     191              : 
     192              : /* Convert an integer string to an expression node.  */
     193              : 
     194              : static gfc_expr *
     195      4228232 : convert_integer (const char *buffer, int kind, int radix, locus *where)
     196              : {
     197      4228232 :   gfc_expr *e;
     198      4228232 :   const char *t;
     199              : 
     200      4228232 :   e = gfc_get_constant_expr (BT_INTEGER, kind, where);
     201              :   /* A leading plus is allowed, but not by mpz_set_str.  */
     202      4228232 :   if (buffer[0] == '+')
     203           21 :     t = buffer + 1;
     204              :   else
     205              :     t = buffer;
     206      4228232 :   mpz_set_str (e->value.integer, t, radix);
     207              : 
     208      4228232 :   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       220119 : convert_real (const char *buffer, int kind, locus *where)
     254              : {
     255       220119 :   gfc_expr *e;
     256              : 
     257       220119 :   e = gfc_get_constant_expr (BT_REAL, kind, where);
     258       220119 :   mpfr_set_str (e->value.real, buffer, 10, GFC_RND_MODE);
     259              : 
     260       220119 :   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         6993 : convert_complex (gfc_expr *real, gfc_expr *imag, int kind)
     269              : {
     270         6993 :   gfc_expr *e;
     271              : 
     272         6993 :   e = gfc_get_constant_expr (BT_COMPLEX, kind, &real->where);
     273         6993 :   mpc_set_fr_fr (e->value.complex, real->value.real, imag->value.real,
     274              :                  GFC_MPC_RND_MODE);
     275              : 
     276         6993 :   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     13192478 : match_integer_constant (gfc_expr **result, int signflag)
     285              : {
     286     13192478 :   int length, kind, is_iso_c;
     287     13192478 :   locus old_loc;
     288     13192478 :   char *buffer;
     289     13192478 :   gfc_expr *e;
     290              : 
     291     13192478 :   old_loc = gfc_current_locus;
     292     13192478 :   gfc_gobble_whitespace ();
     293              : 
     294     13192478 :   length = match_digits (signflag, 10, NULL);
     295     13192478 :   gfc_current_locus = old_loc;
     296     13192478 :   if (length == -1)
     297              :     return MATCH_NO;
     298              : 
     299      4229966 :   buffer = (char *) alloca (length + 1);
     300      4229966 :   memset (buffer, '\0', length + 1);
     301              : 
     302      4229966 :   gfc_gobble_whitespace ();
     303              : 
     304      4229966 :   match_digits (signflag, 10, buffer);
     305              : 
     306      4229966 :   kind = get_kind (&is_iso_c);
     307      4229966 :   if (kind == -2)
     308      3922284 :     kind = gfc_default_integer_kind;
     309      4229966 :   if (kind == -1)
     310              :     return MATCH_ERROR;
     311              : 
     312      4228236 :   if (kind == 4 && flag_integer4_kind == 8)
     313            0 :     kind = 8;
     314              : 
     315      4228236 :   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      4228232 :   e = convert_integer (buffer, kind, 10, &gfc_current_locus);
     322      4228232 :   e->ts.is_c_interop = is_iso_c;
     323              : 
     324      4228232 :   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      4218646 :   *result = e;
     334      4218646 :   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      6601657 : match_hollerith_constant (gfc_expr **result)
     407              : {
     408      6601657 :   locus old_loc;
     409      6601657 :   gfc_expr *e = NULL;
     410      6601657 :   int num, pad;
     411      6601657 :   int i;
     412              : 
     413      6601657 :   old_loc = gfc_current_locus;
     414      6601657 :   gfc_gobble_whitespace ();
     415              : 
     416      6601657 :   if (match_integer_constant (&e, 0) == MATCH_YES
     417      6601657 :       && 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      6599021 :   gfc_free_expr (e);
     474      6599021 :   gfc_current_locus = old_loc;
     475      6599021 :   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      6811617 : match_boz_constant (gfc_expr **result)
     491              : {
     492      6811617 :   int radix, length, x_hex;
     493      6811617 :   locus old_loc, start_loc;
     494      6811617 :   char *buffer, post, delim;
     495      6811617 :   gfc_expr *e;
     496              : 
     497      6811617 :   start_loc = old_loc = gfc_current_locus;
     498      6811617 :   gfc_gobble_whitespace ();
     499              : 
     500      6811617 :   x_hex = 0;
     501      6811617 :   switch (post = gfc_next_ascii_char ())
     502              :     {
     503              :     case 'b':
     504              :       radix = 2;
     505              :       post = 0;
     506              :       break;
     507        56821 :     case 'o':
     508        56821 :       radix = 8;
     509        56821 :       post = 0;
     510        56821 :       break;
     511        91102 :     case 'x':
     512        91102 :       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      6524285 :     default:
     526      6524285 :       goto backup;
     527              :     }
     528              : 
     529              :   /* No whitespace allowed here.  */
     530              : 
     531        56821 :   if (post == 0)
     532       287307 :     delim = gfc_next_ascii_char ();
     533              : 
     534       287332 :   if (delim != '\'' && delim != '\"')
     535       283172 :     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      6807457 : backup:
     609      6807457 :   gfc_current_locus = start_loc;
     610      6807457 :   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      6914962 : match_real_constant (gfc_expr **result, int signflag)
     619              : {
     620      6914962 :   int kind, count, seen_dp, seen_digits, is_iso_c, default_exponent;
     621      6914962 :   locus old_loc, temp_loc;
     622      6914962 :   char *p, *buffer, c, exp_char;
     623      6914962 :   gfc_expr *e;
     624      6914962 :   bool negate;
     625              : 
     626      6914962 :   old_loc = gfc_current_locus;
     627      6914962 :   gfc_gobble_whitespace ();
     628              : 
     629      6914962 :   e = NULL;
     630              : 
     631      6914962 :   default_exponent = 0;
     632      6914962 :   count = 0;
     633      6914962 :   seen_dp = 0;
     634      6914962 :   seen_digits = 0;
     635      6914962 :   exp_char = ' ';
     636      6914962 :   negate = false;
     637              : 
     638      6914962 :   c = gfc_next_ascii_char ();
     639      6914962 :   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      3944415 :   for (;; c = gfc_next_ascii_char (), count++)
     650              :     {
     651     10859377 :       if (c == '.')
     652              :         {
     653       280540 :           if (seen_dp)
     654          204 :             goto done;
     655              : 
     656              :           /* Check to see if "." goes with a following operator like
     657              :              ".eq.".  */
     658       280336 :           temp_loc = gfc_current_locus;
     659       280336 :           c = gfc_next_ascii_char ();
     660              : 
     661       280336 :           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       280336 :           if (ISALPHA (c))
     669        67039 :             goto done;          /* Distinguish 1.e9 from 1.eq.2 */
     670              : 
     671       213297 :           gfc_current_locus = temp_loc;
     672       213297 :           seen_dp = 1;
     673       213297 :           continue;
     674              :         }
     675              : 
     676     10578837 :       if (ISDIGIT (c))
     677              :         {
     678      3731118 :           seen_digits = 1;
     679      3731118 :           continue;
     680              :         }
     681              : 
     682      6847719 :       break;
     683              :     }
     684              : 
     685      6847719 :   if (!seen_digits || (c != 'e' && c != 'd' && c != 'q'))
     686      2351090 :     goto done;
     687        38127 :   exp_char = c;
     688              : 
     689              : 
     690        38127 :   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        38127 :   c = gfc_next_ascii_char ();
     703        38127 :   count++;
     704              : 
     705        38127 :   if (c == '+' || c == '-')
     706              :     {                           /* optional sign */
     707         7283 :       c = gfc_next_ascii_char ();
     708         7283 :       count++;
     709              :     }
     710              : 
     711        38127 :   if (!ISDIGIT (c))
     712              :     {
     713              :       /* With -fdec, default exponent to 0 instead of complaining.  */
     714           40 :       if (flag_dec)
     715        38117 :         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        79157 :   while (ISDIGIT (c))
     724              :     {
     725        41040 :       c = gfc_next_ascii_char ();
     726        41040 :       count++;
     727              :     }
     728              : 
     729      6914952 : done:
     730              :   /* Check that we have a numeric constant.  */
     731      6914952 :   if (!seen_digits || (!seen_dp && exp_char == ' '))
     732              :     {
     733      6694829 :       gfc_current_locus = old_loc;
     734      6694829 :       return MATCH_NO;
     735              :     }
     736              : 
     737              :   /* Convert the number.  */
     738       220123 :   gfc_current_locus = old_loc;
     739       220123 :   gfc_gobble_whitespace ();
     740              : 
     741       220123 :   buffer = (char *) alloca (count + default_exponent + 1);
     742       220123 :   memset (buffer, '\0', count + default_exponent + 1);
     743              : 
     744       220123 :   p = buffer;
     745       220123 :   c = gfc_next_ascii_char ();
     746       220123 :   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      1426233 :   for (;;)
     754              :     {
     755       823178 :       if (c == 'd' || c == 'q')
     756        30252 :         *p = 'e';
     757              :       else
     758       792926 :         *p = c;
     759       823178 :       p++;
     760       823178 :       if (--count == 0)
     761              :         break;
     762              : 
     763       603055 :       c = gfc_next_ascii_char ();
     764              :     }
     765       220123 :   if (default_exponent)
     766           30 :     *p++ = '0';
     767              : 
     768       220123 :   kind = get_kind (&is_iso_c);
     769       220123 :   if (kind == -1)
     770            4 :     goto cleanup;
     771              : 
     772       220119 :   if (kind == 4)
     773              :     {
     774        20586 :       if (flag_real4_kind == 8)
     775          192 :         kind = 8;
     776        20586 :       if (flag_real4_kind == 10)
     777          192 :         kind = 10;
     778        20586 :       if (flag_real4_kind == 16)
     779          384 :         kind = 16;
     780              :     }
     781       199533 :   else if (kind == 8)
     782              :     {
     783        27360 :       if (flag_real8_kind == 4)
     784          192 :         kind = 4;
     785        27360 :       if (flag_real8_kind == 10)
     786          192 :         kind = 10;
     787        27360 :       if (flag_real8_kind == 16)
     788          384 :         kind = 16;
     789              :     }
     790              : 
     791       220119 :   switch (exp_char)
     792              :     {
     793        30252 :     case 'd':
     794        30252 :       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        30252 :       kind = gfc_default_double_kind;
     801        30252 :       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       189867 :     default:
     828       189867 :       if (kind == -2)
     829       117549 :         kind = gfc_default_real_kind;
     830              : 
     831       189867 :       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       220119 :   e = convert_real (buffer, kind, &gfc_current_locus);
     839       220119 :   if (negate)
     840         2932 :     mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
     841       220119 :   e->ts.is_c_interop = is_iso_c;
     842              : 
     843       220119 :   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       220118 :   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       220118 :   *result = e;
     915       220118 :   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       616924 : match_substring (gfc_charlen *cl, int init, gfc_ref **result, bool deferred)
     927              : {
     928       616924 :   gfc_expr *start, *end;
     929       616924 :   locus old_loc;
     930       616924 :   gfc_ref *ref;
     931       616924 :   match m;
     932              : 
     933       616924 :   start = NULL;
     934       616924 :   end = NULL;
     935              : 
     936       616924 :   old_loc = gfc_current_locus;
     937              : 
     938       616924 :   m = gfc_match_char ('(');
     939       616924 :   if (m != MATCH_YES)
     940              :     return MATCH_NO;
     941              : 
     942        16919 :   if (gfc_match_char (':') != MATCH_YES)
     943              :     {
     944        16041 :       if (init)
     945            0 :         m = gfc_match_init_expr (&start);
     946              :       else
     947        16041 :         m = gfc_match_expr (&start);
     948              : 
     949        16041 :       if (m != MATCH_YES)
     950              :         {
     951          154 :           m = MATCH_NO;
     952          154 :           goto cleanup;
     953              :         }
     954              : 
     955        15887 :       m = gfc_match_char (':');
     956        15887 :       if (m != MATCH_YES)
     957          460 :         goto cleanup;
     958              :     }
     959              : 
     960        16305 :   if (gfc_match_char (')') != MATCH_YES)
     961              :     {
     962        15376 :       if (init)
     963            0 :         m = gfc_match_init_expr (&end);
     964              :       else
     965        15376 :         m = gfc_match_expr (&end);
     966              : 
     967        15376 :       if (m == MATCH_NO)
     968            2 :         goto syntax;
     969        15374 :       if (m == MATCH_ERROR)
     970            0 :         goto cleanup;
     971              : 
     972        15374 :       m = gfc_match_char (')');
     973        15374 :       if (m == MATCH_NO)
     974            3 :         goto syntax;
     975              :     }
     976              : 
     977              :   /* Optimize away the (:) reference.  */
     978        16300 :   if (start == NULL && end == NULL && !deferred)
     979              :     ref = NULL;
     980              :   else
     981              :     {
     982        16095 :       ref = gfc_get_ref ();
     983              : 
     984        16095 :       ref->type = REF_SUBSTRING;
     985        16095 :       if (start == NULL)
     986          671 :         start = gfc_get_int_expr (gfc_charlen_int_kind, NULL, 1);
     987        16095 :       ref->u.ss.start = start;
     988        16095 :       if (end == NULL && cl)
     989          722 :         end = gfc_copy_expr (cl->length);
     990        16095 :       ref->u.ss.end = end;
     991        16095 :       ref->u.ss.length = cl;
     992              :     }
     993              : 
     994        16300 :   *result = ref;
     995        16300 :   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      4277851 : next_string_char (gfc_char_t delimiter, int *ret)
    1022              : {
    1023      4277851 :   locus old_locus;
    1024      4277851 :   gfc_char_t c;
    1025              : 
    1026      4277851 :   c = gfc_next_char_literal (INSTRING_WARN);
    1027      4277851 :   *ret = 0;
    1028              : 
    1029      4277851 :   if (c == '\n')
    1030              :     {
    1031            4 :       *ret = -2;
    1032            4 :       return 0;
    1033              :     }
    1034              : 
    1035      4277847 :   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      4277847 :   if (c != delimiter)
    1047              :     return c;
    1048              : 
    1049       614800 :   old_locus = gfc_current_locus;
    1050       614800 :   c = gfc_next_char_literal (NONSTRING);
    1051              : 
    1052       614800 :   if (c == delimiter)
    1053              :     return c;
    1054       613982 :   gfc_current_locus = old_locus;
    1055              : 
    1056       613982 :   *ret = -1;
    1057       613982 :   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      4448414 : match_charkind_name (char *name)
    1075              : {
    1076      4448414 :   locus old_loc;
    1077      4448414 :   char c, peek;
    1078      4448414 :   int len;
    1079              : 
    1080      4448414 :   gfc_gobble_whitespace ();
    1081      4448414 :   c = gfc_next_ascii_char ();
    1082      4448414 :   if (!ISALPHA (c))
    1083              :     return MATCH_NO;
    1084              : 
    1085      4041823 :   *name++ = c;
    1086      4041823 :   len = 1;
    1087              : 
    1088     16435175 :   for (;;)
    1089              :     {
    1090     16435175 :       old_loc = gfc_current_locus;
    1091     16435175 :       c = gfc_next_ascii_char ();
    1092              : 
    1093     16435175 :       if (c == '_')
    1094              :         {
    1095       531191 :           peek = gfc_peek_ascii_char ();
    1096              : 
    1097       531191 :           if (peek == '\'' || peek == '\"')
    1098              :             {
    1099          996 :               gfc_current_locus = old_loc;
    1100          996 :               *name = '\0';
    1101          996 :               return MATCH_YES;
    1102              :             }
    1103              :         }
    1104              : 
    1105     16434179 :       if (!ISALNUM (c)
    1106      4571022 :           && c != '_'
    1107      4040827 :           && (c != '$' || !flag_dollar_ok))
    1108              :         break;
    1109              : 
    1110     12393352 :       *name++ = c;
    1111     12393352 :       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      7118602 : match_string_constant (gfc_expr **result)
    1128              : {
    1129      7118602 :   char name[GFC_MAX_SYMBOL_LEN + 1], peek;
    1130      7118602 :   size_t length;
    1131      7118602 :   int kind,save_warn_ampersand, ret;
    1132      7118602 :   locus old_locus, start_locus;
    1133      7118602 :   gfc_symbol *sym;
    1134      7118602 :   gfc_expr *e;
    1135      7118602 :   match m;
    1136      7118602 :   gfc_char_t c, delimiter, *p;
    1137              : 
    1138      7118602 :   old_locus = gfc_current_locus;
    1139              : 
    1140      7118602 :   gfc_gobble_whitespace ();
    1141              : 
    1142      7118602 :   c = gfc_next_char ();
    1143      7118602 :   if (c == '\'' || c == '"')
    1144              :     {
    1145       266561 :       kind = gfc_default_character_kind;
    1146       266561 :       start_locus = gfc_current_locus;
    1147       266561 :       goto got_delim;
    1148              :     }
    1149              : 
    1150      6852041 :   if (gfc_wide_is_digit (c))
    1151              :     {
    1152      2403627 :       kind = 0;
    1153              : 
    1154      5768972 :       while (gfc_wide_is_digit (c))
    1155              :         {
    1156      3378797 :           kind = kind * 10 + c - '0';
    1157      3378797 :           if (kind > 9999999)
    1158        13452 :             goto no_match;
    1159      3365345 :           c = gfc_next_char ();
    1160              :         }
    1161              : 
    1162              :     }
    1163              :   else
    1164              :     {
    1165      4448414 :       gfc_current_locus = old_locus;
    1166              : 
    1167      4448414 :       m = match_charkind_name (name);
    1168      4448414 :       if (m != MATCH_YES)
    1169      4447418 :         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      2391170 :   if (c != '_')
    1181      2201838 :     goto no_match;
    1182              : 
    1183       189332 :   c = gfc_next_char ();
    1184       189332 :   if (c != '\'' && c != '"')
    1185       148883 :     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       307010 :   delimiter = c;
    1209       307010 :   length = 0;
    1210              : 
    1211      3971184 :   for (;;)
    1212              :     {
    1213      2139097 :       c = next_string_char (delimiter, &ret);
    1214      2139097 :       if (ret == -1)
    1215              :         break;
    1216      1832091 :       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      1832087 :       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       307006 :   peek = gfc_peek_ascii_char ();
    1229       307006 :   if (peek == 'b' || peek == 'o' || peek =='z' || peek == 'x')
    1230           25 :     goto no_match;
    1231              : 
    1232       306981 :   e = gfc_get_character_expr (kind, &start_locus, NULL, length);
    1233              : 
    1234       306981 :   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       306981 :   save_warn_ampersand = warn_ampersand;
    1239       306981 :   warn_ampersand = false;
    1240              : 
    1241       306981 :   p = e->value.character.string;
    1242      2138754 :   for (size_t i = 0; i < length; i++)
    1243              :     {
    1244      1831778 :       c = next_string_char (delimiter, &ret);
    1245              : 
    1246      1831778 :       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      1831773 :       *p++ = c;
    1255              :     }
    1256              : 
    1257       306976 :   *p = '\0';    /* TODO: C-style string is for development/debug purposes.  */
    1258       306976 :   warn_ampersand = save_warn_ampersand;
    1259              : 
    1260       306976 :   next_string_char (delimiter, &ret);
    1261       306976 :   if (ret != -1)
    1262            0 :     gfc_internal_error ("match_string_constant(): Delimiter not found");
    1263              : 
    1264       306976 :   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       306976 :   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       306970 :   *result = e;
    1323              : 
    1324       306970 :   return MATCH_YES;
    1325              : 
    1326      6811617 : no_match:
    1327      6811617 :   gfc_current_locus = old_locus;
    1328      6811617 :   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      4442232 : match_logical_constant_string (void)
    1336              : {
    1337      4442232 :   locus orig_loc = gfc_current_locus;
    1338              : 
    1339      4442232 :   gfc_gobble_whitespace ();
    1340      4442232 :   if (gfc_next_ascii_char () == '.')
    1341              :     {
    1342        56690 :       char ch = gfc_next_ascii_char ();
    1343        56690 :       if (ch == 'f')
    1344              :         {
    1345        28923 :           if (gfc_next_ascii_char () == 'a'
    1346        28923 :               && gfc_next_ascii_char () == 'l'
    1347        28923 :               && gfc_next_ascii_char () == 's'
    1348        28923 :               && gfc_next_ascii_char () == 'e'
    1349        57846 :               && gfc_next_ascii_char () == '.')
    1350              :             /* Matched ".false.".  */
    1351              :             return 0;
    1352              :         }
    1353        27767 :       else if (ch == 't')
    1354              :         {
    1355        27766 :           if (gfc_next_ascii_char () == 'r'
    1356        27766 :               && gfc_next_ascii_char () == 'u'
    1357        27766 :               && gfc_next_ascii_char () == 'e'
    1358        55532 :               && gfc_next_ascii_char () == '.')
    1359              :             /* Matched ".true.".  */
    1360              :             return 1;
    1361              :         }
    1362              :     }
    1363      4385543 :   gfc_current_locus = orig_loc;
    1364      4385543 :   return -1;
    1365              : }
    1366              : 
    1367              : /* Match a .true. or .false.  */
    1368              : 
    1369              : static match
    1370      4442232 : match_logical_constant (gfc_expr **result)
    1371              : {
    1372      4442232 :   gfc_expr *e;
    1373      4442232 :   int i, kind, is_iso_c;
    1374              : 
    1375      4442232 :   i = match_logical_constant_string ();
    1376      4442232 :   if (i == -1)
    1377              :     return MATCH_NO;
    1378              : 
    1379        56689 :   kind = get_kind (&is_iso_c);
    1380        56689 :   if (kind == -1)
    1381              :     return MATCH_ERROR;
    1382        56689 :   if (kind == -2)
    1383        56200 :     kind = gfc_default_logical_kind;
    1384              : 
    1385        56689 :   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        56685 :   e = gfc_get_logical_expr (kind, &gfc_current_locus, i);
    1392        56685 :   e->ts.is_c_interop = is_iso_c;
    1393              : 
    1394        56685 :   *result = e;
    1395        56685 :   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       141225 : match_sym_complex_part (gfc_expr **result)
    1404              : {
    1405       141225 :   char name[GFC_MAX_SYMBOL_LEN + 1];
    1406       141225 :   gfc_symbol *sym;
    1407       141225 :   gfc_expr *e;
    1408       141225 :   match m;
    1409              : 
    1410       141225 :   m = gfc_match_name (name);
    1411       141225 :   if (m != MATCH_YES)
    1412              :     return m;
    1413              : 
    1414        39252 :   if (gfc_find_symbol (name, NULL, 1, &sym) || sym == NULL)
    1415              :     return MATCH_NO;
    1416              : 
    1417        36572 :   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        34983 :       char c;
    1423        34983 :       gfc_gobble_whitespace ();
    1424        34983 :       c = gfc_peek_ascii_char ();
    1425        34983 :       if (c == '=' || c == ',')
    1426              :         {
    1427              :           m = MATCH_NO;
    1428              :         }
    1429              :       else
    1430              :         {
    1431        32131 :           gfc_error ("Expected PARAMETER symbol in complex constant at %C");
    1432        32131 :           m = MATCH_ERROR;
    1433              :         }
    1434        34983 :       return m;
    1435              :     }
    1436              : 
    1437         1589 :   if (!sym->value)
    1438            2 :     goto error;
    1439              : 
    1440         1587 :   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         1255 :   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         1081 :   if (!gfc_notify_std (GFC_STD_F2003, "PARAMETER symbol in "
    1453              :                        "complex constant at %C"))
    1454              :     return MATCH_ERROR;
    1455              : 
    1456         1078 :   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         1007 :     case BT_INTEGER:
    1469         1007 :       e = gfc_int2real (sym->value, gfc_default_real_kind);
    1470         1007 :       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         1076 :   *result = e;          /* e is a scalar, real, constant expression.  */
    1482         1076 :   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       141225 : match_complex_part (gfc_expr **result)
    1494              : {
    1495       141225 :   match m;
    1496              : 
    1497       141225 :   m = match_sym_complex_part (result);
    1498       141225 :   if (m != MATCH_NO)
    1499              :     return m;
    1500              : 
    1501       107505 :   m = match_real_constant (result, 1);
    1502       107505 :   if (m != MATCH_NO)
    1503              :     return m;
    1504              : 
    1505        93172 :   return match_integer_constant (result, 1);
    1506              : }
    1507              : 
    1508              : 
    1509              : /* Try to match a complex constant.  */
    1510              : 
    1511              : static match
    1512      7128888 : match_complex_constant (gfc_expr **result)
    1513              : {
    1514      7128888 :   gfc_expr *e, *real, *imag;
    1515      7128888 :   gfc_error_buffer old_error;
    1516      7128888 :   gfc_typespec target;
    1517      7128888 :   locus old_loc;
    1518      7128888 :   int kind;
    1519      7128888 :   match m;
    1520              : 
    1521      7128888 :   old_loc = gfc_current_locus;
    1522      7128888 :   real = imag = e = NULL;
    1523              : 
    1524      7128888 :   m = gfc_match_char ('(');
    1525      7128888 :   if (m != MATCH_YES)
    1526              :     return m;
    1527              : 
    1528       130943 :   gfc_push_error (&old_error);
    1529              : 
    1530       130943 :   m = match_complex_part (&real);
    1531       130943 :   if (m == MATCH_NO)
    1532              :     {
    1533        74847 :       gfc_free_error (&old_error);
    1534        74847 :       goto cleanup;
    1535              :     }
    1536              : 
    1537        56096 :   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        45810 :       gfc_clear_warning ();
    1543        45810 :       gfc_pop_error (&old_error);
    1544        45810 :       m = MATCH_NO;
    1545        45810 :       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        10286 :   if (m == MATCH_ERROR)
    1554              :     {
    1555            4 :       gfc_free_error (&old_error);
    1556            4 :       goto cleanup;
    1557              :     }
    1558        10282 :   gfc_pop_error (&old_error);
    1559              : 
    1560        10282 :   m = match_complex_part (&imag);
    1561        10282 :   if (m == MATCH_NO)
    1562         3123 :     goto syntax;
    1563         7159 :   if (m == MATCH_ERROR)
    1564          153 :     goto cleanup;
    1565              : 
    1566         7006 :   m = gfc_match_char (')');
    1567         7006 :   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         6993 :   if (m == MATCH_ERROR)
    1581            0 :     goto cleanup;
    1582              : 
    1583              :   /* Decide on the kind of this complex number.  */
    1584         6993 :   if (real->ts.type == BT_REAL)
    1585              :     {
    1586         6559 :       if (imag->ts.type == BT_REAL)
    1587         6534 :         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         6993 :   gfc_clear_ts (&target);
    1599         6993 :   target.type = BT_REAL;
    1600         6993 :   target.kind = kind;
    1601              : 
    1602         6993 :   if (real->ts.type != BT_REAL || kind != real->ts.kind)
    1603          435 :     gfc_convert_type (real, &target, 2);
    1604         6993 :   if (imag->ts.type != BT_REAL || kind != imag->ts.kind)
    1605          490 :     gfc_convert_type (imag, &target, 2);
    1606              : 
    1607         6993 :   e = convert_complex (real, imag, kind);
    1608         6993 :   e->where = gfc_current_locus;
    1609              : 
    1610         6993 :   gfc_free_expr (real);
    1611         6993 :   gfc_free_expr (imag);
    1612              : 
    1613         6993 :   *result = e;
    1614         6993 :   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       123950 : cleanup:
    1621       123950 :   gfc_free_expr (e);
    1622       123950 :   gfc_free_expr (real);
    1623       123950 :   gfc_free_expr (imag);
    1624       123950 :   gfc_current_locus = old_loc;
    1625              : 
    1626       123950 :   return m;
    1627      7128888 : }
    1628              : 
    1629              : 
    1630              : /* Match constants in any of several forms.  Returns nonzero for a
    1631              :    match, zero for no match.  */
    1632              : 
    1633              : match
    1634      7128888 : gfc_match_literal_constant (gfc_expr **result, int signflag)
    1635              : {
    1636      7128888 :   match m;
    1637              : 
    1638      7128888 :   m = match_complex_constant (result);
    1639      7128888 :   if (m != MATCH_NO)
    1640              :     return m;
    1641              : 
    1642      7118602 :   m = match_string_constant (result);
    1643      7118602 :   if (m != MATCH_NO)
    1644              :     return m;
    1645              : 
    1646      6811617 :   m = match_boz_constant (result);
    1647      6811617 :   if (m != MATCH_NO)
    1648              :     return m;
    1649              : 
    1650      6807457 :   m = match_real_constant (result, signflag);
    1651      6807457 :   if (m != MATCH_NO)
    1652              :     return m;
    1653              : 
    1654      6601657 :   m = match_hollerith_constant (result);
    1655      6601657 :   if (m != MATCH_NO)
    1656              :     return m;
    1657              : 
    1658      6599021 :   if (flag_unsigned)
    1659              :     {
    1660       588996 :       m = match_unsigned_constant (result);
    1661       588996 :       if (m != MATCH_NO)
    1662              :         return m;
    1663              :     }
    1664              : 
    1665      6497649 :   m = match_integer_constant (result, signflag);
    1666      6497649 :   if (m != MATCH_NO)
    1667              :     return m;
    1668              : 
    1669      4442232 :   m = match_logical_constant (result);
    1670      4442232 :   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       781740 : gfc_is_function_return_value (gfc_symbol *sym, gfc_namespace *ns)
    1683              : {
    1684       781740 :   if (!sym->attr.function || (sym->result != sym))
    1685              :     return false;
    1686      1639107 :   while (ns)
    1687              :     {
    1688       928282 :       if (ns->proc_name == sym)
    1689              :         return true;
    1690       916562 :       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      2019121 : match_actual_arg (gfc_expr **result)
    1705              : {
    1706      2019121 :   char name[GFC_MAX_SYMBOL_LEN + 1];
    1707      2019121 :   gfc_symtree *symtree;
    1708      2019121 :   locus where, w;
    1709      2019121 :   gfc_expr *e;
    1710      2019121 :   char c;
    1711              : 
    1712      2019121 :   gfc_gobble_whitespace ();
    1713      2019121 :   where = gfc_current_locus;
    1714              : 
    1715      2019121 :   switch (gfc_match_name (name))
    1716              :     {
    1717              :     case MATCH_ERROR:
    1718              :       return MATCH_ERROR;
    1719              : 
    1720              :     case MATCH_NO:
    1721              :       break;
    1722              : 
    1723      1319178 :     case MATCH_YES:
    1724      1319178 :       w = gfc_current_locus;
    1725      1319178 :       gfc_gobble_whitespace ();
    1726      1319178 :       c = gfc_next_ascii_char ();
    1727      1319178 :       gfc_current_locus = w;
    1728              : 
    1729      1319178 :       if (c != ',' && c != ')')
    1730              :         break;
    1731              : 
    1732       692591 :       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       692591 :       if (symtree == NULL)
    1739              :         {
    1740        14099 :           gfc_get_sym_tree (name, NULL, &symtree, false);
    1741        14099 :           gfc_set_sym_referenced (symtree->n.sym);
    1742              :         }
    1743              :       else
    1744              :         {
    1745       678492 :           gfc_symbol *sym;
    1746              : 
    1747       678492 :           sym = symtree->n.sym;
    1748       678492 :           gfc_set_sym_referenced (sym);
    1749       678492 :           if (sym->attr.flavor == FL_NAMELIST)
    1750              :             {
    1751         1141 :               gfc_error ("Namelist %qs cannot be an argument at %L",
    1752              :               sym->name, &where);
    1753         1141 :               break;
    1754              :             }
    1755       677351 :           if (sym->attr.flavor != FL_PROCEDURE
    1756       639470 :               && sym->attr.flavor != FL_UNKNOWN)
    1757              :             break;
    1758              : 
    1759       191147 :           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       190923 :           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       204314 :       e = gfc_get_expr ();      /* Leave it unknown for now */
    1791       204314 :       e->symtree = symtree;
    1792       204314 :       e->expr_type = EXPR_VARIABLE;
    1793       204314 :       e->ts.type = BT_PROCEDURE;
    1794       204314 :       e->where = where;
    1795              : 
    1796       204314 :       *result = e;
    1797       204314 :       return MATCH_YES;
    1798              :     }
    1799              : 
    1800      1814807 :   gfc_current_locus = where;
    1801      1814807 :   return gfc_match_expr (result);
    1802              : }
    1803              : 
    1804              : 
    1805              : /* Match a keyword argument or type parameter spec list..  */
    1806              : 
    1807              : static match
    1808      2010933 : match_keyword_arg (gfc_actual_arglist *actual, gfc_actual_arglist *base, bool pdt)
    1809              : {
    1810      2010933 :   char name[GFC_MAX_SYMBOL_LEN + 1];
    1811      2010933 :   gfc_actual_arglist *a;
    1812      2010933 :   locus name_locus;
    1813      2010933 :   match m;
    1814              : 
    1815      2010933 :   name_locus = gfc_current_locus;
    1816      2010933 :   m = gfc_match_name (name);
    1817              : 
    1818      2010933 :   if (m != MATCH_YES)
    1819       590050 :     goto cleanup;
    1820      1420883 :   if (gfc_match_char ('=') != MATCH_YES)
    1821              :     {
    1822      1259913 :       m = MATCH_NO;
    1823      1259913 :       goto cleanup;
    1824              :     }
    1825              : 
    1826       160970 :   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       160829 :   m = match_actual_arg (&actual->expr);
    1843       160829 :   if (m != MATCH_YES)
    1844        11323 :     goto cleanup;
    1845              : 
    1846              :   /* Make sure this name has not appeared yet.  */
    1847       149506 : add_name:
    1848       149647 :   if (name[0] != '\0')
    1849              :     {
    1850       481706 :       for (a = base; a; a = a->next)
    1851       332073 :         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       149633 :   actual->name = gfc_get_string ("%s", name);
    1860       149633 :   return MATCH_YES;
    1861              : 
    1862      1861286 : cleanup:
    1863      1861286 :   gfc_current_locus = name_locus;
    1864      1861286 :   return m;
    1865              : }
    1866              : 
    1867              : 
    1868              : /* Match an argument list function, such as %VAL.  */
    1869              : 
    1870              : static match
    1871      1971941 : match_arg_list_function (gfc_actual_arglist *result)
    1872              : {
    1873      1971941 :   char name[GFC_MAX_SYMBOL_LEN + 1];
    1874      1971941 :   locus old_locus;
    1875      1971941 :   match m;
    1876              : 
    1877      1971941 :   old_locus = gfc_current_locus;
    1878              : 
    1879      1971941 :   if (gfc_match_char ('%') != MATCH_YES)
    1880              :     {
    1881      1971876 :       m = MATCH_NO;
    1882      1971876 :       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      1971877 : cleanup:
    1939      1971877 :   gfc_current_locus = old_locus;
    1940      1971877 :   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      2087972 : gfc_match_actual_arglist (int sub_flag, gfc_actual_arglist **argp, bool pdt)
    1958              : {
    1959      2087972 :   gfc_actual_arglist *head, *tail;
    1960      2087972 :   int seen_keyword;
    1961      2087972 :   gfc_st_label *label;
    1962      2087972 :   locus old_loc;
    1963      2087972 :   match m;
    1964              : 
    1965      2087972 :   *argp = tail = NULL;
    1966      2087972 :   old_loc = gfc_current_locus;
    1967              : 
    1968      2087972 :   seen_keyword = 0;
    1969              : 
    1970      2087972 :   if (gfc_match_char ('(') == MATCH_NO)
    1971      1234866 :     return (sub_flag) ? MATCH_YES : MATCH_NO;
    1972              : 
    1973      1453611 :   if (gfc_match_char (')') == MATCH_YES)
    1974              :     return MATCH_YES;
    1975              : 
    1976      1425770 :   head = NULL;
    1977              : 
    1978      1425770 :   matching_actual_arglist++;
    1979              : 
    1980      2010495 :   for (;;)
    1981              :     {
    1982      2010495 :       if (head == NULL)
    1983      1425770 :         head = tail = gfc_get_actual_arglist ();
    1984              :       else
    1985              :         {
    1986       584725 :           tail->next = gfc_get_actual_arglist ();
    1987       584725 :           tail = tail->next;
    1988              :         }
    1989              : 
    1990      2010495 :       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      2010257 :       if (pdt && !seen_keyword)
    2007              :         {
    2008         1497 :           if (gfc_match_char (':') == MATCH_YES)
    2009              :             {
    2010           84 :               tail->spec_type = SPEC_DEFERRED;
    2011           84 :               goto next;
    2012              :             }
    2013         1413 :           else if (gfc_match_char ('*') == MATCH_YES)
    2014              :             {
    2015          123 :               tail->spec_type = SPEC_ASSUMED;
    2016          123 :               goto next;
    2017              :             }
    2018              :           else
    2019         1290 :             tail->spec_type = SPEC_EXPLICIT;
    2020              : 
    2021         1290 :           m = match_keyword_arg (tail, head, pdt);
    2022         1290 :           if (m == MATCH_YES)
    2023              :             {
    2024          342 :               seen_keyword = 1;
    2025          342 :               goto next;
    2026              :             }
    2027          948 :           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      2009708 :       if (seen_keyword)
    2034              :         {
    2035        37767 :           m = match_keyword_arg (tail, head, pdt);
    2036              : 
    2037        37767 :           if (m == MATCH_ERROR)
    2038           34 :             goto cleanup;
    2039        37733 :           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      1971941 :           m = match_arg_list_function (tail);
    2050      1971941 :           if (m == MATCH_ERROR)
    2051            1 :             goto cleanup;
    2052              : 
    2053              :           /* See if we have the first keyword argument.  */
    2054      1971940 :           if (m == MATCH_NO)
    2055              :             {
    2056      1971876 :               m = match_keyword_arg (tail, head, false);
    2057      1971876 :               if (m == MATCH_YES)
    2058              :                 seen_keyword = 1;
    2059      1858950 :               if (m == MATCH_ERROR)
    2060          722 :                 goto cleanup;
    2061              :             }
    2062              : 
    2063      1971154 :           if (m == MATCH_NO)
    2064              :             {
    2065              :               /* Try for a non-keyword argument.  */
    2066      1858228 :               m = match_actual_arg (&tail->expr);
    2067      1858228 :               if (m == MATCH_ERROR)
    2068         1976 :                 goto cleanup;
    2069      1856252 :               if (m == MATCH_NO)
    2070        19835 :                 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      1985772 :     if (tail->expr
    2078      1985688 :         && tail->expr->expr_type == EXPR_VARIABLE
    2079      3971460 :         && gfc_expr_attr (tail->expr).pdt_kind)
    2080              :       {
    2081          334 :         gfc_ref *ref;
    2082          334 :         gfc_expr *tmp = NULL;
    2083          356 :         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          334 :         if (tmp)
    2089           22 :           gfc_replace_expr (tail->expr, tmp);
    2090              :       }
    2091              : 
    2092      1986559 :     next:
    2093      1986559 :       if (gfc_match_char (')') == MATCH_YES)
    2094              :         break;
    2095       593366 :       if (gfc_match_char (',') != MATCH_YES)
    2096         8641 :         goto syntax;
    2097              :     }
    2098              : 
    2099      1393193 :   *argp = head;
    2100      1393193 :   matching_actual_arglist--;
    2101      1393193 :   return MATCH_YES;
    2102              : 
    2103        28476 : syntax:
    2104        28476 :   gfc_error ("Syntax error in argument list at %C");
    2105              : 
    2106        32577 : cleanup:
    2107        32577 :   gfc_free_actual_arglist (head);
    2108        32577 :   gfc_current_locus = old_loc;
    2109        32577 :   matching_actual_arglist--;
    2110        32577 :   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       741898 : extend_ref (gfc_expr *primary, gfc_ref *tail)
    2119              : {
    2120       741898 :   if (primary->ref == NULL)
    2121       673405 :     primary->ref = tail = gfc_get_ref ();
    2122        68493 :   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        68479 :       tail->next = gfc_get_ref ();
    2135        68479 :       tail = tail->next;
    2136              :     }
    2137              : 
    2138       741898 :   return tail;
    2139              : }
    2140              : 
    2141              : 
    2142              : /* Used by gfc_match_varspec() to match an inquiry reference.  */
    2143              : 
    2144              : bool
    2145         4333 : is_inquiry_ref (const char *name, gfc_ref **ref)
    2146              : {
    2147         4333 :   inquiry_type type;
    2148              : 
    2149         4333 :   if (name == NULL)
    2150              :     return false;
    2151              : 
    2152         4333 :   if (ref) *ref = NULL;
    2153              : 
    2154         4333 :   if (strcmp (name, "re") == 0)
    2155              :     type = INQUIRY_RE;
    2156         2888 :   else if (strcmp (name, "im") == 0)
    2157              :     type = INQUIRY_IM;
    2158         1910 :   else if (strcmp (name, "kind") == 0)
    2159              :     type = INQUIRY_KIND;
    2160         1403 :   else if (strcmp (name, "len") == 0)
    2161              :     type = INQUIRY_LEN;
    2162              :   else
    2163              :     return false;
    2164              : 
    2165         3372 :   if (ref)
    2166              :     {
    2167         1893 :       *ref = gfc_get_ref ();
    2168         1893 :       (*ref)->type = REF_INQUIRY;
    2169         1893 :       (*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      5098777 : gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
    2209              :                    bool ppc_arg)
    2210              : {
    2211      5098777 :   char name[GFC_MAX_SYMBOL_LEN + 1];
    2212      5098777 :   gfc_ref *substring, *tail, *tmp;
    2213      5098777 :   gfc_component *component = NULL;
    2214      5098777 :   gfc_component *previous = NULL;
    2215      5098777 :   gfc_symbol *sym = primary->symtree->n.sym;
    2216      5098777 :   gfc_expr *tgt_expr = NULL;
    2217      5098777 :   match m;
    2218      5098777 :   bool unknown;
    2219      5098777 :   bool inquiry;
    2220      5098777 :   bool intrinsic;
    2221      5098777 :   bool inferred_type;
    2222      5098777 :   locus old_loc;
    2223      5098777 :   char peeked_char;
    2224              : 
    2225      5098777 :   tail = NULL;
    2226              : 
    2227      5098777 :   gfc_gobble_whitespace ();
    2228              : 
    2229      5098777 :   if (gfc_peek_ascii_char () == '[')
    2230              :     {
    2231         3224 :       if ((sym->ts.type != BT_CLASS && sym->attr.dimension)
    2232         3224 :           || (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         3224 :       if ((sym->ts.type != BT_CLASS && !sym->attr.codimension)
    2240         3223 :           || (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      5098776 :   if (sym->assoc && sym->assoc->target)
    2250      5098776 :     tgt_expr = sym->assoc->target;
    2251              : 
    2252      5098776 :   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      5097756 :   if (!inferred_type
    2259      5097756 :       && sym->attr.select_type_temporary
    2260        23488 :       && sym->ns->assoc_name_inferred
    2261          344 :       && !sym->attr.select_rank_temporary)
    2262         1364 :     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         7136 :   if (tgt_expr && !sym->assoc->dangling
    2269         7136 :       && tgt_expr->ts.type == BT_UNKNOWN
    2270         2115 :       && tgt_expr->symtree
    2271         1676 :       && tgt_expr->symtree->n.sym
    2272      5098849 :       && gfc_expr_attr (tgt_expr).generic
    2273      5098849 :       && ((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      5098776 :           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      5098776 :   if (sym->assoc
    2297        30624 :       && gfc_peek_ascii_char () == '('
    2298         9655 :       && sym->ts.type != BT_CLASS
    2299      5108228 :       && !sym->attr.dimension)
    2300              :     {
    2301          410 :       gfc_ref *ref = NULL;
    2302              : 
    2303          410 :       if (!sym->assoc->dangling && tgt_expr)
    2304              :         {
    2305          350 :            if (tgt_expr->expr_type == EXPR_VARIABLE)
    2306           21 :              gfc_resolve_expr (tgt_expr);
    2307              : 
    2308          350 :            ref = tgt_expr->ref;
    2309          364 :            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          410 :       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      5098366 :   else if (sym->ts.type == BT_CLASS
    2330        44792 :            && !(sym->assoc && sym->assoc->ar)
    2331        44720 :            && tgt_expr
    2332          272 :            && tgt_expr->expr_type == EXPR_VARIABLE
    2333          146 :            && 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      5098776 :   peeked_char = gfc_peek_ascii_char ();
    2341         1364 :   if ((inferred_type && !sym->as && peeked_char == '(')
    2342      5098555 :       || (equiv_flag && peeked_char == '(') || peeked_char == '['
    2343      5093761 :       || sym->attr.codimension
    2344      5076176 :       || (sym->attr.dimension && sym->ts.type != BT_CLASS
    2345       632967 :           && !sym->attr.proc_pointer && !gfc_is_proc_ptr_comp (primary)
    2346       632952 :           && !(gfc_matching_procptr_assignment
    2347           38 :                && sym->attr.flavor == FL_PROCEDURE))
    2348      9542026 :       || (sym->ts.type == BT_CLASS && sym->attr.class_ok
    2349        44609 :           && sym->ts.u.derived && CLASS_DATA (sym)
    2350        44605 :           && (CLASS_DATA (sym)->attr.dimension
    2351        27206 :               || CLASS_DATA (sym)->attr.codimension)))
    2352              :     {
    2353       673408 :       gfc_array_spec *as;
    2354        20673 :       bool coarray_only = sym->attr.codimension && !sym->attr.dimension
    2355       683912 :                           && sym->ts.type == BT_CHARACTER;
    2356       673408 :       gfc_ref *ref, *strarr = NULL;
    2357              : 
    2358       673408 :       tail = extend_ref (primary, tail);
    2359       673408 :       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       673405 :         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       673408 :       if (equiv_flag)
    2378              :         as = NULL;
    2379       671407 :       else if (sym->ts.type == BT_CLASS && CLASS_DATA (sym))
    2380        18018 :         as = CLASS_DATA (sym)->as;
    2381              :       else
    2382       653389 :         as = sym->as;
    2383              : 
    2384       673408 :       ref = strarr ? strarr : tail;
    2385       673408 :       m = gfc_match_array_ref (&ref->u.ar, as, equiv_flag, as ? as->corank : 0,
    2386              :                                coarray_only);
    2387       673408 :       if (m != MATCH_YES)
    2388              :         return m;
    2389              : 
    2390       673316 :       gfc_gobble_whitespace ();
    2391       673316 :       if (coarray_only)
    2392              :         {
    2393         2011 :           primary->ts = sym->ts;
    2394         2011 :           goto check_substring;
    2395              :         }
    2396              : 
    2397       671305 :       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      5096673 :   primary->ts = sym->ts;
    2409              : 
    2410      5096673 :   if (equiv_flag)
    2411              :     return MATCH_YES;
    2412              : 
    2413              :   /* With DEC extensions, member separator may be '.' or '%'.  */
    2414      5093727 :   peeked_char = gfc_peek_ascii_char ();
    2415      5093727 :   m = gfc_match_member_sep (sym);
    2416      5093727 :   if (m == MATCH_ERROR)
    2417              :     return MATCH_ERROR;
    2418              : 
    2419      5093726 :   inquiry = false;
    2420      5093726 :   if (m == MATCH_YES && peeked_char == '%' && primary->ts.type != BT_CLASS
    2421       134313 :       && (primary->ts.type != BT_DERIVED || inferred_type))
    2422              :     {
    2423         2435 :       match mm;
    2424         2435 :       old_loc = gfc_current_locus;
    2425         2435 :       mm = gfc_match_name (name);
    2426              : 
    2427              :       /* Check to see if this has a default complex.  */
    2428          523 :       if (sym->ts.type == BT_UNKNOWN && tgt_expr == NULL
    2429         2454 :           && 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         2435 :       if (mm == MATCH_YES && is_inquiry_ref (name, NULL)
    2441         4148 :           && !(sym->ts.type == BT_UNKNOWN
    2442          234 :                 && gfc_find_derived_types (sym, gfc_current_ns, name)))
    2443              :         inquiry = true;
    2444         2435 :       gfc_current_locus = old_loc;
    2445              :     }
    2446              : 
    2447              :   /* Use the default type if there is one.  */
    2448      2692543 :   if (sym->ts.type == BT_UNKNOWN && m == MATCH_YES
    2449      5094242 :       && 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      5093726 :   if ((sym->ts.type == BT_UNKNOWN || inferred_type)
    2455      2693613 :       && m == MATCH_YES)
    2456              :     {
    2457         1375 :       bool sym_present, resolved = false;
    2458         1375 :       gfc_symbol *tgt_sym;
    2459              : 
    2460         1375 :       sym_present = tgt_expr && tgt_expr->symtree && tgt_expr->symtree->n.sym;
    2461         1375 :       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         1375 :       if (((sym_present                                               // (i)
    2469          995 :             && (tgt_sym->attr.use_assoc
    2470          995 :                 || tgt_sym->attr.host_assoc
    2471          995 :                 || tgt_sym->attr.if_source == IFSRC_DECL
    2472          995 :                 || tgt_sym->attr.proc == PROC_INTRINSIC
    2473          995 :                 || gfc_is_intrinsic (tgt_sym, 0, tgt_expr->where)))
    2474         1363 :            || (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         1019 :           && (tgt_expr->expr_type == EXPR_FUNCTION
    2491           85 :               || tgt_expr->expr_type == EXPR_ARRAY
    2492           73 :               || (!resolved && tgt_expr->expr_type == EXPR_OP))
    2493          952 :           && (sym->ts.type == BT_UNKNOWN
    2494          467 :               || (inferred_type && sym->ts.type != BT_COMPLEX))
    2495         2189 :           && gfc_find_derived_types (sym, gfc_current_ns, name, true))
    2496              :         {
    2497          616 :           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          616 :           gfc_symbol **dts = &sym->assoc->derived_types;
    2501          616 :           tgt_expr->ts.type = BT_DERIVED;
    2502          616 :           tgt_expr->ts.kind = 0;
    2503          616 :           tgt_expr->ts.u.derived = *dts;
    2504          616 :           sym->ts = tgt_expr->ts;
    2505          616 :           primary->ts = sym->ts;
    2506              :           /* Delete the dt list even if this process has to be done again for
    2507              :              another primary expression.  */
    2508         1254 :           while (*dts && (*dts)->dt_next)
    2509              :             {
    2510          638 :               gfc_symbol **tmp = &(*dts)->dt_next;
    2511          638 :               *dts = NULL;
    2512          638 :               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          354 :       else if (inquiry && (sym->ts.type == BT_DERIVED && inferred_type)
    2519          807 :                && !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          711 :       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         1375 :       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      5092351 :   else if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS)
    2545      4859186 :            && 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      5093707 :   if ((sym->ts.type != BT_DERIVED && sym->ts.type != BT_CLASS && !inquiry)
    2553       235581 :       || m != MATCH_YES)
    2554      4939720 :     goto check_substring;
    2555              : 
    2556       153987 :   if (!inquiry)
    2557       152580 :     sym = sym->ts.u.derived;
    2558              :   else
    2559              :     sym = NULL;
    2560              : 
    2561       178740 :   for (;;)
    2562              :     {
    2563       178740 :       bool t;
    2564       178740 :       gfc_symtree *tbp;
    2565       178740 :       gfc_typespec *ts = &primary->ts;
    2566              : 
    2567       178740 :       m = gfc_match_name (name);
    2568       178740 :       if (m == MATCH_NO)
    2569            0 :         gfc_error ("Expected structure component name at %C");
    2570       178740 :       if (m != MATCH_YES)
    2571          135 :         return MATCH_ERROR;
    2572              : 
    2573              :       /* For derived type components find typespec of ultimate component.  */
    2574       178740 :       if (ts->type == BT_DERIVED && primary->ref)
    2575              :         {
    2576       148361 :           for (gfc_ref *ref = primary->ref; ref; ref = ref->next)
    2577              :             {
    2578        85371 :               if (ref->type == REF_COMPONENT && ref->u.c.component)
    2579        24866 :                 ts = &ref->u.c.component->ts;
    2580              :             }
    2581              :         }
    2582              : 
    2583       178740 :       intrinsic = false;
    2584       178740 :       if (ts->type != BT_CLASS && ts->type != BT_DERIVED)
    2585              :         {
    2586         1886 :           inquiry = is_inquiry_ref (name, &tmp);
    2587         1886 :           if (inquiry)
    2588         1881 :             sym = NULL;
    2589              : 
    2590         1886 :           if (peeked_char == '%')
    2591              :             {
    2592         1886 :               if (tmp)
    2593              :                 {
    2594         1881 :                   gfc_symbol *s;
    2595         1881 :                   switch (tmp->u.i)
    2596              :                     {
    2597         1338 :                     case INQUIRY_RE:
    2598         1338 :                     case INQUIRY_IM:
    2599         1338 :                       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         1872 :                   s = primary->symtree ? primary->symtree->n.sym : NULL;
    2619         1844 :                   if (s && s->assoc && s->assoc->target
    2620          354 :                       && (s->ts.type == BT_UNKNOWN
    2621          210 :                           || (primary->ts.type == BT_UNKNOWN
    2622           48 :                               && s->assoc->inferred_type
    2623           48 :                               && s->ts.type == BT_DERIVED)))
    2624              :                     {
    2625          192 :                       if (tmp->u.i == INQUIRY_RE || tmp->u.i == INQUIRY_IM)
    2626              :                         {
    2627           96 :                           s->ts.type = BT_COMPLEX;
    2628           96 :                           s->ts.kind = gfc_default_real_kind;;
    2629           96 :                           s->assoc->inferred_type = 1;
    2630           96 :                           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         1824 :                   if ((tmp->u.i == INQUIRY_RE || tmp->u.i == INQUIRY_IM)
    2650         1334 :                       && 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         1812 :                   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         1812 :               if (primary->ts.type != BT_UNKNOWN)
    2665       178666 :                 intrinsic = true;
    2666              :             }
    2667              :         }
    2668              :       else
    2669              :         inquiry = false;
    2670              : 
    2671       178666 :       if (sym && sym->f2k_derived)
    2672       174055 :         tbp = gfc_find_typebound_proc (sym, &t, name, false, &gfc_current_locus);
    2673              :       else
    2674              :         tbp = NULL;
    2675              : 
    2676       174055 :       if (tbp)
    2677              :         {
    2678         4130 :           gfc_symbol* tbp_sym;
    2679              : 
    2680         4130 :           if (!t)
    2681              :             return MATCH_ERROR;
    2682              : 
    2683         4128 :           gcc_assert (!tail || !tail->next);
    2684              : 
    2685         4128 :           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         4126 :           if (tbp->n.tb->is_generic)
    2692              :             tbp_sym = NULL;
    2693              :           else
    2694         3290 :             tbp_sym = tbp->n.tb->u.specific->n.sym;
    2695              : 
    2696         4126 :           primary->expr_type = EXPR_COMPCALL;
    2697         4126 :           primary->value.compcall.tbp = tbp->n.tb;
    2698         4126 :           primary->value.compcall.name = tbp->name;
    2699         4126 :           primary->value.compcall.ignore_pass = 0;
    2700         4126 :           primary->value.compcall.assign = 0;
    2701         4126 :           primary->value.compcall.base_object = NULL;
    2702         4126 :           gcc_assert (primary->symtree->n.sym->attr.referenced);
    2703         4126 :           if (tbp_sym)
    2704         3290 :             primary->ts = tbp_sym->ts;
    2705              :           else
    2706          836 :             gfc_clear_ts (&primary->ts);
    2707              : 
    2708         4126 :           m = gfc_match_actual_arglist (tbp->n.tb->subroutine,
    2709              :                                         &primary->value.compcall.actual);
    2710         4126 :           if (m == MATCH_ERROR)
    2711              :             return MATCH_ERROR;
    2712         4126 :           if (m == MATCH_NO)
    2713              :             {
    2714          180 :               if (sub_flag)
    2715          179 :                 primary->value.compcall.actual = NULL;
    2716              :               else
    2717              :                 {
    2718              :                   /* Before erroring, check whether there is also a data
    2719              :                      component with this name.  Use noaccess=true so
    2720              :                      that private components are also found.  */
    2721            1 :                   if (sym && gfc_find_component (sym, name, true, true, NULL))
    2722              :                     {
    2723              :                       /* Restore expr to EXPR_VARIABLE and let the data
    2724              :                          component path below handle it.  */
    2725            0 :                       primary->expr_type = EXPR_VARIABLE;
    2726            0 :                       gfc_free_actual_arglist (primary->value.compcall.actual);
    2727            0 :                       primary->value.compcall.actual = NULL;
    2728            0 :                       tbp = NULL;
    2729            0 :                       goto try_data_component;
    2730              :                     }
    2731            1 :                   gfc_error ("Expected argument list at %C");
    2732            1 :                   return MATCH_ERROR;
    2733              :                 }
    2734              :             }
    2735              : 
    2736       153852 :           break;
    2737              :         }
    2738              : 
    2739       169925 :     try_data_component:
    2740              : 
    2741       174536 :       previous = component;
    2742              : 
    2743       174536 :       if (!inquiry && !intrinsic)
    2744              :         {
    2745       172726 :           component = gfc_find_component (sym, name, false, false, &tmp);
    2746              :           /* For inferred-type ASSOCIATE names the parse-time candidate type
    2747              :              may not be the final type; a private component in the candidate
    2748              :              type may correspond to a public component in the correct type.
    2749              :              Accept it tentatively so that resolution can fix up the type.  */
    2750       172726 :           if (!component && !tbp
    2751           47 :               && primary->symtree && primary->symtree->n.sym->assoc
    2752            0 :               && primary->symtree->n.sym->assoc->inferred_type)
    2753            0 :             component = gfc_find_component (sym, name, true, false, &tmp);
    2754              :         }
    2755              :       else
    2756              :         component = NULL;
    2757              : 
    2758       174536 :       if (previous && inquiry
    2759          415 :           && (previous->attr.pdt_kind || previous->attr.pdt_len))
    2760              :         {
    2761            4 :           gfc_error_now ("R901: A type parameter ref is not a designator and "
    2762              :                      "cannot be followed by the type inquiry ref at %C");
    2763            4 :           return MATCH_ERROR;
    2764              :         }
    2765              : 
    2766       174532 :       if (intrinsic && !inquiry)
    2767              :         {
    2768            3 :           if (previous)
    2769            2 :             gfc_error ("%qs at %C is not an inquiry reference to an intrinsic "
    2770              :                         "type component %qs", name, previous->name);
    2771              :           else
    2772            1 :             gfc_error ("%qs at %C is not an inquiry reference to an intrinsic "
    2773              :                         "type component", name);
    2774            3 :           return MATCH_ERROR;
    2775              :         }
    2776       174529 :       else if (component == NULL && !inquiry)
    2777              :         return MATCH_ERROR;
    2778              : 
    2779              :       /* Extend the reference chain determined by gfc_find_component or
    2780              :          is_inquiry_ref.  */
    2781       174482 :       if (primary->ref == NULL)
    2782       104375 :         primary->ref = tmp;
    2783              :       else
    2784              :         {
    2785              :           /* Find end of reference chain if inquiry reference and tail not
    2786              :              set.  */
    2787        70107 :           if (tail == NULL && inquiry && tmp)
    2788           11 :             tail = extend_ref (primary, tail);
    2789              : 
    2790              :           /* Set by the for loop below for the last component ref.  */
    2791        70107 :           gcc_assert (tail != NULL);
    2792        70107 :           tail->next = tmp;
    2793              :         }
    2794              : 
    2795              :       /* The reference chain may be longer than one hop for union
    2796              :          subcomponents; find the new tail.  */
    2797       176458 :       for (tail = tmp; tail->next; tail = tail->next)
    2798              :         ;
    2799              : 
    2800       174482 :       if (tmp && tmp->type == REF_INQUIRY)
    2801              :         {
    2802         1803 :           if (!primary->where.u.lb || !primary->where.nextc)
    2803         1619 :             primary->where = gfc_current_locus;
    2804         1803 :           gfc_simplify_expr (primary, 0);
    2805              : 
    2806         1803 :           if (primary->expr_type == EXPR_CONSTANT)
    2807          354 :             goto check_done;
    2808              : 
    2809         1449 :           if (primary->ref == NULL)
    2810           60 :             goto check_done;
    2811              : 
    2812         1389 :           switch (tmp->u.i)
    2813              :             {
    2814         1178 :             case INQUIRY_RE:
    2815         1178 :             case INQUIRY_IM:
    2816         1178 :               if (!gfc_notify_std (GFC_STD_F2008, "RE or IM part_ref at %C"))
    2817              :                 return MATCH_ERROR;
    2818              : 
    2819         1178 :               if (primary->ts.type != BT_COMPLEX)
    2820              :                 {
    2821            0 :                   gfc_error ("The RE or IM part_ref at %C must be "
    2822              :                              "applied to a COMPLEX expression");
    2823            0 :                   return MATCH_ERROR;
    2824              :                 }
    2825         1178 :               primary->ts.type = BT_REAL;
    2826         1178 :               break;
    2827              : 
    2828          159 :             case INQUIRY_LEN:
    2829          159 :               if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
    2830              :                 return MATCH_ERROR;
    2831              : 
    2832          159 :               if (primary->ts.type != BT_CHARACTER)
    2833              :                 {
    2834            0 :                   gfc_error ("The LEN part_ref at %C must be applied "
    2835              :                              "to a CHARACTER expression");
    2836            0 :                   return MATCH_ERROR;
    2837              :                 }
    2838          159 :               primary->ts.u.cl = NULL;
    2839          159 :               primary->ts.type = BT_INTEGER;
    2840          159 :               primary->ts.kind = gfc_default_integer_kind;
    2841          159 :               break;
    2842              : 
    2843           52 :             case INQUIRY_KIND:
    2844           52 :               if (!gfc_notify_std (GFC_STD_F2003, "KIND part_ref at %C"))
    2845              :                 return MATCH_ERROR;
    2846              : 
    2847           52 :               if (primary->ts.type == BT_CLASS
    2848           52 :                   || primary->ts.type == BT_DERIVED)
    2849              :                 {
    2850            0 :                   gfc_error ("The KIND part_ref at %C must be applied "
    2851              :                              "to an expression of intrinsic type");
    2852            0 :                   return MATCH_ERROR;
    2853              :                 }
    2854           52 :               primary->ts.type = BT_INTEGER;
    2855           52 :               primary->ts.kind = gfc_default_integer_kind;
    2856           52 :               break;
    2857              : 
    2858            0 :             default:
    2859            0 :               gcc_unreachable ();
    2860              :             }
    2861              : 
    2862         1389 :           goto check_done;
    2863              :         }
    2864              : 
    2865       172679 :       primary->ts = component->ts;
    2866              : 
    2867       172679 :       if (component->attr.proc_pointer && ppc_arg)
    2868              :         {
    2869              :           /* Procedure pointer component call: Look for argument list.  */
    2870         1093 :           m = gfc_match_actual_arglist (sub_flag,
    2871              :                                         &primary->value.compcall.actual);
    2872         1093 :           if (m == MATCH_ERROR)
    2873              :             return MATCH_ERROR;
    2874              : 
    2875         1093 :           if (m == MATCH_NO && !gfc_matching_ptr_assignment
    2876          272 :               && !gfc_matching_procptr_assignment && !matching_actual_arglist)
    2877              :             {
    2878            2 :               gfc_error ("Procedure pointer component %qs requires an "
    2879              :                          "argument list at %C", component->name);
    2880            2 :               return MATCH_ERROR;
    2881              :             }
    2882              : 
    2883         1091 :           if (m == MATCH_YES)
    2884          820 :             primary->expr_type = EXPR_PPC;
    2885              : 
    2886              :           break;
    2887              :         }
    2888              : 
    2889       171586 :       if (component->as != NULL && !component->attr.proc_pointer)
    2890              :         {
    2891        63336 :           tail = extend_ref (primary, tail);
    2892        63336 :           tail->type = REF_ARRAY;
    2893              : 
    2894       126672 :           m = gfc_match_array_ref (&tail->u.ar, component->as, equiv_flag,
    2895        63336 :                           component->as->corank);
    2896        63336 :           if (m != MATCH_YES)
    2897              :             return m;
    2898              :         }
    2899       108250 :       else if (component->ts.type == BT_CLASS && component->attr.class_ok
    2900        10652 :                && CLASS_DATA (component)->as && !component->attr.proc_pointer)
    2901              :         {
    2902         5069 :           tail = extend_ref (primary, tail);
    2903         5069 :           tail->type = REF_ARRAY;
    2904              : 
    2905        10138 :           m = gfc_match_array_ref (&tail->u.ar, CLASS_DATA (component)->as,
    2906              :                                    equiv_flag,
    2907         5069 :                                    CLASS_DATA (component)->as->corank);
    2908         5069 :           if (m != MATCH_YES)
    2909              :             return m;
    2910              :         }
    2911              : 
    2912       103181 : check_done:
    2913              :       /* In principle, we could have eg. expr%re%kind so we must allow for
    2914              :          this possibility.  */
    2915       173389 :       if (gfc_match_char ('%') == MATCH_YES)
    2916              :         {
    2917        24383 :           if (component && (component->ts.type == BT_DERIVED
    2918         3298 :                             || component->ts.type == BT_CLASS))
    2919        23908 :             sym = component->ts.u.derived;
    2920        24383 :           continue;
    2921              :         }
    2922       149006 :       else if (inquiry)
    2923              :         break;
    2924              : 
    2925       137343 :       if ((component->ts.type != BT_DERIVED && component->ts.type != BT_CLASS)
    2926       155032 :           || gfc_match_member_sep (component->ts.u.derived) != MATCH_YES)
    2927              :         break;
    2928              : 
    2929          370 :       if (component->ts.type == BT_DERIVED || component->ts.type == BT_CLASS)
    2930          370 :         sym = component->ts.u.derived;
    2931              :     }
    2932              : 
    2933      5095583 : check_substring:
    2934      5095583 :   unknown = false;
    2935      5095583 :   if (primary->ts.type == BT_UNKNOWN && !gfc_fl_struct (sym->attr.flavor))
    2936              :     {
    2937      2692027 :       if (gfc_get_default_type (sym->name, sym->ns)->type == BT_CHARACTER)
    2938              :        {
    2939          352 :          gfc_set_default_type (sym, 0, sym->ns);
    2940          352 :          primary->ts = sym->ts;
    2941          352 :          unknown = true;
    2942              :        }
    2943              :     }
    2944              : 
    2945      5095583 :   if (primary->ts.type == BT_CHARACTER)
    2946              :     {
    2947       308499 :       bool def = primary->ts.deferred == 1;
    2948       308499 :       switch (match_substring (primary->ts.u.cl, equiv_flag, &substring, def))
    2949              :         {
    2950        15012 :         case MATCH_YES:
    2951        15012 :           if (tail == NULL)
    2952         9835 :             primary->ref = substring;
    2953              :           else
    2954         5177 :             tail->next = substring;
    2955              : 
    2956        15012 :           if (primary->expr_type == EXPR_CONSTANT)
    2957          755 :             primary->expr_type = EXPR_SUBSTRING;
    2958              : 
    2959        15012 :           if (substring)
    2960        14832 :             primary->ts.u.cl = NULL;
    2961              : 
    2962        15012 :           gfc_gobble_whitespace ();
    2963        15012 :           if (gfc_peek_ascii_char () == '(')
    2964              :             {
    2965            5 :               gfc_error_now ("Unexpected array/substring ref at %C");
    2966            5 :               return MATCH_ERROR;
    2967              :             }
    2968              :           break;
    2969              : 
    2970       293487 :         case MATCH_NO:
    2971       293487 :           if (unknown)
    2972              :             {
    2973          351 :               gfc_clear_ts (&primary->ts);
    2974          351 :               gfc_clear_ts (&sym->ts);
    2975              :             }
    2976              :           break;
    2977              : 
    2978              :         case MATCH_ERROR:
    2979              :           return MATCH_ERROR;
    2980              :         }
    2981              :     }
    2982              : 
    2983              :   /* F08:C611.  */
    2984      5095578 :   if (primary->ts.type == BT_DERIVED && primary->ref
    2985        29221 :       && primary->ts.u.derived && primary->ts.u.derived->attr.abstract)
    2986              :     {
    2987            6 :       gfc_error ("Nonpolymorphic reference to abstract type at %C");
    2988            6 :       return MATCH_ERROR;
    2989              :     }
    2990              : 
    2991              :   /* F08:C727.  */
    2992      5095572 :   if (primary->expr_type == EXPR_PPC && gfc_is_coindexed (primary))
    2993              :     {
    2994            3 :       gfc_error ("Coindexed procedure-pointer component at %C");
    2995            3 :       return MATCH_ERROR;
    2996              :     }
    2997              : 
    2998              :   return MATCH_YES;
    2999              : }
    3000              : 
    3001              : 
    3002              : /* Given an expression that is a variable, figure out what the
    3003              :    ultimate variable's type and attribute is, traversing the reference
    3004              :    structures if necessary.
    3005              : 
    3006              :    This subroutine is trickier than it looks.  We start at the base
    3007              :    symbol and store the attribute.  Component references load a
    3008              :    completely new attribute.
    3009              : 
    3010              :    A couple of rules come into play.  Subobjects of targets are always
    3011              :    targets themselves.  If we see a component that goes through a
    3012              :    pointer, then the expression must also be a target, since the
    3013              :    pointer is associated with something (if it isn't core will soon be
    3014              :    dumped).  If we see a full part or section of an array, the
    3015              :    expression is also an array.
    3016              : 
    3017              :    We can have at most one full array reference.  */
    3018              : 
    3019              : symbol_attribute
    3020      5258439 : gfc_variable_attr (gfc_expr *expr, gfc_typespec *ts)
    3021              : {
    3022      5258439 :   int dimension, codimension, pointer, allocatable, target, optional;
    3023      5258439 :   symbol_attribute attr;
    3024      5258439 :   gfc_ref *ref;
    3025      5258439 :   gfc_symbol *sym;
    3026      5258439 :   gfc_component *comp;
    3027      5258439 :   bool has_inquiry_part;
    3028      5258439 :   bool has_substring_ref = false;
    3029              : 
    3030      5258439 :   if (expr->expr_type != EXPR_VARIABLE
    3031        55741 :       && expr->expr_type != EXPR_FUNCTION
    3032            9 :       && !(expr->expr_type == EXPR_NULL && expr->ts.type != BT_UNKNOWN))
    3033            0 :     gfc_internal_error ("gfc_variable_attr(): Expression isn't a variable");
    3034              : 
    3035      5258439 :   sym = expr->symtree->n.sym;
    3036      5258439 :   attr = sym->attr;
    3037              : 
    3038      5258439 :   optional = attr.optional;
    3039      5258439 :   if (sym->ts.type == BT_CLASS && sym->attr.class_ok && sym->ts.u.derived)
    3040              :     {
    3041       171604 :       dimension = CLASS_DATA (sym)->attr.dimension;
    3042       171604 :       codimension = CLASS_DATA (sym)->attr.codimension;
    3043       171604 :       pointer = CLASS_DATA (sym)->attr.class_pointer;
    3044       171604 :       allocatable = CLASS_DATA (sym)->attr.allocatable;
    3045              :     }
    3046              :   else
    3047              :     {
    3048      5086835 :       dimension = attr.dimension;
    3049      5086835 :       codimension = attr.codimension;
    3050      5086835 :       pointer = attr.pointer;
    3051      5086835 :       allocatable = attr.allocatable;
    3052              :     }
    3053              : 
    3054      5258439 :   target = attr.target;
    3055      5258439 :   if (pointer || attr.proc_pointer)
    3056       255329 :     target = 1;
    3057              : 
    3058              :   /* F2018:11.1.3.3: Other attributes of associate names
    3059              :      "The associating entity does not have the ALLOCATABLE or POINTER
    3060              :      attributes; it has the TARGET attribute if and only if the selector is
    3061              :      a variable and has either the TARGET or POINTER attribute."  */
    3062      5258439 :   if (sym->attr.associate_var && sym->assoc && sym->assoc->target)
    3063              :     {
    3064        34912 :       if (sym->assoc->target->expr_type == EXPR_VARIABLE)
    3065              :         {
    3066        31194 :           symbol_attribute tgt_attr;
    3067        31194 :           tgt_attr = gfc_expr_attr (sym->assoc->target);
    3068        40456 :           target = (tgt_attr.pointer || tgt_attr.target);
    3069              :         }
    3070              :       else
    3071              :         target = 0;
    3072              :     }
    3073              : 
    3074      5258439 :   if (ts != NULL && expr->ts.type == BT_UNKNOWN)
    3075        52224 :     *ts = sym->ts;
    3076              : 
    3077              :   /* Catch left-overs from match_actual_arg, where an actual argument of a
    3078              :      procedure is given a temporary ts.type == BT_PROCEDURE.  The fixup is
    3079              :      needed for structure constructors in DATA statements, where a pointer
    3080              :      is associated with a data target, and the argument has not been fully
    3081              :      resolved yet.  Components references are dealt with further below.  */
    3082        52224 :   if (ts != NULL
    3083      1319646 :       && expr->ts.type == BT_PROCEDURE
    3084         3046 :       && expr->ref == NULL
    3085         3046 :       && attr.flavor != FL_PROCEDURE
    3086          107 :       && attr.target)
    3087            1 :     *ts = sym->ts;
    3088              : 
    3089      5258439 :   has_inquiry_part = false;
    3090      7124188 :   for (ref = expr->ref; ref; ref = ref->next)
    3091      1867555 :     if (ref->type == REF_SUBSTRING)
    3092              :       {
    3093              :         has_substring_ref = true;
    3094              :         optional = false;
    3095              :       }
    3096      1848339 :     else if (ref->type == REF_INQUIRY)
    3097              :       {
    3098              :         has_inquiry_part = true;
    3099              :         optional = false;
    3100              :         break;
    3101              :       }
    3102              : 
    3103      7126001 :   for (ref = expr->ref; ref; ref = ref->next)
    3104      1867562 :     switch (ref->type)
    3105              :       {
    3106      1454658 :       case REF_ARRAY:
    3107              : 
    3108      1454658 :         switch (ref->u.ar.type)
    3109              :           {
    3110              :           case AR_FULL:
    3111      1867562 :             dimension = 1;
    3112              :             break;
    3113              : 
    3114       118131 :           case AR_SECTION:
    3115       118131 :             allocatable = pointer = 0;
    3116       118131 :             dimension = 1;
    3117       118131 :             optional = false;
    3118       118131 :             break;
    3119              : 
    3120       333400 :           case AR_ELEMENT:
    3121              :             /* Handle coarrays.  */
    3122       333400 :             if (ref->u.ar.dimen > 0)
    3123      1867562 :               allocatable = pointer = optional = false;
    3124              :             break;
    3125              : 
    3126              :           case AR_UNKNOWN:
    3127              :             /* For standard conforming code, AR_UNKNOWN should not happen.
    3128              :                For nonconforming code, gfortran can end up here.  Treat it
    3129              :                as a no-op.  */
    3130              :             break;
    3131              :           }
    3132              : 
    3133              :         break;
    3134              : 
    3135       391875 :       case REF_COMPONENT:
    3136       391875 :         optional = false;
    3137       391875 :         comp = ref->u.c.component;
    3138       391875 :         attr = comp->attr;
    3139       391875 :         if (ts != NULL && !has_inquiry_part)
    3140              :           {
    3141        87555 :             *ts = comp->ts;
    3142              :             /* Don't set the string length if a substring reference
    3143              :                follows.  */
    3144        87555 :             if (ts->type == BT_CHARACTER && has_substring_ref)
    3145          294 :               ts->u.cl = NULL;
    3146              :           }
    3147              : 
    3148       391875 :         if (comp->ts.type == BT_CLASS)
    3149              :           {
    3150        29375 :             dimension = CLASS_DATA (comp)->attr.dimension;
    3151        29375 :             codimension = CLASS_DATA (comp)->attr.codimension;
    3152        29375 :             pointer = CLASS_DATA (comp)->attr.class_pointer;
    3153        29375 :             allocatable = CLASS_DATA (comp)->attr.allocatable;
    3154              :           }
    3155              :         else
    3156              :           {
    3157       362500 :             dimension = comp->attr.dimension;
    3158       362500 :             codimension = comp->attr.codimension;
    3159       362500 :             if (expr->ts.type == BT_CLASS && strcmp (comp->name, "_data") == 0)
    3160        19755 :               pointer = comp->attr.class_pointer;
    3161              :             else
    3162       342745 :               pointer = comp->attr.pointer;
    3163       362500 :             allocatable = comp->attr.allocatable;
    3164              :           }
    3165       391875 :         if (pointer || attr.proc_pointer)
    3166        72898 :           target = 1;
    3167              : 
    3168              :         break;
    3169              : 
    3170        21029 :       case REF_INQUIRY:
    3171        21029 :       case REF_SUBSTRING:
    3172        21029 :         allocatable = pointer = optional = false;
    3173        21029 :         break;
    3174              :       }
    3175              : 
    3176      5258439 :   attr.dimension = dimension;
    3177      5258439 :   attr.codimension = codimension;
    3178      5258439 :   attr.pointer = pointer;
    3179      5258439 :   attr.allocatable = allocatable;
    3180      5258439 :   attr.target = target;
    3181      5258439 :   attr.save = sym->attr.save;
    3182      5258439 :   attr.optional = optional;
    3183              : 
    3184      5258439 :   return attr;
    3185              : }
    3186              : 
    3187              : 
    3188              : /* Return the attribute from a general expression.  */
    3189              : 
    3190              : symbol_attribute
    3191      4870299 : gfc_expr_attr (gfc_expr *e)
    3192              : {
    3193      4870299 :   symbol_attribute attr;
    3194              : 
    3195      4870299 :   switch (e->expr_type)
    3196              :     {
    3197      3874214 :     case EXPR_VARIABLE:
    3198      3874214 :       attr = gfc_variable_attr (e, NULL);
    3199      3874214 :       break;
    3200              : 
    3201        80850 :     case EXPR_FUNCTION:
    3202        80850 :       gfc_clear_attr (&attr);
    3203              : 
    3204        80850 :       if (e->value.function.esym && e->value.function.esym->result)
    3205              :         {
    3206        24796 :           gfc_symbol *sym = e->value.function.esym->result;
    3207        24796 :           attr = sym->attr;
    3208        24796 :           if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
    3209              :             {
    3210         2206 :               attr.dimension = CLASS_DATA (sym)->attr.dimension;
    3211         2206 :               attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
    3212         2206 :               attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
    3213              :             }
    3214              :         }
    3215        56054 :       else if (e->value.function.isym
    3216        53091 :                && e->value.function.isym->transformational
    3217        22963 :                && e->ts.type == BT_CLASS)
    3218          330 :         attr = CLASS_DATA (e)->attr;
    3219        55724 :       else if (e->symtree)
    3220        55718 :         attr = gfc_variable_attr (e, NULL);
    3221              : 
    3222              :       /* TODO: NULL() returns pointers.  May have to take care of this
    3223              :          here.  */
    3224              : 
    3225              :       break;
    3226              : 
    3227       915235 :     default:
    3228       915235 :       gfc_clear_attr (&attr);
    3229       915235 :       break;
    3230              :     }
    3231              : 
    3232      4870299 :   return attr;
    3233              : }
    3234              : 
    3235              : 
    3236              : /* Given an expression, figure out what the ultimate expression
    3237              :    attribute is.  This routine is similar to gfc_variable_attr with
    3238              :    parts of gfc_expr_attr, but focuses more on the needs of
    3239              :    coarrays.  For coarrays a codimension attribute is kind of
    3240              :    "infectious" being propagated once set and never cleared.
    3241              :    The coarray_comp is only set, when the expression refs a coarray
    3242              :    component.  REFS_COMP is set when present to true only, when this EXPR
    3243              :    refs a (non-_data) component.  To check whether EXPR refs an allocatable
    3244              :    component in a derived type coarray *refs_comp needs to be set and
    3245              :    coarray_comp has to false.  */
    3246              : 
    3247              : static symbol_attribute
    3248        16115 : caf_variable_attr (gfc_expr *expr, bool in_allocate, bool *refs_comp)
    3249              : {
    3250        16115 :   int dimension, codimension, pointer, allocatable, target, coarray_comp;
    3251        16115 :   symbol_attribute attr;
    3252        16115 :   gfc_ref *ref;
    3253        16115 :   gfc_symbol *sym;
    3254        16115 :   gfc_component *comp;
    3255              : 
    3256        16115 :   if (expr->expr_type != EXPR_VARIABLE && expr->expr_type != EXPR_FUNCTION)
    3257            0 :     gfc_internal_error ("gfc_caf_attr(): Expression isn't a variable");
    3258              : 
    3259        16115 :   sym = expr->symtree->n.sym;
    3260        16115 :   gfc_clear_attr (&attr);
    3261              : 
    3262        16115 :   if (refs_comp)
    3263        10877 :     *refs_comp = false;
    3264              : 
    3265        16115 :   if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
    3266              :     {
    3267          410 :       dimension = CLASS_DATA (sym)->attr.dimension;
    3268          410 :       codimension = CLASS_DATA (sym)->attr.codimension;
    3269          410 :       pointer = CLASS_DATA (sym)->attr.class_pointer;
    3270          410 :       allocatable = CLASS_DATA (sym)->attr.allocatable;
    3271          410 :       attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
    3272          410 :       attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived->attr.pointer_comp;
    3273              :     }
    3274              :   else
    3275              :     {
    3276        15705 :       dimension = sym->attr.dimension;
    3277        15705 :       codimension = sym->attr.codimension;
    3278        15705 :       pointer = sym->attr.pointer;
    3279        15705 :       allocatable = sym->attr.allocatable;
    3280        31410 :       attr.alloc_comp = sym->ts.type == BT_DERIVED
    3281        15705 :           ? sym->ts.u.derived->attr.alloc_comp : 0;
    3282        15705 :       attr.pointer_comp = sym->ts.type == BT_DERIVED
    3283        15705 :           ? sym->ts.u.derived->attr.pointer_comp : 0;
    3284              :     }
    3285              : 
    3286        16115 :   target = coarray_comp = 0;
    3287        16115 :   if (pointer || attr.proc_pointer)
    3288          638 :     target = 1;
    3289              : 
    3290        28281 :   for (ref = expr->ref; ref; ref = ref->next)
    3291        12166 :     switch (ref->type)
    3292              :       {
    3293         8467 :       case REF_ARRAY:
    3294              : 
    3295         8467 :         switch (ref->u.ar.type)
    3296              :           {
    3297              :           case AR_FULL:
    3298              :           case AR_SECTION:
    3299              :             dimension = 1;
    3300         8467 :             break;
    3301              : 
    3302         3966 :           case AR_ELEMENT:
    3303              :             /* Handle coarrays.  */
    3304         3966 :             if (ref->u.ar.dimen > 0 && !in_allocate)
    3305         8467 :               allocatable = pointer = 0;
    3306              :             break;
    3307              : 
    3308            0 :           case AR_UNKNOWN:
    3309              :             /* If any of start, end or stride is not integer, there will
    3310              :                already have been an error issued.  */
    3311            0 :             int errors;
    3312            0 :             gfc_get_errors (NULL, &errors);
    3313            0 :             if (errors == 0)
    3314            0 :               gfc_internal_error ("gfc_caf_attr(): Bad array reference");
    3315              :           }
    3316              : 
    3317              :         break;
    3318              : 
    3319         3697 :       case REF_COMPONENT:
    3320         3697 :         comp = ref->u.c.component;
    3321              : 
    3322         3697 :         if (comp->ts.type == BT_CLASS)
    3323              :           {
    3324              :             /* Set coarray_comp only, when this component introduces the
    3325              :                coarray.  */
    3326           13 :             coarray_comp = !codimension && CLASS_DATA (comp)->attr.codimension;
    3327           13 :             codimension |= CLASS_DATA (comp)->attr.codimension;
    3328           13 :             pointer = CLASS_DATA (comp)->attr.class_pointer;
    3329           13 :             allocatable = CLASS_DATA (comp)->attr.allocatable;
    3330              :           }
    3331              :         else
    3332              :           {
    3333              :             /* Set coarray_comp only, when this component introduces the
    3334              :                coarray.  */
    3335         3684 :             coarray_comp = !codimension && comp->attr.codimension;
    3336         3684 :             codimension |= comp->attr.codimension;
    3337         3684 :             pointer = comp->attr.pointer;
    3338         3684 :             allocatable = comp->attr.allocatable;
    3339              :           }
    3340              : 
    3341         3697 :         if (refs_comp && strcmp (comp->name, "_data") != 0
    3342         2185 :             && (ref->next == NULL
    3343         1656 :                 || (ref->next->type == REF_ARRAY && ref->next->next == NULL)))
    3344         1616 :           *refs_comp = true;
    3345              : 
    3346         3697 :         if (pointer || attr.proc_pointer)
    3347          690 :           target = 1;
    3348              : 
    3349              :         break;
    3350              : 
    3351              :       case REF_SUBSTRING:
    3352              :       case REF_INQUIRY:
    3353        12166 :         allocatable = pointer = 0;
    3354              :         break;
    3355              :       }
    3356              : 
    3357        16115 :   attr.dimension = dimension;
    3358        16115 :   attr.codimension = codimension;
    3359        16115 :   attr.pointer = pointer;
    3360        16115 :   attr.allocatable = allocatable;
    3361        16115 :   attr.target = target;
    3362        16115 :   attr.save = sym->attr.save;
    3363        16115 :   attr.coarray_comp = coarray_comp;
    3364              : 
    3365        16115 :   return attr;
    3366              : }
    3367              : 
    3368              : 
    3369              : symbol_attribute
    3370        20119 : gfc_caf_attr (gfc_expr *e, bool in_allocate, bool *refs_comp)
    3371              : {
    3372        20119 :   symbol_attribute attr;
    3373              : 
    3374        20119 :   switch (e->expr_type)
    3375              :     {
    3376        14532 :     case EXPR_VARIABLE:
    3377        14532 :       attr = caf_variable_attr (e, in_allocate, refs_comp);
    3378        14532 :       break;
    3379              : 
    3380         1589 :     case EXPR_FUNCTION:
    3381         1589 :       gfc_clear_attr (&attr);
    3382              : 
    3383         1589 :       if (e->value.function.esym && e->value.function.esym->result)
    3384              :         {
    3385            6 :           gfc_symbol *sym = e->value.function.esym->result;
    3386            6 :           attr = sym->attr;
    3387            6 :           if (sym->ts.type == BT_CLASS)
    3388              :             {
    3389            0 :               attr.dimension = CLASS_DATA (sym)->attr.dimension;
    3390            0 :               attr.pointer = CLASS_DATA (sym)->attr.class_pointer;
    3391            0 :               attr.allocatable = CLASS_DATA (sym)->attr.allocatable;
    3392            0 :               attr.alloc_comp = CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp;
    3393            0 :               attr.pointer_comp = CLASS_DATA (sym)->ts.u.derived
    3394            0 :                   ->attr.pointer_comp;
    3395              :             }
    3396              :         }
    3397         1583 :       else if (e->symtree)
    3398         1583 :         attr = caf_variable_attr (e, in_allocate, refs_comp);
    3399              :       else
    3400            0 :         gfc_clear_attr (&attr);
    3401              :       break;
    3402              : 
    3403         3998 :     default:
    3404         3998 :       gfc_clear_attr (&attr);
    3405         3998 :       break;
    3406              :     }
    3407              : 
    3408        20119 :   return attr;
    3409              : }
    3410              : 
    3411              : 
    3412              : /* Match a structure constructor.  The initial symbol has already been
    3413              :    seen.  */
    3414              : 
    3415              : typedef struct gfc_structure_ctor_component
    3416              : {
    3417              :   char* name;
    3418              :   gfc_expr* val;
    3419              :   locus where;
    3420              :   struct gfc_structure_ctor_component* next;
    3421              : }
    3422              : gfc_structure_ctor_component;
    3423              : 
    3424              : #define gfc_get_structure_ctor_component() XCNEW (gfc_structure_ctor_component)
    3425              : 
    3426              : static void
    3427        10581 : gfc_free_structure_ctor_component (gfc_structure_ctor_component *comp)
    3428              : {
    3429        10581 :   free (comp->name);
    3430        10581 :   gfc_free_expr (comp->val);
    3431        10581 :   free (comp);
    3432        10581 : }
    3433              : 
    3434              : 
    3435              : /* Translate the component list into the actual constructor by sorting it in
    3436              :    the order required; this also checks along the way that each and every
    3437              :    component actually has an initializer and handles default initializers
    3438              :    for components without explicit value given.  */
    3439              : static bool
    3440         7369 : build_actual_constructor (gfc_structure_ctor_component **comp_head,
    3441              :                           gfc_constructor_base *ctor_head, gfc_symbol *sym)
    3442              : {
    3443         7369 :   gfc_structure_ctor_component *comp_iter;
    3444         7369 :   gfc_component *comp;
    3445              : 
    3446        19351 :   for (comp = sym->components; comp; comp = comp->next)
    3447              :     {
    3448        11994 :       gfc_structure_ctor_component **next_ptr;
    3449        11994 :       gfc_expr *value = NULL;
    3450              : 
    3451              :       /* Try to find the initializer for the current component by name.  */
    3452        11994 :       next_ptr = comp_head;
    3453        13167 :       for (comp_iter = *comp_head; comp_iter; comp_iter = comp_iter->next)
    3454              :         {
    3455        11730 :           if (!strcmp (comp_iter->name, comp->name))
    3456              :             break;
    3457         1173 :           next_ptr = &comp_iter->next;
    3458              :         }
    3459              : 
    3460              :       /* If an extension, try building the parent derived type by building
    3461              :          a value expression for the parent derived type and calling self.  */
    3462        11994 :       if (!comp_iter && comp == sym->components && sym->attr.extension)
    3463              :         {
    3464          106 :           value = gfc_get_structure_constructor_expr (comp->ts.type,
    3465              :                                                       comp->ts.kind,
    3466              :                                                       &gfc_current_locus);
    3467          106 :           value->ts = comp->ts;
    3468              : 
    3469          106 :           if (!build_actual_constructor (comp_head,
    3470              :                                          &value->value.constructor,
    3471          106 :                                          comp->ts.u.derived))
    3472              :             {
    3473            0 :               gfc_free_expr (value);
    3474            0 :               return false;
    3475              :             }
    3476              : 
    3477          106 :           gfc_constructor_append_expr (ctor_head, value, NULL);
    3478          106 :           continue;
    3479              :         }
    3480              : 
    3481              :       /* If it was not found, apply NULL expression to set the component as
    3482              :          unallocated. Then try the default initializer if there's any;
    3483              :          otherwise, it's an error unless this is a deferred parameter.  */
    3484         1331 :       if (!comp_iter)
    3485              :         {
    3486              :           /* F2018 7.5.10: If an allocatable component has no corresponding
    3487              :              component-data-source, then that component has an allocation
    3488              :              status of unallocated....  */
    3489         1331 :           if (comp->attr.allocatable
    3490         1196 :               || (comp->ts.type == BT_CLASS
    3491           15 :                   && CLASS_DATA (comp)->attr.allocatable))
    3492              :             {
    3493          144 :               if (!gfc_notify_std (GFC_STD_F2008, "No initializer for "
    3494              :                                    "allocatable component %qs given in the "
    3495              :                                    "structure constructor at %C", comp->name))
    3496              :                 return false;
    3497          144 :               value = gfc_get_null_expr (&gfc_current_locus);
    3498              :             }
    3499              :           /* ....(Preceding sentence) If a component with default
    3500              :              initialization has no corresponding component-data-source, then
    3501              :              the default initialization is applied to that component.  */
    3502         1187 :           else if (comp->initializer)
    3503              :             {
    3504          667 :               if (!gfc_notify_std (GFC_STD_F2003, "Structure constructor "
    3505              :                                    "with missing optional arguments at %C"))
    3506              :                 return false;
    3507          665 :               value = gfc_copy_expr (comp->initializer);
    3508              :             }
    3509              :           /* Do not trap components such as the string length for deferred
    3510              :              length character components.  */
    3511          520 :           else if (!comp->attr.artificial)
    3512              :             {
    3513           10 :               gfc_error ("No initializer for component %qs given in the"
    3514              :                          " structure constructor at %C", comp->name);
    3515           10 :               return false;
    3516              :             }
    3517              :         }
    3518              :       else
    3519        10557 :         value = comp_iter->val;
    3520              : 
    3521              :       /* Add the value to the constructor chain built.  */
    3522        11876 :       gfc_constructor_append_expr (ctor_head, value, NULL);
    3523              : 
    3524              :       /* Remove the entry from the component list.  We don't want the expression
    3525              :          value to be free'd, so set it to NULL.  */
    3526        11876 :       if (comp_iter)
    3527              :         {
    3528        10557 :           *next_ptr = comp_iter->next;
    3529        10557 :           comp_iter->val = NULL;
    3530        10557 :           gfc_free_structure_ctor_component (comp_iter);
    3531              :         }
    3532              :     }
    3533              :   return true;
    3534              : }
    3535              : 
    3536              : 
    3537              : bool
    3538         7278 : gfc_convert_to_structure_constructor (gfc_expr *e, gfc_symbol *sym, gfc_expr **cexpr,
    3539              :                                       gfc_actual_arglist **arglist,
    3540              :                                       bool parent)
    3541              : {
    3542         7278 :   gfc_actual_arglist *actual;
    3543         7278 :   gfc_structure_ctor_component *comp_tail, *comp_head, *comp_iter;
    3544         7278 :   gfc_constructor_base ctor_head = NULL;
    3545         7278 :   gfc_component *comp; /* Is set NULL when named component is first seen */
    3546         7278 :   const char* last_name = NULL;
    3547         7278 :   locus old_locus;
    3548         7278 :   gfc_expr *expr;
    3549              : 
    3550         7278 :   expr = parent ? *cexpr : e;
    3551         7278 :   old_locus = gfc_current_locus;
    3552         7278 :   if (parent)
    3553              :     ; /* gfc_current_locus = *arglist->expr ? ->where;*/
    3554              :   else
    3555         6546 :     gfc_current_locus = expr->where;
    3556              : 
    3557         7278 :   comp_tail = comp_head = NULL;
    3558              : 
    3559         7278 :   if (!parent && sym->attr.abstract)
    3560              :     {
    3561            1 :       gfc_error ("Cannot construct ABSTRACT type %qs at %L",
    3562              :                  sym->name, &expr->where);
    3563            1 :       goto cleanup;
    3564              :     }
    3565              : 
    3566         7277 :   comp = sym->components;
    3567         7277 :   actual = parent ? *arglist : expr->value.function.actual;
    3568        17239 :   for ( ; actual; )
    3569              :     {
    3570        10581 :       gfc_component *this_comp = NULL;
    3571              : 
    3572        10581 :       if (!comp_head)
    3573         6857 :         comp_tail = comp_head = gfc_get_structure_ctor_component ();
    3574              :       else
    3575              :         {
    3576         3724 :           comp_tail->next = gfc_get_structure_ctor_component ();
    3577         3724 :           comp_tail = comp_tail->next;
    3578              :         }
    3579        10581 :       if (actual->name)
    3580              :         {
    3581         1351 :           if (!gfc_notify_std (GFC_STD_F2003, "Structure"
    3582              :                                " constructor with named arguments at %C"))
    3583            1 :             goto cleanup;
    3584              : 
    3585         1350 :           comp_tail->name = xstrdup (actual->name);
    3586         1350 :           last_name = comp_tail->name;
    3587         1350 :           comp = NULL;
    3588              :         }
    3589              :       else
    3590              :         {
    3591              :           /* Components without name are not allowed after the first named
    3592              :              component initializer!  */
    3593         9230 :           if (!comp || comp->attr.artificial)
    3594              :             {
    3595            2 :               if (last_name)
    3596            0 :                 gfc_error ("Component initializer without name after component"
    3597              :                            " named %s at %L", last_name,
    3598            0 :                            actual->expr ? &actual->expr->where
    3599              :                                         : &gfc_current_locus);
    3600              :               else
    3601            2 :                 gfc_error ("Too many components in structure constructor at "
    3602            2 :                            "%L", actual->expr ? &actual->expr->where
    3603              :                                               : &gfc_current_locus);
    3604            2 :               goto cleanup;
    3605              :             }
    3606              : 
    3607         9228 :           comp_tail->name = xstrdup (comp->name);
    3608              :         }
    3609              : 
    3610              :       /* Find the current component in the structure definition and check
    3611              :          its access is not private.  */
    3612        10578 :       if (comp)
    3613         9228 :         this_comp = gfc_find_component (sym, comp->name, false, false, NULL);
    3614              :       else
    3615              :         {
    3616         1350 :           this_comp = gfc_find_component (sym, (const char *)comp_tail->name,
    3617              :                                           false, false, NULL);
    3618         1350 :           comp = NULL; /* Reset needed!  */
    3619              :         }
    3620              : 
    3621              :       /* Here we can check if a component name is given which does not
    3622              :          correspond to any component of the defined structure.  */
    3623        10578 :       if (!this_comp)
    3624            8 :         goto cleanup;
    3625              : 
    3626              :       /* For a constant string constructor, make sure the length is
    3627              :          correct; truncate or fill with blanks if needed.  */
    3628        10570 :       if (this_comp->ts.type == BT_CHARACTER && !this_comp->attr.allocatable
    3629         1113 :           && this_comp->ts.u.cl && this_comp->ts.u.cl->length
    3630         1111 :           && this_comp->ts.u.cl->length->expr_type == EXPR_CONSTANT
    3631         1093 :           && this_comp->ts.u.cl->length->ts.type == BT_INTEGER
    3632         1092 :           && actual->expr
    3633         1088 :           && actual->expr->ts.type == BT_CHARACTER
    3634          970 :           && actual->expr->expr_type == EXPR_CONSTANT)
    3635              :         {
    3636          747 :           ptrdiff_t c, e1;
    3637          747 :           c = gfc_mpz_get_hwi (this_comp->ts.u.cl->length->value.integer);
    3638          747 :           e1 = actual->expr->value.character.length;
    3639              : 
    3640          747 :           if (c != e1)
    3641              :             {
    3642          249 :               ptrdiff_t i, to;
    3643          249 :               gfc_char_t *dest;
    3644          249 :               dest = gfc_get_wide_string (c + 1);
    3645              : 
    3646          249 :               to = e1 < c ? e1 : c;
    3647         4482 :               for (i = 0; i < to; i++)
    3648         4233 :                 dest[i] = actual->expr->value.character.string[i];
    3649              : 
    3650         5812 :               for (i = e1; i < c; i++)
    3651         5563 :                 dest[i] = ' ';
    3652              : 
    3653          249 :               dest[c] = '\0';
    3654          249 :               free (actual->expr->value.character.string);
    3655              : 
    3656          249 :               actual->expr->value.character.length = c;
    3657          249 :               actual->expr->value.character.string = dest;
    3658              : 
    3659          249 :               if (warn_line_truncation && c < e1)
    3660           14 :                 gfc_warning_now (OPT_Wcharacter_truncation,
    3661              :                                  "CHARACTER expression will be truncated "
    3662              :                                  "in constructor (%td/%td) at %L", c,
    3663              :                                  e1, &actual->expr->where);
    3664              :             }
    3665              :         }
    3666              : 
    3667        10570 :       comp_tail->val = actual->expr;
    3668        10570 :       if (actual->expr != NULL)
    3669        10565 :         comp_tail->where = actual->expr->where;
    3670        10570 :       actual->expr = NULL;
    3671              : 
    3672              :       /* Check if this component is already given a value.  */
    3673        16783 :       for (comp_iter = comp_head; comp_iter != comp_tail;
    3674         6213 :            comp_iter = comp_iter->next)
    3675              :         {
    3676         6214 :           gcc_assert (comp_iter);
    3677         6214 :           if (!strcmp (comp_iter->name, comp_tail->name))
    3678              :             {
    3679            1 :               gfc_error ("Component %qs is initialized twice in the structure"
    3680              :                          " constructor at %L", comp_tail->name,
    3681              :                          comp_tail->val ? &comp_tail->where
    3682              :                                         : &gfc_current_locus);
    3683            1 :               goto cleanup;
    3684              :             }
    3685              :         }
    3686              : 
    3687              :       /* F2008, R457/C725, for PURE C1283.  */
    3688           72 :       if (this_comp->attr.pointer && comp_tail->val
    3689        10641 :           && gfc_is_coindexed (comp_tail->val))
    3690              :         {
    3691            2 :           gfc_error ("Coindexed expression to pointer component %qs in "
    3692              :                      "structure constructor at %L", comp_tail->name,
    3693              :                      &comp_tail->where);
    3694            2 :           goto cleanup;
    3695              :         }
    3696              : 
    3697              :           /* If not explicitly a parent constructor, gather up the components
    3698              :              and build one.  */
    3699        10567 :           if (comp && comp == sym->components
    3700         6411 :               && sym->attr.extension
    3701          780 :               && comp_tail->val
    3702          780 :               && (!gfc_bt_struct (comp_tail->val->ts.type)
    3703           78 :                   || comp_tail->val->ts.u.derived != this_comp->ts.u.derived))
    3704              :             {
    3705          732 :               bool m;
    3706          732 :               gfc_actual_arglist *arg_null = NULL;
    3707              : 
    3708          732 :               actual->expr = comp_tail->val;
    3709          732 :               comp_tail->val = NULL;
    3710              : #define shorter gfc_convert_to_structure_constructor
    3711          732 :               m = shorter (NULL, comp->ts.u.derived, &comp_tail->val,
    3712          732 :                            comp->ts.u.derived->attr.zero_comp ? &arg_null :
    3713              :                                                                 &actual, true);
    3714              : #undef shorter
    3715              : 
    3716          732 :               if (!m)
    3717            0 :                 goto cleanup;
    3718              : 
    3719          732 :               if (comp->ts.u.derived->attr.zero_comp)
    3720              :                 {
    3721          126 :                   comp = comp->next;
    3722          126 :                   continue;
    3723              :                 }
    3724              :             }
    3725              : 
    3726          606 :       if (comp)
    3727         9094 :         comp = comp->next;
    3728        10441 :       if (parent && !comp)
    3729              :         break;
    3730              : 
    3731         9836 :       if (actual)
    3732         9835 :         actual = actual->next;
    3733              :     }
    3734              : 
    3735         7263 :   if (!build_actual_constructor (&comp_head, &ctor_head, sym))
    3736           12 :     goto cleanup;
    3737              : 
    3738              :   /* No component should be left, as this should have caused an error in the
    3739              :      loop constructing the component-list (name that does not correspond to any
    3740              :      component in the structure definition).  */
    3741         7251 :   if (comp_head && sym->attr.extension)
    3742              :     {
    3743            2 :       for (comp_iter = comp_head; comp_iter; comp_iter = comp_iter->next)
    3744              :         {
    3745            1 :           gfc_error ("component %qs at %L has already been set by a "
    3746              :                      "parent derived type constructor", comp_iter->name,
    3747              :                      &comp_iter->where);
    3748              :         }
    3749            1 :       goto cleanup;
    3750              :     }
    3751              :   else
    3752         7250 :     gcc_assert (!comp_head);
    3753              : 
    3754         7250 :   if (parent)
    3755              :     {
    3756          732 :       expr = gfc_get_structure_constructor_expr (BT_DERIVED, 0, &gfc_current_locus);
    3757          732 :       expr->ts.u.derived = sym;
    3758          732 :       expr->value.constructor = ctor_head;
    3759          732 :       *cexpr = expr;
    3760              :     }
    3761              :   else
    3762              :     {
    3763         6518 :       expr->ts.u.derived = sym;
    3764         6518 :       expr->ts.kind = 0;
    3765         6518 :       expr->ts.type = BT_DERIVED;
    3766         6518 :       expr->value.constructor = ctor_head;
    3767         6518 :       expr->expr_type = EXPR_STRUCTURE;
    3768              :     }
    3769              : 
    3770         7250 :   gfc_current_locus = old_locus;
    3771         7250 :   if (parent)
    3772          732 :     *arglist = actual;
    3773              :   return true;
    3774              : 
    3775           28 :   cleanup:
    3776           28 :   gfc_current_locus = old_locus;
    3777              : 
    3778           52 :   for (comp_iter = comp_head; comp_iter; )
    3779              :     {
    3780           24 :       gfc_structure_ctor_component *next = comp_iter->next;
    3781           24 :       gfc_free_structure_ctor_component (comp_iter);
    3782           24 :       comp_iter = next;
    3783              :     }
    3784           28 :   gfc_constructor_free (ctor_head);
    3785              : 
    3786           28 :   return false;
    3787              : }
    3788              : 
    3789              : 
    3790              : match
    3791           60 : gfc_match_structure_constructor (gfc_symbol *sym, gfc_symtree *symtree,
    3792              :                                  gfc_expr **result)
    3793              : {
    3794           60 :   match m;
    3795           60 :   gfc_expr *e;
    3796           60 :   bool t = true;
    3797              : 
    3798           60 :   e = gfc_get_expr ();
    3799           60 :   e->expr_type = EXPR_FUNCTION;
    3800           60 :   e->symtree = symtree;
    3801           60 :   e->where = gfc_current_locus;
    3802              : 
    3803           60 :   gcc_assert (gfc_fl_struct (sym->attr.flavor)
    3804              :               && symtree->n.sym->attr.flavor == FL_PROCEDURE);
    3805           60 :   e->value.function.esym = sym;
    3806           60 :   e->symtree->n.sym->attr.generic = 1;
    3807              : 
    3808           60 :   m = gfc_match_actual_arglist (0, &e->value.function.actual);
    3809           60 :   if (m != MATCH_YES)
    3810              :     {
    3811            0 :       gfc_free_expr (e);
    3812            0 :       return m;
    3813              :     }
    3814              : 
    3815           60 :   if (!gfc_convert_to_structure_constructor (e, sym, NULL, NULL, false))
    3816              :     {
    3817            1 :       gfc_free_expr (e);
    3818            1 :       return MATCH_ERROR;
    3819              :     }
    3820              : 
    3821              :   /* If a structure constructor is in a DATA statement, then each entity
    3822              :      in the structure constructor must be a constant.  Try to reduce the
    3823              :      expression here.  */
    3824           59 :   if (gfc_in_match_data ())
    3825           59 :     t = gfc_reduce_init_expr (e);
    3826              : 
    3827           59 :   if (t)
    3828              :     {
    3829           49 :       *result = e;
    3830           49 :       return MATCH_YES;
    3831              :     }
    3832              :   else
    3833              :     {
    3834           10 :       gfc_free_expr (e);
    3835           10 :       return MATCH_ERROR;
    3836              :     }
    3837              : }
    3838              : 
    3839              : 
    3840              : /* If the symbol is an implicit do loop index and implicitly typed,
    3841              :    it should not be host associated.  Provide a symtree from the
    3842              :    current namespace.  */
    3843              : static match
    3844      6904434 : check_for_implicit_index (gfc_symtree **st, gfc_symbol **sym)
    3845              : {
    3846      6904434 :   if ((*sym)->attr.flavor == FL_VARIABLE
    3847      1999352 :       && (*sym)->ns != gfc_current_ns
    3848        61147 :       && (*sym)->attr.implied_index
    3849          588 :       && (*sym)->attr.implicit_type
    3850           32 :       && !(*sym)->attr.use_assoc)
    3851              :     {
    3852           32 :       int i;
    3853           32 :       i = gfc_get_sym_tree ((*sym)->name, NULL, st, false);
    3854           32 :       if (i)
    3855              :         return MATCH_ERROR;
    3856           32 :       *sym = (*st)->n.sym;
    3857              :     }
    3858              :   return MATCH_YES;
    3859              : }
    3860              : 
    3861              : 
    3862              : /* Procedure pointer as function result: Replace the function symbol by the
    3863              :    auto-generated hidden result variable named "ppr@".  */
    3864              : 
    3865              : static bool
    3866      5151688 : replace_hidden_procptr_result (gfc_symbol **sym, gfc_symtree **st)
    3867              : {
    3868              :   /* Check for procedure pointer result variable.  */
    3869      5151688 :   if ((*sym)->attr.function && !(*sym)->attr.external
    3870      1403199 :       && (*sym)->result && (*sym)->result != *sym
    3871        10790 :       && (*sym)->result->attr.proc_pointer
    3872          337 :       && (*sym) == gfc_current_ns->proc_name
    3873          285 :       && (*sym) == (*sym)->result->ns->proc_name
    3874          285 :       && strcmp ("ppr@", (*sym)->result->name) == 0)
    3875              :     {
    3876              :       /* Automatic replacement with "hidden" result variable.  */
    3877          285 :       (*sym)->result->attr.referenced = (*sym)->attr.referenced;
    3878          285 :       *sym = (*sym)->result;
    3879          285 :       *st = gfc_find_symtree ((*sym)->ns->sym_root, (*sym)->name);
    3880          285 :       return true;
    3881              :     }
    3882              :   return false;
    3883              : }
    3884              : 
    3885              : 
    3886              : /* Matches a variable name followed by anything that might follow it--
    3887              :    array reference, argument list of a function, etc.  */
    3888              : 
    3889              : match
    3890      4251657 : gfc_match_rvalue (gfc_expr **result)
    3891              : {
    3892      4251657 :   gfc_actual_arglist *actual_arglist;
    3893      4251657 :   char name[GFC_MAX_SYMBOL_LEN + 1], argname[GFC_MAX_SYMBOL_LEN + 1];
    3894      4251657 :   gfc_state_data *st;
    3895      4251657 :   gfc_symbol *sym;
    3896      4251657 :   gfc_symtree *symtree;
    3897      4251657 :   locus where, old_loc;
    3898      4251657 :   gfc_expr *e;
    3899      4251657 :   match m, m2;
    3900      4251657 :   int i;
    3901      4251657 :   gfc_typespec *ts;
    3902      4251657 :   bool implicit_char;
    3903      4251657 :   gfc_ref *ref;
    3904      4251657 :   gfc_symtree *pdt_st;
    3905              : 
    3906      4251657 :   m = gfc_match ("%%loc");
    3907      4251657 :   if (m == MATCH_YES)
    3908              :     {
    3909        10878 :       if (!gfc_notify_std (GFC_STD_LEGACY, "%%LOC() as an rvalue at %C"))
    3910              :         return MATCH_ERROR;
    3911        10877 :       strncpy (name, "loc", 4);
    3912              :     }
    3913              : 
    3914              :   else
    3915              :     {
    3916      4240779 :       m = gfc_match_name (name);
    3917      4240779 :       if (m != MATCH_YES)
    3918              :         return m;
    3919              :     }
    3920              : 
    3921              :   /* Check if the symbol exists.  */
    3922      4047637 :   if (gfc_find_sym_tree (name, NULL, 1, &symtree))
    3923              :     return MATCH_ERROR;
    3924              : 
    3925              :   /* If the symbol doesn't exist, create it unless the name matches a FL_STRUCT
    3926              :      type. For derived types we create a generic symbol which links to the
    3927              :      derived type symbol; STRUCTUREs are simpler and must not conflict with
    3928              :      variables.  */
    3929      4047635 :   if (!symtree)
    3930       179433 :     if (gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree))
    3931              :       return MATCH_ERROR;
    3932      4047635 :   if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
    3933              :     {
    3934      4047635 :       if (gfc_find_state (COMP_INTERFACE)
    3935      4047635 :           && !gfc_current_ns->has_import_set)
    3936        93602 :         i = gfc_get_sym_tree (name, NULL, &symtree, false);
    3937              :       else
    3938      3954033 :         i = gfc_get_ha_sym_tree (name, &symtree);
    3939      4047635 :       if (i)
    3940              :         return MATCH_ERROR;
    3941              :     }
    3942              : 
    3943              : 
    3944      4047635 :   sym = symtree->n.sym;
    3945      4047635 :   e = NULL;
    3946      4047635 :   where = gfc_current_locus;
    3947              : 
    3948      4047635 :   replace_hidden_procptr_result (&sym, &symtree);
    3949              : 
    3950              :   /* If this is an implicit do loop index and implicitly typed,
    3951              :      it should not be host associated.  */
    3952      4047635 :   m = check_for_implicit_index (&symtree, &sym);
    3953      4047635 :   if (m != MATCH_YES)
    3954              :     return m;
    3955              : 
    3956      4047635 :   gfc_set_sym_referenced (sym);
    3957      4047635 :   sym->attr.implied_index = 0;
    3958              : 
    3959      4047635 :   if (sym->attr.function && sym->result == sym)
    3960              :     {
    3961              :       /* See if this is a directly recursive function call.  */
    3962       705383 :       gfc_gobble_whitespace ();
    3963       705383 :       if (sym->attr.recursive
    3964          100 :           && gfc_peek_ascii_char () == '('
    3965           93 :           && gfc_current_ns->proc_name == sym
    3966       705390 :           && !sym->attr.dimension)
    3967              :         {
    3968            4 :           gfc_error ("%qs at %C is the name of a recursive function "
    3969              :                      "and so refers to the result variable. Use an "
    3970              :                      "explicit RESULT variable for direct recursion "
    3971              :                      "(12.5.2.1)", sym->name);
    3972            4 :           return MATCH_ERROR;
    3973              :         }
    3974              : 
    3975       705379 :       if (gfc_is_function_return_value (sym, gfc_current_ns))
    3976         1701 :         goto variable;
    3977              : 
    3978       703678 :       if (sym->attr.entry
    3979          187 :           && (sym->ns == gfc_current_ns
    3980           27 :               || sym->ns == gfc_current_ns->parent))
    3981              :         {
    3982          180 :           gfc_entry_list *el = NULL;
    3983              : 
    3984          180 :           for (el = sym->ns->entries; el; el = el->next)
    3985          180 :             if (sym == el->sym)
    3986          180 :               goto variable;
    3987              :         }
    3988              :     }
    3989              : 
    3990      4045750 :   if (gfc_matching_procptr_assignment)
    3991              :     {
    3992              :       /* It can be a procedure or a derived-type procedure or a not-yet-known
    3993              :          type.  */
    3994         1345 :       if (sym->attr.flavor != FL_UNKNOWN
    3995          997 :           && sym->attr.flavor != FL_PROCEDURE
    3996              :           && sym->attr.flavor != FL_PARAMETER
    3997              :           && sym->attr.flavor != FL_VARIABLE)
    3998              :         {
    3999            2 :           gfc_error ("Symbol at %C is not appropriate for an expression");
    4000            2 :           return MATCH_ERROR;
    4001              :         }
    4002         1343 :       goto procptr0;
    4003              :     }
    4004              : 
    4005      4044405 :   if (sym->attr.function || sym->attr.external || sym->attr.intrinsic)
    4006       718108 :     goto function0;
    4007              : 
    4008      3326297 :   if (sym->attr.generic)
    4009        67892 :     goto generic_function;
    4010              : 
    4011      3258405 :   switch (sym->attr.flavor)
    4012              :     {
    4013      1731732 :     case FL_VARIABLE:
    4014      1731732 :     variable:
    4015      1731732 :       e = gfc_get_expr ();
    4016              : 
    4017      1731732 :       e->expr_type = EXPR_VARIABLE;
    4018      1731732 :       e->symtree = symtree;
    4019              : 
    4020      1731732 :       m = gfc_match_varspec (e, 0, false, true);
    4021      1731732 :       break;
    4022              : 
    4023       222953 :     case FL_PARAMETER:
    4024              :       /* A statement of the form "REAL, parameter :: a(0:10) = 1" will
    4025              :          end up here.  Unfortunately, sym->value->expr_type is set to
    4026              :          EXPR_CONSTANT, and so the if () branch would be followed without
    4027              :          the !sym->as check.  */
    4028       222953 :       if (sym->value && sym->value->expr_type != EXPR_ARRAY && !sym->as)
    4029       188391 :         e = gfc_copy_expr (sym->value);
    4030              :       else
    4031              :         {
    4032        34562 :           e = gfc_get_expr ();
    4033        34562 :           e->expr_type = EXPR_VARIABLE;
    4034              :         }
    4035              : 
    4036       222953 :       e->symtree = symtree;
    4037       222953 :       m = gfc_match_varspec (e, 0, false, true);
    4038              : 
    4039       222953 :       if (sym->ts.is_c_interop || sym->ts.is_iso_c)
    4040              :         break;
    4041              : 
    4042              :       /* Variable array references to derived type parameters cause
    4043              :          all sorts of headaches in simplification. Treating such
    4044              :          expressions as variable works just fine for all array
    4045              :          references.  */
    4046       173769 :       if (sym->value && sym->ts.type == BT_DERIVED && e->ref)
    4047              :         {
    4048         2828 :           for (ref = e->ref; ref; ref = ref->next)
    4049         2642 :             if (ref->type == REF_ARRAY)
    4050              :               break;
    4051              : 
    4052         2597 :           if (ref == NULL || ref->u.ar.type == AR_FULL)
    4053              :             break;
    4054              : 
    4055         1002 :           ref = e->ref;
    4056         1002 :           e->ref = NULL;
    4057         1002 :           gfc_free_expr (e);
    4058         1002 :           e = gfc_get_expr ();
    4059         1002 :           e->expr_type = EXPR_VARIABLE;
    4060         1002 :           e->symtree = symtree;
    4061         1002 :           e->ref = ref;
    4062              :         }
    4063              : 
    4064              :       break;
    4065              : 
    4066            0 :     case FL_STRUCT:
    4067            0 :     case FL_DERIVED:
    4068            0 :       sym = gfc_use_derived (sym);
    4069            0 :       if (sym == NULL)
    4070              :         m = MATCH_ERROR;
    4071              :       else
    4072            0 :         goto generic_function;
    4073              :       break;
    4074              : 
    4075              :     /* If we're here, then the name is known to be the name of a
    4076              :        procedure, yet it is not sure to be the name of a function.  */
    4077      1016670 :     case FL_PROCEDURE:
    4078              : 
    4079              :     /* Procedure Pointer Assignments.  */
    4080      1016670 :     procptr0:
    4081      1016670 :       if (gfc_matching_procptr_assignment)
    4082              :         {
    4083         1343 :           gfc_gobble_whitespace ();
    4084         1343 :           if (!sym->attr.dimension && gfc_peek_ascii_char () == '(')
    4085              :             /* Parse functions returning a procptr.  */
    4086          210 :             goto function0;
    4087              : 
    4088         1133 :           e = gfc_get_expr ();
    4089         1133 :           e->expr_type = EXPR_VARIABLE;
    4090         1133 :           e->symtree = symtree;
    4091         1133 :           m = gfc_match_varspec (e, 0, false, true);
    4092         1065 :           if (!e->ref && sym->attr.flavor == FL_UNKNOWN
    4093          203 :               && sym->ts.type == BT_UNKNOWN
    4094         1326 :               && !gfc_add_flavor (&sym->attr, FL_PROCEDURE, sym->name, NULL))
    4095              :             {
    4096              :               m = MATCH_ERROR;
    4097              :               break;
    4098              :             }
    4099              :           break;
    4100              :         }
    4101              : 
    4102      1015327 :       if (sym->attr.subroutine)
    4103              :         {
    4104           57 :           gfc_error ("Unexpected use of subroutine name %qs at %C",
    4105              :                      sym->name);
    4106           57 :           m = MATCH_ERROR;
    4107           57 :           break;
    4108              :         }
    4109              : 
    4110              :       /* At this point, the name has to be a non-statement function.
    4111              :          If the name is the same as the current function being
    4112              :          compiled, then we have a variable reference (to the function
    4113              :          result) if the name is non-recursive.  */
    4114              : 
    4115      1015270 :       st = gfc_enclosing_unit (NULL);
    4116              : 
    4117      1015270 :       if (st != NULL
    4118       970763 :           && st->state == COMP_FUNCTION
    4119        84179 :           && st->sym == sym
    4120            0 :           && !sym->attr.recursive)
    4121              :         {
    4122            0 :           e = gfc_get_expr ();
    4123            0 :           e->symtree = symtree;
    4124            0 :           e->expr_type = EXPR_VARIABLE;
    4125              : 
    4126            0 :           m = gfc_match_varspec (e, 0, false, true);
    4127            0 :           break;
    4128              :         }
    4129              : 
    4130              :     /* Match a function reference.  */
    4131      1015270 :     function0:
    4132      1733588 :       m = gfc_match_actual_arglist (0, &actual_arglist);
    4133      1733588 :       if (m == MATCH_NO)
    4134              :         {
    4135       599993 :           if (sym->attr.proc == PROC_ST_FUNCTION)
    4136            1 :             gfc_error ("Statement function %qs requires argument list at %C",
    4137              :                        sym->name);
    4138              :           else
    4139       599992 :             gfc_error ("Function %qs requires an argument list at %C",
    4140              :                        sym->name);
    4141              : 
    4142              :           m = MATCH_ERROR;
    4143              :           break;
    4144              :         }
    4145              : 
    4146      1133595 :       if (m != MATCH_YES)
    4147              :         {
    4148              :           m = MATCH_ERROR;
    4149              :           break;
    4150              :         }
    4151              : 
    4152              :       /* Check to see if this is a PDT constructor.  The format of these
    4153              :          constructors is rather unusual:
    4154              :                 name [(type_params)](component_values)
    4155              :          where, component_values excludes the type_params. With the present
    4156              :          gfortran representation this is rather awkward because the two are not
    4157              :          distinguished, other than by their attributes.
    4158              : 
    4159              :          Even if 'name' is that of a PDT template, priority has to be given to
    4160              :          specific procedures, other than the constructor, in the generic
    4161              :          interface.  */
    4162              : 
    4163      1101158 :       gfc_gobble_whitespace ();
    4164      1101158 :       gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &pdt_st);
    4165        10990 :       if (sym->attr.generic && pdt_st != NULL
    4166      1110182 :           && !(sym->generic->next && gfc_peek_ascii_char() != '('))
    4167              :         {
    4168         8736 :           gfc_symbol *pdt_sym;
    4169         8736 :           gfc_actual_arglist *ctr_arglist = NULL, *tmp;
    4170         8736 :           gfc_component *c;
    4171              : 
    4172              :           /* Use the template.  */
    4173         8736 :           if (pdt_st->n.sym && pdt_st->n.sym->attr.pdt_template)
    4174              :             {
    4175          987 :               bool type_spec_list = false;
    4176          987 :               pdt_sym = pdt_st->n.sym;
    4177          987 :               gfc_gobble_whitespace ();
    4178              :               /* Look for a second actual arglist. If present, try the first
    4179              :                  for the type parameters. Otherwise, or if there is no match,
    4180              :                  depend on default values by setting the type parameters to
    4181              :                  NULL.  */
    4182          987 :               if (gfc_peek_ascii_char() == '(')
    4183          213 :                 type_spec_list = true;
    4184          987 :               if (!actual_arglist && !type_spec_list)
    4185              :                 {
    4186            3 :                   gfc_error_now ("F2023 R755: The empty type specification at %C "
    4187              :                                  "is not allowed");
    4188            3 :                   m = MATCH_ERROR;
    4189            3 :                   break;
    4190              :                 }
    4191              :               /* Generate this instance using the type parameters from the
    4192              :                  first argument list and return the parameter list in
    4193              :                  ctr_arglist.  */
    4194          984 :               m = gfc_get_pdt_instance (actual_arglist, &pdt_sym, &ctr_arglist);
    4195          984 :               if (m != MATCH_YES || !ctr_arglist)
    4196              :                 {
    4197           43 :                   if (ctr_arglist)
    4198            0 :                     gfc_free_actual_arglist (ctr_arglist);
    4199              :                   /* See if all the type parameters have default values.  */
    4200           43 :                   m = gfc_get_pdt_instance (NULL, &pdt_sym, &ctr_arglist);
    4201           43 :                   if (m != MATCH_YES)
    4202              :                     {
    4203              :                       m = MATCH_NO;
    4204              :                       break;
    4205              :                     }
    4206              :                 }
    4207              : 
    4208              :               /* Now match the component_values if the type parameters were
    4209              :                  present.  */
    4210          975 :               if (type_spec_list)
    4211              :                 {
    4212          213 :                   m = gfc_match_actual_arglist (0, &actual_arglist);
    4213          213 :                   if (m != MATCH_YES)
    4214              :                     {
    4215              :                       m = MATCH_ERROR;
    4216              :                       break;
    4217              :                     }
    4218              :                 }
    4219              : 
    4220              :               /* Make sure that the component names are in place so that this
    4221              :                  list can be safely appended to the type parameters.  */
    4222          975 :               tmp = actual_arglist;
    4223         3274 :               for (c = pdt_sym->components; c && tmp; c = c->next)
    4224              :                 {
    4225         2299 :                   if (c->attr.pdt_kind || c->attr.pdt_len)
    4226         1225 :                     continue;
    4227         1074 :                   tmp->name = c->name;
    4228         1074 :                   tmp = tmp->next;
    4229              :                 }
    4230              : 
    4231          975 :               gfc_find_sym_tree (gfc_dt_lower_string (pdt_sym->name),
    4232              :                                  NULL, 1, &symtree);
    4233          975 :               if (!symtree)
    4234              :                 {
    4235          436 :                   gfc_get_ha_sym_tree (gfc_dt_lower_string (pdt_sym->name) ,
    4236              :                                        &symtree);
    4237          436 :                   symtree->n.sym = pdt_sym;
    4238          436 :                   symtree->n.sym->ts.u.derived = pdt_sym;
    4239          436 :                   symtree->n.sym->ts.type = BT_DERIVED;
    4240              :                 }
    4241              : 
    4242          975 :               if (type_spec_list)
    4243              :                 {
    4244              :                   /* Append the type_params and the component_values.  */
    4245          239 :                   for (tmp = ctr_arglist; tmp && tmp->next;)
    4246              :                     tmp = tmp->next;
    4247          213 :                   tmp->next = actual_arglist;
    4248          213 :                   actual_arglist = ctr_arglist;
    4249          213 :                   tmp = actual_arglist;
    4250              :                   /* Can now add all the component names.  */
    4251          697 :                   for (c = pdt_sym->components; c && tmp; c = c->next)
    4252              :                     {
    4253          484 :                       tmp->name = c->name;
    4254          484 :                       tmp = tmp->next;
    4255              :                     }
    4256              :                 }
    4257              :             }
    4258              :         }
    4259              : 
    4260      1101146 :       gfc_get_ha_sym_tree (name, &symtree); /* Can't fail */
    4261      1101146 :       sym = symtree->n.sym;
    4262              : 
    4263      1101146 :       replace_hidden_procptr_result (&sym, &symtree);
    4264              : 
    4265      1101146 :       e = gfc_get_expr ();
    4266      1101146 :       e->symtree = symtree;
    4267      1101146 :       e->expr_type = EXPR_FUNCTION;
    4268      1101146 :       e->value.function.actual = actual_arglist;
    4269      1101146 :       e->where = gfc_current_locus;
    4270              : 
    4271      1101146 :       if (sym->ts.type == BT_CLASS && sym->attr.class_ok
    4272          206 :           && CLASS_DATA (sym)->as)
    4273              :         {
    4274           91 :           e->rank = CLASS_DATA (sym)->as->rank;
    4275           91 :           e->corank = CLASS_DATA (sym)->as->corank;
    4276              :         }
    4277      1101055 :       else if (sym->as != NULL)
    4278              :         {
    4279         1157 :           e->rank = sym->as->rank;
    4280         1157 :           e->corank = sym->as->corank;
    4281              :         }
    4282              : 
    4283      1101146 :       if (!sym->attr.function
    4284      1101146 :           && !gfc_add_function (&sym->attr, sym->name, NULL))
    4285              :         {
    4286              :           m = MATCH_ERROR;
    4287              :           break;
    4288              :         }
    4289              : 
    4290              :       /* Check here for the existence of at least one argument for the
    4291              :          iso_c_binding functions C_LOC, C_FUNLOC, and C_ASSOCIATED.  */
    4292      1101146 :       if (sym->attr.is_iso_c == 1
    4293            2 :           && (sym->from_intmod == INTMOD_ISO_C_BINDING
    4294            2 :               && (sym->intmod_sym_id == ISOCBINDING_LOC
    4295            2 :                   || sym->intmod_sym_id == ISOCBINDING_F_C_STRING
    4296            2 :                   || sym->intmod_sym_id == ISOCBINDING_FUNLOC
    4297            2 :                   || sym->intmod_sym_id == ISOCBINDING_ASSOCIATED)))
    4298              :         {
    4299              :           /* make sure we were given a param */
    4300            0 :           if (actual_arglist == NULL)
    4301              :             {
    4302            0 :               gfc_error ("Missing argument to %qs at %C", sym->name);
    4303            0 :               m = MATCH_ERROR;
    4304            0 :               break;
    4305              :             }
    4306              :         }
    4307              : 
    4308      1101146 :       if (sym->result == NULL)
    4309       390892 :         sym->result = sym;
    4310              : 
    4311      1101146 :       gfc_gobble_whitespace ();
    4312              :       /* F08:C612.  */
    4313      1101146 :       if (gfc_peek_ascii_char() == '%')
    4314              :         {
    4315           12 :           gfc_error ("The leftmost part-ref in a data-ref cannot be a "
    4316              :                      "function reference at %C");
    4317           12 :           m = MATCH_ERROR;
    4318           12 :           break;
    4319              :         }
    4320              : 
    4321              :       m = MATCH_YES;
    4322              :       break;
    4323              : 
    4324       288708 :     case FL_UNKNOWN:
    4325              : 
    4326              :       /* Special case for derived type variables that get their types
    4327              :          via an IMPLICIT statement.  This can't wait for the
    4328              :          resolution phase.  */
    4329              : 
    4330       288708 :       old_loc = gfc_current_locus;
    4331       288708 :       if (gfc_match_member_sep (sym) == MATCH_YES
    4332        10347 :           && sym->ts.type == BT_UNKNOWN
    4333       288714 :           && gfc_get_default_type (sym->name, sym->ns)->type == BT_DERIVED)
    4334            0 :         gfc_set_default_type (sym, 0, sym->ns);
    4335       288708 :       gfc_current_locus = old_loc;
    4336              : 
    4337              :       /* If the symbol has a (co)dimension attribute, the expression is a
    4338              :          variable.  */
    4339              : 
    4340       288708 :       if (sym->attr.dimension || sym->attr.codimension)
    4341              :         {
    4342        35508 :           if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
    4343              :             {
    4344              :               m = MATCH_ERROR;
    4345              :               break;
    4346              :             }
    4347              : 
    4348        35508 :           e = gfc_get_expr ();
    4349        35508 :           e->symtree = symtree;
    4350        35508 :           e->expr_type = EXPR_VARIABLE;
    4351        35508 :           m = gfc_match_varspec (e, 0, false, true);
    4352        35508 :           break;
    4353              :         }
    4354              : 
    4355       253200 :       if (sym->ts.type == BT_CLASS && sym->attr.class_ok
    4356         4844 :           && (CLASS_DATA (sym)->attr.dimension
    4357         3382 :               || CLASS_DATA (sym)->attr.codimension))
    4358              :         {
    4359         1559 :           if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
    4360              :             {
    4361              :               m = MATCH_ERROR;
    4362              :               break;
    4363              :             }
    4364              : 
    4365         1559 :           e = gfc_get_expr ();
    4366         1559 :           e->symtree = symtree;
    4367         1559 :           e->expr_type = EXPR_VARIABLE;
    4368         1559 :           m = gfc_match_varspec (e, 0, false, true);
    4369         1559 :           break;
    4370              :         }
    4371              : 
    4372              :       /* Name is not an array, so we peek to see if a '(' implies a
    4373              :          function call or a substring reference.  Otherwise the
    4374              :          variable is just a scalar.  */
    4375              : 
    4376       251641 :       gfc_gobble_whitespace ();
    4377       251641 :       if (gfc_peek_ascii_char () != '(')
    4378              :         {
    4379              :           /* Assume a scalar variable */
    4380        76782 :           e = gfc_get_expr ();
    4381        76782 :           e->symtree = symtree;
    4382        76782 :           e->expr_type = EXPR_VARIABLE;
    4383              : 
    4384        76782 :           if (!gfc_add_flavor (&sym->attr, FL_VARIABLE, sym->name, NULL))
    4385              :             {
    4386              :               m = MATCH_ERROR;
    4387              :               break;
    4388              :             }
    4389              : 
    4390              :           /*FIXME:??? gfc_match_varspec does set this for us: */
    4391        76782 :           e->ts = sym->ts;
    4392        76782 :           m = gfc_match_varspec (e, 0, false, true);
    4393        76782 :           break;
    4394              :         }
    4395              : 
    4396              :       /* See if this is a function reference with a keyword argument
    4397              :          as first argument. We do this because otherwise a spurious
    4398              :          symbol would end up in the symbol table.  */
    4399              : 
    4400       174859 :       old_loc = gfc_current_locus;
    4401       174859 :       m2 = gfc_match (" ( %n =", argname);
    4402       174859 :       gfc_current_locus = old_loc;
    4403              : 
    4404       174859 :       e = gfc_get_expr ();
    4405       174859 :       e->symtree = symtree;
    4406              : 
    4407       174859 :       if (m2 != MATCH_YES)
    4408              :         {
    4409              :           /* Try to figure out whether we're dealing with a character type.
    4410              :              We're peeking ahead here, because we don't want to call
    4411              :              match_substring if we're dealing with an implicitly typed
    4412              :              non-character variable.  */
    4413       173775 :           implicit_char = false;
    4414       173775 :           if (sym->ts.type == BT_UNKNOWN)
    4415              :             {
    4416       169000 :               ts = gfc_get_default_type (sym->name, NULL);
    4417       169000 :               if (ts->type == BT_CHARACTER)
    4418              :                 implicit_char = true;
    4419              :             }
    4420              : 
    4421              :           /* See if this could possibly be a substring reference of a name
    4422              :              that we're not sure is a variable yet.  */
    4423              : 
    4424       173758 :           if ((implicit_char || sym->ts.type == BT_CHARACTER)
    4425         1449 :               && match_substring (sym->ts.u.cl, 0, &e->ref, false) == MATCH_YES)
    4426              :             {
    4427              : 
    4428          985 :               e->expr_type = EXPR_VARIABLE;
    4429              : 
    4430          985 :               if (sym->attr.flavor != FL_VARIABLE
    4431          985 :                   && !gfc_add_flavor (&sym->attr, FL_VARIABLE,
    4432              :                                       sym->name, NULL))
    4433              :                 {
    4434              :                   m = MATCH_ERROR;
    4435              :                   break;
    4436              :                 }
    4437              : 
    4438          985 :               if (sym->ts.type == BT_UNKNOWN
    4439          985 :                   && !gfc_set_default_type (sym, 1, NULL))
    4440              :                 {
    4441              :                   m = MATCH_ERROR;
    4442              :                   break;
    4443              :                 }
    4444              : 
    4445          985 :               e->ts = sym->ts;
    4446          985 :               if (e->ref)
    4447          960 :                 e->ts.u.cl = NULL;
    4448              :               m = MATCH_YES;
    4449              :               break;
    4450              :             }
    4451              :         }
    4452              : 
    4453              :       /* Give up, assume we have a function.  */
    4454              : 
    4455       173874 :       gfc_get_sym_tree (name, NULL, &symtree, false);       /* Can't fail */
    4456       173874 :       sym = symtree->n.sym;
    4457       173874 :       e->expr_type = EXPR_FUNCTION;
    4458              : 
    4459       173874 :       if (!sym->attr.function
    4460       173874 :           && !gfc_add_function (&sym->attr, sym->name, NULL))
    4461              :         {
    4462              :           m = MATCH_ERROR;
    4463              :           break;
    4464              :         }
    4465              : 
    4466       173874 :       sym->result = sym;
    4467              : 
    4468       173874 :       m = gfc_match_actual_arglist (0, &e->value.function.actual);
    4469       173874 :       if (m == MATCH_NO)
    4470            0 :         gfc_error ("Missing argument list in function %qs at %C", sym->name);
    4471              : 
    4472       173874 :       if (m != MATCH_YES)
    4473              :         {
    4474              :           m = MATCH_ERROR;
    4475              :           break;
    4476              :         }
    4477              : 
    4478              :       /* If our new function returns a character, array or structure
    4479              :          type, it might have subsequent references.  */
    4480              : 
    4481       173744 :       m = gfc_match_varspec (e, 0, false, true);
    4482       173744 :       if (m == MATCH_NO)
    4483              :         m = MATCH_YES;
    4484              : 
    4485              :       break;
    4486              : 
    4487        67892 :     generic_function:
    4488              :       /* Look for symbol first; if not found, look for STRUCTURE type symbol
    4489              :          specially. Creates a generic symbol for derived types.  */
    4490        67892 :       gfc_find_sym_tree (name, NULL, 1, &symtree);
    4491        67892 :       if (!symtree)
    4492            0 :         gfc_find_sym_tree (gfc_dt_upper_string (name), NULL, 1, &symtree);
    4493        67892 :       if (!symtree || symtree->n.sym->attr.flavor != FL_STRUCT)
    4494        67892 :         gfc_get_sym_tree (name, NULL, &symtree, false); /* Can't fail */
    4495              : 
    4496        67892 :       e = gfc_get_expr ();
    4497        67892 :       e->symtree = symtree;
    4498        67892 :       e->expr_type = EXPR_FUNCTION;
    4499              : 
    4500        67892 :       if (gfc_fl_struct (sym->attr.flavor))
    4501              :         {
    4502            0 :           e->value.function.esym = sym;
    4503            0 :           e->symtree->n.sym->attr.generic = 1;
    4504              :         }
    4505              : 
    4506        67892 :       m = gfc_match_actual_arglist (0, &e->value.function.actual);
    4507        67892 :       break;
    4508              : 
    4509              :     case FL_NAMELIST:
    4510              :       m = MATCH_ERROR;
    4511              :       break;
    4512              : 
    4513            5 :     default:
    4514            5 :       gfc_error ("Symbol at %C is not appropriate for an expression");
    4515            5 :       return MATCH_ERROR;
    4516              :     }
    4517              : 
    4518              :   /* Scan for possible inquiry references.  */
    4519           81 :   if (m == MATCH_YES
    4520      3413237 :       && e->expr_type == EXPR_VARIABLE
    4521      4189838 :       && gfc_peek_ascii_char () == '%')
    4522              :       {
    4523           14 :         m = gfc_match_varspec (e, 0, false, false);
    4524           14 :         if (m == MATCH_NO)
    4525              :           m = MATCH_YES;
    4526              :       }
    4527              : 
    4528      4047623 :   if (m == MATCH_YES)
    4529              :     {
    4530      3413237 :       e->where = where;
    4531      3413237 :       *result = e;
    4532              :     }
    4533              :   else
    4534       634386 :     gfc_free_expr (e);
    4535              : 
    4536              :   return m;
    4537              : }
    4538              : 
    4539              : 
    4540              : /* Match a variable, i.e. something that can be assigned to.  This
    4541              :    starts as a symbol, can be a structure component or an array
    4542              :    reference.  It can be a function if the function doesn't have a
    4543              :    separate RESULT variable.  If the symbol has not been previously
    4544              :    seen, we assume it is a variable.
    4545              : 
    4546              :    This function is called by two interface functions:
    4547              :    gfc_match_variable, which has host_flag = 1, and
    4548              :    gfc_match_equiv_variable, with host_flag = 0, to restrict the
    4549              :    match of the symbol to the local scope.  */
    4550              : 
    4551              : static match
    4552      2856829 : match_variable (gfc_expr **result, int equiv_flag, int host_flag)
    4553              : {
    4554      2856829 :   gfc_symbol *sym, *dt_sym;
    4555      2856829 :   gfc_symtree *st;
    4556      2856829 :   gfc_expr *expr;
    4557      2856829 :   locus where, old_loc;
    4558      2856829 :   match m;
    4559              : 
    4560      2856829 :   *result = NULL;
    4561              : 
    4562              :   /* Since nothing has any business being an lvalue in a module
    4563              :      specification block, an interface block or a contains section,
    4564              :      we force the changed_symbols mechanism to work by setting
    4565              :      host_flag to 0. This prevents valid symbols that have the name
    4566              :      of keywords, such as 'end', being turned into variables by
    4567              :      failed matching to assignments for, e.g., END INTERFACE.  */
    4568      2856829 :   if (gfc_current_state () == COMP_MODULE
    4569      2856829 :       || gfc_current_state () == COMP_SUBMODULE
    4570              :       || gfc_current_state () == COMP_INTERFACE
    4571              :       || gfc_current_state () == COMP_CONTAINS)
    4572       197288 :     host_flag = 0;
    4573              : 
    4574      2856829 :   where = gfc_current_locus;
    4575      2856829 :   m = gfc_match_sym_tree (&st, host_flag);
    4576      2856828 :   if (m != MATCH_YES)
    4577              :     return m;
    4578              : 
    4579      2856799 :   sym = st->n.sym;
    4580              : 
    4581              :   /* If this is an implicit do loop index and implicitly typed,
    4582              :      it should not be host associated.  */
    4583      2856799 :   m = check_for_implicit_index (&st, &sym);
    4584      2856799 :   if (m != MATCH_YES)
    4585              :     return m;
    4586              : 
    4587      2856799 :   sym->attr.implied_index = 0;
    4588              : 
    4589      2856799 :   gfc_set_sym_referenced (sym);
    4590              : 
    4591              :   /* STRUCTUREs may share names with variables, but derived types may not.  */
    4592        14408 :   if (sym->attr.flavor == FL_PROCEDURE && sym->generic
    4593      2856865 :       && (dt_sym = gfc_find_dt_in_generic (sym)))
    4594              :     {
    4595            5 :       if (dt_sym->attr.flavor == FL_DERIVED)
    4596            5 :         gfc_error ("Derived type %qs cannot be used as a variable at %C",
    4597              :                    sym->name);
    4598            5 :       return MATCH_ERROR;
    4599              :     }
    4600              : 
    4601      2856794 :   switch (sym->attr.flavor)
    4602              :     {
    4603              :     case FL_VARIABLE:
    4604              :       /* Everything is alright.  */
    4605              :       break;
    4606              : 
    4607      2572771 :     case FL_UNKNOWN:
    4608      2572771 :       {
    4609      2572771 :         sym_flavor flavor = FL_UNKNOWN;
    4610              : 
    4611      2572771 :         gfc_gobble_whitespace ();
    4612              : 
    4613      2572771 :         if (sym->attr.external || sym->attr.procedure
    4614      2572739 :             || sym->attr.function || sym->attr.subroutine)
    4615              :           flavor = FL_PROCEDURE;
    4616              : 
    4617              :         /* If it is not a procedure, is not typed and is host associated,
    4618              :            we cannot give it a flavor yet.  */
    4619      2572739 :         else if (sym->ns == gfc_current_ns->parent
    4620         2871 :                    && sym->ts.type == BT_UNKNOWN)
    4621              :           break;
    4622              : 
    4623              :         /* These are definitive indicators that this is a variable.  */
    4624      3426627 :         else if (gfc_peek_ascii_char () != '(' || sym->ts.type != BT_UNKNOWN
    4625      3408741 :                  || sym->attr.pointer || sym->as != NULL)
    4626              :           flavor = FL_VARIABLE;
    4627              : 
    4628              :         if (flavor != FL_UNKNOWN
    4629      1737369 :             && !gfc_add_flavor (&sym->attr, flavor, sym->name, NULL))
    4630              :           return MATCH_ERROR;
    4631              :       }
    4632              :       break;
    4633              : 
    4634           17 :     case FL_PARAMETER:
    4635           17 :       if (equiv_flag)
    4636              :         {
    4637            0 :           gfc_error ("Named constant at %C in an EQUIVALENCE");
    4638            0 :           return MATCH_ERROR;
    4639              :         }
    4640           17 :       if (gfc_in_match_data())
    4641              :         {
    4642            4 :           gfc_error ("PARAMETER %qs shall not appear in a DATA statement at %C",
    4643              :                       sym->name);
    4644            4 :           return MATCH_ERROR;
    4645              :         }
    4646              :         /* Otherwise this is checked for an error given in the
    4647              :            variable definition context checks.  */
    4648              :       break;
    4649              : 
    4650        14403 :     case FL_PROCEDURE:
    4651              :       /* Check for a nonrecursive function result variable.  */
    4652        14403 :       if (sym->attr.function
    4653        12314 :           && (!sym->attr.external || sym->abr_modproc_decl)
    4654        11917 :           && sym->result == sym
    4655        25967 :           && (gfc_is_function_return_value (sym, gfc_current_ns)
    4656         2201 :               || (sym->attr.entry
    4657          499 :                   && sym->ns == gfc_current_ns)
    4658         1709 :               || (sym->attr.entry
    4659            7 :                   && sym->ns == gfc_current_ns->parent)))
    4660              :         {
    4661              :           /* If a function result is a derived type, then the derived
    4662              :              type may still have to be resolved.  */
    4663              : 
    4664         9862 :           if (sym->ts.type == BT_DERIVED
    4665         9862 :               && gfc_use_derived (sym->ts.u.derived) == NULL)
    4666              :             return MATCH_ERROR;
    4667              :           break;
    4668              :         }
    4669              : 
    4670         4541 :       if (sym->attr.proc_pointer
    4671         4541 :           || replace_hidden_procptr_result (&sym, &st))
    4672              :         break;
    4673              : 
    4674              :       /* Fall through to error */
    4675         2872 :       gcc_fallthrough ();
    4676              : 
    4677         2872 :     default:
    4678         2872 :       gfc_error ("%qs at %C is not a variable", sym->name);
    4679         2872 :       return MATCH_ERROR;
    4680              :     }
    4681              : 
    4682              :   /* Special case for derived type variables that get their types
    4683              :      via an IMPLICIT statement.  This can't wait for the
    4684              :      resolution phase.  */
    4685              : 
    4686      2853914 :     {
    4687      2853914 :       gfc_namespace * implicit_ns;
    4688              : 
    4689      2853914 :       if (gfc_current_ns->proc_name == sym)
    4690              :         implicit_ns = gfc_current_ns;
    4691              :       else
    4692      2844929 :         implicit_ns = sym->ns;
    4693              : 
    4694      2853914 :       old_loc = gfc_current_locus;
    4695      2853914 :       if (gfc_match_member_sep (sym) == MATCH_YES
    4696        21428 :           && sym->ts.type == BT_UNKNOWN
    4697      2853926 :           && gfc_get_default_type (sym->name, implicit_ns)->type == BT_DERIVED)
    4698            3 :         gfc_set_default_type (sym, 0, implicit_ns);
    4699      2853914 :       gfc_current_locus = old_loc;
    4700              :     }
    4701              : 
    4702      2853914 :   expr = gfc_get_expr ();
    4703              : 
    4704      2853914 :   expr->expr_type = EXPR_VARIABLE;
    4705      2853914 :   expr->symtree = st;
    4706      2853914 :   expr->ts = sym->ts;
    4707              : 
    4708              :   /* Now see if we have to do more.  */
    4709      2853914 :   m = gfc_match_varspec (expr, equiv_flag, false, false);
    4710      2853914 :   if (m != MATCH_YES)
    4711              :     {
    4712           83 :       gfc_free_expr (expr);
    4713           83 :       return m;
    4714              :     }
    4715              : 
    4716      2853831 :   expr->where = gfc_get_location_range (NULL, 0, &where, 1, &gfc_current_locus);
    4717      2853831 :   *result = expr;
    4718      2853831 :   return MATCH_YES;
    4719              : }
    4720              : 
    4721              : 
    4722              : match
    4723      2853882 : gfc_match_variable (gfc_expr **result, int equiv_flag)
    4724              : {
    4725      2853882 :   return match_variable (result, equiv_flag, 1);
    4726              : }
    4727              : 
    4728              : 
    4729              : match
    4730         2947 : gfc_match_equiv_variable (gfc_expr **result)
    4731              : {
    4732         2947 :   return match_variable (result, 1, 0);
    4733              : }
        

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.