This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [GOMP4, OpenACC] Fixed-form Fortran code failing to parse
- From: Cesar Philippidis <cesar at codesourcery dot com>
- To: Thomas Schwinge <thomas at codesourcery dot com>, <i dot usmanov at samsung dot com>, <e dot gavrin at samsung dot com>, <v dot garbuzov at samsung dot com>, <dmitry dot b at samsung dot com>, <jnorris at codesourcery dot com>
- Cc: <fortran at gcc dot gnu dot org>, <burnus at net-b dot de>, "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 7 Jul 2014 20:02:25 -0700
- Subject: Re: [GOMP4, OpenACC] Fixed-form Fortran code failing to parse
- Authentication-results: sourceware.org; auth=none
- References: <87tx6zvs5c dot fsf at schwinge dot name> <87simhtt3z dot fsf at schwinge dot name>
On 07/04/2014 01:40 AM, Thomas Schwinge wrote:
> On Wed, 02 Jul 2014 14:53:19 +0200, I wrote:
>> I understand the attached fixed.f to be well-formed fixed-form Fortran
>> code, but it fails to parse in OpenACC mode:
>
> The legacy of Fortran ;-) strikes again:
>
> $ gcc/xgcc -Bgcc/ -Bx86_64-unknown-linux-gnu/lib{gomp,gfortran}/ -Bx86_64-unknown-linux-gnu/lib{gomp,gfortran}/.libs -Ix86_64-unknown-linux-gnu/lib{gomp,gfortran} -I../source/lib{gomp,gfortran} -Lx86_64-unknown-linux-gnu/lib{gomp,gfortran}/.libs -Wl,-rpath,"$PWD"/x86_64-unknown-linux-gnu/lib{gomp,gfortran}/.libs ../../fixed-3.f -fopenacc -c
> ../../fixed-3.f:7.6:
>
> *$ACC END PARALLEL
> 1
> Error: Unclassifiable OpenACC directive at (1)
>
> ..., and again:
>
> $ gcc/xgcc -Bgcc/ -Bx86_64-unknown-linux-gnu/lib{gomp,gfortran}/ -Bx86_64-unknown-linux-gnu/lib{gomp,gfortran}/.libs -Ix86_64-unknown-linux-gnu/lib{gomp,gfortran} -I../source/lib{gomp,gfortran} -Lx86_64-unknown-linux-gnu/lib{gomp,gfortran}/.libs -Wl,-rpath,"$PWD"/x86_64-unknown-linux-gnu/lib{gomp,gfortran}/.libs ../../fixed-4.f -fopenacc -c
> ../../fixed-4.f:3.6:
>
> *$ACC PARALLEL
> 1
> Error: Unclassifiable OpenACC directive at (1)
>
> The corresponding OpenMP examples parse fine.
>
>
>> We should then also be adding some test coverage for fixed-form mode in
>> gcc/testsuite/gfortran.dg/goacc/.
Yeah. It doesn't look like there was any openacc testing in fixed-form
mode. This time, there were a couple of typos in scanner which caused
gfc_next_char and friends to fail when handling fixed-form comments.
There was also something being handled strangely in the parser, when I
went ahead and fixed. I think there may be a few more bugs lurking in
the fixed-form comment handling.
Thomas, is this OK for gomp-4_0-branch?
Cesar
2014-07-07 Cesar Philippidis <cesar@codesourcery.com>
gcc/fortran/
* parse.c (next_fixed): Don't handle openmp pragmas when scanning
for openacc pragmas.
* gcc/fortran/scanner.c (gfc_next_char_literal): Fix the scan for
*$acc.
gcc/testsuite/
* gfortran.dg/goacc/fixed-3.f:
* gfortran.dg/goacc/fixed-4.f:
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
index 9dd8099..c5e0d0a 100644
--- a/gcc/fortran/parse.c
+++ b/gcc/fortran/parse.c
@@ -1071,9 +1071,15 @@ next_fixed (void)
return ST_NONE;
return decode_omp_directive ();
}
- else if ((gfc_option.gfc_flag_openmp
- || gfc_option.gfc_flag_openmp_simd)
- && gfc_option.gfc_flag_openacc)
+ else if (gfc_option.gfc_flag_openacc
+ && !(gfc_option.gfc_flag_openmp
+ || gfc_option.gfc_flag_openmp_simd))
+ {
+ if (!verify_token_fixed ("acc", 3, last_was_use_stmt))
+ return ST_NONE;
+ return decode_oacc_directive ();
+ }
+ else
{
c = gfc_next_char_literal(NONSTRING);
if (c == 'o' || c == 'O')
@@ -1089,12 +1095,6 @@ next_fixed (void)
return decode_oacc_directive ();
}
}
- else if (gfc_option.gfc_flag_openacc)
- {
- if (!verify_token_fixed ("acc", 3, last_was_use_stmt))
- return ST_NONE;
- return decode_oacc_directive ();
- }
}
/* FALLTHROUGH */
diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c
index 5869d7d..1078f7b 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -1462,10 +1462,10 @@ restart:
goto not_continuation;
}
else if (openacc_flag)
- for (i = 0; i > 5; i++)
+ for (i = 0; i < 5; i++)
{
c = next_char ();
- if (gfc_wide_tolower (c) != (unsigned char) "*$omp"[i])
+ if (gfc_wide_tolower (c) != (unsigned char) "*$acc"[i])
goto not_continuation;
}
diff --git a/gcc/testsuite/gfortran.dg/goacc/fixed-3.f b/gcc/testsuite/gfortran.dg/goacc/fixed-3.f
new file mode 100644
index 0000000..ede361e
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/fixed-3.f
@@ -0,0 +1,13 @@
+ IMPLICIT NONE
+
+ INTEGER DEV
+
+!$ACC PARALLEL
+ DEV = 0
+!$ACC END PARALLEL
+
+!$ACC PARALLEL
+ DEV = 0
+!$ACC END PARALLEL
+
+ END
diff --git a/gcc/testsuite/gfortran.dg/goacc/fixed-4.f b/gcc/testsuite/gfortran.dg/goacc/fixed-4.f
new file mode 100644
index 0000000..120d5a9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/fixed-4.f
@@ -0,0 +1,6 @@
+ IMPLICIT NONE
+
+!$ACC PARALLEL
+!$ACC END PARALLEL
+
+ END