diff options
author | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-10-24 19:28:18 +0000 |
---|---|---|
committer | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-10-24 19:28:18 +0000 |
commit | b549d2a563c4d3ac93efc5f11577b023a6d6f270 (patch) | |
tree | 3a890f87b8932e19f69eb45aa1082ec2a61e9711 /gcc/fortran/symbol.c | |
parent | 9aad078e179c1a01621c7e907cb7d2674bbc2017 (diff) | |
download | gcc-b549d2a563c4d3ac93efc5f11577b023a6d6f270.tar.gz |
Commit for Asher Langton
PR fortran/17031
PR fortran/22282
fortran/
* check.c (gfc_check_loc) : New function
* decl.c (variable_decl): New variables cp_as and sym. Added a
check for variables that have already been declared as Cray
Pointers, so we can get the necessary attributes without adding
a new symbol.
(attr_decl1): Added code to catch pointee symbols and "fix"
their array specs.
(cray_pointer_decl): New method.
(gfc_match_pointer): Added Cray pointer parsing code.
(gfc_mod_pointee_as): New method.
* expr.c (gfc_check_assign): added a check to catch vector-type
assignments to pointees with an unspecified final dimension.
* gfortran.h: (GFC_ISYM_LOC): New.
(symbol_attribute): Added cray_pointer and cray_pointee bits.
(gfc_array_spec): Added cray_pointee and cp_was_assumed bools.
(gfc_symbol): Added gfc_symbol *cp_pointer.
(gfc_option): Added flag_cray_pointer.
(gfc_add_cray_pointee): Declare.
(gfc_add_cray_pointer ): Declare.
(gfc_mod_pointee_as): Declare.
* intrinsic.c (add_functions): Add code for loc() intrinsic.
* intrinsic.h (gfc_check_loc): Declare.
(gfc_resolve_loc): Declare.
* iresolve.c (gfc_resolve_loc): New.
* lang.opt: Added fcray-pointer flag.
* options.c (gfc_init_options): Intialized
gfc_match_option.flag_cray_pointer.
(gfc_handle_option): Deal with -fcray-pointer.
* parse.c:(resolve_equivalence): Added code prohibiting Cray
pointees in equivalence statements.
* resolve.c (resolve_array_ref): Added code to prevent bounds
checking for Cray Pointee arrays.
(resolve_equivalence): Prohibited pointees in equivalence
statements.
* symbol.c (check_conflict): Added Cray pointer/pointee
attribute checking.
(gfc_add_cray_pointer): New
(gfc_add_cray_pointee): New
(gfc_copy_attr): New code for Cray pointers and pointees
* trans-array.c (gfc_trans_auto_array_allocation): Added code to
prevent space from being allocated for pointees.
(gfc_conv_array_parameter): Added code to catch pointees and
correctly set their base address.
* trans-decl.c (gfc_finish_var_decl): Added code to prevent
pointee declarations from making it to the back end.
(gfc_create_module_variable): Same.
* trans-expr.c (gfc_conv_variable): added code to detect and
translate pointees.
(gfc_conv_cray_pointee): New.
* trans-intrinsic.c (gfc_conv_intrinsic_loc): New.
(gfc_conv_intrinsic_function): added entry point for loc
translation.
* trans.h (gfc_conv_cray_pointee): Declare.
* gfortran.texi: Added section on Cray pointers, removed Cray
pointers from list of proposed extensions
* intrinsic.texi: Added documentation for loc intrinsic.
* invoke.texi: Documented -fcray-pointer flag
testsuite/
PR fortran/17031
PR fortran/22282
* gfortran.dg/cray_pointers_1.f90: New test.
* gfortran.dg/cray_pointers_2.f90: New test.
* gfortran.dg/cray_pointers_3.f90: New test.
* gfortran.dg/loc_1.f90: New test.
* gfortran.dg/loc_2.f90: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@105859 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/symbol.c')
-rw-r--r-- | gcc/fortran/symbol.c | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index c1221eb72a5..b9e76ef195c 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -263,7 +263,8 @@ check_conflict (symbol_attribute * attr, const char * name, locus * where) *public = "PUBLIC", *optional = "OPTIONAL", *entry = "ENTRY", *function = "FUNCTION", *subroutine = "SUBROUTINE", *dimension = "DIMENSION", *in_equivalence = "EQUIVALENCE", - *use_assoc = "USE ASSOCIATED"; + *use_assoc = "USE ASSOCIATED", *cray_pointer = "CRAY POINTER", + *cray_pointee = "CRAY POINTEE"; const char *a1, *a2; @@ -343,6 +344,31 @@ check_conflict (symbol_attribute * attr, const char * name, locus * where) conf (function, subroutine); + /* Cray pointer/pointee conflicts. */ + conf (cray_pointer, cray_pointee); + conf (cray_pointer, dimension); + conf (cray_pointer, pointer); + conf (cray_pointer, target); + conf (cray_pointer, allocatable); + conf (cray_pointer, external); + conf (cray_pointer, intrinsic); + conf (cray_pointer, in_namelist); + conf (cray_pointer, function); + conf (cray_pointer, subroutine); + conf (cray_pointer, entry); + + conf (cray_pointee, allocatable); + conf (cray_pointee, intent); + conf (cray_pointee, optional); + conf (cray_pointee, dummy); + conf (cray_pointee, target); + conf (cray_pointee, external); + conf (cray_pointee, intrinsic); + conf (cray_pointee, pointer); + conf (cray_pointee, function); + conf (cray_pointee, subroutine); + conf (cray_pointee, entry); + a1 = gfc_code2string (flavors, attr->flavor); if (attr->in_namelist @@ -653,6 +679,37 @@ gfc_add_pointer (symbol_attribute * attr, locus * where) try +gfc_add_cray_pointer (symbol_attribute * attr, locus * where) +{ + + if (check_used (attr, NULL, where) || check_done (attr, where)) + return FAILURE; + + attr->cray_pointer = 1; + return check_conflict (attr, NULL, where); +} + + +try +gfc_add_cray_pointee (symbol_attribute * attr, locus * where) +{ + + if (check_used (attr, NULL, where) || check_done (attr, where)) + return FAILURE; + + if (attr->cray_pointee) + { + gfc_error ("Cray Pointee at %L appears in multiple pointer()" + " statements.", where); + return FAILURE; + } + + attr->cray_pointee = 1; + return check_conflict (attr, NULL, where); +} + + +try gfc_add_result (symbol_attribute * attr, const char *name, locus * where) { @@ -1149,6 +1206,11 @@ gfc_copy_attr (symbol_attribute * dest, symbol_attribute * src, locus * where) if (gfc_missing_attr (dest, where) == FAILURE) goto fail; + if (src->cray_pointer && gfc_add_cray_pointer (dest, where) == FAILURE) + goto fail; + if (src->cray_pointee && gfc_add_cray_pointee (dest, where) == FAILURE) + goto fail; + /* The subroutines that set these bits also cause flavors to be set, and that has already happened in the original, so don't let it happen again. */ |