    | With_need_typeconstr ->
        fprintf ppf
          "Only type constructors with identical parameters can be substituted."
-@@ -1446,3 +1457,5 @@
-         "The type %a in this module cannot be exported.@ " longident lid;
-       fprintf ppf
-         "Its type contains local dependencies:@ %a" type_expr ty
+@@ -1570,6 +1581,8 @@
+       fprintf ppf "Uninterpreted extension '%s'." s
+   | Recursive_module_require_explicit_type ->
+       fprintf ppf "Recursive modules require an explicit module type."
 +  | Apply_impure ->
 +      fprintf ppf "This functor is impure. It can only be applied to ()"
+ 
+ let report_error env ppf err =
+   Printtyp.wrap_printing_env env (fun () -> report_error ppf err)
 Index: typing/typemod.mli
 ===================================================================
---- typing/typemod.mli	(revision 13286)
+--- typing/typemod.mli	(revision 14285)
 +++ typing/typemod.mli	(working copy)
 @@ -60,6 +60,7 @@
-   | Not_a_packed_module of type_expr
-   | Incomplete_packed_module of type_expr
    | Scoping_pack of Longident.t * type_expr
+   | Extension of string
+   | Recursive_module_require_explicit_type
 +  | Apply_impure
  
- exception Error of Location.t * error
- 
-Index: typing/oprint.ml
-===================================================================
---- typing/oprint.ml	(revision 13286)
-+++ typing/oprint.ml	(working copy)
-@@ -343,6 +343,8 @@
- let rec print_out_module_type ppf =
-   function
-     Omty_abstract -> ()
-+  | Omty_functor ("*", _, mty_res) ->
-+      fprintf ppf "@[<2>functor@ () ->@ %a@]" print_out_module_type mty_res
-   | Omty_functor (name, mty_arg, mty_res) ->
-       fprintf ppf "@[<2>functor@ (%s : %a) ->@ %a@]" name
-         print_out_module_type mty_arg print_out_module_type mty_res
-Index: typing/includemod.ml
-===================================================================
---- typing/includemod.ml	(revision 13286)
-+++ typing/includemod.ml	(working copy)
-@@ -35,6 +35,7 @@
-       Ident.t * class_declaration * class_declaration *
-       Ctype.class_match_failure list
-   | Unbound_modtype_path of Path.t
-+  | Impure_functor
- 
- type pos =
-     Module of Ident.t | Modtype of Ident.t | Arg of Ident.t | Body of Ident.t
-@@ -153,6 +154,8 @@
-   | (Mty_signature sig1, Mty_signature sig2) ->
-       signatures env cxt subst sig1 sig2
-   | (Mty_functor(param1, arg1, res1), Mty_functor(param2, arg2, res2)) ->
-+      if Ident.name param1 = "*" && Ident.name param2 <> "*" then
-+        raise (Error [cxt, Impure_functor]);
-       let arg2' = Subst.modtype subst arg2 in
-       let cc_arg = modtypes env (Arg param1::cxt) Subst.identity arg2' arg1 in
-       let cc_res =
-@@ -404,6 +407,8 @@
-       Includeclass.report_error reason
-   | Unbound_modtype_path path ->
-       fprintf ppf "Unbound module type %a" Printtyp.path path
-+  | Impure_functor ->
-+      fprintf ppf "An impure functor cannot be made applicative"
- 
- let rec context ppf = function
-     Module id :: rem ->
-Index: typing/includemod.mli
-===================================================================
---- typing/includemod.mli	(revision 13286)
-+++ typing/includemod.mli	(working copy)
-@@ -40,6 +40,7 @@
-       Ident.t * class_declaration * class_declaration *
-       Ctype.class_match_failure list
-   | Unbound_modtype_path of Path.t
-+  | Impure_functor
- 
- type pos =
-     Module of Ident.t | Modtype of Ident.t | Arg of Ident.t | Body of Ident.t
-Index: typing/mtype.ml
-===================================================================
---- typing/mtype.ml	(revision 13286)
-+++ typing/mtype.ml	(working copy)
-@@ -34,7 +34,8 @@
-   match scrape env mty with
-     Mty_signature sg ->
-       Mty_signature(strengthen_sig env sg p)
--  | Mty_functor(param, arg, res) when !Clflags.applicative_functors ->
-+  | Mty_functor(param, arg, res)
-+    when !Clflags.applicative_functors && Ident.name param <> "*" ->
-       Mty_functor(param, arg, strengthen env res (Papply(p, Pident param)))
-   | mty ->
-       mty
+ exception Error of Location.t * Env.t * error
+ 

                 try
                   Mtype.nondep_supertype
                     (Env.add_module param arg.mod_type env) param mty_res
@@ -1429,7 +1440,7 @@
         Location.print_filename intf_name
   | Not_allowed_in_functor_body ->
       fprintf ppf

+      { mkmty(Pmty_functor(mkrhs "*" 2, mkmty(Pmty_signature []), $5)) }
   | module_type WITH with_constraints
       { mkmty(Pmty_with($1, List.rev $3)) }
   | MODULE TYPE OF module_expr %prec below_LBRACKETAT
@@ -725,6 +734,8 @@
       { $2 }
   | LPAREN UIDENT COLON module_type RPAREN module_declaration
       { mkmty(Pmty_functor(mkrhs $2 2, $4, $6)) }
