-
Notifications
You must be signed in to change notification settings - Fork 52
Closed
Labels
Description
Bug imported from C2HS Trac
Trac ticket created: 2011-08-26T02:01:18-0700
Consider this C enum:
typedef enum
{
GTK_ANCHOR_CENTER,
GTK_ANCHOR_NORTH,
GTK_ANCHOR_NORTH_WEST,
GTK_ANCHOR_NORTH_EAST,
GTK_ANCHOR_SOUTH,
GTK_ANCHOR_SOUTH_WEST,
GTK_ANCHOR_SOUTH_EAST,
GTK_ANCHOR_WEST,
GTK_ANCHOR_EAST,
GTK_ANCHOR_N = GTK_ANCHOR_NORTH,
GTK_ANCHOR_NW = GTK_ANCHOR_NORTH_WEST,
GTK_ANCHOR_NE = GTK_ANCHOR_NORTH_EAST,
GTK_ANCHOR_S = GTK_ANCHOR_SOUTH,
GTK_ANCHOR_SW = GTK_ANCHOR_SOUTH_WEST,
GTK_ANCHOR_SE = GTK_ANCHOR_SOUTH_EAST,
GTK_ANCHOR_W = GTK_ANCHOR_WEST,
GTK_ANCHOR_E = GTK_ANCHOR_EAST
} GtkAnchorType;
Of course in C, enums are really ints, so it's ok to have aliases. It is the case that GTK_ANCHOR_E = GTK_ANCHOR_EAST
since both enum names have the int value 9.
Currently c2hs binds this as:
data GtkAnchorType = GtkAnchorCenter
| GtkAnchorNorth
| GtkAnchorNorthWest
| GtkAnchorNorthEast
| GtkAnchorSouth
| GtkAnchorSouthWest
| GtkAnchorSouthEast
| GtkAnchorWest
| GtkAnchorEast
| GtkAnchorN
| GtkAnchorNw
| GtkAnchorNe
| GtkAnchorS
| GtkAnchorSw
| GtkAnchorSe
| GtkAnchorW
| GtkAnchorE
deriving (Eq,Show)
instance Enum GtkAnchorType where
fromEnum GtkAnchorCenter = 0
fromEnum GtkAnchorNorth = 1
fromEnum GtkAnchorNorthWest = 2
fromEnum GtkAnchorNorthEast = 3
fromEnum GtkAnchorSouth = 4
fromEnum GtkAnchorSouthWest = 5
fromEnum GtkAnchorSouthEast = 6
fromEnum GtkAnchorWest = 7
fromEnum GtkAnchorEast = 8
fromEnum GtkAnchorN = 1
fromEnum GtkAnchorNw = 2
fromEnum GtkAnchorNe = 3
fromEnum GtkAnchorS = 4
fromEnum GtkAnchorSw = 5
fromEnum GtkAnchorSe = 6
fromEnum GtkAnchorW = 7
fromEnum GtkAnchorE = 8
toEnum 0 = GtkAnchorCenter
toEnum 1 = GtkAnchorNorth
toEnum 2 = GtkAnchorNorthWest
toEnum 3 = GtkAnchorNorthEast
toEnum 4 = GtkAnchorSouth
toEnum 5 = GtkAnchorSouthWest
toEnum 6 = GtkAnchorSouthEast
toEnum 7 = GtkAnchorWest
toEnum 8 = GtkAnchorEast
toEnum 1 = GtkAnchorN
toEnum 2 = GtkAnchorNw
toEnum 3 = GtkAnchorNe
toEnum 4 = GtkAnchorS
toEnum 5 = GtkAnchorSw
toEnum 6 = GtkAnchorSe
toEnum 7 = GtkAnchorW
toEnum 8 = GtkAnchorE
toEnum unmatched = error ("GtkAnchorType.toEnum: Cannot match " ++ show unmatched)
Note in particular that the toEnum
has overlaps. It's also obviously not the case in Haskell that GtkAnchorE = GtkAnchorEast
. Perhaps we should ignore aliases, that is pretend that the enum values GTK_ANCHOR_E
etc are simply not present.