Summary: | BIND(C): Allow non-digit/underscore/alphabetic binding names | ||
---|---|---|---|
Product: | gcc | Reporter: | Tobias Burnus <burnus> |
Component: | fortran | Assignee: | Francois-Xavier Coudert <fxcoudert> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | dfranke, fxcoudert, gcc-bugs |
Priority: | P3 | Keywords: | rejects-valid |
Version: | 4.4.0 | ||
Target Milestone: | 5.0 | ||
Host: | Target: | ||
Build: | Known to work: | ||
Known to fail: | Last reconfirmed: | 2009-03-29 08:46:40 | |
Bug Depends on: | |||
Bug Blocks: | 32630 |
Description
Tobias Burnus
2009-01-14 15:37:03 UTC
And for the universal-character-name, the following compiles with Intel's icc void \u01ac(void) { } and should be valid C99. ICC generates the identifier "_u01ac". Using "gcc -fextended-identifiers" it shows up in the .o file as (readelf -a): 8: 0000000000000000 6 FUNC GLOBAL DEFAULT 1 ^^F^354 In the Fortran 2003 standard one finds: R509 language-binding-spec is BIND (C [, NAME = scalar-char-initialization-expr ]) C540 (R509) The scalar-char-initialization-expr shall be of default character kind. That makes it a bit difficult to use UCNs ... From Fortran 2008 (below R508): "NOTE 5.5 The C International Standard provides a facility for creating C identifiers whose characters are not restricted to the C basic character set. Such a C identifier is referred to as a universal character name (6.4.3 of the C International Standard). The name of such a C identifier might include characters that are not part of the representation method used by the processor for default character. If so, the C entity cannot be referenced from Fortran." Thus currently we only need to worry about '$' and maybe some others. Optionally supporting non-default character strings and thus UCN might be done later on (cf. also PR 38838 comment 3). See PR36275 for more possibilities on binding labels. For "$" one should check whether it is allowed for the given target, cf. DOLLARS_IN_IDENTIFIERS (-> gcc/c-opts.c and dollars_in_ident in libcpp/). For UCN (universal-character name), the ASCII characters $, @ and ` are allowed. Cf. C99 6.4.3 and libcpp _cpp_valid_ucn. One could also think of supporting UCN with character kind=4 (cf. PR36275 and PR 9449) - at least when -fextended-identifiers is specified - as vendor extension. As gfortran uses libcpp and and has full support of wide chars, it should not be difficult (but shall produce an error with -std=f2008). Should be fixed at the same time as this patch here: https://gcc.gnu.org/ml/fortran/2014-06/msg00090.html , which reworks the parsing of binding labels. I intend to find what the consensus is on this issue, incorporate it into the patch, and close this. Author: fxcoudert Date: Sun Jun 29 14:14:16 2014 New Revision: 212123 URL: https://gcc.gnu.org/viewcvs?rev=212123&root=gcc&view=rev Log: PR fortran/36275 PR fortran/38839 * decl.c (check_bind_name_identifier): New function. (gfc_match_bind_c): Match any constant expression as binding label. * match.c (gfc_match_name_C): Remove. * gfortran.dg/binding_label_tests_2.f03: Adjust error messages. * gfortran.dg/binding_label_tests_27.f90: New file. Added: trunk/gcc/testsuite/gfortran.dg/binding_label_tests_27.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/decl.c trunk/gcc/fortran/match.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gfortran.dg/binding_label_tests_2.f03 Fixed on trunk. |