Issue #8300:  Let struct.pack use __index__ to convert and pack non-integers.
Based on a patch by Meador Inge.
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
index 6d2a95a..4329e95 100644
--- a/Lib/test/test_struct.py
+++ b/Lib/test/test_struct.py
@@ -315,6 +315,24 @@
                     expected = struct.pack(self.format, int(nonint))
                     self.assertEqual(got, expected)
 
+                # Objects with an '__index__' method should be allowed
+                # to pack as integers.
+                class Indexable(object):
+                    def __init__(self, value):
+                        self._value = value
+
+                    def __index__(self):
+                        return self._value
+
+                for obj in (Indexable(0), Indexable(10), Indexable(17),
+                            Indexable(42), Indexable(100), Indexable(127)):
+                    try:
+                        struct.pack(format, obj)
+                    except:
+                        self.fail("integer code pack failed on object "
+                                  "with '__index__' method")
+
+
         byteorders = '', '@', '=', '<', '>', '!'
         for code in integer_codes:
             for byteorder in byteorders: