re PR fortran/59414 ([OOP] ICE in in gfc_conv_expr_descriptor on ALLOCATE inside...
authorJanus Weil <janus@gcc.gnu.org>
Sat, 7 Dec 2013 19:27:19 +0000 (20:27 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Sat, 7 Dec 2013 19:27:19 +0000 (20:27 +0100)
2013-12-07  Janus Weil  <janus@gcc.gnu.org>

PR fortran/59414
* resolve.c (resolve_specific_f0): Handle CLASS-valued functions.

2013-12-07  Janus Weil  <janus@gcc.gnu.org>

PR fortran/59414
* gfortran.dg/class_result_2.f90: New.

From-SVN: r205785

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/class_result_2.f90 [new file with mode: 0644]

index bad7d6b611f78b4c780662b5116a384a8c03f024..4be8725bd0d82690787fc40716993e9e57654671 100644 (file)
@@ -1,3 +1,8 @@
+2013-12-07  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/59414
+       * resolve.c (resolve_specific_f0): Handle CLASS-valued functions.
+
 2013-12-04  Tobias Burnus  <burnus@net-b.de>
 
        PR debug/37132
index d16347d034e212fbcdecb48ee2d42363907476a0..5ed70539a917b618c0a5ceb8d626dbb286594248 100644 (file)
@@ -2616,7 +2616,9 @@ found:
     expr->ts = sym->ts;
   expr->value.function.name = sym->name;
   expr->value.function.esym = sym;
-  if (sym->as != NULL)
+  if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as)
+    expr->rank = CLASS_DATA (sym)->as->rank;
+  else if (sym->as != NULL)
     expr->rank = sym->as->rank;
 
   return MATCH_YES;
index 2d8d2eb60b41d46a245b80433c3b08d67871474b..fc320428699bee77b5acbdb19f066aef6c2b880a 100644 (file)
@@ -1,3 +1,8 @@
+2013-12-07  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/59414
+       * gfortran.dg/class_result_2.f90: New.
+
 2013-12-06  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/59388
diff --git a/gcc/testsuite/gfortran.dg/class_result_2.f90 b/gcc/testsuite/gfortran.dg/class_result_2.f90
new file mode 100644 (file)
index 0000000..be37a19
--- /dev/null
@@ -0,0 +1,21 @@
+! { dg-do compile }
+!
+! PR 59414: [OOP] Class array pointers: compile error on valid code (Different ranks in pointer assignment)
+!
+! Contributed by Antony Lewis <antony@cosmologist.info>
+
+    implicit none
+
+    Type TObjectList
+    end Type
+
+    Class(TObjectList), pointer :: Arr(:)
+    Arr => ArrayItem()
+      
+  contains
+
+    function ArrayItem() result(P)
+      Class(TObjectList), pointer :: P(:)
+    end function
+
+end