On Sat, Aug 21, 2021 at 12:21:41AM +0200, Thomas Schwinge wrote: > Fix up for recent commit 0d973c0a0d90a0a302e7eda1a4d9709be3c5b102 > "openmp: Implement the error directive". > --- > libgomp/config/nvptx/error.c | 32 +++++++++++++++++-- > .../testsuite/libgomp.c-c++-common/error-1.c | 10 ++++++ > libgomp/testsuite/libgomp.fortran/error-1.f90 | 9 ++++++ > 3 files changed, 48 insertions(+), 3 deletions(-)
As we only use it with size equal to literal 1, I guess it is ok that way, otherwise it would be nice to at least precompute size * nmemb just once instead of every iteration. Ok. > diff --git a/libgomp/config/nvptx/error.c b/libgomp/config/nvptx/error.c > index dfa75da354f..c55791e34b4 100644 > --- a/libgomp/config/nvptx/error.c > +++ b/libgomp/config/nvptx/error.c > @@ -31,12 +31,38 @@ > #include <stdio.h> > #include <stdlib.h> > > -#undef vfprintf > -#undef fputs > -#undef fputc > > +/* No 'FILE *stream's, just basic 'vprintf' etc. */ > + > +#undef vfprintf > #define vfprintf(stream, fmt, list) vprintf (fmt, list) > + > +#undef fputs > #define fputs(s, stream) printf ("%s", s) > + > +#undef fputc > #define fputc(c, stream) printf ("%c", c) > > +#undef fwrite > +#if 0 > +# define fwrite(ptr, size, nmemb, stream) \ > + printf ("%.*s", (int) (size * nmemb), (int) (size * nmemb), ptr) > +/* ... prints literal '%.*s'. */ > +#else > +# define fwrite(ptr, size, nmemb, stream) \ > + do { \ > + /* Yuck! */ \ > + for (size_t i = 0; i < size * nmemb; ++i) \ > + printf ("%c", ptr[i]); \ > + } while (0) > +#endif > + > + > +/* The 'exit (EXIT_FAILURE);' of an Fortran (only, huh?) OpenMP 'error' > + directive with 'severity (fatal)' causes a hang, so 'abort' instead of > + 'exit'. */ > +#undef exit > +#define exit(status) abort () > + > + > #include "../../error.c" > diff --git a/libgomp/testsuite/libgomp.c-c++-common/error-1.c > b/libgomp/testsuite/libgomp.c-c++-common/error-1.c > index 5f454c1adaa..04c0519bf63 100644 > --- a/libgomp/testsuite/libgomp.c-c++-common/error-1.c > +++ b/libgomp/testsuite/libgomp.c-c++-common/error-1.c > @@ -34,11 +34,20 @@ foo (int i, int x) > int > main () > { > + /* Initialize offloading early, so that any output this may produce doesn't > + disturb the 'dg-output' scanning below. */ > + #pragma omp target > + ; > + > if (foo (5, 0) != 13 || foo (6, 1) != 17) > abort (); > #pragma omp error at (execution) severity (warning) > const char *msg = "my message" + 2; > #pragma omp error at (execution) severity (warning) message (msg + 1) > + #pragma omp target > + { > + #pragma omp error at (execution) severity (warning) message ("hello from > a distance") > + } > #pragma omp error at (execution) severity (fatal) message (msg - 2) > #pragma omp error at (execution) severity (warning) message ("foobar") > return 0; > @@ -46,4 +55,5 @@ main () > > /* { dg-output "libgomp: error directive > encountered(\n|\r|\n\r)(\n|\r|\n\r)" } */ > /* { dg-output "libgomp: error directive encountered: > message(\n|\r|\n\r)(\n|\r|\n\r)" } */ > +/* { dg-output "libgomp: error directive encountered: hello from a > distance(\n|\r|\n\r)(\n|\r|\n\r)" } */ > /* { dg-output "libgomp: fatal error: error directive encountered: my > message" } */ > diff --git a/libgomp/testsuite/libgomp.fortran/error-1.f90 > b/libgomp/testsuite/libgomp.fortran/error-1.f90 > index 92c246cfcaf..7c497fd002e 100644 > --- a/libgomp/testsuite/libgomp.fortran/error-1.f90 > +++ b/libgomp/testsuite/libgomp.fortran/error-1.f90 > @@ -37,6 +37,11 @@ program main > character(len=13) :: msg > character(len=:), allocatable :: msg2, msg3 > > + ! Initialize offloading early, so that any output this may produce doesn't > + ! disturb the 'dg-output' scanning below. > + !$omp target > + !$omp end target > + > msg = "my message" > if (foo (5, 0) /= 15 .or. foo (7, 1) /= 16) & > stop 1 > @@ -47,6 +52,9 @@ program main > !$omp error at (execution) severity (warning) > !$omp error at (execution) severity (warning) message(trim(msg(4:))) > !$omp error at (execution) severity (warning) message ("Farewell") > + !$omp target > + !$omp error at (execution) severity (warning) message ("ffrom a > distanceee"(2:16)) > + !$omp end target > !$omp error at (execution) severity (warning) message (msg2) > !$omp error at (execution) severity (warning) message (msg(4:6)) > !$omp error at (execution) severity (fatal) message (msg) > @@ -73,6 +81,7 @@ end > ! { dg-output "libgomp: error directive encountered(\n|\r|\n\r)(\n|\r|\n\r)" > } > ! { dg-output "libgomp: error directive encountered: > message(\n|\r|\n\r)(\n|\r|\n\r)" } > ! { dg-output "libgomp: error directive encountered: > Farewell(\n|\r|\n\r)(\n|\r|\n\r)" } > +! { dg-output "libgomp: error directive encountered: from a > distance(\n|\r|\n\r)(\n|\r|\n\r)" } > ! { dg-output "libgomp: error directive encountered: Hello > World(\n|\r|\n\r)(\n|\r|\n\r)" } > ! { dg-output "libgomp: error directive encountered: > mes(\n|\r|\n\r)(\n|\r|\n\r)" } > ! { dg-output "libgomp: fatal error: error directive encountered: my message > (\n|\r|\n\r)" } Jakub