[open-coarrays] 60/80: New upstream 1.8.10

Alastair McKinstry mckinstry at moszumanska.debian.org
Wed Oct 25 13:45:50 UTC 2017


This is an automated email from the git hooks/post-receive script.

mckinstry pushed a commit to branch debian/master
in repository open-coarrays.

commit fb52d3364d5becca7998b498330e9858cea4c4c0
Author: Alastair McKinstry <mckinstry at debian.org>
Date:   Wed May 10 15:42:01 2017 +0100

    New upstream 1.8.10
---
 .VERSION                                           |   5 +
 CMakeLists.txt                                     |  99 ++-
 GETTING_STARTED.md                                 |   2 +-
 INSTALL.md                                         | 343 ++++++----
 README.md                                          | 170 +++--
 doc/dependency_tree/opencoarrays-tree.txt          |   2 +-
 .../flex-2.6.0/bison-3.0.4/m4-1.4.17/.gitkeep      |   0
 .../gcc-6.1.0/gmp/.gitkeep                         |   0
 .../gcc-6.1.0/mpc/.gitkeep                         |   0
 .../gcc-6.1.0/mpfr/.gitkeep                        |   0
 prerequisites/build-functions/build_and_install.sh |  10 +-
 .../edit_GCC_download_prereqs_file_if_necessary.sh |   4 +-
 .../set_or_print_default_version.sh                |   2 +-
 .../install-functions/build_opencoarrays.sh        |  13 +-
 prerequisites/install-functions/print_header.sh    |   2 +-
 prerequisites/install-functions/report_results.sh  |  24 +-
 src/single/CMakeLists.txt                          |   5 -
 src/single/Makefile                                |  19 -
 src/single/single.c                                | 727 ---------------------
 src/tests/regression/open/issue-172                |   1 -
 20 files changed, 459 insertions(+), 969 deletions(-)

diff --git a/.VERSION b/.VERSION
new file mode 100644
index 0000000..ff1f65f
--- /dev/null
+++ b/.VERSION
@@ -0,0 +1,5 @@
+# OpenCoarrays version file. Odd patch levels indicate inter-release
+# version, i.e., code is from SCM/git. This project uses semantic
+# versioning. For details see http://semver.org
+
+1.8.10
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ebd59ba..f7f7b61 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.2)
 
 # Set the type/configuration of build to perform
 set ( CMAKE_CONFIGURATION_TYPES "Debug" "Release" "MinSizeRel" "RelWithDebInfo" "CodeCoverage" )
@@ -6,6 +6,14 @@ set ( CMAKE_BUILD_TYPE "Release"
   CACHE STRING "Select which configuration to build." )
 set_property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES} )
 
+# Add option and check environment to determine if developer tests should be run
+if(ENV{OPENCOARRAYS_DEVELOPER})
+  option(RUN_DEVELOPER_TESTS "Run tests intended only for developers" ON)
+else()
+  option(RUN_DEVELOPER_TESTS "Run tests intended only for developers" OFF)
+endif()
+mark_as_advanced(RUN_DEVELOPER_TESTS)
+
 # Name project and specify source languages
 # Parse version from .VERSION file so that more info can be added and easier to get from scripts
 file( STRINGS ".VERSION" OpenCoarraysVersion
@@ -90,7 +98,7 @@ the C compiler if it matches the Fortran compiler ID." )
   endif()
   set( CMAKE_Fortran_COMPILER_VERSION "${DETECTED_VER}" )
 endif()
-  
+
   # We have populated CMAKE_Fortran_COMPILER_VERSION if it was missing
   if(gfortran_compiler AND (CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER 5.0.0))
     set(opencoarrays_aware_compiler true)
@@ -155,15 +163,84 @@ endif()
 
 find_package( MPI )
 
-if ( (NOT MPI_C_FOUND) OR (NOT MPI_Fortran_FOUND) )
+if ( (NOT MPI_C_FOUND) OR (NOT MPI_Fortran_FOUND) OR (NOT MPIEXEC))
+  # Get default install location of MPICH from install.sh
+  execute_process( COMMAND "./install.sh" -P mpich
+    WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
+    OUTPUT_VARIABLE DEFAULT_MPICH_INSTALL_LOC
+    OUTPUT_QUIET
+    OUTPUT_STRIP_TRAILING_WHITES_SPACE
+  )
   find_program (MY_MPI_EXEC NAMES mpirun mpiexec lamexec srun
-    PATHS "${CMAKE_SOURCE_DIR/prerequisites/installations/mpich/3.1.4}" "${CMAKE_SOURCE_DIR}/prerequisites/installations/mpich/*" ENV PATH
+    PATHS "${DEFAULT_MPICH_INSTALL_LOC}" ENV PATH
     HINTS "${FTN_COMPILER_DIR}" "${C_COMPILER_DIR}"
     PATH_SUFFIXES bin)
   set ( MPI_HOME "${MPI_HOME}" "${MY_MPI_EXEC}" "${MY_MPI_EXEC}/.." )
   find_package( MPI REQUIRED )
 endif()
 
+# Test for consistent MPI environment
+if (NOT MPIEXEC)
+  message ( ERROR "CMake failed to find `mpiexec` or similar. If building with `./install.sh` please
+report this bug to the OpenCoarrays developers at
+https://github.com/sourceryinstitute/opencoarrays/issues, otherwise use point CMake
+to the desired MPI runtime.")
+endif()
+
+get_filename_component(MPIEXEC_RELATIVE_LOC "${MPIEXEC}"
+  PROGRAM)
+get_filename_component(MPIEXEC_ABS_LOC "${MPIEXEC_RELATIVE_LOC}"
+  REALPATH)
+get_filename_component(MPIEXEC_DIR "${MPIEXEC_ABS_LOC}"
+  DIRECTORY)
+
+get_filename_component(MPICC_RELATIVE_LOC "${MPI_C_COMPILER}"
+  PROGRAM)
+get_filename_component(MPICC_ABS_LOC "${MPICC_RELATIVE_LOC}"
+  REALPATH)
+get_filename_component(MPICC_DIR "${MPICC_ABS_LOC}"
+  DIRECTORY)
+
+get_filename_component(MPIFC_RELATIVE_LOC "${MPI_Fortran_COMPILER}"
+  PROGRAM)
+get_filename_component(MPIFC_ABS_LOC "${MPIFC_RELATIVE_LOC}"
+  REALPATH)
+get_filename_component(MPIFC_DIR "${MPIFC_ABS_LOC}"
+  DIRECTORY)
+
+if ((MPIEXEC_DIR STREQUAL MPICC_DIR) AND (MPIEXEC_DIR STREQUAL MPIFC_DIR))
+  message ( STATUS "MPI runtime and compile time environments appear to be consistent")
+else()
+  message ( WARNING "MPIEXEC is in \"${MPIEXEC_DIR},\"
+which differs from the location of MPICC and/or MPIFC which are in
+\"${MPICC_DIR}\" and \"${MPIFC_DIR},\" respectively.
+This is likely indicative of a problem. If building with `./install.sh` please report
+this to the OpenCoarrays developers by filing a new issue at:
+https://github.com/sourceryinstitute/OpenCoarrays/issues/new")
+endif()
+
+#-----------------------------------------------
+# Work around bug #317 present on fedora systems
+#-----------------------------------------------
+if( (MPI_C_LINK_FLAGS MATCHES "noexecstack") OR (MPI_Fortran_LINK_FLAGS MATCHES "noexecstack") )
+  message ( WARNING
+"The `noexecstack` linker flag was found in the MPI_<lang>_LINK_FLAGS variable. This is
+known to cause segmentation faults for some Fortran codes. See, e.g.,
+https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71729 or
+https://github.com/sourceryinstitute/OpenCoarrays/issues/317.
+
+`noexecstack` is being replaced with `execstack`"
+    )
+  string(REPLACE "noexecstack"
+    "execstack" MPI_C_LINK_FLAGS_FIXED ${MPI_C_LINK_FLAGS})
+  string(REPLACE "noexecstack"
+    "execstack" MPI_Fortran_LINK_FLAGS_FIXED ${MPI_Fortran_LINK_FLAGS})
+  set(MPI_C_LINK_FLAGS "${MPI_C_LINK_FLAGS_FIXED}" CACHE STRING
+    "MPI C linking flags" FORCE)
+  set(MPI_Fortran_LINK_FLAGS "${MPI_Fortran_LINK_FLAGS_FIXED}" CACHE STRING
+    "MPI Fortran linking flags" FORCE)
+endif()
+
 #--------------------------------------------------------
 # Make sure a simple "hello world" C mpi program compiles
 #--------------------------------------------------------
@@ -399,10 +476,12 @@ if(opencoarrays_aware_compiler)
     add_mpi_test(register_alloc_comp_1 2 ${tests_root}/unit/init_register/register_alloc_comp_1)
     add_mpi_test(register_alloc_comp_2 2 ${tests_root}/unit/init_register/register_alloc_comp_2)
     add_mpi_test(register_alloc_comp_3 2 ${tests_root}/unit/init_register/register_alloc_comp_3)
-    add_mpi_test(async_comp_alloc 6 ${tests_root}/unit/init_register/async_comp_alloc)
-    # Timeout async_comp_alloc test after 3 seconds to progess past the known failure
-    set_property(TEST async_comp_alloc PROPERTY TIMEOUT_AFTER_MATCH 3 "known failure")
-    set_property(TEST async_comp_alloc PROPERTY TIMEOUT 6) # in the event old CMake is being used
+    if (RUN_DEVELOPER_TESTS)
+      add_mpi_test(async_comp_alloc 6 ${tests_root}/unit/init_register/async_comp_alloc)
+      # Timeout async_comp_alloc test after 3 seconds to progess past the known failure
+      set_property(TEST async_comp_alloc PROPERTY TIMEOUT_AFTER_MATCH 3 "known failure")
+      set_property(TEST async_comp_alloc PROPERTY TIMEOUT 6) # in the event old CMake is being used
+    endif()
   endif()
   add_mpi_test(get_array 2 ${tests_root}/unit/send-get/get_array)
   add_mpi_test(get_self 2 ${tests_root}/unit/send-get/get_self)
@@ -439,7 +518,9 @@ if(opencoarrays_aware_compiler)
     # GFortran PR 78505 only fixed on trunk/gcc 7
     add_mpi_test(source-alloc-no-sync 8 ${tests_root}/regression/reported/source-alloc-sync)
   endif()
-  add_mpi_test(convert-before-put 3 ${tests_root}/regression/reported/convert-before-put)
+  if (RUN_DEVELOPER_TESTS)
+    add_mpi_test(convert-before-put 3 ${tests_root}/regression/reported/convert-before-put)
+  endif()
   add_mpi_test(event-post 3 ${tests_root}/regression/reported/event-post)
   add_mpi_test(co_reduce-factorial 4 ${tests_root}/regression/reported/co_reduce-factorial)
   add_mpi_test(co_reduce-factorial-int8 4 ${tests_root}/regression/reported/co_reduce-factorial-int8)
diff --git a/GETTING_STARTED.md b/GETTING_STARTED.md
index 1b45ed4..eb3b1bb 100644
--- a/GETTING_STARTED.md
+++ b/GETTING_STARTED.md
@@ -107,7 +107,7 @@ If the `caf` compiler wrapper cannot process the source code in question, invoke
 the underlying communication library directly:
 
 ```bash
-mpif90 -fcoarray=lib -L/opt/opencoarrays/ tally.f90 \ -lcaf_mpi -o htally-I<OpenCoarrays-install-path>/mod
+mpif90 -fcoarray=lib -L/opt/opencoarrays/ tally.f90 \ -lcaf_mpi -o htally -I<OpenCoarrays-install-path>/mod
 ```
 
 and also run the program with the lower-level communication library:
diff --git a/INSTALL.md b/INSTALL.md
index e9c1112..fb06375 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -4,35 +4,36 @@
 [For better viewing, including hyperlinks, read it online at             ]:#
 [https://github.com/sourceryinstitute/OpenCoarrays/blob/master/INSTALL.md]:#
 
-Installing OpenCoarrays
-=======================
+# Installing OpenCoarrays #
 
 [![GitHub release](https://img.shields.io/github/release/sourceryinstitute/OpenCoarrays.svg?style=flat-square)](https://github.com/sourceryinstitute/OpenCoarrays/releases/latest)
 [![Github All Releases](https://img.shields.io/github/downloads/sourceryinstitute/OpenCoarrays/total.svg?style=flat-square)](https://github.com/sourceryinstitute/OpenCoarrays/releases/latest)
-[![Download as PDF][pdf img]](http://md2pdf.herokuapp.com/sourceryinstitute/OpenCoarrays/blob/master/INSTALL.pdf)
+[![Download as PDF][pdf img]][INSTALL.pdf]
 
 Download this file as a PDF document
-[here](http://md2pdf.herokuapp.com/sourceryinstitute/OpenCoarrays/blob/master/INSTALL.pdf).
-
- *  [End-User Installation]
-     * [macOS]
-     * [Windows]
-     * [Linux]
-     * [Virtual machine]
-     * [Installation Script]
- *  [Advanced Installation from Source]
-     *  [Prerequisites]
-     *  [CMake scripts]
-     *  [Make]
- *  [Obtaining GCC, MPICH, and CMake]
-
-End-User Installation
----------------------
-
-Most users will find it easiest and fastest to use package management software to install OpenCoarrays.
-Package management options for macOS (formerly known as OS X), Windows, and Linux are described first
-below. Also described below are options for installing via the Sourcery Institute virtual machine or
-the OpenCoarrays installation script.
+[here][INSTALL.pdf].
+
+* [End-User Installation]
+  * [macOS]
+  * [Windows]
+  * [Linux]
+  * [FreeBSD]
+  * [Virtual machine]
+  * [Installation Script]
+* [Advanced Installation from Source]
+  * [Prerequisites]
+  * [CMake scripts]
+  * [Make]
+* [Obtaining GCC, MPICH, and CMake]
+
+## End-User Installation ##
+
+Most users will find it easiest and fastest to use package management
+software to install OpenCoarrays.  Package management options for
+macOS (formerly known as OS X), Windows, and Linux are described first
+below. Also described below are options for installing via the
+Sourcery Institute virtual machine or the OpenCoarrays installation
+script.
 
 [top]
 
@@ -40,135 +41,179 @@ the OpenCoarrays installation script.
 
 [![homebrew](https://img.shields.io/homebrew/v/opencoarrays.svg?style=flat-square)](http://braumeister.org/formula/opencoarrays)
 
-OS X users may use the [Homebrew] or [MacPorts] package management systems to install OpenCoarrays.
-We recommend [Homebrew].
+macOS users may use the [Homebrew] or [MacPorts] package management
+systems to install OpenCoarrays.  We recommend [Homebrew].
 
 Basic Homebrew installation steps:
-```
+
+```bash
 brew update
 brew install opencoarrays
 ```
 
 OpenCoarrays also ships with a
-[`Brewfile`](https://github.com/sourceryinstitute/OpenCoarrays/blob/master/Brewfile)
+[`Brewfile`][Brewfile]
 that will make it easier to install opencoarrays using MPICH built
 with GCC. To install using the
-[`Brewfile`](https://github.com/sourceryinstitute/OpenCoarrays/blob/master/Brewfile)
+[`Brewfile`][Brewfile]
 with MPICH wrapping GCC, follow these steps:
 
-```
+```bash
 brew tap homebrew/bundle
 brew update
 brew bundle
 ```
 
 MacPorts installation steps:
-```
+
+```bash
 sudo port selfupdate
 sudo port upgrade outdated
 sudo port install opencoarrays
 ```
-where the `sudo` command requires administrator privileges.  If you install using MacPorts, please
-also install the `mpstats` port as follows:
-```
+
+where the `sudo` command requires administrator privileges.  If you
+install using MacPorts, please also install the `mpstats` port as
+follows:
+
+```bash
 sudo port install mpstats
 ```
-which supports future OpenCoarrays development by providing download data the OpenCoarrays team
-uses in proposals for research grants and development contracts.
+
+which supports future OpenCoarrays development by providing download
+data the OpenCoarrays team uses in proposals for research grants and
+development contracts.
 
 [top]
 
 ### Windows ###
 
-Windows users may run the windows-install.sh script inside the Windows Subsystem for Linux (WSL).
+Windows users may run the windows-install.sh script inside the Windows
+Subsystem for Linux (WSL).
 
 Requirements:
+
 * WSL release 14936 or later,
 * Windows Insider Preview, and
 * "Fast" updates option.
 
 Steps:
-```
+
+```bash
  do-release-upgrade
 ./windows-install.sh
 ```
-where the first command above updates the default Ubuntu 14.04 to 16.04 and the second command must
-be executed with the present working directory set to the top level of the OpenCoarrays source tree.
 
-The `windows-install.sh` installation script uses Ubuntu's `apt-get` package manager to build
-[GCC] 5.4.0, [CMake], and [MPICH].  Windows users who desire a newer version of GCC are welcome to
-submit a request via our [Issues] page and suggest a method for updating.  Previously attempted
-upgrade methods are described in the discussion thread starting with [commit comment 20539810].
+where the first command above updates the default Ubuntu 14.04 to
+16.04 and the second command must be executed with the present working
+directory set to the top level of the OpenCoarrays source tree.
+
+The `windows-install.sh` installation script uses Ubuntu's `apt-get`
+package manager to build [GCC] 5.4.0, [CMake], and [MPICH].  Windows
+users who desire a newer version of GCC are welcome to submit a
+request via our [Issues] page and suggest a method for updating.
+Previously attempted upgrade methods are described in the discussion
+thread starting with [commit comment 20539810].
 
 [top]
 
 ### Linux ###
 
-The [Arch Linux] distribution provides an [aur package] for installing OpenCoarrays.  Users of
-other Linux distributions may install the [Virtual machine] or use the [Installation Script].
-Alternatively, if you desire to install using other Linux package Linux package management
-software such as [dnf] or [apt-get], please submit a feature request via our [Issues] page.
+Acces OpenCoarrays on Linux via any of the following package managers
+or pre-installed copies:
+
+* The [linuxbrew] package manager installs OpenCoarrays on all Linux distributions.
+* Debian-based distributions such as Ubuntu provide an "open-coarrays" [APT package].
+* [Arch Linux] provides an [aur package].
+* [HPCLinux] includes a pre-installed copy of OpenCoarrays.
+
+[linuxbrew] does not require `sudo` privileges and will generally
+provide the most up-to-date OpenCoarrays release because linxubrew
+pulls directly from macOS homebrew, which updates automatically.
+
+[top]
+
+### FreeBSD ###
+
+A FreeBSD Port is available for installing OpenCoarrays and can be
+located via [port search].  See the FreeBSD OpenCoarrays [port details]
+page for installation instructions.
 
 [top]
 
 ## Virtual machine ##
 
-Users of macOS, Windows, or Linux have the option to use OpenCoarrays by installing the Lubuntu
-Linux virtual machine from the [Sourcery Institute Store].  The virtual machine boots inside
-the open-source [VirtualBox] virtualization package.  In addition to containing [GCC], [MPICH],
-and OpenCoarrays, the virtual machine contains dozens of other open-source software packages
-that support modern Fortran software development.  See the [download and installation instructions]
-for a partial list of the included packages.
+Users of macOS, Windows, or Linux have the option to use OpenCoarrays
+by installing the Lubuntu Linux virtual machine from the
+[Sourcery Institute Store].  The virtual machine boots inside the
+open-source [VirtualBox] virtualization package.  In addition to
+containing [GCC], [MPICH], and OpenCoarrays, the virtual machine
+contains dozens of other open-source software packages that support
+modern Fortran software development.  See the
+[download and installation instructions] for a partial list of the
+included packages.
 
 [top]
 
 ## Installation Script ##
 
-If the above package management or virtualization options are infeasible or unavailable,
-Linux and macOS users may also install OpenCoarrays by downloading and uncompressing our
-[latest release] and running our installation script in the top-level OpenCoarrays source
+If the above package management or virtualization options are
+infeasible or unavailable, Linux and macOS users may also install
+OpenCoarrays by downloading and uncompressing our [latest release] and
+running our installation script in the top-level OpenCoarrays source
 directory (see above for the corresponding [Windows] script):
-```
+
+```bash
 tar xvzf OpenCoarrays-x.y.z.tar.gz
 cd OpenCoarrays-x.y.z
 ./install.sh
 ```
-where `x.y.z` should be replaced with the appropriate version numbers.  For a scripted or unattended build, use
-`./install.sh -y` or equivalently `./install.sh --yes-to-all`, which will assume affirmative answers
-to all user prompts and will only prompt the user if an installation directory is chosen that requires
-`sudo` privelenges (by passing `-i` or equivalently `--install-prefix`).
-
-Before installing OpenCoarrays, the above bash script will attempt to detect the presence of the
-default prerequisite packages: [GCC], [MPICH] , and [CMake].  For additional details, see the
-[Prerequisites] section. If any of the installation script cannot find the prerequisite packages,
-the [install.sh] script will attempt to download, build, and install any missing packages
-after asking permission to do so.  The script has been tested on Linux and OS X.  Please
-submit any related problems or questions to our [Issues] page.
 
-A complete installation should result in the creation of the following directories
-inside the installation path (.e.g, inside `build` in the above example):
-
-* `bin`: contains the compiler wrapper (`caf`) and program launcher (`cafun`).
-* `mod`: contains the `opencoarrays.mod` module file for use with non-OpenCoarrays-aware compilers
-* `lib`: contains the `libcaf_mpi.a` static library to which codes link for CAF support
+where `x.y.z` should be replaced with the appropriate version numbers.
+For a scripted or unattended build, use `./install.sh -y` or
+equivalently `./install.sh --yes-to-all`, which will assume
+affirmative answers to all user prompts and will only prompt the user
+if an installation directory is chosen that requires `sudo`
+privelenges (by passing `-i` or equivalently `--install-prefix`).
+
+Before installing OpenCoarrays, the above bash script will attempt to
+detect the presence of the default prerequisite packages: [GCC],
+[MPICH] , and [CMake].  For additional details, see the
+[Prerequisites] section. If any of the installation script cannot find
+the prerequisite packages, the [install.sh] script will attempt to
+download, build, and install any missing packages after asking
+permission to do so.  The script has been tested on Linux and OS X.
+Please submit any related problems or questions to our [Issues] page.
+
+A complete installation should result in the creation of the following
+directories inside the installation path (.e.g, inside `build` in the
+above example):
+
+* `bin`: contains the compiler wrapper (`caf`) and program launcher
+  (`cafun`).
+* `mod`: contains the `opencoarrays.mod` module file for use with
+  non-OpenCoarrays-aware compilers
+* `lib`: contains the `libcaf_mpi.a` static library to which codes
+  link for CAF support
 
 [top]
 
-Advanced Installation from Source
----------------------------------
+## Advanced Installation from Source ##
 
-### Prerequisites: ###
+### Prerequisites ###
 
-The prerequisites below and their dependencies are recommended for the broadest coverage of CAF features.
-If a prerequisite is missing or outdated, the [install.sh] script will prompt the user for permission to
-download, compile, and install it. Before doing so, [install.sh] will verify whether that prerequisite's
-prerequisites are present and will recursively traverse the dependency tree until reaching an acceptable
-prerequisite or reaching the end of a branch.
+The prerequisites below and their dependencies are recommended for the
+broadest coverage of CAF features.  If a prerequisite is missing or
+outdated, the [install.sh] script will prompt the user for permission
+to download, compile, and install it. Before doing so, [install.sh]
+will verify whether that prerequisite's prerequisites are present and
+will recursively traverse the dependency tree until reaching an
+acceptable prerequisite or reaching the end of a branch.
 
-```
+```text
 opencoarrays
 ├── cmake-3.4.0
-└── mpich-3.1.4
+└── mpich-3.2
     └── gcc-6.1.0
         ├── flex-2.6.0
         │   └── bison-3.0.4
@@ -178,13 +223,15 @@ opencoarrays
         └── mpfr
 ```
 
-If using the advanced [CMake] or [Make] builds detailed below, please ensure that these dependencies are met before attempting to build and install OpenCoarrays.
+If using the advanced [CMake] or [Make] builds detailed below, please
+ensure that these dependencies are met before attempting to build and
+install OpenCoarrays.
 
 [top]
 
 ### CMake scripts ###
 
-#### N.B.: ####
+#### N.B. ####
 
 __As of OpenCoarrays 1.7.6, passing `FC=mpi_fortran_wrapper` and
 `CC=mpi_c_wrapper` is *DEPRECATED*. Please pass `FC=/path/to/gfortran`
@@ -195,13 +242,15 @@ compiler in which MPI is *built-in* to the compiler, you still pass
 the `FC` and `CC` as the Fortran and C compiler, even though MPI is
 built-in.__
 
-[CMake] is the preferred build system.   CMake is a cross-platform Makefile generator that
-includes the testing tool CTest.  To avoid cluttering or clobbering the source tree,
-our CMake setup requires that your build directory be any directory other than the top-level
-OpenCoarrays source directory.  In a bash shell, the following steps should build
-OpenCoarrays, install OpenCoarrays, build the tests, run the tests, and report the test results:
+[CMake] is the preferred build system.  CMake is a cross-platform
+Makefile generator that includes the testing tool CTest.  To avoid
+cluttering or clobbering the source tree, our CMake setup requires
+that your build directory be any directory other than the top-level
+OpenCoarrays source directory.  In a bash shell, the following steps
+should build OpenCoarrays, install OpenCoarrays, build the tests, run
+the tests, and report the test results:
 
-```
+```bash
 tar xvzf opencoarrays.tar.gz
 cd opencoarrays
 mkdir opencoarrays-build
@@ -212,9 +261,10 @@ ctest
 make install
 ```
 
-where the the first part of the cmake line sets the CC and FC environment variables
-and the final part of the same line defines the installation path as
-the `packages` directory in the current user's `$HOME` directory.  Please report any test failures via the
+where the the first part of the cmake line sets the CC and FC
+environment variables and the final part of the same line defines the
+installation path as the `packages` directory in the current user's
+`$HOME` directory.  Please report any test failures via the
 OpenCoarrays [Issues] page. Please note that you need a recent
 GCC/GFortran, and a recent MPI-3 implementation. If CMake is having
 trouble finding the MPI implementation, or is finding the wrong MPI
@@ -226,62 +276,72 @@ you can also try passing the
 
 Advanced options (most users should not use these):
 
-    -DMPI_HOME=/path/to/mpi/dir  # try to force CMake to find your preferred MPI implementation
+```CMake
+-DMPI_HOME=/path/to/mpi/dir  # try to force CMake to find your preferred MPI implementation
         # OR
-    -DMPI_C_COMPILER=/path/to/c/wrapper
-    -DMPI_Fortran_COMPILER=/path/to/fortran/wrapper
-
-    -DLEGACY_ARCHITECTURE=OFF    # enables the use of FFT libraries that employ AVX instructions
-    -DHIGH_RESOLUTION_TIMER=ON   # enables timers that tick once per clock cycle
-    -DCOMPILER_SUPPORTS_ATOMICS  # enables support for the proposed Fortran 2015 events feature
-    -DUSE_EXTENSIONS             # builds the opencoarrays module for use with non-OpenCoarrays-aware compilers
-    -DCOMPILER_PROVIDES_MPI      # is set automatically when building with the Cray Compiler Environment
+-DMPI_C_COMPILER=/path/to/c/wrapper
+-DMPI_Fortran_COMPILER=/path/to/fortran/wrapper
+
+-DLEGACY_ARCHITECTURE=OFF    # enables the use of FFT libraries that employ AVX instructions
+-DHIGH_RESOLUTION_TIMER=ON   # enables timers that tick once per clock cycle
+-DCOMPILER_SUPPORTS_ATOMICS  # enables support for the proposed-Fortran 2015 events
+                             # feature
+-DUSE_EXTENSIONS             # builds the opencoarrays module for use-with non-
+                             # OpenCoarrays-aware compilers
+-DCOMPILER_PROVIDES_MPI      # is set automatically when building with-the Cray
+                             # Compiler Environment
+```
 
-The fourth and fifth flags above are not portable and the sixth enables code that is incomplete as
-of release 1.0.0.  The eighth is set automatically by the CMake scripts based on the compiler
-identity and version.
+The fourth and fifth flags above are not portable and the sixth
+enables code that is incomplete as of release 1.0.0.  The eighth is
+set automatically by the CMake scripts based on the compiler identity
+and version.
 
 [top]
 
 ### Make ###
 
-Unlike the Makefiles that CMake generates automatically for the chosen platform, static
-Makefiles require a great deal more maintenance and are less portable.  Also, the static
-Makefiles provided with OpenCoarrays lack several important capabilities.  In particular,
-they will not build the tests;  they will not build any of the infrastructure for compiling
-CAF source with non-OpenCoarrays-aware compilers (that infrastructure includes the
-[opencoarrays] module, the `caf` compiler wrapper, and the `cafrun` program launcher);
-nor do the static Makefiles provide a `make install` option so you will need to manually
-move the desired library from the corresponding source directory to your intended installation
-location as shown below.
+Unlike the Makefiles that CMake generates automatically for the chosen
+platform, static Makefiles require a great deal more maintenance and
+are less portable.  Also, the static Makefiles provided with
+OpenCoarrays lack several important capabilities.  In particular, they
+will not build the tests; they will not build any of the
+infrastructure for compiling CAF source with non-OpenCoarrays-aware
+compilers (that infrastructure includes the [opencoarrays] module, the
+`caf` compiler wrapper, and the `cafrun` program launcher); nor do the
+static Makefiles provide a `make install` option so you will need to
+manually move the desired library from the corresponding source
+directory to your intended installation location as shown below.
 
 If CMake is unavailable, build and install with Make using steps such as the following:
 
-```
+```bash
 tar xvzf opencoarrays.tar.gz
 cd opencoarray/src
 make
 mv mpi/libcaf_mpi.a <installation-path>
 ```
 
-For the above steps to succeed, you might need to edit the [make.inc] file to match your
-system settings.  For example, you might need to remove the `-Werror` option from the
-compiler flags or name a different compiler.  In order to activate efficient strided-array
-transfer support, uncomment the `-DSTRIDED` flag inside the [make.inc] file.
+For the above steps to succeed, you might need to edit the [make.inc]
+file to match your system settings.  For example, you might need to
+remove the `-Werror` option from the compiler flags or name a
+different compiler.  In order to activate efficient strided-array
+transfer support, uncomment the `-DSTRIDED` flag inside the [make.inc]
+file.
 
 [top]
 
-Obtaining GCC, MPICH, and CMake
--------------------------------
+## Obtaining GCC, MPICH, and CMake ##
 
 [GFortran Binaries] binary builds are available at <https://gcc.gnu.org/wiki/GFortranBinaries>.
 
-To build all prerequisites from source, including the current development branch of GCC,
-you might first try the running the provided [install.sh] script as described above in
-the [Installation Script] section or try building each prerequisite from source inside
-a bash shell as follows:
+To build all prerequisites from source, including the current
+development branch of GCC, you might first try the running the
+provided [install.sh] script as described above in the
+[Installation Script] section or try building each prerequisite from
+source inside a bash shell as follows:
 
-```
+```bash
 export gcc_install_path=/desired/installation/destination
 ./install.sh --package gcc --install-prefix "${gcc_install_path}"
 ./install.sh --package mpich \
@@ -298,11 +358,14 @@ export gcc_install_path=/desired/installation/destination
 
 ---
 
+<div align="center">
+
 [![GitHub forks](https://img.shields.io/github/forks/sourceryinstitute/OpenCoarrays.svg?style=social&label=Fork)](https://github.com/sourceryinstitute/OpenCoarrays/fork)
 [![GitHub stars](https://img.shields.io/github/stars/sourceryinstitute/OpenCoarrays.svg?style=social&label=Star)](https://github.com/sourceryinstitute/OpenCoarrays)
 [![GitHub watchers](https://img.shields.io/github/watchers/sourceryinstitute/OpenCoarrays.svg?style=social&label=Watch)](https://github.com/sourceryinstitute/OpenCoarrays)
 [![Twitter URL](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?hashtags=HPC,Fortran,PGAS&related=zbeekman,gnutools,HPCwire,HPC_Guru,hpcprogrammer,SciNetHPC,DegenerateConic,jeffdotscience,travisci&text=Stop%20programming%20w%2F%20the%20%23MPI%20docs%20in%20your%20lap%2C%20try%20Coarray%20Fortran%20w%2F%20OpenCoarrays%20%26%20GFortran!&url=https%3A//github.com/sourceryinstitute/OpenCoarrays)
 
+</div>
 
 [Internal document links]: #
 
@@ -311,6 +374,7 @@ export gcc_install_path=/desired/installation/destination
 [macOS]: #macos
 [Windows]: #windows
 [Linux]: #linux
+[FreeBSD]: #freebsd
 [Virtual machine]: #virtual-machine
 [Installation Script]: #installation-script
 
@@ -321,18 +385,19 @@ export gcc_install_path=/desired/installation/destination
 
 [Obtaining GCC, MPICH, and CMake]: #obtaining-gcc-mpich-and-cmake
 
-
 [Links to source]: #
 
 [install.sh]: ./install.sh
 
-
 [URLs]: #
 
-[CMake]: http://www.cmake.org
-[Sourcery Store]: http://www.sourceryinstitute.org/store
-[Sourcery Institute Store]: http://www.sourceryinstitute.org/store
-[VirtualBox]: http://www.virtualbox.org
+[APT package]: https://qa.debian.org/popcon.php?package=open-coarrays
+[HPCLinux]: http://www.paratools.com/hpclinux/
+[Brewfile]: https://github.com/sourceryinstitute/OpenCoarrays/blob/master/Brewfile
+[INSTALL.pdf]: https://md2pdf.herokuapp.com/sourceryinstitute/OpenCoarrays/blob/master/INSTALL.pdf
+[CMake]: https://cmake.org
+[Sourcery Institute Store]: http://www.sourceryinstitute.org/store/c1/Featured_Products.html
+[VirtualBox]: https://www.virtualbox.org
 [download and installation instructions]: http://www.sourceryinstitute.org/uploads/4/9/9/6/49967347/overview.pdf
 [yum]: http://yum.baseurl.org
 [apt-get]: https://en.wikipedia.org/wiki/Advanced_Packaging_Tool
@@ -342,9 +407,9 @@ export gcc_install_path=/desired/installation/destination
 [prerequisites]: #prerequisites
 [MPICH]: http://www.mpich.org
 [MVAPICH]:http://mvapich.cse.ohio-state.edu
-[MacPorts]: http://www.macports.org
+[MacPorts]: https://www.macports.org
 [GCC]: http://gcc.gnu.org
-[TS18508 Additional Parallel Features in Fortran]: http://isotc.iso.org/livelink/livelink?func=ll&objId=17181227&objAction=Open
+[TS18508 Additional Parallel Features in Fortran]: http://isotc.iso.org/livelink/livelink/nfetch/-8919044/8919782/8919787/17001078/ISO%2DIECJTC1%2DSC22%2DWG5_N2056_Draft_TS_18508_Additional_Paralle.pdf?nodeid=17181227&vernum=0
 [GFortran Binaries]:  https://gcc.gnu.org/wiki/GFortranBinaries#FromSource
 [Installing GCC]: https://gcc.gnu.org/install/
 [Arch Linux]: https://www.archlinux.org
@@ -352,5 +417,7 @@ export gcc_install_path=/desired/installation/destination
 [latest release]: https://github.com/sourceryinstitute/OpenCoarrays/releases/latest
 [pdf img]: https://img.shields.io/badge/PDF-INSTALL.md-6C2DC7.svg?style=flat-square "Download as PDF"
 [commit comment 20539810]: https://github.com/sourceryinstitute/OpenCoarrays/commit/26e99919fe732576f7277a0e1b83f43cc7c9d749#commitcomment-20539810
-[Homebrew]: http://brew.sh
+[Homebrew]: https://brew.sh
 [dnf]: https://github.com/rpm-software-management/dnf
+[port details]: http://www.freshports.org/lang/opencoarrays
+[port search]: https://www.freebsd.org/cgi/ports.cgi?query=opencoarrays
diff --git a/README.md b/README.md
index fde9213..5fccb47 100644
--- a/README.md
+++ b/README.md
@@ -3,59 +3,110 @@
 [This document is formatted with GitHub-Flavored Markdown.              ]:#
 [For better viewing, including hyperlinks, read it online at            ]:#
 [https://github.com/sourceryinstitute/OpenCoarrays/blob/master/README.md]:#
+<div align="center">
 
-
-[![Sourcery Institute][sourcery-institute logo]](https://www.sourceryinstitute.org)
+[![Sourcery Institute][sourcery-institute logo]][Sourcery, Inc.]
 
 OpenCoarrays
 ============
 
 [![CI Build Status][build img]](https://travis-ci.org/sourceryinstitute/OpenCoarrays)
+[![Release Downloads][download img]][Releases]
 [![Gitter](https://img.shields.io/gitter/room/sourceryinstitute/opencoarrays.svg?style=flat-square)](https://gitter.im/sourceryinstitute/opencoarrays)
 [![GitHub license][license img]](./LICENSE)
 [![GitHub release][release img]](https://github.com/sourceryinstitute/OpenCoarrays/releases/latest)
 [![homebrew](https://img.shields.io/homebrew/v/opencoarrays.svg?style=flat-square)](http://braumeister.org/formula/opencoarrays)
-[![Download as PDF][pdf img]](http://md2pdf.herokuapp.com/sourceryinstitute/OpenCoarrays/blob/master/README.pdf)
-[![Twitter URL](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?hashtags=HPC,Fortran,PGAS&related=zbeekman,gnutools,HPCwire,HPC_Guru,hpcprogrammer,SciNetHPC,DegenerateConic,jeffdotscience,travisci&text=Stop%20programming%20w%2F%20the%20%23MPI%20docs%20in%20your%20lap%2C%20try%20Coarray%20Fortran%20w%2F%20OpenCoarrays%20%26%20GFortran!&url=https%3A//github.com/sourceryinstitute/OpenCoarrays)
-<!-- [![Release Downloads][download img]](https://github.com/sourceryinstitute/OpenCoarrays/releases) -->
-
-* [Overview](#overview)
-* [Downloads](#downloads)
-* [Compatibility](#compatibility)
-* [Prerequisites](#prerequisites)
-* [Installation](#installation)
-* [Getting Started](#getting-started)
-* [Contributing](#contributing)
-* [Status](#status)
-* [Support](#support)
-* [Acknowledgements](#acknowledgements)
-* [Donate](#donate)
+[![Download as PDF][pdf img]](https://md2pdf.herokuapp.com/sourceryinstitute/OpenCoarrays/blob/master/README.pdf)
+[![Twitter URL][twitter img]][default tweet]
+
+[Overview](#overview) ·
+[Downloads](#downloads) ·
+[Compatibility](#compatibility) ·
+[Prerequisites](#prerequisites) ·
+[Installation](#installation) ·
+[Getting Started](#getting-started) ·
+[Contributing](#contributing) ·
+[Status](#status) ·
+[Support](#support) ·
+[Acknowledgements](#acknowledgements) ·
+[Donate](#donate)
+
+</div>
 
 Overview
 --------
-[OpenCoarrays] is an open-source software project that supports the coarray Fortran (CAF) parallel programming features of the Fortran 2008 standard and several features proposed for Fortran 2015 in the draft Technical Specification [TS 18508] _Additional Parallel Features in Fortran_.
-
-OpenCoarrays provides a compiler wrapper (named `caf`), a runtime library (named `libcaf_mpi.a` by default), and an executable file launcher (named `cafrun`).  With OpenCoarrays-aware compilers, the compiler wrapper passes the provided source code to the chosen compiler (`mpif90` by default).  For non-OpenCoarrays-aware compilers, the wrapper transforms CAF syntax into OpenCoarrys procedure calls before invoking the chosen compiler on the transformed code.  The runtime library supports c [...]
-
-OpenCoarrays defines an application binary interface ([ABI]) that translates high-level communication and synchronization requests into low-level calls to a user-specified communication library.  This design decision liberates compiler teams from hardwiring communication-library choice into their compilers and it frees Fortran programmers to express parallel algorithms once and reuse identical CAF source with whichever communication library is most efficient for a given hardware platform [...]
 
-OpenCoarrays enables CAF application developers to express parallel algorithms without hardwiring a particular version of a particular communication library or library version into their codes.  Such abstraction makes application code less sensitive to the evolution of the underlying communication libraries and hardware platforms.
+[OpenCoarrays] is an open-source software project
+that supports the coarray Fortran (CAF) parallel programming features
+of the Fortran 2008 standard and several features proposed for Fortran
+2015 in the draft Technical Specification [TS 18508] _Additional
+Parallel Features in Fortran_.
+
+OpenCoarrays provides a compiler wrapper (named `caf`), a runtime
+library (named `libcaf_mpi.a` by default), and an executable file
+launcher (named `cafrun`).  With OpenCoarrays-aware compilers, the
+compiler wrapper passes the provided source code to the chosen
+compiler (`mpif90` by default).  For non-OpenCoarrays-aware compilers,
+the wrapper transforms CAF syntax into OpenCoarrays procedure calls
+before invoking the chosen compiler on the transformed code.  The
+runtime library supports compiler communication and synchronization
+requests by invoking a lower-level communication library--the Message
+Passing Interface ([MPI]) by default.  The launcher passes execution
+to the chosen communication library's parallel program launcher
+(`mpirun` by default).
+
+OpenCoarrays defines an application binary interface ([ABI]) that
+translates high-level communication and synchronization requests into
+low-level calls to a user-specified communication library.  This
+design decision liberates compiler teams from hardwiring
+communication-library choice into their compilers and it frees Fortran
+programmers to express parallel algorithms once and reuse identical
+CAF source with whichever communication library is most efficient for
+a given hardware platform.  The communication substrate for
+OpenCoarrays built with the preferred build system, CMake, is the
+Message Passing Interface ([MPI]).
+
+OpenCoarrays enables CAF application developers to express parallel
+algorithms without hardwiring a particular version of a particular
+communication library or library version into their codes.  Such
+abstraction makes application code less sensitive to the evolution of
+the underlying communication libraries and hardware platforms.
 
 Downloads
 ---------
-<!--[![Release Downloads][download img]](https://github.com/sourceryinstitute/OpenCoarrays/releases/latest)-->
 
 Please see our [Releases] page.
 
 Compatibility
 -------------
-The GNU Compiler Collection ([GCC]) Fortran front end ([gfortran]) is OpenCoarrays-aware for release versions 5.1.0 and higher.  Users of other compilers, including earlier versions of gfortran, can access a limited subset of CAF features via the provided [opencoarrays module].  After installation, please execute the `caf` script (which is installed in the `bin` directory of the installation path) with no arguments to see a list of the corresponding limitations.  Please also notify the c [...]
+
+The GNU Compiler Collection ([GCC]) Fortran front end ([gfortran]) is
+OpenCoarrays-aware for release versions 5.1.0 and higher.  Users of
+other compilers, including earlier versions of gfortran, can access a
+limited subset of CAF features via the provided [opencoarrays module].
+After installation, please execute the `caf` script (which is
+installed in the `bin` directory of the installation path) with no
+arguments to see a list of the corresponding limitations.  Please also
+notify the corresponding compiler vendor and the OpenCoarrays team
+that you would like for a future version of the compiler to be
+OpenCoarrays-aware.
 
 Prerequisites
 -------------
-We expect our LIBCAF_MPI library to be the default OpenCoarrays library.  LIBCAF_MPI is the most straightforward to install and use, the most robust in terms of its internal complexity, and the most frequently updated and maintained.  Building LIBCAF_MPI requires prior installation of an MPI implementation.  We recommend [MPICH] generally or, if available, [MVAPICH] for better performance. [OpenMPI] is another option.
 
-We offer an unsupported LIBCAF_GASNet alternative.  We intend for LIBCAF_GASNet to be an "expert" alternative capable of outperforming MPI for some applications on some platforms.  LIBCAF_GASNet requires greater care to configure and use and building LIBCAF_GASNet requires prior installation of [GASNet].
+We expect our LIBCAF_MPI library to be the default OpenCoarrays
+library.  LIBCAF_MPI is the most straightforward to install and use,
+the most robust in terms of its internal complexity, and the most
+frequently updated and maintained.  Building LIBCAF_MPI requires prior
+installation of an MPI implementation.  We recommend [MPICH] generally
+or, if available, [MVAPICH] for better performance. [OpenMPI] is
+another option.
+
+We offer an unsupported LIBCAF_GASNet alternative.  We intend for
+LIBCAF_GASNet to be an "expert" alternative capable of outperforming
+MPI for some applications on some platforms.  LIBCAF_GASNet requires
+greater care to configure and use and building LIBCAF_GASNet requires
+prior installation of [GASNet].
 
 Installation
 ------------
@@ -76,26 +127,39 @@ Status
 ------
 
 A list of open issues can be viewed on the
-[issues page](https://github.com/sourcery institute/opencoarrays/issues).
+[issues page](https://github.com/sourceryinstitute/opencoarrays/issues).
 
 Support
 -------
 
 * Please submit bug reports and feature requests via our [Issues] page.
-* Please submit questions regarding installation and use via our [Google Group] by signing into [Google Groups] or [subscribing] and sending email to [opencoarrays at googlegroups.com].
+* Please submit questions regarding installation and use via our
+  [Google Group] by signing into [Google Groups] or [subscribing] and
+  sending email to [opencoarrays at googlegroups.com].
 
 Acknowledgements
 ----------------
+
 We gratefully acknowledge support from the following institutions:
 
-* [National Center for Atmospheric Research] for access to the Yellowstone/Caldera supercomputers and for logistics support during the initial development of OpenCoarrays.
-* [CINECA] for access to Eurora/PLX for the project HyPS- BLAS under the ISCRA grant program for 2014.
-* [Google] for support of a related [Google Summer of Code] 2014 project.
-* The National Energy Research Scientific Computing Center ([NERSC]), which is supported by the Office of Science of the U.S. Department of Energy under Contract No. DE-AC02-05CH11231, for access to the Hopper and Edison supercomputers under the OpenCoarrays project start allocation.
-* [Sourcery, Inc.], for financial support for the domain registration, web hosting, advanced development, and conference travel.
+* [National Center for Atmospheric Research] for access to the
+  Yellowstone/Caldera supercomputers and for logistics support during
+  the initial development of OpenCoarrays.
+* [CINECA] for access to Eurora/PLX for the project HyPS- BLAS under
+  the ISCRA grant program for 2014.
+* [Google] for support of a related [Google Summer of Code] 2014
+  project.
+* The National Energy Research Scientific Computing Center ([NERSC]),
+  which is supported by the Office of Science of the U.S. Department
+  of Energy under Contract No. DE-AC02-05CH11231, for access to the
+  Hopper and Edison supercomputers under the OpenCoarrays project
+  start allocation.
+* [Sourcery, Inc.], for financial support for the domain registration,
+  web hosting, advanced development, and conference travel.
 
 Donate
 ------
+
 If you find this software useful, please consider donating
 [your time](CONTRIBUTING.md) or
 [your money](http://www.sourceryinstitute.org/store/p5/Donation.html)
@@ -103,11 +167,14 @@ to aid in development efforts.
 
 ---
 
+<div align="center">
+
 [![GitHub forks](https://img.shields.io/github/forks/sourceryinstitute/OpenCoarrays.svg?style=social&label=Fork)](https://github.com/sourceryinstitute/OpenCoarrays/fork)
 [![GitHub stars](https://img.shields.io/github/stars/sourceryinstitute/OpenCoarrays.svg?style=social&label=Star)](https://github.com/sourceryinstitute/OpenCoarrays)
 [![GitHub watchers](https://img.shields.io/github/watchers/sourceryinstitute/OpenCoarrays.svg?style=social&label=Watch)](https://github.com/sourceryinstitute/OpenCoarrays)
-[![Twitter URL](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?hashtags=HPC,Fortran,PGAS&related=zbeekman,gnutools,HPCwire,HPC_Guru,hpcprogrammer,SciNetHPC,DegenerateConic,jeffdotscience,travisci&text=Stop%20programming%20w%2F%20the%20%23MPI%20docs%20in%20your%20lap%2C%20try%20Coarray%20Fortran%20w%2F%20OpenCoarrays%20%26%20GFortran!&url=https%3A//github.com/sourceryinstitute/OpenCoarrays)
+[![Twitter URL][twitter img]][default tweet]
 
+</div>
 
 [Hyperlinks]:#
 
@@ -122,39 +189,38 @@ to aid in development efforts.
 [sourcery-institute logo]: http://www.sourceryinstitute.org/uploads/4/9/9/6/49967347/sourcery-logo-rgb-hi-rez-1.png
 [OpenCoarrays]: http://www.opencoarrays.org
 [ABI]: https://gcc.gnu.org/onlinedocs/gfortran/Coarray-Programming.html#Coarray-Programming
-[TS 18508]: http://isotc.iso.org/livelink/livelink?func=ll&objId=16769292&objAction=Open
-[MPI]: http://www.mpi-forum.org
+[TS 18508]: http://isotc.iso.org/livelink/livelink/nfetch/-8919044/8919782/8919787/16681398/ISO%2DIECJTC1%2DSC22%2DWG5_N2027_Draft_TS_18508_Additional_Paralle.pdf?nodeid=16769292&vernum=0
+[MPI]: http://mpi-forum.org
 [GCC]: http://gcc.gnu.org
 [gfortran]: https://gcc.gnu.org/wiki/GFortran
 [opencoarrays module]: ./src/extensions/opencoarrays.F90
 [MPICH]: http://www.mpich.org
 [MVAPICH]: http://mvapich.cse.ohio-state.edu
-[OpenMPI]: http://www.open-mpi.org
+[OpenMPI]: https://www.open-mpi.org
 [Sourcery, Inc.]: http://www.sourceryinstitute.org
-[Google]: http://google.com
-[CINECA]: http://www.cineca.it/en
+[Google]: http://www.google.com
+[CINECA]: https://www.cineca.it/en
 [NERSC]: http://www.nersc.gov
-[National Center for Atmospheric Research]: http://ncar.ucar.edu
+[National Center for Atmospheric Research]: https://ncar.ucar.edu
 [INSTALL.md]: ./INSTALL.md
 [GASNet]: http://gasnet.lbl.gov
 [CONTRIBUTING.md]: ./CONTRIBUTING.md
 [GETTING_STARTED.md]: ./GETTING_STARTED.md
-[Google Groups]: https://groups.google.com
+[Google Groups]: https://groups.google.com/forum/#!homeredir
 [Google Group]: https://groups.google.com/forum/#!forum/opencoarrays
 [subscribing]: https://groups.google.com/forum/#!forum/opencoarrays/join
 [opencoarrays at googlegroups.com]: mailto:opencoarrays at googlegroups.com
-[Google Summer of Code]: https://www.google-melange.com/archive/gsoc/2014/orgs/gcc/projects/afanfa.html
+[Google Summer of Code]: https://www.google-melange.com/archive/gsoc/2014/orgs/gcc
 
-[try this GSoC link? https://www.google-melange.com/archive/gsoc/2014/orgs/gcc]:#
-[old GSoC link: https://www.google-melange.com/gsoc/org2/google/gsoc2014/gcc]:#
-
-[OpenCoarrays Google Group]: https://groups.google.com/forum/#!forum/opencoarrays)
 [Issues]: https://github.com/sourceryinstitute/OpenCoarrays/issues
 [Releases]: https://github.com/sourceryinstitute/OpenCoarrays/releases
 
-[build img]: https://img.shields.io/travis-ci/sourceryinstitute/OpenCoarrays/master.svg?style=flat-square "View Travis-CI builds"
+[build img]: https://img.shields.io/travis-ci/sourceryinstitute/OpenCoarrays/master.svg?style=flat-square "Travis-CI build badge"
 [CI Master Branch]: https://travis-ci.org/sourceryinstitute/OpenCoarrays?branch=master "View Travis-CI builds"
-[download img]: https://img.shields.io/github/downloads/sourceryinstitute/OpenCoarrays/total.svg?style=flat-square "Download count image source"
-[license img]: https://img.shields.io/badge/license-BSD--3-blue.svg?style=flat-square "View BSD-3 License"
-[release img]: https://img.shields.io/github/release/sourceryinstitute/OpenCoarrays.svg?style=flat-square "View latest release"
-[pdf img]: https://img.shields.io/badge/PDF-README.md-6C2DC7.svg?style=flat-square "Download as PDF"
+[download img]: https://img.shields.io/github/downloads/sourceryinstitute/OpenCoarrays/total.svg?style=flat-square "Download count badge"
+[license img]: https://img.shields.io/badge/license-BSD--3-blue.svg?style=flat-square "BSD-3 License badge"
+[release img]: https://img.shields.io/github/release/sourceryinstitute/OpenCoarrays.svg?style=flat-square "Latest release badge"
+[pdf img]: https://img.shields.io/badge/PDF-README.md-6C2DC7.svg?style=flat-square "Download this readme as a PDF"
+[twitter img]: https://img.shields.io/twitter/url/http/shields.io.svg?style=social
+
+[default tweet]: https://twitter.com/intent/tweet?hashtags=HPC,Fortran,PGAS&related=zbeekman,gnutools,HPCwire,HPC_Guru,hpcprogrammer,SciNetHPC,DegenerateConic,jeffdotscience,travisci&text=Stop%20programming%20w%2F%20the%20%23MPI%20docs%20in%20your%20lap%2C%20try%20Coarray%20Fortran%20w%2F%20OpenCoarrays%20%26%20GFortran!&url=https%3A//github.com/sourceryinstitute/OpenCoarrays
diff --git a/doc/dependency_tree/opencoarrays-tree.txt b/doc/dependency_tree/opencoarrays-tree.txt
index 6f4fa74..1ccfeb0 100644
--- a/doc/dependency_tree/opencoarrays-tree.txt
+++ b/doc/dependency_tree/opencoarrays-tree.txt
@@ -1,6 +1,6 @@
 opencoarrays
 ├── cmake-3.4.0
-└── mpich-3.1.4
+└── mpich-3.2
     └── gcc-6.1.0
         ├── flex-2.6.0
         │   └── bison-3.0.4
diff --git a/doc/dependency_tree/opencoarrays/mpich-3.1.4/gcc-6.1.0/flex-2.6.0/bison-3.0.4/m4-1.4.17/.gitkeep b/doc/dependency_tree/opencoarrays/mpich-3.2/gcc-6.1.0/flex-2.6.0/bison-3.0.4/m4-1.4.17/.gitkeep
similarity index 100%
rename from doc/dependency_tree/opencoarrays/mpich-3.1.4/gcc-6.1.0/flex-2.6.0/bison-3.0.4/m4-1.4.17/.gitkeep
rename to doc/dependency_tree/opencoarrays/mpich-3.2/gcc-6.1.0/flex-2.6.0/bison-3.0.4/m4-1.4.17/.gitkeep
diff --git a/doc/dependency_tree/opencoarrays/mpich-3.1.4/gcc-6.1.0/gmp/.gitkeep b/doc/dependency_tree/opencoarrays/mpich-3.2/gcc-6.1.0/gmp/.gitkeep
similarity index 100%
rename from doc/dependency_tree/opencoarrays/mpich-3.1.4/gcc-6.1.0/gmp/.gitkeep
rename to doc/dependency_tree/opencoarrays/mpich-3.2/gcc-6.1.0/gmp/.gitkeep
diff --git a/doc/dependency_tree/opencoarrays/mpich-3.1.4/gcc-6.1.0/mpc/.gitkeep b/doc/dependency_tree/opencoarrays/mpich-3.2/gcc-6.1.0/mpc/.gitkeep
similarity index 100%
rename from doc/dependency_tree/opencoarrays/mpich-3.1.4/gcc-6.1.0/mpc/.gitkeep
rename to doc/dependency_tree/opencoarrays/mpich-3.2/gcc-6.1.0/mpc/.gitkeep
diff --git a/doc/dependency_tree/opencoarrays/mpich-3.1.4/gcc-6.1.0/mpfr/.gitkeep b/doc/dependency_tree/opencoarrays/mpich-3.2/gcc-6.1.0/mpfr/.gitkeep
similarity index 100%
rename from doc/dependency_tree/opencoarrays/mpich-3.1.4/gcc-6.1.0/mpfr/.gitkeep
rename to doc/dependency_tree/opencoarrays/mpich-3.2/gcc-6.1.0/mpfr/.gitkeep
diff --git a/prerequisites/build-functions/build_and_install.sh b/prerequisites/build-functions/build_and_install.sh
index 1dc1ec9..311063f 100644
--- a/prerequisites/build-functions/build_and_install.sh
+++ b/prerequisites/build-functions/build_and_install.sh
@@ -1,7 +1,8 @@
 # Make the build directory, configure, and build
 # shellcheck disable=SC2154
 
-source ${OPENCOARRAYS_SRC_DIR}/prerequisites/build-functions/edit_GCC_download_prereqs_file_if_necessary.sh
+# shellcheck source=prerequisites/build-functions/edit_GCC_download_prereqs_file_if_necessary.sh
+source "${OPENCOARRAYS_SRC_DIR}/prerequisites/build-functions/edit_GCC_download_prereqs_file_if_necessary.sh"
 
 build_and_install()
 {
@@ -20,6 +21,13 @@ build_and_install()
 
   if [[ "${package_to_build}" != "gcc" ]]; then
 
+    if [[ "${package_to_build}" == "mpich" && "${version_to_build}" == "3.2" ]]; then
+      info "Patching MPICH 3.2 on Mac OS due to segfault bug (see http://lists.mpich.org/pipermail/discuss/2016-May/004764.html)."
+      sed 's/} MPID_Request ATTRIBUTE((__aligned__(32)));/} ATTRIBUTE((__aligned__(32))) MPID_Request;/g' \
+        "${download_path}/${package_source_directory}/src/include/mpiimpl.h" > "${download_path}/${package_source_directory}/src/include/mpiimpl.h.patched"
+      cp "${download_path}/${package_source_directory}/src/include/mpiimpl.h.patched" "${download_path}/${package_source_directory}/src/include/mpiimpl.h"
+    fi
+
     info "Configuring ${package_to_build} ${version_to_build} with the following command:"
     info "FC=\"${FC:-'gfortran'}\" CC=\"${CC:-'gcc'}\" CXX=\"${CXX:-'g++'}\" \"${download_path}/${package_source_directory}\"/configure --prefix=\"${install_path}\""
     FC="${FC:-'gfortran'}" CC="${CC:-'gcc'}" CXX="${CXX:-'g++'}" "${download_path}/${package_source_directory}"/configure --prefix="${install_path}"
diff --git a/prerequisites/build-functions/edit_GCC_download_prereqs_file_if_necessary.sh b/prerequisites/build-functions/edit_GCC_download_prereqs_file_if_necessary.sh
index e49dcd8..5b4a662 100644
--- a/prerequisites/build-functions/edit_GCC_download_prereqs_file_if_necessary.sh
+++ b/prerequisites/build-functions/edit_GCC_download_prereqs_file_if_necessary.sh
@@ -14,7 +14,7 @@ replace_wget()
     sed -i${backup_extension} -e '2 a\'$'\n'". ${OPENCOARRAYS_SRC_DIR}/prerequisites/build-functions/ftp_url.sh"$'\n' "${download_prereqs_file}"
   fi
 
-  arg_string="${gcc_prereqs_fetch_args[@]:-}"
+  arg_string="${gcc_prereqs_fetch_args[*]:-}"
 
   info "Using the following command to replace wget in the GCC download_prerequisites file:"
   info "sed -i${backup_extension} s/\"${wget_command}\"/\"${gcc_prereqs_fetch} ${arg_string} \"/ \"${download_prereqs_file}\""
@@ -31,7 +31,7 @@ edit_GCC_download_prereqs_file_if_necessary()
   download_prereqs_file="${PWD}/contrib/download_prerequisites"
 
   # Grab the line with the first occurence of 'wget'
-  wget_line=`grep wget "${download_prereqs_file}" | head -1` || true
+  wget_line=$(grep wget "${download_prereqs_file}" | head -1) || true
   wget_command="${wget_line%%ftp*}" # grab everything before ftp
 
   # Check for wget format used before GCC 7
diff --git a/prerequisites/build-functions/set_or_print_default_version.sh b/prerequisites/build-functions/set_or_print_default_version.sh
index a168549..9b0b010 100644
--- a/prerequisites/build-functions/set_or_print_default_version.sh
+++ b/prerequisites/build-functions/set_or_print_default_version.sh
@@ -28,7 +28,7 @@ set_or_print_default_version()
   package_version=(
     "cmake:3.4.0"
     "gcc:6.1.0"
-    "mpich:3.1.4"
+    "mpich:3.2"
     "wget:1.16.3"
     "flex:2.6.0"
     "bison:3.0.4"
diff --git a/prerequisites/install-functions/build_opencoarrays.sh b/prerequisites/install-functions/build_opencoarrays.sh
index 5e3a745..11fb282 100644
--- a/prerequisites/install-functions/build_opencoarrays.sh
+++ b/prerequisites/install-functions/build_opencoarrays.sh
@@ -22,9 +22,17 @@ build_opencoarrays()
   FC="${MPIFC_show[0]}"
   # Set CC to the MPI implementation's gcc command...
   CC="${MPICC_show[0]}"
+  # try to find mpiexec
+  MPI_BIN_DIR="$(type -P "${MPICC}")"
+  MPIEXEC_CANDIDATES=($(find "${MPI_BIN_DIR%/*}" -name 'mpiexec' -o -name 'mpirun' -o -name 'lamexec' -o -name 'srun'))
+  if ! ((${#MPIEXEC_CANDIDATES[@]} >= 1)); then
+    emergency "Could not find a suitable \`mpiexec\` in directory containing mpi wrappers (${MPICC%/*})"
+  else
+    MPIEXEC="${MPIEXEC_CANDIDATES[0]}"
+  fi
   info "Configuring OpenCoarrays in ${PWD} with the command:"
-  info "CC=\"${CC}\" FC=\"${FC}\" $CMAKE \"${opencoarrays_src_dir}\" -DCMAKE_INSTALL_PREFIX=\"${install_path}\" -DMPI_C_COMPILER=\"${MPICC}\" -DMPI_Fortran_COMPILER=\"${MPIFC}\""
-  CC="${CC}" FC="${FC}" $CMAKE "${opencoarrays_src_dir}" -DCMAKE_INSTALL_PREFIX="${install_path}" -DMPI_C_COMPILER="${MPICC}" -DMPI_Fortran_COMPILER="${MPIFC}"
+  info "CC=\"${CC}\" FC=\"${FC}\" $CMAKE \"${opencoarrays_src_dir}\" -DCMAKE_INSTALL_PREFIX=\"${install_path}\" -DMPIEXEC=\"${MPIEXEC}\" -DMPI_C_COMPILER=\"${MPICC}\" -DMPI_Fortran_COMPILER=\"${MPIFC}\""
+  CC="${CC}" FC="${FC}" $CMAKE "${opencoarrays_src_dir}" -DCMAKE_INSTALL_PREFIX="${install_path}" -DMPIEXEC="${MPIEXEC}" -DMPI_C_COMPILER="${MPICC}" -DMPI_Fortran_COMPILER="${MPIFC}"
   info "Building OpenCoarrays in ${PWD} with the command make -j${num_threads}"
   make "-j${num_threads}"
   if [[ ! -z ${SUDO:-} ]]; then
@@ -33,4 +41,3 @@ build_opencoarrays()
   info "Installing OpenCoarrays in ${install_path} with the command ${SUDO:-} make install"
   ${SUDO:-} make install
 }
-
diff --git a/prerequisites/install-functions/print_header.sh b/prerequisites/install-functions/print_header.sh
index 08e9a44..320b452 100644
--- a/prerequisites/install-functions/print_header.sh
+++ b/prerequisites/install-functions/print_header.sh
@@ -4,7 +4,7 @@ print_header()
   clear
   echo ""
   echo "*** By default, building OpenCoarrays requires CMake 3.4.0 or later,      ***"
-  echo "*** MPICH 3.1.4, and GCC Fortran (gfortran) 6.1.0 or later.  To see       ***"
+  echo "*** MPICH 3.2, and GCC Fortran (gfortran) 6.1.0 or later.  To see         ***"
   echo "*** options for forcing the use of older or alternative packages, execute ***"
   echo "*** this script with the -h flag.  This script will recursively traverse  ***"
   echo "*** the following dependency tree, asking permission to download, build,  ***"
diff --git a/prerequisites/install-functions/report_results.sh b/prerequisites/install-functions/report_results.sh
index dac3c39..b917379 100644
--- a/prerequisites/install-functions/report_results.sh
+++ b/prerequisites/install-functions/report_results.sh
@@ -45,7 +45,17 @@ report_results()
     echo "# Execute this script via the following command:                                " | tee -a setup.csh setup.sh
     echo "# source ${install_path%/}/setup.sh                                             " | tee -a setup.csh setup.sh
     echo "                                                                                " | tee -a setup.csh setup.sh
+    if [[ -x "$cmake_install_path/cmake" ]]; then
+      echo "# Prepend the CMake path to the PATH environment variable:" | tee -a setup.sh setup.csh
+      echo "if [[ -z \"\$PATH\" ]]; then                                         " >> setup.sh
+      echo "  export PATH=\"${cmake_install_path%/}/\"                            " >> setup.sh
+      echo "else                                                                 " >> setup.sh
+      echo "  export PATH=\"${cmake_install_path%/}/\":\$PATH                     " >> setup.sh
+      echo "fi                                                                   " >> setup.sh
+      echo "set path = (\"${cmake_install_path%/}\"/\"\$path\")                      " >> setup.csh
+    fi
     if [[ -x "$fully_qualified_FC" ]]; then
+      echo "# Prepend the compiler path to the PATH environment variable:" | tee -a setup.sh setup.csh
       echo "if [[ -z \"\$PATH\" ]]; then                                                  " >> setup.sh
       echo "  export PATH=\"${compiler_install_root%/}/bin\"                              " >> setup.sh
       echo "else                                                                          " >> setup.sh
@@ -54,6 +64,7 @@ report_results()
       echo "set path = (\"${compiler_install_root%/}\"/bin \"\$path\")                    " >> setup.csh
     fi
     if [[ -d "${compiler_install_root%/}/lib" || -d "${compiler_install_root%/}/lib64" ]]; then
+      echo "# Prepend the compiler library paths to the LD_LIBRARY_PATH environment variable:" | tee -a setup.sh setup.csh
       compiler_lib_paths="${compiler_install_root%/}/lib64/:${compiler_install_root%/}/lib"
       echo "if [[ -z \"\$LD_LIBRARY_PATH\" ]]; then                                       " >> setup.sh
       echo "  export LD_LIBRARY_PATH=\"${compiler_lib_paths%/}\"                          " >> setup.sh
@@ -64,6 +75,7 @@ report_results()
     fi
     echo "                                                                       " >> setup.sh
     if [[ -x "$mpi_install_root/bin/mpif90" ]]; then
+      echo "# Prepend the MPI path to the PATH environment variable:" | tee -a setup.sh setup.csh
       echo "if [[ -z \"\$PATH\" ]]; then                                         " >> setup.sh
       echo "  export PATH=\"${mpi_install_root%/}/bin\"                        " >> setup.sh
       echo "else                                                                 " >> setup.sh
@@ -71,14 +83,6 @@ report_results()
       echo "fi                                                                   " >> setup.sh
       echo "set path = (\"${mpi_install_root%/}\"/bin \"\$path\")              " >> setup.csh
     fi
-    if [[ -x "$cmake_install_path/cmake" ]]; then
-      echo "if [[ -z \"\$PATH\" ]]; then                                         " >> setup.sh
-      echo "  export PATH=\"${cmake_install_path%/}/\"                            " >> setup.sh
-      echo "else                                                                 " >> setup.sh
-      echo "  export PATH=\"${cmake_install_path%/}/\":\$PATH                     " >> setup.sh
-      echo "fi                                                                   " >> setup.sh
-      echo "set path = (\"${cmake_install_path%/}\"/\"\$path\")                      " >> setup.csh
-    fi
     # In all likelihood, the following paths are only needed if OpenCoarrays built them,
     # In by far the most common such use case, they would have been built in a recursive
     # build of all the OpenCoarrays dependency tree (rather than built indvidually via
@@ -88,6 +92,7 @@ report_results()
     # user doesn't need them at all (e.g. there was no need to build gfortran from source).
     flex_install_path=$("${build_script}" -P flex)
     if [[ -x "$flex_install_path/bin/flex" ]]; then
+      echo "# Prepend the flex path to the PATH environment variable:" | tee -a setup.sh setup.csh
       echo "if [[ -z \"\$PATH\" ]]; then                                         " >> setup.sh
       echo "  export PATH=\"$flex_install_path/bin\"                             " >> setup.sh
       echo "else                                                                 " >> setup.sh
@@ -97,6 +102,7 @@ report_results()
     fi
     bison_install_path=$("${build_script}" -P bison)
     if [[ -x "$bison_install_path/bin/yacc" ]]; then
+      echo "# Prepend the bison path to the PATH environment variable:" | tee -a setup.sh setup.csh
       echo "if [[ -z \"\$PATH\" ]]; then                                         " >> setup.sh
       echo "  export PATH=\"$bison_install_path/bin\"                            " >> setup.sh
       echo "else                                                                 " >> setup.sh
@@ -106,6 +112,7 @@ report_results()
     fi
     m4_install_path=$("${build_script}" -P m4)
     if [[ -x "$m4_install_path/bin/m4" ]]; then
+      echo "# Prepend the m4 path to the PATH environment variable:" | tee -a setup.sh setup.csh
       echo "if [[ -z \"\$PATH\" ]]; then                                         " >> setup.sh
       echo "  export PATH=\"$m4_install_path/bin\"                               " >> setup.sh
       echo "else                                                                 " >> setup.sh
@@ -115,6 +122,7 @@ report_results()
     fi
     opencoarrays_install_path="${install_path}"
     if [[ -x "$opencoarrays_install_path/bin/caf" ]]; then
+      echo "# Prepend the OpenCoarrays path to the PATH environment variable:" | tee -a setup.sh setup.csh
       echo "if [[ -z \"\$PATH\" ]]; then                                         " >> setup.sh
       echo "  export PATH=\"${opencoarrays_install_path%/}/bin\"                     " >> setup.sh
       echo "else                                                                 " >> setup.sh
diff --git a/src/single/CMakeLists.txt b/src/single/CMakeLists.txt
deleted file mode 100644
index 013ba7a..0000000
--- a/src/single/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-add_library(caf_single single.c ../common/caf_auxiliary.c)
-target_compile_options(caf_single INTERFACE -fcoarray=lib)
-install(TARGETS caf_single EXPORT OpenCoarraysTargets
-  ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
-)
diff --git a/src/single/Makefile b/src/single/Makefile
deleted file mode 100644
index cf43559..0000000
--- a/src/single/Makefile
+++ /dev/null
@@ -1,19 +0,0 @@
-include ../make.inc
-
-libcaf_single.a: single.o ../common/caf_auxiliary.o
-	ar rcv $@ single.o ../common/caf_auxiliary.o
-	ranlib $@
-
-.c.o:
-	$(CC) $(CFLAGS) $(SINGLE_CFLAGS) -I.. -c $< -o $@
-
-single.o: single.c ../libcaf.h ../libcaf-gfortran-descriptor.h
-
-../common/caf_auxiliary.o:
-	$(MAKE) -C ../common
-
-clean:
-	rm -f single.o
-
-distclean: clean
-	rm -f libcaf_single.a
diff --git a/src/single/single.c b/src/single/single.c
deleted file mode 100644
index b032e51..0000000
--- a/src/single/single.c
+++ /dev/null
@@ -1,727 +0,0 @@
-/* Single-Image implementation of Libcaf
-
-Copyright (c) 2012-2014, Sourcery, Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * Neither the name of the Sourcery, Inc., nor the
-      names of its contributors may be used to endorse or promote products
-      derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL SOURCERY, INC., BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */
-
-#include "libcaf.h"
-#include <stdio.h>  /* For fputs and fprintf.  */
-#include <stdlib.h> /* For exit and malloc.  */
-#include <string.h> /* For memcpy and memset.  */
-#include <stdarg.h> /* For variadic arguments.  */
-
-/* Define GFC_CAF_CHECK to enable run-time checking.  */
-/* #define GFC_CAF_CHECK  1  */
-
-/* Single-image implementation of the CAF library.
-   Note: For performance reasons -fcoarry=single should be used
-   rather than this library.  */
-
-typedef void* single_token_t;
-#define TOKEN(X) ((single_token_t) (X))
-
-
-/* Global variables.  */
-caf_static_t *caf_static_list = NULL;
-
-
-/* Keep in sync with mpi.c.  */
-static void
-caf_runtime_error (const char *message, ...)
-{
-  va_list ap;
-  fprintf (stderr, "Fortran runtime error: ");
-  va_start (ap, message);
-  vfprintf (stderr, message, ap);
-  va_end (ap);
-  fprintf (stderr, "\n");
-
-  /* FIXME: Shutdown the Fortran RTL to flush the buffer.  PR 43849.  */
-  exit (EXIT_FAILURE);
-}
-
-void
-PREFIX(init) (int *argc __attribute__ ((unused)),
-	      char ***argv __attribute__ ((unused)))
-{
-}
-
-
-void
-PREFIX (finalize) (void)
-{
-  while (caf_static_list != NULL)
-    {
-      caf_static_t *tmp = caf_static_list->prev;
-      free (TOKEN (caf_static_list->token));
-      free (caf_static_list);
-      caf_static_list = tmp;
-    }
-}
-
-
-int
-PREFIX (this_image) (int distance __attribute__ ((unused)))
-{
-  return 1;
-}
-
-
-int
-PREFIX (num_images) (int distance __attribute__ ((unused)),
-		    int failed __attribute__ ((unused)))
-{
-  return 1;
-}
-
-
-void *
-PREFIX (register) (size_t size, caf_register_t type, caf_token_t *token,
-		  int *stat, char *errmsg, int errmsg_len)
-{
-  void *local;
-
-  local = malloc (size);
-  *token = malloc (sizeof (single_token_t));
-
-  if (unlikely (local == NULL || TOKEN (*token) == NULL))
-    {
-      const char msg[] = "Failed to allocate coarray";
-      if (stat)
-	{
-	  *stat = 1;
-	  if (errmsg_len > 0)
-	    {
-	      int len = ((int) sizeof (msg) > errmsg_len) ? errmsg_len
-							  : (int) sizeof (msg);
-	      memcpy (errmsg, msg, len);
-	      if (errmsg_len > len)
-		memset (&errmsg[len], ' ', errmsg_len-len);
-	    }
-	  return NULL;
-	}
-      else
-	  caf_runtime_error (msg);
-    }
-
-  *token = local;
-
-  if (stat)
-    *stat = 0;
-
-  if (type == CAF_REGTYPE_COARRAY_STATIC)
-    {
-      caf_static_t *tmp = malloc (sizeof (caf_static_t));
-      tmp->prev  = caf_static_list;
-      tmp->token = *token;
-      caf_static_list = tmp;
-    }
-  return local;
-}
-
-
-void
-PREFIX (deregister) (caf_token_t *token, int *stat,
-		     char *errmsg __attribute__ ((unused)),
-		     int errmsg_len __attribute__ ((unused)))
-{
-  free (TOKEN (*token));
-
-  if (stat)
-    *stat = 0;
-}
-
-
-static void
-convert_type (void *dst, int dst_type, int dst_kind, void *src,
-		       int src_type, int src_kind)
-{
-#ifdef HAVE_GFC_INTEGER_16
-   typedef __int128 int128t;
-#else
-   typedef int64_t int128t;
-#endif
-
-#if defined(GFC_REAL_16_IS_LONG_DOUBLE)
-   typedef long double real128t;
-   typedef _Complex long double complex128t;
-#elif defined(HAVE_GFC_REAL_16)
-   typedef _Complex float __attribute__((mode(TC))) __complex128;
-   typedef __float128 real128t;
-   typedef __complex128 complex128t;
-#elif defined(HAVE_GFC_REAL_10)
-   typedef long double real128t;
-   typedef long double complex128t;
-#else
-   typedef double real128t;
-   typedef _Complex double complex128t;
-#endif
-
-   int128t int_val = 0;
-   real128t real_val = 0;
-   complex128t cmpx_val = 0;
-
-   switch (src_type)
-     {
-     case BT_INTEGER:
-	if (src_kind == 1)
-	  int_val = *(int8_t*) src;
-	else if (src_kind == 2)
-	  int_val = *(int16_t*) src;
-	else if (src_kind == 4)
-	  int_val = *(int32_t*) src;
-	else if (src_kind == 8)
-	  int_val = *(int64_t*) src;
-#ifdef HAVE_GFC_INTEGER_16
-	else if (src_kind == 16)
-	  int_val = *(int128t*) src;
-#endif
-	else
-	  goto error;
-	break;
-     case BT_REAL:
-	if (src_kind == 4)
-	  real_val = *(float*) src;
-	else if (src_kind == 8)
-	  real_val = *(double*) src;
-#ifdef HAVE_GFC_REAL_10
-	else if (src_kind == 10)
-	  real_val = *(long double*) src;
-#endif
-#ifdef HAVE_GFC_REAL_16
-	else if (src_kind == 16)
-	  real_val = *(real128t*) src;
-#endif
-	else
-	  goto error;
-	break;
-     case BT_COMPLEX:
-	if (src_kind == 4)
-	  cmpx_val = *(_Complex float*) src;
-	else if (src_kind == 8)
-	  cmpx_val = *(_Complex double*) src;
-#ifdef HAVE_GFC_REAL_10
-	else if (src_kind == 10)
-	  cmpx_val = *(_Complex long double*) src;
-#endif
-#ifdef HAVE_GFC_REAL_16
-	else if (src_kind == 16)
-	  cmpx_val = *(complex128t*) src;
-#endif
-	else
-	  goto error;
-	break;
-     default:
-	goto error;
-     }
-
-   switch (dst_type)
-     {
-     case BT_INTEGER:
-	if (src_type == BT_INTEGER)
-	  {
-	    if (dst_kind == 1)
-	      *(int8_t*) dst = (int8_t) int_val;
-	    else if (dst_kind == 2)
-	      *(int16_t*) dst = (int16_t) int_val;
-	    else if (dst_kind == 4)
-	      *(int32_t*) dst = (int32_t) int_val;
-	    else if (dst_kind == 8)
-	      *(int64_t*) dst = (int64_t) int_val;
-#ifdef HAVE_GFC_INTEGER_16
-	    else if (dst_kind == 16)
-	      *(int128t*) dst = (int128t) int_val;
-#endif
-	    else
-	      goto error;
-	  }
-        else if (src_type == BT_REAL)
-	  {
-	    if (dst_kind == 1)
-	      *(int8_t*) dst = (int8_t) real_val;
-	    else if (dst_kind == 2)
-	      *(int16_t*) dst = (int16_t) real_val;
-	    else if (dst_kind == 4)
-	      *(int32_t*) dst = (int32_t) real_val;
-	    else if (dst_kind == 8)
-	      *(int64_t*) dst = (int64_t) real_val;
-#ifdef HAVE_GFC_INTEGER_16
-	    else if (dst_kind == 16)
-	      *(int128t*) dst = (int128t) real_val;
-#endif
-	    else
-	      goto error;
-	  }
-        else if (src_type == BT_COMPLEX)
-	  {
-	    if (dst_kind == 1)
-	      *(int8_t*) dst = (int8_t) cmpx_val;
-	    else if (dst_kind == 2)
-	      *(int16_t*) dst = (int16_t) cmpx_val;
-	    else if (dst_kind == 4)
-	      *(int32_t*) dst = (int32_t) cmpx_val;
-	    else if (dst_kind == 8)
-	      *(int64_t*) dst = (int64_t) cmpx_val;
-#ifdef HAVE_GFC_INTEGER_16
-	    else if (dst_kind == 16)
-	      *(int128t*) dst = (int128t) cmpx_val;
-#endif
-	    else
-	      goto error;
-	  }
-        else
-          goto error;
-	break;
-     case BT_REAL:
-	if (src_type == BT_INTEGER)
-	  {
-	    if (dst_kind == 4)
-	      *(float*) dst = (float) int_val;
-	    else if (dst_kind == 8)
-	      *(double*) dst = (double) int_val;
-#ifdef HAVE_GFC_REAL_10
-	    else if (dst_kind == 10)
-	      *(long double*) dst = (long double) int_val;
-#endif
-#ifdef HAVE_GFC_REAL_16
-	    else if (dst_kind == 16)
-	      *(real128t*) dst = (real128t) int_val;
-#endif
-	    else
-	      goto error;
-	  }
-	else if (src_type == BT_REAL)
-	  {
-	    if (dst_kind == 4)
-	      *(float*) dst = (float) real_val;
-	    else if (dst_kind == 8)
-	      *(double*) dst = (double) real_val;
-#ifdef HAVE_GFC_REAL_10
-	    else if (dst_kind == 10)
-	      *(long double*) dst = (long double) real_val;
-#endif
-#ifdef HAVE_GFC_REAL_16
-	    else if (dst_kind == 16)
-	      *(real128t*) dst = (real128t) real_val;
-#endif
-	    else
-	      goto error;
-	  }
-	else if (src_type == BT_COMPLEX)
-	  {
-	    if (dst_kind == 4)
-	      *(float*) dst = (float) cmpx_val;
-	    else if (dst_kind == 8)
-	      *(double*) dst = (double) cmpx_val;
-#ifdef HAVE_GFC_REAL_10
-	    else if (dst_kind == 10)
-	      *(long double*) dst = (long double) cmpx_val;
-#endif
-#ifdef HAVE_GFC_REAL_16
-	    else if (dst_kind == 16)
-	      *(real128t*) dst = (real128t) cmpx_val;
-#endif
-	    else
-	      goto error;
-	  }
-	break;
-     case BT_COMPLEX:
-	if (src_type == BT_INTEGER)
-	  {
-	    if (dst_kind == 4)
-	      *(_Complex float*) dst = (_Complex float) int_val;
-	    else if (dst_kind == 8)
-	      *(_Complex double*) dst = (_Complex double) int_val;
-#ifdef HAVE_GFC_REAL_10
-	    else if (dst_kind == 10)
-	      *(_Complex long double*) dst = (_Complex long double) int_val;
-#endif
-#ifdef HAVE_GFC_REAL_16
-	    else if (dst_kind == 16)
-	      *(complex128t*) dst = (complex128t) int_val;
-#endif
-	    else
-	      goto error;
-	  }
-	else if (src_type == BT_REAL)
-	  {
-	    if (dst_kind == 4)
-	      *(_Complex float*) dst = (_Complex float) real_val;
-	    else if (dst_kind == 8)
-	      *(_Complex double*) dst = (_Complex double) real_val;
-#ifdef HAVE_GFC_REAL_10
-	    else if (dst_kind == 10)
-	      *(_Complex long double*) dst = (_Complex long double) real_val;
-#endif
-#ifdef HAVE_GFC_REAL_16
-	    else if (dst_kind == 16)
-	      *(complex128t*) dst = (complex128t) real_val;
-#endif
-	    else
-	      goto error;
-	  }
-	else if (src_type == BT_COMPLEX)
-	  {
-	    if (dst_kind == 4)
-	      *(_Complex float*) dst = (_Complex float) cmpx_val;
-	    else if (dst_kind == 8)
-	      *(_Complex double*) dst = (_Complex double) cmpx_val;
-#ifdef HAVE_GFC_REAL_10
-	    else if (dst_kind == 10)
-	      *(_Complex long double*) dst = (_Complex long double) cmpx_val;
-#endif
-#ifdef HAVE_GFC_REAL_16
-	    else if (dst_kind == 16)
-	      *(complex128t*) dst = (complex128t) cmpx_val;
-#endif
-	    else
-	      goto error;
-	  }
-	else
-	  goto error;
-	break;
-     default:
-        goto error;
-     }
-
-error:
-   fprintf (stderr, "RUNTIME ERROR: Cannot convert type %d kind "
-            "%d to type %d kind %d\n", src_type, src_kind, dst_type, dst_kind);
-   PREFIX (error_stop) (1);
-}/* Get a scalar (or contiguous) data from remote image into a buffer.  */
-
-
-void
-PREFIX (get) (caf_token_t token, size_t offset,
-	      int image_index __attribute__ ((unused)),
-	      gfc_descriptor_t *src ,
-	      caf_vector_t *src_vector __attribute__ ((unused)),
-	      gfc_descriptor_t *dest, int src_kind, int dst_kind)
-{
-  /* FIXME: Handle vector subscripts; check whether strings of different
-     kinds are permitted.  */
-  size_t i, k, size;
-  int j;
-  int rank = GFC_DESCRIPTOR_RANK (dest);
-  size_t src_size = GFC_DESCRIPTOR_SIZE (src);
-  size_t dst_size = GFC_DESCRIPTOR_SIZE (dest);
-
-  if (rank == 0)
-    {
-      void *sr = (void *) ((char *) TOKEN (token) + offset);
-      if (GFC_DESCRIPTOR_TYPE (dest) == GFC_DESCRIPTOR_TYPE (src)
-	  && dst_kind == src_kind)
-	memmove (dest->base_addr, sr,
-		 dst_size > src_size ? src_size : dst_size);
-      else
-	convert_type (dest->base_addr, GFC_DESCRIPTOR_TYPE (dest),
-		      dst_kind, sr, GFC_DESCRIPTOR_TYPE (src), src_kind);
-      if (GFC_DESCRIPTOR_TYPE (dest) == BT_CHARACTER && dst_size > src_size)
-	{
-	  if (dst_kind == 1)
-	    memset ((void*)(char*) dest->base_addr + src_size, ' ',
-		    dst_size-src_size);
-	  else /* dst_kind == 4.  */
-	    for (i = src_size/4; i < dst_size/4; i++)
-	      ((int32_t*) dest->base_addr)[i] = (int32_t) ' ';
-	}
-      return;
-    }
-
-  size = 1;
-  for (j = 0; j < rank; j++)
-    {
-      ptrdiff_t dimextent = dest->dim[j]._ubound - dest->dim[j].lower_bound + 1;
-      if (dimextent < 0)
-	dimextent = 0;
-      size *= dimextent;
-    }
-
-  if (size == 0)
-    return;
-
-  for (i = 0; i < size; i++)
-    {
-      ptrdiff_t array_offset_dst = 0;
-      ptrdiff_t stride = 1;
-      ptrdiff_t extent = 1;
-      for (j = 0; j < rank-1; j++)
-	{
-	  array_offset_dst += ((i / (extent*stride))
-			       % (dest->dim[j]._ubound
-				  - dest->dim[j].lower_bound + 1))
-			      * dest->dim[j]._stride;
-	  extent = (dest->dim[j]._ubound - dest->dim[j].lower_bound + 1);
-          stride = dest->dim[j]._stride;
-	}
-      array_offset_dst += (i / extent) * dest->dim[rank-1]._stride;
-      void *dst = dest->base_addr + array_offset_dst*GFC_DESCRIPTOR_SIZE (dest);
-
-      ptrdiff_t array_offset_sr = 0;
-      stride = 1;
-      extent = 1;
-      for (j = 0; j < GFC_DESCRIPTOR_RANK (src)-1; j++)
-	{
-	  array_offset_sr += ((i / (extent*stride))
-			       % (src->dim[j]._ubound
-				  - src->dim[j].lower_bound + 1))
-			     * src->dim[j]._stride;
-	  extent = (src->dim[j]._ubound - src->dim[j].lower_bound + 1);
-	  stride = src->dim[j]._stride;
-	}
-      array_offset_sr += (i / extent) * src->dim[rank-1]._stride;
-      void *sr = (void *)((char *) TOKEN (token) + offset
-			  + array_offset_sr*GFC_DESCRIPTOR_SIZE (src));
-
-      if (GFC_DESCRIPTOR_TYPE (dest) == GFC_DESCRIPTOR_TYPE (src)
-	  && dst_kind == src_kind)
-	memmove (dst, sr, dst_size > src_size ? src_size : dst_size);
-      else
-	convert_type (dst, GFC_DESCRIPTOR_TYPE (dest), dst_kind,
-		      sr, GFC_DESCRIPTOR_TYPE (src), src_kind);
-      if (GFC_DESCRIPTOR_TYPE (dest) == BT_CHARACTER && dst_size > src_size)
-	{
-	  if (dst_kind == 1)
-	    memset ((void*)(char*) dst + src_size, ' ', dst_size-src_size);
-	  else /* dst_kind == 4.  */
-	    for (k = src_size/4; k < dst_size/4; i++)
-	      ((int32_t*) dst)[i] = (int32_t) ' ';
-	}
-    }
-}
-
-
-void
-PREFIX (send) (caf_token_t token, size_t offset,
-	       int image_index __attribute__ ((unused)),
-	       gfc_descriptor_t *dest,
-	       caf_vector_t *dst_vector __attribute__ ((unused)),
-	       gfc_descriptor_t *src, int dst_kind,
-	       int src_kind)
-{
-  /* FIXME: Handle vector subscripts; check whether strings of different
-     kinds are permitted.  */
-  size_t i, k, size;
-  int j;
-  int rank = GFC_DESCRIPTOR_RANK (dest);
-  size_t src_size = GFC_DESCRIPTOR_SIZE (src);
-  size_t dst_size = GFC_DESCRIPTOR_SIZE (dest);
-
-  if (rank == 0)
-    {
-      void *dst = (void *) ((char *) TOKEN (token) + offset);
-      if (GFC_DESCRIPTOR_TYPE (dest) == GFC_DESCRIPTOR_TYPE (src)
-	  && dst_kind == src_kind)
-	memmove (dst, src->base_addr,
-		 dst_size > src_size ? src_size : dst_size);
-      else
-	convert_type (dst, GFC_DESCRIPTOR_TYPE (dest), dst_kind, src->base_addr,
-		      GFC_DESCRIPTOR_TYPE (src), src_kind);
-      if (GFC_DESCRIPTOR_TYPE (dest) == BT_CHARACTER && dst_size > src_size)
-	{
-	  if (dst_kind == 1)
-	    memset ((void*)(char*) dst + src_size, ' ', dst_size-src_size);
-	  else /* dst_kind == 4.  */
-	    for (i = src_size/4; i < dst_size/4; i++)
-	      ((int32_t*) dst)[i] = (int32_t) ' ';
-	}
-      return;
-    }
-
-  size = 1;
-  for (j = 0; j < rank; j++)
-    {
-      ptrdiff_t dimextent = dest->dim[j]._ubound - dest->dim[j].lower_bound + 1;
-      if (dimextent < 0)
-	dimextent = 0;
-      size *= dimextent;
-    }
-
-  if (size == 0)
-    return;
-
-  for (i = 0; i < size; i++)
-    {
-      ptrdiff_t array_offset_dst = 0;
-      ptrdiff_t stride = 1;
-      ptrdiff_t extent = 1;
-      for (j = 0; j < rank-1; j++)
-	{
-	  array_offset_dst += ((i / (extent*stride))
-			       % (dest->dim[j]._ubound
-				  - dest->dim[j].lower_bound + 1))
-			      * dest->dim[j]._stride;
-	  extent = (dest->dim[j]._ubound - dest->dim[j].lower_bound + 1);
-          stride = dest->dim[j]._stride;
-	}
-      array_offset_dst += (i / extent) * dest->dim[rank-1]._stride;
-      void *dst = (void *)((char *) TOKEN (token) + offset
-			   + array_offset_dst*GFC_DESCRIPTOR_SIZE (dest));
-      void *sr;
-      if (GFC_DESCRIPTOR_RANK (src) != 0)
-	{
-	  ptrdiff_t array_offset_sr = 0;
-	  stride = 1;
-	  extent = 1;
-	  for (j = 0; j < GFC_DESCRIPTOR_RANK (src)-1; j++)
-	    {
-	      array_offset_sr += ((i / (extent*stride))
-				  % (src->dim[j]._ubound
-				     - src->dim[j].lower_bound + 1))
-				 * src->dim[j]._stride;
-	      extent = (src->dim[j]._ubound - src->dim[j].lower_bound + 1);
-	      stride = src->dim[j]._stride;
-	    }
-	  array_offset_sr += (i / extent) * src->dim[rank-1]._stride;
-	  sr = (void *)((char *) src->base_addr
-			+ array_offset_sr*GFC_DESCRIPTOR_SIZE (src));
-	}
-      else
-	sr = src->base_addr;
-
-      if (GFC_DESCRIPTOR_TYPE (dest) == GFC_DESCRIPTOR_TYPE (src)
-	  && dst_kind == src_kind)
-	memmove (dst, sr, dst_size > src_size ? src_size : dst_size);
-      else
-	convert_type (dst, GFC_DESCRIPTOR_TYPE (dest), dst_kind, sr,
-		      GFC_DESCRIPTOR_TYPE (src), src_kind);
-      if (GFC_DESCRIPTOR_TYPE (dest) == BT_CHARACTER && dst_size > src_size)
-	{
-	  if (dst_kind == 1)
-	    memset ((void*)(char*) dst + src_size, ' ', dst_size-src_size);
-	  else /* dst_kind == 4.  */
-	    for (k = src_size/4; k < dst_size/4; i++)
-	      ((int32_t*) dst)[i] = (int32_t)' ';
-	}
-    }
-}
-
-
-void
-PREFIX (sendget) (caf_token_t dst_token, size_t dst_offset, int dst_image_index,
-		  gfc_descriptor_t *dest, caf_vector_t *dst_vector,
-		  caf_token_t src_token, size_t src_offset,
-		  int src_image_index __attribute__ ((unused)),
-		  gfc_descriptor_t *src,
-		  caf_vector_t *src_vector __attribute__ ((unused)),
-		  int dst_len, int src_len)
-{
-  /* FIXME: Handle vector subscript of 'src_vector'.  */
-  /* For a single image, src->base_addr should be the same as src_token + offset
-     but to play save, we do it properly.  */
-  void *src_base = src->base_addr;
-  src->base_addr = (void *) ((char *) TOKEN (src_token) + src_offset);
-  PREFIX (send) (dst_token, dst_offset, dst_image_index, dest, dst_vector,
-		 src, dst_len, src_len);
-  src->base_addr = src_base;
-}
-
-
-void
-PREFIX (co_sum) (gfc_descriptor_t *a __attribute__ ((unused)),
-		 int result_image __attribute__ ((unused)), int *stat,
-		 char *errmsg __attribute__ ((unused)),
-		 int errmsg_len __attribute__ ((unused)))
-{
-  if (stat)
-    *stat = 0;
-}
-
-
-void
-PREFIX (co_min) (gfc_descriptor_t *a __attribute__ ((unused)),
-		 int result_image __attribute__ ((unused)), int *stat,
-		 char *errmsg __attribute__ ((unused)),
-		 int src_len __attribute__ ((unused)),
-		 int errmsg_len __attribute__ ((unused)))
-{
-  if (stat)
-    *stat = 0;
-}
-
-
-void
-PREFIX (co_max) (gfc_descriptor_t *a __attribute__ ((unused)),
-		 int result_image __attribute__ ((unused)), int *stat,
-		 char *errmsg __attribute__ ((unused)),
-		 int src_len __attribute__ ((unused)),
-		 int errmsg_len __attribute__ ((unused)))
-{
-  if (stat)
-    *stat = 0;
-}
-
-
-void
-PREFIX (sync_all) (int *stat,
-		   char *errmsg __attribute__ ((unused)),
-		   int errmsg_len __attribute__ ((unused)))
-{
-  if (stat)
-    *stat = 0;
-}
-
-
-void
-PREFIX (sync_images) (int count __attribute__ ((unused)),
-		      int images[] __attribute__ ((unused)),
-		      int *stat,
-		      char *errmsg __attribute__ ((unused)),
-		      int errmsg_len __attribute__ ((unused)))
-{
-#ifdef GFC_CAF_CHECK
-  int i;
-
-  for (i = 0; i < count; i++)
-    if (images[i] != 1)
-      {
-	fprintf (stderr, "COARRAY ERROR: Invalid image index %d to SYNC "
-		 "IMAGES", images[i]);
-	exit (EXIT_FAILURE);
-      }
-#endif
-
-  if (stat)
-    *stat = 0;
-}
-
-
-void
-PREFIX (error_stop_str) (const char *string, int32_t len)
-{
-  fputs ("ERROR STOP ", stderr);
-  while (len--)
-    fputc (*(string++), stderr);
-  fputs ("\n", stderr);
-
-  exit (1);
-}
-
-
-void
-PREFIX(error_stop) (int32_t error)
-{
-  fprintf (stderr, "ERROR STOP %d\n", error);
-  exit (error);
-}
diff --git a/src/tests/regression/open/issue-172 b/src/tests/regression/open/issue-172
deleted file mode 120000
index 364883a..0000000
--- a/src/tests/regression/open/issue-172
+++ /dev/null
@@ -1 +0,0 @@
-../reported/issue-172-wrong-co_reduce.f90
\ No newline at end of file

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/open-coarrays.git



More information about the debian-science-commits mailing list