summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/users_guide/bugs.rst5
-rw-r--r--libraries/base/GHC/Ix.hs427
-rw-r--r--libraries/base/changelog.md2
-rw-r--r--libraries/base/tests/T16643.hs23
-rw-r--r--libraries/base/tests/T16643.stdout1
-rw-r--r--libraries/base/tests/all.T1
6 files changed, 456 insertions, 3 deletions
diff --git a/docs/users_guide/bugs.rst b/docs/users_guide/bugs.rst
index b5ac79d457..8734b86e96 100644
--- a/docs/users_guide/bugs.rst
+++ b/docs/users_guide/bugs.rst
@@ -530,9 +530,8 @@ Large tuple support
The Haskell Report only requires implementations to provide tuple
types and their accompanying standard instances up to size 15. GHC
limits the size of tuple types to 62 and provides instances of
- ``Eq``, ``Ord``, ``Bounded``, ``Read``, and ``Show`` for tuples up
- to size 15. However, ``Ix`` instances are provided only for tuples
- up to size 5.
+ ``Eq``, ``Ord``, ``Bounded``, ``Read``, ``Show``, and ``Ix`` for
+ tuples up to size 15.
.. _bugs:
diff --git a/libraries/base/GHC/Ix.hs b/libraries/base/GHC/Ix.hs
index efd64670bb..6080f1e9b4 100644
--- a/libraries/base/GHC/Ix.hs
+++ b/libraries/base/GHC/Ix.hs
@@ -324,6 +324,8 @@ instance (Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1,a2,a3,a4) where
inRange (l3,u3) i3 && inRange (l4,u4) i4
-- Default method for index
+
+----------------------------------------------------------------------
-- | @since 2.01
instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) => Ix (a1,a2,a3,a4,a5) where
range ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) =
@@ -346,3 +348,428 @@ instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) => Ix (a1,a2,a3,a4,a5) where
inRange (l5,u5) i5
-- Default method for index
+
+----------------------------------------------------------------------
+-- | @since 4.15.0.0
+instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6) =>
+ Ix (a1,a2,a3,a4,a5,a6) where
+ range ((l1,l2,l3,l4,l5,l6),(u1,u2,u3,u4,u5,u6)) =
+ [(i1,i2,i3,i4,i5,i6) | i1 <- range (l1,u1),
+ i2 <- range (l2,u2),
+ i3 <- range (l3,u3),
+ i4 <- range (l4,u4),
+ i5 <- range (l5,u5),
+ i6 <- range (l6,u6)]
+
+ unsafeIndex ((l1,l2,l3,l4,l5,l6),(u1,u2,u3,u4,u5,u6)) (i1,i2,i3,i4,i5,i6) =
+ unsafeIndex (l6,u6) i6 + unsafeRangeSize (l6,u6) * (
+ unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (
+ unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
+ unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
+ unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
+ unsafeIndex (l1,u1) i1)))))
+
+ inRange ((l1,l2,l3,l4,l5,l6),(u1,u2,u3,u4,u5,u6)) (i1,i2,i3,i4,i5,i6) =
+ inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+ inRange (l3,u3) i3 && inRange (l4,u4) i4 &&
+ inRange (l5,u5) i5 && inRange (l6,u6) i6
+
+ -- Default method for index
+
+----------------------------------------------------------------------
+-- | @since 4.15.0.0
+instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7) =>
+ Ix (a1,a2,a3,a4,a5,a6,a7) where
+ range ((l1,l2,l3,l4,l5,l6,l7),(u1,u2,u3,u4,u5,u6,u7)) =
+ [(i1,i2,i3,i4,i5,i6,i7) | i1 <- range (l1,u1),
+ i2 <- range (l2,u2),
+ i3 <- range (l3,u3),
+ i4 <- range (l4,u4),
+ i5 <- range (l5,u5),
+ i6 <- range (l6,u6),
+ i7 <- range (l7,u7)]
+
+ unsafeIndex ((l1,l2,l3,l4,l5,l6,l7),(u1,u2,u3,u4,u5,u6,u7))
+ (i1,i2,i3,i4,i5,i6,i7) =
+ unsafeIndex (l7,u7) i7 + unsafeRangeSize (l7,u7) * (
+ unsafeIndex (l6,u6) i6 + unsafeRangeSize (l6,u6) * (
+ unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (
+ unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
+ unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
+ unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
+ unsafeIndex (l1,u1) i1))))))
+
+ inRange ((l1,l2,l3,l4,l5,l6,l7),(u1,u2,u3,u4,u5,u6,u7))
+ (i1,i2,i3,i4,i5,i6,i7) =
+ inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+ inRange (l3,u3) i3 && inRange (l4,u4) i4 &&
+ inRange (l5,u5) i5 && inRange (l6,u6) i6 &&
+ inRange (l7,u7) i7
+
+ -- Default method for index
+
+----------------------------------------------------------------------
+-- | @since 4.15.0.0
+instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8) =>
+ Ix (a1,a2,a3,a4,a5,a6,a7,a8) where
+ range ((l1,l2,l3,l4,l5,l6,l7,l8),(u1,u2,u3,u4,u5,u6,u7,u8)) =
+ [(i1,i2,i3,i4,i5,i6,i7,i8) | i1 <- range (l1,u1),
+ i2 <- range (l2,u2),
+ i3 <- range (l3,u3),
+ i4 <- range (l4,u4),
+ i5 <- range (l5,u5),
+ i6 <- range (l6,u6),
+ i7 <- range (l7,u7),
+ i8 <- range (l8,u8)]
+
+ unsafeIndex ((l1,l2,l3,l4,l5,l6,l7,l8),(u1,u2,u3,u4,u5,u6,u7,u8))
+ (i1,i2,i3,i4,i5,i6,i7,i8) =
+ unsafeIndex (l8,u8) i8 + unsafeRangeSize (l8,u8) * (
+ unsafeIndex (l7,u7) i7 + unsafeRangeSize (l7,u7) * (
+ unsafeIndex (l6,u6) i6 + unsafeRangeSize (l6,u6) * (
+ unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (
+ unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
+ unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
+ unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
+ unsafeIndex (l1,u1) i1)))))))
+
+ inRange ((l1,l2,l3,l4,l5,l6,l7,l8),(u1,u2,u3,u4,u5,u6,u7,u8))
+ (i1,i2,i3,i4,i5,i6,i7,i8) =
+ inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+ inRange (l3,u3) i3 && inRange (l4,u4) i4 &&
+ inRange (l5,u5) i5 && inRange (l6,u6) i6 &&
+ inRange (l7,u7) i7 && inRange (l8,u8) i8
+
+ -- Default method for index
+
+----------------------------------------------------------------------
+-- | @since 4.15.0.0
+instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9) =>
+ Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9) where
+ range ((l1,l2,l3,l4,l5,l6,l7,l8,l9),(u1,u2,u3,u4,u5,u6,u7,u8,u9)) =
+ [(i1,i2,i3,i4,i5,i6,i7,i8,i9) | i1 <- range (l1,u1),
+ i2 <- range (l2,u2),
+ i3 <- range (l3,u3),
+ i4 <- range (l4,u4),
+ i5 <- range (l5,u5),
+ i6 <- range (l6,u6),
+ i7 <- range (l7,u7),
+ i8 <- range (l8,u8),
+ i9 <- range (l9,u9)]
+
+ unsafeIndex ((l1,l2,l3,l4,l5,l6,l7,l8,l9),(u1,u2,u3,u4,u5,u6,u7,u8,u9))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9) =
+ unsafeIndex (l9,u9) i9 + unsafeRangeSize (l9,u9) * (
+ unsafeIndex (l8,u8) i8 + unsafeRangeSize (l8,u8) * (
+ unsafeIndex (l7,u7) i7 + unsafeRangeSize (l7,u7) * (
+ unsafeIndex (l6,u6) i6 + unsafeRangeSize (l6,u6) * (
+ unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (
+ unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
+ unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
+ unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
+ unsafeIndex (l1,u1) i1))))))))
+
+ inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9),(u1,u2,u3,u4,u5,u6,u7,u8,u9))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9) =
+ inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+ inRange (l3,u3) i3 && inRange (l4,u4) i4 &&
+ inRange (l5,u5) i5 && inRange (l6,u6) i6 &&
+ inRange (l7,u7) i7 && inRange (l8,u8) i8 &&
+ inRange (l9,u9) i9
+
+ -- Default method for index
+
+----------------------------------------------------------------------
+-- | @since 4.15.0.0
+instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9,
+ Ix aA) =>
+ Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,aA) where
+ range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA),(u1,u2,u3,u4,u5,u6,u7,u8,u9,uA)) =
+ [(i1,i2,i3,i4,i5,i6,i7,i8,i9,iA) | i1 <- range (l1,u1),
+ i2 <- range (l2,u2),
+ i3 <- range (l3,u3),
+ i4 <- range (l4,u4),
+ i5 <- range (l5,u5),
+ i6 <- range (l6,u6),
+ i7 <- range (l7,u7),
+ i8 <- range (l8,u8),
+ i9 <- range (l9,u9),
+ iA <- range (lA,uA)]
+
+ unsafeIndex ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA) =
+ unsafeIndex (lA,uA) iA + unsafeRangeSize (lA,uA) * (
+ unsafeIndex (l9,u9) i9 + unsafeRangeSize (l9,u9) * (
+ unsafeIndex (l8,u8) i8 + unsafeRangeSize (l8,u8) * (
+ unsafeIndex (l7,u7) i7 + unsafeRangeSize (l7,u7) * (
+ unsafeIndex (l6,u6) i6 + unsafeRangeSize (l6,u6) * (
+ unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (
+ unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
+ unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
+ unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
+ unsafeIndex (l1,u1) i1)))))))))
+
+ inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA),(u1,u2,u3,u4,u5,u6,u7,u8,u9,uA))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA) =
+ inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+ inRange (l3,u3) i3 && inRange (l4,u4) i4 &&
+ inRange (l5,u5) i5 && inRange (l6,u6) i6 &&
+ inRange (l7,u7) i7 && inRange (l8,u8) i8 &&
+ inRange (l9,u9) i9 && inRange (lA,uA) iA
+
+ -- Default method for index
+
+----------------------------------------------------------------------
+-- | @since 4.15.0.0
+instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9,
+ Ix aA, Ix aB) =>
+ Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,aA,aB) where
+ range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB)) =
+ [(i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB) | i1 <- range (l1,u1),
+ i2 <- range (l2,u2),
+ i3 <- range (l3,u3),
+ i4 <- range (l4,u4),
+ i5 <- range (l5,u5),
+ i6 <- range (l6,u6),
+ i7 <- range (l7,u7),
+ i8 <- range (l8,u8),
+ i9 <- range (l9,u9),
+ iA <- range (lA,uA),
+ iB <- range (lB,uB)]
+
+ unsafeIndex ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB) =
+ unsafeIndex (lB,uB) iB + unsafeRangeSize (lB,uB) * (
+ unsafeIndex (lA,uA) iA + unsafeRangeSize (lA,uA) * (
+ unsafeIndex (l9,u9) i9 + unsafeRangeSize (l9,u9) * (
+ unsafeIndex (l8,u8) i8 + unsafeRangeSize (l8,u8) * (
+ unsafeIndex (l7,u7) i7 + unsafeRangeSize (l7,u7) * (
+ unsafeIndex (l6,u6) i6 + unsafeRangeSize (l6,u6) * (
+ unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (
+ unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
+ unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
+ unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
+ unsafeIndex (l1,u1) i1))))))))))
+
+ inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB) =
+ inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+ inRange (l3,u3) i3 && inRange (l4,u4) i4 &&
+ inRange (l5,u5) i5 && inRange (l6,u6) i6 &&
+ inRange (l7,u7) i7 && inRange (l8,u8) i8 &&
+ inRange (l9,u9) i9 && inRange (lA,uA) iA &&
+ inRange (lB,uB) iB
+
+ -- Default method for index
+
+----------------------------------------------------------------------
+-- | @since 4.15.0.0
+instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9,
+ Ix aA, Ix aB, Ix aC) =>
+ Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,aA,aB,aC) where
+ range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC)) =
+ [(i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC) | i1 <- range (l1,u1),
+ i2 <- range (l2,u2),
+ i3 <- range (l3,u3),
+ i4 <- range (l4,u4),
+ i5 <- range (l5,u5),
+ i6 <- range (l6,u6),
+ i7 <- range (l7,u7),
+ i8 <- range (l8,u8),
+ i9 <- range (l9,u9),
+ iA <- range (lA,uA),
+ iB <- range (lB,uB),
+ iC <- range (lC,uC)]
+
+ unsafeIndex ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC) =
+ unsafeIndex (lC,uC) iC + unsafeRangeSize (lC,uC) * (
+ unsafeIndex (lB,uB) iB + unsafeRangeSize (lB,uB) * (
+ unsafeIndex (lA,uA) iA + unsafeRangeSize (lA,uA) * (
+ unsafeIndex (l9,u9) i9 + unsafeRangeSize (l9,u9) * (
+ unsafeIndex (l8,u8) i8 + unsafeRangeSize (l8,u8) * (
+ unsafeIndex (l7,u7) i7 + unsafeRangeSize (l7,u7) * (
+ unsafeIndex (l6,u6) i6 + unsafeRangeSize (l6,u6) * (
+ unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (
+ unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
+ unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
+ unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
+ unsafeIndex (l1,u1) i1)))))))))))
+
+ inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC) =
+ inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+ inRange (l3,u3) i3 && inRange (l4,u4) i4 &&
+ inRange (l5,u5) i5 && inRange (l6,u6) i6 &&
+ inRange (l7,u7) i7 && inRange (l8,u8) i8 &&
+ inRange (l9,u9) i9 && inRange (lA,uA) iA &&
+ inRange (lB,uB) iB && inRange (lC,uC) iC
+
+ -- Default method for index
+
+----------------------------------------------------------------------
+-- | @since 4.15.0.0
+instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9,
+ Ix aA, Ix aB, Ix aC, Ix aD) =>
+ Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,aA,aB,aC,aD) where
+ range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC,lD),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC,uD)) =
+ [(i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC,iD) | i1 <- range (l1,u1),
+ i2 <- range (l2,u2),
+ i3 <- range (l3,u3),
+ i4 <- range (l4,u4),
+ i5 <- range (l5,u5),
+ i6 <- range (l6,u6),
+ i7 <- range (l7,u7),
+ i8 <- range (l8,u8),
+ i9 <- range (l9,u9),
+ iA <- range (lA,uA),
+ iB <- range (lB,uB),
+ iC <- range (lC,uC),
+ iD <- range (lD,uD)]
+
+ unsafeIndex ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC,lD),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC,uD))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC,iD) =
+ unsafeIndex (lD,uD) iD + unsafeRangeSize (lD,uD) * (
+ unsafeIndex (lC,uC) iC + unsafeRangeSize (lC,uC) * (
+ unsafeIndex (lB,uB) iB + unsafeRangeSize (lB,uB) * (
+ unsafeIndex (lA,uA) iA + unsafeRangeSize (lA,uA) * (
+ unsafeIndex (l9,u9) i9 + unsafeRangeSize (l9,u9) * (
+ unsafeIndex (l8,u8) i8 + unsafeRangeSize (l8,u8) * (
+ unsafeIndex (l7,u7) i7 + unsafeRangeSize (l7,u7) * (
+ unsafeIndex (l6,u6) i6 + unsafeRangeSize (l6,u6) * (
+ unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (
+ unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
+ unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
+ unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
+ unsafeIndex (l1,u1) i1))))))))))))
+
+ inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC,lD),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC,uD))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC,iD) =
+ inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+ inRange (l3,u3) i3 && inRange (l4,u4) i4 &&
+ inRange (l5,u5) i5 && inRange (l6,u6) i6 &&
+ inRange (l7,u7) i7 && inRange (l8,u8) i8 &&
+ inRange (l9,u9) i9 && inRange (lA,uA) iA &&
+ inRange (lB,uB) iB && inRange (lC,uC) iC &&
+ inRange (lD,uD) iD
+
+ -- Default method for index
+
+----------------------------------------------------------------------
+-- | @since 4.15.0.0
+instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9,
+ Ix aA, Ix aB, Ix aC, Ix aD, Ix aE) =>
+ Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,aA,aB,aC,aD,aE) where
+ range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC,lD,lE),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC,uD,uE)) =
+ [(i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC,iD,iE) | i1 <- range (l1,u1),
+ i2 <- range (l2,u2),
+ i3 <- range (l3,u3),
+ i4 <- range (l4,u4),
+ i5 <- range (l5,u5),
+ i6 <- range (l6,u6),
+ i7 <- range (l7,u7),
+ i8 <- range (l8,u8),
+ i9 <- range (l9,u9),
+ iA <- range (lA,uA),
+ iB <- range (lB,uB),
+ iC <- range (lC,uC),
+ iD <- range (lD,uD),
+ iE <- range (lE,uE)]
+
+ unsafeIndex ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC,lD,lE),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC,uD,uE))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC,iD,iE) =
+ unsafeIndex (lE,uE) iE + unsafeRangeSize (lE,uE) * (
+ unsafeIndex (lD,uD) iD + unsafeRangeSize (lD,uD) * (
+ unsafeIndex (lC,uC) iC + unsafeRangeSize (lC,uC) * (
+ unsafeIndex (lB,uB) iB + unsafeRangeSize (lB,uB) * (
+ unsafeIndex (lA,uA) iA + unsafeRangeSize (lA,uA) * (
+ unsafeIndex (l9,u9) i9 + unsafeRangeSize (l9,u9) * (
+ unsafeIndex (l8,u8) i8 + unsafeRangeSize (l8,u8) * (
+ unsafeIndex (l7,u7) i7 + unsafeRangeSize (l7,u7) * (
+ unsafeIndex (l6,u6) i6 + unsafeRangeSize (l6,u6) * (
+ unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (
+ unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
+ unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
+ unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
+ unsafeIndex (l1,u1) i1)))))))))))))
+
+ inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC,lD,lE),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC,uD,uE))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC,iD,iE) =
+ inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+ inRange (l3,u3) i3 && inRange (l4,u4) i4 &&
+ inRange (l5,u5) i5 && inRange (l6,u6) i6 &&
+ inRange (l7,u7) i7 && inRange (l8,u8) i8 &&
+ inRange (l9,u9) i9 && inRange (lA,uA) iA &&
+ inRange (lB,uB) iB && inRange (lC,uC) iC &&
+ inRange (lD,uD) iD && inRange (lE,uE) iE
+
+ -- Default method for index
+
+----------------------------------------------------------------------
+-- | @since 4.15.0.0
+instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9,
+ Ix aA, Ix aB, Ix aC, Ix aD, Ix aE, Ix aF) =>
+ Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,aA,aB,aC,aD,aE,aF) where
+ range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC,lD,lE,lF),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC,uD,uE,uF)) =
+ [(i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC,iD,iE,iF) | i1 <- range (l1,u1),
+ i2 <- range (l2,u2),
+ i3 <- range (l3,u3),
+ i4 <- range (l4,u4),
+ i5 <- range (l5,u5),
+ i6 <- range (l6,u6),
+ i7 <- range (l7,u7),
+ i8 <- range (l8,u8),
+ i9 <- range (l9,u9),
+ iA <- range (lA,uA),
+ iB <- range (lB,uB),
+ iC <- range (lC,uC),
+ iD <- range (lD,uD),
+ iE <- range (lE,uE),
+ iF <- range (lF,uF)]
+
+ unsafeIndex ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC,lD,lE,lF),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC,uD,uE,uF))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC,iD,iE,iF) =
+ unsafeIndex (lF,uF) iF + unsafeRangeSize (lF,uF) * (
+ unsafeIndex (lE,uE) iE + unsafeRangeSize (lE,uE) * (
+ unsafeIndex (lD,uD) iD + unsafeRangeSize (lD,uD) * (
+ unsafeIndex (lC,uC) iC + unsafeRangeSize (lC,uC) * (
+ unsafeIndex (lB,uB) iB + unsafeRangeSize (lB,uB) * (
+ unsafeIndex (lA,uA) iA + unsafeRangeSize (lA,uA) * (
+ unsafeIndex (l9,u9) i9 + unsafeRangeSize (l9,u9) * (
+ unsafeIndex (l8,u8) i8 + unsafeRangeSize (l8,u8) * (
+ unsafeIndex (l7,u7) i7 + unsafeRangeSize (l7,u7) * (
+ unsafeIndex (l6,u6) i6 + unsafeRangeSize (l6,u6) * (
+ unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (
+ unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
+ unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
+ unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
+ unsafeIndex (l1,u1) i1))))))))))))))
+
+ inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,lA,lB,lC,lD,lE,lF),
+ (u1,u2,u3,u4,u5,u6,u7,u8,u9,uA,uB,uC,uD,uE,uF))
+ (i1,i2,i3,i4,i5,i6,i7,i8,i9,iA,iB,iC,iD,iE,iF) =
+ inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+ inRange (l3,u3) i3 && inRange (l4,u4) i4 &&
+ inRange (l5,u5) i5 && inRange (l6,u6) i6 &&
+ inRange (l7,u7) i7 && inRange (l8,u8) i8 &&
+ inRange (l9,u9) i9 && inRange (lA,uA) iA &&
+ inRange (lB,uB) iB && inRange (lC,uC) iC &&
+ inRange (lD,uD) iD && inRange (lE,uE) iE &&
+ inRange (lF,uF) iF
+
+ -- Default method for index
diff --git a/libraries/base/changelog.md b/libraries/base/changelog.md
index a0c3234137..5e91f6c79d 100644
--- a/libraries/base/changelog.md
+++ b/libraries/base/changelog.md
@@ -27,6 +27,8 @@
small lists will now compile to a simple case statement more often.
* Add `MonadFix` and `MonadZip` instances for `Complex`
+
+ * Add `Ix` instances for tuples of size 6 through 15
## 4.14.0.0 *TBA*
* Bundled with GHC 8.10.1
diff --git a/libraries/base/tests/T16643.hs b/libraries/base/tests/T16643.hs
new file mode 100644
index 0000000000..f66987ca24
--- /dev/null
+++ b/libraries/base/tests/T16643.hs
@@ -0,0 +1,23 @@
+module Main (main) where
+
+import Data.Ix
+
+main :: IO ()
+main =
+ if 2^6 == rangeSize r6 && 2^7 == rangeSize r7 && 2^8 == rangeSize r8 &&
+ 2^9 == rangeSize r9 && 2^10 == rangeSize r10 && 2^11 == rangeSize r11 &&
+ 2^12 == rangeSize r12 && 2^13 == rangeSize r13 && 2^14 == rangeSize r14 &&
+ 2^15 == rangeSize r15
+ then putStrLn "Success"
+ else putStrLn "Error in large tuple Ix instances"
+ where
+ r6 = ((0,0,0,0,0,0),(1,1,1,1,1,1))
+ r7 = ((0,0,0,0,0,0,0),(1,1,1,1,1,1,1))
+ r8 = ((0,0,0,0,0,0,0,0),(1,1,1,1,1,1,1,1))
+ r9 = ((0,0,0,0,0,0,0,0,0),(1,1,1,1,1,1,1,1,1))
+ r10 = ((0,0,0,0,0,0,0,0,0,0),(1,1,1,1,1,1,1,1,1,1))
+ r11 = ((0,0,0,0,0,0,0,0,0,0,0),(1,1,1,1,1,1,1,1,1,1,1))
+ r12 = ((0,0,0,0,0,0,0,0,0,0,0,0),(1,1,1,1,1,1,1,1,1,1,1,1))
+ r13 = ((0,0,0,0,0,0,0,0,0,0,0,0,0),(1,1,1,1,1,1,1,1,1,1,1,1,1))
+ r14 = ((0,0,0,0,0,0,0,0,0,0,0,0,0,0),(1,1,1,1,1,1,1,1,1,1,1,1,1,1))
+ r15 = ((0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1))
diff --git a/libraries/base/tests/T16643.stdout b/libraries/base/tests/T16643.stdout
new file mode 100644
index 0000000000..51da4200ab
--- /dev/null
+++ b/libraries/base/tests/T16643.stdout
@@ -0,0 +1 @@
+Success \ No newline at end of file
diff --git a/libraries/base/tests/all.T b/libraries/base/tests/all.T
index 6651b20abe..04082e7b6e 100644
--- a/libraries/base/tests/all.T
+++ b/libraries/base/tests/all.T
@@ -254,3 +254,4 @@ test('T16111', exit_code(1), compile_and_run, [''])
test('T16943a', normal, compile_and_run, [''])
test('T16943b', normal, compile_and_run, [''])
test('T17499', [collect_stats('bytes allocated',5)], compile_and_run, ['-O -w'])
+test('T16643', normal, compile_and_run, [''])