diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2012-12-20 00:15:00 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2012-12-20 00:15:00 +0000 |
commit | 8b7043164fac12e4acf3aa25afaba15510e5b1c7 (patch) | |
tree | 2e697d5cae930814fb839a61cea3e7b4e8d95338 /gcc/fortran/simplify.c | |
parent | 26c08c0323ca8094d4841634c4bf04c14be23811 (diff) | |
download | gcc-8b7043164fac12e4acf3aa25afaba15510e5b1c7.zip gcc-8b7043164fac12e4acf3aa25afaba15510e5b1c7.tar.gz gcc-8b7043164fac12e4acf3aa25afaba15510e5b1c7.tar.bz2 |
array.c (resolve_array_list): Apply C4106.
2012-12-19 Paul Thomas <pault@gcc.gnu.org>
* array.c (resolve_array_list): Apply C4106.
* check.c (gfc_check_same_type_as): Exclude polymorphic
entities from check for extensible types. Improved error
for disallowed argument types to name the offending type.
* class.c : Update copyright date.
(gfc_class_null_initializer): Add argument for initialization
expression and deal with unlimited polymorphic typespecs.
(get_unique_type_string): Give unlimited polymorphic
entities a type string.
(gfc_intrinsic_hash_value): New function.
(gfc_build_class_symbol): Incorporate unlimited polymorphic
entities.
(gfc_find_derived_vtab): Deal with unlimited polymorphic
entities.
(gfc_find_intrinsic_vtab): New function.
* decl.c (gfc_match_decl_type_spec): Match typespec for
unlimited polymorphic type.
(gfc_match_data_decl): Skip to 'ok' if unlimited polymorphic.
expr.c (gfc_check_pointer_assign): Apply C717. If unlimited
polymorphic lvalue, find rvalue vtable for all typespecs,
except unlimited polymorphic expressions.
(gfc_check_vardef_context): Handle unlimited polymorphic
entities.
* gfortran.h : Add unlimited polymorphic attribute. Add
second arg to gfc_class_null_initializer primitive and
primitive for gfc_find_intrinsic_vtab. Add UNLIMITED_POLY
to detect unlimited polymorphic expressions.
* interface.c (gfc_compare_types): If expr1 is unlimited
polymorphic, always return 1. If expr2 is unlimited polymorphic
enforce C717.
(gfc_compare_interfaces): Skip past conditions that do not
apply for unlimited polymorphic entities.
(compare_parameter): Make sure that an unlimited polymorphic,
allocatable or pointer, formal argument is matched by an
unlimited polymorphic actual argument.
(compare_actual_formal): Ensure that an intrinsic vtable exists
to match an unlimited polymorphic formal argument.
* match.c (gfc_match_allocate): Type kind parameter does not
need to match an unlimited polymorphic allocate-object.
(alloc_opt_list): An unlimited polymorphic allocate-object
requires a typespec or a SOURCE tag.
(select_intrinsic_set_tmp): New function.
(select_type_set_tmp): Call new function. If it returns NULL,
build a derived type or class temporary instead.
(gfc_match_type_is): Remove restriction to derived types only.
Bind(C) or sequence derived types not permitted.
* misc (gfc_typename): Printed CLASS(*) for unlimited
polymorphism.
* module.c : Add AB_UNLIMITED_POLY to pass unlimited
polymorphic attribute to and from modules.
* resolve.c (resolve_common_vars): Unlimited polymorphic
entities cannot appear in common blocks.
(resolve_deallocate_expr): Deallocate unlimited polymorphic
enities.
(resolve_allocate_expr): Likewise for allocation. Make sure
vtable exists.
(gfc_type_is_extensible): Unlimited polymorphic entities are
not extensible.
(resolve_select_type): Handle unlimited polymorphic selectors.
Ensure that length type parameters are assumed and that names
for intrinsic types are generated.
(resolve_fl_var_and_proc): Exclude select type temporaries
from test of extensibility of type.
(resolve_fl_variable): Likewise for test that assumed character
length must be a dummy or a parameter.
(resolve_fl_derived0): Return SUCCESS unconditionally for
unlimited polymorphic entities. Also, allow unlimited
polymorphic components.
(resolve_fl_derived): Return SUCCESS unconditionally for
unlimited polymorphic entities.
(resolve_symbol): Return early with unlimited polymorphic
entities.
* simplifiy.c : Update copyright year.
(gfc_simplify_extends_type_of): No simplification possible
for unlimited polymorphic arguments.
* symbol.c (gfc_use_derived): Nothing to do for unlimited
polymorphic "derived type".
(gfc_type_compatible): Return unity if ts1 is unlimited
polymorphic.
* trans-decl.c (create_function_arglist) Formal arguments
without a character length should be treated in the same way
as passed lengths.
(gfc_trans_deferred_vars): Nullify the vptr of unlimited
polymorphic pointers. Avoid unlimited polymorphic entities
triggering gcc_unreachable.
* trans-expr.c (gfc_conv_intrinsic_to_class): New function.
(gfc_trans_class_init_assign): Make indirect reference of
src.expr.
(gfc_trans_class_assign): Expression NULL of unknown type
should set NULL vptr on lhs. Treat C717 cases where lhs is
a derived type and the rhs is unlimited polymorphic.
(gfc_conv_procedure_call): Handle the conversion of a non-class
actual argument to match an unlimited polymorphic formal
argument. Suppress the passing of a character string length
in this case. Make sure that calls to the character __copy
function have two character string length arguments.
(gfc_conv_initializer): Pass the initialization expression to
gfc_class_null_initializer.
(gfc_trans_subcomponent_assign): Ditto.
(gfc_conv_structure): Move handling of _size component.
trans-intrinsic.c: (gfc_conv_same_type_as): Handle conditions
where unlimited polymorphic arguments have null vptr.
* trans-stmt.c (trans_associate_var): Correctly treat array
temporaries associated with unlimited polymorphic selectors.
Recover the overwritten dtype for the descriptor. Use the _size
field of the vptr for character string lengths.
(gfc_trans_allocate): Cope with unlimited polymorphic allocate
objects; especially with character source tags.
(reset_vptr): New function.
(gfc_trans_deallocate): Call it.
* trans-types.c (gfc_get_derived_type): Detect unlimited
polymorphic types and deal with cases where the derived type of
components is null.
* trans.c : Update copyright year.
(trans_code): Call gfc_trans_class_assign for C717 cases where
the lhs is not unlimited polymorphic.
2012-12-19 Paul Thomas <pault@gcc.gnu.org>
* intrinsics/extends_type_of.c : Return correct results for
null vptrs.
2012-12-19 Paul Thomas <pault@gcc.gnu.org>
* gfortran.dg/unlimited_polymorphic_1.f03: New test.
* gfortran.dg/unlimited_polymorphic_2.f03: New test.
* gfortran.dg/unlimited_polymorphic_3.f03: New test.
* gfortran.dg/same_type_as.f03: Correct for improved message.
From-SVN: r194622
Diffstat (limited to 'gcc/fortran/simplify.c')
-rw-r--r-- | gcc/fortran/simplify.c | 72 |
1 files changed, 38 insertions, 34 deletions
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 2f96e90..eb3e8c3 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -1,6 +1,6 @@ /* Simplify intrinsic functions at compile-time. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, - 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, + 2009, 2010, 2011, 2012 Free Software Foundation, Inc. Contributed by Andy Vaught & Katherine Holcomb This file is part of GCC. @@ -82,7 +82,7 @@ range_check (gfc_expr *result, const char *name) { case ARITH_OK: return result; - + case ARITH_OVERFLOW: gfc_error ("Result of %s overflows its kind at %L", name, &result->where); @@ -380,7 +380,7 @@ compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a, } -/* Build a result expression for transformational intrinsics, +/* Build a result expression for transformational intrinsics, depending on DIM. */ static gfc_expr * @@ -491,7 +491,7 @@ simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr * REAL, PARAMETER :: array(n, m) = ... REAL, PARAMETER :: s(n) = PROD(array, DIM=1) - where OP == gfc_multiply(). The result might be post processed using post_op. */ + where OP == gfc_multiply(). The result might be post processed using post_op. */ static gfc_expr * simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim, @@ -1314,7 +1314,7 @@ gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x, mpfr_clear (last1); return result; } - + /* Get second recursion anchor. */ mpfr_init (last2); @@ -1335,7 +1335,7 @@ gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x, } if (jn) gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2); - else + else gfc_constructor_append_expr (&result->value.constructor, e, &x->where); if (n1 + 1 == n2) @@ -1349,7 +1349,7 @@ gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x, mpfr_init (x2rev); mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE); - + for (i = 2; i <= n2-n1; i++) { e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); @@ -1743,7 +1743,7 @@ gfc_simplify_cosh (gfc_expr *x) case BT_COMPLEX: mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); break; - + default: gcc_unreachable (); } @@ -2251,6 +2251,10 @@ gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold) return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, gfc_type_is_extension_of (mold->ts.u.derived, a->ts.u.derived)); + + if (UNLIMITED_POLY (a) || UNLIMITED_POLY (mold)) + return NULL; + /* Return .false. if the dynamic type can never be the same. */ if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS && !gfc_type_is_extension_of @@ -2676,7 +2680,7 @@ gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind) int back, len, lensub; int i, j, k, count, index = 0, start; - if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT + if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT || ( b != NULL && b->expr_type != EXPR_CONSTANT)) return NULL; @@ -2685,7 +2689,7 @@ gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind) else back = 0; - k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind); + k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind); if (k == -1) return &gfc_bad_expr; @@ -3229,7 +3233,7 @@ simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper, int k; k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND", - gfc_default_integer_kind); + gfc_default_integer_kind); if (k == -1) return &gfc_bad_expr; @@ -3558,7 +3562,7 @@ simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper) e->expr_type = EXPR_ARRAY; e->ts.type = BT_INTEGER; k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND", - gfc_default_integer_kind); + gfc_default_integer_kind); if (k == -1) { gfc_free_expr (e); @@ -3912,7 +3916,7 @@ gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg) if (i->expr_type != EXPR_CONSTANT) return NULL; - + kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind); if (kind == -1) return &gfc_bad_expr; @@ -3944,7 +3948,7 @@ gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg) if (i->expr_type != EXPR_CONSTANT) return NULL; - + kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind); if (kind == -1) return &gfc_bad_expr; @@ -4066,7 +4070,7 @@ min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign) #undef LENGTH #undef STRING break; - + default: gfc_internal_error ("simplify_min_max(): Bad type in arglist"); } @@ -4119,14 +4123,14 @@ simplify_min_max (gfc_expr *expr, int sign) return NULL; /* Convert to the correct type and kind. */ - if (expr->ts.type != BT_UNKNOWN) + if (expr->ts.type != BT_UNKNOWN) return gfc_convert_constant (expr->value.function.actual->expr, expr->ts.type, expr->ts.kind); - if (specific->ts.type != BT_UNKNOWN) + if (specific->ts.type != BT_UNKNOWN) return gfc_convert_constant (expr->value.function.actual->expr, - specific->ts.type, specific->ts.kind); - + specific->ts.type, specific->ts.kind); + return gfc_copy_expr (expr->value.function.actual->expr); } @@ -4176,14 +4180,14 @@ simplify_minval_maxval (gfc_expr *expr, int sign) return NULL; /* Convert to the correct type and kind. */ - if (expr->ts.type != BT_UNKNOWN) + if (expr->ts.type != BT_UNKNOWN) return gfc_convert_constant (extremum->expr, expr->ts.type, expr->ts.kind); - if (specific->ts.type != BT_UNKNOWN) + if (specific->ts.type != BT_UNKNOWN) return gfc_convert_constant (extremum->expr, - specific->ts.type, specific->ts.kind); - + specific->ts.type, specific->ts.kind); + return gfc_copy_expr (extremum->expr); } @@ -4261,7 +4265,7 @@ gfc_simplify_mod (gfc_expr *a, gfc_expr *p) } gfc_set_model_kind (kind); - mpfr_fmod (result->value.real, a->value.real, p->value.real, + mpfr_fmod (result->value.real, a->value.real, p->value.real, GFC_RND_MODE); break; @@ -4310,7 +4314,7 @@ gfc_simplify_modulo (gfc_expr *a, gfc_expr *p) } gfc_set_model_kind (kind); - mpfr_fmod (result->value.real, a->value.real, p->value.real, + mpfr_fmod (result->value.real, a->value.real, p->value.real, GFC_RND_MODE); if (mpfr_cmp_ui (result->value.real, 0) != 0) { @@ -4319,7 +4323,7 @@ gfc_simplify_modulo (gfc_expr *a, gfc_expr *p) GFC_RND_MODE); } else - mpfr_copysign (result->value.real, result->value.real, + mpfr_copysign (result->value.real, result->value.real, p->value.real, GFC_RND_MODE); break; @@ -4621,7 +4625,7 @@ gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector) } else if (mask->expr_type == EXPR_ARRAY) { - /* Copy only those elements of ARRAY to RESULT whose + /* Copy only those elements of ARRAY to RESULT whose MASK equals .TRUE.. */ mask_ctor = gfc_constructor_first (mask->value.constructor); while (mask_ctor) @@ -4921,8 +4925,8 @@ gfc_simplify_repeat (gfc_expr *e, gfc_expr *n) if (e->expr_type != EXPR_CONSTANT) return NULL; - if (len || - (e->ts.u.cl->length && + if (len || + (e->ts.u.cl->length && mpz_sgn (e->ts.u.cl->length->value.integer)) != 0) { const char *res = gfc_extract_int (n, &ncop); @@ -5740,7 +5744,7 @@ gfc_simplify_spacing (gfc_expr *x) } /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p - are the radix, exponent of x, and precision. This excludes the + are the radix, exponent of x, and precision. This excludes the possibility of subnormal numbers. Fortran 2003 states the result is b**max(e - p, emin - 1). */ @@ -6025,11 +6029,11 @@ gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size) : mold; /* Set result character length, if needed. Note that this needs to be - set even for array expressions, in order to pass this information into + set even for array expressions, in order to pass this information into gfc_target_interpret_expr. */ if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element)) result->value.character.length = mold_element->value.character.length; - + /* Set the number of elements in the result, and determine its size. */ if (mold->expr_type == EXPR_ARRAY || mold->rank || size) @@ -6087,7 +6091,7 @@ gfc_simplify_transpose (gfc_expr *matrix) { gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor, col * matrix_rows + row); - gfc_constructor_insert_expr (&result->value.constructor, + gfc_constructor_insert_expr (&result->value.constructor, gfc_copy_expr (e), &matrix->where, row * matrix_cols + col); } |