# NIST Fortran 77 Test Suite
# http://www.fortran-2000.com/ArnaudRecipes/fcvs21_f95.html
#
# Reference results generated with gfortran -v:
# Using built-in specs.
# COLLECT_GCC=gfortran
# COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
# OFFLOAD_TARGET_NAMES=nvptx-none
# OFFLOAD_TARGET_DEFAULT=1
# Target: x86_64-linux-gnu
# Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
# Thread model: posix
# gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
#
# Reference results for tests 905 and 907 generated with flang ~15.0.0 on
# Ubuntu 20.04 (aarch64-unknown-linux-gnu).
#
# See additional comments in `driver_run` script should reference
# results ever need to be updated.
#
# Following test have been intentionally ommitted due to feature
# deletion in Fortran 95 standard:
# F95: 103, 111, 252, 253, 255, 257, 259, 260, 719
#
# We omit these tests because they never pass with any recent
# compiler:
# 001, 406, 923
# 
# Tests make use of arithmetic IF which is now a deleted feature
# in Fortran 2008
# 
# Note that the NIST license allows redistribution but requires
# explicit acknowledgement of what has been changed. Please
# amend README file if you modify the tests.

include(CheckFortranCompilerFlag)

# clean-up fort.* files otherwise one of the tests will fail
llvm_test_prepare(rm -f %S/fort.*)

# Different compilers or different compiler options may produce slightly
# different but still valid outputs for some of these tests. By default, we will
# check that the outputs match the reference outputs exactly. However, when this
# option is set, we will check less strictly.
option(FCVS_ALLOW_FLEXIBLE_OUTPUT "Don't match the output of FCVS tests exactly")

# Group 1:
# Tests 905 and 907 use list-directed output, for which the standard allows some
# flexibility, e.g., with regards to how many white space characters or
# floating point decimals to print. Treat them separately.
set(SPECIAL_CASES "FM905.f" "FM907.f")
set(Source ${SPECIAL_CASES})
if (FCVS_ALLOW_FLEXIBLE_OUTPUT)
  set(FP_IGNOREWHITESPACE ON)

  # FM905 needs a higher relative tolerance than the rest. The reference output
  # contains 2.5E-11, but gfortran (reasonably) prints 2.50000003E-11. Both
  # should be accepted.
  set(FP_TOLERANCE 1.0e-7)
endif()
llvm_singlesource()
set(Source)

# Group 2:
# Generic case. Make sure to exclude the special cases which have already been
# added as part of Group 1.
file(GLOB Source CONFIGURE_DEPENDS *.f)
foreach (SPECIAL_CASE ${SPECIAL_CASES})
  list(FILTER Source EXCLUDE REGEX ${SPECIAL_CASE})
endforeach()

# Test 509 requires this flag in more recent versions of GCC.
# If this flag is not supported, the test should be excluded.
check_fortran_compiler_flag("-std=legacy" SUPPORTS_LEGACY)
if (SUPPORTS_LEGACY)
  add_compile_options(-std=legacy)
else()
  # Regex because the GLOB returns the full path to each file
  list(FILTER Source EXCLUDE REGEX "FM509\.f$")
endif()

# Skip some tests that currently fail with flang on Windows when using libpgmath.
# FIXME: Reenable these tests after libpgmath is fixed or after we no longer
# depend on it.
if (CMAKE_Fortran_COMPILER_ID STREQUAL "LLVMFlang" AND TARGET_OS STREQUAL "Windows")
  # Regex because the GLOB returns the full path to each file
  list(FILTER Source EXCLUDE REGEX "FM813\.f$")
  list(FILTER Source EXCLUDE REGEX "FM815\.f$")
  list(FILTER Source EXCLUDE REGEX "FM817\.f$")
  list(FILTER Source EXCLUDE REGEX "FM820\.f$")
  list(FILTER Source EXCLUDE REGEX "FM828\.f$")
  list(FILTER Source EXCLUDE REGEX "FM831\.f$")
  list(FILTER Source EXCLUDE REGEX "FM833\.f$")
endif()

set(FP_TOLERANCE 1.0e-11) # set by the most sensitive numerical test
if (NOT TARGET_OS STREQUAL "Windows")
  set(FP_IGNOREWHITESPACE OFF)
endif()
llvm_singlesource()

file(COPY lit.local.cfg DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
