diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2019-10-08 10:49:27 +0000 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2019-10-08 12:49:27 +0200 |
commit | 8beaf167f7ca723101e87da432870b65ff521e99 (patch) | |
tree | 0cdde010d1a0ab9f25491e6c335f5b44ee220020 /gcc | |
parent | db4fd465197346f0023dc7821ba14da6987042c7 (diff) | |
download | gcc-8beaf167f7ca723101e87da432870b65ff521e99.zip gcc-8beaf167f7ca723101e87da432870b65ff521e99.tar.gz gcc-8beaf167f7ca723101e87da432870b65ff521e99.tar.bz2 |
Fortran - Improve OpenMP/OpenACC diagnostic
gcc/fortran/
* match.h (gfc_match_omp_eos_error): Renamed from gfc_match_omp_eos.
* openmp.c (gfc_match_omp_eos): Make static.
(gfc_match_omp_eos_error): New.
* parse.c (matchs, matchdo, matchds): Do as done for 'matcho' -
if error occurred after OpenMP/OpenACC directive matched, do not
try other directives.
(decode_oacc_directive, decode_omp_directive): Call new function
instead.
testsuite/
* gfortran.dg/goacc/continuation-free-form.f95: Update dg-error.
From-SVN: r276694
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/fortran/match.h | 2 | ||||
-rw-r--r-- | gcc/fortran/openmp.c | 13 | ||||
-rw-r--r-- | gcc/fortran/parse.c | 103 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/goacc/continuation-free-form.f95 | 4 |
6 files changed, 86 insertions, 51 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 6e98130..309d4ef 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2019-10-08 Tobias Burnus <tobias@codesourcery.com> + + * match.h (gfc_match_omp_eos_error): Renamed from gfc_match_omp_eos. + * openmp.c (gfc_match_omp_eos): Make static. + (gfc_match_omp_eos_error): New. + * parse.c (matchs, matchdo, matchds): Do as done for 'matcho' - + if error occurred after OpenMP/OpenACC directive matched, do not + try other directives. + (decode_oacc_directive, decode_omp_directive): Call new function + instead. + 2019-10-05 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/47045 diff --git a/gcc/fortran/match.h b/gcc/fortran/match.h index 1bd78b1..611d796 100644 --- a/gcc/fortran/match.h +++ b/gcc/fortran/match.h @@ -151,7 +151,7 @@ match gfc_match_oacc_exit_data (void); match gfc_match_oacc_routine (void); /* OpenMP directive matchers. */ -match gfc_match_omp_eos (void); +match gfc_match_omp_eos_error (void); match gfc_match_omp_atomic (void); match gfc_match_omp_barrier (void); match gfc_match_omp_cancel (void); diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c index 7df7384..cd28384 100644 --- a/gcc/fortran/openmp.c +++ b/gcc/fortran/openmp.c @@ -31,7 +31,7 @@ along with GCC; see the file COPYING3. If not see /* Match an end of OpenMP directive. End of OpenMP directive is optional whitespace, followed by '\n' or comment '!'. */ -match +static match gfc_match_omp_eos (void) { locus old_loc; @@ -57,6 +57,17 @@ gfc_match_omp_eos (void) return MATCH_NO; } +match +gfc_match_omp_eos_error (void) +{ + if (gfc_match_omp_eos() == MATCH_YES) + return MATCH_YES; + + gfc_error ("Unexpected junk at %C"); + return MATCH_ERROR; +} + + /* Free an omp_clauses structure. */ void diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 4d34345..03fc716 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -674,15 +674,15 @@ decode_oacc_directive (void) match ("declare", gfc_match_oacc_declare, ST_OACC_DECLARE); break; case 'e': - matcha ("end atomic", gfc_match_omp_eos, ST_OACC_END_ATOMIC); - matcha ("end data", gfc_match_omp_eos, ST_OACC_END_DATA); - matcha ("end host_data", gfc_match_omp_eos, ST_OACC_END_HOST_DATA); - matcha ("end kernels loop", gfc_match_omp_eos, ST_OACC_END_KERNELS_LOOP); - matcha ("end kernels", gfc_match_omp_eos, ST_OACC_END_KERNELS); - matcha ("end loop", gfc_match_omp_eos, ST_OACC_END_LOOP); - matcha ("end parallel loop", gfc_match_omp_eos, + matcha ("end atomic", gfc_match_omp_eos_error, ST_OACC_END_ATOMIC); + matcha ("end data", gfc_match_omp_eos_error, ST_OACC_END_DATA); + matcha ("end host_data", gfc_match_omp_eos_error, ST_OACC_END_HOST_DATA); + matcha ("end kernels loop", gfc_match_omp_eos_error, ST_OACC_END_KERNELS_LOOP); + matcha ("end kernels", gfc_match_omp_eos_error, ST_OACC_END_KERNELS); + matcha ("end loop", gfc_match_omp_eos_error, ST_OACC_END_LOOP); + matcha ("end parallel loop", gfc_match_omp_eos_error, ST_OACC_END_PARALLEL_LOOP); - matcha ("end parallel", gfc_match_omp_eos, ST_OACC_END_PARALLEL); + matcha ("end parallel", gfc_match_omp_eos_error, ST_OACC_END_PARALLEL); matcha ("enter data", gfc_match_oacc_enter_data, ST_OACC_ENTER_DATA); matcha ("exit data", gfc_match_oacc_exit_data, ST_OACC_EXIT_DATA); break; @@ -738,14 +738,17 @@ decode_oacc_directive (void) and if spec_only, goto do_spec_only without actually matching. */ #define matchs(keyword, subr, st) \ do { \ + match m2; \ if (spec_only && gfc_match (keyword) == MATCH_YES) \ goto do_spec_only; \ - if (match_word_omp_simd (keyword, subr, &old_locus, \ - &simd_matched) == MATCH_YES) \ + if ((m2 = match_word_omp_simd (keyword, subr, &old_locus, \ + &simd_matched)) == MATCH_YES) \ { \ ret = st; \ goto finish; \ } \ + else if (m2 == MATCH_ERROR) \ + goto error_handling; \ else \ undo_new_statement (); \ } while (0) @@ -776,12 +779,15 @@ decode_oacc_directive (void) /* Like match, but set a flag simd_matched if keyword matched. */ #define matchds(keyword, subr, st) \ do { \ - if (match_word_omp_simd (keyword, subr, &old_locus, \ - &simd_matched) == MATCH_YES) \ + match m2; \ + if ((m2 = match_word_omp_simd (keyword, subr, &old_locus, \ + &simd_matched)) == MATCH_YES) \ { \ ret = st; \ goto finish; \ } \ + else if (m2 == MATCH_ERROR) \ + goto error_handling; \ else \ undo_new_statement (); \ } while (0) @@ -789,14 +795,17 @@ decode_oacc_directive (void) /* Like match, but don't match anything if not -fopenmp. */ #define matchdo(keyword, subr, st) \ do { \ + match m2; \ if (!flag_openmp) \ ; \ - else if (match_word (keyword, subr, &old_locus) \ + else if ((m2 = match_word (keyword, subr, &old_locus)) \ == MATCH_YES) \ { \ ret = st; \ goto finish; \ } \ + else if (m2 == MATCH_ERROR) \ + goto error_handling; \ else \ undo_new_statement (); \ } while (0) @@ -889,63 +898,63 @@ decode_omp_directive (void) matcho ("do", gfc_match_omp_do, ST_OMP_DO); break; case 'e': - matcho ("end atomic", gfc_match_omp_eos, ST_OMP_END_ATOMIC); + matcho ("end atomic", gfc_match_omp_eos_error, ST_OMP_END_ATOMIC); matcho ("end critical", gfc_match_omp_end_critical, ST_OMP_END_CRITICAL); - matchs ("end distribute parallel do simd", gfc_match_omp_eos, + matchs ("end distribute parallel do simd", gfc_match_omp_eos_error, ST_OMP_END_DISTRIBUTE_PARALLEL_DO_SIMD); - matcho ("end distribute parallel do", gfc_match_omp_eos, + matcho ("end distribute parallel do", gfc_match_omp_eos_error, ST_OMP_END_DISTRIBUTE_PARALLEL_DO); - matchs ("end distribute simd", gfc_match_omp_eos, + matchs ("end distribute simd", gfc_match_omp_eos_error, ST_OMP_END_DISTRIBUTE_SIMD); - matcho ("end distribute", gfc_match_omp_eos, ST_OMP_END_DISTRIBUTE); + matcho ("end distribute", gfc_match_omp_eos_error, ST_OMP_END_DISTRIBUTE); matchs ("end do simd", gfc_match_omp_end_nowait, ST_OMP_END_DO_SIMD); matcho ("end do", gfc_match_omp_end_nowait, ST_OMP_END_DO); - matchs ("end simd", gfc_match_omp_eos, ST_OMP_END_SIMD); - matcho ("end master", gfc_match_omp_eos, ST_OMP_END_MASTER); - matchs ("end ordered", gfc_match_omp_eos, ST_OMP_END_ORDERED); - matchs ("end parallel do simd", gfc_match_omp_eos, + matchs ("end simd", gfc_match_omp_eos_error, ST_OMP_END_SIMD); + matcho ("end master", gfc_match_omp_eos_error, ST_OMP_END_MASTER); + matchs ("end ordered", gfc_match_omp_eos_error, ST_OMP_END_ORDERED); + matchs ("end parallel do simd", gfc_match_omp_eos_error, ST_OMP_END_PARALLEL_DO_SIMD); - matcho ("end parallel do", gfc_match_omp_eos, ST_OMP_END_PARALLEL_DO); - matcho ("end parallel sections", gfc_match_omp_eos, + matcho ("end parallel do", gfc_match_omp_eos_error, ST_OMP_END_PARALLEL_DO); + matcho ("end parallel sections", gfc_match_omp_eos_error, ST_OMP_END_PARALLEL_SECTIONS); - matcho ("end parallel workshare", gfc_match_omp_eos, + matcho ("end parallel workshare", gfc_match_omp_eos_error, ST_OMP_END_PARALLEL_WORKSHARE); - matcho ("end parallel", gfc_match_omp_eos, ST_OMP_END_PARALLEL); + matcho ("end parallel", gfc_match_omp_eos_error, ST_OMP_END_PARALLEL); matcho ("end sections", gfc_match_omp_end_nowait, ST_OMP_END_SECTIONS); matcho ("end single", gfc_match_omp_end_single, ST_OMP_END_SINGLE); - matcho ("end target data", gfc_match_omp_eos, ST_OMP_END_TARGET_DATA); - matchs ("end target parallel do simd", gfc_match_omp_eos, + matcho ("end target data", gfc_match_omp_eos_error, ST_OMP_END_TARGET_DATA); + matchs ("end target parallel do simd", gfc_match_omp_eos_error, ST_OMP_END_TARGET_PARALLEL_DO_SIMD); - matcho ("end target parallel do", gfc_match_omp_eos, + matcho ("end target parallel do", gfc_match_omp_eos_error, ST_OMP_END_TARGET_PARALLEL_DO); - matcho ("end target parallel", gfc_match_omp_eos, + matcho ("end target parallel", gfc_match_omp_eos_error, ST_OMP_END_TARGET_PARALLEL); - matchs ("end target simd", gfc_match_omp_eos, ST_OMP_END_TARGET_SIMD); + matchs ("end target simd", gfc_match_omp_eos_error, ST_OMP_END_TARGET_SIMD); matchs ("end target teams distribute parallel do simd", - gfc_match_omp_eos, + gfc_match_omp_eos_error, ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); - matcho ("end target teams distribute parallel do", gfc_match_omp_eos, + matcho ("end target teams distribute parallel do", gfc_match_omp_eos_error, ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO); - matchs ("end target teams distribute simd", gfc_match_omp_eos, + matchs ("end target teams distribute simd", gfc_match_omp_eos_error, ST_OMP_END_TARGET_TEAMS_DISTRIBUTE_SIMD); - matcho ("end target teams distribute", gfc_match_omp_eos, + matcho ("end target teams distribute", gfc_match_omp_eos_error, ST_OMP_END_TARGET_TEAMS_DISTRIBUTE); - matcho ("end target teams", gfc_match_omp_eos, ST_OMP_END_TARGET_TEAMS); - matcho ("end target", gfc_match_omp_eos, ST_OMP_END_TARGET); - matcho ("end taskgroup", gfc_match_omp_eos, ST_OMP_END_TASKGROUP); - matchs ("end taskloop simd", gfc_match_omp_eos, + matcho ("end target teams", gfc_match_omp_eos_error, ST_OMP_END_TARGET_TEAMS); + matcho ("end target", gfc_match_omp_eos_error, ST_OMP_END_TARGET); + matcho ("end taskgroup", gfc_match_omp_eos_error, ST_OMP_END_TASKGROUP); + matchs ("end taskloop simd", gfc_match_omp_eos_error, ST_OMP_END_TASKLOOP_SIMD); - matcho ("end taskloop", gfc_match_omp_eos, ST_OMP_END_TASKLOOP); - matcho ("end task", gfc_match_omp_eos, ST_OMP_END_TASK); - matchs ("end teams distribute parallel do simd", gfc_match_omp_eos, + matcho ("end taskloop", gfc_match_omp_eos_error, ST_OMP_END_TASKLOOP); + matcho ("end task", gfc_match_omp_eos_error, ST_OMP_END_TASK); + matchs ("end teams distribute parallel do simd", gfc_match_omp_eos_error, ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD); - matcho ("end teams distribute parallel do", gfc_match_omp_eos, + matcho ("end teams distribute parallel do", gfc_match_omp_eos_error, ST_OMP_END_TEAMS_DISTRIBUTE_PARALLEL_DO); - matchs ("end teams distribute simd", gfc_match_omp_eos, + matchs ("end teams distribute simd", gfc_match_omp_eos_error, ST_OMP_END_TEAMS_DISTRIBUTE_SIMD); - matcho ("end teams distribute", gfc_match_omp_eos, + matcho ("end teams distribute", gfc_match_omp_eos_error, ST_OMP_END_TEAMS_DISTRIBUTE); - matcho ("end teams", gfc_match_omp_eos, ST_OMP_END_TEAMS); + matcho ("end teams", gfc_match_omp_eos_error, ST_OMP_END_TEAMS); matcho ("end workshare", gfc_match_omp_end_nowait, ST_OMP_END_WORKSHARE); break; @@ -979,7 +988,7 @@ decode_omp_directive (void) break; case 's': matcho ("sections", gfc_match_omp_sections, ST_OMP_SECTIONS); - matcho ("section", gfc_match_omp_eos, ST_OMP_SECTION); + matcho ("section", gfc_match_omp_eos_error, ST_OMP_SECTION); matcho ("single", gfc_match_omp_single, ST_OMP_SINGLE); break; case 't': diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a7c5bc7..f4819f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-10-08 Tobias Burnus <tobias@codesourcery.com> + + * gfortran.dg/goacc/continuation-free-form.f95: Update dg-error. + 2019-10-08 Richard Sandiford <richard.sandiford@arm.com> * gcc.target/aarch64/torture/simd-abi-9.c: Require LP64 for diff --git a/gcc/testsuite/gfortran.dg/goacc/continuation-free-form.f95 b/gcc/testsuite/gfortran.dg/goacc/continuation-free-form.f95 index 1c9a3f3..b904f7b 100644 --- a/gcc/testsuite/gfortran.dg/goacc/continuation-free-form.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/continuation-free-form.f95 @@ -16,8 +16,8 @@ program test x = x + 0.3 enddo ! continuation must begin with sentinel - !$acc end parallel & ! { dg-error "Unclassifiable OpenACC directive" } + !$acc end parallel & ! { dg-error "Unexpected junk" } ! loop print *, x -end
\ No newline at end of file +end |