aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2010-12-14 18:09:33 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2010-12-14 18:09:33 +0100
commit39752c6b14932596939ae340e5da962f4263018a (patch)
treed0d08b2e3bf23d8242be2e68d083da9fdf67ec8e
parent55256000cf069f58f1e19df4786766a2da17bf3d (diff)
downloadgcc-39752c6b14932596939ae340e5da962f4263018a.zip
gcc-39752c6b14932596939ae340e5da962f4263018a.tar.gz
gcc-39752c6b14932596939ae340e5da962f4263018a.tar.bz2
re PR fortran/46937 (gfortran.dg/pointer_intent_1.f90 FAILs with -fno-inline)
2010-12-14 Tobias Burnus <burnus@net-b.de> PR fortran/46937 * trans-types.c (create_fn_spec): "."-annotate derived types with (proc-)pointer components. 2010-12-14 Tobias Burnus <burnus@net-b.de> PR fortran/46937 * gfortran.dg/pointer_intent_4.f90: New. From-SVN: r167806
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-types.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pointer_intent_4.f9030
4 files changed, 48 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 230724e..fd635e0 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2010-12-14 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/46937
+ * trans-types.c (create_fn_spec): "."-annotate derived types
+ with (proc-)pointer components.
+
2010-12-14 Jakub Jelinek <jakub@redhat.com>
PR fortran/46874
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index 561261f..1de7e1e 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -2325,7 +2325,13 @@ create_fn_spec (gfc_symbol *sym, tree fntype)
if (spec_len < sizeof (spec))
{
if (!f->sym || f->sym->attr.pointer || f->sym->attr.target
- || f->sym->attr.external || f->sym->attr.cray_pointer)
+ || f->sym->attr.external || f->sym->attr.cray_pointer
+ || (f->sym->ts.type == BT_DERIVED
+ && (f->sym->ts.u.derived->attr.proc_pointer_comp
+ || f->sym->ts.u.derived->attr.pointer_comp))
+ || (f->sym->ts.type == BT_CLASS
+ && (CLASS_DATA (f->sym)->ts.u.derived->attr.proc_pointer_comp
+ || CLASS_DATA (f->sym)->ts.u.derived->attr.pointer_comp)))
spec[spec_len++] = '.';
else if (f->sym->attr.intent == INTENT_IN)
spec[spec_len++] = 'r';
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1057858..5dfc9c2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-12-14 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/46937
+ * gfortran.dg/pointer_intent_4.f90: New.
+
2010-12-14 Jakub Jelinek <jakub@redhat.com>
PR debug/46885
diff --git a/gcc/testsuite/gfortran.dg/pointer_intent_4.f90 b/gcc/testsuite/gfortran.dg/pointer_intent_4.f90
new file mode 100644
index 0000000..862edff
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pointer_intent_4.f90
@@ -0,0 +1,30 @@
+! { dg-do run }
+! { dg-options "-fno-inline" }
+!
+! PR fortran/46937
+!
+! Check that a non-pointer INTENT(IN) dummy
+! with pointer component is properly treated
+!
+program test
+ type myT
+ integer, pointer :: point
+ end type myT
+ type(myT) :: t2
+ allocate(t2%point)
+ t2%point = 42
+ call nonpointer(t2)
+ if(t2%point /= 7) call abort()
+ t2%point = 42
+ call nonpointer2(t2)
+ if(t2%point /= 66) call abort()
+contains
+ subroutine nonpointer(t)
+ type(myT), intent(in) :: t
+ t%point = 7
+ end subroutine nonpointer
+ subroutine nonpointer2(t)
+ class(myT), intent(in) :: t
+ t%point = 66
+ end subroutine nonpointer2
+end program