Hi, On 17/10/19 17:29, Tobias Burnus wrote:
If you generate to stdout/stderr like in this case, I think it makes sense to also check for this output using "{dg-output …}".
Added the suggested check and a few touches to comments and the error message.
that might be a bug in the C code of the test itself
I took a look and although there are problems with the code of the test I do not think they are relevant.
Index: gcc/testsuite/gfortran.dg/ISO_Fortran_binding_10.c =================================================================== --- gcc/testsuite/gfortran.dg/ISO_Fortran_binding_10.c (revision 277537) +++ gcc/testsuite/gfortran.dg/ISO_Fortran_binding_10.c (working copy) @@ -15,7 +15,7 @@ bool err; CFI_CDESC_T(1) that; CFI_index_t lb[] = { 0, 0 }; - CFI_index_t ub[] = { 4, 1 }; + CFI_index_t ub[] = { 4, 0 }; CFI_index_t st[] = { 2, 0 }; int chksum[] = { 9, 36, 38 }; @@ -39,7 +39,7 @@ if (*status != CFI_SUCCESS) { - printf("FAIL C: status is %i\n",status); + printf("FAIL C: status is %i\n", *status); return; } Best regards, José Rui
Index: libgfortran/runtime/ISO_Fortran_binding.c =================================================================== --- libgfortran/runtime/ISO_Fortran_binding.c (revision 277537) +++ libgfortran/runtime/ISO_Fortran_binding.c (working copy) @@ -794,13 +794,23 @@ int CFI_setpointer (CFI_cdesc_t *result, CFI_cdesc_t *source, const CFI_index_t lower_bounds[]) { - /* Result must not be NULL. */ - if (unlikely (compile_options.bounds_check) && result == NULL) + /* Result must not be NULL and must be a Fortran pointer. */ + if (unlikely (compile_options.bounds_check)) { - fprintf (stderr, "CFI_setpointer: Result is NULL.\n"); - return CFI_INVALID_DESCRIPTOR; + if (result == NULL) + { + fprintf (stderr, "CFI_setpointer: Result is NULL.\n"); + return CFI_INVALID_DESCRIPTOR; + } + + if (result->attribute != CFI_attribute_pointer) + { + fprintf (stderr, "CFI_setpointer: Result shall be the address of a " + "C descriptor for a Fortran pointer.\n"); + return CFI_INVALID_ATTRIBUTE; + } } - + /* If source is NULL, the result is a C Descriptor that describes a * disassociated pointer. */ if (source == NULL) @@ -807,7 +817,6 @@ { result->base_addr = NULL; result->version = CFI_VERSION; - result->attribute = CFI_attribute_pointer; } else { @@ -851,7 +860,6 @@ /* Assign components to result. */ result->version = source->version; - result->attribute = source->attribute; /* Dimension information. */ for (int i = 0; i < source->rank; i++) Index: gcc/testsuite/gfortran.dg/ISO_Fortran_binding_15.c =================================================================== --- gcc/testsuite/gfortran.dg/ISO_Fortran_binding_15.c (nonexistent) +++ gcc/testsuite/gfortran.dg/ISO_Fortran_binding_15.c (working copy) @@ -0,0 +1,40 @@ +/* Test the fix for PR92142. */ + +#include "../../../libgfortran/ISO_Fortran_binding.h" + +#include <stdlib.h> + +int c_setpointer(CFI_cdesc_t *); + +int c_setpointer(CFI_cdesc_t *ip) +{ + CFI_cdesc_t *yp = NULL; + void *auxp = ip->base_addr; + int ierr; + int status; + + /* Setting up the pointer */ + ierr = 1; + yp = malloc(sizeof(*ip)); + if (yp == NULL) return ierr; + status = CFI_establish(yp, NULL, CFI_attribute_pointer, ip->type, ip->elem_len, ip->rank, NULL); + if (status != CFI_SUCCESS) return ierr; + if (yp->attribute != CFI_attribute_pointer) return ierr; + /* Set the pointer to ip */ + ierr = 2; + status = CFI_setpointer(yp, ip, NULL); + if (status != CFI_SUCCESS) return ierr; + if (yp->attribute != CFI_attribute_pointer) return ierr; + /* Set the pointer to NULL */ + ierr = 3; + status = CFI_setpointer(yp, NULL, NULL); + if (status != CFI_SUCCESS) return ierr; + if (yp->attribute != CFI_attribute_pointer) return ierr; + /* "Set" the ip variable to yp (should not be possible) */ + ierr = 4; + status = CFI_setpointer(ip, yp, NULL); + if (status != CFI_INVALID_ATTRIBUTE) return ierr; + if (ip->attribute != CFI_attribute_other) return ierr; + if (ip->base_addr != auxp) return ierr; + return 0; +} Index: gcc/testsuite/gfortran.dg/ISO_Fortran_binding_15.f90 =================================================================== --- gcc/testsuite/gfortran.dg/ISO_Fortran_binding_15.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/ISO_Fortran_binding_15.f90 (working copy) @@ -0,0 +1,25 @@ +! { dg-do run } +! { dg-additional-options "-fbounds-check" } +! { dg-additional-sources ISO_Fortran_binding_15.c } +! +! Test the fix for PR92142. +! + use, intrinsic :: iso_c_binding, only: c_int + + implicit none + + interface + function c_setpointer(ip) result(ierr) bind(c) + use, intrinsic :: iso_c_binding, only: c_int + type(*), dimension(..), target :: ip + integer(c_int) :: ierr + end function c_setpointer + end interface + + integer(c_int) :: it = 1 + + if (c_setpointer(it) /= 0) stop 1 + +end + +! { dg-output "CFI_setpointer: Result shall be the address of a C descriptor for a Fortran pointer." }