From 5d240c8594f21b7957f3a449c9a2e2517fb149bf Mon Sep 17 00:00:00 2001 From: tkoenig Date: Sun, 4 Sep 2016 16:17:55 +0000 Subject: 2016-09-04 Thomas Koenig PR fortran/71902 * frontend-passes.c (realloc_string_callback): Also check for the lhs being deferred. Name temporary variable "realloc_string". 2016-09-04 Thomas Koenig PR fortran/71902 * gfortran.dg/dependency_47.f90: New test. * gfortran.dg/dependency_49.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@239977 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/frontend-passes.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index c138f4d7c77..cd109791075 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -164,19 +164,34 @@ realloc_string_callback (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED, gfc_expr *expr1, *expr2; gfc_code *co = *c; gfc_expr *n; + gfc_ref *ref; + bool found_substr; if (co->op != EXEC_ASSIGN) return 0; expr1 = co->expr1; if (expr1->ts.type != BT_CHARACTER || expr1->rank != 0 - || !expr1->symtree->n.sym->attr.allocatable) + || !gfc_expr_attr(expr1).allocatable + || !expr1->ts.deferred) return 0; expr2 = gfc_discard_nops (co->expr2); if (expr2->expr_type != EXPR_VARIABLE) return 0; + found_substr = false; + for (ref = expr2->ref; ref; ref = ref->next) + { + if (ref->type == REF_SUBSTRING) + { + found_substr = true; + break; + } + } + if (!found_substr) + return 0; + if (!gfc_check_dependency (expr1, expr2, true)) return 0; @@ -190,7 +205,7 @@ realloc_string_callback (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED, current_code = c; inserted_block = NULL; changed_statement = NULL; - n = create_var (expr2, "trim"); + n = create_var (expr2, "realloc_string"); co->expr2 = n; return 0; } -- cgit v1.2.1 From a1cf06b8117ea8ec340820613034319497f09549 Mon Sep 17 00:00:00 2001 From: kargl Date: Sun, 4 Sep 2016 18:43:40 +0000 Subject: 2016-09-04 Steven G. Kargl PR fortran/77460 * simplify.c (simplify_transformation_to_scalar): On error, result may be NULL, simply return. 2016-09-04 Steven G. Kargl PR fortran/77460 * gfortran.dg/pr77460.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@239979 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/simplify.c | 2 ++ 2 files changed, 8 insertions(+) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9913c97de04..0b452f4664e 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-09-04 Steven G. Kargl + + PR fortran/77460 + * simplify.c (simplify_transformation_to_scalar): On error, result + may be NULL, simply return. + 2016-08-31 Jakub Jelinek PR fortran/77352 diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 6e6566d9245..c396653fa1c 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -489,6 +489,8 @@ simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr * } result = op (result, gfc_copy_expr (a)); + if (!result) + return result; } return result; -- cgit v1.2.1 From 65277f2ad39855765a3386df08e8dbb40fbd07f2 Mon Sep 17 00:00:00 2001 From: kargl Date: Sun, 4 Sep 2016 20:00:48 +0000 Subject: 2016-09-04 Steven G. Kargl PR fortran/77391 * resolve.c (deferred_requirements): New function to check F2008:C402. (resolve_fl_variable,resolve_fl_parameter): Use it. 2016-09-04 Steven G. Kargl PR fortran/77391 * gfortran.dg/pr77391.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@239982 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/resolve.c | 38 +++++++++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 11 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0b452f4664e..8e525dc5fd6 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-09-04 Steven G. Kargl + + PR fortran/77391 + * resolve.c (deferred_requirements): New function to check F2008:C402. + (resolve_fl_variable,resolve_fl_parameter): Use it. + 2016-09-04 Steven G. Kargl PR fortran/77460 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 39c1330c455..f8ba00bab82 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -11488,6 +11488,27 @@ resolve_fl_variable_derived (gfc_symbol *sym, int no_init_flag) } +/* F2008, C402 (R401): A colon shall not be used as a type-param-value + except in the declaration of an entity or component that has the POINTER + or ALLOCATABLE attribute. */ + +static bool +deferred_requirements (gfc_symbol *sym) +{ + if (sym->ts.deferred + && !(sym->attr.pointer + || sym->attr.allocatable + || sym->attr.omp_udr_artificial_var)) + { + gfc_error ("Entity %qs at %L has a deferred type parameter and " + "requires either the POINTER or ALLOCATABLE attribute", + sym->name, &sym->declared_at); + return false; + } + return true; +} + + /* Resolve symbols with flavor variable. */ static bool @@ -11527,17 +11548,8 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag) } /* Constraints on deferred type parameter. */ - if (sym->ts.deferred - && !(sym->attr.pointer - || sym->attr.allocatable - || sym->attr.omp_udr_artificial_var)) - { - gfc_error ("Entity %qs at %L has a deferred type parameter and " - "requires either the pointer or allocatable attribute", - sym->name, &sym->declared_at); - specification_expr = saved_specification_expr; - return false; - } + if (!deferred_requirements (sym)) + return false; if (sym->ts.type == BT_CHARACTER) { @@ -13682,6 +13694,10 @@ resolve_fl_parameter (gfc_symbol *sym) return false; } + /* Constraints on deferred type parameter. */ + if (!deferred_requirements (sym)) + return false; + /* Make sure a parameter that has been implicitly typed still matches the implicit type, since PARAMETER statements can precede IMPLICIT statements. */ -- cgit v1.2.1 From 92a44a68071e46ac8bc265615f441997feeb731e Mon Sep 17 00:00:00 2001 From: jakub Date: Mon, 5 Sep 2016 19:42:42 +0000 Subject: ChangeLog formatting fixes. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@239997 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 8e525dc5fd6..82513f4c502 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -95,13 +95,13 @@ * interface.c (compare_components, gfc_compare_derived_types): Use new functions. -2016-08-27 Steven G. Kargl +2016-08-27 Steven G. Kargl PR fortran/77380 * dependency.c (gfc_check_dependency): Do not assert with -fcoarray=lib. -2016-08-27 Steven G. Kargl +2016-08-27 Steven G. Kargl PR fortran/77372 simplify.c (simplify_ieee_selected_real_kind): Check for NULL pointers. @@ -271,7 +271,7 @@ * intrinsic.c (add_function, add_subroutine): New B/I/J/K intrinsic variants. -2016-07-30 Steven G. Kargl +2016-07-30 Steven G. Kargl PR fortran/41922 * target-memory.c (expr_to_char): Pass in locus and use it in error @@ -395,7 +395,7 @@ a static one. 2016-07-15 Jerry DeLisle - Marco Restelli + Marco Restelli PR fortran/62125 * symbol.c (select_type_insert_tmp): Recursively call self to take care @@ -950,7 +950,7 @@ * dump-parse-tree.c (show_code_node): Print association list of a block if present. Handle EXEC_END_BLOCK. -2016-02-28 Harald Anlauf +2016-02-28 Harald Anlauf Jerry DeLisle PR fortran/56007 @@ -1136,7 +1136,7 @@ * frontend-passes.c (matmul_lhs_realloc): Add forgotten break statement. -2016-01-24 Dominique d'Humieres +2016-01-24 Dominique d'Humieres PR fortran/68283 * primary.c (gfc_variable_attr): revert revision r221955, -- cgit v1.2.1 From a34338c90fa38c45b84f591e2110c7792ad953bb Mon Sep 17 00:00:00 2001 From: jakub Date: Thu, 8 Sep 2016 12:19:21 +0000 Subject: PR fortran/77500 * trans-openmp.c (gfc_trans_omp_atomic): For atomic write or swap, don't try to look through GFC_ISYM_CONVERSION. In other cases, check that value.function.isym is non-NULL before dereferencing it. * gfortran.dg/gomp/pr77500.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240038 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/trans-openmp.c | 10 +++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 82513f4c502..a0be0741ff1 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2016-09-08 Jakub Jelinek + + PR fortran/77500 + * trans-openmp.c (gfc_trans_omp_atomic): For atomic write or + swap, don't try to look through GFC_ISYM_CONVERSION. In other cases, + check that value.function.isym is non-NULL before dereferencing it. + 2016-09-04 Steven G. Kargl PR fortran/77391 diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index c0d67617871..e4a2975719e 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -2818,7 +2818,11 @@ gfc_trans_omp_atomic (gfc_code *code) gfc_start_block (&block); expr2 = code->expr2; - if (expr2->expr_type == EXPR_FUNCTION + if (((atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_MASK) + != GFC_OMP_ATOMIC_WRITE) + && (atomic_code->ext.omp_atomic & GFC_OMP_ATOMIC_SWAP) == 0 + && expr2->expr_type == EXPR_FUNCTION + && expr2->value.function.isym && expr2->value.function.isym->id == GFC_ISYM_CONVERSION) expr2 = expr2->value.function.actual->expr; @@ -2857,6 +2861,7 @@ gfc_trans_omp_atomic (gfc_code *code) var = code->expr1->symtree->n.sym; expr2 = code->expr2; if (expr2->expr_type == EXPR_FUNCTION + && expr2->value.function.isym && expr2->value.function.isym->id == GFC_ISYM_CONVERSION) expr2 = expr2->value.function.actual->expr; } @@ -2914,6 +2919,7 @@ gfc_trans_omp_atomic (gfc_code *code) } e = expr2->value.op.op1; if (e->expr_type == EXPR_FUNCTION + && e->value.function.isym && e->value.function.isym->id == GFC_ISYM_CONVERSION) e = e->value.function.actual->expr; if (e->expr_type == EXPR_VARIABLE @@ -2927,6 +2933,7 @@ gfc_trans_omp_atomic (gfc_code *code) { e = expr2->value.op.op2; if (e->expr_type == EXPR_FUNCTION + && e->value.function.isym && e->value.function.isym->id == GFC_ISYM_CONVERSION) e = e->value.function.actual->expr; gcc_assert (e->expr_type == EXPR_VARIABLE @@ -3041,6 +3048,7 @@ gfc_trans_omp_atomic (gfc_code *code) code = code->next; expr2 = code->expr2; if (expr2->expr_type == EXPR_FUNCTION + && expr2->value.function.isym && expr2->value.function.isym->id == GFC_ISYM_CONVERSION) expr2 = expr2->value.function.actual->expr; -- cgit v1.2.1 From 3e7e4e148f62893f0aeed440887a4063efc203b7 Mon Sep 17 00:00:00 2001 From: kargl Date: Thu, 8 Sep 2016 22:33:10 +0000 Subject: 2016-09-08 Steven G. Kargl PR fortran/69514 * array.c (gfc_match_array_constructor): If type-spec is present, walk the array constructor performing possible conversions for numeric types. 2016-09-08 Steven G. Kargl Louis Krupp PR fortran/69514 * gfortran.dg/pr69514_1.f90: New test. * gfortran.dg/pr69514_2.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240039 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/array.c | 11 +++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a0be0741ff1..53c6e2d50a9 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2016-09-08 Steven G. Kargl + + PR fortran/69514 + * array.c (gfc_match_array_constructor): If type-spec is present, + walk the array constructor performing possible conversions for + numeric types. + 2016-09-08 Jakub Jelinek PR fortran/77500 diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c index 03c8b17178c..48a7250d108 100644 --- a/gcc/fortran/array.c +++ b/gcc/fortran/array.c @@ -1089,6 +1089,7 @@ match_array_cons_element (gfc_constructor_base *result) match gfc_match_array_constructor (gfc_expr **result) { + gfc_constructor *c; gfc_constructor_base head, new_cons; gfc_undo_change_set changed_syms; gfc_expr *expr; @@ -1194,8 +1195,6 @@ done: be converted. See PR fortran/67803. */ if (ts.type == BT_CHARACTER) { - gfc_constructor *c; - c = gfc_constructor_first (head); for (; c; c = gfc_constructor_next (c)) { @@ -1218,6 +1217,14 @@ done: } } } + + /* Walk the constructor and ensure type conversion for numeric types. */ + if (gfc_numeric_ts (&ts)) + { + c = gfc_constructor_first (head); + for (; c; c = gfc_constructor_next (c)) + gfc_convert_type (c->expr, &ts, 1); + } } else expr = gfc_get_array_expr (BT_UNKNOWN, 0, &where); -- cgit v1.2.1 From 374777a4c84c0a76f5dc7c4db88369b958a8cb6d Mon Sep 17 00:00:00 2001 From: kargl Date: Fri, 9 Sep 2016 17:57:11 +0000 Subject: 2016-09-09 Steven G. Kargl PR fortran/77507 * intrinsic.c (add_functions): Use correct keyword. 2016-09-09 Steven G. Kargl PR fortran/77507 * ieee/ieee_arithmetic.F90 (IEEE_VALUE_4,IEEE_VALUE_8,IEEE_VALULE_10, IEEE_VALUE_16): Use correct keyword. 2016-09-09 Steven G. Kargl PR fortran/77507 * gfortran.dg/pr77507.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240050 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/intrinsic.c | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 53c6e2d50a9..a0afe045b9a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2016-09-09 Steven G. Kargl + + PR fortran/77507 + * intrinsic.c (add_functions): Use correct keyword. + 2016-09-08 Steven G. Kargl PR fortran/69514 diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c index ca28eac8cf7..cad54b8100b 100644 --- a/gcc/fortran/intrinsic.c +++ b/gcc/fortran/intrinsic.c @@ -1239,7 +1239,8 @@ add_functions (void) *z = "z", *ln = "len", *ut = "unit", *han = "handler", *num = "number", *tm = "time", *nm = "name", *md = "mode", *vl = "values", *p1 = "path1", *p2 = "path2", *com = "command", - *ca = "coarray", *sub = "sub", *dist = "distance", *failed="failed"; + *ca = "coarray", *sub = "sub", *dist = "distance", *failed="failed", + *c_ptr_1 = "c_ptr_1", *c_ptr_2 = "c_ptr_2"; int di, dr, dd, dl, dc, dz, ii; @@ -2914,8 +2915,8 @@ add_functions (void) /* The following functions are part of ISO_C_BINDING. */ add_sym_2 ("c_associated", GFC_ISYM_C_ASSOCIATED, CLASS_INQUIRY, ACTUAL_NO, BT_LOGICAL, dl, GFC_STD_F2003, gfc_check_c_associated, NULL, NULL, - "C_PTR_1", BT_VOID, 0, REQUIRED, - "C_PTR_2", BT_VOID, 0, OPTIONAL); + c_ptr_1, BT_VOID, 0, REQUIRED, + c_ptr_2, BT_VOID, 0, OPTIONAL); make_from_module(); add_sym_1 ("c_loc", GFC_ISYM_C_LOC, CLASS_INQUIRY, ACTUAL_NO, -- cgit v1.2.1 From edd0f33b436a5aedbfa5bde8f918acd498934a10 Mon Sep 17 00:00:00 2001 From: kargl Date: Fri, 9 Sep 2016 18:04:23 +0000 Subject: 2016-09-09 Steven G. Kargl PR fortran/77506 * array.c (gfc_match_array_constructor): CHARACTER(len=*) cannot appear in an array constructor. 2016-09-09 Steven G. Kargl PR fortran/77506 * gfortran.dg/pr77506.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240052 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/array.c | 9 +++++++++ 2 files changed, 15 insertions(+) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a0afe045b9a..284bf7d92c0 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-09-09 Steven G. Kargl + + PR fortran/77506 + * array.c (gfc_match_array_constructor): CHARACTER(len=*) cannot + appear in an array constructor. + 2016-09-09 Steven G. Kargl PR fortran/77507 diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c index 48a7250d108..14e20a36de5 100644 --- a/gcc/fortran/array.c +++ b/gcc/fortran/array.c @@ -1142,6 +1142,15 @@ gfc_match_array_constructor (gfc_expr **result) gfc_restore_last_undo_checkpoint (); goto cleanup; } + + if (ts.type == BT_CHARACTER + && ts.u.cl && !ts.u.cl->length && !ts.u.cl->length_from_typespec) + { + gfc_error ("Type-spec at %L cannot contain an asterisk for a " + "type parameter", &where); + gfc_restore_last_undo_checkpoint (); + goto cleanup; + } } } else if (m == MATCH_ERROR) -- cgit v1.2.1 From e38cd8fe27a7025839d8b7c3e6079b49775ed0b7 Mon Sep 17 00:00:00 2001 From: kargl Date: Sat, 10 Sep 2016 00:52:45 +0000 Subject: 2016-09-09 Steven G. Kargl PR fortran/77420 * module.c (load_equiv): If the current namespace has a list of equivalence statements, initialize duplicate to false and then look for duplicates; otherwise, initialize it to true. 2016-09-09 Steven G. Kargl PR fortran/77420 * gfortran.dg/pr77420.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240063 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/module.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 4d664f079f5..18e1ceeff9e 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -4647,7 +4647,7 @@ load_equiv (void) } /* Check for duplicate equivalences being loaded from different modules */ - duplicate = false; + duplicate = gfc_current_ns->equiv ? false:true; for (equiv = gfc_current_ns->equiv; equiv; equiv = equiv->next) { if (equiv->module && head->module -- cgit v1.2.1 From f8587f272330d59d6938bbb30a7b1f02a314660b Mon Sep 17 00:00:00 2001 From: kargl Date: Sat, 10 Sep 2016 00:59:33 +0000 Subject: Commit the ChangeLog entry for revision 240063. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240064 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 284bf7d92c0..bcaf4447521 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2016-09-09 Steven G. Kargl + + PR fortran/77420 + * module.c (load_equiv): If the current namespace has a list of + equivalence statements, initialize duplicate to false and then + look for duplicates; otherwise, initialize it to true. + 2016-09-09 Steven G. Kargl PR fortran/77506 -- cgit v1.2.1 From 953b9eef1d0b6b72c78fba6764fbec551a8755ae Mon Sep 17 00:00:00 2001 From: jvdelisle Date: Sat, 10 Sep 2016 21:16:45 +0000 Subject: 2016-09-10 Paul Thomas Steven G. Kargl PR fortran/77532 ^ interface.c (check_dtio_arg_TKR_intent): Return after error. (check_dtio_interface1): Remove asserts, test for NULL and return if found. gfortran.dg/dtio_11.f90: new test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240074 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 8 ++++++++ gcc/fortran/interface.c | 18 ++++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index bcaf4447521..188871b17fb 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2016-09-10 Paul Thomas + Steven G. Kargl + + PR fortran/77532 + ^ interface.c (check_dtio_arg_TKR_intent): Return after error. + (check_dtio_interface1): Remove asserts, test for NULL and return + if found. + 2016-09-09 Steven G. Kargl PR fortran/77420 diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index fece3168dc7..45a9afe5685 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -4559,8 +4559,11 @@ check_dtio_arg_TKR_intent (gfc_symbol *fsym, bool typebound, bt type, int kind, int rank, sym_intent intent) { if (fsym->ts.type != type) - gfc_error ("DTIO dummy argument at %L must be of type %s", - &fsym->declared_at, gfc_basic_typename (type)); + { + gfc_error ("DTIO dummy argument at %L must be of type %s", + &fsym->declared_at, gfc_basic_typename (type)); + return; + } if (fsym->ts.type != BT_CLASS && fsym->ts.type != BT_DERIVED && fsym->ts.kind != kind) @@ -4606,20 +4609,23 @@ check_dtio_interface1 (gfc_symbol *derived, gfc_symtree *tb_io_st, { /* Typebound DTIO binding. */ tb_io_proc = tb_io_st->n.tb; - gcc_assert (tb_io_proc != NULL); + if (tb_io_proc == NULL) + return; + gcc_assert (tb_io_proc->is_generic); gcc_assert (tb_io_proc->u.generic->next == NULL); specific_proc = tb_io_proc->u.generic->specific; - gcc_assert (!specific_proc->is_generic); + if (specific_proc == NULL || specific_proc->is_generic) + return; dtio_sub = specific_proc->u.specific->n.sym; } else { generic_proc = tb_io_st->n.sym; - gcc_assert (generic_proc); - gcc_assert (generic_proc->generic); + if (generic_proc == NULL || generic_proc->generic == NULL) + return; for (intr = tb_io_st->n.sym->generic; intr; intr = intr->next) { -- cgit v1.2.1 From 971f2b7f760c6fdc2eb653703d36e232f5b5fafe Mon Sep 17 00:00:00 2001 From: jvdelisle Date: Sat, 10 Sep 2016 21:18:28 +0000 Subject: Fix typo in log. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240075 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 188871b17fb..0c0e2460183 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -2,7 +2,7 @@ Steven G. Kargl PR fortran/77532 - ^ interface.c (check_dtio_arg_TKR_intent): Return after error. + * interface.c (check_dtio_arg_TKR_intent): Return after error. (check_dtio_interface1): Remove asserts, test for NULL and return if found. -- cgit v1.2.1 From d5b9ea5044734f437a523eaa82f9705a7009bcda Mon Sep 17 00:00:00 2001 From: kargl Date: Tue, 13 Sep 2016 17:00:29 +0000 Subject: 2016-09-13 Steven G. Kargl PR fortran/77420 * module.c (load_equiv): Revert revision 240063. 2016-09-13 Steven G. Kargl PR fortran/77420 * gfortran.dg/pr77420.f90: Revert revision 240063 by removing test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240118 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/module.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0c0e2460183..77ab72f1371 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2016-09-13 Steven G. Kargl + + PR fortran/77420 + * module.c (load_equiv): Revert revision 240063. + 2016-09-10 Paul Thomas Steven G. Kargl diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 18e1ceeff9e..4d664f079f5 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -4647,7 +4647,7 @@ load_equiv (void) } /* Check for duplicate equivalences being loaded from different modules */ - duplicate = gfc_current_ns->equiv ? false:true; + duplicate = false; for (equiv = gfc_current_ns->equiv; equiv; equiv = equiv->next) { if (equiv->module && head->module -- cgit v1.2.1 From 056b5aee134f4f5b5b13e187519e323b2bee4c8c Mon Sep 17 00:00:00 2001 From: edlinger Date: Wed, 14 Sep 2016 18:04:39 +0000 Subject: 2016-09-14 Bernd Edlinger * simplify.c (gfc_simplify_repeat): Fix a misplaced closing ')'. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240142 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 4 ++++ gcc/fortran/simplify.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 77ab72f1371..55380a01f57 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,7 @@ +2016-09-14 Bernd Edlinger + + * simplify.c (gfc_simplify_repeat): Fix a misplaced closing ')'. + 2016-09-13 Steven G. Kargl PR fortran/77420 diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index c396653fa1c..ad547a15e47 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -5127,7 +5127,7 @@ gfc_simplify_repeat (gfc_expr *e, gfc_expr *n) if (len || (e->ts.u.cl->length && - mpz_sgn (e->ts.u.cl->length->value.integer)) != 0) + mpz_sgn (e->ts.u.cl->length->value.integer) != 0)) { const char *res = gfc_extract_int (n, &ncop); gcc_assert (res == NULL); -- cgit v1.2.1 From b74250bce94c2415c150a9fb6c43b853d754bfa2 Mon Sep 17 00:00:00 2001 From: lkrupp Date: Thu, 15 Sep 2016 23:54:40 +0000 Subject: 2016-09-15 Louis Krupp PR fortran/69963 * parse.c (reject_statement): Clear charlen pointers in implicit character typespecs before those charlen structures are freed. 2016-09-15 Louis Krupp PR fortran/69963 * gfortran.dg/misplaced_implicit_character.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240168 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/parse.c | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 55380a01f57..ffc859a4128 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2016-09-15 Louis Krupp + PR fortran/69963 + * parse.c (reject_statement): Clear charlen pointers in implicit + character typespecs before those charlen structures are freed. + 2016-09-14 Bernd Edlinger * simplify.c (gfc_simplify_repeat): Fix a misplaced closing ')'. diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 86f2c427368..d78a2c07eec 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -2399,6 +2399,29 @@ accept_statement (gfc_statement st) } +/* Clear default character types with charlen pointers that are about + to become invalid. */ + +static void +clear_default_charlen (gfc_namespace *ns, const gfc_charlen *cl, + const gfc_charlen *end) +{ + gfc_typespec *ts; + + for (ts = &ns->default_type[0]; ts < &ns->default_type[GFC_LETTERS]; ts++) + if (ts->type == BT_CHARACTER) + { + const gfc_charlen *cl2; + for (cl2 = cl; cl2 != end; cl2 = cl2->next) + if (ts->u.cl == cl2) + { + ts->u.cl = NULL; + ts->type = BT_UNKNOWN; + break; + } + } +} + /* Undo anything tentative that has been built for the current statement. */ @@ -2406,6 +2429,8 @@ static void reject_statement (void) { /* Revert to the previous charlen chain. */ + clear_default_charlen (gfc_current_ns, + gfc_current_ns->cl_list, gfc_current_ns->old_cl_list); gfc_free_charlen (gfc_current_ns->cl_list, gfc_current_ns->old_cl_list); gfc_current_ns->cl_list = gfc_current_ns->old_cl_list; -- cgit v1.2.1 From 42f172d025a5f4f44520b5b172d1786ea2a8fc24 Mon Sep 17 00:00:00 2001 From: kargl Date: Fri, 16 Sep 2016 17:55:38 +0000 Subject: 2016-09-16 Steven G. Kargl PR fortran/77612 * decl.c (char_len_param_value): Check parent namespace for seen_implicit_none. 2016-09-16 Steven G. Kargl PR fortran/77612 * gfortran.dg/pr77612.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240191 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/decl.c | 7 ++++--- 2 files changed, 11 insertions(+), 3 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ffc859a4128..5954c73f404 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,11 @@ +2016-09-16 Steven G. Kargl + + PR fortran/77612 + * decl.c (char_len_param_value): Check parent namespace for + seen_implicit_none. + 2016-09-15 Louis Krupp + PR fortran/69963 * parse.c (reject_statement): Clear charlen pointers in implicit character typespecs before those charlen structures are freed. diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index b5242394cef..c83e9d4d791 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -920,9 +920,10 @@ char_len_param_value (gfc_expr **expr, bool *deferred) t = gfc_reduce_init_expr (e); - if (!t && (e->ts.type == BT_UNKNOWN - && e->symtree->n.sym->attr.untyped == 1 - && e->symtree->n.sym->ns->seen_implicit_none == 1)) + if (!t && e->ts.type == BT_UNKNOWN + && e->symtree->n.sym->attr.untyped == 1 + && (e->symtree->n.sym->ns->seen_implicit_none == 1 + || e->symtree->n.sym->ns->parent->seen_implicit_none == 1)) { gfc_free_expr (e); goto syntax; -- cgit v1.2.1 From 360d7ea8d2a1993181da700c43cc746751e50c7d Mon Sep 17 00:00:00 2001 From: lkrupp Date: Sun, 18 Sep 2016 05:52:23 +0000 Subject: 2016-09-17 Louis Krupp PR fortran/68078 * gfortran.dg/pr68078.f90: New test. * gfortran.dg/set_vm_limit.c: New, called by pr68078. 2016_09_17 Louis Krupp PR fortran/68078 * resolve.c (resolve_allocate_expr): Check that derived type pointer, object or array has been successfully allocated before initializing. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240219 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/resolve.c | 38 ++++++++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 8 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 5954c73f404..611699f3ac2 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2016_09_17 Louis Krupp + + PR fortran/68078 + * resolve.c (resolve_allocate_expr): Check that derived type + pointer, object or array has been successfully allocated before + initializing. + 2016-09-16 Steven G. Kargl PR fortran/77612 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index f8ba00bab82..037c2fe74e0 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -6928,6 +6928,35 @@ conformable_arrays (gfc_expr *e1, gfc_expr *e2) return true; } +static void +cond_init (gfc_code *code, gfc_expr *e, int pointer, gfc_expr *init_e) +{ + gfc_code *block; + gfc_expr *cond; + gfc_code *init_st; + gfc_expr *e_to_init = gfc_expr_to_initialize (e); + + cond = pointer + ? gfc_build_intrinsic_call (gfc_current_ns, GFC_ISYM_ASSOCIATED, + "associated", code->loc, 2, gfc_copy_expr (e_to_init), NULL) + : gfc_build_intrinsic_call (gfc_current_ns, GFC_ISYM_ALLOCATED, + "allocated", code->loc, 1, gfc_copy_expr (e_to_init)); + + init_st = gfc_get_code (EXEC_INIT_ASSIGN); + init_st->loc = code->loc; + init_st->expr1 = e_to_init; + init_st->expr2 = init_e; + + block = gfc_get_code (EXEC_IF); + block->loc = code->loc; + block->block = gfc_get_code (EXEC_IF); + block->block->loc = code->loc; + block->block->expr1 = cond; + block->block->next = init_st; + block->next = code->next; + + code->next = block; +} /* Resolve the expression in an ALLOCATE statement, doing the additional checks to see whether the expression is OK or not. The expression must @@ -7193,14 +7222,7 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code, bool *array_alloc_wo_spec) ts = ts.u.derived->components->ts; if (gfc_bt_struct (ts.type) && (init_e = gfc_default_initializer (&ts))) - { - gfc_code *init_st = gfc_get_code (EXEC_INIT_ASSIGN); - init_st->loc = code->loc; - init_st->expr1 = gfc_expr_to_initialize (e); - init_st->expr2 = init_e; - init_st->next = code->next; - code->next = init_st; - } + cond_init (code, e, pointer, init_e); } else if (code->expr3->mold && code->expr3->ts.type == BT_DERIVED) { -- cgit v1.2.1 From 891196d7325e4c55d92d5ac5cfe7161c4f36c0ce Mon Sep 17 00:00:00 2001 From: foreese Date: Mon, 19 Sep 2016 11:32:09 +0000 Subject: 2016-09-19 Fritz Reese PR fortran/77584 * gcc/fortran/decl.c (match_record_decl, gfc_match_decl_type_spec): Fixes to handling of structure/record from declaration-type-spec. * gcc/testsuite/gfortran.dg/dec_structure_15.f90: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240230 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/fortran/ChangeLog | 6 +++++ gcc/fortran/decl.c | 65 +++++++++++++++++++++++++++------------------------ 2 files changed, 41 insertions(+), 30 deletions(-) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 611699f3ac2..973f615b6b4 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-09-19 Fritz Reese + + PR fortran/77584 + * decl.c (match_record_decl, gfc_match_decl_type_spec): Fixes to + handling of structure/record from declaration-type-spec. + 2016_09_17 Louis Krupp PR fortran/68078 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index c83e9d4d791..d9fae5753d0 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -2909,12 +2909,14 @@ done: /* Matches a RECORD declaration. */ static match -match_record_decl (const char *name) +match_record_decl (char *name) { locus old_loc; old_loc = gfc_current_locus; + match m; - if (gfc_match (" record") == MATCH_YES) + m = gfc_match (" record /"); + if (m == MATCH_YES) { if (!gfc_option.flag_dec_structure) { @@ -2923,17 +2925,20 @@ match_record_decl (const char *name) "-fdec-structure"); return MATCH_ERROR; } - if (gfc_match (" /%n/", name) != MATCH_YES) - { - gfc_error ("Structure name expected after RECORD at %C"); - gfc_current_locus = old_loc; - return MATCH_ERROR; - } - return MATCH_YES; + m = gfc_match (" %n/", name); + if (m == MATCH_YES) + return MATCH_YES; } - gfc_current_locus = old_loc; + gfc_current_locus = old_loc; + if (gfc_option.flag_dec_structure + && (gfc_match (" record% ") == MATCH_YES + || gfc_match (" record%t") == MATCH_YES)) + gfc_error ("Structure name expected after RECORD at %C"); + if (m == MATCH_NO) return MATCH_NO; + + return MATCH_ERROR; } /* Matches a declaration-type-spec (F03:R502). If successful, sets the ts @@ -3128,26 +3133,26 @@ gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag) else { /* Match nested STRUCTURE declarations; only valid within another - structure declaration. */ - m = gfc_match (" structure"); - if (m == MATCH_ERROR) - return MATCH_ERROR; - else if (m == MATCH_YES) - { - if ( gfc_current_state () != COMP_STRUCTURE - && gfc_current_state () != COMP_MAP) - return MATCH_ERROR; - - m = gfc_match_structure_decl (); - if (m == MATCH_YES) - { - /* gfc_new_block is updated by match_structure_decl. */ - ts->type = BT_DERIVED; - ts->u.derived = gfc_new_block; - return MATCH_YES; - } - return MATCH_ERROR; - } + structure declaration. */ + if (gfc_option.flag_dec_structure + && (gfc_current_state () == COMP_STRUCTURE + || gfc_current_state () == COMP_MAP)) + { + m = gfc_match (" structure"); + if (m == MATCH_YES) + { + m = gfc_match_structure_decl (); + if (m == MATCH_YES) + { + /* gfc_new_block is updated by match_structure_decl. */ + ts->type = BT_DERIVED; + ts->u.derived = gfc_new_block; + return MATCH_YES; + } + } + if (m == MATCH_ERROR) + return MATCH_ERROR; + } /* Match CLASS declarations. */ m = gfc_match (" class ( * )"); -- cgit v1.2.1