Message ID | 7e2f6b2d-b1e2-8aed-f9ea-11f5a72c5794@codesourcery.com |
---|---|
State | New |
Headers | show |
Series | Fortran's gfc_match_char: %S to match symbol with host_assoc | expand |
Hi Tobias, This looks good to me. I'm interested to see it in use :-) OK for trunk Paul On Tue, 20 Jun 2023 at 11:50, Tobias Burnus <tobias@codesourcery.com> wrote: > > When just matching a symbol, one can use 'gfc_match_symbol (&sym, host_assoc)' > and has the option to match with and without host association. > > However, when matching something more complex via 'gfc_match' like > "something ( %s ) , " the match uses host_assoc = false. > While it can be combined ("something (" + symbol + " ) ,"), this requires > keeping track of the previous location and resetting it. > > It seems to be much simply to add a new flag supporting host_assoc = true, > which this patch does (using '%S'). The advantage is also that when looking > at the comment or at the "%s" implementation, it is clear that there are two > variants, making it less likely to choose the wrong matching. > > OK for mainline? > > Tobias > > PS: I will use it in an upcoming OpenMP to parse 'uses_allocators'. > ----------------- > Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
Fortran's gfc_match_char: %S to match symbol with host_assoc gfc_match ("... %s ...", ...) matches a gfc_symbol but with host_assoc = 0. This commit adds '%S' as variant which matches with host_assoc = 1 gcc/fortran/ChangeLog: * match.cc (gfc_match_char): Match with '%S' a symbol with host_assoc = 1. diff --git a/gcc/fortran/match.cc b/gcc/fortran/match.cc index e7be7fddc64..a350ebf754e 100644 --- a/gcc/fortran/match.cc +++ b/gcc/fortran/match.cc @@ -1084,7 +1084,8 @@ gfc_match_char (char c, bool gobble_ws) %% Literal percent sign %e Expression, pointer to a pointer is set - %s Symbol, pointer to the symbol is set + %s Symbol, pointer to the symbol is set (host_assoc = 0) + %S Symbol, pointer to the symbol is set (host_assoc = 1) %n Name, character buffer is set to name %t Matches end of statement. %o Matches an intrinsic operator, returned as an INTRINSIC enum. @@ -1151,8 +1152,9 @@ loop: goto loop; case 's': + case 'S': vp = va_arg (argp, void **); - n = gfc_match_symbol ((gfc_symbol **) vp, 0); + n = gfc_match_symbol ((gfc_symbol **) vp, c == 'S'); if (n != MATCH_YES) { m = n;