PING - OK, to commit? I have a pending patch that needs this in place.

On 05/11/2019 09:55, Mark Eggleston wrote:

On 25/10/2019 09:03, Tobias Burnus wrote:
Hello Mark, hi all,

On 10/21/19 4:40 PM, Mark Eggleston wrote:
This is an extension to support a legacy feature supported by other compilers such as flang and the sun compiler.  As I understand it this feature is associated with DEC so it enabled using -fdec-char-conversions and by -fdec.

It allows character literals to be assigned to numeric (INTEGER, REAL, COMPLEX) and LOGICAL variables by direct assignment or in DATA statements.

    * arith.c (hollerith2representation): Use OPT_Wcharacter_truncation in
    call to gfc_warning.

This has two effects: First, it permits to toggle the warning on and off; secondly, it disables the warning by default. It is enabled by -Wall, however. – I think that's acceptable: while Holleriths are less transparent as normal strings, for normal strings the result is identical.


+ result->representation.string[result_len] = '\0'; /* For debugger  */

Tiny nit: full stop after 'debugger'.
Done.


+/* Convert character to integer. The constant will be padded or truncated. */

And here an extra space before '*/'.
Done.


+Allowing character literals to be used in a similar way to Hollerith constants
+is a non-standard extension.
+
+Character literals can be used in @code{DATA} statements and assignments with

I wonder whether one should mention here explicitly that only default-kind (i.e. kind=1) character strings are permitted. Additionally, I wonder whether -fdec-char-conversion should be mentioned here – without, it is not supported and the error message doesn't point to this option.

Now mentions -fdec-char-conversion and kind=1.

+
+  /* Flang allows character conversions similar to Hollerith conversions
+     - the first characters will be turned into ascii values. */

Is this Flang or DEC or …? I thought we talk about legacy support and Flang is not really legacy.


Re-worded.
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
  +  if ((gfc_numeric_ts (&lhs->ts) || lhs->ts.type == BT_LOGICAL)
+      && rhs->ts.type == BT_CHARACTER
+      && rhs->expr_type != EXPR_CONSTANT)
+    {
+      gfc_error ("Cannot convert %s to %s at %L", gfc_typename (rhs),
+         gfc_typename (lhs), &rhs->where);
+      return false;
+    }

Maybe add a comment like:
/* Happens with flag_dec_char_conversions for nonconstant strings.  */
might help casual readers to understand where this if comes from.

Done.

@@ -331,8 +332,9 @@ gfc_conv_constant_to_tree (gfc_expr * expr)
              gfc_build_string_const (expr->representation.length,
                          expr->representation.string));
        if (!integer_zerop (tmp) && !integer_onep (tmp))
-        gfc_warning (0, "Assigning value other than 0 or 1 to LOGICAL"
-             " has undefined result at %L", &expr->where);
+        gfc_warning (OPT_Wsurprising, "Assigning value other than 0 or 1 "
+                 "to LOGICAL has undefined result at %L",
+             &expr->where);

I am not happy with this. We had odd issues with combining code generated by gfortran and ifort and Booleans types ("logical"). Namely, gfortran uses 0 and 1 – while ifort uses -1 and 0. When using ".not. var", it is sufficient to flip a single bit – either the first or the last bit – and it is sufficient to look only a single bit.

Hence, one can get ".not. var .eqv. var".

The same result one can get when assigning "-1" to logical. Hence, a default warning makes more sense than -Wsurprising. At least, -Wsurprising is enabled by default.

Hence, I wonder whether your 'OPT_Wsurprising' or 'flag_dec_char_conversions ? OPT_Wsurprising : 0' makes more sense.

The latter.

Actually, I don't quickly see whether   4_'string'  (i.e. kind=4) strings are rejected or not. The gfc_character2* functions all assume kind=1 characters – while code like gfc_convert_constant or the resolve.c code only looks at BT_CHARACTER. On the other hand, the add_conv calls in intrintrinsic.c's add_conversions are only added for the default-character kind.

In any case, can you add a test which checks that – even with -fdec-char-conversion – assigning a 2_'string' and 4_'string' to a integer/real/complex/logical will be rejected at compile time?

Did not add 2_'string' tests as 2 is not accepted as a valid kind for characters. The addition of 4_'string' in a data statement resulted in an ICE which has been fixed by only accepting characters of kind=1.
Otherwise, it looks okay to me.

Tobias


I noticed that warning were not produced for conversion to logicals, re-ordering of an if..else if sequence fixes that problem. Additional test cases have been added.

Steve Kargl suggested a revision to the conversion warning adding "Nonstandard" to the text this has also been done.

Tested on x86_64 using make -j 8 check-fortran.

Please find attached the updated patch, the change logs follow. OK to commit?

regards,

Mark

gcc/fortran/ChangeLog

    Jim MacArthur  <jim.macart...@codethink.co.uk>
    Mark Eggleston  <mark.eggles...@codethink.com>

    * arith.c (hollerith2representation): Use OPT_Wcharacter_truncation in     call to gfc_warning.  Add character2representation, gfc_character2int,
    gfc_character2real, gfc_character2complex and gfc_character2logical.
    * arith.h: Add prototypes for gfc_character2int, gfc_character2real,
    gfc_character2complex and gfc_character2logical.
    * expr.c (gfc_check_assign): Return true if left hand side is numeric
    or logical and the right hand side is character and of kind=1.
    * gfortran.texi: Add -fdec-char-conversions.
    * intrinsic.c (add_conversions): Add conversions from character to
    integer, real, complex and logical types for their supported kinds.
    (gfc_convert_type_warn): Reorder if..else if.. sequence so that warnings
    are produced for conversion to logical.
    * invoke.texi: Add option to list of options.
    * invoke.texi: Add Character conversion subsection to Extensions
    section.
    * lang.opt: Add new option.
    * options.c (set_dec_flags): Add SET_BITFLAG for
    flag_dec_char_conversions.
    * resolve.c (resolve_ordindary_assign): Issue error if the left hand
    side is numeric or logical and the right hand side is a character
    variable.
    * simplify.c (gfc_convert_constant): Assign the conversion function
    depending on destination type.
    * trans-const.c (gfc_constant_to_tree): Use OPT_Wsurprising in
    gfc_warning allowing the warning to be switched off only if
    flag_dec_char_conversions is enabled.

gcc/testsuite/gfortran.dg

    Jim MacArthur <jim.macart...@codethink.co.uk>
    Mark Eggleston <mark.eggles...@codethink.com>

    PR fortran/89103
    * gfortran.dg/dec_char_conversion_in_assignment_1.f90: New test.
    * gfortran.dg/dec_char_conversion_in_assignment_2.f90: New test.
    * gfortran.dg/dec_char_conversion_in_assignment_3.f90: New test.
    * gfortran.dg/dec_char_conversion_in_assignment_4.f90: New test.
    * gfortran.dg/dec_char_conversion_in_assignment_5.f90: New test.
    * gfortran.dg/dec_char_conversion_in_assignment_6.f90: New test.
    * gfortran.dg/dec_char_conversion_in_assignment_7.f90: New test.
    * gfortran.dg/dec_char_conversion_in_assignment_8.f90: New test.
    * gfortran.dg/dec_char_conversion_in_data_1.f90: New test.
    * gfortran.dg/dec_char_conversion_in_data_2.f90: New test.
    * gfortran.dg/dec_char_conversion_in_data_3.f90: New test.
    * gfortran.dg/dec_char_conversion_in_data_4.f90: New test.
    * gfortran.dg/dec_char_conversion_in_data_5.f90: New test.
    * gfortran.dg/dec_char_conversion_in_data_6.f90: New test.
    * gfortran.dg/dec_char_conversion_in_data_7.f90: New test.
    * gfortran.dg/hollerith5.f90: Add -Wsurprising to options.
    * gfortran.dg/hollerith_legacy.f90: Add -Wsurprising to options.
    * gfortran.dg/no_char_to_numeric_assign.f90: New test.

--
https://www.codethink.co.uk/privacy.html

Reply via email to