diff options
author | Tobias Burnus <burnus@net-b.de> | 2010-12-14 18:09:33 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2010-12-14 18:09:33 +0100 |
commit | 39752c6b14932596939ae340e5da962f4263018a (patch) | |
tree | d0d08b2e3bf23d8242be2e68d083da9fdf67ec8e | |
parent | 55256000cf069f58f1e19df4786766a2da17bf3d (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pointer_intent_4.f90 | 30 |
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 |