https://gcc.gnu.org/g:9646a4cdc6266ab403ceeb6a40b93e72b0166941

commit r15-4837-g9646a4cdc6266ab403ceeb6a40b93e72b0166941
Author: Thomas Koenig <tkoe...@gcc.gnu.org>
Date:   Fri Nov 1 10:02:30 2024 +0100

    Fix -mod(unsigned, unsigned).
    
    gcc/fortran/ChangeLog:
    
            * resolve.cc (resolve_operator): Also handle BT_UNSIGNED.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/unsigned_38.f90: Add -pedantic and adjust error
            message.
            * gfortran.dg/unsigned_40.f90: New test.

Diff:
---
 gcc/fortran/resolve.cc                    |  3 ++-
 gcc/testsuite/gfortran.dg/unsigned_38.f90 |  4 ++--
 gcc/testsuite/gfortran.dg/unsigned_40.f90 | 19 +++++++++++++++++++
 3 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index b14d3e776ab7..51e0af410c1c 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -4253,7 +4253,8 @@ resolve_operator (gfc_expr *e)
     case INTRINSIC_UMINUS:
       if (op1->ts.type == BT_INTEGER
          || op1->ts.type == BT_REAL
-         || op1->ts.type == BT_COMPLEX)
+         || op1->ts.type == BT_COMPLEX
+         || op1->ts.type == BT_UNSIGNED)
        {
          e->ts = op1->ts;
          break;
diff --git a/gcc/testsuite/gfortran.dg/unsigned_38.f90 
b/gcc/testsuite/gfortran.dg/unsigned_38.f90
index d549483b269a..ac1cfb33aac3 100644
--- a/gcc/testsuite/gfortran.dg/unsigned_38.f90
+++ b/gcc/testsuite/gfortran.dg/unsigned_38.f90
@@ -1,6 +1,6 @@
 ! { dg-do compile }
-! { dg-options "-funsigned" }
+! { dg-options "-funsigned -pedantic" }
 program main
   unsigned, parameter :: u = 7u
-  print *,mod(-(u+1u),u) ! { dg-error "Operand of unary numeric operator" }
+  print *,mod(-(u+1u),u) ! { dg-error "Negation of unsigned expression" }
 end program main
diff --git a/gcc/testsuite/gfortran.dg/unsigned_40.f90 
b/gcc/testsuite/gfortran.dg/unsigned_40.f90
new file mode 100644
index 000000000000..129fc883f177
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/unsigned_40.f90
@@ -0,0 +1,19 @@
+! { dg-do run }
+! { dg-options "-funsigned" }
+program memain
+  use iso_fortran_env, only : uint8
+  call test1
+  call test2
+contains
+  subroutine test1
+    unsigned(uint8) :: nface, nmax
+    nface = 12u_1
+    nmax = - mod(-nface+1u,nface)
+    if (nmax /= 251u_1) error stop 1
+  end subroutine test1
+  subroutine test2
+    unsigned(uint8), parameter :: nface = 12u_1
+    unsigned(uint8), parameter :: nmax = - mod(-nface+1u,nface)
+    if (nmax /= 251u_1) error stop 11
+  end subroutine test2
+end program memain

Reply via email to