+ {% do { let {(ctxt, tc, tvs, tparms) = unLoc $2}
+ ; checkTyVars tparms -- can have type pats
+ ; return $
+ L (comb4 $1 $2 $4 $5)
+ (mkTyData (unLoc $1) (ctxt, tc, tvs, Nothing) $3
+ (reverse (unLoc $5)) (unLoc $6)) } }
+
+ -- data/newtype family
+ | data_or_newtype 'family' tycl_hdr '::' kind
+ {% do { let {(ctxt, tc, tvs, tparms) = unLoc $3}
+ ; checkTyVars tparms -- no type pattern
+ ; return $
+ L (comb3 $1 $2 $5)
+ (mkTyData (unLoc $1) (ctxt, tc, tvs, Nothing)
+ (Just (unLoc $5)) [] Nothing) } }
+
+ -- data/newtype instance declaration
+ | data_or_newtype 'instance' tycl_hdr constrs deriving
+ {% do { let {(ctxt, tc, tvs, tparms) = unLoc $3}
+ -- can have type pats
+ ; return $
+ L (comb4 $1 $3 $4 $5)
+ -- We need the location on tycl_hdr in case
+ -- constrs and deriving are both empty
+ (mkTyData (unLoc $1) (ctxt, tc, tvs, Just tparms)
+ Nothing (reverse (unLoc $4)) (unLoc $5)) } }
+
+ -- GADT instance declaration
+ | data_or_newtype 'instance' tycl_hdr opt_kind_sig
+ 'where' gadt_constrlist
+ deriving
+ {% do { let {(ctxt, tc, tvs, tparms) = unLoc $3}
+ -- can have type pats
+ ; return $
+ L (comb4 $1 $3 $6 $7)
+ (mkTyData (unLoc $1) (ctxt, tc, tvs, Just tparms)
+ $4 (reverse (unLoc $6)) (unLoc $7)) } }