GADTs augment the syntactic category constr-decls thus. The first “concrete example” of a new type is expressed as
        type _ term =
          | Int : int -> int term
          | Add : (int -> int -> int) term
          | App : ('b -> 'a) term * 'b term -> 'a term
It seems clear to me that the subtext “| Add : (int -> int -> int) term” is meant to be a constr-decl but none of the three alternative forms produce that. The alternative, new with GADTs, requires a ->.

In e-mail Jacques Garrigue suggests one more alternative to the new productions of constr-decl is needed:

| constr-name : typexpr

Bug ID = 0005875


2014 Jul
That bug is marked as fixed and closed. Once again I try to parse the type-definition: type _ term = ....
_ term =
   | Int : int -> int term
   | Add : (int -> int -> int) term
   | App : ('b -> 'a) term * 'b term -> 'a term
is a typedef but only with this new sort of type-param.
=  | Int : int -> int term
   | Add : (int -> int -> int) term
   | App : ('b -> 'a) term * 'b term -> 'a term
is not type-information as you might guess, but is a type-representation! wherein
   Add : (int -> int -> int) term
is a constr-decl and Add is a constr-name.
It seems curious that no typexpr denotes a variant type, but you can declare such types and give them names.