Re: [Patch] gfortran.dg/read_dir.f90: Make PASS on Windows

2022-12-19 Thread Tobias Burnus

And here is a more light-wight variant, suggested by Nightstrike:

Using '.' instead of creating a new directory - and checking for
__WIN32__ instead for __MINGW32__.

The only downside of this variant is that it does not check whether
"close(10,status='delete')" will delete a directory without failing with
an error. – If the latter makes sense, I think a follow-up check should
be added to ensure the directory has indeed been removed by 'close'.

Thoughts about which variant is better? Other suggestions or comments?

Tobias

PS: On my x86-64 Linux, OPEN works but READ fails with EISDIR/errno == 21.

On 19.12.22 10:09, Tobias Burnus wrote:

As discussed in #gfortran IRC, on Windows opening a directory fails
with EACCESS.
(It works under Cygwin - nightstrike was so kind to test this.)

Additionally, '[ -d dir ] || mkdir dir' is also not very portable.

Hence, I use an auxiliary C file calling the POSIX functions and
expect a fail for non-Cygwin windows.

Comments? Suggestions? - If there aren't any, I plan to commit it
as obvious tomorrow.

-
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas 
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht 
München, HRB 106955
gfortran.dg/read_dir.f90: Make PASS on Windows

Avoid call to the shell using POSIX syntax and use '.' instead.
Additionally, expect fail on non-Cygwin Windows as opening a directory
is documented to fail with EACCESS.

gcc/testsuite/ChangeLog:

	* gfortran.dg/read_dir.f90: Open '.' instead of a freshly created
	directory; expect error on Windows when opening a directory.

 gcc/testsuite/gfortran.dg/read_dir.f90 | 21 ++---
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/gcc/testsuite/gfortran.dg/read_dir.f90 b/gcc/testsuite/gfortran.dg/read_dir.f90
index c7ddc51fb90..c91d0f78413 100644
--- a/gcc/testsuite/gfortran.dg/read_dir.f90
+++ b/gcc/testsuite/gfortran.dg/read_dir.f90
@@ -1,20 +1,27 @@
 ! { dg-do run }
+! { dg-additional-options "-cpp" }
+!
 ! PR67367
+
 program bug
implicit none
character(len=1) :: c
-   character(len=256) :: message
integer ios
-   call system('[ -d junko.dir ] || mkdir junko.dir')
-   open(unit=10, file='junko.dir',iostat=ios,action='read',access='stream')
+   open(unit=10, file='.',iostat=ios,action='read',access='stream')
+
+#if defined(__WIN32__) && !defined(__CYGWIN__)
+   ! Windows is documented to fail with EACCESS when trying to open a directory
+   if (ios == 0) &
+  stop 3  ! Expected EACCESS
+   stop 0  ! OK
+#endif   
+
if (ios.ne.0) then
-  call system('rmdir junko.dir')
   STOP 1
end if
read(10, iostat=ios) c
-   if (ios.ne.21.and.ios.ne.0) then 
-  close(10, status='delete')
+   close(10)
+   if (ios.ne.21.and.ios.ne.0) then  ! EISDIR has often the value 21
   STOP 2
end if
-   close(10, status='delete')
 end program bug


[committed] testsuite: Fix up pr107397.f90 test [PR107397]

2022-12-19 Thread Jakub Jelinek via Fortran
On Sat, Dec 17, 2022 at 09:12:43AM -0800, Jerry D via Gcc-patches wrote:
> The attached patch fixes a regression and is a patch from Steve.  I have
> regression tested it and provided a test case.  It is fairly simple and I
> will commit under the "simple" rule in a little while.
> 
> Thanks Steve for Patch. Thanks Harald for helping me get back up to speed on
> the git magic.

The pr107397.f90 test FAILs for me, one problem was that the
added diagnostics has an indefinite article before BOZ, but
the test dg-error didn't.  The other problem was that on the
other dg-error there was no space between the string and closing
}, so it was completely ignored and the error was an excess
error.

2022-12-19  Jakub Jelinek  

PR fortran/107397
* gfortran.dg/pr107397.f90: Adjust expected diagnostic wording and
add space between dg-error string and closing }.

--- gcc/testsuite/gfortran.dg/pr107397.f90.jj   2022-12-19 11:09:13.793166473 
+0100
+++ gcc/testsuite/gfortran.dg/pr107397.f90  2022-12-19 11:23:02.981322107 
+0100
@@ -4,6 +4,6 @@ program p
   type t
 real :: a = 1.0
   end type
-  type(t), parameter :: x = z'1' ! { dg-error "incompatible with BOZ" }
-  x%a = x%a + 2 ! { dg-error "has no IMPLICIT type"}
+  type(t), parameter :: x = z'1' ! { dg-error "incompatible with a BOZ" }
+  x%a = x%a + 2 ! { dg-error "has no IMPLICIT type" }
 end


Jakub



[Patch] gfortran.dg/read_dir.f90: Make PASS on Windows

2022-12-19 Thread Tobias Burnus

As discussed in #gfortran IRC, on Windows opening a directory fails with 
EACCESS.
(It works under Cygwin - nightstrike was so kind to test this.)

Additionally, '[ -d dir ] || mkdir dir' is also not very portable.

Hence, I use an auxiliary C file calling the POSIX functions and
expect a fail for non-Cygwin windows.

Comments? Suggestions? - If there aren't any, I plan to commit it
as obvious tomorrow.

Tobias
-
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas 
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht 
München, HRB 106955
gfortran.dg/read_dir.f90: Make PASS on Windows

Call POSIX's stat/mkdir/rmdir instead of using the shell via 'call system'.
Additionally, expect EACCESS on non-Cygwin Windows as documented for trying
to open a directory.

gcc/testsuite/ChangeLog:

	* gfortran.dg/read_dir-aux.c: New; provides my_mkdir and my_rmdir.
	* gfortran.dg/read_dir.f90: Call my_mkdir/my_rmdir; expect
	error on Windows when opening a directory.

 gcc/testsuite/gfortran.dg/read_dir-aux.c | 39 +
 gcc/testsuite/gfortran.dg/read_dir.f90   | 43 
 2 files changed, 77 insertions(+), 5 deletions(-)

diff --git a/gcc/testsuite/gfortran.dg/read_dir-aux.c b/gcc/testsuite/gfortran.dg/read_dir-aux.c
new file mode 100644
index 000..e8404478517
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/read_dir-aux.c
@@ -0,0 +1,39 @@
+#include   /* For mkdir + permission bits.  */
+#include   /* For rmdir.  */
+#include   /* For errno.  */
+#include   /* For perror.  */
+#include   /* For abort.  */
+ 
+
+void
+my_mkdir (const char *dir)
+{
+  int err;
+  struct stat path_stat;
+
+  /* Check whether 'dir' exists and is a directory.  */
+  err = stat (dir, &path_stat);
+  if (err && errno != ENOENT)
+{
+  perror ("my_mkdir: failed to call stat for directory");
+  abort ();
+}
+  if (err == 0 && !S_ISDIR (path_stat.st_mode))
+{
+  printf ("my_mkdir: pathname %s is not a directory\n", dir);
+  abort ();
+}
+
+  err = mkdir (dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+  if (err != 0)
+{
+  perror ("my_mkdir: failed to create directory");
+  abort ();
+}
+}
+
+void
+my_rmdir (const char *dir)
+{
+  rmdir (dir);
+}
diff --git a/gcc/testsuite/gfortran.dg/read_dir.f90 b/gcc/testsuite/gfortran.dg/read_dir.f90
index c7ddc51fb90..3a8ff6adbc7 100644
--- a/gcc/testsuite/gfortran.dg/read_dir.f90
+++ b/gcc/testsuite/gfortran.dg/read_dir.f90
@@ -1,18 +1,51 @@
 ! { dg-do run }
+! { dg-additional-options "-cpp" }
+! { dg-additional-sources read_dir-aux.c }
+!
 ! PR67367
+
 program bug
+   use iso_c_binding
implicit none
+
+   interface
+ subroutine my_mkdir(s) bind(C)
+   ! Call POSIX's mkdir - and ignore fails due to
+   ! existing directories but fail otherwise
+   import
+   character(len=1,kind=c_char) :: s(*)
+ end subroutine
+ subroutine my_rmdir(s) bind(C)
+   ! Call POSIX's rmdir - and ignore fails
+   import
+   character(len=1,kind=c_char) :: s(*)
+ end subroutine
+   end interface
+
+   character(len=*), parameter :: sdir = "junko.dir"
+   character(len=*,kind=c_char), parameter :: c_sdir = sdir // c_null_char
+
character(len=1) :: c
-   character(len=256) :: message
integer ios
-   call system('[ -d junko.dir ] || mkdir junko.dir')
-   open(unit=10, file='junko.dir',iostat=ios,action='read',access='stream')
+
+   call my_mkdir(c_sdir)
+   open(unit=10, file=sdir,iostat=ios,action='read',access='stream')
+
+#if defined(__MINGW32__)
+   ! Windows is documented to fail with EACCESS when trying to open a directory
+   ! Note: Testing showed that __CYGWIN__ does permit opening directories
+   call my_rmdir(c_sdir)
+   if (ios == 0) &
+  stop 3  ! Expected EACCESS
+   stop 0  ! OK
+#endif   
+
if (ios.ne.0) then
-  call system('rmdir junko.dir')
+  call my_rmdir(c_sdir)
   STOP 1
end if
read(10, iostat=ios) c
-   if (ios.ne.21.and.ios.ne.0) then 
+   if (ios.ne.21.and.ios.ne.0) then  ! EISDIR has often the value 21
   close(10, status='delete')
   STOP 2
end if


Re: [Patch] gfortran.dg/read_dir.f90: Make PASS on Windows

2022-12-19 Thread Tobias Burnus

On 19.12.22 10:26, Tobias Burnus wrote:

And here is a more light-wight variant, suggested by Nightstrike:

Using '.' instead of creating a new directory - and checking for
__WIN32__ instead for __MINGW32__.

The only downside of this variant is that it does not check whether
"close(10,status='delete')" will delete a directory without failing with
an error. – If the latter makes sense, I think a follow-up check should
be added to ensure the directory has indeed been removed by 'close'.


I have now updated the heavy version. The #if check moved to C as those
macros aren't set in Fortran. (That's now https://gcc.gnu.org/PR108175 -
I thought that there was a PR before, but I couldn't find any.)

Additionally, on Windows the '.' directory is now opened - avoiding
issues with POSIX functions (and the requirement to use '#include
' etc.). - As OPEN already fails, there is no point in
checking for the rest.

On the non-Windows side, there is now a check that 'CLOSE' with
status='delete' indeed has deleted the directory.


Thoughts about which variant is better? Other suggestions or comments?

^- comments?

PS: On my x86-64 Linux, OPEN works but READ fails with EISDIR/errno == 21.


And thanks to Nightstrike for testing, suggestions and reporting the
issue at the first place.



On 19.12.22 10:09, Tobias Burnus wrote:

As discussed in #gfortran IRC, on Windows opening a directory fails
with EACCESS.
(It works under Cygwin - nightstrike was so kind to test this.)

Additionally, '[ -d dir ] || mkdir dir' is also not very portable.

Hence, I use an auxiliary C file calling the POSIX functions and
expect a fail for non-Cygwin windows.

Comments? Suggestions? - If there aren't any, I plan to commit it
as obvious tomorrow.


I don't have a strong preference for the one-file/'.'/smaller solutions
vs the two-file/mkdir/close-'delete' solution, but I am slightly
inclined to the the one that tests more.

Tobias

-
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas 
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht 
München, HRB 106955
gfortran.dg/read_dir.f90: Make PASS on Windows

On non-Cygwin Windows, use '.' and expect the documented fail when opening
a directory (EACCESS).  As gfortran does not set __WIN32__ this check is
done on the C side. (On __CYGWIN__, __WIN32__ is not set - but to make it
clear, !__CYGWIN__ is used in #if.)

On non-Windows, replace the 'call system' shell call by the POSIX functions
stat/mkdir/rmdir for better compatibility, especially on embedded systems;
additionally add some more checks. In particular, confirm that 'close' with
status='delete' indeed deleted the directory.

gcc/testsuite/ChangeLog:

	* gfortran.dg/read_dir-aux.c: New; provides my_mkdir, my_rmdir,
	my_verify_not_exists and expect_open_to_fail.
	* gfortran.dg/read_dir.f90: Call those; expect that opening a
	directory fails on Windows.

 gcc/testsuite/gfortran.dg/read_dir-aux.c | 68 
 gcc/testsuite/gfortran.dg/read_dir.f90   | 54 ++---
 2 files changed, 117 insertions(+), 5 deletions(-)

diff --git a/gcc/testsuite/gfortran.dg/read_dir-aux.c b/gcc/testsuite/gfortran.dg/read_dir-aux.c
new file mode 100644
index 000..307b44472af
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/read_dir-aux.c
@@ -0,0 +1,68 @@
+#if defined(__WIN32__) && !defined(__CYGWIN__)
+  /* Mostly skip on Windows, cf. main file why. */
+
+int expect_open_to_fail () { return 1; }
+
+void my_verify_not_exists (const char *dir) { }
+void my_mkdir (const char *dir) { }
+void my_rmdir (const char *dir) { }
+
+#else
+
+#include   /* For mkdir + permission bits.  */
+#include   /* For rmdir.  */
+#include   /* For errno.  */
+#include   /* For perror.  */
+#include   /* For abort.  */
+ 
+
+int expect_open_to_fail () { return 0; }
+
+void
+my_verify_not_exists (const char *dir)
+{
+  struct stat path_stat;
+  int err = stat (dir, &path_stat);
+  if (err && errno == ENOENT)
+return;  /* OK */
+  if (err)
+perror ("my_verify_not_exists");
+  else
+printf ("my_verify_not_exists: pathname %s still exists\n", dir);
+  abort ();
+ }
+
+void
+my_mkdir (const char *dir)
+{
+  int err;
+  struct stat path_stat;
+
+  /* Check whether 'dir' exists and is a directory.  */
+  err = stat (dir, &path_stat);
+  if (err && errno != ENOENT)
+{
+  perror ("my_mkdir: failed to call stat for directory");
+  abort ();
+}
+  if (err == 0 && !S_ISDIR (path_stat.st_mode))
+{
+  printf ("my_mkdir: pathname %s is not a directory\n", dir);
+  abort ();
+}
+
+  err = mkdir (dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+  if (err != 0)
+{
+  perror ("my_mkdir: failed to create directory");
+  abort ();
+}
+}
+
+void
+my_rmdir (const char *dir)
+{
+  rmdir (dir);
+}
+
+#endif  /* !defined(__WIN32__) || defined(__CYGWIN__) */
diff --g

Re: [committed] testsuite: Fix up pr107397.f90 test [PR107397]

2022-12-19 Thread Jerry D via Fortran

On 12/19/22 2:29 AM, Jakub Jelinek wrote:

On Sat, Dec 17, 2022 at 09:12:43AM -0800, Jerry D via Gcc-patches wrote:

The attached patch fixes a regression and is a patch from Steve.  I have
regression tested it and provided a test case.  It is fairly simple and I
will commit under the "simple" rule in a little while.

Thanks Steve for Patch. Thanks Harald for helping me get back up to speed on
the git magic.


The pr107397.f90 test FAILs for me, one problem was that the
added diagnostics has an indefinite article before BOZ, but
the test dg-error didn't.  The other problem was that on the
other dg-error there was no space between the string and closing
}, so it was completely ignored and the error was an excess
error.

2022-12-19  Jakub Jelinek  

PR fortran/107397
* gfortran.dg/pr107397.f90: Adjust expected diagnostic wording and
add space between dg-error string and closing }.

=== snip ===

Thanks Jakub.