- : srcloc scontype
- { ConDecl (fst $2) [] [] (VanillaCon (snd $2)) $1 }
- | srcloc sbtype conop sbtype
- { ConDecl $3 [] [] (InfixCon $2 $4) $1 }
- | srcloc con '{' fielddecls '}'
- { ConDecl $2 [] [] (RecCon (reverse $4)) $1 }
+ : srcloc forall context constr_stuff
+ { ConDecl (fst $4) $2 $3 (snd $4) $1 }
+ | srcloc forall constr_stuff
+ { ConDecl (fst $3) $2 [] (snd $3) $1 }
+
+forall :: { [RdrNameHsTyVar] }
+ : 'forall' tyvars '.' { $2 }
+ | {- empty -} { [] }
+
+context :: { RdrNameContext }
+ : btype '=>' {% checkContext $1 }
+
+constr_stuff :: { (RdrName, RdrNameConDetails) }
+ : scontype { (fst $1, VanillaCon (snd $1)) }
+ | sbtype conop sbtype { ($2, InfixCon $1 $3) }
+ | con '{' fielddecls '}' { ($1, RecCon (reverse $3)) }