diff options
author | Seth Johnson <johnsonsr@ornl.gov> | 2018-03-25 11:30:24 +0000 |
---|---|---|
committer | Dominique d'Humieres <dominiq@gcc.gnu.org> | 2018-03-25 13:30:24 +0200 |
commit | a2b471e494bf3942e35336227a846e332232d88c (patch) | |
tree | e5a533858deb6dbe102dd31881e67e07a06e070c | |
parent | 60ac5d9dd93ea7d95f69d9082eba0ed0d1a1baf0 (diff) | |
download | gcc-a2b471e494bf3942e35336227a846e332232d88c.zip gcc-a2b471e494bf3942e35336227a846e332232d88c.tar.gz gcc-a2b471e494bf3942e35336227a846e332232d88c.tar.bz2 |
re PR fortran/84924 (Erroneous error in C_F_POINTER)
2018-03-25 Seth Johnson <johnsonsr@ornl.gov>
Dominique d'Humieres <dominiq@gcc.gnu.org>
PR fortran/84924
* check.c (gfc_check_c_f_pointer): Allow scalar noninteroperable
scalar derived type with -std=f2003 and -std=f2008.
2018-03-25 Seth Johnson <johnsonsr@ornl.gov>
Dominique d'Humieres <dominiq@gcc.gnu.org>
PR fortran/84924
* gfortran.dg/scalar_pointer_1.f90: New test.
Co-Authored-By: Dominique d'Humieres <dominiq@gcc.gnu.org>
From-SVN: r258843
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/check.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/scalar_pointer_1.f90 | 36 |
4 files changed, 50 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f21f7c7..4d93c55 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2018-03-25 Seth Johnson <johnsonsr@ornl.gov> + Dominique d'Humieres <dominiq@gcc.gnu.org> + + PR fortran/84924 + * check.c (gfc_check_c_f_pointer): Allow scalar noninteroperable + scalar derived type with -std=f2003 and -std=f2008. + 2018-03-24 Jerry DeLisle <jvdelisle@gcc.gnu.org> Dominique d'Humieres <dominiq@gcc.gnu.org> diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c index 23b1964..83bd004 100644 --- a/gcc/fortran/check.c +++ b/gcc/fortran/check.c @@ -4749,7 +4749,7 @@ gfc_check_c_f_pointer (gfc_expr *cptr, gfc_expr *fptr, gfc_expr *shape) return false; } - if (!is_c_interoperable (fptr, &msg, false, true)) + if (fptr->rank > 0 && !is_c_interoperable (fptr, &msg, false, true)) return gfc_notify_std (GFC_STD_F2008_TS, "Noninteroperable array FPTR " "at %L to C_F_POINTER: %s", &fptr->where, msg); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 004c44c..8b462a5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-03-25 Seth Johnson <johnsonsr@ornl.gov> + Dominique d'Humieres <dominiq@gcc.gnu.org> + + PR fortran/84924 + * gfortran.dg/scalar_pointer_1.f90: New test. + 2018-03-25 Tom de Vries <tom@codesourcery.com> * gcc.dg/tree-ssa/vrp104.c: Make scan-tree-dump-times pattern more diff --git a/gcc/testsuite/gfortran.dg/scalar_pointer_1.f90 b/gcc/testsuite/gfortran.dg/scalar_pointer_1.f90 new file mode 100644 index 0000000..d421f38 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/scalar_pointer_1.f90 @@ -0,0 +1,36 @@ +! { dg-do compile } +! { dg-options "-std=f2003" } +! PR fortran/84924 +! Testcase contributed by Seth Johnson <johnsonsr@ornl.gov> +! +module ftest + use ISO_C_BINDING + implicit none + + type :: Cls + end type + + type :: ClsHandle + class(Cls), pointer :: ptr + end type +contains + subroutine to_ptr(c, p) + use ISO_C_BINDING + class(Cls), intent(in), target :: c + type(C_PTR), intent(out) :: p + type(ClsHandle), pointer :: handle + allocate(handle) + handle%ptr => c + p = c_loc(handle) + end subroutine + + subroutine from_ptr(p, c) + use ISO_C_BINDING + type(C_PTR), intent(in) :: p + class(Cls), intent(out), pointer :: c + type(ClsHandle), pointer :: handle + call c_f_pointer(cptr=p, fptr=handle) + c => handle%ptr + deallocate(handle) + end subroutine +end module |