diff options
author | Paul Brook <paul@codesourcery.com> | 2004-08-17 15:34:12 +0000 |
---|---|---|
committer | Paul Brook <pbrook@gcc.gnu.org> | 2004-08-17 15:34:12 +0000 |
commit | 3d79abbdf8a8a92943b15628b72c04c2dec15348 (patch) | |
tree | 7d8312b4f1a046c12f0c41b27b061fef7c8e4adb /gcc/fortran/module.c | |
parent | 4c7cb3ea1eae8ed094f6f4b8ed5ec5f44edb2a19 (diff) | |
download | gcc-3d79abbdf8a8a92943b15628b72c04c2dec15348.zip gcc-3d79abbdf8a8a92943b15628b72c04c2dec15348.tar.gz gcc-3d79abbdf8a8a92943b15628b72c04c2dec15348.tar.bz2 |
re PR fortran/13082 (Function entries and entries with alternate returns not implemented)
2004-08-17 Paul Brook <paul@codesourcery.com>
Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
PR fortran/13082
* decl.c (get_proc_name): Update mystery comment.
(gfc_match_entry): Check for errors earlier. Add entry point to list.
* dump-parse-tree.c (gfc_show_code_node): Print EXEC_ENTRY nodes.
* gfortran.h (symbol_attribute): Add entry_master. Document entry.
(struct gfc_entry_list): Define.
(gfc_get_entry_list): Define.
(struct gfc_namespace): Add refs and entries.
(enum gfc_exec_op): Add EXEC_ENTRY.
(struct gfc_code): Add ext.entry.
* module.c (ab_attribute, attr_bits): Remove AB_ENTRY.
(mio_symbol_attribute): Don't save/reture addr->entry.
(mio_namespace_ref): Refcount namespaces.
* parse.c (accept_statement): Handle ST_ENTRY.
(gfc_fixup_sibling_symbols): Mark symbol as referenced.
(parse_contained): Fixup sibling references to entry points
after parsing the procedure body.
* resolve.c (resolve_contained_fntype): New function.
(merge_argument_lists, resolve_entries): New functions.
(resolve_contained_functions): Use them.
(resolve_code): Handle EXEC_ENTRY.
(gfc_resolve): Call resolve_entries.
* st.c (gfc_free_statement): Handle EXEC_ENTRY.
* symbol.c (gfc_get_namespace): Refcount namespaces.
(gfc_free_namespace): Ditto.
* trans-array.c (gfc_trans_dummy_array_bias): Treat all args as
optional when multiple entry points are present.
* trans-decl.c (gfc_get_symbol_decl): Remove incorrect check.
(gfc_get_extern_function_decl): Add assertion. Fix coment.
(create_function_arglist, trans_function_start, build_entry_thunks):
New functions.
(gfc_build_function_decl): Rename ...
(build_function_decl): ... to this.
(gfc_create_function_decl): New function.
(gfc_generate_contained_functions): Use it.
(gfc_trans_entry_master_switch): New function.
(gfc_generate_function_code): Use new functions.
* trans-stmt.c (gfc_trans_entry): New function.
* trans-stmt.h (gfc_trans_entry): Add prototype.
* trans-types.c (gfc_get_function_type): Add entry point argument.
* trans.c (gfc_trans_code): Handle EXEC_ENTRY.
(gfc_generate_module_code): Call gfc_create_function_decl.
* trans.h (gfc_build_function_decl): Remove.
(gfc_create_function_decl): Add prototype.
testsuite/
* gfortran.dg/entry_1.f90: New test.
Co-Authored-By: Tobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
From-SVN: r86128
Diffstat (limited to 'gcc/fortran/module.c')
-rw-r--r-- | gcc/fortran/module.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index a9d0fa6..cd41e66 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -1367,7 +1367,7 @@ mio_internal_string (char *string) typedef enum { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL, AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT, - AB_ENTRY, AB_DATA, AB_IN_NAMELIST, AB_IN_COMMON, + AB_DATA, AB_IN_NAMELIST, AB_IN_COMMON, AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE, AB_ELEMENTAL, AB_PURE, AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT } @@ -1385,7 +1385,6 @@ static const mstring attr_bits[] = minit ("TARGET", AB_TARGET), minit ("DUMMY", AB_DUMMY), minit ("RESULT", AB_RESULT), - minit ("ENTRY", AB_ENTRY), minit ("DATA", AB_DATA), minit ("IN_NAMELIST", AB_IN_NAMELIST), minit ("IN_COMMON", AB_IN_COMMON), @@ -1455,8 +1454,7 @@ mio_symbol_attribute (symbol_attribute * attr) MIO_NAME(ab_attribute) (AB_DUMMY, attr_bits); if (attr->result) MIO_NAME(ab_attribute) (AB_RESULT, attr_bits); - if (attr->entry) - MIO_NAME(ab_attribute) (AB_ENTRY, attr_bits); + /* We deliberately don't preserve the "entry" flag. */ if (attr->data) MIO_NAME(ab_attribute) (AB_DATA, attr_bits); @@ -1529,9 +1527,6 @@ mio_symbol_attribute (symbol_attribute * attr) case AB_RESULT: attr->result = 1; break; - case AB_ENTRY: - attr->entry = 1; - break; case AB_DATA: attr->data = 1; break; @@ -2628,10 +2623,16 @@ mio_namespace_ref (gfc_namespace ** nsp) if (p->type == P_UNKNOWN) p->type = P_NAMESPACE; - if (iomode == IO_INPUT && p->integer != 0 && p->u.pointer == NULL) + if (iomode == IO_INPUT && p->integer != 0) { - ns = gfc_get_namespace (NULL); - associate_integer_pointer (p, ns); + ns = (gfc_namespace *)p->u.pointer; + if (ns == NULL) + { + ns = gfc_get_namespace (NULL); + associate_integer_pointer (p, ns); + } + else + ns->refs++; } } |