From patchwork Thu Oct 4 09:55:45 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [Fortran, (RFC)] PR49110/51055 Assignment to alloc. deferred-length character vars Date: Wed, 03 Oct 2012 23:55:45 -0000 From: Tobias Burnus X-Patchwork-Id: 189082 Message-Id: <506D5D21.7080201@net-b.de> To: David Edelsohn Cc: Fortran List , Paul Richard Thomas , GCC Patches Thanks for the suggestions. The attached patch changes all "."-something symbol names, which I found. Build and regtested on x86-64-gnu-linux. OK for the trunk and 4.7? (".saved_dovar" also occurs in 4.6; we could also backport that part to 4.6, but I am not sure whether it is needed.) We probably should also bump the .mod version (and timely also commit the patch http://gcc.gnu.org/ml/fortran/2012-04/msg00033.html). Comments? Tobias Am 04.10.2012 01:07, schrieb David Edelsohn: > For C and C++, identifiers beginning with underscore and upper case > letter or with two underscores are reserve to the implementation. C++ > uses _Z for mangling. > > Maybe Fortran could prepend "_F". Something beginning with an > underscore seems like a much better choice, given the rules about > reserved identifiers. > > Thanks, David > > On Wed, Oct 3, 2012 at 5:00 PM, Tobias Burnus wrote: >> David, >> >> >> David Edelsohn wrote: >>> I am not sure why you chose a period and how best to correct this. >> >> Well, in principle any name which the user cannot enter would do. (Not >> enter: At least not as valid Fortran identifier.) >> >> The reason for choosing "." is that is used elsewhere in >> gfortran for such identifier for the string-length variable belonging to >> , e.g. "._result" in trans-decl.c. I assume the reason that it >> didn't pop up with those is that those are local variables, but I wouldn't >> be surprised if it would break elsewhere. >> >> I wonder whether "@" would work, otherwise, one could also use "_". The only >> other problem is that it will break the ABI. On the other hand, it's a >> rather new feature and if we bump the .mod version number, the chance that >> one effectively forces the user to re-compile is rather high. So far we >> always bumped the .mod version number as something changed. There are also >> some other patches pending which effectively lead to a bump in the .mod >> version. >> >> (The .mod version won't affect code which doesn't use modules such as >> BLAS/LAPACK or any Fortran 66/77 code, but those won't be affected by the >> ABI change anyway as there the name doesn't propagate as it does with >> modules..) >> >> >> Thanks for investigating the test-suite failure. >> >> Tobias 2012-10-04 Tobias Burnus * trans-decl.c (gfc_create_string_length, create_function_arglist): Don't create a symbol which contains a dot. * trans-stmt.c (gfc_trans_simple_do, gfc_trans_do): Ditto. diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 910b150..f41fc8b 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -1097,9 +1097,9 @@ gfc_create_string_length (gfc_symbol * sym) /* Also prefix the mangled name. */ if (sym->module) - name = gfc_get_string (".__%s_MOD_%s", sym->module, sym->name); + name = gfc_get_string ("_F_%s_MOD_%s", sym->module, sym->name); else - name = gfc_get_string (".%s", sym->name); + name = gfc_get_string ("_F%s", sym->name); length = build_decl (input_location, VAR_DECL, get_identifier (name), @@ -1984,7 +1984,7 @@ create_function_arglist (gfc_symbol * sym) length = build_decl (input_location, PARM_DECL, - get_identifier (".__result"), + get_identifier ("_Flen__result"), len_type); if (!sym->ts.u.cl->length) { @@ -2007,7 +2007,7 @@ create_function_arglist (gfc_symbol * sym) { tree len = build_decl (input_location, VAR_DECL, - get_identifier ("..__result"), + get_identifier ("_Flen2__result"), gfc_charlen_type_node); DECL_ARTIFICIAL (len) = 1; TREE_USED (len) = 1; diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 204f069..37fc6ee 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -1376,7 +1376,7 @@ gfc_trans_simple_do (gfc_code * code, stmtblock_t *pblock, tree dovar, /* Save value for do-tinkering checking. */ if (gfc_option.rtcheck & GFC_RTCHECK_DO) { - saved_dovar = gfc_create_var (type, ".saved_dovar"); + saved_dovar = gfc_create_var (type, "_F_saved_dovar"); gfc_add_modify_loc (loc, pblock, saved_dovar, dovar); } @@ -1581,7 +1581,7 @@ gfc_trans_do (gfc_code * code, tree exit_cond) /* Save value for do-tinkering checking. */ if (gfc_option.rtcheck & GFC_RTCHECK_DO) { - saved_dovar = gfc_create_var (type, ".saved_dovar"); + saved_dovar = gfc_create_var (type, "_F_saved_dovar"); gfc_add_modify_loc (loc, &block, saved_dovar, dovar); }