aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2010-04-06 21:03:10 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2010-04-06 21:03:10 +0200
commitf4d1d50a5a78c87a06a269f25fbfc7ff29896d14 (patch)
tree44ad7701af6f733236c159c4af2013f131e90322 /gcc
parent377949813aecca7f8c1ede0c28d3de708eb5d06a (diff)
downloadgcc-f4d1d50a5a78c87a06a269f25fbfc7ff29896d14.zip
gcc-f4d1d50a5a78c87a06a269f25fbfc7ff29896d14.tar.gz
gcc-f4d1d50a5a78c87a06a269f25fbfc7ff29896d14.tar.bz2
re PR fortran/18918 (Eventually support Fortran 2008's coarrays [co-arrays])
2010-04-06 Tobias Burnus <burnus@net-b.de> PR fortran/18918 * array.c (gfc_match_array_spec): Add error for -fcoarray=none. * match.c (gfc_match_critical, sync_statement): Ditto. * gfortran.h (gfc_fcoarray): New enum. (gfc_option_t): Use it. * lang.opt (fcoarray): Add new flag. * invoke.texi (fcoarray): Document it. * options.c (gfc_init_options,gfc_handle_option): Handle * -fcoarray=. (gfc_handle_coarray_option): New function. 2010-04-06 Tobias Burnus <burnus@net-b.de> PR fortran/18918 * gfortran.dg/coarray_2.f90: Add dg-options -fcoarray=single. * gfortran.dg/coarray_3.f90: Ditto. * gfortran.dg/coarray_4.f90: Ditto. * gfortran.dg/coarray_5.f90: Ditto. * gfortran.dg/coarray_6.f90: Ditto. * gfortran.dg/coarray_7.f90: Ditto. * gfortran.dg/coarray_8.f90: Ditto. * gfortran.dg/coarray_9.f90: New -fcoarray=none test. From-SVN: r158016
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog12
-rw-r--r--gcc/fortran/array.c6
-rw-r--r--gcc/fortran/gfortran.h8
-rw-r--r--gcc/fortran/invoke.texi18
-rw-r--r--gcc/fortran/lang.opt4
-rw-r--r--gcc/fortran/match.c12
-rw-r--r--gcc/fortran/options.c16
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/gfortran.dg/coarray_2.f901
-rw-r--r--gcc/testsuite/gfortran.dg/coarray_3.f901
-rw-r--r--gcc/testsuite/gfortran.dg/coarray_4.f901
-rw-r--r--gcc/testsuite/gfortran.dg/coarray_6.f901
-rw-r--r--gcc/testsuite/gfortran.dg/coarray_9.f9017
13 files changed, 105 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index b1db67a..9725d8e2 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,6 +1,18 @@
2010-04-06 Tobias Burnus <burnus@net-b.de>
PR fortran/18918
+ * array.c (gfc_match_array_spec): Add error for -fcoarray=none.
+ * match.c (gfc_match_critical, sync_statement): Ditto.
+ * gfortran.h (gfc_fcoarray): New enum.
+ (gfc_option_t): Use it.
+ * lang.opt (fcoarray): Add new flag.
+ * invoke.texi (fcoarray): Document it.
+ * options.c (gfc_init_options,gfc_handle_option): Handle -fcoarray=.
+ (gfc_handle_coarray_option): New function.
+
+2010-04-06 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/18918
* gfortran.h (gfc_array_spec): Add cotype.
* array.c (gfc_match_array_spec,gfc_set_array_spec): Use it
and defer error diagnostic.
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index c291ad8..4282fd1 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -458,6 +458,12 @@ coarray:
== FAILURE)
goto cleanup;
+ if (gfc_option.coarray == GFC_FCOARRAY_NONE)
+ {
+ gfc_error ("Coarrays disabled at %C, use -fcoarray= to enable");
+ goto cleanup;
+ }
+
for (;;)
{
as->corank++;
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index 2bf0ef8..f4f5d52 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -563,6 +563,13 @@ typedef enum
}
init_local_integer;
+typedef enum
+{
+ GFC_FCOARRAY_NONE = 0,
+ GFC_FCOARRAY_SINGLE
+}
+gfc_fcoarray;
+
/************************* Structures *****************************/
/* Used for keeping things in balanced binary trees. */
@@ -2158,6 +2165,7 @@ typedef struct
int fpe;
int rtcheck;
+ gfc_fcoarray coarray;
int warn_std;
int allow_std;
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 6d3681d..0a3dd7d 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -166,8 +166,8 @@ and warnings}.
@gccoptlist{-fno-automatic -ff2c -fno-underscoring @gol
-fwhole-file -fsecond-underscore @gol
-fbounds-check -fcheck-array-temporaries -fmax-array-constructor =@var{n} @gol
--fcheck=@var{<all|array-temps|bounds|do|mem|pointer|recursion>}
--fmax-stack-var-size=@var{n} @gol
+-fcheck=@var{<all|array-temps|bounds|do|mem|pointer|recursion>} @gol
+-fcoarray=@var{<none|single>} -fmax-stack-var-size=@var{n} @gol
-fpack-derived -frepack-arrays -fshort-enums -fexternal-blas @gol
-fblas-matmul-limit=@var{n} -frecursive -finit-local-zero @gol
-finit-integer=@var{n} -finit-real=@var{<zero|inf|-inf|nan|snan>} @gol
@@ -1212,6 +1212,20 @@ is implemented as a reference to the link-time external symbol
for compatibility with @command{g77} and @command{f2c}, and is implied
by use of the @option{-ff2c} option.
+@item -fcoarray=@var{<keyword>}
+@opindex @code{fcoarray}
+@cindex coarrays
+
+@table @asis
+@item @samp{none}
+Disable coarray support; using coarray declarations and image-control
+statements will produce a compile-time error. (Default)
+
+@item @samp{single}
+Single-image mode, i.e. @code{num_images()} is always one.
+@end table
+
+
@item -fcheck=@var{<keyword>}
@opindex @code{fcheck}
@cindex array, bounds checking
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index 751749e..1438aa2 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -348,6 +348,10 @@ frepack-arrays
Fortran
Copy array sections into a contiguous block on procedure entry
+fcoarray=
+Fortran RejectNegative JoinedOrMissing
+-fcoarray=[...] Specify which coarray parallelization should be used
+
fcheck=
Fortran RejectNegative JoinedOrMissing
-fcheck=[...] Specify which runtime checks are to be performed
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index e719628..70bf9ac 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -1743,6 +1743,12 @@ gfc_match_critical (void)
== FAILURE)
return MATCH_ERROR;
+ if (gfc_option.coarray == GFC_FCOARRAY_NONE)
+ {
+ gfc_error ("Coarrays disabled at %C, use -fcoarray= to enable");
+ return MATCH_ERROR;
+ }
+
if (gfc_find_state (COMP_CRITICAL) == SUCCESS)
{
gfc_error ("Nested CRITICAL block at %C");
@@ -2138,6 +2144,12 @@ sync_statement (gfc_statement st)
== FAILURE)
return MATCH_ERROR;
+ if (gfc_option.coarray == GFC_FCOARRAY_NONE)
+ {
+ gfc_error ("Coarrays disabled at %C, use -fcoarray= to enable");
+ return MATCH_ERROR;
+ }
+
if (gfc_find_state (COMP_CRITICAL) == SUCCESS)
{
gfc_error ("Image control statement SYNC at %C in CRITICAL block");
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index 0ad87f4..676bbe1 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -130,6 +130,7 @@ gfc_init_options (unsigned int argc, const char **argv)
gfc_option.fpe = 0;
gfc_option.rtcheck = 0;
+ gfc_option.coarray = GFC_FCOARRAY_NONE;
/* Argument pointers cannot point to anything but their argument. */
flag_argument_noalias = 3;
@@ -480,6 +481,18 @@ gfc_handle_fpe_trap_option (const char *arg)
static void
+gfc_handle_coarray_option (const char *arg)
+{
+ if (strcmp (arg, "none") == 0)
+ gfc_option.coarray = GFC_FCOARRAY_NONE;
+ else if (strcmp (arg, "single") == 0)
+ gfc_option.coarray = GFC_FCOARRAY_SINGLE;
+ else
+ gfc_fatal_error ("Argument to -fcoarray is not valid: %s", arg);
+}
+
+
+static void
gfc_handle_runtime_check_option (const char *arg)
{
int result, pos = 0, n;
@@ -931,6 +944,9 @@ gfc_handle_option (size_t scode, const char *arg, int value)
gfc_handle_runtime_check_option (arg);
break;
+ case OPT_fcoarray_:
+ gfc_handle_coarray_option (arg);
+ break;
}
return result;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2e03520..a485fcb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,6 +1,16 @@
2010-04-06 Tobias Burnus <burnus@net-b.de>
PR fortran/18918
+ * gfortran.dg/coarray_2.f90: Add dg-options -fcoarray=single.
+ * gfortran.dg/coarray_3.f90: Ditto.
+ * gfortran.dg/coarray_4.f90: Ditto.
+ * gfortran.dg/coarray_5.f90: Ditto.
+ * gfortran.dg/coarray_6.f90: Ditto.
+ * gfortran.dg/coarray_9.f90: New -fcoarray=none test.
+
+2010-04-06 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/18918
* gfortran.dg/coarray_4.f90: Fix test.
* gfortran.dg/coarray_6.f90: Add more tests.
diff --git a/gcc/testsuite/gfortran.dg/coarray_2.f90 b/gcc/testsuite/gfortran.dg/coarray_2.f90
index 1fcb9b8..902a0dd 100644
--- a/gcc/testsuite/gfortran.dg/coarray_2.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_2.f90
@@ -1,4 +1,5 @@
! { dg-do run }
+! { dg-options "-fcoarray=single" }
! { dg-shouldfail "error stop" }
!
! Coarray support
diff --git a/gcc/testsuite/gfortran.dg/coarray_3.f90 b/gcc/testsuite/gfortran.dg/coarray_3.f90
index 648f2fa..63c3bd3 100644
--- a/gcc/testsuite/gfortran.dg/coarray_3.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_3.f90
@@ -1,4 +1,5 @@
! { dg-do compile }
+! { dg-options "-fcoarray=single" }
!
! Coarray support
! PR fortran/18918
diff --git a/gcc/testsuite/gfortran.dg/coarray_4.f90 b/gcc/testsuite/gfortran.dg/coarray_4.f90
index cb693ea..5607ec9 100644
--- a/gcc/testsuite/gfortran.dg/coarray_4.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_4.f90
@@ -1,4 +1,5 @@
! { dg-do compile }
+! { dg-options "-fcoarray=single" }
!
! Coarray support -- corank declarations
! PR fortran/18918
diff --git a/gcc/testsuite/gfortran.dg/coarray_6.f90 b/gcc/testsuite/gfortran.dg/coarray_6.f90
index b6d8b49..d3c600b 100644
--- a/gcc/testsuite/gfortran.dg/coarray_6.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_6.f90
@@ -1,4 +1,5 @@
! { dg-do compile }
+! { dg-options "-fcoarray=single" }
!
! Coarray support -- corank declarations
! PR fortran/18918
diff --git a/gcc/testsuite/gfortran.dg/coarray_9.f90 b/gcc/testsuite/gfortran.dg/coarray_9.f90
new file mode 100644
index 0000000..d44cdda
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray_9.f90
@@ -0,0 +1,17 @@
+! { dg-do compile }
+!
+! PR fortran/18918
+!
+! Check for error if no -fcoarray= option has been given
+!
+
+integer :: a
+integer :: b[*] ! { dg-error "Coarrays disabled" }
+
+error stop "Error"
+sync all ! { dg-error "Coarrays disabled" }
+
+critical ! { dg-error "Coarrays disabled" }
+end critical ! { dg-error "Expecting END PROGRAM statement" }
+
+end