]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix -mod(unsigned, unsigned).
authorThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 1 Nov 2024 09:02:30 +0000 (10:02 +0100)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 1 Nov 2024 15:13:08 +0000 (16:13 +0100)
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.

gcc/fortran/resolve.cc
gcc/testsuite/gfortran.dg/unsigned_38.f90
gcc/testsuite/gfortran.dg/unsigned_40.f90 [new file with mode: 0644]

index b14d3e776ab700e893dc2735ec229f5f2c57b3e6..51e0af410c1cf6d8be4e8bfe407a2690c1fd2a56 100644 (file)
@@ -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;
index d549483b269aa0b1e66d606d83b77b29ec045588..ac1cfb33aac3e08ab787d665ea2b1fc870966a4d 100644 (file)
@@ -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 (file)
index 0000000..129fc88
--- /dev/null
@@ -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