From 75d74d99c7ae10b8f8300be465b5bc04a0b30ff8 Mon Sep 17 00:00:00 2001 From: Andrzej Warzynski Date: Mon, 14 Mar 2022 17:59:55 +0000 Subject: [PATCH] Revert "[flang] IEEE_ARITHMETIC must imply USE IEEE_EXCEPTIONS" This reverts commit b6a7600491d755f6f700fe245b2fc7b928264c58. It caused the following build failure: ``` ninja: error: dependency cycle: include/flang/__fortran_ieee_exceptions.mod -> include/flang/__fortran_ieee_exceptions.mod ``` See e.g.: * https://lab.llvm.org/buildbot/#/builders/172/builds/9595 To reproduce: ``` cmake -G Ninja \ -DLLVM_TARGETS_TO_BUILD=host \ -DCMAKE_BUILD_TYPE=Release \ -DLLVM_ENABLE_PROJECTS="clang;flang" \ ../../llvm ninja check-flang ``` --- flang/lib/Semantics/check-do-forall.cpp | 3 +- flang/module/__fortran_ieee_exceptions.f90 | 129 --------------------- flang/module/ieee_arithmetic.f90 | 5 - flang/module/ieee_exceptions.f90 | 116 +++++++++++++++++- flang/tools/f18/CMakeLists.txt | 5 - 5 files changed, 116 insertions(+), 142 deletions(-) delete mode 100644 flang/module/__fortran_ieee_exceptions.f90 diff --git a/flang/lib/Semantics/check-do-forall.cpp b/flang/lib/Semantics/check-do-forall.cpp index e1cc4266e8024..76d4ead4af091 100644 --- a/flang/lib/Semantics/check-do-forall.cpp +++ b/flang/lib/Semantics/check-do-forall.cpp @@ -279,8 +279,7 @@ class DoConcurrentBodyEnforce { " CONCURRENT"_err_en_US, doConcurrentSourcePosition_); } - if (name->symbol && - fromScope(*name->symbol, "__fortran_ieee_exceptions"s)) { + if (name->symbol && fromScope(*name->symbol, "ieee_exceptions"s)) { if (name->source == "ieee_set_halting_mode") { SayWithDo(context_, currentStatementSourcePosition_, "IEEE_SET_HALTING_MODE is not allowed in DO " diff --git a/flang/module/__fortran_ieee_exceptions.f90 b/flang/module/__fortran_ieee_exceptions.f90 deleted file mode 100644 index bd8782e4db5a6..0000000000000 --- a/flang/module/__fortran_ieee_exceptions.f90 +++ /dev/null @@ -1,129 +0,0 @@ -!===-- module/__fortran_ieee_exceptions.f90 --------------------------------===! -! -! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -! See https://llvm.org/LICENSE.txt for license information. -! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -! -!===------------------------------------------------------------------------===! - -! See Fortran 2018, clause 17 -! The content of the standard intrinsic IEEE_EXCEPTIONS module is packaged -! here under another name so that IEEE_ARITHMETIC can USE it and export its -! declarations without clashing with a non-intrinsic module in a program. - -module __Fortran_ieee_exceptions - - type :: ieee_flag_type ! Fortran 2018, 17.2 & 17.3 - private - integer(kind=1) :: flag = 0 - end type ieee_flag_type - - type(ieee_flag_type), parameter :: & - ieee_invalid = ieee_flag_type(1), & - ieee_overflow = ieee_flag_type(2), & - ieee_divide_by_zero = ieee_flag_type(4), & - ieee_underflow = ieee_flag_type(8), & - ieee_inexact = ieee_flag_type(16), & - ieee_denorm = ieee_flag_type(32) ! PGI extension - - type(ieee_flag_type), parameter :: & - ieee_usual(*) = [ & - ieee_overflow, ieee_divide_by_zero, ieee_invalid ], & - ieee_all(*) = [ & - ieee_usual, ieee_underflow, ieee_inexact, ieee_denorm ] - - type :: ieee_modes_type ! Fortran 2018, 17.7 - private - end type ieee_modes_type - - type :: ieee_status_type ! Fortran 2018, 17.7 - private - end type ieee_status_type - - private :: ieee_support_flag_2, ieee_support_flag_3, & - ieee_support_flag_4, ieee_support_flag_8, ieee_support_flag_10, & - ieee_support_flag_16 - interface ieee_support_flag - module procedure :: ieee_support_flag, & - ieee_support_flag_2, ieee_support_flag_3, & - ieee_support_flag_4, ieee_support_flag_8, ieee_support_flag_10, & - ieee_support_flag_16 - end interface - - contains - elemental subroutine ieee_get_flag(flag, flag_value) - type(ieee_flag_type), intent(in) :: flag - logical, intent(out) :: flag_value - end subroutine ieee_get_flag - - elemental subroutine ieee_get_halting_mode(flag, halting) - type(ieee_flag_type), intent(in) :: flag - logical, intent(out) :: halting - end subroutine ieee_get_halting_mode - - subroutine ieee_get_modes(modes) - type(ieee_modes_type), intent(out) :: modes - end subroutine ieee_get_modes - - subroutine ieee_get_status(status) - type(ieee_status_type), intent(out) :: status - end subroutine ieee_get_status - - pure subroutine ieee_set_flag(flag, flag_value) - type(ieee_flag_type), intent(in) :: flag - logical, intent(in) :: flag_value - end subroutine ieee_set_flag - - pure subroutine ieee_set_halting_mode(flag, halting) - type(ieee_flag_type), intent(in) :: flag - logical, intent(in) :: halting - end subroutine ieee_set_halting_mode - - subroutine ieee_set_modes(modes) - type(ieee_modes_type), intent(in) :: modes - end subroutine ieee_set_modes - - subroutine ieee_set_status(status) - type(ieee_status_type), intent(in) :: status - end subroutine ieee_set_status - - pure logical function ieee_support_flag(flag) - type(ieee_flag_type), intent(in) :: flag - ieee_support_flag = .true. - end function - pure logical function ieee_support_flag_2(flag, x) - type(ieee_flag_type), intent(in) :: flag - real(kind=2), intent(in) :: x(..) - ieee_support_flag_2 = .true. - end function - pure logical function ieee_support_flag_3(flag, x) - type(ieee_flag_type), intent(in) :: flag - real(kind=3), intent(in) :: x(..) - ieee_support_flag_3 = .true. - end function - pure logical function ieee_support_flag_4(flag, x) - type(ieee_flag_type), intent(in) :: flag - real(kind=4), intent(in) :: x(..) - ieee_support_flag_4 = .true. - end function - pure logical function ieee_support_flag_8(flag, x) - type(ieee_flag_type), intent(in) :: flag - real(kind=8), intent(in) :: x(..) - ieee_support_flag_8 = .true. - end function - pure logical function ieee_support_flag_10(flag, x) - type(ieee_flag_type), intent(in) :: flag - real(kind=10), intent(in) :: x(..) - ieee_support_flag_10 = .true. - end function - pure logical function ieee_support_flag_16(flag, x) - type(ieee_flag_type), intent(in) :: flag - real(kind=16), intent(in) :: x(..) - ieee_support_flag_16 = .true. - end function - - pure logical function ieee_support_halting(flag) - type(ieee_flag_type), intent(in) :: flag - end function ieee_support_halting - -end module __Fortran_ieee_exceptions diff --git a/flang/module/ieee_arithmetic.f90 b/flang/module/ieee_arithmetic.f90 index 5fe57f782a815..45d3cc3f02a1e 100644 --- a/flang/module/ieee_arithmetic.f90 +++ b/flang/module/ieee_arithmetic.f90 @@ -29,11 +29,6 @@ module ieee_arithmetic ieee_support_subnormal => __builtin_ieee_support_subnormal, & ieee_support_underflow_control => __builtin_ieee_support_underflow_control - ! 17.1: "The module IEEE_ARITHMETIC behaves as if it contained a USE statement - ! for IEEE_EXCEPTIONS; everything that is public in IEEE_EXCEPTIONS is public - ! in IEEE_ARITHMETIC." - use __Fortran_ieee_exceptions - implicit none type :: ieee_class_type diff --git a/flang/module/ieee_exceptions.f90 b/flang/module/ieee_exceptions.f90 index 2d050412772a5..82df89697729b 100644 --- a/flang/module/ieee_exceptions.f90 +++ b/flang/module/ieee_exceptions.f90 @@ -6,6 +6,120 @@ ! !===------------------------------------------------------------------------===! +! See Fortran 2018, clause 17 module ieee_exceptions - use __Fortran_ieee_exceptions + + type :: ieee_flag_type ! Fortran 2018, 17.2 & 17.3 + private + integer(kind=1) :: flag = 0 + end type ieee_flag_type + + type(ieee_flag_type), parameter :: & + ieee_invalid = ieee_flag_type(1), & + ieee_overflow = ieee_flag_type(2), & + ieee_divide_by_zero = ieee_flag_type(4), & + ieee_underflow = ieee_flag_type(8), & + ieee_inexact = ieee_flag_type(16), & + ieee_denorm = ieee_flag_type(32) ! PGI extension + + type(ieee_flag_type), parameter :: & + ieee_usual(*) = [ & + ieee_overflow, ieee_divide_by_zero, ieee_invalid ], & + ieee_all(*) = [ & + ieee_usual, ieee_underflow, ieee_inexact, ieee_denorm ] + + type :: ieee_modes_type ! Fortran 2018, 17.7 + private + end type ieee_modes_type + + type :: ieee_status_type ! Fortran 2018, 17.7 + private + end type ieee_status_type + + private :: ieee_support_flag_2, ieee_support_flag_3, & + ieee_support_flag_4, ieee_support_flag_8, ieee_support_flag_10, & + ieee_support_flag_16 + interface ieee_support_flag + module procedure :: ieee_support_flag, & + ieee_support_flag_2, ieee_support_flag_3, & + ieee_support_flag_4, ieee_support_flag_8, ieee_support_flag_10, & + ieee_support_flag_16 + end interface + + contains + elemental subroutine ieee_get_flag(flag, flag_value) + type(ieee_flag_type), intent(in) :: flag + logical, intent(out) :: flag_value + end subroutine ieee_get_flag + + elemental subroutine ieee_get_halting_mode(flag, halting) + type(ieee_flag_type), intent(in) :: flag + logical, intent(out) :: halting + end subroutine ieee_get_halting_mode + + subroutine ieee_get_modes(modes) + type(ieee_modes_type), intent(out) :: modes + end subroutine ieee_get_modes + + subroutine ieee_get_status(status) + type(ieee_status_type), intent(out) :: status + end subroutine ieee_get_status + + pure subroutine ieee_set_flag(flag, flag_value) + type(ieee_flag_type), intent(in) :: flag + logical, intent(in) :: flag_value + end subroutine ieee_set_flag + + pure subroutine ieee_set_halting_mode(flag, halting) + type(ieee_flag_type), intent(in) :: flag + logical, intent(in) :: halting + end subroutine ieee_set_halting_mode + + subroutine ieee_set_modes(modes) + type(ieee_modes_type), intent(in) :: modes + end subroutine ieee_set_modes + + subroutine ieee_set_status(status) + type(ieee_status_type), intent(in) :: status + end subroutine ieee_set_status + + pure logical function ieee_support_flag(flag) + type(ieee_flag_type), intent(in) :: flag + ieee_support_flag = .true. + end function + pure logical function ieee_support_flag_2(flag, x) + type(ieee_flag_type), intent(in) :: flag + real(kind=2), intent(in) :: x(..) + ieee_support_flag_2 = .true. + end function + pure logical function ieee_support_flag_3(flag, x) + type(ieee_flag_type), intent(in) :: flag + real(kind=3), intent(in) :: x(..) + ieee_support_flag_3 = .true. + end function + pure logical function ieee_support_flag_4(flag, x) + type(ieee_flag_type), intent(in) :: flag + real(kind=4), intent(in) :: x(..) + ieee_support_flag_4 = .true. + end function + pure logical function ieee_support_flag_8(flag, x) + type(ieee_flag_type), intent(in) :: flag + real(kind=8), intent(in) :: x(..) + ieee_support_flag_8 = .true. + end function + pure logical function ieee_support_flag_10(flag, x) + type(ieee_flag_type), intent(in) :: flag + real(kind=10), intent(in) :: x(..) + ieee_support_flag_10 = .true. + end function + pure logical function ieee_support_flag_16(flag, x) + type(ieee_flag_type), intent(in) :: flag + real(kind=16), intent(in) :: x(..) + ieee_support_flag_16 = .true. + end function + + pure logical function ieee_support_halting(flag) + type(ieee_flag_type), intent(in) :: flag + end function ieee_support_halting + end module ieee_exceptions diff --git a/flang/tools/f18/CMakeLists.txt b/flang/tools/f18/CMakeLists.txt index 877ebb06e4b09..aa77676c6229f 100644 --- a/flang/tools/f18/CMakeLists.txt +++ b/flang/tools/f18/CMakeLists.txt @@ -6,7 +6,6 @@ set(LLVM_LINK_COMPONENTS set(MODULES "__fortran_builtins" - "__fortran_ieee_exceptions" "__fortran_type_info" "ieee_arithmetic" "ieee_exceptions" @@ -28,10 +27,6 @@ foreach(filename ${MODULES}) if(NOT ${filename} MATCHES "__fortran_type_info") set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_type_info.mod) endif() - if(${filename} MATCHES "ieee_arithmetic" OR - ${filename} MATCHES "ieee_exceptions") - set(depends ${FLANG_INTRINSIC_MODULES_DIR}/__fortran_ieee_exceptions.mod) - endif() endif() add_custom_command(OUTPUT ${base}.mod COMMAND ${CMAKE_COMMAND} -E make_directory ${FLANG_INTRINSIC_MODULES_DIR}