[Flang] Ported test_errors.sh to Python

To enable Flang testing on Windows, shell scripts have to be ported to Python. In this patch the "test_errors.sh" script is ported to python ("test_errors.py"). The RUN line of existing tests was changed to make use of the python script.

Used python regex in place of awk/sed.

Reviewed By: Meinersbur

Differential Revision: https://reviews.llvm.org/D107575

GitOrigin-RevId: 6c1ac141d3c98af9738bc77fcb55602cbff7751f
diff --git a/test/Semantics/OpenACC/acc-atomic-validity.f90 b/test/Semantics/OpenACC/acc-atomic-validity.f90
index 8ebac44..e6d82a7 100644
--- a/test/Semantics/OpenACC/acc-atomic-validity.f90
+++ b/test/Semantics/OpenACC/acc-atomic-validity.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.12 Atomic
diff --git a/test/Semantics/OpenACC/acc-branch.f90 b/test/Semantics/OpenACC/acc-branch.f90
index b9ca12b..06c3b4d 100644
--- a/test/Semantics/OpenACC/acc-branch.f90
+++ b/test/Semantics/OpenACC/acc-branch.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC restruction in branch in and out of some construct
 !
diff --git a/test/Semantics/OpenACC/acc-cache-validity.f90 b/test/Semantics/OpenACC/acc-cache-validity.f90
index 30c68ef..9afdd6d 100644
--- a/test/Semantics/OpenACC/acc-cache-validity.f90
+++ b/test/Semantics/OpenACC/acc-cache-validity.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.10 Cache
diff --git a/test/Semantics/OpenACC/acc-canonicalization-validity.f90 b/test/Semantics/OpenACC/acc-canonicalization-validity.f90
index bc20aed..ad179d3 100644
--- a/test/Semantics/OpenACC/acc-canonicalization-validity.f90
+++ b/test/Semantics/OpenACC/acc-canonicalization-validity.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC canonalization validity for the construct defined below:
 !   2.9 Loop
diff --git a/test/Semantics/OpenACC/acc-data.f90 b/test/Semantics/OpenACC/acc-data.f90
index 6aa99e7..24c67ee 100644
--- a/test/Semantics/OpenACC/acc-data.f90
+++ b/test/Semantics/OpenACC/acc-data.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.6.5 Data
diff --git a/test/Semantics/OpenACC/acc-declare-validity.f90 b/test/Semantics/OpenACC/acc-declare-validity.f90
index fea97ec..5578d9a 100644
--- a/test/Semantics/OpenACC/acc-declare-validity.f90
+++ b/test/Semantics/OpenACC/acc-declare-validity.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.13 Declare
diff --git a/test/Semantics/OpenACC/acc-host-data.f90 b/test/Semantics/OpenACC/acc-host-data.f90
index 877f002..4e91677 100644
--- a/test/Semantics/OpenACC/acc-host-data.f90
+++ b/test/Semantics/OpenACC/acc-host-data.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.8 host_data
diff --git a/test/Semantics/OpenACC/acc-init-validity.f90 b/test/Semantics/OpenACC/acc-init-validity.f90
index 2b2eac5..2782114 100644
--- a/test/Semantics/OpenACC/acc-init-validity.f90
+++ b/test/Semantics/OpenACC/acc-init-validity.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.14.1 Init
diff --git a/test/Semantics/OpenACC/acc-kernels-loop.f90 b/test/Semantics/OpenACC/acc-kernels-loop.f90
index 5b3b9c2..d84e1c2 100644
--- a/test/Semantics/OpenACC/acc-kernels-loop.f90
+++ b/test/Semantics/OpenACC/acc-kernels-loop.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.11 Kernels Loop
diff --git a/test/Semantics/OpenACC/acc-kernels.f90 b/test/Semantics/OpenACC/acc-kernels.f90
index ccb128a..a2c9c9e 100644
--- a/test/Semantics/OpenACC/acc-kernels.f90
+++ b/test/Semantics/OpenACC/acc-kernels.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.5.3 Kernels
diff --git a/test/Semantics/OpenACC/acc-loop.f90 b/test/Semantics/OpenACC/acc-loop.f90
index 2cd7175..75e0995 100644
--- a/test/Semantics/OpenACC/acc-loop.f90
+++ b/test/Semantics/OpenACC/acc-loop.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.9 Loop
diff --git a/test/Semantics/OpenACC/acc-parallel-loop-validity.f90 b/test/Semantics/OpenACC/acc-parallel-loop-validity.f90
index 3dee147..312baac 100644
--- a/test/Semantics/OpenACC/acc-parallel-loop-validity.f90
+++ b/test/Semantics/OpenACC/acc-parallel-loop-validity.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.11 Parallel Loop
diff --git a/test/Semantics/OpenACC/acc-parallel.f90 b/test/Semantics/OpenACC/acc-parallel.f90
index 75fb14f..758e1a5 100644
--- a/test/Semantics/OpenACC/acc-parallel.f90
+++ b/test/Semantics/OpenACC/acc-parallel.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.5.1 Parallel
diff --git a/test/Semantics/OpenACC/acc-resolve01.f90 b/test/Semantics/OpenACC/acc-resolve01.f90
index c55e02e..4d85c26 100644
--- a/test/Semantics/OpenACC/acc-resolve01.f90
+++ b/test/Semantics/OpenACC/acc-resolve01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Data-Mapping Attribute Clauses
 ! 2.15.14 default Clause
diff --git a/test/Semantics/OpenACC/acc-resolve02.f90 b/test/Semantics/OpenACC/acc-resolve02.f90
index b4df4d1..861cb26 100644
--- a/test/Semantics/OpenACC/acc-resolve02.f90
+++ b/test/Semantics/OpenACC/acc-resolve02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 subroutine compute()
   integer :: a(3), c, i
diff --git a/test/Semantics/OpenACC/acc-routine-validity.f90 b/test/Semantics/OpenACC/acc-routine-validity.f90
index 18d90ec..83583fc 100644
--- a/test/Semantics/OpenACC/acc-routine-validity.f90
+++ b/test/Semantics/OpenACC/acc-routine-validity.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.15.1 routine
diff --git a/test/Semantics/OpenACC/acc-serial-loop.f90 b/test/Semantics/OpenACC/acc-serial-loop.f90
index c088bf8..b0e04dd 100644
--- a/test/Semantics/OpenACC/acc-serial-loop.f90
+++ b/test/Semantics/OpenACC/acc-serial-loop.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.11 Serial Loop
diff --git a/test/Semantics/OpenACC/acc-serial.f90 b/test/Semantics/OpenACC/acc-serial.f90
index 2f206f5..a052ef4 100644
--- a/test/Semantics/OpenACC/acc-serial.f90
+++ b/test/Semantics/OpenACC/acc-serial.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.5.2 Serial
diff --git a/test/Semantics/OpenACC/acc-set-validity.f90 b/test/Semantics/OpenACC/acc-set-validity.f90
index 4bc342e..f914e25 100644
--- a/test/Semantics/OpenACC/acc-set-validity.f90
+++ b/test/Semantics/OpenACC/acc-set-validity.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.14.3 Set
diff --git a/test/Semantics/OpenACC/acc-shutdown-validity.f90 b/test/Semantics/OpenACC/acc-shutdown-validity.f90
index 31fa3c9..de40963 100644
--- a/test/Semantics/OpenACC/acc-shutdown-validity.f90
+++ b/test/Semantics/OpenACC/acc-shutdown-validity.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.14.2 Shutdown
diff --git a/test/Semantics/OpenACC/acc-update-validity.f90 b/test/Semantics/OpenACC/acc-update-validity.f90
index fbf90fb..6563ef9 100644
--- a/test/Semantics/OpenACC/acc-update-validity.f90
+++ b/test/Semantics/OpenACC/acc-update-validity.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.14.4 Update
diff --git a/test/Semantics/OpenACC/acc-wait-validity.f90 b/test/Semantics/OpenACC/acc-wait-validity.f90
index c33bcbd..25d603d 100644
--- a/test/Semantics/OpenACC/acc-wait-validity.f90
+++ b/test/Semantics/OpenACC/acc-wait-validity.f90
@@ -1,5 +1,4 @@
-! RUN: %S/../test_errors.sh %s %t %flang -fopenacc
-! REQUIRES: shell
+! RUN: %python %S/../test_errors.py %s %flang -fopenacc
 
 ! Check OpenACC clause validity for the following construct and directive:
 !   2.16.13 Wait
diff --git a/test/Semantics/allocate01.f90 b/test/Semantics/allocate01.f90
index 257c875..a66e246 100644
--- a/test/Semantics/allocate01.f90
+++ b/test/Semantics/allocate01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 ! Creating a symbol that allocate should accept
diff --git a/test/Semantics/allocate02.f90 b/test/Semantics/allocate02.f90
index 9cf9e88..25d34cc 100644
--- a/test/Semantics/allocate02.f90
+++ b/test/Semantics/allocate02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! Check for semantic errors in ALLOCATE statements
 
diff --git a/test/Semantics/allocate03.f90 b/test/Semantics/allocate03.f90
index c119ac6..f7cad58 100644
--- a/test/Semantics/allocate03.f90
+++ b/test/Semantics/allocate03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 subroutine C933_a(b1, ca3, ca4, cp3, cp3mold, cp4, cp7, cp8, bsrc)
diff --git a/test/Semantics/allocate04.f90 b/test/Semantics/allocate04.f90
index b881b84..bcccdca 100644
--- a/test/Semantics/allocate04.f90
+++ b/test/Semantics/allocate04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 
diff --git a/test/Semantics/allocate05.f90 b/test/Semantics/allocate05.f90
index b33f316..eca6c9a 100644
--- a/test/Semantics/allocate05.f90
+++ b/test/Semantics/allocate05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 
diff --git a/test/Semantics/allocate06.f90 b/test/Semantics/allocate06.f90
index 864f17a..a1ae51d 100644
--- a/test/Semantics/allocate06.f90
+++ b/test/Semantics/allocate06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 
diff --git a/test/Semantics/allocate07.f90 b/test/Semantics/allocate07.f90
index a948765..8ebdbaa 100644
--- a/test/Semantics/allocate07.f90
+++ b/test/Semantics/allocate07.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 subroutine C936(param_ca_4_assumed, param_ta_4_assumed, param_ca_4_deferred)
diff --git a/test/Semantics/allocate08.f90 b/test/Semantics/allocate08.f90
index 9223b14..cc074a1 100644
--- a/test/Semantics/allocate08.f90
+++ b/test/Semantics/allocate08.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 subroutine C945_a(srca, srcb, srcc, src_complex, src_logical, &
diff --git a/test/Semantics/allocate09.f90 b/test/Semantics/allocate09.f90
index 03531a1..f235cab 100644
--- a/test/Semantics/allocate09.f90
+++ b/test/Semantics/allocate09.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 subroutine C946(param_ca_4_assumed, param_ta_4_assumed, param_ca_4_deferred)
diff --git a/test/Semantics/allocate10.f90 b/test/Semantics/allocate10.f90
index 05c73ce..5f7a1e5 100644
--- a/test/Semantics/allocate10.f90
+++ b/test/Semantics/allocate10.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 !TODO: mixing expr and source-expr?
diff --git a/test/Semantics/allocate11.f90 b/test/Semantics/allocate11.f90
index b07b7a1..960d45f 100644
--- a/test/Semantics/allocate11.f90
+++ b/test/Semantics/allocate11.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 ! TODO: Function Pointer in allocate and derived types!
diff --git a/test/Semantics/allocate12.f90 b/test/Semantics/allocate12.f90
index 9504142..ecc28d8 100644
--- a/test/Semantics/allocate12.f90
+++ b/test/Semantics/allocate12.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 subroutine C941_C942b_C950(xsrc, x1, a2, b2, cx1, ca2, cb1, cb2, c1, c2)
diff --git a/test/Semantics/allocate13.f90 b/test/Semantics/allocate13.f90
index c939d19..fe23c57 100644
--- a/test/Semantics/allocate13.f90
+++ b/test/Semantics/allocate13.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in ALLOCATE statements
 
 module not_iso_fortran_env
diff --git a/test/Semantics/altreturn01.f90 b/test/Semantics/altreturn01.f90
index 7257eb1..85a133d 100644
--- a/test/Semantics/altreturn01.f90
+++ b/test/Semantics/altreturn01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check calls with alt returns
 
        CALL TEST (N, *100, *200 )
diff --git a/test/Semantics/altreturn02.f90 b/test/Semantics/altreturn02.f90
index ad7a4f8..a142871 100644
--- a/test/Semantics/altreturn02.f90
+++ b/test/Semantics/altreturn02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check subroutine with alt return
 
        SUBROUTINE TEST (N, *, *)
diff --git a/test/Semantics/altreturn03.f90 b/test/Semantics/altreturn03.f90
index 703d22b..fdf3f24 100644
--- a/test/Semantics/altreturn03.f90
+++ b/test/Semantics/altreturn03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for various alt return error conditions
 
        SUBROUTINE TEST (N, *, *)
diff --git a/test/Semantics/altreturn04.f90 b/test/Semantics/altreturn04.f90
index 116c90a..9285bb7 100644
--- a/test/Semantics/altreturn04.f90
+++ b/test/Semantics/altreturn04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Functions cannot use alt return
 
 REAL FUNCTION altreturn01(X)
diff --git a/test/Semantics/altreturn05.f90 b/test/Semantics/altreturn05.f90
index ad4f101..e61827f 100644
--- a/test/Semantics/altreturn05.f90
+++ b/test/Semantics/altreturn05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test extension: RETURN from main program
 
 return !ok
diff --git a/test/Semantics/altreturn06.f90 b/test/Semantics/altreturn06.f90
index 4b5b606..5be40e8 100644
--- a/test/Semantics/altreturn06.f90
+++ b/test/Semantics/altreturn06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test alternat return argument passing for internal and external subprograms
 ! Both of the following are OK
   call extSubprogram (*100)
diff --git a/test/Semantics/array-constr-big.f90 b/test/Semantics/array-constr-big.f90
index 0f44aa1..2b45edb 100644
--- a/test/Semantics/array-constr-big.f90
+++ b/test/Semantics/array-constr-big.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Ensure that evaluating a very large array constructor does not crash the
 ! compiler
 program BigArray
diff --git a/test/Semantics/array-constr-values.f90 b/test/Semantics/array-constr-values.f90
index 09f8bc3..c814da2 100644
--- a/test/Semantics/array-constr-values.f90
+++ b/test/Semantics/array-constr-values.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Confirm enforcement of constraints and restrictions in 7.8
 ! C7110, C7111, C7112, C7113, C7114, C7115
 
diff --git a/test/Semantics/assign01.f90 b/test/Semantics/assign01.f90
index 9d47a01..351fecf 100644
--- a/test/Semantics/assign01.f90
+++ b/test/Semantics/assign01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! 10.2.3.1(2) All masks and LHS of assignments in a WHERE must conform
 
 subroutine s1
diff --git a/test/Semantics/assign02.f90 b/test/Semantics/assign02.f90
index 76faa6f..6e65d90 100644
--- a/test/Semantics/assign02.f90
+++ b/test/Semantics/assign02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Pointer assignment constraints 10.2.2.2
 
 module m1
diff --git a/test/Semantics/assign03.f90 b/test/Semantics/assign03.f90
index 830f17c..8e502f3 100644
--- a/test/Semantics/assign03.f90
+++ b/test/Semantics/assign03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Pointer assignment constraints 10.2.2.2 (see also assign02.f90)
 
 module m
diff --git a/test/Semantics/assign04.f90 b/test/Semantics/assign04.f90
index acc5ac8..daf3d54 100644
--- a/test/Semantics/assign04.f90
+++ b/test/Semantics/assign04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! 9.4.5
 subroutine s1
   type :: t(k, l)
diff --git a/test/Semantics/assign06.f90 b/test/Semantics/assign06.f90
index 406bf20..4e65a77 100644
--- a/test/Semantics/assign06.f90
+++ b/test/Semantics/assign06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test ASSIGN statement, assigned GOTO, and assigned format labels
 ! (see subclause 8.2.4 in Fortran 90 (*not* 2018!)
 
diff --git a/test/Semantics/assign07.f90 b/test/Semantics/assign07.f90
index 980e4b6..41a99c1 100644
--- a/test/Semantics/assign07.f90
+++ b/test/Semantics/assign07.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test ASSIGN statement, assigned GOTO, and assigned format labels
 ! (see subclause 8.2.4 in Fortran 90 (*not* 2018!)
 
diff --git a/test/Semantics/associated.f90 b/test/Semantics/associated.f90
index 294035d..509aa2d 100644
--- a/test/Semantics/associated.f90
+++ b/test/Semantics/associated.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests for the ASSOCIATED() and NULL() intrinsics
 subroutine assoc()
 
diff --git a/test/Semantics/bad-forward-type.f90 b/test/Semantics/bad-forward-type.f90
index 875ef95..f7230d1 100644
--- a/test/Semantics/bad-forward-type.f90
+++ b/test/Semantics/bad-forward-type.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Forward references to derived types (error cases)
 ! C732 A parent-type-name shall be the name of a previously defined
 ! extensible type (7.5.7).
diff --git a/test/Semantics/bind-c01.f90 b/test/Semantics/bind-c01.f90
index 36726ce..2a35364 100644
--- a/test/Semantics/bind-c01.f90
+++ b/test/Semantics/bind-c01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for multiple symbols being defined with with same BIND(C) name
 
 module m1
diff --git a/test/Semantics/bindings01.f90 b/test/Semantics/bindings01.f90
index fece75a..75c3544 100644
--- a/test/Semantics/bindings01.f90
+++ b/test/Semantics/bindings01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Confirm enforcement of constraints and restrictions in 7.5.7.3
 ! and C733, C734 and C779, C780, C782, C783, C784, and C785.
 
diff --git a/test/Semantics/block-data01.f90 b/test/Semantics/block-data01.f90
index 0a775d3..5f69aa6 100644
--- a/test/Semantics/block-data01.f90
+++ b/test/Semantics/block-data01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test BLOCK DATA subprogram (14.3)
 block data foo
   !ERROR: IMPORT is not allowed in a BLOCK DATA subprogram
diff --git a/test/Semantics/blockconstruct01.f90 b/test/Semantics/blockconstruct01.f90
index a3759d2..f6e9a78 100644
--- a/test/Semantics/blockconstruct01.f90
+++ b/test/Semantics/blockconstruct01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1107 -- COMMON, EQUIVALENCE, INTENT, NAMELIST, OPTIONAL, VALUE or
 !          STATEMENT FUNCTIONS not allow in specification part
 
diff --git a/test/Semantics/blockconstruct02.f90 b/test/Semantics/blockconstruct02.f90
index cffff31..b748b0a 100644
--- a/test/Semantics/blockconstruct02.f90
+++ b/test/Semantics/blockconstruct02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1108  --  Save statement in a BLOCK construct shall not conatin a
 !            saved-entity-list that does not specify a common-block-name
 
diff --git a/test/Semantics/blockconstruct03.f90 b/test/Semantics/blockconstruct03.f90
index 8418750..75ffcad 100644
--- a/test/Semantics/blockconstruct03.f90
+++ b/test/Semantics/blockconstruct03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests implemented for this standard:
 !            Block Construct
 ! C1109
diff --git a/test/Semantics/boz-literal-constants.f90 b/test/Semantics/boz-literal-constants.f90
index e7dae86..a0db6fa 100644
--- a/test/Semantics/boz-literal-constants.f90
+++ b/test/Semantics/boz-literal-constants.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Confirm enforcement of constraints and restrictions in 7.7
 ! C7107, C7108, C7109
 
diff --git a/test/Semantics/c_f_pointer.f90 b/test/Semantics/c_f_pointer.f90
index 2e7bc90..4a385f1 100644
--- a/test/Semantics/c_f_pointer.f90
+++ b/test/Semantics/c_f_pointer.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Enforce 18.2.3.3
 
 program test
diff --git a/test/Semantics/call01.f90 b/test/Semantics/call01.f90
index 5d6efe8..d75b72a 100644
--- a/test/Semantics/call01.f90
+++ b/test/Semantics/call01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Confirm enforcement of constraints and restrictions in 15.6.2.1
 
 non_recursive function f01(n) result(res)
diff --git a/test/Semantics/call02.f90 b/test/Semantics/call02.f90
index bc0ee97..84bb286 100644
--- a/test/Semantics/call02.f90
+++ b/test/Semantics/call02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! 15.5.1 procedure reference constraints and restrictions
 
 subroutine s01(elem, subr)
diff --git a/test/Semantics/call03.f90 b/test/Semantics/call03.f90
index db2e236..e89bce7 100644
--- a/test/Semantics/call03.f90
+++ b/test/Semantics/call03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 15.5.2.4 constraints and restrictions for non-POINTER non-ALLOCATABLE
 ! dummy arguments.
 
diff --git a/test/Semantics/call04.f90 b/test/Semantics/call04.f90
index eb4f78f..6877f9c 100644
--- a/test/Semantics/call04.f90
+++ b/test/Semantics/call04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 8.5.10 & 8.5.18 constraints on dummy argument declarations
 
 module m
diff --git a/test/Semantics/call05.f90 b/test/Semantics/call05.f90
index ad51219..0aadb6a 100644
--- a/test/Semantics/call05.f90
+++ b/test/Semantics/call05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 15.5.2.5 constraints and restrictions for POINTER & ALLOCATABLE
 ! arguments when both sides of the call have the same attributes.
 
diff --git a/test/Semantics/call06.f90 b/test/Semantics/call06.f90
index 5e2728f..1f4b17f 100644
--- a/test/Semantics/call06.f90
+++ b/test/Semantics/call06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 15.5.2.6 constraints and restrictions for ALLOCATABLE
 ! dummy arguments.
 
diff --git a/test/Semantics/call07.f90 b/test/Semantics/call07.f90
index 444331f..db5e0a6 100644
--- a/test/Semantics/call07.f90
+++ b/test/Semantics/call07.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 15.5.2.7 constraints and restrictions for POINTER dummy arguments.
 
 module m
diff --git a/test/Semantics/call08.f90 b/test/Semantics/call08.f90
index 5da55d4..f4c690e 100644
--- a/test/Semantics/call08.f90
+++ b/test/Semantics/call08.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 15.5.2.8 coarray dummy arguments
 
 module m
diff --git a/test/Semantics/call09.f90 b/test/Semantics/call09.f90
index c339829..2359168 100644
--- a/test/Semantics/call09.f90
+++ b/test/Semantics/call09.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 15.5.2.9(2,3,5) dummy procedure requirements
 ! C843
 !   An entity with the INTENT attribute shall be a dummy data object or a 
diff --git a/test/Semantics/call10.f90 b/test/Semantics/call10.f90
index 2ef3a5a..deb6e37 100644
--- a/test/Semantics/call10.f90
+++ b/test/Semantics/call10.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 15.7 (C1583-C1590, C1592-C1599) constraints and restrictions
 ! for pure procedures.
 ! (C1591 is tested in call11.f90; C1594 in call12.f90.)
diff --git a/test/Semantics/call11.f90 b/test/Semantics/call11.f90
index 086537f..4307571 100644
--- a/test/Semantics/call11.f90
+++ b/test/Semantics/call11.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 15.7 C1591 & others: contexts requiring pure subprograms
 
 module m
diff --git a/test/Semantics/call12.f90 b/test/Semantics/call12.f90
index 8838366..4780a95 100644
--- a/test/Semantics/call12.f90
+++ b/test/Semantics/call12.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 15.7 C1594 - prohibited assignments in pure subprograms
 
 module used
diff --git a/test/Semantics/call13.f90 b/test/Semantics/call13.f90
index 47786fa..a5ef1ca 100644
--- a/test/Semantics/call13.f90
+++ b/test/Semantics/call13.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 15.4.2.2 constraints and restrictions for calls to implicit
 ! interfaces
 
diff --git a/test/Semantics/call14.f90 b/test/Semantics/call14.f90
index 2bf5d53..477c22b 100644
--- a/test/Semantics/call14.f90
+++ b/test/Semantics/call14.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test 8.5.18 constraints on the VALUE attribute
 
 module m
diff --git a/test/Semantics/call15.f90 b/test/Semantics/call15.f90
index c236ef0..842103b 100644
--- a/test/Semantics/call15.f90
+++ b/test/Semantics/call15.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C711 An assumed-type actual argument that corresponds to an assumed-rank 
 ! dummy argument shall be assumed-shape or assumed-rank.
 subroutine s(arg1, arg2, arg3)
diff --git a/test/Semantics/call16.f90 b/test/Semantics/call16.f90
index 12cab97..37e82b1 100644
--- a/test/Semantics/call16.f90
+++ b/test/Semantics/call16.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! Test that intrinsic functions used as subroutines and vice versa are caught.
 
diff --git a/test/Semantics/call18.f90 b/test/Semantics/call18.f90
index ae10ea9..fb5895f 100644
--- a/test/Semantics/call18.f90
+++ b/test/Semantics/call18.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Ensure that references to functions that return pointers can serve as
 ! "variables" in actual arguments.  All of these uses are conforming and
 ! no errors should be reported.
diff --git a/test/Semantics/call19.f90 b/test/Semantics/call19.f90
index d102eb6..753ff95 100644
--- a/test/Semantics/call19.f90
+++ b/test/Semantics/call19.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Ensures that things that aren't procedures aren't allowed to be called.
 module m
   integer :: i
diff --git a/test/Semantics/call20.f90 b/test/Semantics/call20.f90
index 2ce7b1c..91ce2bf 100644
--- a/test/Semantics/call20.f90
+++ b/test/Semantics/call20.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! Test that the interface of specific intrinsics passed as dummy arguments
 ! are correctly validated against actual arguments explicit interface.
diff --git a/test/Semantics/case01.f90 b/test/Semantics/case01.f90
index e863b71..42eb07d 100644
--- a/test/Semantics/case01.f90
+++ b/test/Semantics/case01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test SELECT CASE Constraints: C1145, C1146, C1147, C1148, C1149
 program selectCaseProg
    implicit none
diff --git a/test/Semantics/coarrays01.f90 b/test/Semantics/coarrays01.f90
index b074c9b..0a6f88a 100644
--- a/test/Semantics/coarrays01.f90
+++ b/test/Semantics/coarrays01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test selector and team-value in CHANGE TEAM statement
 
 ! OK
diff --git a/test/Semantics/complex01.f90 b/test/Semantics/complex01.f90
index cf7fd9c..f28ffe1 100644
--- a/test/Semantics/complex01.f90
+++ b/test/Semantics/complex01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C718 Each named constant in a complex literal constant shall be of type 
 ! integer or real.
 subroutine s()
diff --git a/test/Semantics/computed-goto01.f90 b/test/Semantics/computed-goto01.f90
index 321d6a1..4eb00df 100644
--- a/test/Semantics/computed-goto01.f90
+++ b/test/Semantics/computed-goto01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check that a basic computed goto compiles
 
 INTEGER, DIMENSION (2) :: B
diff --git a/test/Semantics/computed-goto02.f90 b/test/Semantics/computed-goto02.f90
index a51e536..f613404 100644
--- a/test/Semantics/computed-goto02.f90
+++ b/test/Semantics/computed-goto02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check that computed goto express must be a scalar integer expression
 ! TODO: PGI, for example, accepts a float & converts the value to int.
 
diff --git a/test/Semantics/critical01.f90 b/test/Semantics/critical01.f90
index 90e8a6e..5981a65 100644
--- a/test/Semantics/critical01.f90
+++ b/test/Semantics/critical01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 !C1117
 
 subroutine test1(a, i)
diff --git a/test/Semantics/critical02.f90 b/test/Semantics/critical02.f90
index f7822b7..10581f9 100644
--- a/test/Semantics/critical02.f90
+++ b/test/Semantics/critical02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 !C1118
 
 subroutine test1
diff --git a/test/Semantics/critical03.f90 b/test/Semantics/critical03.f90
index 0683a84..26b4a9f 100644
--- a/test/Semantics/critical03.f90
+++ b/test/Semantics/critical03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 !C1119
 
 subroutine test1(a, i)
diff --git a/test/Semantics/data01.f90 b/test/Semantics/data01.f90
index 635e7c5..f8c8d37 100644
--- a/test/Semantics/data01.f90
+++ b/test/Semantics/data01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 !Test for checking data constraints, C882-C887
 module m1
   type person
diff --git a/test/Semantics/data02.f90 b/test/Semantics/data02.f90
index eb4d801..11235a7 100644
--- a/test/Semantics/data02.f90
+++ b/test/Semantics/data02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check that expressions are analyzed in data statements
 
 subroutine s1
diff --git a/test/Semantics/data03.f90 b/test/Semantics/data03.f90
index e4ad995..b3ed338 100644
--- a/test/Semantics/data03.f90
+++ b/test/Semantics/data03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 !Testing data constraints : C874 - C875, C878 - C881 
 module m
     integer, target :: modarray(1)
diff --git a/test/Semantics/data04.f90 b/test/Semantics/data04.f90
index d69c8d3..5d862b2 100644
--- a/test/Semantics/data04.f90
+++ b/test/Semantics/data04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 !Testing data constraints : C876, C877
 module m
   integer :: first
diff --git a/test/Semantics/data06.f90 b/test/Semantics/data06.f90
index 953da87..b8dfdb3 100644
--- a/test/Semantics/data06.f90
+++ b/test/Semantics/data06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! DATA statement errors
 subroutine s1
   type :: t1
diff --git a/test/Semantics/data07.f90 b/test/Semantics/data07.f90
index 0bf08a9..ddb1f8b 100644
--- a/test/Semantics/data07.f90
+++ b/test/Semantics/data07.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
  contains
   subroutine s1
diff --git a/test/Semantics/data10.f90 b/test/Semantics/data10.f90
index af541fc..a46465c 100644
--- a/test/Semantics/data10.f90
+++ b/test/Semantics/data10.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 type :: t
   integer :: n
 end type
diff --git a/test/Semantics/data12.f90 b/test/Semantics/data12.f90
index 0ceba17..fa6120c 100644
--- a/test/Semantics/data12.f90
+++ b/test/Semantics/data12.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 type :: t1
   sequence
   integer :: m = 123
diff --git a/test/Semantics/deallocate01.f90 b/test/Semantics/deallocate01.f90
index 95fe128..88c29d0 100644
--- a/test/Semantics/deallocate01.f90
+++ b/test/Semantics/deallocate01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test that DEALLOCATE works
 
 INTEGER, PARAMETER :: maxvalue=1024
diff --git a/test/Semantics/deallocate04.f90 b/test/Semantics/deallocate04.f90
index 43786df..32ead58 100644
--- a/test/Semantics/deallocate04.f90
+++ b/test/Semantics/deallocate04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for type errors in DEALLOCATE statements
 
 INTEGER, PARAMETER :: maxvalue=1024
diff --git a/test/Semantics/deallocate05.f90 b/test/Semantics/deallocate05.f90
index e065f07..0363a1f 100644
--- a/test/Semantics/deallocate05.f90
+++ b/test/Semantics/deallocate05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in DEALLOCATE statements
 
 Module share
diff --git a/test/Semantics/deallocate06.f90 b/test/Semantics/deallocate06.f90
index 360091e..16ae9f9 100644
--- a/test/Semantics/deallocate06.f90
+++ b/test/Semantics/deallocate06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! Test deallocate of use- and host-associated variables
 module m1
diff --git a/test/Semantics/doconcurrent01.f90 b/test/Semantics/doconcurrent01.f90
index 67294fc..84297fb 100644
--- a/test/Semantics/doconcurrent01.f90
+++ b/test/Semantics/doconcurrent01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1141
 ! A reference to the procedure IEEE_SET_HALTING_MODE ! from the intrinsic 
 ! module IEEE_EXCEPTIONS, shall not ! appear within a DO CONCURRENT construct.
diff --git a/test/Semantics/doconcurrent05.f90 b/test/Semantics/doconcurrent05.f90
index c8961ab..a826e06 100644
--- a/test/Semantics/doconcurrent05.f90
+++ b/test/Semantics/doconcurrent05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1167 -- An exit-stmt shall not appear within a DO CONCURRENT construct if 
 ! it belongs to that construct or an outer construct.
 
diff --git a/test/Semantics/doconcurrent06.f90 b/test/Semantics/doconcurrent06.f90
index 0a990a5..917554d 100644
--- a/test/Semantics/doconcurrent06.f90
+++ b/test/Semantics/doconcurrent06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1167 -- An exit-stmt shall not appear within a DO CONCURRENT construct if 
 ! it belongs to that construct or an outer construct.
 
diff --git a/test/Semantics/doconcurrent08.f90 b/test/Semantics/doconcurrent08.f90
index 214a931..e56b980 100644
--- a/test/Semantics/doconcurrent08.f90
+++ b/test/Semantics/doconcurrent08.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1140 -- A statement that might result in the deallocation of a polymorphic 
 ! entity shall not appear within a DO CONCURRENT construct.
 module m1
diff --git a/test/Semantics/dosemantics01.f90 b/test/Semantics/dosemantics01.f90
index ec5375f..29286db 100644
--- a/test/Semantics/dosemantics01.f90
+++ b/test/Semantics/dosemantics01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1131 -- check valid and invalid DO loop naming
 
 PROGRAM C1131
diff --git a/test/Semantics/dosemantics02.f90 b/test/Semantics/dosemantics02.f90
index a4c0ce1..563736b 100644
--- a/test/Semantics/dosemantics02.f90
+++ b/test/Semantics/dosemantics02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1121 -- any procedure referenced in a concurrent header must be pure
 
 ! Also, check that the step expressions are not zero.  This is prohibited by
diff --git a/test/Semantics/dosemantics03.f90 b/test/Semantics/dosemantics03.f90
index 5aedfcb..59c8dda 100644
--- a/test/Semantics/dosemantics03.f90
+++ b/test/Semantics/dosemantics03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -pedantic -Werror
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic -Werror
 
 ! Issue 458 -- semantic checks for a normal DO loop.  The DO variable
 ! and the initial, final, and step expressions must be INTEGER if the
diff --git a/test/Semantics/dosemantics04.f90 b/test/Semantics/dosemantics04.f90
index 6c3cdb8..1409f6d 100644
--- a/test/Semantics/dosemantics04.f90
+++ b/test/Semantics/dosemantics04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1123 -- Expressions in DO CONCURRENT header cannot reference variables
 ! declared in the same header
 PROGRAM dosemantics04
diff --git a/test/Semantics/dosemantics05.f90 b/test/Semantics/dosemantics05.f90
index ff1b230..b77e078 100644
--- a/test/Semantics/dosemantics05.f90
+++ b/test/Semantics/dosemantics05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test DO loop semantics for constraint C1130 --
 ! The constraint states that "If the locality-spec DEFAULT ( NONE ) appears in a
 ! DO CONCURRENT statement; a variable that is a local or construct entity of a
diff --git a/test/Semantics/dosemantics06.f90 b/test/Semantics/dosemantics06.f90
index 8059b4f..1e7fd89 100644
--- a/test/Semantics/dosemantics06.f90
+++ b/test/Semantics/dosemantics06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1131, C1133 -- check valid and invalid DO loop naming
 ! C1131 (R1119) If the do-stmt of a do-construct specifies a do-construct-name,
 ! the corresponding end-do shall be an end-do-stmt specifying the same
diff --git a/test/Semantics/dosemantics07.f90 b/test/Semantics/dosemantics07.f90
index be1bb9f..b64659a 100644
--- a/test/Semantics/dosemantics07.f90
+++ b/test/Semantics/dosemantics07.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 !C1132
 ! If the do-stmt is a nonlabel-do-stmt, the corresponding end-do shall be an
 ! end-do-stmt.
diff --git a/test/Semantics/dosemantics08.f90 b/test/Semantics/dosemantics08.f90
index 005f65b..1dc5ba6 100644
--- a/test/Semantics/dosemantics08.f90
+++ b/test/Semantics/dosemantics08.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1138 -- 
 ! A branch (11.2) within a DO CONCURRENT construct shall not have a branch
 ! target that is outside the construct.
diff --git a/test/Semantics/dosemantics09.f90 b/test/Semantics/dosemantics09.f90
index 4f2c5bf..9e6bca2 100644
--- a/test/Semantics/dosemantics09.f90
+++ b/test/Semantics/dosemantics09.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 !C1129 
 !A variable that is referenced by the scalar-mask-expr of a
 !concurrent-header or by any concurrent-limit or concurrent-step in that
diff --git a/test/Semantics/dosemantics10.f90 b/test/Semantics/dosemantics10.f90
index a17f827..0aad3c5 100644
--- a/test/Semantics/dosemantics10.f90
+++ b/test/Semantics/dosemantics10.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1134 A CYCLE statement must be within a DO construct
 !
 ! C1166 An EXIT statement must be within a DO construct
diff --git a/test/Semantics/dosemantics11.f90 b/test/Semantics/dosemantics11.f90
index e6ab9eb..5ceb834 100644
--- a/test/Semantics/dosemantics11.f90
+++ b/test/Semantics/dosemantics11.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1135 A cycle-stmt shall not appear within a CHANGE TEAM, CRITICAL, or DO 
 ! CONCURRENT construct if it belongs to an outer construct.
 !
diff --git a/test/Semantics/dosemantics12.f90 b/test/Semantics/dosemantics12.f90
index 40bb231..e5a390f 100644
--- a/test/Semantics/dosemantics12.f90
+++ b/test/Semantics/dosemantics12.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Copyright (c) 2019, NVIDIA CORPORATION.  All rights reserved.
 !
 ! Licensed under the Apache License, Version 2.0 (the "License");
diff --git a/test/Semantics/entry01.f90 b/test/Semantics/entry01.f90
index 5189389..8255e70 100644
--- a/test/Semantics/entry01.f90
+++ b/test/Semantics/entry01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests valid and invalid ENTRY statements
 
 module m1
diff --git a/test/Semantics/equivalence01.f90 b/test/Semantics/equivalence01.f90
index bab563d..d69113a 100644
--- a/test/Semantics/equivalence01.f90
+++ b/test/Semantics/equivalence01.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   integer i, j
   real r(2)
diff --git a/test/Semantics/expr-errors01.f90 b/test/Semantics/expr-errors01.f90
index 31aa92c..221a671 100644
--- a/test/Semantics/expr-errors01.f90
+++ b/test/Semantics/expr-errors01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1003 - can't parenthesize function call returning procedure pointer
 module m1
   type :: dt
diff --git a/test/Semantics/expr-errors02.f90 b/test/Semantics/expr-errors02.f90
index 0008765..8d72cb6 100644
--- a/test/Semantics/expr-errors02.f90
+++ b/test/Semantics/expr-errors02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test specification expressions
 
 module m
diff --git a/test/Semantics/expr-errors03.f90 b/test/Semantics/expr-errors03.f90
index 6db03a4..4a08c06 100644
--- a/test/Semantics/expr-errors03.f90
+++ b/test/Semantics/expr-errors03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Regression test for subscript error recovery
 module m
   implicit none
diff --git a/test/Semantics/final01.f90 b/test/Semantics/final01.f90
index 71d031a..07188cf 100644
--- a/test/Semantics/final01.f90
+++ b/test/Semantics/final01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test FINAL subroutine constraints C786-C789
 module m1
   external :: external
diff --git a/test/Semantics/forall01.f90 b/test/Semantics/forall01.f90
index 97db408..1ace762 100644
--- a/test/Semantics/forall01.f90
+++ b/test/Semantics/forall01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine forall1
   real :: a(9)
   !ERROR: 'i' is already declared in this scoping unit
diff --git a/test/Semantics/if_arith01.f90 b/test/Semantics/if_arith01.f90
index b7b0399..a6714f2 100644
--- a/test/Semantics/if_arith01.f90
+++ b/test/Semantics/if_arith01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check that a basic arithmetic if compiles.
 
 if ( A ) 100, 200, 300
diff --git a/test/Semantics/if_arith02.f90 b/test/Semantics/if_arith02.f90
index 95af999..e20fd46 100644
--- a/test/Semantics/if_arith02.f90
+++ b/test/Semantics/if_arith02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check that only labels are allowed in arithmetic if statements.
 ! TODO: Revisit error message "expected 'ASSIGN'" etc.
 ! TODO: Revisit error message "expected one of '0123456789'"
diff --git a/test/Semantics/if_arith03.f90 b/test/Semantics/if_arith03.f90
index 7b55e38..3af7d6d 100644
--- a/test/Semantics/if_arith03.f90
+++ b/test/Semantics/if_arith03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 !ERROR: Label '600' was not found
 if ( A ) 100, 200, 600
diff --git a/test/Semantics/if_arith04.f90 b/test/Semantics/if_arith04.f90
index 067031a..6e98b53 100644
--- a/test/Semantics/if_arith04.f90
+++ b/test/Semantics/if_arith04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Make sure arithmetic if expressions are non-complex numeric exprs.
 
 INTEGER I
diff --git a/test/Semantics/if_construct01.f90 b/test/Semantics/if_construct01.f90
index 9fb1344..0d9cbe4 100644
--- a/test/Semantics/if_construct01.f90
+++ b/test/Semantics/if_construct01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Simple check that if constructs are ok.
 
 if (a < b) then
diff --git a/test/Semantics/if_construct02.f90 b/test/Semantics/if_construct02.f90
index 03fd433..c2dc759 100644
--- a/test/Semantics/if_construct02.f90
+++ b/test/Semantics/if_construct02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check that if constructs only accept scalar logical expressions.
 ! TODO: expand the test to check this restriction for more types.
 
diff --git a/test/Semantics/if_stmt01.f90 b/test/Semantics/if_stmt01.f90
index 64d0b41..d53a1b9 100644
--- a/test/Semantics/if_stmt01.f90
+++ b/test/Semantics/if_stmt01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Simple check that if statements are ok.
 
 IF (A > 0.0) A = LOG (A)
diff --git a/test/Semantics/if_stmt02.f90 b/test/Semantics/if_stmt02.f90
index cb9abe5..46c7fcd 100644
--- a/test/Semantics/if_stmt02.f90
+++ b/test/Semantics/if_stmt02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 !ERROR: IF statement is not allowed in IF statement
 IF (A > 0.0) IF (B < 0.0) A = LOG (A)
 END
diff --git a/test/Semantics/if_stmt03.f90 b/test/Semantics/if_stmt03.f90
index 3d01247..eb61a0b 100644
--- a/test/Semantics/if_stmt03.f90
+++ b/test/Semantics/if_stmt03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check that non-logical expressions are not allowed.
 ! Check that non-scalar expressions are not allowed.
 ! TODO: Insure all non-logicals are prohibited.
diff --git a/test/Semantics/implicit01.f90 b/test/Semantics/implicit01.f90
index 2ed9e71..8d82685 100644
--- a/test/Semantics/implicit01.f90
+++ b/test/Semantics/implicit01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   implicit none
   !ERROR: More than one IMPLICIT NONE statement
diff --git a/test/Semantics/implicit02.f90 b/test/Semantics/implicit02.f90
index a5f2df1..6e793fa 100644
--- a/test/Semantics/implicit02.f90
+++ b/test/Semantics/implicit02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   implicit none
   !ERROR: IMPLICIT statement after IMPLICIT NONE or IMPLICIT NONE(TYPE) statement
diff --git a/test/Semantics/implicit03.f90 b/test/Semantics/implicit03.f90
index 0f2aa6a..928829c 100644
--- a/test/Semantics/implicit03.f90
+++ b/test/Semantics/implicit03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   implicit integer(a-z)
   !ERROR: IMPLICIT NONE statement after IMPLICIT statement
diff --git a/test/Semantics/implicit04.f90 b/test/Semantics/implicit04.f90
index fcc4387..9c06583 100644
--- a/test/Semantics/implicit04.f90
+++ b/test/Semantics/implicit04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s
   parameter(a=1.0)
   !ERROR: IMPLICIT NONE statement after PARAMETER statement
diff --git a/test/Semantics/implicit05.f90 b/test/Semantics/implicit05.f90
index e5b5281..f033aa2 100644
--- a/test/Semantics/implicit05.f90
+++ b/test/Semantics/implicit05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s
   !ERROR: 'a' does not follow 'b' alphabetically
   implicit integer(b-a)
diff --git a/test/Semantics/implicit06.f90 b/test/Semantics/implicit06.f90
index 11a2e82..4486d07 100644
--- a/test/Semantics/implicit06.f90
+++ b/test/Semantics/implicit06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   implicit integer(a-c)
   !ERROR: More than one implicit type specified for 'c'
diff --git a/test/Semantics/implicit07.f90 b/test/Semantics/implicit07.f90
index 4a6eadb..30e57e1 100644
--- a/test/Semantics/implicit07.f90
+++ b/test/Semantics/implicit07.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 implicit none(external)
 external x
 integer :: f, i
diff --git a/test/Semantics/implicit08.f90 b/test/Semantics/implicit08.f90
index a498413..9b42bc2 100644
--- a/test/Semantics/implicit08.f90
+++ b/test/Semantics/implicit08.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   block
     !ERROR: IMPLICIT statement is not allowed in a BLOCK construct
diff --git a/test/Semantics/implicit09.f90 b/test/Semantics/implicit09.f90
index bda24f6..95bfd4e 100644
--- a/test/Semantics/implicit09.f90
+++ b/test/Semantics/implicit09.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fimplicit-none-type-never
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fimplicit-none-type-never
 subroutine s1
   implicit none
   i = j + k  ! would be error without -fimplicit-none-type-never
diff --git a/test/Semantics/implicit10.f90 b/test/Semantics/implicit10.f90
index c1ef7b1..081f236 100644
--- a/test/Semantics/implicit10.f90
+++ b/test/Semantics/implicit10.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fimplicit-none
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fimplicit-none
 
 !ERROR: No explicit type declared for 'f'
 function f()
diff --git a/test/Semantics/implicit11.f90 b/test/Semantics/implicit11.f90
index 0a52e1a..3c68ab5 100644
--- a/test/Semantics/implicit11.f90
+++ b/test/Semantics/implicit11.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! Test use of implicitly declared variable in specification expression
 
diff --git a/test/Semantics/init01.f90 b/test/Semantics/init01.f90
index 89b2c41..7e96259 100644
--- a/test/Semantics/init01.f90
+++ b/test/Semantics/init01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Initializer error tests
 
 subroutine objectpointers(j)
diff --git a/test/Semantics/int-literals.f90 b/test/Semantics/int-literals.f90
index 09d0914..2344d6b 100644
--- a/test/Semantics/int-literals.f90
+++ b/test/Semantics/int-literals.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Fortran syntax considers signed int literals in complex literals
 ! to be a distinct production, not an application of unary +/- to
 ! an unsigned int literal, so they're used here to test overflow
diff --git a/test/Semantics/io01.f90 b/test/Semantics/io01.f90
index 14cdd1c..d3d2df1 100644
--- a/test/Semantics/io01.f90
+++ b/test/Semantics/io01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
   character(len=20) :: access = "direcT"
   character(len=20) :: access_(2) = (/"direcT", "streaM"/)
   character(len=20) :: action_(2) = (/"reaD ", "writE"/)
diff --git a/test/Semantics/io02.f90 b/test/Semantics/io02.f90
index 3ff06cc..40be023 100644
--- a/test/Semantics/io02.f90
+++ b/test/Semantics/io02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
   integer :: unit10 = 10
   integer :: unit11 = 11
   integer, parameter :: const_stat = 6666
diff --git a/test/Semantics/io03.f90 b/test/Semantics/io03.f90
index 69f5914..70f25ad 100644
--- a/test/Semantics/io03.f90
+++ b/test/Semantics/io03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
   character(kind=1,len=50) internal_file
   character(kind=2,len=50) internal_file2
   character(kind=4,len=50) internal_file4
diff --git a/test/Semantics/io04.f90 b/test/Semantics/io04.f90
index e7baa54..e53b1eb 100644
--- a/test/Semantics/io04.f90
+++ b/test/Semantics/io04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
   character(kind=1,len=50) internal_file
   character(kind=1,len=100) msg
   character(20) sign
diff --git a/test/Semantics/io05.f90 b/test/Semantics/io05.f90
index ad80f93..851ec5f 100644
--- a/test/Semantics/io05.f90
+++ b/test/Semantics/io05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
   character*20 c(25), cv
   character(kind=1,len=59) msg
   character, parameter :: const_round = "c'est quoi?"
diff --git a/test/Semantics/io06.f90 b/test/Semantics/io06.f90
index e906863..e3bc760 100644
--- a/test/Semantics/io06.f90
+++ b/test/Semantics/io06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
   character(kind=1,len=100) msg1
   character(kind=2,len=200) msg2
   character, parameter :: const_msg = 'doof'
diff --git a/test/Semantics/io07.f90 b/test/Semantics/io07.f90
index 121eff8..5c4c2b4 100644
--- a/test/Semantics/io07.f90
+++ b/test/Semantics/io07.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 1001 format(A)
 
      !ERROR: Format statement must be labeled
diff --git a/test/Semantics/io08.f90 b/test/Semantics/io08.f90
index 7c9f924..c074e15 100644
--- a/test/Semantics/io08.f90
+++ b/test/Semantics/io08.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
   write(*,*)
   write(*,'()')
   write(*,'(A)')
diff --git a/test/Semantics/io09.f90 b/test/Semantics/io09.f90
index c9b1948..495cbf0 100644
--- a/test/Semantics/io09.f90
+++ b/test/Semantics/io09.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
   !ERROR: String edit descriptor in READ format expression
   read(*,'("abc")')
 
diff --git a/test/Semantics/io10.f90 b/test/Semantics/io10.f90
index 6322073..ef7008b 100644
--- a/test/Semantics/io10.f90
+++ b/test/Semantics/io10.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -pedantic
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
 
   write(*, '(B0)')
   write(*, '(B3)')
diff --git a/test/Semantics/io11.f90 b/test/Semantics/io11.f90
index 4de8b52..35ea874 100644
--- a/test/Semantics/io11.f90
+++ b/test/Semantics/io11.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! Tests for defined input/output.  See 12.6.4.8 and 15.4.3.2, and C777
 module m1
diff --git a/test/Semantics/kinds02.f90 b/test/Semantics/kinds02.f90
index 46cd6eb..b02659e 100644
--- a/test/Semantics/kinds02.f90
+++ b/test/Semantics/kinds02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C712 The value of scalar-int-constant-expr shall be nonnegative and 
 ! shall specify a representation method that exists on the processor.
 ! C714 The value of kind-param shall be nonnegative.
diff --git a/test/Semantics/kinds04.f90 b/test/Semantics/kinds04.f90
index f03126d..26957d9 100644
--- a/test/Semantics/kinds04.f90
+++ b/test/Semantics/kinds04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C716 If both kind-param and exponent-letter appear, exponent-letter 
 ! shall be E.
 ! C717 The value of kind-param shall specify an approximation method that 
diff --git a/test/Semantics/label11.f90 b/test/Semantics/label11.f90
index 6c45edc..ebd743a 100644
--- a/test/Semantics/label11.f90
+++ b/test/Semantics/label11.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C739 If END TYPE is followed by a type-name, the type-name shall be the
 ! same as that in the corresponding derived-type-stmt.
 ! C1401 The program-name shall not be included in the end-program-stmt unless
diff --git a/test/Semantics/label16.f90 b/test/Semantics/label16.f90
index f6cb3d4..7339420 100644
--- a/test/Semantics/label16.f90
+++ b/test/Semantics/label16.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 subroutine x(n)
    call x1(n)
diff --git a/test/Semantics/misc-declarations.f90 b/test/Semantics/misc-declarations.f90
index 081a497..485b82d 100644
--- a/test/Semantics/misc-declarations.f90
+++ b/test/Semantics/misc-declarations.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Miscellaneous constraint and requirement checking on declarations:
 ! - 8.5.6.2 & 8.5.6.3 constraints on coarrays
 ! - 8.5.19 constraints on the VOLATILE attribute
diff --git a/test/Semantics/modfile41.f90 b/test/Semantics/modfile41.f90
index e988e77..caba833 100644
--- a/test/Semantics/modfile41.f90
+++ b/test/Semantics/modfile41.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test USE statements that use same module multiple times mixed with rename
 ! clauses and ONLY clauses
 module m1
diff --git a/test/Semantics/namelist01.f90 b/test/Semantics/namelist01.f90
index d52e5db..b14bf04 100644
--- a/test/Semantics/namelist01.f90
+++ b/test/Semantics/namelist01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test for checking namelist constraints, C8103-C8105
 
 module dup
diff --git a/test/Semantics/null-init.f90 b/test/Semantics/null-init.f90
index d5ed4d1..a1ac29e 100644
--- a/test/Semantics/null-init.f90
+++ b/test/Semantics/null-init.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests valid and invalid NULL initializers
 
 module m1
diff --git a/test/Semantics/null01.f90 b/test/Semantics/null01.f90
index 65af2d9..73ee760 100644
--- a/test/Semantics/null01.f90
+++ b/test/Semantics/null01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! NULL() intrinsic function error tests
 
 subroutine test
diff --git a/test/Semantics/nullify01.f90 b/test/Semantics/nullify01.f90
index 3fdf5d4..21ffa81 100644
--- a/test/Semantics/nullify01.f90
+++ b/test/Semantics/nullify01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test that NULLIFY works
 
 Module share
diff --git a/test/Semantics/nullify02.f90 b/test/Semantics/nullify02.f90
index bccc174..81d108a 100644
--- a/test/Semantics/nullify02.f90
+++ b/test/Semantics/nullify02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in NULLIFY statements
 
 INTEGER, PARAMETER :: maxvalue=1024
diff --git a/test/Semantics/num_images.f90 b/test/Semantics/num_images.f90
index f77fc83..03bd0f4 100644
--- a/test/Semantics/num_images.f90
+++ b/test/Semantics/num_images.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Check for semantic errors in num_images() function calls
 
 subroutine test
diff --git a/test/Semantics/omp-allocate-directive.f90 b/test/Semantics/omp-allocate-directive.f90
index 4eb1669..00c0f6b 100644
--- a/test/Semantics/omp-allocate-directive.f90
+++ b/test/Semantics/omp-allocate-directive.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! Check OpenMP Allocate directive
 use omp_lib
 
diff --git a/test/Semantics/omp-allocate01.f90 b/test/Semantics/omp-allocate01.f90
index 73d3701..74f8788 100644
--- a/test/Semantics/omp-allocate01.f90
+++ b/test/Semantics/omp-allocate01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 5.0
 ! 2.11.3 allocate Directive
 ! The allocate directive must appear in the same scope as the declarations of
diff --git a/test/Semantics/omp-allocate02.f90 b/test/Semantics/omp-allocate02.f90
index 1abc7b5..ba3957f 100644
--- a/test/Semantics/omp-allocate02.f90
+++ b/test/Semantics/omp-allocate02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 5.0
 ! 2.11.3 allocate Directive
 ! At most one allocator clause can appear on the allocate directive.
diff --git a/test/Semantics/omp-allocate03.f90 b/test/Semantics/omp-allocate03.f90
index 8d3c0cc..3ff6f7a 100644
--- a/test/Semantics/omp-allocate03.f90
+++ b/test/Semantics/omp-allocate03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 5.0
 ! 2.11.3 allocate Directive
 ! A variable that is part of another variable (as an array or
diff --git a/test/Semantics/omp-allocate04.f90 b/test/Semantics/omp-allocate04.f90
index 9f5e0ca..d5d9730 100644
--- a/test/Semantics/omp-allocate04.f90
+++ b/test/Semantics/omp-allocate04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 5.0
 ! 2.11.3 allocate Directive
 ! Only the allocator clause is allowed on the allocate directive
diff --git a/test/Semantics/omp-allocate05.f90 b/test/Semantics/omp-allocate05.f90
index f128358..89cf83d 100644
--- a/test/Semantics/omp-allocate05.f90
+++ b/test/Semantics/omp-allocate05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 5.0
 ! 2.11.3 allocate Directive
 ! allocate directives that appear in a target region must specify an allocator
diff --git a/test/Semantics/omp-allocate06.f90 b/test/Semantics/omp-allocate06.f90
index aa75d47..2265134 100644
--- a/test/Semantics/omp-allocate06.f90
+++ b/test/Semantics/omp-allocate06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 5.0
 ! 2.11.3 allocate Directive 
 ! List items specified in the allocate directive must not have the ALLOCATABLE attribute unless the directive is associated with an
diff --git a/test/Semantics/omp-allocate07.f90 b/test/Semantics/omp-allocate07.f90
index 2c79128..067fc42 100644
--- a/test/Semantics/omp-allocate07.f90
+++ b/test/Semantics/omp-allocate07.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 5.0
 ! 2.11.3 allocate Directive 
 ! A type parameter inquiry cannot appear in an allocate directive.
diff --git a/test/Semantics/omp-allocate08.f90 b/test/Semantics/omp-allocate08.f90
index 8d524ef..2594933 100644
--- a/test/Semantics/omp-allocate08.f90
+++ b/test/Semantics/omp-allocate08.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 5.0
 ! 2.11.3 allocate Directive
 ! If list items within the ALLOCATE directive have the SAVE attribute, are a common block name, or are declared in the scope of a
diff --git a/test/Semantics/omp-atomic.f90 b/test/Semantics/omp-atomic.f90
index 6fc500c..86d9457 100644
--- a/test/Semantics/omp-atomic.f90
+++ b/test/Semantics/omp-atomic.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 use omp_lib
 ! Check OpenMP 2.13.6 atomic Construct
 
diff --git a/test/Semantics/omp-atomic01.f90 b/test/Semantics/omp-atomic01.f90
index 8a8fa42..9f9e26f 100644
--- a/test/Semantics/omp-atomic01.f90
+++ b/test/Semantics/omp-atomic01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! Semantic checks for OpenMP 5.0 standard 2.17.7 atomic Construct.
 
 use omp_lib
diff --git a/test/Semantics/omp-clause-validity01.f90 b/test/Semantics/omp-clause-validity01.f90
index e4dd150..f6150a2 100644
--- a/test/Semantics/omp-clause-validity01.f90
+++ b/test/Semantics/omp-clause-validity01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 use omp_lib
 ! Check OpenMP clause validity for the following directives:
 !
diff --git a/test/Semantics/omp-combined-constructs.f90 b/test/Semantics/omp-combined-constructs.f90
index c437130..c8d3d26 100644
--- a/test/Semantics/omp-combined-constructs.f90
+++ b/test/Semantics/omp-combined-constructs.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 program main
   implicit none
diff --git a/test/Semantics/omp-copyin01.f90 b/test/Semantics/omp-copyin01.f90
index 389e0f7..6aba8a2 100644
--- a/test/Semantics/omp-copyin01.f90
+++ b/test/Semantics/omp-copyin01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.4.1 copyin Clause
 ! A list item that appears in a copyin clause must be threadprivate
diff --git a/test/Semantics/omp-copyin02.f90 b/test/Semantics/omp-copyin02.f90
index f1d02ff..8c92ccc 100644
--- a/test/Semantics/omp-copyin02.f90
+++ b/test/Semantics/omp-copyin02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.4.1 copyin Clause
 ! A common block name that appears in a copyin clause must be declared to be
diff --git a/test/Semantics/omp-copyin03.f90 b/test/Semantics/omp-copyin03.f90
index 2d856c7..54a2604 100644
--- a/test/Semantics/omp-copyin03.f90
+++ b/test/Semantics/omp-copyin03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.4.1 copyin Clause
 ! A list item that appears in a copyin clause must be threadprivate.
diff --git a/test/Semantics/omp-copyin04.f90 b/test/Semantics/omp-copyin04.f90
index c73c628..297d42a 100644
--- a/test/Semantics/omp-copyin04.f90
+++ b/test/Semantics/omp-copyin04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.4.1 copyin Clause
 ! A list item that appears in a copyin clause must be threadprivate
diff --git a/test/Semantics/omp-copyin05.f90 b/test/Semantics/omp-copyin05.f90
index 5d05a92..8f1ba29 100644
--- a/test/Semantics/omp-copyin05.f90
+++ b/test/Semantics/omp-copyin05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.4.1 copyin Clause
 ! A common block name that appears in a copyin clause must be declared to be
diff --git a/test/Semantics/omp-copyprivate01.f90 b/test/Semantics/omp-copyprivate01.f90
index 75c9d4a..37912ed 100644
--- a/test/Semantics/omp-copyprivate01.f90
+++ b/test/Semantics/omp-copyprivate01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.4.2 copyprivate Clause
 ! A list item that appears in a copyprivate clause may not appear in a
diff --git a/test/Semantics/omp-copyprivate02.f90 b/test/Semantics/omp-copyprivate02.f90
index fe62eae..e2d408a 100644
--- a/test/Semantics/omp-copyprivate02.f90
+++ b/test/Semantics/omp-copyprivate02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.4.2 copyprivate Clause
 ! Pointers with the INTENT(IN) attribute may not appear in a copyprivate clause.
diff --git a/test/Semantics/omp-copyprivate03.f90 b/test/Semantics/omp-copyprivate03.f90
index b19e697..0ca4909 100644
--- a/test/Semantics/omp-copyprivate03.f90
+++ b/test/Semantics/omp-copyprivate03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.4.2 copyprivate Clause
 ! All list items that appear in the copyprivate clause must be either
diff --git a/test/Semantics/omp-declarative-directive.f90 b/test/Semantics/omp-declarative-directive.f90
index dca3d89..15744d9 100644
--- a/test/Semantics/omp-declarative-directive.f90
+++ b/test/Semantics/omp-declarative-directive.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! Check OpenMP declarative directives
 
diff --git a/test/Semantics/omp-default.f90 b/test/Semantics/omp-default.f90
index 5955a3a..e4f364c 100644
--- a/test/Semantics/omp-default.f90
+++ b/test/Semantics/omp-default.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.1 default Clause
 program omp_default
diff --git a/test/Semantics/omp-default02.f90 b/test/Semantics/omp-default02.f90
index b95e673..f508d6a 100644
--- a/test/Semantics/omp-default02.f90
+++ b/test/Semantics/omp-default02.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.1 default Clause - a positive test case.
 
diff --git a/test/Semantics/omp-depend01.f90 b/test/Semantics/omp-depend01.f90
index bb42056..aedcb8b 100644
--- a/test/Semantics/omp-depend01.f90
+++ b/test/Semantics/omp-depend01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.13.9 Depend Clause
 ! List items used in depend clauses cannot be zero-length array sections.
diff --git a/test/Semantics/omp-depend02.f90 b/test/Semantics/omp-depend02.f90
index aa30da4..e00c851 100644
--- a/test/Semantics/omp-depend02.f90
+++ b/test/Semantics/omp-depend02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.13.9 Depend Clause
 ! A variable that is part of another variable
diff --git a/test/Semantics/omp-depend03.f90 b/test/Semantics/omp-depend03.f90
index 68cff43..9bca93a 100644
--- a/test/Semantics/omp-depend03.f90
+++ b/test/Semantics/omp-depend03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.13.9 Depend Clause
 ! Coarrays are not supported in depend clause
diff --git a/test/Semantics/omp-device-constructs.f90 b/test/Semantics/omp-device-constructs.f90
index 301b102..d5a1acc 100644
--- a/test/Semantics/omp-device-constructs.f90
+++ b/test/Semantics/omp-device-constructs.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! Check OpenMP clause validity for the following directives:
 !     2.10 Device constructs
 program main
diff --git a/test/Semantics/omp-do-collapse-positivecases.f90 b/test/Semantics/omp-do-collapse-positivecases.f90
index 3959a35..fecd4d5 100644
--- a/test/Semantics/omp-do-collapse-positivecases.f90
+++ b/test/Semantics/omp-do-collapse-positivecases.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Collapse Clause Positive cases
 
diff --git a/test/Semantics/omp-do-collapse.f90 b/test/Semantics/omp-do-collapse.f90
index c2af35b..c7404e0 100644
--- a/test/Semantics/omp-do-collapse.f90
+++ b/test/Semantics/omp-do-collapse.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Collapse Clause
 program omp_doCollapse
diff --git a/test/Semantics/omp-do-cycle.f90 b/test/Semantics/omp-do-cycle.f90
index f3bc7bf..f01e10f 100644
--- a/test/Semantics/omp-do-cycle.f90
+++ b/test/Semantics/omp-do-cycle.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! Check for cycle statements leaving an OpenMP structured block
 
diff --git a/test/Semantics/omp-do-ordered-positivecases.f90 b/test/Semantics/omp-do-ordered-positivecases.f90
index bb571bb..e2f9ec0 100644
--- a/test/Semantics/omp-do-ordered-positivecases.f90
+++ b/test/Semantics/omp-do-ordered-positivecases.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Ordered Clause positive cases.
 
diff --git a/test/Semantics/omp-do-ordered.f90 b/test/Semantics/omp-do-ordered.f90
index adcfa69..77a8476 100644
--- a/test/Semantics/omp-do-ordered.f90
+++ b/test/Semantics/omp-do-ordered.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Ordered Clause
 
diff --git a/test/Semantics/omp-do-schedule01.f90 b/test/Semantics/omp-do-schedule01.f90
index f513e5f..2c52f96 100644
--- a/test/Semantics/omp-do-schedule01.f90
+++ b/test/Semantics/omp-do-schedule01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Schedule Clause
 program omp_doSchedule
diff --git a/test/Semantics/omp-do-schedule02.f90 b/test/Semantics/omp-do-schedule02.f90
index 6272f74..28f84d2 100644
--- a/test/Semantics/omp-do-schedule02.f90
+++ b/test/Semantics/omp-do-schedule02.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Schedule Clause
 program omp_doSchedule
diff --git a/test/Semantics/omp-do01.f90 b/test/Semantics/omp-do01.f90
index deb0d50..ee256c8 100644
--- a/test/Semantics/omp-do01.f90
+++ b/test/Semantics/omp-do01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
 ! The loop iteration variable may not appear in a firstprivate directive.
diff --git a/test/Semantics/omp-do03.f90 b/test/Semantics/omp-do03.f90
index 67002e9..f83cd7c 100644
--- a/test/Semantics/omp-do03.f90
+++ b/test/Semantics/omp-do03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
diff --git a/test/Semantics/omp-do04.f90 b/test/Semantics/omp-do04.f90
index 41709dd..3ef7e7f 100644
--- a/test/Semantics/omp-do04.f90
+++ b/test/Semantics/omp-do04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
 ! The loop iteration variable may not appear in a threadprivate directive.
diff --git a/test/Semantics/omp-do05.f90 b/test/Semantics/omp-do05.f90
index 3bf7670..a88d50b 100644
--- a/test/Semantics/omp-do05.f90
+++ b/test/Semantics/omp-do05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct restrictions on single directive.
 
diff --git a/test/Semantics/omp-do06.f90 b/test/Semantics/omp-do06.f90
index f39b0cd..1374e63 100644
--- a/test/Semantics/omp-do06.f90
+++ b/test/Semantics/omp-do06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
 ! The ordered clause must be present on the loop construct if any ordered
diff --git a/test/Semantics/omp-do08.f90 b/test/Semantics/omp-do08.f90
index 65e94df..f4d6f7d 100644
--- a/test/Semantics/omp-do08.f90
+++ b/test/Semantics/omp-do08.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
 
diff --git a/test/Semantics/omp-do09.f90 b/test/Semantics/omp-do09.f90
index 2c781da..75b1ddc 100644
--- a/test/Semantics/omp-do09.f90
+++ b/test/Semantics/omp-do09.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
 ! The do-loop cannot be a DO WHILE or a DO loop without loop control.
diff --git a/test/Semantics/omp-do10.f90 b/test/Semantics/omp-do10.f90
index 0c61de2..d14278c 100644
--- a/test/Semantics/omp-do10.f90
+++ b/test/Semantics/omp-do10.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
 ! The DO loop iteration variable must be of type integer.
diff --git a/test/Semantics/omp-do13.f90 b/test/Semantics/omp-do13.f90
index 6e3ac62..2168375 100644
--- a/test/Semantics/omp-do13.f90
+++ b/test/Semantics/omp-do13.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
 
diff --git a/test/Semantics/omp-do15.f90 b/test/Semantics/omp-do15.f90
index 4cdc2bd..10099d6 100644
--- a/test/Semantics/omp-do15.f90
+++ b/test/Semantics/omp-do15.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
 
diff --git a/test/Semantics/omp-do16.f90 b/test/Semantics/omp-do16.f90
index 2af5ed4..f312ba6 100644
--- a/test/Semantics/omp-do16.f90
+++ b/test/Semantics/omp-do16.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.1 Loop Construct
 
diff --git a/test/Semantics/omp-firstprivate01.f90 b/test/Semantics/omp-firstprivate01.f90
index c461cef..507d167 100644
--- a/test/Semantics/omp-firstprivate01.f90
+++ b/test/Semantics/omp-firstprivate01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.4 firstprivate Clause
 ! Variables that appear in a firstprivate clause on a distribute or
diff --git a/test/Semantics/omp-flush01.f90 b/test/Semantics/omp-flush01.f90
index 03b0268..1eb9680 100644
--- a/test/Semantics/omp-flush01.f90
+++ b/test/Semantics/omp-flush01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! 2.17.8 Flush construct [OpenMP 5.0]
 !        memory-order-clause ->
diff --git a/test/Semantics/omp-flush02.f90 b/test/Semantics/omp-flush02.f90
index b9602de..a23f634 100644
--- a/test/Semantics/omp-flush02.f90
+++ b/test/Semantics/omp-flush02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 
 ! Check OpenMP 5.0 - 2.17.8 flush Construct
 ! Restriction -
diff --git a/test/Semantics/omp-lastprivate01.f90 b/test/Semantics/omp-lastprivate01.f90
index e9a4be6..1041555 100644
--- a/test/Semantics/omp-lastprivate01.f90
+++ b/test/Semantics/omp-lastprivate01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.5 lastprivate Clause
 ! A variable that appears in a lastprivate clause must be definable.
diff --git a/test/Semantics/omp-lastprivate02.f90 b/test/Semantics/omp-lastprivate02.f90
index b170318..61e2329 100644
--- a/test/Semantics/omp-lastprivate02.f90
+++ b/test/Semantics/omp-lastprivate02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.5 lastprivate Clause
 ! A list item that is private within a parallel region, or that appears in
diff --git a/test/Semantics/omp-linear-iter.f90 b/test/Semantics/omp-linear-iter.f90
index bb9dbcb..73389d9 100644
--- a/test/Semantics/omp-linear-iter.f90
+++ b/test/Semantics/omp-linear-iter.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! Various checks with the ordered construct
 
diff --git a/test/Semantics/omp-loop-association.f90 b/test/Semantics/omp-loop-association.f90
index 5e7dce6..de7c9cb 100644
--- a/test/Semantics/omp-loop-association.f90
+++ b/test/Semantics/omp-loop-association.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! Check the association between OpenMPLoopConstruct and DoConstruct
 
diff --git a/test/Semantics/omp-loop-simd01.f90 b/test/Semantics/omp-loop-simd01.f90
index 09d812a..0146a01 100644
--- a/test/Semantics/omp-loop-simd01.f90
+++ b/test/Semantics/omp-loop-simd01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! OpenMP Version 4.5
 ! 2.8.3 Loop simd Construct
diff --git a/test/Semantics/omp-nested-barrier.f90 b/test/Semantics/omp-nested-barrier.f90
index 63428b1..14bc36d 100644
--- a/test/Semantics/omp-nested-barrier.f90
+++ b/test/Semantics/omp-nested-barrier.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! Various checks with the nesting of BARRIER construct
 
diff --git a/test/Semantics/omp-nested-cancel.f90 b/test/Semantics/omp-nested-cancel.f90
index 579d762..97b3dd5 100644
--- a/test/Semantics/omp-nested-cancel.f90
+++ b/test/Semantics/omp-nested-cancel.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! OpenMP Version 5.0
 ! Check OpenMP construct validity for the following directives:
diff --git a/test/Semantics/omp-nested-cancellation-point.f90 b/test/Semantics/omp-nested-cancellation-point.f90
index a139bfa..e339e80 100644
--- a/test/Semantics/omp-nested-cancellation-point.f90
+++ b/test/Semantics/omp-nested-cancellation-point.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! OpenMP Version 5.0
 ! Check OpenMP construct validity for the following directives:
diff --git a/test/Semantics/omp-nested-distribute.f90 b/test/Semantics/omp-nested-distribute.f90
index 92a1216..7baffdf 100644
--- a/test/Semantics/omp-nested-distribute.f90
+++ b/test/Semantics/omp-nested-distribute.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! Check OpenMP clause validity for the following directives:
 !     2.10 Device constructs
 program main
diff --git a/test/Semantics/omp-nested-master.f90 b/test/Semantics/omp-nested-master.f90
index 9debac6..0134674 100644
--- a/test/Semantics/omp-nested-master.f90
+++ b/test/Semantics/omp-nested-master.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! Various checks with the nesting of MASTER construct
 
diff --git a/test/Semantics/omp-nested-simd.f90 b/test/Semantics/omp-nested-simd.f90
index bb1a219..33d5190 100644
--- a/test/Semantics/omp-nested-simd.f90
+++ b/test/Semantics/omp-nested-simd.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! Various checks with the nesting of SIMD construct
 
diff --git a/test/Semantics/omp-nested-target.f90 b/test/Semantics/omp-nested-target.f90
index da4d161..ea061bd 100644
--- a/test/Semantics/omp-nested-target.f90
+++ b/test/Semantics/omp-nested-target.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 
 ! OpenMP Version 5.0
 ! Check OpenMP construct validity for the following directives:
diff --git a/test/Semantics/omp-nested-teams.f90 b/test/Semantics/omp-nested-teams.f90
index 4a773b3..465ece4 100644
--- a/test/Semantics/omp-nested-teams.f90
+++ b/test/Semantics/omp-nested-teams.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! OpenMP Version 5.0
 ! Check OpenMP construct validity for the following directives:
diff --git a/test/Semantics/omp-nested01.f90 b/test/Semantics/omp-nested01.f90
index a24a99f..602790c 100644
--- a/test/Semantics/omp-nested01.f90
+++ b/test/Semantics/omp-nested01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! Check OpenMP 2.17 Nesting of Regions
 
diff --git a/test/Semantics/omp-no-dowhile-in-parallel.f90 b/test/Semantics/omp-no-dowhile-in-parallel.f90
index b5bf947..2cab4a4 100644
--- a/test/Semantics/omp-no-dowhile-in-parallel.f90
+++ b/test/Semantics/omp-no-dowhile-in-parallel.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 subroutine bug48308(x,i)
   real :: x(:)
diff --git a/test/Semantics/omp-ordered-simd.f90 b/test/Semantics/omp-ordered-simd.f90
index 84ff740..3c544e9 100644
--- a/test/Semantics/omp-ordered-simd.f90
+++ b/test/Semantics/omp-ordered-simd.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! Various checks with the ordered construct
 
diff --git a/test/Semantics/omp-parallel-private01.f90 b/test/Semantics/omp-parallel-private01.f90
index 504b322..6d851af 100644
--- a/test/Semantics/omp-parallel-private01.f90
+++ b/test/Semantics/omp-parallel-private01.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.3 parallel private Clause
 program omp_parallel_private
diff --git a/test/Semantics/omp-parallel-private02.f90 b/test/Semantics/omp-parallel-private02.f90
index f1bfeb5..aafd493 100644
--- a/test/Semantics/omp-parallel-private02.f90
+++ b/test/Semantics/omp-parallel-private02.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.3 parallel private Clause
 program omp_parallel_private
diff --git a/test/Semantics/omp-parallel-private03.f90 b/test/Semantics/omp-parallel-private03.f90
index c76ce16..2675b44 100644
--- a/test/Semantics/omp-parallel-private03.f90
+++ b/test/Semantics/omp-parallel-private03.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.3 parallel private Clause
 program omp_parallel_private
diff --git a/test/Semantics/omp-parallel-private04.f90 b/test/Semantics/omp-parallel-private04.f90
index 1b4bed5..4448f28 100644
--- a/test/Semantics/omp-parallel-private04.f90
+++ b/test/Semantics/omp-parallel-private04.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.3 parallel private Clause
 program omp_parallel_private
diff --git a/test/Semantics/omp-parallel-shared01.f90 b/test/Semantics/omp-parallel-shared01.f90
index e5e3004..2914678 100644
--- a/test/Semantics/omp-parallel-shared01.f90
+++ b/test/Semantics/omp-parallel-shared01.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.2 parallel shared Clause
 program omp_parallel_shared
diff --git a/test/Semantics/omp-parallel-shared02.f90 b/test/Semantics/omp-parallel-shared02.f90
index e91e47f..f2eda03 100644
--- a/test/Semantics/omp-parallel-shared02.f90
+++ b/test/Semantics/omp-parallel-shared02.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.2 parallel shared Clause
 program omp_parallel_shared
diff --git a/test/Semantics/omp-parallel-shared03.f90 b/test/Semantics/omp-parallel-shared03.f90
index 48465f0..8ae800d 100644
--- a/test/Semantics/omp-parallel-shared03.f90
+++ b/test/Semantics/omp-parallel-shared03.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.2 parallel shared Clause
 program omp_parallel_shared
diff --git a/test/Semantics/omp-parallel-shared04.f90 b/test/Semantics/omp-parallel-shared04.f90
index cb63e45..cd18a9e 100644
--- a/test/Semantics/omp-parallel-shared04.f90
+++ b/test/Semantics/omp-parallel-shared04.f90
@@ -1,5 +1,4 @@
-!RUN: %S/test_errors.sh %s %t %flang -fopenmp
-!REQUIRES: shell
+!RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.2 parallel shared Clause
 program omp_parallel_shared
diff --git a/test/Semantics/omp-private01.f90 b/test/Semantics/omp-private01.f90
index 32887de..e5cc4ba 100644
--- a/test/Semantics/omp-private01.f90
+++ b/test/Semantics/omp-private01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.3 private Clause
 ! Pointers with the INTENT(IN) attribute may not appear in a private clause.
diff --git a/test/Semantics/omp-private02.f90 b/test/Semantics/omp-private02.f90
index db8c733..fbc1da8 100644
--- a/test/Semantics/omp-private02.f90
+++ b/test/Semantics/omp-private02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.3 private Clause
 ! Variables that appear in namelist statements may not appear in a private clause.
diff --git a/test/Semantics/omp-private03.f90 b/test/Semantics/omp-private03.f90
index addca11..a0cf829 100644
--- a/test/Semantics/omp-private03.f90
+++ b/test/Semantics/omp-private03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! Variables that appear in expressions for statement function definitions
 ! may not appear in private, firstprivate or lastprivate clauses.
diff --git a/test/Semantics/omp-reduction01.f90 b/test/Semantics/omp-reduction01.f90
index b7793b9..85e8669 100644
--- a/test/Semantics/omp-reduction01.f90
+++ b/test/Semantics/omp-reduction01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.6 Reduction Clause
 program omp_reduction
diff --git a/test/Semantics/omp-reduction02.f90 b/test/Semantics/omp-reduction02.f90
index 8cac4fb..6343814 100644
--- a/test/Semantics/omp-reduction02.f90
+++ b/test/Semantics/omp-reduction02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.6 Reduction Clause
 program omp_reduction
diff --git a/test/Semantics/omp-reduction03.f90 b/test/Semantics/omp-reduction03.f90
index 0019d44..7741579 100644
--- a/test/Semantics/omp-reduction03.f90
+++ b/test/Semantics/omp-reduction03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.6 Reduction Clause
 
diff --git a/test/Semantics/omp-reduction04.f90 b/test/Semantics/omp-reduction04.f90
index 75ff094..0a8a306 100644
--- a/test/Semantics/omp-reduction04.f90
+++ b/test/Semantics/omp-reduction04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.6 Reduction Clause
 program omp_Reduction
diff --git a/test/Semantics/omp-reduction05.f90 b/test/Semantics/omp-reduction05.f90
index 1e1f7f1..2281060 100644
--- a/test/Semantics/omp-reduction05.f90
+++ b/test/Semantics/omp-reduction05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.6 Reduction Clause
 
diff --git a/test/Semantics/omp-reduction06.f90 b/test/Semantics/omp-reduction06.f90
index 6b71bd6..50b1736 100644
--- a/test/Semantics/omp-reduction06.f90
+++ b/test/Semantics/omp-reduction06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.6 Reduction Clause
 
diff --git a/test/Semantics/omp-reduction07.f90 b/test/Semantics/omp-reduction07.f90
index e1f1d86..74178a9 100644
--- a/test/Semantics/omp-reduction07.f90
+++ b/test/Semantics/omp-reduction07.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.6 Reduction Clause
 program omp_reduction
diff --git a/test/Semantics/omp-reduction10.f90 b/test/Semantics/omp-reduction10.f90
index 9c733da..96e0b50 100644
--- a/test/Semantics/omp-reduction10.f90
+++ b/test/Semantics/omp-reduction10.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.15.3.6 Reduction Clause
 program omp_reduction
diff --git a/test/Semantics/omp-resolve01.f90 b/test/Semantics/omp-resolve01.f90
index daa5582..b716c4a 100644
--- a/test/Semantics/omp-resolve01.f90
+++ b/test/Semantics/omp-resolve01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! 2.4 An array section designates a subset of the elements in an array. Although
 ! Substring shares similar syntax but cannot be treated as valid array section.
diff --git a/test/Semantics/omp-resolve02.f90 b/test/Semantics/omp-resolve02.f90
index f16c51a..0bbf779 100644
--- a/test/Semantics/omp-resolve02.f90
+++ b/test/Semantics/omp-resolve02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! Test the effect to name resolution from illegal clause
 
diff --git a/test/Semantics/omp-resolve03.f90 b/test/Semantics/omp-resolve03.f90
index 6efb70d..58fc4d5 100644
--- a/test/Semantics/omp-resolve03.f90
+++ b/test/Semantics/omp-resolve03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! 2.15.3 Although variables in common blocks can be accessed by use association
 ! or host association, common block names cannot. As a result, a common block
diff --git a/test/Semantics/omp-resolve04.f90 b/test/Semantics/omp-resolve04.f90
index 6082276..147dc1a 100644
--- a/test/Semantics/omp-resolve04.f90
+++ b/test/Semantics/omp-resolve04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! 2.15.3 Data-Sharing Attribute Clauses
 ! A list item that specifies a given variable may not appear in more than
diff --git a/test/Semantics/omp-resolve05.f90 b/test/Semantics/omp-resolve05.f90
index 580f8a1..a54feae 100644
--- a/test/Semantics/omp-resolve05.f90
+++ b/test/Semantics/omp-resolve05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! 2.15.3 Data-Sharing Attribute Clauses
 ! 2.15.3.1 default Clause
diff --git a/test/Semantics/omp-resolve06.f90 b/test/Semantics/omp-resolve06.f90
index 87191b6..4711b00 100644
--- a/test/Semantics/omp-resolve06.f90
+++ b/test/Semantics/omp-resolve06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 use omp_lib
 !2.11.4 Allocate Clause
 !For any list item that is specified in the allocate
diff --git a/test/Semantics/omp-sections01.f90 b/test/Semantics/omp-sections01.f90
index 0a40337..4ea7593 100644
--- a/test/Semantics/omp-sections01.f90
+++ b/test/Semantics/omp-sections01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! OpenMP Version 4.5
 ! 2.7.2 sections Construct
diff --git a/test/Semantics/omp-simd-aligned.f90 b/test/Semantics/omp-simd-aligned.f90
index f4424aa..3870e21 100644
--- a/test/Semantics/omp-simd-aligned.f90
+++ b/test/Semantics/omp-simd-aligned.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! OpenMP Version 4.5
 ! 2.8.1 simd Construct
diff --git a/test/Semantics/omp-simd02.f90 b/test/Semantics/omp-simd02.f90
index dcaed43..0ac71c6 100644
--- a/test/Semantics/omp-simd02.f90
+++ b/test/Semantics/omp-simd02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! OpenMP Version 4.5
 ! 2.8.1 simd Construct
diff --git a/test/Semantics/omp-single01.f90 b/test/Semantics/omp-single01.f90
index 07b827b..a129409 100644
--- a/test/Semantics/omp-single01.f90
+++ b/test/Semantics/omp-single01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.3 single Construct
 ! Symbol present on multiple clauses
diff --git a/test/Semantics/omp-single02.f90 b/test/Semantics/omp-single02.f90
index e39ce25..cd80e7c 100644
--- a/test/Semantics/omp-single02.f90
+++ b/test/Semantics/omp-single02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1 -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.3 single Construct
 ! Copyprivate variable is not thread private or private in outer context
diff --git a/test/Semantics/omp-taskgroup01.f90 b/test/Semantics/omp-taskgroup01.f90
index c8de9f2..c220c66 100644
--- a/test/Semantics/omp-taskgroup01.f90
+++ b/test/Semantics/omp-taskgroup01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 use omp_lib
   implicit none
diff --git a/test/Semantics/omp-taskloop-simd01.f90 b/test/Semantics/omp-taskloop-simd01.f90
index 7cfa384..e0ca7cf 100644
--- a/test/Semantics/omp-taskloop-simd01.f90
+++ b/test/Semantics/omp-taskloop-simd01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 
 ! OpenMP Version 5.0
 ! 2.10.3 taskloop simd Construct
diff --git a/test/Semantics/omp-taskloop01.f90 b/test/Semantics/omp-taskloop01.f90
index 699d4c9..14be62e 100644
--- a/test/Semantics/omp-taskloop01.f90
+++ b/test/Semantics/omp-taskloop01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.9.2 taskloop Construct
 
diff --git a/test/Semantics/omp-workshare01.f90 b/test/Semantics/omp-workshare01.f90
index 0b6a3a1..52d65bb 100644
--- a/test/Semantics/omp-workshare01.f90
+++ b/test/Semantics/omp-workshare01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.4 workshare Construct
 ! Invalid do construct inside !$omp workshare
diff --git a/test/Semantics/omp-workshare02.f90 b/test/Semantics/omp-workshare02.f90
index 996c384..c53b323 100644
--- a/test/Semantics/omp-workshare02.f90
+++ b/test/Semantics/omp-workshare02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.4 workshare Construct
 ! The !omp workshare construct must not contain any user defined
diff --git a/test/Semantics/omp-workshare03.f90 b/test/Semantics/omp-workshare03.f90
index 1c6e00d..e8e2241 100644
--- a/test/Semantics/omp-workshare03.f90
+++ b/test/Semantics/omp-workshare03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.4 workshare Construct
 ! All array assignments, scalar assignments, and masked array assignments
diff --git a/test/Semantics/omp-workshare04.f90 b/test/Semantics/omp-workshare04.f90
index 745dc9f..0c1e2b1 100644
--- a/test/Semantics/omp-workshare04.f90
+++ b/test/Semantics/omp-workshare04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.4 workshare Construct
 ! Checks for OpenMP Workshare construct
diff --git a/test/Semantics/omp-workshare05.f90 b/test/Semantics/omp-workshare05.f90
index 5f73119..70a8426 100644
--- a/test/Semantics/omp-workshare05.f90
+++ b/test/Semantics/omp-workshare05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -fopenmp
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -fopenmp
 ! OpenMP Version 4.5
 ! 2.7.4 workshare Construct
 ! Checks for OpenMP Parallel constructs enclosed in Workshare constructs
diff --git a/test/Semantics/random-seed.f90 b/test/Semantics/random-seed.f90
index defc0af..20e3088 100644
--- a/test/Semantics/random-seed.f90
+++ b/test/Semantics/random-seed.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! NULL() intrinsic function error tests
 program test_random_seed
   integer :: size_arg
diff --git a/test/Semantics/reshape.f90 b/test/Semantics/reshape.f90
index 4077e72..8113bff 100644
--- a/test/Semantics/reshape.f90
+++ b/test/Semantics/reshape.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 !Tests for RESHAPE
 program reshaper
diff --git a/test/Semantics/resolve01.f90 b/test/Semantics/resolve01.f90
index 09066a2..7a79994 100644
--- a/test/Semantics/resolve01.f90
+++ b/test/Semantics/resolve01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 integer :: x
 !ERROR: The type of 'x' has already been declared
 real :: x
diff --git a/test/Semantics/resolve02.f90 b/test/Semantics/resolve02.f90
index a66e8b5..3323866 100644
--- a/test/Semantics/resolve02.f90
+++ b/test/Semantics/resolve02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s
   !ERROR: Declaration of 'x' conflicts with its use as internal procedure
   real :: x
diff --git a/test/Semantics/resolve03.f90 b/test/Semantics/resolve03.f90
index 4fbc616..2593779 100644
--- a/test/Semantics/resolve03.f90
+++ b/test/Semantics/resolve03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 implicit none
 integer :: x
 !ERROR: No explicit type declared for 'y'
diff --git a/test/Semantics/resolve04.f90 b/test/Semantics/resolve04.f90
index 3bcd614..890a901 100644
--- a/test/Semantics/resolve04.f90
+++ b/test/Semantics/resolve04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 !ERROR: No explicit type declared for 'f'
 function f()
   implicit none
diff --git a/test/Semantics/resolve05.f90 b/test/Semantics/resolve05.f90
index 34c88a7..5c045aa 100644
--- a/test/Semantics/resolve05.f90
+++ b/test/Semantics/resolve05.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 program p
   integer :: p ! this is ok
 end
diff --git a/test/Semantics/resolve06.f90 b/test/Semantics/resolve06.f90
index b2a385b..8c324a9 100644
--- a/test/Semantics/resolve06.f90
+++ b/test/Semantics/resolve06.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 implicit none
 allocatable :: x
 integer :: x
diff --git a/test/Semantics/resolve07.f90 b/test/Semantics/resolve07.f90
index e5dda5b..481094a 100644
--- a/test/Semantics/resolve07.f90
+++ b/test/Semantics/resolve07.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   integer :: x(2)
   !ERROR: The dimensions of 'x' have already been declared
diff --git a/test/Semantics/resolve08.f90 b/test/Semantics/resolve08.f90
index 2a7f68d..b485f4c 100644
--- a/test/Semantics/resolve08.f90
+++ b/test/Semantics/resolve08.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 integer :: g(10)
 f(i) = i + 1  ! statement function
 g(i) = i + 2  ! mis-parsed array assignment
diff --git a/test/Semantics/resolve09.f90 b/test/Semantics/resolve09.f90
index c669b60..2954b14 100644
--- a/test/Semantics/resolve09.f90
+++ b/test/Semantics/resolve09.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 integer :: y
 procedure() :: a
 procedure(real) :: b
diff --git a/test/Semantics/resolve10.f90 b/test/Semantics/resolve10.f90
index 740195d..4f2949b 100644
--- a/test/Semantics/resolve10.f90
+++ b/test/Semantics/resolve10.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   public
   type t
diff --git a/test/Semantics/resolve101.f90 b/test/Semantics/resolve101.f90
index 359807e..b1c259e 100644
--- a/test/Semantics/resolve101.f90
+++ b/test/Semantics/resolve101.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! Ensure that spurious errors do not arise from FinishSpecificationPart
 ! checking on a nested specification part.
diff --git a/test/Semantics/resolve102.f90 b/test/Semantics/resolve102.f90
index 77b5e10..07f12d7 100644
--- a/test/Semantics/resolve102.f90
+++ b/test/Semantics/resolve102.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! Tests for circularly defined procedures
 !ERROR: Procedure 'sub' is recursively defined.  Procedures in the cycle: 'sub', 'p2'
diff --git a/test/Semantics/resolve104.f90 b/test/Semantics/resolve104.f90
index 48fe965..3b5bea4 100644
--- a/test/Semantics/resolve104.f90
+++ b/test/Semantics/resolve104.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test constant folding of type parameter values both a base value and a
 ! parameter name are supplied.
 ! 
diff --git a/test/Semantics/resolve105.f90 b/test/Semantics/resolve105.f90
index 2e2feb8..ab294d4 100644
--- a/test/Semantics/resolve105.f90
+++ b/test/Semantics/resolve105.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test instantiation of components that are procedure pointers.
 ! 
 program test
diff --git a/test/Semantics/resolve11.f90 b/test/Semantics/resolve11.f90
index ec96727..2d93c63 100644
--- a/test/Semantics/resolve11.f90
+++ b/test/Semantics/resolve11.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   public i
   integer, private :: j
diff --git a/test/Semantics/resolve12.f90 b/test/Semantics/resolve12.f90
index a04d7e6..aa9dbd7 100644
--- a/test/Semantics/resolve12.f90
+++ b/test/Semantics/resolve12.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m1
 end
 
diff --git a/test/Semantics/resolve13.f90 b/test/Semantics/resolve13.f90
index a5647d0..1d7ec1a 100644
--- a/test/Semantics/resolve13.f90
+++ b/test/Semantics/resolve13.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m1
   integer :: x
   integer, private :: y
diff --git a/test/Semantics/resolve14.f90 b/test/Semantics/resolve14.f90
index c69b4d6..67cb5b2 100644
--- a/test/Semantics/resolve14.f90
+++ b/test/Semantics/resolve14.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m1
   integer :: x
   integer :: y
diff --git a/test/Semantics/resolve15.f90 b/test/Semantics/resolve15.f90
index f3bc8be..3a2f3d7 100644
--- a/test/Semantics/resolve15.f90
+++ b/test/Semantics/resolve15.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   real :: var
   interface i
diff --git a/test/Semantics/resolve16.f90 b/test/Semantics/resolve16.f90
index 775af38..d5725f6 100644
--- a/test/Semantics/resolve16.f90
+++ b/test/Semantics/resolve16.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   interface
     subroutine sub0
diff --git a/test/Semantics/resolve17.f90 b/test/Semantics/resolve17.f90
index 064340d..96ab5cd 100644
--- a/test/Semantics/resolve17.f90
+++ b/test/Semantics/resolve17.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   integer :: foo
   !Note: PGI, Intel, and GNU allow this; NAG and Sun do not
diff --git a/test/Semantics/resolve18.f90 b/test/Semantics/resolve18.f90
index c917a68..1f59794 100644
--- a/test/Semantics/resolve18.f90
+++ b/test/Semantics/resolve18.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m1
   implicit none
 contains
diff --git a/test/Semantics/resolve19.f90 b/test/Semantics/resolve19.f90
index 7f2252e..d3bd38d 100644
--- a/test/Semantics/resolve19.f90
+++ b/test/Semantics/resolve19.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   interface a
     subroutine s(x)
diff --git a/test/Semantics/resolve20.f90 b/test/Semantics/resolve20.f90
index 6908aeb..4d1c638 100644
--- a/test/Semantics/resolve20.f90
+++ b/test/Semantics/resolve20.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   abstract interface
     subroutine foo
diff --git a/test/Semantics/resolve21.f90 b/test/Semantics/resolve21.f90
index bee368c..3be7602 100644
--- a/test/Semantics/resolve21.f90
+++ b/test/Semantics/resolve21.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   type :: t
     integer :: i
diff --git a/test/Semantics/resolve22.f90 b/test/Semantics/resolve22.f90
index c35f057..6f2d009 100644
--- a/test/Semantics/resolve22.f90
+++ b/test/Semantics/resolve22.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   !OK: interface followed by type with same name
   interface t
diff --git a/test/Semantics/resolve23.f90 b/test/Semantics/resolve23.f90
index 8a876b0..5bb2691 100644
--- a/test/Semantics/resolve23.f90
+++ b/test/Semantics/resolve23.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   type :: t
     real :: y
diff --git a/test/Semantics/resolve24.f90 b/test/Semantics/resolve24.f90
index c6306fb..0b61a50 100644
--- a/test/Semantics/resolve24.f90
+++ b/test/Semantics/resolve24.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine test1
   !ERROR: Generic interface 'foo' has both a function and a subroutine
   interface foo
diff --git a/test/Semantics/resolve25.f90 b/test/Semantics/resolve25.f90
index e3fd2c2..9e717d5 100644
--- a/test/Semantics/resolve25.f90
+++ b/test/Semantics/resolve25.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   interface foo
     real function s1(x)
diff --git a/test/Semantics/resolve26.f90 b/test/Semantics/resolve26.f90
index 96c7eef..5e77cc4 100644
--- a/test/Semantics/resolve26.f90
+++ b/test/Semantics/resolve26.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m1
   interface
     module subroutine s()
diff --git a/test/Semantics/resolve27.f90 b/test/Semantics/resolve27.f90
index 83ad408..cda39ea 100644
--- a/test/Semantics/resolve27.f90
+++ b/test/Semantics/resolve27.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   interface
     module subroutine s()
diff --git a/test/Semantics/resolve28.f90 b/test/Semantics/resolve28.f90
index 2b5cc2f..d04e60a 100644
--- a/test/Semantics/resolve28.f90
+++ b/test/Semantics/resolve28.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s
   type t
   end type
diff --git a/test/Semantics/resolve29.f90 b/test/Semantics/resolve29.f90
index 96ec9d7..9e97569 100644
--- a/test/Semantics/resolve29.f90
+++ b/test/Semantics/resolve29.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   type t1
   end type
diff --git a/test/Semantics/resolve30.f90 b/test/Semantics/resolve30.f90
index f34ad5f..c594cce 100644
--- a/test/Semantics/resolve30.f90
+++ b/test/Semantics/resolve30.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   integer x
   block
diff --git a/test/Semantics/resolve31.f90 b/test/Semantics/resolve31.f90
index b99d081..57fa5e0 100644
--- a/test/Semantics/resolve31.f90
+++ b/test/Semantics/resolve31.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C735 If EXTENDS appears, SEQUENCE shall not appear.
 ! C738 The same private-or-sequence shall not appear more than once in a
 ! given derived-type-def .
diff --git a/test/Semantics/resolve32.f90 b/test/Semantics/resolve32.f90
index 542cd7e..060b29e 100644
--- a/test/Semantics/resolve32.f90
+++ b/test/Semantics/resolve32.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m2
   public s2, s4
   private s3
diff --git a/test/Semantics/resolve33.f90 b/test/Semantics/resolve33.f90
index 1144792..4b27a8d 100644
--- a/test/Semantics/resolve33.f90
+++ b/test/Semantics/resolve33.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Derived type parameters
 ! C731 The same type-param-name shall not appear more than once in a given
 ! derived-type-stmt.
diff --git a/test/Semantics/resolve34.f90 b/test/Semantics/resolve34.f90
index 9d816e5..e0c6168 100644
--- a/test/Semantics/resolve34.f90
+++ b/test/Semantics/resolve34.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Extended derived types
 
 module m1
diff --git a/test/Semantics/resolve35.f90 b/test/Semantics/resolve35.f90
index bbefe27..1dcfd06 100644
--- a/test/Semantics/resolve35.f90
+++ b/test/Semantics/resolve35.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Construct names
 
 subroutine s1
diff --git a/test/Semantics/resolve36.f90 b/test/Semantics/resolve36.f90
index ac8595c..bdb1b22 100644
--- a/test/Semantics/resolve36.f90
+++ b/test/Semantics/resolve36.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! C1568 The procedure-name shall have been declared to be a separate module
 ! procedure in the containing program unit or an ancestor of that program unit.
diff --git a/test/Semantics/resolve37.f90 b/test/Semantics/resolve37.f90
index 19c09fb..bd94e12 100644
--- a/test/Semantics/resolve37.f90
+++ b/test/Semantics/resolve37.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C701 The type-param-value for a kind type parameter shall be a constant
 ! expression.  This constraint looks like a mistake in the standard.
 integer, parameter :: k = 8
diff --git a/test/Semantics/resolve38.f90 b/test/Semantics/resolve38.f90
index 44f5f77..d1612eb 100644
--- a/test/Semantics/resolve38.f90
+++ b/test/Semantics/resolve38.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C772
 module m1
   type t1
diff --git a/test/Semantics/resolve39.f90 b/test/Semantics/resolve39.f90
index 6f27ab2..b456b3f 100644
--- a/test/Semantics/resolve39.f90
+++ b/test/Semantics/resolve39.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   implicit none
   real(8) :: x = 2.0
diff --git a/test/Semantics/resolve40.f90 b/test/Semantics/resolve40.f90
index 32d247d..331c5eb 100644
--- a/test/Semantics/resolve40.f90
+++ b/test/Semantics/resolve40.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   namelist /nl/x
   block
diff --git a/test/Semantics/resolve41.f90 b/test/Semantics/resolve41.f90
index 15eb1b9..d2a991c 100644
--- a/test/Semantics/resolve41.f90
+++ b/test/Semantics/resolve41.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
   implicit none
   real, parameter :: a = 8.0
diff --git a/test/Semantics/resolve42.f90 b/test/Semantics/resolve42.f90
index 6138a3e..a807d80 100644
--- a/test/Semantics/resolve42.f90
+++ b/test/Semantics/resolve42.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1
   !ERROR: Array 'z' without ALLOCATABLE or POINTER attribute must have explicit shape
   common x, y(4), z(:)
diff --git a/test/Semantics/resolve43.f90 b/test/Semantics/resolve43.f90
index 27677de..5555f5e 100644
--- a/test/Semantics/resolve43.f90
+++ b/test/Semantics/resolve43.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Error tests for structure constructors.
 ! Errors caught by expression resolution are tested elsewhere; these are the
 ! errors meant to be caught by name resolution, as well as acceptable use
diff --git a/test/Semantics/resolve44.f90 b/test/Semantics/resolve44.f90
index 34c4d81..a251840 100644
--- a/test/Semantics/resolve44.f90
+++ b/test/Semantics/resolve44.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Error tests for recursive use of derived types.
 ! C744 If neither the POINTER nor the ALLOCATABLE attribute is specified, the
 ! declaration-type-spec in the component-def-stmt shall specify an intrinsic
diff --git a/test/Semantics/resolve45.f90 b/test/Semantics/resolve45.f90
index fb9ef37..b3a09d2 100644
--- a/test/Semantics/resolve45.f90
+++ b/test/Semantics/resolve45.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 function f1(x, y)
   integer x
   !ERROR: SAVE attribute may not be applied to dummy argument 'x'
diff --git a/test/Semantics/resolve46.f90 b/test/Semantics/resolve46.f90
index c762435..716d72f 100644
--- a/test/Semantics/resolve46.f90
+++ b/test/Semantics/resolve46.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C1030 - pointers to intrinsic procedures
 program main
   intrinsic :: cos ! a specific & generic intrinsic name
diff --git a/test/Semantics/resolve47.f90 b/test/Semantics/resolve47.f90
index 339fc61..b839cf9 100644
--- a/test/Semantics/resolve47.f90
+++ b/test/Semantics/resolve47.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m1
   !ERROR: Logical constant '.true.' may not be used as a defined operator
   interface operator(.TRUE.)
diff --git a/test/Semantics/resolve48.f90 b/test/Semantics/resolve48.f90
index 66e1eaa..e4e35c7 100644
--- a/test/Semantics/resolve48.f90
+++ b/test/Semantics/resolve48.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test correct use-association of a derived type.
 module m1
   implicit none
diff --git a/test/Semantics/resolve49.f90 b/test/Semantics/resolve49.f90
index 424f99a..8a6a09b 100644
--- a/test/Semantics/resolve49.f90
+++ b/test/Semantics/resolve49.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test section subscript
 program p1
   real :: a(10,10)
diff --git a/test/Semantics/resolve50.f90 b/test/Semantics/resolve50.f90
index a23cd19..cc4dc03 100644
--- a/test/Semantics/resolve50.f90
+++ b/test/Semantics/resolve50.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test coarray association in CHANGE TEAM statement
 
 subroutine s1
diff --git a/test/Semantics/resolve51.f90 b/test/Semantics/resolve51.f90
index 4e8ab5e..232d8bc 100644
--- a/test/Semantics/resolve51.f90
+++ b/test/Semantics/resolve51.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test SELECT TYPE errors: C1157
 
 subroutine s1()
diff --git a/test/Semantics/resolve52.f90 b/test/Semantics/resolve52.f90
index c69fa68..c9ee0b8 100644
--- a/test/Semantics/resolve52.f90
+++ b/test/Semantics/resolve52.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests for C760:
 ! The passed-object dummy argument shall be a scalar, nonpointer, nonallocatable
 ! dummy data object with the same declared type as the type being defined;
diff --git a/test/Semantics/resolve53.f90 b/test/Semantics/resolve53.f90
index 357a9d0..d871848 100644
--- a/test/Semantics/resolve53.f90
+++ b/test/Semantics/resolve53.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! 15.4.3.4.5 Restrictions on generic declarations
 ! Specific procedures of generic interfaces must be distinguishable.
 
diff --git a/test/Semantics/resolve54.f90 b/test/Semantics/resolve54.f90
index bb53d05..8f48e3f 100644
--- a/test/Semantics/resolve54.f90
+++ b/test/Semantics/resolve54.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests based on examples in C.10.6
 
 ! C.10.6(10)
diff --git a/test/Semantics/resolve55.f90 b/test/Semantics/resolve55.f90
index b66099d..1133e79 100644
--- a/test/Semantics/resolve55.f90
+++ b/test/Semantics/resolve55.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests for C1128:
 ! A variable-name that appears in a LOCAL or LOCAL_INIT locality-spec shall not
 ! have the ALLOCATABLE; INTENT (IN); or OPTIONAL attribute; shall not be of
diff --git a/test/Semantics/resolve56.f90 b/test/Semantics/resolve56.f90
index 0de93ef..e92a43d 100644
--- a/test/Semantics/resolve56.f90
+++ b/test/Semantics/resolve56.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test that associations constructs can be correctly combined. The intrinsic
 ! functions are not what is tested here, they are only use to reveal the types
 ! of local variables.
diff --git a/test/Semantics/resolve57.f90 b/test/Semantics/resolve57.f90
index 2b917b8..526bdc5 100644
--- a/test/Semantics/resolve57.f90
+++ b/test/Semantics/resolve57.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests for the last sentence of C1128:
 !A variable-name that is not permitted to appear in a variable definition
 !context shall not appear in a LOCAL or LOCAL_INIT locality-spec.
diff --git a/test/Semantics/resolve58.f90 b/test/Semantics/resolve58.f90
index 7444379..447e14a 100644
--- a/test/Semantics/resolve58.f90
+++ b/test/Semantics/resolve58.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1(x, y)
   !ERROR: Array pointer 'x' must have deferred shape or assumed rank
   real, pointer :: x(1:)  ! C832
diff --git a/test/Semantics/resolve59.f90 b/test/Semantics/resolve59.f90
index 09085fa..0eeb117 100644
--- a/test/Semantics/resolve59.f90
+++ b/test/Semantics/resolve59.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Testing 15.6.2.2 point 4 (What function-name refers to depending on the
 ! presence of RESULT).
 
diff --git a/test/Semantics/resolve60.f90 b/test/Semantics/resolve60.f90
index 336d8e9..bf81db6 100644
--- a/test/Semantics/resolve60.f90
+++ b/test/Semantics/resolve60.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Testing 7.6 enum
 
   ! OK
diff --git a/test/Semantics/resolve61.f90 b/test/Semantics/resolve61.f90
index 031aee2..7fa7998 100644
--- a/test/Semantics/resolve61.f90
+++ b/test/Semantics/resolve61.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 program p1
   integer(8) :: a, b, c, d
   pointer(a, b)
diff --git a/test/Semantics/resolve62.f90 b/test/Semantics/resolve62.f90
index 7de82d4..ef565dd 100644
--- a/test/Semantics/resolve62.f90
+++ b/test/Semantics/resolve62.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Resolve generic based on number of arguments
 subroutine s1
   interface f
diff --git a/test/Semantics/resolve63.f90 b/test/Semantics/resolve63.f90
index 2d38e90..adc3010 100644
--- a/test/Semantics/resolve63.f90
+++ b/test/Semantics/resolve63.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Invalid operand types when user-defined operator is available
 module m1
   type :: t
diff --git a/test/Semantics/resolve64.f90 b/test/Semantics/resolve64.f90
index 40d16ce..5a6bdc1 100644
--- a/test/Semantics/resolve64.f90
+++ b/test/Semantics/resolve64.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang -flogical-abbreviations -fxor-operator
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang -flogical-abbreviations -fxor-operator
 
 ! Like m4 in resolve63 but compiled with different options.
 ! Alternate operators are enabled so treat these as intrinsic.
diff --git a/test/Semantics/resolve65.f90 b/test/Semantics/resolve65.f90
index 701c53a..d1fb26d 100644
--- a/test/Semantics/resolve65.f90
+++ b/test/Semantics/resolve65.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test restrictions on what subprograms can be used for defined assignment.
 
 module m1
diff --git a/test/Semantics/resolve66.f90 b/test/Semantics/resolve66.f90
index 7474f7f..acc4701 100644
--- a/test/Semantics/resolve66.f90
+++ b/test/Semantics/resolve66.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test that user-defined assignment is used in the right places
 
 module m1
diff --git a/test/Semantics/resolve67.f90 b/test/Semantics/resolve67.f90
index 2c554af..6ecc738 100644
--- a/test/Semantics/resolve67.f90
+++ b/test/Semantics/resolve67.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test restrictions on what subprograms can be used for defined operators.
 ! See: 15.4.3.4.2
 
diff --git a/test/Semantics/resolve68.f90 b/test/Semantics/resolve68.f90
index a88ab00..0221fbc 100644
--- a/test/Semantics/resolve68.f90
+++ b/test/Semantics/resolve68.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test resolution of type-bound generics.
 
 module m1
diff --git a/test/Semantics/resolve69.f90 b/test/Semantics/resolve69.f90
index f6ce5c7..e3f00e2 100644
--- a/test/Semantics/resolve69.f90
+++ b/test/Semantics/resolve69.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1()
   ! C701 (R701) The type-param-value for a kind type parameter shall be a
   ! constant expression.
diff --git a/test/Semantics/resolve70.f90 b/test/Semantics/resolve70.f90
index 60c488d..b01469c 100644
--- a/test/Semantics/resolve70.f90
+++ b/test/Semantics/resolve70.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C703 (R702) The derived-type-spec shall not specify an abstract type (7.5.7).
 ! This constraint refers to the derived-type-spec in a type-spec.  A type-spec
 ! can appear in an ALLOCATE statement, an ac-spec for an array constructor, and
diff --git a/test/Semantics/resolve71.f90 b/test/Semantics/resolve71.f90
index 5bdbbda..51e8f07 100644
--- a/test/Semantics/resolve71.f90
+++ b/test/Semantics/resolve71.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C708 An entity declared with the CLASS keyword shall be a dummy argument 
 ! or have the ALLOCATABLE or POINTER attribute.
 subroutine s()
diff --git a/test/Semantics/resolve72.f90 b/test/Semantics/resolve72.f90
index 6f70e9a..cf0d54a 100644
--- a/test/Semantics/resolve72.f90
+++ b/test/Semantics/resolve72.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C709 An assumed-type entity shall be a dummy data object that does not have 
 ! the ALLOCATABLE, CODIMENSION, INTENT (OUT), POINTER, or VALUE attribute and 
 ! is not an explicit-shape array.
diff --git a/test/Semantics/resolve73.f90 b/test/Semantics/resolve73.f90
index 9065696..1ec9f09 100644
--- a/test/Semantics/resolve73.f90
+++ b/test/Semantics/resolve73.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C721 A type-param-value of * shall be used only
 ! * to declare a dummy argument,
 ! * to declare a named constant,
diff --git a/test/Semantics/resolve74.f90 b/test/Semantics/resolve74.f90
index 12be78f..14d1c8a 100644
--- a/test/Semantics/resolve74.f90
+++ b/test/Semantics/resolve74.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C722 A function name shall not be declared with an asterisk type-param-value 
 ! unless it is of type CHARACTER and is the name of a dummy function or the 
 ! name of the result of an external function.
diff --git a/test/Semantics/resolve75.f90 b/test/Semantics/resolve75.f90
index 2326903..b0d9072 100644
--- a/test/Semantics/resolve75.f90
+++ b/test/Semantics/resolve75.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C726 The length specified for a character statement function or for a 
 ! statement function dummy argument of type character shall be a constant 
 ! expression.
diff --git a/test/Semantics/resolve76.f90 b/test/Semantics/resolve76.f90
index 2e594aa..6b182d1 100644
--- a/test/Semantics/resolve76.f90
+++ b/test/Semantics/resolve76.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! 15.6.2.5(3)
 
diff --git a/test/Semantics/resolve77.f90 b/test/Semantics/resolve77.f90
index 3c41384..d762781 100644
--- a/test/Semantics/resolve77.f90
+++ b/test/Semantics/resolve77.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests valid and invalid usage of forward references to procedures
 ! in specification expressions.
 module m
diff --git a/test/Semantics/resolve78.f90 b/test/Semantics/resolve78.f90
index 296c198..8c25f32 100644
--- a/test/Semantics/resolve78.f90
+++ b/test/Semantics/resolve78.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
 ! C743 No component-attr-spec shall appear more than once in a 
 ! given component-def-stmt.
diff --git a/test/Semantics/resolve79.f90 b/test/Semantics/resolve79.f90
index 8f828fc..037e107 100644
--- a/test/Semantics/resolve79.f90
+++ b/test/Semantics/resolve79.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
 ! C755 The same proc-component-attr-spec shall not appear more than once in a 
 ! given proc-component-def-stmt.
diff --git a/test/Semantics/resolve80.f90 b/test/Semantics/resolve80.f90
index dcc544f..e787a4b 100644
--- a/test/Semantics/resolve80.f90
+++ b/test/Semantics/resolve80.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
 !C778 The same binding-attr shall not appear more than once in a given
 !binding-attr-list.
diff --git a/test/Semantics/resolve81.f90 b/test/Semantics/resolve81.f90
index cd74e10..2a0b961 100644
--- a/test/Semantics/resolve81.f90
+++ b/test/Semantics/resolve81.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C801 The same attr-spec shall not appear more than once in a given
 ! type-declaration-stmt.
 !
diff --git a/test/Semantics/resolve82.f90 b/test/Semantics/resolve82.f90
index 461bd3c..ef216ab 100644
--- a/test/Semantics/resolve82.f90
+++ b/test/Semantics/resolve82.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C815 An entity shall not be explicitly given any attribute more than once in 
 ! a scoping unit.
 !
diff --git a/test/Semantics/resolve83.f90 b/test/Semantics/resolve83.f90
index 8d28f7f..fc18f28 100644
--- a/test/Semantics/resolve83.f90
+++ b/test/Semantics/resolve83.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
 
   ! For C1543
diff --git a/test/Semantics/resolve84.f90 b/test/Semantics/resolve84.f90
index 6a7ff3e..8562a0c 100644
--- a/test/Semantics/resolve84.f90
+++ b/test/Semantics/resolve84.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C729 A derived type type-name shall not be DOUBLEPRECISION or the same as 
 ! the name of any intrinsic type defined in this document.
 subroutine s()
diff --git a/test/Semantics/resolve85.f90 b/test/Semantics/resolve85.f90
index c1817b9..d1720bd 100644
--- a/test/Semantics/resolve85.f90
+++ b/test/Semantics/resolve85.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m
 ! C730 The same type-attr-spec shall not appear more than once in a given 
 ! derived-type-stmt.
diff --git a/test/Semantics/resolve86.f90 b/test/Semantics/resolve86.f90
index c4950b4..15969c7 100644
--- a/test/Semantics/resolve86.f90
+++ b/test/Semantics/resolve86.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C736 If EXTENDS appears and the type being defined has a coarray ultimate 
 ! component, its parent type shall have a coarray ultimate component.
 !
diff --git a/test/Semantics/resolve87.f90 b/test/Semantics/resolve87.f90
index abdc388..5275e6f 100644
--- a/test/Semantics/resolve87.f90
+++ b/test/Semantics/resolve87.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C737 If EXTENDS appears and the type being defined has a potential 
 ! subobject component of type EVENT_TYPE or LOCK_TYPE from the intrinsic 
 ! module ISO_FORTRAN_ENV, its parent type shall be EVENT_TYPE or LOCK_TYPE 
diff --git a/test/Semantics/resolve88.f90 b/test/Semantics/resolve88.f90
index a0cb96b..c02561f 100644
--- a/test/Semantics/resolve88.f90
+++ b/test/Semantics/resolve88.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C746, C747, and C748
 module m
   use ISO_FORTRAN_ENV
diff --git a/test/Semantics/resolve89.f90 b/test/Semantics/resolve89.f90
index f37ce1e..a15e545 100644
--- a/test/Semantics/resolve89.f90
+++ b/test/Semantics/resolve89.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C750 Each bound in the explicit-shape-spec shall be a specification
 ! expression in which there are no references to specification functions or
 ! the intrinsic functions ALLOCATED, ASSOCIATED, EXTENDS_TYPE_OF, PRESENT,
diff --git a/test/Semantics/resolve90.f90 b/test/Semantics/resolve90.f90
index c0aa420..1246734 100644
--- a/test/Semantics/resolve90.f90
+++ b/test/Semantics/resolve90.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Testing for pointer constant, along with :
 ! C751 A component shall not have both the ALLOCATABLE and POINTER attributes.
 ! C752 If the CONTIGUOUS attribute is specified, the component shall be an 
diff --git a/test/Semantics/resolve91.f90 b/test/Semantics/resolve91.f90
index 44b1dc5..f458823 100644
--- a/test/Semantics/resolve91.f90
+++ b/test/Semantics/resolve91.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests for duplicate definitions and initializations, mostly of procedures
 module m
   procedure(real), pointer :: p
diff --git a/test/Semantics/resolve92.f90 b/test/Semantics/resolve92.f90
index 4b7e795..a149454 100644
--- a/test/Semantics/resolve92.f90
+++ b/test/Semantics/resolve92.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 module m1
   implicit none
diff --git a/test/Semantics/resolve93.f90 b/test/Semantics/resolve93.f90
index 5454267..71e0e40 100644
--- a/test/Semantics/resolve93.f90
+++ b/test/Semantics/resolve93.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 subroutine s1()
   character(10) str
   character(10) str1
diff --git a/test/Semantics/resolve94.f90 b/test/Semantics/resolve94.f90
index bec63f3..e47ab4a 100644
--- a/test/Semantics/resolve94.f90
+++ b/test/Semantics/resolve94.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! C929   No specifier shall appear more than once in a given 
 !   image-selector-spec-list.
 ! C930 TEAM and TEAM_NUMBER shall not both appear in the same
diff --git a/test/Semantics/resolve95.f90 b/test/Semantics/resolve95.f90
index 38103c3..b3ddb2d 100644
--- a/test/Semantics/resolve95.f90
+++ b/test/Semantics/resolve95.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test SELECT TYPE and ASSOCIATE errors: C1103
 
 subroutine s1()
diff --git a/test/Semantics/resolve96.f90 b/test/Semantics/resolve96.f90
index 6cb6180..680d6b7 100644
--- a/test/Semantics/resolve96.f90
+++ b/test/Semantics/resolve96.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! Check distinguishability for specific procedures of defined operators and
 ! assignment. These are different from names because there a normal generic
diff --git a/test/Semantics/resolve97.f90 b/test/Semantics/resolve97.f90
index fff143e..f9f545e 100644
--- a/test/Semantics/resolve97.f90
+++ b/test/Semantics/resolve97.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! Check errors from illegal (10.1.12 para 2) forward references
 ! in specification expressions to entities declared later in the
diff --git a/test/Semantics/resolve98.f90 b/test/Semantics/resolve98.f90
index c5fe441..108bfda 100644
--- a/test/Semantics/resolve98.f90
+++ b/test/Semantics/resolve98.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Errors when comparing LOGICAL operands
 
 program testCompare
diff --git a/test/Semantics/resolve99.f90 b/test/Semantics/resolve99.f90
index ae10d56..a2dd41c 100644
--- a/test/Semantics/resolve99.f90
+++ b/test/Semantics/resolve99.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests for the index-name of a FORALL statement
 
 module m1
diff --git a/test/Semantics/save01.f90 b/test/Semantics/save01.f90
index beffcc9..2d435af 100644
--- a/test/Semantics/save01.f90
+++ b/test/Semantics/save01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 MODULE test
 SAVE
 CONTAINS
diff --git a/test/Semantics/select-rank.f90 b/test/Semantics/select-rank.f90
index 6058287..d0cd931 100644
--- a/test/Semantics/select-rank.f90
+++ b/test/Semantics/select-rank.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 !Tests for SELECT RANK Construct(R1148)
 program select_rank
diff --git a/test/Semantics/select-rank02.f90 b/test/Semantics/select-rank02.f90
index acf789c..b39a75c 100644
--- a/test/Semantics/select-rank02.f90
+++ b/test/Semantics/select-rank02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 !Shape analysis related tests for SELECT RANK Construct(R1148)
 program select_rank
diff --git a/test/Semantics/selecttype01.f90 b/test/Semantics/selecttype01.f90
index a564bd8..62b3504 100644
--- a/test/Semantics/selecttype01.f90
+++ b/test/Semantics/selecttype01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test for checking select type constraints,
 module m1
   use ISO_C_BINDING
diff --git a/test/Semantics/selecttype02.f90 b/test/Semantics/selecttype02.f90
index 3094250..54127c0 100644
--- a/test/Semantics/selecttype02.f90
+++ b/test/Semantics/selecttype02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 module m1
   use ISO_C_BINDING
   type shape
diff --git a/test/Semantics/selecttype03.f90 b/test/Semantics/selecttype03.f90
index c4f4143..73274e2 100644
--- a/test/Semantics/selecttype03.f90
+++ b/test/Semantics/selecttype03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test various conditions in C1158.
 implicit none
 
diff --git a/test/Semantics/separate-mp01.f90 b/test/Semantics/separate-mp01.f90
index 03b27e1..27bf2a2 100644
--- a/test/Semantics/separate-mp01.f90
+++ b/test/Semantics/separate-mp01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! case 1: ma_create_new_fun' was not declared a separate module procedure
 module m1
diff --git a/test/Semantics/separate-mp02.f90 b/test/Semantics/separate-mp02.f90
index 2c0ac61..576a3b4 100644
--- a/test/Semantics/separate-mp02.f90
+++ b/test/Semantics/separate-mp02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 
 ! When a module subprogram has the MODULE prefix the following must match
 ! with the corresponding separate module procedure interface body:
diff --git a/test/Semantics/shape.f90 b/test/Semantics/shape.f90
index 00c7bfd..f43b81f 100644
--- a/test/Semantics/shape.f90
+++ b/test/Semantics/shape.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Test comparisons that use the intrinsic SHAPE() as an operand
 program testShape
 contains
diff --git a/test/Semantics/spec-expr.f90 b/test/Semantics/spec-expr.f90
index c88483a..41e82d7 100644
--- a/test/Semantics/spec-expr.f90
+++ b/test/Semantics/spec-expr.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Tests for the 14 items that specify a "specification expression" in section
 ! 10.1.11
 
diff --git a/test/Semantics/stop01.f90 b/test/Semantics/stop01.f90
index 540cec5..cf7b005 100644
--- a/test/Semantics/stop01.f90
+++ b/test/Semantics/stop01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 program main
   implicit none
   integer :: i = -1
diff --git a/test/Semantics/structconst01.f90 b/test/Semantics/structconst01.f90
index c225d26..bdf400c 100644
--- a/test/Semantics/structconst01.f90
+++ b/test/Semantics/structconst01.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Error tests for structure constructors.
 ! Errors caught by name resolution are tested elsewhere; these are the
 ! errors meant to be caught by expression semantic analysis, as well as
diff --git a/test/Semantics/structconst02.f90 b/test/Semantics/structconst02.f90
index ff523c2..c3494b2 100644
--- a/test/Semantics/structconst02.f90
+++ b/test/Semantics/structconst02.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Error tests for structure constructors: per-component type
 ! (in)compatibility.
 
diff --git a/test/Semantics/structconst03.f90 b/test/Semantics/structconst03.f90
index 70694f0..64fc500 100644
--- a/test/Semantics/structconst03.f90
+++ b/test/Semantics/structconst03.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Error tests for structure constructors: C1594 violations
 ! from assigning globally-visible data to POINTER components.
 ! test/Semantics/structconst04.f90 is this same test without type
diff --git a/test/Semantics/structconst04.f90 b/test/Semantics/structconst04.f90
index 728a4c7..5a168fa 100644
--- a/test/Semantics/structconst04.f90
+++ b/test/Semantics/structconst04.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! Error tests for structure constructors: C1594 violations
 ! from assigning globally-visible data to POINTER components.
 ! This test is structconst03.f90 with the type parameters removed.
diff --git a/test/Semantics/test_errors.py b/test/Semantics/test_errors.py
new file mode 100755
index 0000000..ce176e2
--- /dev/null
+++ b/test/Semantics/test_errors.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+
+"""Compiles a source file and checks errors against those listed in the file.
+
+Parameters:
+    sys.argv[1]: a source file with contains the input and expected output
+    sys.argv[2]: the Flang frontend driver
+    sys.argv[3:]: Optional arguments to the Flang frontend driver"""
+
+import sys
+import re
+import tempfile
+import subprocess
+import common as cm
+
+from difflib import unified_diff
+
+cm.check_args(sys.argv)
+srcdir = cm.set_source(sys.argv[1])
+with open(srcdir, 'r') as f:
+    src = f.readlines()
+actual = ""
+expect = ""
+diffs = ""
+log = ""
+
+flang_fc1 = cm.set_executable(sys.argv[2])
+flang_fc1_args = sys.argv[3:]
+flang_fc1_options = "-fsyntax-only"
+
+# Compiles, and reads in the output from the compilation process
+cmd = [flang_fc1, *flang_fc1_args, flang_fc1_options, str(srcdir)]
+with tempfile.TemporaryDirectory() as tmpdir:
+    try:
+        proc = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+                              check=True, universal_newlines=True, cwd=tmpdir)
+    except subprocess.CalledProcessError as e:
+        log = e.stderr
+        if e.returncode >= 128:
+            print(f"{log}")
+            sys.exit(1)
+
+# Cleans up the output from the compilation process to be easier to process
+for line in log.split('\n'):
+    m = re.search(r"[^:]*:(\d+:).*(?:error:)(.*)", line)
+    if m:
+        actual += m.expand(r"\1\2\n")
+
+# Gets the expected errors and their line number
+errors = []
+for i, line in enumerate(src, 1):
+    m = re.search(r"(?:^\s*!ERROR: )(.*)", line)
+    if m:
+        errors.append(m.group(1))
+        continue
+    if errors:
+        for x in errors:
+            expect += f"{i}: {x}\n"
+        errors = []
+
+# Compares the expected errors with the compiler errors
+for line in unified_diff(actual.split("\n"), expect.split("\n"), n=0):
+    line = re.sub(r"(^\-)(\d+:)", r"\nactual at \g<2>", line)
+    line = re.sub(r"(^\+)(\d+:)", r"\nexpect at \g<2>", line)
+    diffs += line
+
+if diffs != "":
+    print(diffs)
+    print()
+    print("FAIL")
+    sys.exit(1)
+else:
+    print()
+    print("PASS")
+
diff --git a/test/Semantics/test_errors.sh b/test/Semantics/test_errors.sh
deleted file mode 100755
index 20486b3..0000000
--- a/test/Semantics/test_errors.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/usr/bin/env bash
-# Compile a source file and check errors against those listed in the file.
-# Change the compiler by setting the FLANG_FC1 environment variable.
-
-FLANG_FC1_OPTIONS="-fsyntax-only"
-srcdir=$(dirname $0)
-source $srcdir/common.sh
-[[ ! -f $src ]] && die "File not found: $src"
-
-log=$temp/log
-actual=$temp/actual
-expect=$temp/expect
-diffs=$temp/diffs
-
-cmd="$FLANG_FC1 $FLANG_FC1_OPTIONS $src"
-( cd $temp; $cmd ) > $log 2>&1
-if [[ $? -ge 128 ]]; then
-  cat $log
-  exit 1
-fi
-
-# $actual has errors from the compiler; $expect has them from !ERROR comments in source
-# Format both as "<line>: <text>" so they can be diffed.
-sed -n 's=^[^:]*:\([^:]*\):[^:]*: error: =\1: =p' $log > $actual
-awk '
-  BEGIN { FS = "!ERROR: "; }
-  /^ *!ERROR: / { errors[nerrors++] = $2; next; }
-  { for (i = 0; i < nerrors; ++i) printf "%d: %s\n", NR, errors[i]; nerrors = 0; }
-' $src > $expect
-
-if diff -U0 $actual $expect > $diffs; then
-  echo PASS
-else
-  echo "$cmd"
-  < $diffs \
-    sed -n -e 's/^-\([0-9]\)/actual at \1/p' -e 's/^+\([0-9]\)/expect at \1/p' \
-    | sort -n -k 3
-  die FAIL
-fi
diff --git a/test/Semantics/unpack.f90 b/test/Semantics/unpack.f90
index 71bd21c..32c313d 100644
--- a/test/Semantics/unpack.f90
+++ b/test/Semantics/unpack.f90
@@ -1,5 +1,4 @@
-! RUN: %S/test_errors.sh %s %t %flang_fc1
-! REQUIRES: shell
+! RUN: %python %S/test_errors.py %s %flang_fc1
 ! UNPACK() intrinsic function error tests
 program test_unpack
   integer, dimension(2) :: vector = [343, 512]