aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2011-12-03 19:30:36 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2011-12-03 19:30:36 +0100
commit7d40e49f27458de1c3b0481b3cf94e03b73fdd7f (patch)
treefd93a90a523df23aa531f68dea337f8c7dd73fd7
parent99b375d0b9802b28f3250ef3d2af6ac56d6d4c7c (diff)
downloadgcc-7d40e49f27458de1c3b0481b3cf94e03b73fdd7f.zip
gcc-7d40e49f27458de1c3b0481b3cf94e03b73fdd7f.tar.gz
gcc-7d40e49f27458de1c3b0481b3cf94e03b73fdd7f.tar.bz2
re PR fortran/48887 ([OOP] SELECT TYPE: Associate name shall not be a pointer/allocatable)
2011-12-03 Tobias Burnus <burnus@net-b.de> PR fortran/48887 * match.c (select_type_set_tmp): Don't set allocatable/pointer attribute. * class.c (gfc_build_class_symbol): Handle attr.select_type_temporary. 2011-12-03 Tobias Burnus <burnus@net-b.de> PR fortran/48887 * gfortran.dg/select_type_24.f90: New. * gfortran.dg/select_type_23.f03: Add dg-error. * gfortran.dg/class_45a.f03: Add missing TARGET attribute. From-SVN: r181975
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/class.c6
-rw-r--r--gcc/fortran/match.c7
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/class_45a.f032
-rw-r--r--gcc/testsuite/gfortran.dg/select_type_23.f034
-rw-r--r--gcc/testsuite/gfortran.dg/select_type_24.f9050
7 files changed, 74 insertions, 10 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index bec5430..fbe15b0 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,11 @@
+2011-12-03 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/48887
+ * match.c (select_type_set_tmp): Don't set allocatable/pointer
+ attribute.
+ * class.c (gfc_build_class_symbol): Handle
+ attr.select_type_temporary.
+
2011-12-03 Tobias Burnus <burnus@net-b.de>
PR fortran/50684
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index bcb2d0b..d3f7bf3 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -188,7 +188,8 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr,
/* Class container has already been built. */
return SUCCESS;
- attr->class_ok = attr->dummy || attr->pointer || attr->allocatable;
+ attr->class_ok = attr->dummy || attr->pointer || attr->allocatable
+ || attr->select_type_temporary;
if (!attr->class_ok)
/* We can not build the class container yet. */
@@ -239,7 +240,8 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr,
c->attr.access = ACCESS_PRIVATE;
c->ts.u.derived = ts->u.derived;
c->attr.class_pointer = attr->pointer;
- c->attr.pointer = attr->pointer || attr->dummy;
+ c->attr.pointer = attr->pointer || (attr->dummy && !attr->allocatable)
+ || attr->select_type_temporary;
c->attr.allocatable = attr->allocatable;
c->attr.dimension = attr->dimension;
c->attr.codimension = attr->codimension;
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index fbafe82..3de9c72 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -5152,16 +5152,11 @@ select_type_set_tmp (gfc_typespec *ts)
gfc_get_sym_tree (name, gfc_current_ns, &tmp, false);
gfc_add_type (tmp->n.sym, ts, NULL);
gfc_set_sym_referenced (tmp->n.sym);
- if (select_type_stack->selector->ts.type == BT_CLASS &&
- CLASS_DATA (select_type_stack->selector)->attr.allocatable)
- gfc_add_allocatable (&tmp->n.sym->attr, NULL);
- else
- gfc_add_pointer (&tmp->n.sym->attr, NULL);
gfc_add_flavor (&tmp->n.sym->attr, FL_VARIABLE, name, NULL);
+ tmp->n.sym->attr.select_type_temporary = 1;
if (ts->type == BT_CLASS)
gfc_build_class_symbol (&tmp->n.sym->ts, &tmp->n.sym->attr,
&tmp->n.sym->as, false);
- tmp->n.sym->attr.select_type_temporary = 1;
/* Add an association for it, so the rest of the parser knows it is
an associate-name. The target will be set during resolution. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ffe51d3..c7cfa2c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2011-12-03 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/48887
+ * gfortran.dg/select_type_24.f90: New.
+ * gfortran.dg/select_type_23.f03: Add dg-error.
+ * gfortran.dg/class_45a.f03: Add missing TARGET attribute.
+
2011-12-03 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/vect/vect-122.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/class_45a.f03 b/gcc/testsuite/gfortran.dg/class_45a.f03
index af8932a..91f11c4 100644
--- a/gcc/testsuite/gfortran.dg/class_45a.f03
+++ b/gcc/testsuite/gfortran.dg/class_45a.f03
@@ -18,7 +18,7 @@ contains
function basicGet(self)
implicit none
class(t0), pointer :: basicGet
- class(t0), intent(in) :: self
+ class(t0), target, intent(in) :: self
select type (self)
type is (t1)
basicGet => self
diff --git a/gcc/testsuite/gfortran.dg/select_type_23.f03 b/gcc/testsuite/gfortran.dg/select_type_23.f03
index d7788d2..ced8537 100644
--- a/gcc/testsuite/gfortran.dg/select_type_23.f03
+++ b/gcc/testsuite/gfortran.dg/select_type_23.f03
@@ -3,6 +3,8 @@
! PR 48699: [OOP] MOVE_ALLOC inside SELECT TYPE
!
! Contributed by Salvatore Filippone <sfilippone@uniroma2.it>
+!
+! Updated for PR fortran/48887
program testmv2
@@ -16,7 +18,7 @@ program testmv2
select type(sm2)
type is (bar)
- call move_alloc(sm2,sm)
+ call move_alloc(sm2,sm) ! { dg-error "must be ALLOCATABLE" }
end select
end program testmv2
diff --git a/gcc/testsuite/gfortran.dg/select_type_24.f90 b/gcc/testsuite/gfortran.dg/select_type_24.f90
new file mode 100644
index 0000000..e47d000
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/select_type_24.f90
@@ -0,0 +1,50 @@
+! { dg-do compile }
+!
+! PR fortran/48887
+!
+! "If the selector is allocatable, it shall be allocated; the
+! associate name is associated with the data object and does
+! not have the ALLOCATABLE attribute."
+!
+module m
+ type t
+ end type t
+contains
+ subroutine one(a)
+ class(t), allocatable :: a
+ class(t), allocatable :: b
+ allocate (b)
+ select type (b)
+ type is(t)
+ call move_alloc (b, a) ! { dg-error "must be ALLOCATABLE" }
+ end select
+ end subroutine one
+
+ subroutine two (a)
+ class(t), allocatable :: a
+ type(t), allocatable :: b
+ allocate (b)
+ associate (c => b)
+ call move_alloc (b, c) ! { dg-error "must be ALLOCATABLE" }
+ end associate
+ end subroutine two
+end module m
+
+type t
+end type t
+class(t), allocatable :: x
+
+select type(x)
+ type is(t)
+ print *, allocated (x) ! { dg-error "must be ALLOCATABLE" }
+end select
+
+select type(y=>x)
+ type is(t)
+ print *, allocated (y) ! { dg-error "must be ALLOCATABLE" }
+end select
+
+associate (y=>x)
+ print *, allocated (y) ! { dg-error "must be ALLOCATABLE" }
+end associate
+end