Allow CHARACTER literals in assignments and data statements.
Allows character literals to used to assign values to non-character variables in the same way that Hollerith constants are used. In addition character literals can be used in data statements just like Hollerith constants. Warnings of such use are output to discourage this usage as it is a non-standard legacy feature and must be explicitly enabled. Enabled by -fdec and -fdec-char-conversions. Co-Authored-By: Jim MacArthur <jim.macarthur@codethink.co.uk> From-SVN: r277975
This commit is contained in:
parent
4e9d58d167
commit
2afeb1ca38
@ -1,3 +1,33 @@
|
||||
2019-11-08 Mark Eggleston <mark.eggleston@codethink.com>
|
||||
Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
|
||||
* 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.
|
||||
|
||||
2019-11-08 Tobias Burnus <tobias@codesourcery.com
|
||||
|
||||
PR fortran/91253
|
||||
|
@ -2510,9 +2510,9 @@ hollerith2representation (gfc_expr *result, gfc_expr *src)
|
||||
|
||||
if (src_len > result_len)
|
||||
{
|
||||
gfc_warning (0,
|
||||
"The Hollerith constant at %L is too long to convert to %qs",
|
||||
&src->where, gfc_typename(&result->ts));
|
||||
gfc_warning (OPT_Wcharacter_truncation, "The Hollerith constant at %L "
|
||||
"is truncated in conversion to %qs", &src->where,
|
||||
gfc_typename(&result->ts));
|
||||
}
|
||||
|
||||
result->representation.string = XCNEWVEC (char, result_len + 1);
|
||||
@ -2527,6 +2527,36 @@ hollerith2representation (gfc_expr *result, gfc_expr *src)
|
||||
}
|
||||
|
||||
|
||||
/* Helper function to set the representation in a character conversion.
|
||||
This assumes that the ts.type and ts.kind of the result have already
|
||||
been set. */
|
||||
|
||||
static void
|
||||
character2representation (gfc_expr *result, gfc_expr *src)
|
||||
{
|
||||
size_t src_len, result_len;
|
||||
int i;
|
||||
src_len = src->value.character.length;
|
||||
gfc_target_expr_size (result, &result_len);
|
||||
|
||||
if (src_len > result_len)
|
||||
gfc_warning (OPT_Wcharacter_truncation, "The character constant at %L is "
|
||||
"truncated in conversion to %s", &src->where,
|
||||
gfc_typename(&result->ts));
|
||||
|
||||
result->representation.string = XCNEWVEC (char, result_len + 1);
|
||||
|
||||
for (i = 0; i < MIN (result_len, src_len); i++)
|
||||
result->representation.string[i] = (char) src->value.character.string[i];
|
||||
|
||||
if (src_len < result_len)
|
||||
memset (&result->representation.string[src_len], ' ',
|
||||
result_len - src_len);
|
||||
|
||||
result->representation.string[result_len] = '\0'; /* For debugger. */
|
||||
result->representation.length = result_len;
|
||||
}
|
||||
|
||||
/* Convert Hollerith to integer. The constant will be padded or truncated. */
|
||||
|
||||
gfc_expr *
|
||||
@ -2542,8 +2572,21 @@ gfc_hollerith2int (gfc_expr *src, int kind)
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Convert character to integer. The constant will be padded or truncated. */
|
||||
|
||||
/* Convert Hollerith to real. The constant will be padded or truncated. */
|
||||
gfc_expr *
|
||||
gfc_character2int (gfc_expr *src, int kind)
|
||||
{
|
||||
gfc_expr *result;
|
||||
result = gfc_get_constant_expr (BT_INTEGER, kind, &src->where);
|
||||
|
||||
character2representation (result, src);
|
||||
gfc_interpret_integer (kind, (unsigned char *) result->representation.string,
|
||||
result->representation.length, result->value.integer);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Convert Hollerith to real. The constant will be padded or truncated. */
|
||||
|
||||
gfc_expr *
|
||||
gfc_hollerith2real (gfc_expr *src, int kind)
|
||||
@ -2558,6 +2601,21 @@ gfc_hollerith2real (gfc_expr *src, int kind)
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Convert character to real. The constant will be padded or truncated. */
|
||||
|
||||
gfc_expr *
|
||||
gfc_character2real (gfc_expr *src, int kind)
|
||||
{
|
||||
gfc_expr *result;
|
||||
result = gfc_get_constant_expr (BT_REAL, kind, &src->where);
|
||||
|
||||
character2representation (result, src);
|
||||
gfc_interpret_float (kind, (unsigned char *) result->representation.string,
|
||||
result->representation.length, result->value.real);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Convert Hollerith to complex. The constant will be padded or truncated. */
|
||||
|
||||
@ -2574,6 +2632,21 @@ gfc_hollerith2complex (gfc_expr *src, int kind)
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Convert character to complex. The constant will be padded or truncated. */
|
||||
|
||||
gfc_expr *
|
||||
gfc_character2complex (gfc_expr *src, int kind)
|
||||
{
|
||||
gfc_expr *result;
|
||||
result = gfc_get_constant_expr (BT_COMPLEX, kind, &src->where);
|
||||
|
||||
character2representation (result, src);
|
||||
gfc_interpret_complex (kind, (unsigned char *) result->representation.string,
|
||||
result->representation.length, result->value.complex);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Convert Hollerith to character. */
|
||||
|
||||
@ -2609,3 +2682,18 @@ gfc_hollerith2logical (gfc_expr *src, int kind)
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Convert character to logical. The constant will be padded or truncated. */
|
||||
|
||||
gfc_expr *
|
||||
gfc_character2logical (gfc_expr *src, int kind)
|
||||
{
|
||||
gfc_expr *result;
|
||||
result = gfc_get_constant_expr (BT_LOGICAL, kind, &src->where);
|
||||
|
||||
character2representation (result, src);
|
||||
gfc_interpret_logical (kind, (unsigned char *) result->representation.string,
|
||||
result->representation.length, &result->value.logical);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -77,7 +77,11 @@ gfc_expr *gfc_hollerith2real (gfc_expr *, int);
|
||||
gfc_expr *gfc_hollerith2complex (gfc_expr *, int);
|
||||
gfc_expr *gfc_hollerith2character (gfc_expr *, int);
|
||||
gfc_expr *gfc_hollerith2logical (gfc_expr *, int);
|
||||
gfc_expr *gfc_character2int (gfc_expr *, int);
|
||||
gfc_expr *gfc_character2real (gfc_expr *, int);
|
||||
gfc_expr *gfc_character2complex (gfc_expr *, int);
|
||||
gfc_expr *gfc_character2character (gfc_expr *, int);
|
||||
gfc_expr *gfc_character2logical (gfc_expr *, int);
|
||||
|
||||
#endif /* GFC_ARITH_H */
|
||||
|
||||
|
@ -3722,6 +3722,12 @@ gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform,
|
||||
|| rvalue->ts.type == BT_HOLLERITH)
|
||||
return true;
|
||||
|
||||
if (flag_dec_char_conversions && (gfc_numeric_ts (&lvalue->ts)
|
||||
|| lvalue->ts.type == BT_LOGICAL)
|
||||
&& rvalue->ts.type == BT_CHARACTER
|
||||
&& rvalue->ts.kind == gfc_default_character_kind)
|
||||
return true;
|
||||
|
||||
if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
|
||||
return true;
|
||||
|
||||
|
@ -1600,6 +1600,7 @@ additional compatibility extensions along with those enabled by
|
||||
* Unary operators::
|
||||
* Implicitly convert LOGICAL and INTEGER values::
|
||||
* Hollerith constants support::
|
||||
* Character conversion::
|
||||
* Cray pointers::
|
||||
* CONVERT specifier::
|
||||
* OpenMP::
|
||||
@ -1955,6 +1956,30 @@ obtained by using the @code{TRANSFER} statement, as in this example.
|
||||
@end smallexample
|
||||
|
||||
|
||||
@node Character conversion
|
||||
@subsection Character conversion
|
||||
@cindex conversion, to character
|
||||
|
||||
Allowing character literals to be used in a similar way to Hollerith constants
|
||||
is a non-standard extension. This feature is enabled using
|
||||
-fdec-char-conversions and only applies to character literals of @code{kind=1}.
|
||||
|
||||
Character literals can be used in @code{DATA} statements and assignments with
|
||||
numeric (@code{INTEGER}, @code{REAL}, or @code{COMPLEX}) or @code{LOGICAL}
|
||||
variables. Like Hollerith constants they are copied byte-wise fashion. The
|
||||
constant will be padded with spaces or truncated to fit the size of the
|
||||
variable in which it is stored.
|
||||
|
||||
Examples:
|
||||
@smallexample
|
||||
integer*4 x
|
||||
data x / 'abcd' /
|
||||
|
||||
x = 'A' ! Will be padded.
|
||||
x = 'ab1234' ! Will be truncated.
|
||||
@end smallexample
|
||||
|
||||
|
||||
@node Cray pointers
|
||||
@subsection Cray pointers
|
||||
@cindex pointer, Cray
|
||||
|
@ -4025,6 +4025,29 @@ add_conversions (void)
|
||||
add_conv (BT_LOGICAL, gfc_logical_kinds[j].kind,
|
||||
BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
|
||||
}
|
||||
|
||||
/* DEC legacy feature allows character conversions similar to Hollerith
|
||||
conversions - the character data will transferred on a byte by byte
|
||||
basis. */
|
||||
if (flag_dec_char_conversions)
|
||||
{
|
||||
/* Character-Integer conversions. */
|
||||
for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
|
||||
add_conv (BT_CHARACTER, gfc_default_character_kind,
|
||||
BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
|
||||
/* Character-Real conversions. */
|
||||
for (i = 0; gfc_real_kinds[i].kind != 0; i++)
|
||||
add_conv (BT_CHARACTER, gfc_default_character_kind,
|
||||
BT_REAL, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
|
||||
/* Character-Complex conversions. */
|
||||
for (i = 0; gfc_real_kinds[i].kind != 0; i++)
|
||||
add_conv (BT_CHARACTER, gfc_default_character_kind,
|
||||
BT_COMPLEX, gfc_real_kinds[i].kind, GFC_STD_LEGACY);
|
||||
/* Character-Logical conversions. */
|
||||
for (i = 0; gfc_logical_kinds[i].kind != 0; i++)
|
||||
add_conv (BT_CHARACTER, gfc_default_character_kind,
|
||||
BT_LOGICAL, gfc_logical_kinds[i].kind, GFC_STD_LEGACY);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -5119,8 +5142,10 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
|
||||
/* At this point, a conversion is necessary. A warning may be needed. */
|
||||
if ((gfc_option.warn_std & sym->standard) != 0)
|
||||
{
|
||||
const char *type_name = is_char_constant ? gfc_typename (expr)
|
||||
: gfc_typename (&from_ts);
|
||||
gfc_warning_now (0, "Extension: Conversion from %s to %s at %L",
|
||||
gfc_typename (&from_ts), gfc_dummy_typename (ts),
|
||||
type_name, gfc_dummy_typename (ts),
|
||||
&expr->where);
|
||||
}
|
||||
else if (wflag)
|
||||
@ -5135,14 +5160,14 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
|
||||
If range checking was disabled, but -Wconversion enabled,
|
||||
a non range checked warning is generated below. */
|
||||
}
|
||||
else if (from_ts.type == BT_LOGICAL || ts->type == BT_LOGICAL)
|
||||
else if (flag_dec_char_conversions && from_ts.type == BT_CHARACTER
|
||||
&& (gfc_numeric_ts (ts) || ts->type == BT_LOGICAL))
|
||||
{
|
||||
/* Do nothing. This block exists only to simplify the other
|
||||
else-if expressions.
|
||||
LOGICAL <> LOGICAL no warning, independent of kind values
|
||||
LOGICAL <> INTEGER extension, warned elsewhere
|
||||
LOGICAL <> REAL invalid, error generated elsewhere
|
||||
LOGICAL <> COMPLEX invalid, error generated elsewhere */
|
||||
const char *type_name = is_char_constant ? gfc_typename (expr)
|
||||
: gfc_typename (&from_ts);
|
||||
gfc_warning_now (OPT_Wconversion, "Nonstandard conversion from %s "
|
||||
"to %s at %L", type_name, gfc_typename (ts),
|
||||
&expr->where);
|
||||
}
|
||||
else if (from_ts.type == ts->type
|
||||
|| (from_ts.type == BT_INTEGER && ts->type == BT_REAL)
|
||||
@ -5159,7 +5184,7 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
|
||||
"conversion from %s to %s at %L",
|
||||
gfc_typename (&from_ts), gfc_typename (ts),
|
||||
&expr->where);
|
||||
else if (warn_conversion_extra)
|
||||
else
|
||||
gfc_warning_now (OPT_Wconversion_extra, "Conversion from %s to %s "
|
||||
"at %L", gfc_typename (&from_ts),
|
||||
gfc_typename (ts), &expr->where);
|
||||
@ -5171,7 +5196,7 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
|
||||
{
|
||||
/* Conversion from REAL/COMPLEX to INTEGER or COMPLEX to REAL
|
||||
usually comes with a loss of information, regardless of kinds. */
|
||||
if (warn_conversion && expr->expr_type != EXPR_CONSTANT)
|
||||
if (expr->expr_type != EXPR_CONSTANT)
|
||||
gfc_warning_now (OPT_Wconversion, "Possible change of value in "
|
||||
"conversion from %s to %s at %L",
|
||||
gfc_typename (&from_ts), gfc_typename (ts),
|
||||
@ -5180,13 +5205,21 @@ gfc_convert_type_warn (gfc_expr *expr, gfc_typespec *ts, int eflag, int wflag)
|
||||
else if (from_ts.type == BT_HOLLERITH || ts->type == BT_HOLLERITH)
|
||||
{
|
||||
/* If HOLLERITH is involved, all bets are off. */
|
||||
if (warn_conversion)
|
||||
gfc_warning_now (OPT_Wconversion, "Conversion from %s to %s at %L",
|
||||
gfc_typename (&from_ts), gfc_dummy_typename (ts),
|
||||
&expr->where);
|
||||
gfc_warning_now (OPT_Wconversion, "Conversion from %s to %s at %L",
|
||||
gfc_typename (&from_ts), gfc_dummy_typename (ts),
|
||||
&expr->where);
|
||||
}
|
||||
else if (from_ts.type == BT_LOGICAL || ts->type == BT_LOGICAL)
|
||||
{
|
||||
/* Do nothing. This block exists only to simplify the other
|
||||
else-if expressions.
|
||||
LOGICAL <> LOGICAL no warning, independent of kind values
|
||||
LOGICAL <> INTEGER extension, warned elsewhere
|
||||
LOGICAL <> REAL invalid, error generated elsewhere
|
||||
LOGICAL <> COMPLEX invalid, error generated elsewhere */
|
||||
}
|
||||
else
|
||||
gcc_unreachable ();
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
/* Insert a pre-resolved function call to the right function. */
|
||||
@ -5244,8 +5277,7 @@ bad:
|
||||
}
|
||||
|
||||
gfc_internal_error ("Cannot convert %qs to %qs at %L", type_name,
|
||||
gfc_typename (ts),
|
||||
&expr->where);
|
||||
gfc_typename (ts), &expr->where);
|
||||
/* Not reached */
|
||||
}
|
||||
|
||||
|
@ -118,9 +118,9 @@ by type. Explanations are in the following sections.
|
||||
@xref{Fortran Dialect Options,,Options controlling Fortran dialect}.
|
||||
@gccoptlist{-fall-intrinsics -fallow-argument-mismatch -fallow-invalid-boz @gol
|
||||
-fbackslash -fcray-pointer -fd-lines-as-code -fd-lines-as-comments -fdec @gol
|
||||
-fdec-structure-fdec-intrinsic-ints -fdec-static -fdec-math -fdec-include @gol
|
||||
-fdec-format-defaults -fdec-blank-format-item -fdefault-double-8 @gol
|
||||
-fdefault-integer-8 -fdefault-real-8 -fdefault-real-10 @gol
|
||||
-fdec-char-conversions -fdec-structure -fdec-intrinsic-ints -fdec-static @gol
|
||||
-fdec-math -fdec-include -fdec-format-defaults -fdec-blank-format-item @gol
|
||||
-fdefault-double-8 -fdefault-integer-8 -fdefault-real-8 -fdefault-real-10 @gol
|
||||
-fdefault-real-16 -fdollar-ok -ffixed-line-length-@var{n} @gol
|
||||
-ffixed-line-length-none -fpad-source -ffree-form @gol
|
||||
-ffree-line-length-@var{n} -ffree-line-length-none -fimplicit-none @gol
|
||||
@ -273,14 +273,19 @@ For details on GNU Fortran's implementation of these extensions see the
|
||||
full documentation.
|
||||
|
||||
Other flags enabled by this switch are:
|
||||
@option{-fdollar-ok} @option{-fcray-pointer} @option{-fdec-structure}
|
||||
@option{-fdec-intrinsic-ints} @option{-fdec-static} @option{-fdec-math}
|
||||
@option{-fdec-include} @option{-fdec-blank-format-item}
|
||||
@option{-fdollar-ok} @option{-fcray-pointer} @option{-fdec-char-conversions}
|
||||
@option{-fdec-structure} @option{-fdec-intrinsic-ints} @option{-fdec-static}
|
||||
@option{-fdec-math} @option{-fdec-include} @option{-fdec-blank-format-item}
|
||||
@option{-fdec-format-defaults}
|
||||
|
||||
If @option{-fd-lines-as-code}/@option{-fd-lines-as-comments} are unset, then
|
||||
@option{-fdec} also sets @option{-fd-lines-as-comments}.
|
||||
|
||||
@item -fdec-char-conversions
|
||||
@opindex @code{fdec-char-conversions}
|
||||
Enable the use of character literals in assignments and data statements
|
||||
for non-character variables.
|
||||
|
||||
@item -fdec-structure
|
||||
@opindex @code{fdec-structure}
|
||||
Enable DEC @code{STRUCTURE} and @code{RECORD} as well as @code{UNION},
|
||||
|
@ -460,6 +460,11 @@ fdec-blank-format-item
|
||||
Fortran Var(flag_dec_blank_format_item)
|
||||
Enable the use of blank format items in format strings.
|
||||
|
||||
fdec-char-conversions
|
||||
Fortran Var(flag_dec_char_conversions)
|
||||
Enable the use of character literals in assignments and data statements
|
||||
for non-character variables.
|
||||
|
||||
fdec-include
|
||||
Fortran Var(flag_dec_include)
|
||||
Enable legacy parsing of INCLUDE as statement.
|
||||
|
@ -76,6 +76,7 @@ set_dec_flags (int value)
|
||||
SET_BITFLAG (flag_dec_include, value, value);
|
||||
SET_BITFLAG (flag_dec_format_defaults, value, value);
|
||||
SET_BITFLAG (flag_dec_blank_format_item, value, value);
|
||||
SET_BITFLAG (flag_dec_char_conversions, value, value);
|
||||
}
|
||||
|
||||
/* Finalize DEC flags. */
|
||||
|
@ -10689,6 +10689,18 @@ resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
|
||||
lhs = code->expr1;
|
||||
rhs = code->expr2;
|
||||
|
||||
if ((gfc_numeric_ts (&lhs->ts) || lhs->ts.type == BT_LOGICAL)
|
||||
&& rhs->ts.type == BT_CHARACTER
|
||||
&& rhs->expr_type != EXPR_CONSTANT)
|
||||
{
|
||||
/* Use of -fdec-char-conversions allows assignment of character data
|
||||
to non-character variables. This not permited for nonconstant
|
||||
strings. */
|
||||
gfc_error ("Cannot convert %s to %s at %L", gfc_typename (rhs),
|
||||
gfc_typename (lhs), &rhs->where);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Handle the case of a BOZ literal on the RHS. */
|
||||
if (rhs->ts.type == BT_BOZ)
|
||||
{
|
||||
|
@ -8522,10 +8522,31 @@ gfc_convert_constant (gfc_expr *e, bt type, int kind)
|
||||
break;
|
||||
|
||||
case BT_CHARACTER:
|
||||
if (type == BT_CHARACTER)
|
||||
f = gfc_character2character;
|
||||
else
|
||||
goto oops;
|
||||
switch (type)
|
||||
{
|
||||
case BT_INTEGER:
|
||||
f = gfc_character2int;
|
||||
break;
|
||||
|
||||
case BT_REAL:
|
||||
f = gfc_character2real;
|
||||
break;
|
||||
|
||||
case BT_COMPLEX:
|
||||
f = gfc_character2complex;
|
||||
break;
|
||||
|
||||
case BT_CHARACTER:
|
||||
f = gfc_character2character;
|
||||
break;
|
||||
|
||||
case BT_LOGICAL:
|
||||
f = gfc_character2logical;
|
||||
break;
|
||||
|
||||
default:
|
||||
goto oops;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -25,6 +25,7 @@ along with GCC; see the file COPYING3. If not see
|
||||
#include "coretypes.h"
|
||||
#include "tree.h"
|
||||
#include "gfortran.h"
|
||||
#include "options.h"
|
||||
#include "trans.h"
|
||||
#include "fold-const.h"
|
||||
#include "stor-layout.h"
|
||||
@ -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 (flag_dec_char_conversions ? OPT_Wsurprising : 0,
|
||||
"Assigning value other than 0 or 1 to LOGICAL has "
|
||||
"undefined result at %L", &expr->where);
|
||||
return fold_convert (gfc_get_logical_type (expr->ts.kind), tmp);
|
||||
}
|
||||
else
|
||||
|
@ -1,3 +1,25 @@
|
||||
2019-11-08 Mark Eggleston <mark.eggleston@codethink.com>
|
||||
Jim MacArthur <jim.macarthur@codethink.co.uk>
|
||||
|
||||
* 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.
|
||||
|
||||
2019-11-08 Andre Vieira <andre.simoesdiasvieira@arm.com>
|
||||
|
||||
PR tree-optimization/92351
|
||||
|
@ -0,0 +1,61 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
program test
|
||||
integer(4) :: a
|
||||
real(4) :: b
|
||||
complex(4) :: c
|
||||
logical(4) :: d
|
||||
integer(4) :: e
|
||||
real(4) :: f
|
||||
complex(4) :: g
|
||||
logical(4) :: h
|
||||
|
||||
a = '1234'
|
||||
b = '1234'
|
||||
c = '12341234'
|
||||
d = '1234'
|
||||
e = 4h1234
|
||||
f = 4h1234
|
||||
g = 8h12341234
|
||||
h = 4h1234
|
||||
|
||||
if (a.ne.e) stop 1
|
||||
if (b.ne.f) stop 2
|
||||
if (c.ne.g) stop 3
|
||||
if (d.neqv.h) stop 4
|
||||
|
||||
! padded values
|
||||
a = '12'
|
||||
b = '12'
|
||||
c = '12234'
|
||||
d = '124'
|
||||
e = 2h12
|
||||
f = 2h12
|
||||
g = 5h12234
|
||||
h = 3h123
|
||||
|
||||
if (a.ne.e) stop 5
|
||||
if (b.ne.f) stop 6
|
||||
if (c.ne.g) stop 7
|
||||
if (d.neqv.h) stop 8
|
||||
|
||||
! truncated values
|
||||
a = '123478'
|
||||
b = '123478'
|
||||
c = '12341234987'
|
||||
d = '1234abc'
|
||||
e = 6h123478
|
||||
f = 6h123478
|
||||
g = 11h12341234987
|
||||
h = 7h1234abc
|
||||
|
||||
if (a.ne.e) stop 5
|
||||
if (b.ne.f) stop 6
|
||||
if (c.ne.g) stop 7
|
||||
if (d.neqv.h) stop 8
|
||||
|
||||
end program
|
||||
|
@ -0,0 +1,31 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec -Wconversion" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
include "dec_char_conversion_in_assignment_1.f90"
|
||||
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 16 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 17 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 18 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 19 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 20 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 21 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 22 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 23 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 31 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 32 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 33 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 34 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 35 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 36 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 37 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 38 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 46 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 47 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 48 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 49 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 50 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 51 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 52 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 53 }
|
@ -0,0 +1,44 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec-char-conversions" }
|
||||
!
|
||||
! Contributeds by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
include "dec_char_conversion_in_assignment_1.f90"
|
||||
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 16 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 17 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 18 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 19 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 20 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 21 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 22 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 23 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 20 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 21 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 22 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 23 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 31 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 32 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 33 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 34 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 35 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 36 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 37 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 38 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 35 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 36 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 37 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 38 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 46 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 47 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 48 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER" " " { target *-*-* } 49 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 50 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 51 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 52 }
|
||||
! { dg-warning "Extension: Hollerith constant" " " { target *-*-* } 53 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 50 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 51 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 52 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 53 }
|
||||
|
@ -0,0 +1,20 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec -fno-dec-char-conversions" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
include "dec_char_conversion_in_assignment_1.f90"
|
||||
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 16 }
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 17 }
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 18 }
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 19 }
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 31 }
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 32 }
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 33 }
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 34 }
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 46 }
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 47 }
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 48 }
|
||||
! { dg-error "Cannot convert" " " { target *-*-* } 49 }
|
||||
|
@ -0,0 +1,16 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec -Wcharacter-truncation" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
include "dec_char_conversion_in_assignment_1.f90"
|
||||
|
||||
! { dg-warning "is truncated in conversion" " " { target *-*-* } 46 }
|
||||
! { dg-warning "is truncated in conversion" " " { target *-*-* } 47 }
|
||||
! { dg-warning "is truncated in conversion" " " { target *-*-* } 48 }
|
||||
! { dg-warning "is truncated in conversion" " " { target *-*-* } 49 }
|
||||
! { dg-warning "is truncated in conversion" " " { target *-*-* } 50 }
|
||||
! { dg-warning "is truncated in conversion" " " { target *-*-* } 51 }
|
||||
! { dg-warning "is truncated in conversion" " " { target *-*-* } 52 }
|
||||
! { dg-warning "is truncated in conversion" " " { target *-*-* } 53 }
|
||||
|
@ -0,0 +1,14 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec -Wsurprising" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
include "dec_char_conversion_in_assignment_1.f90"
|
||||
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 19 }
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 23 }
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 34 }
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 38 }
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 49 }
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 53 }
|
||||
|
@ -0,0 +1,30 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec -Wconversion -Wcharacter-truncation" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
program test
|
||||
integer(4), parameter :: a = '1234'
|
||||
real(4), parameter :: b = '12'
|
||||
complex(4), parameter :: c = '12341234'
|
||||
logical(4), parameter :: d = 'abcd'
|
||||
integer(4), parameter :: e = 4h1234
|
||||
real(4), parameter :: f = 2h12
|
||||
complex(4), parameter :: g = 8h12341234
|
||||
logical(4), parameter :: h = 4habcd
|
||||
|
||||
if (a.ne.e) stop 1
|
||||
if (b.ne.f) stop 2
|
||||
if (c.ne.g) stop 3
|
||||
if (d.neqv.h) stop 4
|
||||
end program
|
||||
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 7 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 8 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 9 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER" " " { target *-*-* } 10 }
|
||||
! { dg-warning "Conversion from HOLLERITH to INTEGER" " " { target *-*-* } 11 }
|
||||
! { dg-warning "Conversion from HOLLERITH to REAL" " " { target *-*-* } 12 }
|
||||
! { dg-warning "Conversion from HOLLERITH to COMPLEX" " " { target *-*-* } 13 }
|
||||
! { dg-warning "Conversion from HOLLERITH to LOGICAL" " " { target *-*-* } 14 }
|
||||
|
@ -0,0 +1,17 @@
|
||||
! { dg-do compile }
|
||||
! { dg-options "-fdec" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
program test
|
||||
integer(4) :: a
|
||||
real(4) :: b
|
||||
complex(4) :: c
|
||||
logical(4) :: d
|
||||
|
||||
a = 4_'1234' ! { dg-error "Cannot convert CHARACTER\\(4,4\\) to" }
|
||||
b = 4_'12' ! { dg-error "Cannot convert CHARACTER\\(2,4\\) to" }
|
||||
c = 4_'12341234' ! { dg-error "Cannot convert CHARACTER\\(8,4\\) to" }
|
||||
d = 4_'abcd' ! { dg-error "Cannot convert CHARACTER\\(4,4\\) to" }
|
||||
end program
|
||||
|
87
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_1.f90
Normal file
87
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_1.f90
Normal file
@ -0,0 +1,87 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
|
||||
subroutine normal
|
||||
integer(4) :: a
|
||||
real(4) :: b
|
||||
complex(4) :: c
|
||||
logical(4) :: d
|
||||
integer(4) :: e
|
||||
real(4) :: f
|
||||
complex(4) :: g
|
||||
logical(4) :: h
|
||||
|
||||
data a / '1234' /
|
||||
data b / '1234' /
|
||||
data c / '12341234' / ! double the length for complex
|
||||
data d / '1234' /
|
||||
data e / 4h1234 /
|
||||
data f / 4h1234 /
|
||||
data g / 8h12341234 / ! double the length for complex
|
||||
data h / 4h1234 /
|
||||
|
||||
if (a.ne.e) stop 1
|
||||
if (b.ne.f) stop 2
|
||||
if (c.ne.g) stop 3
|
||||
if (d.neqv.h) stop 4
|
||||
end subroutine
|
||||
|
||||
subroutine padded
|
||||
integer(4) :: a
|
||||
real(4) :: b
|
||||
complex(4) :: c
|
||||
logical(4) :: d
|
||||
integer(4) :: e
|
||||
real(4) :: f
|
||||
complex(4) :: g
|
||||
logical(4) :: h
|
||||
|
||||
data a / '12' /
|
||||
data b / '12' /
|
||||
data c / '12334' /
|
||||
data d / '123' /
|
||||
data e / 2h12 /
|
||||
data f / 2h12 /
|
||||
data g / 5h12334 /
|
||||
data h / 3h123 /
|
||||
|
||||
if (a.ne.e) stop 5
|
||||
if (b.ne.f) stop 6
|
||||
if (c.ne.g) stop 7
|
||||
if (d.neqv.h) stop 8
|
||||
end subroutine
|
||||
|
||||
subroutine truncated
|
||||
integer(4) :: a
|
||||
real(4) :: b
|
||||
complex(4) :: c
|
||||
logical(4) :: d
|
||||
integer(4) :: e
|
||||
real(4) :: f
|
||||
complex(4) :: g
|
||||
logical(4) :: h
|
||||
|
||||
data a / '123478' /
|
||||
data b / '123478' /
|
||||
data c / '1234123498' /
|
||||
data d / '12345' /
|
||||
data e / 6h123478 /
|
||||
data f / 6h123478 /
|
||||
data g / 10h1234123498 /
|
||||
data h / 5h12345 /
|
||||
|
||||
if (a.ne.e) stop 9
|
||||
if (b.ne.f) stop 10
|
||||
if (c.ne.g) stop 11
|
||||
if (d.neqv.h) stop 12
|
||||
end subroutine
|
||||
|
||||
program test
|
||||
call normal
|
||||
call padded
|
||||
call truncated
|
||||
end program
|
||||
|
45
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_2.f90
Normal file
45
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_2.f90
Normal file
@ -0,0 +1,45 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec-char-conversions" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
include "dec_char_conversion_in_data_1.f90"
|
||||
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 21 }
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 22 }
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 23 }
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 24 }
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 46 }
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 47 }
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 48 }
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 49 }
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 71 }
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 72 }
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 73 }
|
||||
! { dg-warning "Legacy Extension: Hollerith constant" " " { target *-*-* } 74 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 21 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 22 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 23 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 24 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 46 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 47 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 48 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 49 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 71 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 72 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 73 }
|
||||
! { dg-warning "Extension: Conversion from HOLLERITH" " " { target *-*-* } 74 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(4\\)" " " { target *-*-* } 17 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(4\\)" " " { target *-*-* } 18 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(8\\)" " " { target *-*-* } 19 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(4\\)" " " { target *-*-* } 20 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(2\\)" " " { target *-*-* } 42 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(2\\)" " " { target *-*-* } 43 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(5\\)" " " { target *-*-* } 44 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(3\\)" " " { target *-*-* } 45 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(6\\)" " " { target *-*-* } 67 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(6\\)" " " { target *-*-* } 68 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(10\\)" " " { target *-*-* } 69 }
|
||||
! { dg-warning "Extension: Conversion from CHARACTER\\(5\\)" " " { target *-*-* } 70 }
|
||||
|
||||
|
20
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_3.f90
Normal file
20
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_3.f90
Normal file
@ -0,0 +1,20 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec -fno-dec-char-conversions" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
include "dec_char_conversion_in_data_1.f90"
|
||||
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 17 }
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 18 }
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 19 }
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 20 }
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 42 }
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 43 }
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 44 }
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 45 }
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 67 }
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 68 }
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 69 }
|
||||
! { dg-error "Incompatible types" " " { target *-*-* } 70 }
|
||||
|
17
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_4.f90
Normal file
17
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_4.f90
Normal file
@ -0,0 +1,17 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec -Wcharacter-truncation" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
include "dec_char_conversion_in_data_1.f90"
|
||||
|
||||
! { dg-warning "character constant at \\(1\\) is truncated in conversion" " " { target *-*-* } 67 }
|
||||
! { dg-warning "character constant at \\(1\\) is truncated in conversion" " " { target *-*-* } 68 }
|
||||
! { dg-warning "character constant at \\(1\\) is truncated in conversion" " " { target *-*-* } 69 }
|
||||
! { dg-warning "character constant at \\(1\\) is truncated in conversion" " " { target *-*-* } 70 }
|
||||
! { dg-warning "Hollerith constant at \\(1\\) is truncated in conversion" " " { target *-*-* } 71 }
|
||||
! { dg-warning "Hollerith constant at \\(1\\) is truncated in conversion" " " { target *-*-* } 72 }
|
||||
! { dg-warning "Hollerith constant at \\(1\\) is truncated in conversion" " " { target *-*-* } 73 }
|
||||
! { dg-warning "Hollerith constant at \\(1\\) is truncated in conversion" " " { target *-*-* } 74 }
|
||||
|
||||
|
15
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_5.f90
Normal file
15
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_5.f90
Normal file
@ -0,0 +1,15 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec -Wsurprising" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
include "dec_char_conversion_in_data_1.f90"
|
||||
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 20 }
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 24 }
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 45 }
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 49 }
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 70 }
|
||||
! { dg-warning "Assigning value other than 0 or 1 to LOGICAL" " " { target *-*-* } 74 }
|
||||
|
||||
|
33
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_6.f90
Normal file
33
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_6.f90
Normal file
@ -0,0 +1,33 @@
|
||||
! { dg-do run }
|
||||
! { dg-options "-fdec -Wconversion" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
include "dec_char_conversion_in_data_1.f90"
|
||||
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(4\\)" " " { target *-*-* } 17 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(4\\)" " " { target *-*-* } 18 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(8\\)" " " { target *-*-* } 19 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(4\\)" " " { target *-*-* } 20 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 21 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 22 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 23 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 24 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(2\\)" " " { target *-*-* } 42 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(2\\)" " " { target *-*-* } 43 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(5\\)" " " { target *-*-* } 44 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(3\\)" " " { target *-*-* } 45 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 46 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 47 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 48 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 49 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(6\\)" " " { target *-*-* } 67 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(6\\)" " " { target *-*-* } 68 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(10\\)" " " { target *-*-* } 69 }
|
||||
! { dg-warning "Nonstandard conversion from CHARACTER\\(5\\)" " " { target *-*-* } 70 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 71 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 72 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 73 }
|
||||
! { dg-warning "Conversion from HOLLERITH" " " { target *-*-* } 74 }
|
||||
|
||||
|
17
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_7.f90
Normal file
17
gcc/testsuite/gfortran.dg/dec_char_conversion_in_data_7.f90
Normal file
@ -0,0 +1,17 @@
|
||||
! { dg-do compile }
|
||||
! { dg-options "-fdec" }
|
||||
!
|
||||
! Modified by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
program test
|
||||
integer(4) :: a
|
||||
real(4) :: b
|
||||
complex(4) :: c
|
||||
logical(4) :: d
|
||||
|
||||
data a / 4_'1234' / ! { dg-error "attempted conversion of CHARACTER\\(4,4\\)" }
|
||||
data b / 4_'12' / ! { dg-error "attempted conversion of CHARACTER\\(2,4\\)" }
|
||||
data c / 4_'12341234' / ! { dg-error "attempted conversion of CHARACTER\\(8,4\\)" }
|
||||
data d / 4_'abcd' / ! { dg-error "attempted conversion of CHARACTER\\(4,4\\)" }
|
||||
end program
|
||||
|
@ -1,8 +1,9 @@
|
||||
! { dg-do compile }
|
||||
! { dg-options "-Wsurprising" }
|
||||
implicit none
|
||||
logical b
|
||||
b = 4Habcd ! { dg-warning "has undefined result" }
|
||||
end
|
||||
|
||||
! { dg-warning "Hollerith constant" "const" { target *-*-* } 4 }
|
||||
! { dg-warning "Conversion" "conversion" { target *-*-* } 4 }
|
||||
! { dg-warning "Hollerith constant" "const" { target *-*-* } 5 }
|
||||
! { dg-warning "Conversion" "conversion" { target *-*-* } 5 }
|
||||
|
@ -1,5 +1,5 @@
|
||||
! { dg-do compile }
|
||||
! { dg-options "-std=legacy" }
|
||||
! { dg-options "-std=legacy -Wsurprising" }
|
||||
! PR15966, PR18781 & PR16531
|
||||
implicit none
|
||||
complex(kind=8) x(2)
|
||||
|
21
gcc/testsuite/gfortran.dg/no_char_to_numeric_assign.f90
Normal file
21
gcc/testsuite/gfortran.dg/no_char_to_numeric_assign.f90
Normal file
@ -0,0 +1,21 @@
|
||||
! { dg-do compile }
|
||||
! { dg-options "-fdec-char-conversions" }
|
||||
!
|
||||
! Test character variables can not be assigned to numeric and
|
||||
! logical variables.
|
||||
!
|
||||
! Test case contributed by Mark Eggleston <mark.eggleston@codethink.com>
|
||||
!
|
||||
program test
|
||||
integer a
|
||||
real b
|
||||
complex c
|
||||
logical d
|
||||
character e
|
||||
|
||||
e = "A"
|
||||
a = e ! { dg-error "Cannot convert" }
|
||||
b = e ! { dg-error "Cannot convert" }
|
||||
c = e ! { dg-error "Cannot convert" }
|
||||
d = e ! { dg-error "Cannot convert" }
|
||||
end program
|
Loading…
Reference in New Issue
Block a user