aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.cc
AgeCommit message (Collapse)AuthorFilesLines
2025-12-06Fortran: ALLOCATE with array-valued MOLD expression fails [PR122669]Paul Thomas1-1/+3
2025-12-06 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/122669 * resolve.cc (resolve_allocate_deallocate): Mold expressions with an array reference and a constant size must be resolved for each allocate object. gcc/testsuite PR fortran/122669 * gfortran.dg/pdt_73.f03: New test.
2025-12-05Fortran: associate to a contiguous pointer or target [PR122977]Harald Anlauf1-0/+1
PR fortran/122977 gcc/fortran/ChangeLog: * expr.cc (gfc_is_simply_contiguous): For an associate variable check whether the associate target is contiguous. * resolve.cc (resolve_symbol): Skip array type check for an associate variable when the target has the contiguous attribute. gcc/testsuite/ChangeLog: * gfortran.dg/contiguous_16.f90: New test.
2025-11-26OpenMP/Fortran: 'declare target' fix + parse 'local' clause; parse groupprivateTobias Burnus1-3/+16
Declare target's 'link' clause disallows 'nohost'; check for it. Additionally, some other cleanups have been done. The 'local' clause to 'declare target' is now supported in the FE, but a 'sorry, unimplemented' is printed at TREE generation time. This commit also adds the 'groupprivate' directive, which implies 'declare target' with the 'local' clause. And for completeness also the 'dyn_groupprivate' clause to 'target'. However, all those new features will eventually print 'sorry, unimplemented' for now. gcc/fortran/ChangeLog: * dump-parse-tree.cc (show_attr): Handle OpenMP's 'local' clause and the 'groupprivate' directive. (show_omp_clauses): Handle dyn_groupprivate. * frontend-passes.cc (gfc_code_walker): Walk dyn_groupprivate. * gfortran.h (enum gfc_statement): Add ST_OMP_GROUPPRIVATE. (enum gfc_omp_fallback, gfc_add_omp_groupprivate, gfc_add_omp_declare_target_local): New. * match.h (gfc_match_omp_groupprivate): New. * module.cc (enum ab_attribute, mio_symbol_attribute, load_commons, write_common_0): Handle 'groupprivate' + declare target's 'local'. * openmp.cc (gfc_omp_directives): Add 'groupprivate'. (gfc_free_omp_clauses): Free dyn_groupprivate. (enum omp_mask2): Add OMP_CLAUSE_LOCAL and OMP_CLAUSE_DYN_GROUPPRIVATE. (gfc_match_omp_clauses): Match them. (OMP_TARGET_CLAUSES): Add OMP_CLAUSE_DYN_GROUPPRIVATE. (OMP_DECLARE_TARGET_CLAUSES): Add OMP_CLAUSE_LOCAL. (gfc_match_omp_declare_target): Handle groupprivate + fixes. (gfc_match_omp_threadprivate): Code move to and calling now ... (gfc_match_omp_thread_group_private): ... this new function. Also handle groupprivate. (gfc_match_omp_groupprivate): New. (resolve_omp_clauses): Resolve dyn_groupprivate. * parse.cc (decode_omp_directive): Match groupprivate. (case_omp_decl, parse_spec, gfc_ascii_statement): Handle it. * resolve.cc (resolve_symbol): Handle groupprivate. * symbol.cc (gfc_check_conflict, gfc_copy_attr): Handle 'local' and 'groupprivate'. (gfc_add_omp_groupprivate, gfc_add_omp_declare_target_local): New. * trans-common.cc (build_common_decl, accumulate_equivalence_attributes): Print 'sorry' for groupprivate and declare target's local. * trans-decl.cc (add_attributes_to_decl): Likewise.. * trans-openmp.cc (gfc_trans_omp_clauses): Print 'sorry' for dyn_groupprivate. (fallback): Process declare target with link/local as done for 'enter'. gcc/testsuite/ChangeLog: * gfortran.dg/gomp/crayptr2.f90: Move dg-error line. * gfortran.dg/gomp/declare-target-2.f90: Extend. * gfortran.dg/gomp/declare-target-4.f90: Update comment, enable one test. * gfortran.dg/gomp/declare-target-5.f90: Update dg- wording, add new test. * gfortran.dg/gomp/declare-target-indirect-2.f90: Expect 'device_type(any)' in scan-tree-dump. * gfortran.dg/gomp/declare-target-6.f90: New test. * gfortran.dg/gomp/dyn_groupprivate-1.f90: New test. * gfortran.dg/gomp/dyn_groupprivate-2.f90: New test. * gfortran.dg/gomp/groupprivate-1.f90: New test. * gfortran.dg/gomp/groupprivate-2.f90: New test. * gfortran.dg/gomp/groupprivate-3.f90: New test. * gfortran.dg/gomp/groupprivate-4.f90: New test. * gfortran.dg/gomp/groupprivate-5.f90: New test. * gfortran.dg/gomp/groupprivate-6.f90: New test.
2025-11-26Fortran: Implement finalization PDTs [PR104650]Paul Thomas1-6/+46
2025-11-26 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/104650 * decl.cc (gfc_get_pdt_instance): If the PDT template has finalizers, make a new f2k_derived namespace for this intance and copy the template namespace into it. Set the instance template_sym field to point to the template. * expr.cc (gfc_check_pointer_assign): Allow array value pointer lvalues to point to scalar null expressions in initialization. * gfortran.h : Add the template_sym field to gfc_symbol. * resolve.cc (gfc_resolve_finalizers): For a pdt_type, copy the final subroutines with the same type argument into the pdt_type finalizer list. Prevent final subroutine type checking and creation of the vtab for pdt_templates. * symbol.cc (gfc_free_symbol): Do not call gfc_free_namespace for pdt_type with finalizers. Instead, free the finalizers and the namespace. gcc/testsuite PR fortran/104650 * gfortran.dg/pdt_70.f03: New test.
2025-11-17Fortran: contiguous pointer assignment to select type target [PR122709]Harald Anlauf1-0/+4
PR fortran/122709 gcc/fortran/ChangeLog: * resolve.cc (resolve_assoc_var): If the associate target is a contiguous pointer, so is the associate variable. gcc/testsuite/ChangeLog: * gfortran.dg/select_contiguous.f90: New test.
2025-11-11Fortran: Remove unused variable. [PR 96255]Jerry DeLisle1-1/+0
PR fortran/96255 gcc/fortran/ChangeLog: * resolve.cc (gfc_resolve_forall): Delete outer_sym
2025-11-11fortran: Implement optional type spec for DO CONCURRENT [PR96255]Jerry DeLisle1-19/+235
This patch adds support for the F2008 optional integer type specification in DO CONCURRENT and FORALL headers, allowing constructs like: do concurrent (integer :: i=1:10) The implementation handles type spec matching, creates shadow variables when the type spec differs from any outer scope variable, and converts iterator expressions to match the specified type. Shadow variable implementation: When a type-spec is provided and differs from an outer scope variable, a shadow variable with the specified type is created (with _ prefix). A recursive expression walker substitutes all references to the outer variable with the shadow variable throughout the DO CONCURRENT body, including in array subscripts, substrings, and nested operations. Constraint enforcement: Sets gfc_do_concurrent_flag properly (1 for block context, 2 for mask context) to enable F2008 C1139 enforcement, ensuring only PURE procedures are allowed in DO CONCURRENT constructs. Additional fixes: - Extract apply_typespec_to_iterator() helper to eliminate duplicated shadow variable creation code (~70 lines) - Add NULL pointer checks for shadow variables - Fix iterator counting to handle both EXEC_FORALL and EXEC_DO_CONCURRENT - Skip FORALL obsolescence warning for DO CONCURRENT (F2018) - Suppress many-to-one assignment warning for DO CONCURRENT (reductions are valid, formalized with REDUCE locality-spec in F2023) PR fortran/96255 gcc/fortran/ChangeLog: * gfortran.h (gfc_forall_iterator): Add bool shadow field. * match.cc (apply_typespec_to_iterator): New helper function to consolidate shadow variable creation logic. (match_forall_header): Add type-spec parsing for DO CONCURRENT and FORALL. Create shadow variables when type-spec differs from outer scope. Replace duplicated code with apply_typespec_to_iterator. * resolve.cc (replace_in_expr_recursive): New function to recursively walk expressions and replace symbol references. (replace_in_code_recursive): New function to recursively walk code blocks and replace symbol references. (gfc_replace_forall_variable): New entry point for shadow variable substitution. (gfc_resolve_assign_in_forall): Skip many-to-one assignment warning for DO CONCURRENT. (gfc_count_forall_iterators): Handle both EXEC_FORALL and EXEC_DO_CONCURRENT with assertion. (gfc_resolve_forall): Skip F2018 obsolescence warning for DO CONCURRENT. Fix memory allocation check. Add NULL checks for shadow variables. Implement shadow variable walker. (gfc_resolve_code): Set gfc_do_concurrent_flag for DO CONCURRENT constructs to enable constraint checking. gcc/testsuite/ChangeLog: * gfortran.dg/do_concurrent_typespec_1.f90: New test covering all shadowing scenarios: undeclared variable, same kind shadowing, and different kind shadowing. Co-authored-by: Steve Kargl <kargl@gcc.gnu.org> Co-authored-by: Jerry DeLisle <jvdelisle@gcc.gnu.org> Signed-off-by: Christopher Albert <albert@tugraz.at>
2025-11-04Fortran: fix frontend memleak with DO CONCURRENT [PR122564]Harald Anlauf1-0/+2
PR fortran/122564 gcc/fortran/ChangeLog: * resolve.cc (resolve_locality_spec): Delete temporary hash_set.
2025-11-03Fortran: Fix check on locality spec DO CONCURRENTSteve Kargl1-1/+14
PR fortran/122513 gcc/fortran/ChangeLog: * resolve.cc (check_default_none_expr): Do not allow an iterator in a locality spec. Allow a named constant to be used within the loop. gcc/testsuite/ChangeLog: * gfortran.dg/pr122513.f90: New test.
2025-11-01Fortran: implement constraint F2018:C1585 on pure function results [PR78640]Harald Anlauf1-0/+33
PR fortran/78640 gcc/fortran/ChangeLog: * resolve.cc (resolve_fl_procedure): Check function result of a pure function against F2018:C1585. gcc/testsuite/ChangeLog: * gfortran.dg/pure_result.f90: New test.
2025-10-29Fortran: Fix recursive PDT function invocation [PR122433, PR122434]Paul Thomas1-1/+2
2025-10-29 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/122433 * decl.cc (gfc_get_pdt_instance): Prevent a PDT component of the same type as the template from being converted into an instance. PR fortran/122434 * resolve.cc (gfc_impure_variable): The result of a pure function is a valid allocate object since it is pure. gcc/testsuite/ PR fortran/122433 * gfortran.dg/pdt_62.f03: New test. PR fortran/122434 * gfortran.dg/pdt_63.f03: New test.
2025-10-27Fortran: Fix ICE due to PDT selector expression in ASSOCIATE [PR95541]Paul Thomas1-1/+2
2025-10-27 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/922290 * resolve.cc (resolve_typebound_intrinsic_op): Add pdt_template to the list of preemted specifics. PR fortran/95541 * trans-stmt.cc (trans_associate_var): PDT array and string components are separately allocated for each element of a PDT array, so copy in and copy out the selector expression. gcc/testsuite/ PR fortran/95541 * gfortran.dg/pdt_61.f03: New test.
2025-10-26Fortran: Fix generic user operators in PDTs [PR122290]Paul Thomas1-2/+5
2025-10-26 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/122290 * decl.cc (variable_decl): Matching component initializer expressions in PDT templates should be done with gfc_match_expr to avoid reduction too early. If the expression type is unknown copy the component typespec. (gfc_get_pdt_instance): Change comment from a TODO to an explanation. Insert parameter values in initializers. For components that are not marked with PDT attributes, do the full reduction for init expressions. * primary.cc (gfc_match_actual_arglist): Convert PDT kind exprs using the component initializer. * resolve.cc (resolve_typebound_intrinsic_op): Preempt gfc_check_new_interface for pdt_types as well as entities used in submodules. * simplify.cc (get_kind): Remove PDT kind conversion. gcc/testsuite/ PR fortran/122290 * gfortran.dg/pdt_60.f03: New test.
2025-10-18fortran: allow character in conditional expressionYuao Ma1-4/+7
This patch allows the use of character types in conditional expressions. gcc/fortran/ChangeLog: * resolve.cc (resolve_conditional): Allow character in cond-expr. * trans-const.cc (gfc_conv_constant): Handle want_pointer. * trans-expr.cc (gfc_conv_conditional_expr): Fill se->string_length. (gfc_conv_string_parameter): Handle COND_EXPR tree code. gcc/testsuite/ChangeLog: * gfortran.dg/conditional_1.f90: Test character type. * gfortran.dg/conditional_2.f90: Test print constants. * gfortran.dg/conditional_4.f90: Test diagnostic message. * gfortran.dg/conditional_6.f90: Test character cond-arg.
2025-10-11fortran: fix bootstrap after r16-4372 [PR122257]Harald Anlauf1-1/+1
PR fortran/50377 PR fortran/122257 gcc/fortran/ChangeLog: * resolve.cc (resolve_actual_arglist): Initialize variable.
2025-10-10Fortran: improve checking of procedures passed as actual argument [PR50377]Harald Anlauf1-0/+24
Procedures passed as actual argument require either an explicit interface or must be declared EXTERNAL. Add a check and generate an error (default) or a warning when -std=legacy is specified. PR fortran/50377 gcc/fortran/ChangeLog: * resolve.cc (resolve_actual_arglist): Check procedure actual arguments. gcc/testsuite/ChangeLog: * gfortran.dg/pr41011.f: Fix invalid testcase. * gfortran.dg/actual_procedure_2.f: New test.
2025-10-08Fortran: Fix PDT parameter substitution [PR93175,PR102240,PR102686]Paul Thomas1-6/+9
2025-10-08 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/93175 PR fortran/102240 PR fortran/102686 * array.cc (match_array_element_spec): For pdt templates, call gfc_correct_parm_expr to elimante extraneous symbols from the bound expressions. * decl.cc (correct_parm_expr, gfc_correct_parm_expr): New fcns that remove symbols that are not PDT parameters from the type specification expressions. (insert_parameter_exprs): Process function symbols as if they are variables in the substitution with parameter expressions. (gfc_get_pdt_instance): Make sure that the parameter list of PDT components is updated as the instance is built. Move the construction of pdt_strings down a bit in the function and remove the tie up with pdt_arrays. * gfortran.h: Add prototype for gfc_correct_parm_expr. * resolve.cc (resolve_component): Skip testing for constant specification expressions in pdt_template component string lengths and pdt_strings. * trans-array.cc (structure_alloc_comps): Remove testing for deferred parameters and instead make sure that components of PDT type have parameters substituted with the parameter exprs of the enclosing PDT. gcc/testsuite/ PR fortran/93175 PR fortran/102240 PR fortran/102686 * gfortran.dg/pdt_55.f03: New test.
2025-09-30Fortran: ICE in derived type with a PDT component [PR102241,PR105380]Paul Thomas1-35/+55
2025-09-30 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/102241 * gfortran.h: Add symbol attribute 'pdt_comp'. * module.cc : Add 'pdt_comp' to 'ab_attribute' and 'attr_bits'. (mio_symbol_attribute): Set 'pdt_comp'. * resolve.cc (resolve_component): If a PDT component is found in a non-PDT type, generate the PDT instance, if necessary, and set the 'pdt_comp' attribute. Fix some whitespace issues. * trans-decl.cc (gfc_get_symbol_decl, gfc_trans_deferred_vars): If 'pdt_comp' set, initialize the PDT components. * trans-stmt.cc (gfc_trans_deallocate): Verify that a typespec parameter list is available for PDT components of ordinary derived types. gcc/testsuite/ PR fortran/105380 * gfortran.dg/pdt_49.f03: New test. PR fortran/102241 * gfortran.dg/pdt_11.f03: Deallocate 'o_fdef'. * gfortran.dg/pdt_15.f03: Reinstate final 'pop_8' and update the tree dump counts. * gfortran.dg/pdt_20.f03: Deallocate 'x'. * gfortran.dg/pdt_23.f03: Deallocate 'x'. * gfortran.dg/pdt_3.f03: Eliminate the temporary 'matrix' and use w%d directly in the allocation. Change the TODO comment and comment on memory leak in allocation. * gfortran.dg/pdt_39.f03: Comments on memory leaks. * gfortran.dg/pdt_40.f03: Deallocate 'foo' and bar%x. * gfortran.dg/pdt_50.f03: New test.
2025-09-18Fortran: Implement PDT constructors with syntax variants [PR114815]Paul Thomas1-0/+7
2025-09-18 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/114815 * decl.cc (gfc_get_pdt_instance): Copy the contents of 'tb' and not the pointer. * primary.cc (gfc_match_rvalue): If there is only one actual argument list, use if for the type spec parameter values. If this fails try the default type specification values and use the actual arguments for the component values. * resolve.cc (build_init_assign): Don't initialize implicit PDT function results. gcc/testsuite/ PR fortran/114815 * gfortran.dg/pdt_3.f03: Add missing deallocation of 'matrix'. * gfortran.dg/pdt_17.f03: Change dg-error text. * gfortran.dg/pdt_47.f03: New test.
2025-09-14fortran: implement conditional expression for fortran 2023Yuao Ma1-0/+71
This patch adds support for conditional expressions in Fortran 2023 for a limited set of types (logical, numerical), and also includes limited support for conditional arguments without `.nil.` support. gcc/fortran/ChangeLog: * dump-parse-tree.cc (show_expr): Add support for EXPR_CONDITIONAL. * expr.cc (gfc_get_conditional_expr): Add cond-expr constructor. (gfc_copy_expr, free_expr0, gfc_is_constant_expr, simplify_conditional, gfc_simplify_expr, gfc_check_init_expr, check_restricted, gfc_traverse_expr): Add support for EXPR_CONDITIONAL. * frontend-passes.cc (gfc_expr_walker): Ditto. * gfortran.h (enum expr_t): Add EXPR_CONDITIONAL. (gfc_get_operator_expr): Format fix. (gfc_get_conditional_expr): New decl. * matchexp.cc (match_conditional, match_primary): Parsing for EXPR_CONDITIONAL. * module.cc (mio_expr): Add support for EXPR_CONDITIONAL. * resolve.cc (resolve_conditional, gfc_resolve_expr): Ditto. * trans-array.cc (gfc_walk_conditional_expr, gfc_walk_subexpr): Ditto. * trans-expr.cc (gfc_conv_conditional_expr): Codegen for EXPR_CONDITIONAL. (gfc_apply_interface_mapping_to_expr, gfc_conv_expr, gfc_conv_expr_reference): Add support for EXPR_CONDITIONAL. gcc/testsuite/ChangeLog: * gfortran.dg/conditional_1.f90: New test. * gfortran.dg/conditional_2.f90: New test. * gfortran.dg/conditional_3.f90: New test. * gfortran.dg/conditional_4.f90: New test. * gfortran.dg/conditional_5.f90: New test. * gfortran.dg/conditional_6.f90: New test. * gfortran.dg/conditional_7.f90: New test. * gfortran.dg/conditional_8.f90: New test. * gfortran.dg/conditional_9.f90: New test.
2025-09-06Fortran: Implement correct form of PDT constructors [PR84119]Paul Thomas1-22/+44
2025-09-06 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/84119 * resolve.cc (reset_array_ref_to_scalar): New function using chunk broken out from gfc_resolve_ref. (gfc_resolve_ref): Call the new function, the first time for PDT type parameters and the second time for LEN inquiry refs. gcc/testsuite/ PR fortran/84119 * gfortran.dg/pdt_20.f03: Modify to deal with scalar type parm.
2025-08-28Fortran: Constructors with PDT components did not work [PR82843]Paul Thomas1-0/+38
2025-08-28 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/82843 * intrinsic.cc (gfc_convert_type_warn): If the 'from_ts' is a PDT instance, copy the derived type to the target ts. * resolve.cc (gfc_resolve_ref): A PDT component in a component reference can be that of the pdt_template. Unconditionally use component of the PDT instance to ensure that the backend_decl is set during translation. Likewise if a component is encountered that is a PDT template type, use the component parmeters to convert to the correct PDT instance. gcc/testsuite/ PR fortran/82843 * gfortran.dg/pdt_40.f03: New test.
2025-08-13Fortran: Use associated TBP subroutine not found [PR89092]Paul Thomas1-1/+1
2025-08-13 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/89092 * resolve.cc (was_declared): Add subroutine attribute. gcc/testsuite/ PR fortran/89092 * gfortran.dg/pr89092.f90: New test.
2025-08-11Fortran: gfortran rejects procedure binding on PDT [PR121398]Paul Thomas1-1/+41
2025-08-11 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/121398 * resolve.cc (check_pdt_args): New function. (check_generic_tbp_ambiguity): Use it to ensure that args to typebound procedures that do not have the same declared type as the containing derived type have 'pass1/2' set to null. This avoids false ambiguity errors. (resolve_typebound_procedure): Do not generate a wrong type error for typebound procedures marked as pass if they are of a different declared type to the containing pdt_type. gcc/testsuite/ PR fortran/121398 * gfortran.dg/pdt_generic_1.f90: New test.
2025-07-15fortran: Fix indentationFilip Kastl1-10/+10
Move a block of code two spaces to the left. Commiting as obvious. gcc/fortran/ChangeLog: * resolve.cc (resolve_select_type): Fix indentation. Signed-off-by: Filip Kastl <fkastl@suse.cz>
2025-07-11Fortran: Implement F2018 IMPORT statements [PR106135]Paul Thomas1-0/+165
2025-09-09 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/106135 * decl.cc (build_sym): Emit an error if a symbol associated by an IMPORT, ONLY or IMPORT, all statement is being redeclared. (gfc_match_import): Parse and check the F2018 versions of the IMPORT statement. For scopes other than and interface body, if the symbol cannot be found in the host scope, generate it and set it up such that gfc_fixup_sibling_symbols can transfer its 'imported attribute' if it turnes out to be a not yet parsed procedure. Test for violations of C897-8100. * gfortran.h : Add 'import_only' to the gfc_symtree structure. Add the enum, 'importstate', which is used for values the new field 'import_state' in gfc_namespace. * parse.cc (gfc_fixup_sibling_symbols): Transfer the attribute 'imported' to the new symbol. * resolve.cc (check_sym_import_status, check_import_status): New functions to test symbols and expressions for violations of F2018:C8102. (resolve_call): Test the 'resolved_sym' against C8102 by a call to 'check_sym_import_status'. (gfc_resolve_expr): If the expression is OK and an IMPORT statement has been registered in the current scope, test C102 by calling 'check_import_status'. (resolve_select_type): Test the declared derived type in TYPE IS and CLASS IS statements. gcc/testsuite/ PR fortran/106135 * gfortran.dg/import3.f90: Use -std=f2008 and comment on change in error message texts with f2018. * gfortran.dg/import12.f90: New test.
2025-07-03Fortran: Remove corank conformability checks [PR120843]Andre Vehreschild1-29/+0
Remove the checks on coranks conformability in expressions, because there is nothing in the standard about it. When a coarray has no coindexes it it treated like a non-coarray, when it has a full-corank coindex its result is a regular array. So nothing to check for corank conformability. PR fortran/120843 gcc/fortran/ChangeLog: * resolve.cc (resolve_operator): Remove conformability check, because it is not in the standard. gcc/testsuite/ChangeLog: * gfortran.dg/coarray/coindexed_6.f90: Enhance test to have coarray components covered.
2025-07-01Fortran: Fix non-conformable corank on this_image ref [PR120843]Andre Vehreschild1-3/+4
PR fortran/120843 gcc/fortran/ChangeLog: * resolve.cc (resolve_operator): Report inconsistent coranks only when not referencing this_image. (gfc_op_rank_conformable): Treat coranks as inconformable only when a coindex other then implicit this_image is used. gcc/testsuite/ChangeLog: * gfortran.dg/coarray/coindexed_6.f90: New test.
2025-06-26Fortran: Fix wasting memory in coarray single mode.Andre Vehreschild1-2/+2
gcc/fortran/ChangeLog: * resolve.cc (resolve_fl_derived0): Do not create the token component when not in coarray lib mode. * trans-types.cc: Do not access the token when not in coarray lib mode.
2025-06-24fortran: Mention user variable in SELECT TYPE temporary variable namesMikael Morin1-8/+13
The temporary variables that are generated to implement SELECT TYPE and TYPE IS statements have (before this change) a name depending only on the type. This can produce confusing dumps with code having multiple SELECT TYPE statements, as it isn't obvious which SELECT TYPE construct the variable relates to. This is especially the case with nested SELECT TYPE statements and with SELECT TYPE variables having identical types (and thus identical names). This change adds one additional user-provided discriminating string in the variable names, using the value from the SELECT TYPE variable name or last component reference name. The additional string may be truncated to fit in the temporary buffer. This requires all buffers to have matching sizes to get the same resulting name everywhere. gcc/fortran/ChangeLog: * misc.cc (gfc_var_name_for_select_type_temp): New function. * gfortran.h (gfc_var_name_for_select_type_temp): Declare it. * resolve.cc (resolve_select_type): Pick a discriminating name from the SELECT TYPE variable reference and use it in the name of the temporary variable that is generated. Truncate name to the buffer size. * match.cc (select_type_set_tmp): Likewise. Pass the discriminating name... (select_intrinsic_set_tmp): ... to this function. Use the discriminating name likewise. Augment the buffer size to match that of select_type_set_tmp and resolve_select_type. gcc/testsuite/ChangeLog: * gfortran.dg/select_type_51.f90: New test.
2025-06-16Fortran: fix checking of MOLD= in ALLOCATE statements [PR51961]Harald Anlauf1-0/+17
In ALLOCATE statements where the MOLD= argument is present and is not scalar, and the allocate-object has an explicit-shape-spec, the standard does not require the ranks to agree. In that case we skip the rank check, but emit a warning if -Wsurprising is given. PR fortran/51961 gcc/fortran/ChangeLog: * resolve.cc (conformable_arrays): Use modified rank check when MOLD= expression is given. gcc/testsuite/ChangeLog: * gfortran.dg/allocate_with_mold_5.f90: New test.
2025-05-15Fortran: default-initialization and functions returning derived type [PR85750]Harald Anlauf1-4/+4
Functions with non-pointer, non-allocatable result and of derived type did not always get initialized although the type had default-initialization, and a derived type component had the allocatable or pointer attribute. Rearrange the logic when to apply default-initialization. PR fortran/85750 gcc/fortran/ChangeLog: * resolve.cc (resolve_symbol): Reorder conditions when to apply default-initializers. gcc/testsuite/ChangeLog: * gfortran.dg/alloc_comp_auto_array_3.f90: Adjust scan counts. * gfortran.dg/alloc_comp_class_3.f03: Remove bogus warnings. * gfortran.dg/alloc_comp_class_4.f03: Likewise. * gfortran.dg/allocate_with_source_14.f03: Adjust scan count. * gfortran.dg/derived_constructor_comps_6.f90: Likewise. * gfortran.dg/derived_result_5.f90: New test.
2025-05-11Do not generate formal arglist from actual if we have already resolved it.Thomas Koenig1-3/+4
This bug was another case of generating a formal arglist from an actual one where we should not have done so. The fix is straightforward: If we have resolved the formal arglist, we should not generare a new one. OK for trunk and backport? gcc/fortran/ChangeLog: PR fortran/120163 * gfortran.h: Add formal_resolved to gfc_symbol. * resolve.cc (gfc_resolve_formal_arglist): Set it. (resolve_function): Do not call gfc_get_formal_from_actual_arglist if we already resolved a formal arglist. (resolve_call): Likewise. gcc/testsuite/ChangeLog: PR fortran/120163 * gfortran.dg/interface_61.f90: New test.
2025-05-01Fortran: Source allocation of pure function result rejected [PR119948]Paul Thomas1-0/+10
2025-05-01 Paul Thomas <pault@gcc.gnu.org> gcc/fortran PR fortran/119948 * resolve.cc (gfc_impure_variable): The result of a module procedure with an interface declaration is not impure even if the current namespace is not the same as the symbol's. gcc/testsuite/ PR fortran/119948 * gfortran.dg/pr119948.f90: New test.
2025-04-22Fortran: Improve F2018 TEAM handling [PR87326, PR87556, PR88254, PR103896]Andre Vehreschild1-25/+64
Improve the implementation of F2018 TEAM handling routines. Add runtime-functions to caf_single to allow testing. PR fortran/87326 PR fortran/87556 PR fortran/88254 PR fortran/103796 gcc/fortran/ChangeLog: * coarray.cc (split_expr_at_caf_ref): Treat polymorphic types correctly. Ensure resolve of expression after coindex. (create_allocated_callback): Fix parameter of allocated function for coarrays. (coindexed_expr_callback): Improve detection of coarrays in allocated function. * decl.cc (gfc_match_end): Add team block matching. * dump-parse-tree.cc (show_code_node): Dump change team block as such. * frontend-passes.cc (gfc_code_walker): Recognice team block. * gfortran.texi: Add documentation for team api functions. * intrinsic.texi: Add documentation about team_type in iso_fortran_env module. * iso-fortran-env.def (team_type): Use helper to get pointer kind. * match.cc (gfc_match_associate): Factor out matching of association list, because it is used in change team as well. (check_coarray_assoc): Ensure, that the association is to a coarray. (match_association_list): Match a list of association either in associate or in change team. (gfc_match_form_team): Match form team correctly include new_index. (gfc_match_change_team): Match change team with association list. (gfc_match_end_team): Match end team including stat and errmsg. (gfc_match_return): Prevent return from team block. * parse.cc (decode_statement): Sort team block. (next_statement): Same. (check_statement_label): Same. (accept_statement): Same. (verify_st_order): Same. (parse_associate): Renamed to move_associates_to_block... (move_associates_to_block): ... to enable reuse for change team. (parse_change_team): Parse it as block. (parse_executable): Same. * parse.h (enum gfc_compile_state): Add team block as compiler state. * resolve.cc (resolve_scalar_argument): New function to resolve an argument to a statement as a scalar. (resolve_form_team): Resolve its members. (resolve_change_team): Same. (resolve_branch): Prevent branch from jumping out of team block. (check_team): Removed. * trans-decl.cc (gfc_build_builtin_function_decls): Add stat and errmsg to team API functions and update their arguments. * trans-expr.cc (gfc_trans_subcomponent_assign): Also null the token when moving memory or an allocated() will not detect a free. * trans-intrinsic.cc (gfc_conv_intrinsic_caf_is_present_remote): Adapt to signature change no longer a pointer-pointer. * trans-stmt.cc (gfc_trans_form_team): Translate a form team including new_index. (gfc_trans_change_team): Translate a change team as a block. libgfortran/ChangeLog: * caf/libcaf.h: Remove commented block. (_gfortran_caf_form_team): Allow for all relevant arguments. (_gfortran_caf_change_team): Same. (_gfortran_caf_end_team): Same. (_gfortran_caf_sync_team): Same. * caf/single.c (struct caf_single_team): Team handling structures. (_gfortran_caf_init): Initialize initial team. (free_team_list): Free all teams and the memory they hold. (_gfortran_caf_finalize): Free initial and sibling teams. (_gfortran_caf_register): Add memory registered to current team. (_gfortran_caf_deregister): Unregister memory from current team. (_gfortran_caf_is_present_on_remote): Check token's memptr for llocation. May have been deallocated by an end team. (_gfortran_caf_form_team): Push a new team stub to the list. (_gfortran_caf_change_team): Push a formed team on top of the ctive teams stack. (_gfortran_caf_end_team): End the active team, free all memory allocated during its livespan. (_gfortran_caf_sync_team): Take stat and errmsg into account. gcc/testsuite/ChangeLog: * gfortran.dg/team_change_2.f90: New test. * gfortran.dg/team_change_3.f90: New test. * gfortran.dg/team_end_2.f90: New test. * gfortran.dg/team_end_3.f90: New test. * gfortran.dg/team_form_2.f90: New test. * gfortran.dg/team_form_3.f90: New test. * gfortran.dg/team_sync_2.f90: New test.
2025-04-22Fortran: Unify handling of STAT= and ERRMSG= optional arguments [PR87939]Andre Vehreschild1-1/+51
In preparing F2018 Teams handling improvements, unify handling of STAT= and ERRMSG= optional arguments. Handling of stat and errmsg in most teams statements is corrected in the next patch. Implement stat and errmsg for move_alloc () to comply with F2018. PR fortran/87939 gcc/fortran/ChangeLog: * check.cc (gfc_check_move_alloc): Add stat and errmsg to move_alloc. * dump-parse-tree.cc (show_sync_stat): New helper function. (show_code_node): Use show_sync_stat to print stat and errmsg. * gfortran.h (struct sync_stat): New struct to unify stat and errmsg handling. * intrinsic.cc (add_subroutines): Correct signature of move_alloc. * intrinsic.h (gfc_check_move_alloc): Correct signature of check_move_alloc. * match.cc (match_named_arg): Match an optional argument to a statement. (match_stat_errmsg): Match a stat= or errmsg= named argument. (gfc_match_critical): Use match_stat_errmsg to match the named arguments. (gfc_match_sync_team): Same. * resolve.cc (resolve_team_argument): Resolve an expr to have type TEAM_TYPE from iso_fortran_env. (resolve_scalar_variable_as_arg): Resolve an argument as a scalar type. (resolve_sync_stat): Resolve stat and errmsg expressions. (resolve_sync_team): Resolve a sync team statement using sync_stat helper. (resolve_end_team): Same. (resolve_critical): Same. * trans-decl.cc (gfc_build_builtin_function_decls): Correct sync_team signature. * trans-intrinsic.cc (conv_intrinsic_move_alloc): Store stat an errmsg optional arguments in helper struct and use helper to translate. * trans-stmt.cc (trans_exit): Implement DRY pattern for generating an _exit(). (gfc_trans_sync_stat): Translate stat and errmsg contents. (gfc_trans_end_team): Use helper to translate stat and errmsg. (gfc_trans_sync_team): Same. (gfc_trans_critical): Same. * trans-stmt.h (gfc_trans_sync_stat): New function. * trans.cc (gfc_deallocate_with_status): Parameterize check at runtime to allow unallocated (co-)array when freeing a structure. (gfc_deallocate_scalar_with_status): Same and also add errmsg. * trans.h (gfc_deallocate_with_status): Signature changes. (gfc_deallocate_scalar_with_status): Same. libgfortran/ChangeLog: * caf/single.c (_gfortran_caf_lock): Correct stat value, if lock is already locked by current image. (_gfortran_caf_unlock): Correct stat value, if lock is not locked. gcc/testsuite/ChangeLog: * gfortran.dg/coarray_critical_2.f90: New test. * gfortran.dg/coarray_critical_3.f90: New test. * gfortran.dg/team_sync_1.f90: New test. * gfortran.dg/move_alloc_11.f90: New test.
2025-04-18Fortran: Fix checking for IMPURE in DO CONCURRENT.Steven G. Kargl1-10/+39
PR fortran/119836 gcc/fortran/ChangeLog: * resolve.cc (check_pure_function): Fix checking for an impure subprogram within a DO CONCURRENT construct. (pure_subroutine): Ditto. gcc/testsuite/ChangeLog: * gfortran.dg/do_concurrent_all_clauses.f90: Remove invalid dg-error test. * gfortran.dg/pr119836_1.f90: New test. * gfortran.dg/pr119836_2.f90: New test. * gfortran.dg/pr119836_3.f90: New test. * gfortran.dg/pr119836_4.f90: New test.
2025-04-16Fortran: pure subroutine with pure procedure as dummy [PR106948]Harald Anlauf1-0/+7
PR fortran/106948 gcc/fortran/ChangeLog: * resolve.cc (gfc_pure_function): If a function has been resolved, but esym is not yet set, look at its attributes to see whether it is pure or elemental. gcc/testsuite/ChangeLog: * gfortran.dg/pure_formal_proc_4.f90: New test.
2025-04-09Fortran: Add code gen for do,concurrent's LOCAL/LOCAL_INIT [PR101602]Tobias Burnus1-7/+0
Implement LOCAL and LOCAL_INIT; we locally replace the tree declaration by a local declaration of the outer variable. The 'local_init' then assigns the value at the beginning of each loop iteration from the outer declaration. Note that the current implementation does not handle LOCAL with types that have a default initializer and LOCAL/LOCAL_INIT for assumed-shape arrays; this is diagnosed with a sorry error. PR fortran/101602 gcc/fortran/ChangeLog: * resolve.cc (resolve_locality_spec): Remove 'sorry, unimplemented'. * trans-stmt.cc (struct symbol_and_tree_t): New. (gfc_trans_concurrent_locality_spec): New. (gfc_trans_forall_1): Call it; update to handle local and local_init. * trans-decl.cc (gfc_start_saved_local_decls, gfc_stop_saved_local_decls): New; moved code from ... (gfc_process_block_locals): ... here. Call it. * trans.h (gfc_start_saved_local_decls, gfc_stop_saved_local_decls): Declare. gcc/testsuite/ChangeLog: * gfortran.dg/do_concurrent_8_f2023.f90: Update for removed 'sorry, unimplemented'. * gfortran.dg/do_concurrent_9.f90: Likewise. * gfortran.dg/do_concurrent_all_clauses.f90: Likewise. * gfortran.dg/do_concurrent_local_init.f90: Likewise. * gfortran.dg/do_concurrent_locality_specs.f90: Likewise. * gfortran.dg/do_concurrent_11.f90: New test. * gfortran.dg/do_concurrent_12.f90: New test. * gfortran.dg/do_concurrent_13.f90: New test. * gfortran.dg/do_concurrent_14.f90: New test. * gfortran.dg/do_concurrent_15.f90: New test.
2025-03-26Fortran: fix bogus recursion with DT default initialization [PR118796]Harald Anlauf1-1/+2
PR fortran/118796 gcc/fortran/ChangeLog: * resolve.cc: Do not apply default initialization to a derived-type function result if the resolved function is use-associated. gcc/testsuite/ChangeLog: * gfortran.dg/derived_result_4.f90: New test.
2025-03-22Fix up some further cases of missing or extraneous spaces in diagnosticsJakub Jelinek1-1/+1
Given the recent PR119406 I've tried to grep for concatenated string literals without space at the end of one line and at the start of next line, unless it was obviously intentional. Furthermore, I've then looked through gcc.pot looking for 2 adjacent spaces and looking back if that wasn't the case of "something " " with spaces at both sides". Here is the result from that. I think just the c.opt change needs an explanation, the "" in the description is simply eaten up somewhere during the option processing and gcc -v --help before this patch was displaying -Wdeprecated-literal-operator Warn about deprecated space between and suffix in a user-defined literal operator. 2025-03-22 Jakub Jelinek <jakub@redhat.com> gcc/ * gimplify.cc (warn_switch_unreachable_and_auto_init_r): Add missing space in the middle of diagnostics. * tree-vect-stmts.cc (vectorizable_load): Add missing space in the middle of debug dump message. * sym-exec/sym-exec-state.cc (state::check_args_compatibility): Likewise. gcc/c-family/ * c.opt (Wdeprecated-literal-operator): Use \"\" rather than "" in option description. gcc/fortran/ * resolve.cc (resolve_procedure_expression): Remove extraneous space from the middle of diagnostics.
2025-03-21Fortran: Fix typo in error message.Jerry DeLisle1-1/+1
PR fortran/119406 gcc/fortran/ChangeLog: * resolve.cc (resolve_locality_spec): Add space in error message.
2025-03-19Fortran: Fix comp call in associate [PR119272]Andre Vehreschild1-2/+3
PR fortran/119272 gcc/fortran/ChangeLog: * resolve.cc (resolve_compcall): Postpone error report when symbol is not resolved yet for component call resolve. gcc/testsuite/ChangeLog: * gfortran.dg/associate_74.f90: New test.
2025-03-18Fortran: check type-spec in ALLOCATE of dummy with assumed length [PR119338]Harald Anlauf1-0/+16
PR fortran/119338 gcc/fortran/ChangeLog: * resolve.cc (resolve_allocate_expr): Check F2003:C626: Type-spec in ALLOCATE of an assumed-length character dummy argument shall be an asterisk. gcc/testsuite/ChangeLog: * gfortran.dg/deferred_character_18.f90: Adjust testcase. * gfortran.dg/allocate_assumed_charlen_5.f90: New test.
2025-03-16Fortran: fix bogus dependency check in ALLOCATE statement [PR60560]Harald Anlauf1-2/+10
Restrict dependency check of ALLOCATE object to variables in the same statement, but exclude check of length type parameter that might be set in the declaration and could lead to a bogus cyclic dependency. PR fortran/60560 gcc/fortran/ChangeLog: * expr.cc (gfc_traverse_expr): Do not descend into length type parameter for negative values of auxiliary parameter f. * resolve.cc (gfc_find_var_in_expr): New helper function to check dependence of an expression on given variable. (resolve_allocate_expr): Use it to determine if array bounds in an ALLOCATE statement depend explicitly on a variable. gcc/testsuite/ChangeLog: * gfortran.dg/allocate_error_8.f90: New test.
2025-03-12Fortran: Add F2018 TEAM_NUMBER to coindexed expressions [PR98903]Andre Vehreschild1-0/+75
Add missing parsing and code generation for a[..., TEAM_NUMBER=...] as defined from F2015 onwards. Because F2015 is not used as dedicated standard in GFortran add it to the F2018 standard feature set. PR fortran/98903 gcc/fortran/ChangeLog: * array.cc (gfc_copy_array_ref): Copy team, team_type and stat. (match_team_or_stat): Match a single team(_number)= or stat=. (gfc_match_array_ref): Add switching to image_selector_parsing and error handling when indices come after named arguments. * coarray.cc (move_coarray_ref): Move also team_type. * expr.cc (gfc_free_ref_list): Free team and stat expression. (gfc_find_team_co): Find team or team_number in array-ref. * gfortran.h (enum gfc_array_ref_team_type): New enum to distinguish unset, team or team_number expression. (gfc_find_team_co): Default searching to team= expressions. * resolve.cc (resolve_array_ref): Check for type correctness of team(_number) and stats in coindices. * trans-array.cc (gfc_conv_array_ref): Ensure stat is cleared when fcoarray=single is used. * trans-intrinsic.cc (conv_stat_and_team): Including team_number in conversion. (gfc_conv_intrinsic_caf_get): Propagate team_number to ABI routine. (conv_caf_send_to_remote): Same. (conv_caf_sendget): Same. gcc/testsuite/ChangeLog: * gfortran.dg/coarray/coindexed_2.f90: New test. * gfortran.dg/coarray/coindexed_3.f08: New test. * gfortran.dg/coarray/coindexed_4.f08: New test.
2025-03-11Abstract interfaces and dummy arguments are not global.Thomas Koenig1-2/+4
The attached patch makes sure that procedures from abstract interfaces and dummy arguments are not put into the global symbol table, and are not checked against global symbols. gcc/fortran/ChangeLog: PR fortran/119078 * frontend-passes.cc (check_against_globals): Do not check for abstract interfaces or dummy arguments. * resolve.cc (gfc_verify_binding_labels): Adjust comment. Do not put abstract interfaces or dummy argument into global namespace. gcc/testsuite/ChangeLog: PR fortran/119078 * gfortran.dg/interface_58.f90: New test.
2025-03-07Fortran: Fix ICE in resolve.cc with -pedanticJerry DeLisle1-1/+3
Fixes an ICE in gfc_resolve_code when passing an optional array to an elemental procedure with `-pedantic` enabled. PR95446 added the original check, this patch fixes the case where the other actual argument is an array literal (or something else other than a variable). PR fortran/119054 gcc/fortran/ChangeLog: * resolve.cc (resolve_elemental_actual): When checking other actual arguments to elemental procedures, don't check attributes of literals and function calls. gcc/testsuite/ChangeLog: * gfortran.dg/pr95446.f90: Expand test case to literals and function calls. Signed-off-by: Peter Hill <peter.hill@york.ac.uk>
2025-03-04C prototypes for external arguments; add warning for mismatch.Thomas Koenig1-0/+63
The problem was that we were not handling external dummy arguments with -fc-prototypes-external. In looking at this, I found that we were not warning about external procedures with different argument lists. This can actually be legal (see the two test cases) but creates a problem for the C prototypes: If we have something like subroutine foo(a,n) external a if (n == 1) call a(1) if (n == 2) call a(2,3) end subroutine foo then, pre-C23, we could just have written out the prototype as void foo_ (void (*a) (), int *n); but this is illegal in C23. What to do? I finally chose to warn about the argument mismatch, with a new option. Warn only because the code above is legal, but include in -Wall because such code seems highly suspect. This option is also implied in -fc-prototypes-external. I also put a warning in the generated header file in that case, so users have a chance to see what is going on (especially since gcc now defaults to C23). gcc/fortran/ChangeLog: PR fortran/119049 PR fortran/119074 * dump-parse-tree.cc (seen_conflict): New static varaible. (gfc_dump_external_c_prototypes): Initialize it. If it was set, write out a warning that -std=c23 will not work. (write_proc): Move the work of actually writing out the formal arglist to... (write_formal_arglist): New function. Handle external dummy parameters and their argument lists. If there were mismatched arguments, output an empty argument list in pre-C23 style. * gfortran.h (struct gfc_symbol): Add ext_dummy_arglist_mismatch flag and formal_at. * invoke.texi: Document -Wexternal-argument-mismatch. * lang.opt: Put it in. * resolve.cc (resolve_function): If warning about external argument mismatches, build a formal from actual arglist the first time around, and later compare and warn. (resolve_call): Likewise gcc/testsuite/ChangeLog: PR fortran/119049 PR fortran/119074 * gfortran.dg/interface_55.f90: New test. * gfortran.dg/interface_56.f90: New test.
2025-02-28Fortran: Ensure finalizer is called for unreferenced variable [PR118730]Andre Vehreschild1-0/+8
PR fortran/118730 gcc/fortran/ChangeLog: * resolve.cc: Mark unused derived type variable with finalizers referenced to execute finalizer when leaving scope. gcc/testsuite/ChangeLog: * gfortran.dg/class_array_15.f03: Remove unused variable. * gfortran.dg/coarray_poly_7.f90: Adapt scan-tree-dump expr. * gfortran.dg/coarray_poly_8.f90: Same. * gfortran.dg/finalize_60.f90: New test.