trans.h (gfc_conv_cray_pointee): Remove.
authorJakub Jelinek <jakub@gcc.gnu.org>
Tue, 25 Oct 2005 18:43:22 +0000 (20:43 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 25 Oct 2005 18:43:22 +0000 (20:43 +0200)
* 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

13 files changed:
gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/fortran/gfortran.texi
gcc/fortran/module.c
gcc/fortran/resolve.c
gcc/fortran/symbol.c
gcc/fortran/trans-array.c
gcc/fortran/trans-decl.c
gcc/fortran/trans-expr.c
gcc/fortran/trans.h
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/cray_pointers_4.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/cray_pointers_5.f90 [new file with mode: 0644]

index 353e515..233f149 100644 (file)
@@ -1,3 +1,26 @@
+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>
 
        PR fortran/22290
@@ -14,8 +37,8 @@
 
        PR fortran/17031
        PR fortran/22282
-       * check.c (gfc_check_loc) : New function
-       * decl.c (variable_decl): New variables cp_as and sym. Added a    
+       * 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.
@@ -24,7 +47,7 @@
        (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
+       * 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.
@@ -39,7 +62,7 @@
        (gfc_resolve_loc): Declare.
        * iresolve.c (gfc_resolve_loc): New.
        * 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_handle_option): Deal with -fcray-pointer.
        * parse.c:(resolve_equivalence): Added code prohibiting Cray
        checking for Cray Pointee arrays.
        (resolve_equivalence): Prohibited pointees in equivalence
        statements.
-       * symbol.c (check_conflict): Added Cray pointer/pointee  
+       * 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
+       (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    
+       (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     
+       * 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
+       * 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                
+       (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
+       pointers from list of proposed extensions.
        * 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>
 
        * check.c (gfc_check_ichar_iachar): Move the code around so
        that the check on the length is after check for
        references.
-       
+
 2005-10-23  Asher Langton  <langton2@llnl.gov>
 
        * decl.c (match_type_spec): Add a BYTE type as an extension.
 
        PR fortran/21625
        * 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
        derived types, if they need it.
        (resolve_code): Provide current statement as argument to
 2005-09-21  Erik Edelmann  <erik.edelmann@iki.fi>
 
        PR fortran/19929
-       * trans-stmt.c (gfc_trans_deallocate): Check if the 
-       object to be deallocated is an array by looking at 
+       * trans-stmt.c (gfc_trans_deallocate): Check if the
+       object to be deallocated is an array by looking at
        expr->rank instead of expr->symtree->n.sym->attr.dimension.
 
 2005-09-20  Tobias Schl"uter  <tobias.schlueter@physik.uni-muenchen.de>
        to store the character (array) and the character length for an internal
        unit.
        * fortran/trans-io (build_dt): Use the new function set_internal_unit.
-       
+
 2005-09-14  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/19358
 
 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.
        * gfortran.h: Add enums for FLUSH.
        * io.c (gfc_free_filepos,match_file_element,match_filepos): Modify
        Don't clear maskindexes here.
 
 2005-07-08  Daniel Berlin  <dberlin@dberlin.org>
-       
+
        * trans-decl.c (create_function_arglist): DECL_ARG_TYPE_AS_WRITTEN
        is removed.
 
        (gfc_return_by_reference): Always look at sym, never at sym->result.
 
 2005-06-11  Steven G. Kargl  <kargls@comcast.net>
-       
+
        PR fortran/17792
        PR fortran/21375
        * trans-array.c (gfc_array_deallocate): pstat is new argument
 
        PR fortran/19195
        * 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-05-29  Janne Blomqvist  <jblomqvi@vipunen.hut.fi>
            Steven G. Kargl  <kargls@comcast.net>
-  
+
        fortran/PR20846
        * io.c (gfc_match_inquire): Implement constraints on UNIT and FILE usage.
 
 2005-05-18  Thomas Koenig  <Thomas.Koenig@online.de>
 
        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
        to resolved function name.
 
        Jerry DeLisle  <jvdelisle@verizon.net>
 
        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.
        * trans-io.c (set_string): add fold-convert to properly
        handle assigned format label in write.
+
 2005-05-13  Paul Brook  <paul@codesourcery.com>
 
        * trans-stmt.c (gfc_trans_forall_1): Fix comment typo.
        * options.c (gfc-init_options): Set default calling convention
        to -fno-f2c.  Mark -fsecond-underscore unset.
        (gfc_post_options): Set -fsecond-underscore if not explicitly set
-       by user.        
+       by user.
        (handle_options): Set gfc_option.flag_f2c according to requested
        calling convention.
        * trans-decl.c (gfc_get_extern_function_decl): Use special f2c
 
        * gfortran.h (gfc_namespace): Add seen_implicit_none field,
        Tobias forgot this in previous commit.
-       
+
 2005-04-29  Paul Brook   <paul@codesourcery.com>
 
        * trans-expr.c (gfc_conv_expr_present): Fix broken assert.  Update
        declaration for st_set_nml_var and st_set_nml_var_dim. Remove
        declarations of old namelist functions.
        (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.
-       (nml_full_name): Qualified name for derived type components. New 
+       (nml_full_name): Qualified name for derived type components. New
        function.
-       (transfer_namelist_element): Modified for calls to new functions 
+       (transfer_namelist_element): Modified for calls to new functions
        and improved derived type handling.
 
 2005-04-17  Richard Guenther  <rguenth@gcc.gnu.org>
 
 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>
 
        * gfortran.h (option_t): Change d8, i8, r8 to flag_default_double,
        flag_default_integer, flag_default_real
        * 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.
        * options.c (gfc_init_options): Set option defaults
        (gfc_handle_option): Handle command line options.
        gfc_match_null, match_type_spec, match_attr_spec,
        gfc_match_formal_arglist, match_result, gfc_match_function_decl):
        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,
        access_attr_decl, do_parm, gfc_match_save, gfc_match_modproc,
        gfc_match_derived_decl): Update callers.
        unsigned issue.  Use build_int_cst instead of converting
        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.
 
        * trans-intrinsic.c (build_fixbound_expr,
index 8102fa6..5d4bd56 100644 (file)
@@ -2995,8 +2995,7 @@ attr_decl (void)
    pointer (ipt, ar(10))
    any subsequent uses of ar will be translated (in C-notation) as
    ar(i) => ((<type> *) ipt)(i)   
-   By the time the code is translated into GENERIC, the pointee will
-   have disappeared from the code entirely. */
+   After gimplification, pointee variable will disappear in the code.  */
 
 static match
 cray_pointer_decl (void)
@@ -3112,7 +3111,7 @@ cray_pointer_decl (void)
        } 
    
       /* Point the Pointee at the Pointer.  */
-      cpte->cp_pointer=cptr;
+      cpte->cp_pointer = cptr;
 
       if (gfc_match_char (')') != MATCH_YES)
        {
index b4e672e..f696c5f 100644 (file)
@@ -899,11 +899,7 @@ expect.  Adding 1 to ipt just adds one byte to the address stored in
 ipt.
 
 Any expression involving the pointee will be translated to use the
-value stored in the pointer as the base address.  This translation is
-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.
+value stored in the pointer as the base address.
 
 To get the address of elements, this extension provides an intrinsic
 function loc(), loc() is essentially the C '&' operator, except the
index 1066e2e..763905b 100644 (file)
@@ -1431,7 +1431,8 @@ typedef enum
   AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT,
   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
+  AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT, AB_CRAY_POINTER,
+  AB_CRAY_POINTEE
 }
 ab_attribute;
 
@@ -1458,6 +1459,8 @@ static const mstring attr_bits[] =
     minit ("RECURSIVE", AB_RECURSIVE),
     minit ("GENERIC", AB_GENERIC),
     minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
+    minit ("CRAY_POINTER", AB_CRAY_POINTER),
+    minit ("CRAY_POINTEE", AB_CRAY_POINTEE),
     minit (NULL, -1)
 };
 
@@ -1542,6 +1545,10 @@ mio_symbol_attribute (symbol_attribute * attr)
        MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
       if (attr->always_explicit)
         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 ();
 
@@ -1622,6 +1629,12 @@ mio_symbol_attribute (symbol_attribute * attr)
             case AB_ALWAYS_EXPLICIT:
               attr->always_explicit = 1;
               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)
 
   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
      to be private.  Component access is checked during searching.  */
 
index 8ae1162..6c03126 100644 (file)
@@ -5177,14 +5177,6 @@ resolve_equivalence (gfc_equiv *eq)
           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.  */      
       if (e->expr_type == EXPR_CONSTANT)
         {
index b9e76ef..85ed70e 100644 (file)
@@ -368,6 +368,8 @@ check_conflict (symbol_attribute * attr, const char * name, locus * where)
   conf (cray_pointee, function);
   conf (cray_pointee, subroutine);
   conf (cray_pointee, entry);
+  conf (cray_pointee, in_common);
+  conf (cray_pointee, in_equivalence);
 
   a1 = gfc_code2string (flavors, attr->flavor);
 
index 1a09121..72669f8 100644 (file)
@@ -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)
     {
       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)
        se->string_length = sym->ts.cl->backend_decl;
       if (!sym->attr.pointer && sym->as->type != AS_ASSUMED_SHAPE 
index 15d9006..ff69954 100644 (file)
@@ -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.  */
 
 static void
@@ -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
      CALL statement.  */
 
-  /* We don't want real declarations for Cray Pointees.  */
+  /* Set DECL_VALUE_EXPR for Cray Pointees.  */
   if (sym->attr.cray_pointee)
-    return;
+    gfc_finish_cray_pointee (decl, sym);
 
   if (sym->attr.target)
     TREE_ADDRESSABLE (decl) = 1;
@@ -437,6 +475,9 @@ gfc_finish_var_decl (tree decl, gfc_symbol * sym)
        gfc_add_decl_to_parent_function (decl);
     }
 
+  if (sym->attr.cray_pointee)
+    return;
+
   /* If a variable is USE associated, it's always external.  */
   if (sym->attr.use_assoc)
     {
@@ -2309,10 +2350,6 @@ gfc_create_module_variable (gfc_symbol * sym)
   /* Create the decl.  */
   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.  */
   pushdecl (decl);
   rest_of_decl_compilation (decl, 1, 0);
@@ -2734,36 +2771,5 @@ gfc_generate_block_data (gfc_namespace * ns)
   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"
index 4dc4d56..fe5e24b 100644 (file)
@@ -316,11 +316,7 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr)
     {
       tree se_expr = NULL_TREE;
 
-      /* Handle Cray Pointees.  */
-      if (sym->attr.cray_pointee)
-       se->expr = gfc_conv_cray_pointee (sym);
-      else
-       se->expr = gfc_get_symbol_decl (sym);
+      se->expr = gfc_get_symbol_decl (sym);
 
       /* Special case for assigning the return value of a function.
         Self recursive functions must have an explicit return value.  */
index 16dd517..16d0a37 100644 (file)
@@ -406,9 +406,6 @@ void gfc_generate_block_data (gfc_namespace *);
 /* Output a decl for a module variable.  */
 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.  */
 void gfc_set_backend_locus (locus *);
 void gfc_get_backend_locus (locus *);
index 6039e88..1f8cf65 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        PR fortran/22290
diff --git a/gcc/testsuite/gfortran.dg/cray_pointers_4.f90 b/gcc/testsuite/gfortran.dg/cray_pointers_4.f90
new file mode 100644 (file)
index 0000000..85e7ae7
--- /dev/null
@@ -0,0 +1,14 @@
+! { 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
diff --git a/gcc/testsuite/gfortran.dg/cray_pointers_5.f90 b/gcc/testsuite/gfortran.dg/cray_pointers_5.f90
new file mode 100644 (file)
index 0000000..76bb979
--- /dev/null
@@ -0,0 +1,15 @@
+! { 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