Commit b122dc6a by Jakub Jelinek

trans.h (gfc_conv_cray_pointee): Remove.

	* trans.h (gfc_conv_cray_pointee): Remove.
	* trans-expr.c (gfc_conv_variable): Revert 2005-10-24 change.
	* trans-array.c (gfc_conv_array_parameter): Likewise.
	* trans-decl.c (gfc_conv_cray_pointee): Remove.
	(gfc_finish_cray_pointee): New function.
	(gfc_finish_var_decl): Use it.  Don't return early for Cray
	pointees.
	(gfc_create_module_variable): Revert 2005-10-24 change.
	* decl.c (cray_pointer_decl): Update comment.
	* gfortran.texi: Don't mention Cray pointees aren't visible in the
	debugger.

	* symbol.c (check_conflict): Add conflict between cray_pointee
	and in_common resp. in_equivalence.
	* resolve.c (resolve_equivalence): Revert 2005-10-24 change.
testsuite/
	* gfortran.dg/cray_pointers_4.f90: New test.

	* module.c (ab_attribute): Add AB_CRAY_POINTER and AB_CRAY_POINTEE.
	(attr_bits): Likewise.
	(mio_symbol_attribute): Save and restore cray_pointe{r,e} attributes.
	(mio_symbol): For cray_pointee write/read cp_pointer reference.
testsuite/
	* gfortran.dg/cray_pointers_5.f90: New test.

From-SVN: r105891
parent 910450c1
2005-10-25 Jakub Jelinek <jakub@redhat.com>
* trans.h (gfc_conv_cray_pointee): Remove.
* trans-expr.c (gfc_conv_variable): Revert 2005-10-24 change.
* trans-array.c (gfc_conv_array_parameter): Likewise.
* trans-decl.c (gfc_conv_cray_pointee): Remove.
(gfc_finish_cray_pointee): New function.
(gfc_finish_var_decl): Use it. Don't return early for Cray
pointees.
(gfc_create_module_variable): Revert 2005-10-24 change.
* decl.c (cray_pointer_decl): Update comment.
* gfortran.texi: Don't mention Cray pointees aren't visible in the
debugger.
* symbol.c (check_conflict): Add conflict between cray_pointee
and in_common resp. in_equivalence.
* resolve.c (resolve_equivalence): Revert 2005-10-24 change.
* module.c (ab_attribute): Add AB_CRAY_POINTER and AB_CRAY_POINTEE.
(attr_bits): Likewise.
(mio_symbol_attribute): Save and restore cray_pointe{r,e} attributes.
(mio_symbol): For cray_pointee write/read cp_pointer reference.
2005-10-25 Feng Wang <fengwang@nudt.edu.cn> 2005-10-25 Feng Wang <fengwang@nudt.edu.cn>
PR fortran/22290 PR fortran/22290
...@@ -14,8 +37,8 @@ ...@@ -14,8 +37,8 @@
PR fortran/17031 PR fortran/17031
PR fortran/22282 PR fortran/22282
* check.c (gfc_check_loc) : New function * check.c (gfc_check_loc): New function.
* decl.c (variable_decl): New variables cp_as and sym. Added a * decl.c (variable_decl): New variables cp_as and sym. Added a
check for variables that have already been declared as Cray check for variables that have already been declared as Cray
Pointers, so we can get the necessary attributes without adding Pointers, so we can get the necessary attributes without adding
a new symbol. a new symbol.
...@@ -24,7 +47,7 @@ ...@@ -24,7 +47,7 @@
(cray_pointer_decl): New method. (cray_pointer_decl): New method.
(gfc_match_pointer): Added Cray pointer parsing code. (gfc_match_pointer): Added Cray pointer parsing code.
(gfc_mod_pointee_as): New method. (gfc_mod_pointee_as): New method.
* expr.c (gfc_check_assign): added a check to catch vector-type * expr.c (gfc_check_assign): Added a check to catch vector-type
assignments to pointees with an unspecified final dimension. assignments to pointees with an unspecified final dimension.
* gfortran.h: (GFC_ISYM_LOC): New. * gfortran.h: (GFC_ISYM_LOC): New.
(symbol_attribute): Added cray_pointer and cray_pointee bits. (symbol_attribute): Added cray_pointer and cray_pointee bits.
...@@ -39,7 +62,7 @@ ...@@ -39,7 +62,7 @@
(gfc_resolve_loc): Declare. (gfc_resolve_loc): Declare.
* iresolve.c (gfc_resolve_loc): New. * iresolve.c (gfc_resolve_loc): New.
* lang.opt: Added fcray-pointer flag. * lang.opt: Added fcray-pointer flag.
* options.c (gfc_init_options): Intialized * options.c (gfc_init_options): Initialized.
gfc_match_option.flag_cray_pointer. gfc_match_option.flag_cray_pointer.
(gfc_handle_option): Deal with -fcray-pointer. (gfc_handle_option): Deal with -fcray-pointer.
* parse.c:(resolve_equivalence): Added code prohibiting Cray * parse.c:(resolve_equivalence): Added code prohibiting Cray
...@@ -48,30 +71,30 @@ ...@@ -48,30 +71,30 @@
checking for Cray Pointee arrays. checking for Cray Pointee arrays.
(resolve_equivalence): Prohibited pointees in equivalence (resolve_equivalence): Prohibited pointees in equivalence
statements. statements.
* symbol.c (check_conflict): Added Cray pointer/pointee * symbol.c (check_conflict): Added Cray pointer/pointee
attribute checking. attribute checking.
(gfc_add_cray_pointer): New (gfc_add_cray_pointer): New.
(gfc_add_cray_pointee): New (gfc_add_cray_pointee): New.
(gfc_copy_attr): New code for Cray pointers and pointees (gfc_copy_attr): New code for Cray pointers and pointees.
* trans-array.c (gfc_trans_auto_array_allocation): Added code to * trans-array.c (gfc_trans_auto_array_allocation): Added code to
prevent space from being allocated for pointees. prevent space from being allocated for pointees.
(gfc_conv_array_parameter): Added code to catch pointees and (gfc_conv_array_parameter): Added code to catch pointees and
correctly set their base address. correctly set their base address.
* trans-decl.c (gfc_finish_var_decl): Added code to prevent * trans-decl.c (gfc_finish_var_decl): Added code to prevent
pointee declarations from making it to the back end. pointee declarations from making it to the back end.
(gfc_create_module_variable): Same. (gfc_create_module_variable): Same.
* trans-expr.c (gfc_conv_variable): added code to detect and * trans-expr.c (gfc_conv_variable): Added code to detect and
translate pointees. translate pointees.
(gfc_conv_cray_pointee): New. (gfc_conv_cray_pointee): New.
* trans-intrinsic.c (gfc_conv_intrinsic_loc): New. * trans-intrinsic.c (gfc_conv_intrinsic_loc): New.
(gfc_conv_intrinsic_function): added entry point for loc (gfc_conv_intrinsic_function): Added entry point for loc
translation. translation.
* trans.h (gfc_conv_cray_pointee): Declare. * trans.h (gfc_conv_cray_pointee): Declare.
* gfortran.texi: Added section on Cray pointers, removed Cray * gfortran.texi: Added section on Cray pointers, removed Cray
pointers from list of proposed extensions pointers from list of proposed extensions.
* intrinsic.texi: Added documentation for loc intrinsic. * intrinsic.texi: Added documentation for loc intrinsic.
* invoke.texi: Documented -fcray-pointer flag * invoke.texi: Documented -fcray-pointer flag.
2005-10-24 Asher Langton <langton2@llnl.gov> 2005-10-24 Asher Langton <langton2@llnl.gov>
...@@ -109,7 +132,7 @@ ...@@ -109,7 +132,7 @@
* check.c (gfc_check_ichar_iachar): Move the code around so * check.c (gfc_check_ichar_iachar): Move the code around so
that the check on the length is after check for that the check on the length is after check for
references. references.
2005-10-23 Asher Langton <langton2@llnl.gov> 2005-10-23 Asher Langton <langton2@llnl.gov>
* decl.c (match_type_spec): Add a BYTE type as an extension. * decl.c (match_type_spec): Add a BYTE type as an extension.
...@@ -145,7 +168,7 @@ ...@@ -145,7 +168,7 @@
PR fortran/21625 PR fortran/21625
* resolve.c (expr_to_initialize): New function. * resolve.c (expr_to_initialize): New function.
(resolve_allocate_expr): Take current statement as new (resolve_allocate_expr): Take current statement as new
argument. Add default initializers to variables of argument. Add default initializers to variables of
derived types, if they need it. derived types, if they need it.
(resolve_code): Provide current statement as argument to (resolve_code): Provide current statement as argument to
...@@ -414,8 +437,8 @@ ...@@ -414,8 +437,8 @@
2005-09-21 Erik Edelmann <erik.edelmann@iki.fi> 2005-09-21 Erik Edelmann <erik.edelmann@iki.fi>
PR fortran/19929 PR fortran/19929
* trans-stmt.c (gfc_trans_deallocate): Check if the * trans-stmt.c (gfc_trans_deallocate): Check if the
object to be deallocated is an array by looking at object to be deallocated is an array by looking at
expr->rank instead of expr->symtree->n.sym->attr.dimension. expr->rank instead of expr->symtree->n.sym->attr.dimension.
2005-09-20 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de> 2005-09-20 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
...@@ -510,7 +533,7 @@ ...@@ -510,7 +533,7 @@
to store the character (array) and the character length for an internal to store the character (array) and the character length for an internal
unit. unit.
* fortran/trans-io (build_dt): Use the new function set_internal_unit. * fortran/trans-io (build_dt): Use the new function set_internal_unit.
2005-09-14 Paul Thomas <pault@gcc.gnu.org> 2005-09-14 Paul Thomas <pault@gcc.gnu.org>
PR fortran/19358 PR fortran/19358
...@@ -966,7 +989,7 @@ ...@@ -966,7 +989,7 @@
2005-08-07 Janne Blomqvist <jblomqvi@cc.hut.fi> 2005-08-07 Janne Blomqvist <jblomqvi@cc.hut.fi>
PR fortran/22390 PR fortran/22390
* dump-parse-tree.c (gfc_show_code_node): Add case for FLUSH. * dump-parse-tree.c (gfc_show_code_node): Add case for FLUSH.
* gfortran.h: Add enums for FLUSH. * gfortran.h: Add enums for FLUSH.
* io.c (gfc_free_filepos,match_file_element,match_filepos): Modify * io.c (gfc_free_filepos,match_file_element,match_filepos): Modify
...@@ -1143,7 +1166,7 @@ ...@@ -1143,7 +1166,7 @@
Don't clear maskindexes here. Don't clear maskindexes here.
2005-07-08 Daniel Berlin <dberlin@dberlin.org> 2005-07-08 Daniel Berlin <dberlin@dberlin.org>
* trans-decl.c (create_function_arglist): DECL_ARG_TYPE_AS_WRITTEN * trans-decl.c (create_function_arglist): DECL_ARG_TYPE_AS_WRITTEN
is removed. is removed.
...@@ -1374,7 +1397,7 @@ ...@@ -1374,7 +1397,7 @@
(gfc_return_by_reference): Always look at sym, never at sym->result. (gfc_return_by_reference): Always look at sym, never at sym->result.
2005-06-11 Steven G. Kargl <kargls@comcast.net> 2005-06-11 Steven G. Kargl <kargls@comcast.net>
PR fortran/17792 PR fortran/17792
PR fortran/21375 PR fortran/21375
* trans-array.c (gfc_array_deallocate): pstat is new argument * trans-array.c (gfc_array_deallocate): pstat is new argument
...@@ -1404,7 +1427,7 @@ ...@@ -1404,7 +1427,7 @@
PR fortran/19195 PR fortran/19195
* trans.c (gfc_get_backend_locus): Remove unnecessary adjustment, * trans.c (gfc_get_backend_locus): Remove unnecessary adjustment,
remove FIXME comment. remove FIXME comment.
2005-06-04 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de> 2005-06-04 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
...@@ -1522,7 +1545,7 @@ ...@@ -1522,7 +1545,7 @@
2005-05-29 Janne Blomqvist <jblomqvi@vipunen.hut.fi> 2005-05-29 Janne Blomqvist <jblomqvi@vipunen.hut.fi>
Steven G. Kargl <kargls@comcast.net> Steven G. Kargl <kargls@comcast.net>
fortran/PR20846 fortran/PR20846
* io.c (gfc_match_inquire): Implement constraints on UNIT and FILE usage. * io.c (gfc_match_inquire): Implement constraints on UNIT and FILE usage.
...@@ -1565,7 +1588,7 @@ ...@@ -1565,7 +1588,7 @@
2005-05-18 Thomas Koenig <Thomas.Koenig@online.de> 2005-05-18 Thomas Koenig <Thomas.Koenig@online.de>
PR libfortran/21127 PR libfortran/21127
* fortran/iresolve.c (gfc_resolve_reshape): Add * fortran/iresolve.c (gfc_resolve_reshape): Add
gfc_type_letter (BT_COMPLEX) for complex to gfc_type_letter (BT_COMPLEX) for complex to
to resolved function name. to resolved function name.
...@@ -1628,11 +1651,11 @@ ...@@ -1628,11 +1651,11 @@
Jerry DeLisle <jvdelisle@verizon.net> Jerry DeLisle <jvdelisle@verizon.net>
PR fortran/17432 PR fortran/17432
* trans-stmt.c (gfc_trans_label_assign): fix pointer type, to * trans-stmt.c (gfc_trans_label_assign): fix pointer type, to
resolve ICE on assign of format label. resolve ICE on assign of format label.
* trans-io.c (set_string): add fold-convert to properly * trans-io.c (set_string): add fold-convert to properly
handle assigned format label in write. handle assigned format label in write.
2005-05-13 Paul Brook <paul@codesourcery.com> 2005-05-13 Paul Brook <paul@codesourcery.com>
* trans-stmt.c (gfc_trans_forall_1): Fix comment typo. * trans-stmt.c (gfc_trans_forall_1): Fix comment typo.
...@@ -1664,7 +1687,7 @@ ...@@ -1664,7 +1687,7 @@
* options.c (gfc-init_options): Set default calling convention * options.c (gfc-init_options): Set default calling convention
to -fno-f2c. Mark -fsecond-underscore unset. to -fno-f2c. Mark -fsecond-underscore unset.
(gfc_post_options): Set -fsecond-underscore if not explicitly set (gfc_post_options): Set -fsecond-underscore if not explicitly set
by user. by user.
(handle_options): Set gfc_option.flag_f2c according to requested (handle_options): Set gfc_option.flag_f2c according to requested
calling convention. calling convention.
* trans-decl.c (gfc_get_extern_function_decl): Use special f2c * trans-decl.c (gfc_get_extern_function_decl): Use special f2c
...@@ -1744,7 +1767,7 @@ ...@@ -1744,7 +1767,7 @@
* gfortran.h (gfc_namespace): Add seen_implicit_none field, * gfortran.h (gfc_namespace): Add seen_implicit_none field,
Tobias forgot this in previous commit. Tobias forgot this in previous commit.
2005-04-29 Paul Brook <paul@codesourcery.com> 2005-04-29 Paul Brook <paul@codesourcery.com>
* trans-expr.c (gfc_conv_expr_present): Fix broken assert. Update * trans-expr.c (gfc_conv_expr_present): Fix broken assert. Update
...@@ -1831,11 +1854,11 @@ ...@@ -1831,11 +1854,11 @@
declaration for st_set_nml_var and st_set_nml_var_dim. Remove declaration for st_set_nml_var and st_set_nml_var_dim. Remove
declarations of old namelist functions. declarations of old namelist functions.
(build_dt): Simplified call to transfer_namelist_element. (build_dt): Simplified call to transfer_namelist_element.
(nml_get_addr_expr): Generates address expression for start of (nml_get_addr_expr): Generates address expression for start of
object data. New function. object data. New function.
(nml_full_name): Qualified name for derived type components. New (nml_full_name): Qualified name for derived type components. New
function. function.
(transfer_namelist_element): Modified for calls to new functions (transfer_namelist_element): Modified for calls to new functions
and improved derived type handling. and improved derived type handling.
2005-04-17 Richard Guenther <rguenth@gcc.gnu.org> 2005-04-17 Richard Guenther <rguenth@gcc.gnu.org>
...@@ -1921,7 +1944,7 @@ ...@@ -1921,7 +1944,7 @@
2005-04-06 Steven G. Kargl <kargls@comcast.net> 2005-04-06 Steven G. Kargl <kargls@comcast.net>
* invoke.texi: Remove documentation of -std=f90 * invoke.texi: Remove documentation of -std=f90
2005-04-06 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de> 2005-04-06 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
...@@ -1969,7 +1992,7 @@ ...@@ -1969,7 +1992,7 @@
* gfortran.h (option_t): Change d8, i8, r8 to flag_default_double, * gfortran.h (option_t): Change d8, i8, r8 to flag_default_double,
flag_default_integer, flag_default_real flag_default_integer, flag_default_real
* invoke.texi: Update documentation * invoke.texi: Update documentation
* lang.opt: Remove d8, i8, r8 definitions; Add fdefault-double-8 * lang.opt: Remove d8, i8, r8 definitions; Add fdefault-double-8
fdefault-integer-8, and fdefault-real-8 definitions. fdefault-integer-8, and fdefault-real-8 definitions.
* options.c (gfc_init_options): Set option defaults * options.c (gfc_init_options): Set option defaults
(gfc_handle_option): Handle command line options. (gfc_handle_option): Handle command line options.
...@@ -2417,7 +2440,7 @@ ...@@ -2417,7 +2440,7 @@
gfc_match_null, match_type_spec, match_attr_spec, gfc_match_null, match_type_spec, match_attr_spec,
gfc_match_formal_arglist, match_result, gfc_match_function_decl): gfc_match_formal_arglist, match_result, gfc_match_function_decl):
Update callers to match. Update callers to match.
(gfc_match_entry) : Likewise, fix comment typo. (gfc_match_entry): Likewise, fix comment typo.
(gfc_match_subroutine, attr_decl1, gfc_add_dimension, (gfc_match_subroutine, attr_decl1, gfc_add_dimension,
access_attr_decl, do_parm, gfc_match_save, gfc_match_modproc, access_attr_decl, do_parm, gfc_match_save, gfc_match_modproc,
gfc_match_derived_decl): Update callers. gfc_match_derived_decl): Update callers.
...@@ -2568,7 +2591,7 @@ ...@@ -2568,7 +2591,7 @@
unsigned issue. Use build_int_cst instead of converting unsigned issue. Use build_int_cst instead of converting
integer_zero_node. Remove unnecessary conversion. integer_zero_node. Remove unnecessary conversion.
* trans-types.c (gfc_get_character_type_len): : Use * trans-types.c (gfc_get_character_type_len): Use
gfc_charlen_type_node as basic type for the range field. gfc_charlen_type_node as basic type for the range field.
* trans-intrinsic.c (build_fixbound_expr, * trans-intrinsic.c (build_fixbound_expr,
......
...@@ -2995,8 +2995,7 @@ attr_decl (void) ...@@ -2995,8 +2995,7 @@ attr_decl (void)
pointer (ipt, ar(10)) pointer (ipt, ar(10))
any subsequent uses of ar will be translated (in C-notation) as any subsequent uses of ar will be translated (in C-notation) as
ar(i) => ((<type> *) ipt)(i) ar(i) => ((<type> *) ipt)(i)
By the time the code is translated into GENERIC, the pointee will After gimplification, pointee variable will disappear in the code. */
have disappeared from the code entirely. */
static match static match
cray_pointer_decl (void) cray_pointer_decl (void)
...@@ -3112,7 +3111,7 @@ cray_pointer_decl (void) ...@@ -3112,7 +3111,7 @@ cray_pointer_decl (void)
} }
/* Point the Pointee at the Pointer. */ /* Point the Pointee at the Pointer. */
cpte->cp_pointer=cptr; cpte->cp_pointer = cptr;
if (gfc_match_char (')') != MATCH_YES) if (gfc_match_char (')') != MATCH_YES)
{ {
......
...@@ -899,11 +899,7 @@ expect. Adding 1 to ipt just adds one byte to the address stored in ...@@ -899,11 +899,7 @@ expect. Adding 1 to ipt just adds one byte to the address stored in
ipt. ipt.
Any expression involving the pointee will be translated to use the Any expression involving the pointee will be translated to use the
value stored in the pointer as the base address. This translation is value stored in the pointer as the base address.
done in the front end, and so the pointees are not present in the
GENERIC tree that is handed off to the backend. One disadvantage of
this is that pointees will not appear in gdb when debugging a Fortran
program that uses Cray pointers.
To get the address of elements, this extension provides an intrinsic To get the address of elements, this extension provides an intrinsic
function loc(), loc() is essentially the C '&' operator, except the function loc(), loc() is essentially the C '&' operator, except the
......
...@@ -1431,7 +1431,8 @@ typedef enum ...@@ -1431,7 +1431,8 @@ typedef enum
AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT, AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT,
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_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE, AB_ELEMENTAL, AB_PURE,
AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT, AB_CRAY_POINTER,
AB_CRAY_POINTEE
} }
ab_attribute; ab_attribute;
...@@ -1458,6 +1459,8 @@ static const mstring attr_bits[] = ...@@ -1458,6 +1459,8 @@ static const mstring attr_bits[] =
minit ("RECURSIVE", AB_RECURSIVE), minit ("RECURSIVE", AB_RECURSIVE),
minit ("GENERIC", AB_GENERIC), minit ("GENERIC", AB_GENERIC),
minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT), minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
minit ("CRAY_POINTER", AB_CRAY_POINTER),
minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
minit (NULL, -1) minit (NULL, -1)
}; };
...@@ -1542,6 +1545,10 @@ mio_symbol_attribute (symbol_attribute * attr) ...@@ -1542,6 +1545,10 @@ mio_symbol_attribute (symbol_attribute * attr)
MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits); MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
if (attr->always_explicit) if (attr->always_explicit)
MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits); MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
if (attr->cray_pointer)
MIO_NAME(ab_attribute) (AB_CRAY_POINTER, attr_bits);
if (attr->cray_pointee)
MIO_NAME(ab_attribute) (AB_CRAY_POINTEE, attr_bits);
mio_rparen (); mio_rparen ();
...@@ -1622,6 +1629,12 @@ mio_symbol_attribute (symbol_attribute * attr) ...@@ -1622,6 +1629,12 @@ mio_symbol_attribute (symbol_attribute * attr)
case AB_ALWAYS_EXPLICIT: case AB_ALWAYS_EXPLICIT:
attr->always_explicit = 1; attr->always_explicit = 1;
break; break;
case AB_CRAY_POINTER:
attr->cray_pointer = 1;
break;
case AB_CRAY_POINTEE:
attr->cray_pointee = 1;
break;
} }
} }
} }
...@@ -2815,6 +2828,9 @@ mio_symbol (gfc_symbol * sym) ...@@ -2815,6 +2828,9 @@ mio_symbol (gfc_symbol * sym)
mio_symbol_ref (&sym->result); mio_symbol_ref (&sym->result);
if (sym->attr.cray_pointee)
mio_symbol_ref (&sym->cp_pointer);
/* Note that components are always saved, even if they are supposed /* Note that components are always saved, even if they are supposed
to be private. Component access is checked during searching. */ to be private. Component access is checked during searching. */
......
...@@ -5177,14 +5177,6 @@ resolve_equivalence (gfc_equiv *eq) ...@@ -5177,14 +5177,6 @@ resolve_equivalence (gfc_equiv *eq)
break; break;
} }
/* Shall not be a Cray pointee. */
if (sym->attr.cray_pointee)
{
gfc_error ("Cray Pointee '%s' at %L cannot be an EQUIVALENCE "
"object", sym->name, &e->where);
continue;
}
/* Shall not be a named constant. */ /* Shall not be a named constant. */
if (e->expr_type == EXPR_CONSTANT) if (e->expr_type == EXPR_CONSTANT)
{ {
......
...@@ -368,6 +368,8 @@ check_conflict (symbol_attribute * attr, const char * name, locus * where) ...@@ -368,6 +368,8 @@ check_conflict (symbol_attribute * attr, const char * name, locus * where)
conf (cray_pointee, function); conf (cray_pointee, function);
conf (cray_pointee, subroutine); conf (cray_pointee, subroutine);
conf (cray_pointee, entry); conf (cray_pointee, entry);
conf (cray_pointee, in_common);
conf (cray_pointee, in_equivalence);
a1 = gfc_code2string (flavors, attr->flavor); a1 = gfc_code2string (flavors, attr->flavor);
......
...@@ -4083,13 +4083,8 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, gfc_ss * ss, int g77) ...@@ -4083,13 +4083,8 @@ gfc_conv_array_parameter (gfc_se * se, gfc_expr * expr, gfc_ss * ss, int g77)
&& expr->ref->u.ar.type == AR_FULL && g77) && expr->ref->u.ar.type == AR_FULL && g77)
{ {
sym = expr->symtree->n.sym; sym = expr->symtree->n.sym;
tmp = gfc_get_symbol_decl (sym);
/* Check to see if we're dealing with a Cray Pointee. */
if (sym->attr.cray_pointee)
tmp = gfc_conv_cray_pointee (sym);
else
tmp = gfc_get_symbol_decl (sym);
if (sym->ts.type == BT_CHARACTER) if (sym->ts.type == BT_CHARACTER)
se->string_length = sym->ts.cl->backend_decl; se->string_length = sym->ts.cl->backend_decl;
if (!sym->attr.pointer && sym->as->type != AS_ASSUMED_SHAPE if (!sym->attr.pointer && sym->as->type != AS_ASSUMED_SHAPE
......
...@@ -351,6 +351,44 @@ gfc_can_put_var_on_stack (tree size) ...@@ -351,6 +351,44 @@ gfc_can_put_var_on_stack (tree size)
} }
/* gfc_finish_cray_pointee sets DECL_VALUE_EXPR for a Cray pointee to
an expression involving its corresponding pointer. There are
2 cases; one for variable size arrays, and one for everything else,
because variable-sized arrays require one fewer level of
indirection. */
static void
gfc_finish_cray_pointee (tree decl, gfc_symbol *sym)
{
tree ptr_decl = gfc_get_symbol_decl (sym->cp_pointer);
tree value;
/* Parameters need to be dereferenced. */
if (sym->cp_pointer->attr.dummy)
ptr_decl = gfc_build_indirect_ref (ptr_decl);
/* Check to see if we're dealing with a variable-sized array. */
if (sym->attr.dimension
&& TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE)
{
/* These decls will be derefenced later, so we don't dereference
them here. */
value = convert (TREE_TYPE (decl), ptr_decl);
}
else
{
ptr_decl = convert (build_pointer_type (TREE_TYPE (decl)),
ptr_decl);
value = gfc_build_indirect_ref (ptr_decl);
}
SET_DECL_VALUE_EXPR (decl, value);
DECL_HAS_VALUE_EXPR_P (decl) = 1;
/* This is a fake variable just for debugging purposes. */
TREE_ASM_WRITTEN (decl) = 1;
}
/* Finish processing of a declaration and install its initial value. */ /* Finish processing of a declaration and install its initial value. */
static void static void
...@@ -417,9 +455,9 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym) ...@@ -417,9 +455,9 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
We also need to set this if the variable is passed by reference in a We also need to set this if the variable is passed by reference in a
CALL statement. */ CALL statement. */
/* We don't want real declarations for Cray Pointees. */ /* Set DECL_VALUE_EXPR for Cray Pointees. */
if (sym->attr.cray_pointee) if (sym->attr.cray_pointee)
return; gfc_finish_cray_pointee (decl, sym);
if (sym->attr.target) if (sym->attr.target)
TREE_ADDRESSABLE (decl) = 1; TREE_ADDRESSABLE (decl) = 1;
...@@ -437,6 +475,9 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym) ...@@ -437,6 +475,9 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
gfc_add_decl_to_parent_function (decl); gfc_add_decl_to_parent_function (decl);
} }
if (sym->attr.cray_pointee)
return;
/* If a variable is USE associated, it's always external. */ /* If a variable is USE associated, it's always external. */
if (sym->attr.use_assoc) if (sym->attr.use_assoc)
{ {
...@@ -2309,10 +2350,6 @@ gfc_create_module_variable (gfc_symbol * sym) ...@@ -2309,10 +2350,6 @@ gfc_create_module_variable (gfc_symbol * sym)
/* Create the decl. */ /* Create the decl. */
decl = gfc_get_symbol_decl (sym); decl = gfc_get_symbol_decl (sym);
/* Don't create a "real" declaration for a Cray Pointee. */
if (sym->attr.cray_pointee)
return;
/* Create the variable. */ /* Create the variable. */
pushdecl (decl); pushdecl (decl);
rest_of_decl_compilation (decl, 1, 0); rest_of_decl_compilation (decl, 1, 0);
...@@ -2734,36 +2771,5 @@ gfc_generate_block_data (gfc_namespace * ns) ...@@ -2734,36 +2771,5 @@ gfc_generate_block_data (gfc_namespace * ns)
rest_of_decl_compilation (decl, 1, 0); rest_of_decl_compilation (decl, 1, 0);
} }
/* gfc_conv_cray_pointee takes a sym with attribute cray_pointee and
swaps in the backend_decl of its corresponding pointer. There are
2 cases; one for variable size arrays, and one for everything else,
because variable-sized arrays require one fewer level of
indirection. */
tree
gfc_conv_cray_pointee(gfc_symbol *sym)
{
tree decl = gfc_get_symbol_decl (sym->cp_pointer);
/* Parameters need to be dereferenced. */
if (sym->cp_pointer->attr.dummy)
decl = gfc_build_indirect_ref (decl);
/* Check to see if we're dealing with a variable-sized array. */
if (sym->attr.dimension
&& TREE_CODE (TREE_TYPE (sym->backend_decl)) == POINTER_TYPE)
{
/* These decls will be derefenced later, so we don't dereference
them here. */
decl = convert (TREE_TYPE (sym->backend_decl), decl);
}
else
{
decl = convert (build_pointer_type (TREE_TYPE (sym->backend_decl)),
decl);
decl = gfc_build_indirect_ref (decl);
}
return decl;
}
#include "gt-fortran-trans-decl.h" #include "gt-fortran-trans-decl.h"
...@@ -316,11 +316,7 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr) ...@@ -316,11 +316,7 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr)
{ {
tree se_expr = NULL_TREE; tree se_expr = NULL_TREE;
/* Handle Cray Pointees. */ se->expr = gfc_get_symbol_decl (sym);
if (sym->attr.cray_pointee)
se->expr = gfc_conv_cray_pointee (sym);
else
se->expr = gfc_get_symbol_decl (sym);
/* Special case for assigning the return value of a function. /* Special case for assigning the return value of a function.
Self recursive functions must have an explicit return value. */ Self recursive functions must have an explicit return value. */
......
...@@ -406,9 +406,6 @@ void gfc_generate_block_data (gfc_namespace *); ...@@ -406,9 +406,6 @@ void gfc_generate_block_data (gfc_namespace *);
/* Output a decl for a module variable. */ /* Output a decl for a module variable. */
void gfc_generate_module_vars (gfc_namespace *); void gfc_generate_module_vars (gfc_namespace *);
/* Translate the declaration for a Cray Pointee. */
tree gfc_conv_cray_pointee (gfc_symbol *sym);
/* Get and set the current location. */ /* Get and set the current location. */
void gfc_set_backend_locus (locus *); void gfc_set_backend_locus (locus *);
void gfc_get_backend_locus (locus *); void gfc_get_backend_locus (locus *);
......
2005-10-25 Jakub Jelinek <jakub@redhat.com>
* gfortran.dg/cray_pointers_4.f90: New test.
* gfortran.dg/cray_pointers_5.f90: New test.
2005-10-25 Feng Wang <fengwang@nudt.edu.cn> 2005-10-25 Feng Wang <fengwang@nudt.edu.cn>
PR fortran/22290 PR fortran/22290
! { dg-do compile }
! { dg-options "-fcray-pointer" }
subroutine err1
integer :: in_common1, in_common2, v, w, equiv1, equiv2
common /in_common1/ in_common1
pointer (ipt1, in_common1) ! { dg-error "conflicts with COMMON" }
pointer (ipt2, in_common2)
common /in_common2/ in_common2 ! { dg-error "conflicts with COMMON" }
equivalence (v, equiv1)
pointer (ipt3, equiv1) ! { dg-error "conflicts with EQUIVALENCE" }
pointer (ipt4, equiv2)
equivalence (w, equiv2) ! { dg-error "conflicts with EQUIVALENCE" }
end subroutine err1
! { dg-do run }
! { dg-options "-fcray-pointer -fno-strict-aliasing" }
module cray_pointers_5
integer :: var (10), arr(100)
pointer (ipt, var)
end module cray_pointers_5
use cray_pointers_5
integer :: i
forall (i = 1:100) arr(i) = i
ipt = loc (arr)
if (any (var .ne. (/1, 2, 3, 4, 5, 6, 7, 8, 9, 10/))) call abort
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment