+--------------------------------------------------------------------------
+
+-- versions of type/btype/atype that cant begin with '!' (or '.')
+-- for use where the kind is definitely known NOT to be '$'
+
+ttype :: { RdrNameHsType }
+ttype : '__forall' tv_bndrs
+ opt_context '=>' type { mkHsForAllTy (Just $2) $3 $5 }
+ | tbtype '->' type { HsFunTy $1 $3 }
+ | tbtype { $1 }
+
+tbtype :: { RdrNameHsType }
+tbtype : tatype { $1 }
+ | tbtype atype { HsAppTy $1 $2 }
+ | '__u' atype atype { HsUsageTy $2 $3 }
+
+tatype :: { RdrNameHsType }
+tatype : qtc_name { HsTyVar $1 }
+ | tv_name { HsTyVar $1 }
+ | '(' ')' { HsTupleTy (mkHsTupCon tcName Boxed []) [] }
+ | '(' types2 ')' { HsTupleTy (mkHsTupCon tcName Boxed $2) $2 }
+ | '(#' types0 '#)' { HsTupleTy (mkHsTupCon tcName Unboxed $2) $2 }
+ | '[' type ']' { HsListTy $2 }
+ | '{' qcls_name atypes '}' { mkHsDictTy $2 $3 }
+ | '{' ipvar_name '::' type '}' { mkHsIParamTy $2 $4 }
+ | '(' type ')' { $2 }