diff --git a/src/compiledData.ml b/src/compiledData.ml
index ed50291783f3c653acf4d5330a1f8dd62a38e578..9cc89bcf215b6a84697d6a1f82221e620b7ef39d 100644
--- a/src/compiledData.ml
+++ b/src/compiledData.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 27/05/2008 (at 13:25) by Erwan Jahier> *)
+(** Time-stamp: <modified the 27/05/2008 (at 14:11) by Erwan Jahier> *)
 
 (** 
 
@@ -126,10 +126,6 @@ and type_eff =
   | Array_type_eff    of type_eff * int
   | Struct_type_eff   of Ident.long * (Ident.t * (type_eff * const_eff option)) list
 
-and var_type = 
-  | Atype of type_eff 
-  | Any 
-  | Overload (* [Overload] is like [Any], except that it can only be [int] or [real] *)
       
 (* [type_eff] extended with  polymorphic or overloaded variables *)
 and type_eff_ext =
@@ -320,7 +316,7 @@ type 'a check_flag =
   | Checked of 'a
   | Incorrect
 
-let type_eff_to_type_eff_ext = function
+let rec type_eff_to_type_eff_ext = function
   | Bool_type_eff -> Bool_type_eff_ext
   | Int_type_eff -> Int_type_eff_ext
   | Real_type_eff -> Real_type_eff_ext
@@ -335,6 +331,8 @@ let type_eff_to_type_eff_ext = function
 	  (fun (id,(teff,copt)) -> (id,(type_eff_to_type_eff_ext teff,copt)))
 	  fl)
 
+exception Polymorphic
+exception Overloaded
 let rec type_eff_ext_to_type_eff = function
   | Bool_type_eff_ext -> Bool_type_eff
   | Int_type_eff_ext -> Int_type_eff
@@ -349,8 +347,8 @@ let rec type_eff_ext_to_type_eff = function
 	List.map 
 	  (fun (id,(teff,copt)) -> (id,(type_eff_ext_to_type_eff teff,copt)))
 	  fl)
-  | Any ->  assert false
-  | Overload -> assert false
+  | Any ->  raise Polymorphic
+  | Overload -> raise Overloaded
 
 
 let (profile_of_node_exp_eff : 
diff --git a/src/compiledDataDump.ml b/src/compiledDataDump.ml
index 67ff13cba3a1f383e5af14f84aee6e590a03c2ba..63040f4eb873af4b97c7879f3f7c5854551e47e3 100644
--- a/src/compiledDataDump.ml
+++ b/src/compiledDataDump.ml
@@ -32,27 +32,33 @@ let rec string_of_const_eff = (
       )
 )
 
-and string_of_type_eff = function
-  | Bool_type_eff -> "bool"
-  | Int_type_eff  -> "int"
-  | Real_type_eff -> "real"
-  | External_type_eff i -> long i
-  | Enum_type_eff (i, sl) -> 
+and string_of_type_eff_ext = function
+  | Bool_type_eff_ext -> "bool"
+  | Int_type_eff_ext  -> "int"
+  | Real_type_eff_ext -> "real"
+  | External_type_eff_ext i -> long i
+  | Enum_type_eff_ext (i, sl) -> 
       assert (sl <>[]);
       let f sep acc s  = acc ^ sep ^ (long s) in
 	(List.fold_left (f ", ")  (f "" "enum {" (List.hd sl)) (List.tl sl)) ^ "}"
-  | Array_type_eff (ty, sz) -> sprintf "%s^%d" (string_of_type_eff ty) sz
-  | Struct_type_eff (i, fl) -> 
+  | Array_type_eff_ext (ty, sz) -> sprintf "%s^%d" (string_of_type_eff_ext ty) sz
+  | Struct_type_eff_ext (i, fl) -> 
       assert (fl <>[]);
-      let f sep acc (id, (type_eff, const_eff_opt))  = 
+      let f sep acc (id, (type_eff_ext, const_eff_opt))  = 
 	acc ^ sep ^ (Ident.to_string id) ^ " : " ^
-	  (string_of_type_eff type_eff) ^
+	  (string_of_type_eff_ext type_eff_ext) ^
 	  match const_eff_opt with
 	      None -> ""
 	    | Some ce -> " (" ^ (string_of_const_eff ce) ^ ")"
       in
 	(List.fold_left (f "; ")  (f "" " {" (List.hd fl)) (List.tl fl)) ^ "}"
 	
+  | Any -> "a"
+  | Overload -> "o"
+
+and string_of_type_eff teff = string_of_type_eff_ext (type_eff_to_type_eff_ext teff)
+
+
 and string_of_type_eff_list = function
   | []  -> ""
   | [x] -> string_of_type_eff x
@@ -86,18 +92,16 @@ let (string_of_type_decl_list : (Ident.t * type_eff) list -> string -> string) =
     let str = String.concat sep (List.map string_of_decl tel) in
       str
 
-let string_of_var_type = function
-  | Any -> "a"
-  | Overload -> "o"
-  | Atype teff -> string_of_type_eff teff
+let string_of_decl_ext (id,teff) = 
+  (Ident.to_string id) ^ ":" ^ (string_of_type_eff_ext teff)
 
-let string_of_decl2 (id,teff) = 
-  (Ident.to_string id) ^ ":" ^ (string_of_var_type teff)
-let (string_of_type_decl_list2 : (Ident.t * var_type) list -> string -> string) =
+let (string_of_type_decl_list_ext : (Ident.t*type_eff_ext) list -> string -> string) =
   fun tel sep -> 
-    let str = String.concat sep (List.map string_of_decl2 tel) in
+    let str = String.concat sep (List.map string_of_decl_ext tel) in
       str
 
+
+
 let string_of_slice_info_eff si_eff =
   "[" ^ (string_of_int si_eff.se_first) ^ ".." ^ (string_of_int si_eff.se_last) ^
     (if si_eff.se_step = 1 then "" else " step " ^ (string_of_int si_eff.se_step)) ^
@@ -253,8 +257,8 @@ let (profile_of_node_exp_eff: node_exp_eff -> string) =
       ((if neff.def_eff = ExternEff then "extern " else "") ^
 	 (if neff.has_mem_eff then "node " else "function ") ^
 	 (string_of_node_key neff.node_key_eff) ^
-	 "(" ^ (string_of_type_decl_list2 neff.inlist_eff "; ") ^ ") returns (" ^
-	 (string_of_type_decl_list2 neff.outlist_eff "; ") ^ ");\n")
+	 "(" ^ (string_of_type_decl_list_ext  neff.inlist_eff "; ") ^ ") returns (" ^
+	 (string_of_type_decl_list_ext neff.outlist_eff "; ") ^ ");\n")
 
 let (string_of_node_def : node_def_eff -> string list) =
   function
diff --git a/src/evalType.ml b/src/evalType.ml
index 5a38e6e4b9824fce1e69c9044e1e0d1eaf0bcd94..055af69d7c1555150ab2e215fa07b6fb6f0dcd03 100644
--- a/src/evalType.ml
+++ b/src/evalType.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 26/05/2008 (at 15:48) by Erwan Jahier> *)
+(** Time-stamp: <modified the 27/05/2008 (at 14:13) by Erwan Jahier> *)
  
   
 open Predef
@@ -33,12 +33,9 @@ and (eval_by_pos_type :
 
       | CALL_eff node_exp_eff -> 
 	  let lto = snd (List.split node_exp_eff.it.outlist_eff) in
-	    List.map
-	      (function
-		 | Atype t -> t
-		 | (Any | Overload) -> assert false (* cannot occur for user node *)
-	      )
-	      lto
+	    (try List.map type_eff_ext_to_type_eff lto
+	    with Polymorphic | Overloaded -> assert false)
+
       | IDENT_eff id  -> (
 	  (* [id] migth be a constant, but also a variable *)
 	  try [type_of_const_eff (id_solver.id2const id lxm)]
diff --git a/src/lazyCompiler.ml b/src/lazyCompiler.ml
index ab24f7a7e5366f7a5e12dad562ca5ddd33cd0a23..c519ce3efd17c8c42c4a47ac990a5e20a13f7b23 100644
--- a/src/lazyCompiler.ml
+++ b/src/lazyCompiler.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 26/05/2008 (at 16:42) by Erwan Jahier> *)
+(** Time-stamp: <modified the 27/05/2008 (at 14:17) by Erwan Jahier> *)
 
 
 open Lxm
@@ -481,7 +481,7 @@ and (node_check_interface_do: t -> CompiledData.node_key -> Lxm.t ->
       (** [types_are_compatible t1 t2] checks that t1 is compatible with t2, i.e., 
 	  if t1 = t2 or t1 is abstract and and t2.
       *)
-    let type_is_comp (_,t1) (_,t2) = CompiledData.var_type_are_compatible t1 t2 in
+    let type_is_comp (_,t1) (_,t2) = CompiledData.type_eff_ext_are_compatible t1 t2 in
       if 
 	prov_node_exp_eff.node_key_eff      = body_node_exp_eff.node_key_eff      &&
 	(List.for_all2 type_is_comp 
@@ -576,10 +576,11 @@ and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t ->
 		| None -> None
 		| Some loclist -> Some (List.map type_args loclist)
 	    in
+	    let aux (id,t)= (id, type_eff_to_type_eff_ext t) in
 	      {
 		node_key_eff = nk;
-		inlist_eff   = List.map (fun (id,t) -> id, Atype t) inlist;
-		outlist_eff  = List.map (fun (id,t) -> id, Atype t) outlist;
+		inlist_eff   = List.map aux inlist;
+		outlist_eff  = List.map aux outlist;
 		loclist_eff  = loclist;
 		clock_inlist_eff  = [];(* XXX finish me! *)
 		clock_outlist_eff = [];(* XXX finish me! *)
@@ -588,12 +589,6 @@ and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t ->
 		is_safe_eff  = node_def.it.is_safe;
 	      }
     in
-    let var_type_to_type_eff = function
-      | Atype t -> t
-      | (Overload | Any)  -> 
-	  raise (Compile_error (
-		   lxm, "Cannot alias overloaded or polymorphic operator"))    
-    in
     let (make_alias_node : CompiledData.node_exp_eff -> CompiledData.node_exp_eff) =
       fun aliased_node -> 
 	(* builds a  node that calls the aliased node. It looks like:
@@ -609,7 +604,10 @@ and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t ->
 	       let var_info_eff =  {
 		 var_name_eff = id ;
 		 var_nature_eff = VarOutput ;
-		 var_type_eff = var_type_to_type_eff te ;
+		 var_type_eff = 
+		   try type_eff_ext_to_type_eff te with _ -> 
+		     raise (Compile_error (
+			      lxm, "Cannot alias overloaded or polymorphic operator"))
 	       }
 	       in
 		 LeftVarEff (var_info_eff, lxm)
@@ -699,10 +697,15 @@ and (node_check_do: t -> CompiledData.node_key -> Lxm.t -> SymbolTab.t ->
 		  in
 		  let aux vi = GetEff.typ node_id_solver vi.it.var_type in
 		  let (il,ol) = CompiledData.profile_of_node_exp_eff alias_node in
-		  let il = List.map var_type_to_type_eff il 
-		  and ol = List.map var_type_to_type_eff ol in 
-		    if 
-		      List.map aux vi_il <> il || List.map aux vi_ol <> ol 
+		  let (il,ol) = 
+		    try
+		      (List.map type_eff_ext_to_type_eff il,
+		       List.map type_eff_ext_to_type_eff ol)
+ 		    with 
+			Polymorphic | Overloaded -> assert false
+		  in
+		    if
+		      List.map aux vi_il <> il || List.map aux vi_ol <> ol
 		    then
 		      raise (Compile_error (
 			       lxm, "type mismatch in node alias definition"))
diff --git a/src/predefSemantics.ml b/src/predefSemantics.ml
index cfed966041514ee59f5dca1f19b67de071655a3a..41cf25997786dfe47502df9c87ed3690fbbe0658 100644
--- a/src/predefSemantics.ml
+++ b/src/predefSemantics.ml
@@ -1,4 +1,4 @@
-(** Time-stamp: <modified the 27/05/2008 (at 11:14) by Erwan Jahier> *)
+(** Time-stamp: <modified the 27/05/2008 (at 15:58) by Erwan Jahier> *)
 
 
 open Predef
@@ -24,11 +24,12 @@ let (type_eff_list_to_string :type_eff list -> string) =
     let str_l = List.map CompiledDataDump.string_of_type_eff tel in
       String.concat "*" str_l
     
-let (var_type_list_to_string : var_type list -> string) =
+let (type_eff_ext_list_to_string :type_eff_ext list -> string) =
   fun tel -> 
-    let str_l = List.map CompiledDataDump.string_of_var_type tel in
+    let str_l = List.map CompiledDataDump.string_of_type_eff_ext tel in
       String.concat "*" str_l
     
+    
 
 let (type_error : type_eff list -> string -> 'a) =
   fun tel expect -> 
@@ -45,7 +46,7 @@ let (type_error2 : string -> string -> string -> 'a) =
 	     ("\n*** type '" ^ provided ^ "' was provided" ^
 		(if expect = "" then "" 
 		 else (" whereas\n*** type '" ^expect^"' was expected")) ^
-		(if msg = "" then "" else ("\n*** and " ^ msg)))))
+		(if msg = "" then "" else ("\n*** " ^ msg)))))
 
 
 let arity_error (v : 'a list) (expect : string) =
@@ -88,45 +89,59 @@ type unify_result =
   | Unif of type_eff
   | Ko of string (* a msg explaining why the unification failed *)
 
-let var_type2str = CompiledDataDump.string_of_var_type
 let type_eff2str = CompiledDataDump.string_of_type_eff
+let type_eff_ext2str = CompiledDataDump.string_of_type_eff_ext
 
-let (unify : var_type list -> var_type list -> unify_result) =
+let (unify : type_eff_ext list -> type_eff list -> unify_result) =
   let (is_overloadable : type_eff -> bool) = function
     | Int_type_eff -> true
     | Real_type_eff -> true
     | _ -> false
   in
-    List.fold_left2
-      (fun acc vt1 vt2 -> 
-	 match acc,vt1,vt2 with
-	   | Ko msg , _, _ -> acc
-	   | Equal, Any,      Atype t2 -> Unif t2
-	   | Equal, Overload, Atype t2 -> if is_overloadable t2 then Unif t2 else 
-	       Ko((type_eff2str t2) ^ " should have type int or real")
-
-	   | (Equal|Unif _), Atype t1, Atype t2 -> if t1 = t2 then acc else 
-	       Ko((type_eff2str t1) ^ " <> " ^ (type_eff2str t2))
-
-	   | Unif ts, Any, Atype t2 -> if ts = t2 then acc else
-	       Ko((type_eff2str ts) ^ " <> " ^ (type_eff2str t2))
-	   | Unif ts, Overload, Atype t2 -> 
-	       if ts <> t2 then 
-		 Ko((type_eff2str ts) ^ " <> " ^ (type_eff2str t2))
-	       else if (not (is_overloadable t2)) then 
-		 Ko((type_eff2str ts) ^ "should be an int or a real")
-	       else
-		 acc
-	   | _,_, (Overload|Any) -> assert false (* cannot occur *)
-      )
-      Equal
+  let rec (unify_type_eff : type_eff_ext -> type_eff -> unify_result) =
+    fun t1 t2 -> 
+      if t1 = type_eff_to_type_eff_ext t2 then Equal else  
+	match (t1,t2) with
+	  | Array_type_eff_ext(teff_ext1,i1), Array_type_eff(teff2,i2) -> 
+	      if i1 <> i2 then Ko "incompatible array size" else
+		unify_type_eff teff_ext1 teff2
+		  
+	  | Struct_type_eff_ext(l1, fl1), Struct_type_eff(l2, fl2) -> 
+	    if l1 <> l2 then Ko "incompatible structure" else
+	      let fl1 = List.map (fun (_,(te,_)) -> te) fl1
+	      and fl2 = List.map (fun (_,(te,_)) -> te) fl2 in
+		List.fold_left2 unify_do_acc Equal fl1 fl2
+		
+	  | Any, t -> Unif t
+	  | Overload, t -> 
+	      if is_overloadable t then Unif t else 
+		Ko((type_eff2str t) ^ " should be an integer or a real")
+	  | _ -> 
+	      Ko((type_eff_ext2str t1) ^ " and " ^ (type_eff2str t2) ^
+		   " are not unifiable")
+
+  and (unify_do_acc : 
+	 unify_result -> type_eff_ext -> type_eff -> unify_result) =
+    fun acc te1 te2 -> 
+      match acc, unify_type_eff te1 te2 with
+	| Equal, Equal -> Equal
+	| Ko msg, _ 
+	| _, Ko msg -> Ko msg
+	| Unif t, Equal
+	| Equal, Unif t -> Unif t
+	| Unif t1, Unif t2 -> if t1 = t2 then acc else 
+	    Ko((type_eff2str t1) ^ " and " ^ (type_eff2str t2) ^
+		 " are not unifiable")
+
+  in
+    List.fold_left2 unify_do_acc Equal
 
 
 (*********************************************************************************)
 (* a few local alias to make the node profile below more readable. *)
-let i = Atype Int_type_eff
-let r = Atype Real_type_eff
-let b = Atype Bool_type_eff
+let i = Int_type_eff_ext
+let r = Real_type_eff_ext
+let b = Bool_type_eff_ext
 let id str = Ident.of_string str
 
 (** A few useful type profiles for simple operators *)
@@ -156,15 +171,9 @@ let ooo_profile = [(id "i1",Overload);(id "i2",Overload)], [(id "o",Overload)]
 (** iterators profiles *)
 (* [type_to_array_type [x1;...;xn] c] returns the array type [x1^c;...;xn^c] *)
 let (type_to_array_type: 
-       (Ident.t * var_type) list -> int -> (Ident.t * var_type) list) =
+       (Ident.t * type_eff_ext) list -> int -> (Ident.t * type_eff_ext) list) =
   fun l c ->
-    List.map 
-      (function 
-	 | id, Any -> id, Any
-	 | id, Overload -> id, Overload
-	 | id, Atype teff -> id, Atype (Array_type_eff(teff,c))
-      ) 
-      l
+    List.map (fun (id, teff) -> id, Array_type_eff_ext(teff,c)) l
 
 (* Extract the node and the constant from a list of static args *)
 let (get_node_and_constant:static_arg_eff list -> node_exp_eff * int)=
@@ -210,8 +219,8 @@ let fillred_profile =
 	    lxm, "\n*** type error: the type of node \n " ^ 
 	      (CompiledDataDump.profile_of_node_exp_eff n) ^
 	      " is not compatible with the use of this iterator.\n "^
-	      (CompiledDataDump.string_of_var_type t1) ^ " should be equal to " ^
-	      (CompiledDataDump.string_of_var_type t2) ^ "\n"))
+	      (CompiledDataDump.string_of_type_eff_ext t1) ^ " should be equal to " ^
+	      (CompiledDataDump.string_of_type_eff_ext t2) ^ "\n"))
 
 (* let fill_profile = fillred_profile *)
   (* Given 
@@ -244,10 +253,10 @@ let boolred_profile =
 	  | _ -> raise (Compile_error(lxm, "\n*** type error: 3 int were expected"))
     in
     let (_i,_j,k) = get_three_constants lxm sargs in
-      [id "i", Atype (Array_type_eff(Bool_type_eff,k))], [id "o", b]
+      [id "i",  (Array_type_eff_ext(Bool_type_eff_ext,k))], [id "o", b]
 	
 
-type node_profile = (Ident.t * var_type) list * (Ident.t * var_type) list
+type node_profile = (Ident.t * type_eff_ext) list * (Ident.t * type_eff_ext) list
 
 let (op2profile : Predef.op -> Lxm.t -> static_arg_eff list -> node_profile) = 
   fun op lxm sargs -> match op with
@@ -315,31 +324,47 @@ let (type_eval : op -> Lxm.t -> CompiledData.static_arg_eff list -> typer) =
 	      | x -> (arity_error x "3")
 	  )
 	| (NOR_n | DIESE_n) -> 
-	    (* VERRUE 2 : those operators have no profile, therefore i define an
-	       ad-hoc check for them.
-	   *)
+	    (* VERRUE 2 : cf XXX above: therefore i define an ad-hoc
+	       check for them.  *)
 	    let check_nary_iter acc ceff =
 	      match ceff with (Bool_type_eff) -> acc | _ -> (type_error [ceff] "bool")
 	    in
-	      ignore(List.fold_left check_nary_iter true (List.flatten ll));
+	      List.fold_left check_nary_iter () (List.flatten ll);
 	      [Bool_type_eff]
 	| _ -> 
 	    (* general case *)
 	    let node_eff = make_node_exp_eff op lxm sargs in
 	    let lti = List.map (fun (id,t) -> t) node_eff.inlist_eff
 	    and lto = List.map (fun (id,t) -> t) node_eff.outlist_eff in
-	    let unwrap_type =  function Atype t -> t | _ -> assert false in
-	    let subst_type t = function Atype t -> t | Any -> t | Overload -> t in
-	    let l = List.map (fun t -> Atype t) (List.flatten ll) in
+	    let rec (subst_type : type_eff -> type_eff_ext -> type_eff) =
+	      fun t teff_ext -> match teff_ext with
+		  (* substitutes [t] in [teff_ext] *)
+		| Bool_type_eff_ext -> Bool_type_eff
+		| Int_type_eff_ext -> Int_type_eff
+		| Real_type_eff_ext -> Real_type_eff
+		| External_type_eff_ext l -> External_type_eff l
+		| Enum_type_eff_ext(l,el) ->  Enum_type_eff(l,el)
+		| Array_type_eff_ext(teff_ext,i) -> 
+		    Array_type_eff(subst_type t teff_ext, i)
+		| Struct_type_eff_ext(l, fl) -> 
+		    Struct_type_eff(
+		      l, 
+		      List.map 
+			(fun (id,(teff,copt)) -> (id,(subst_type t teff,copt)))
+			fl)
+		| Any 
+		| Overload -> t
+	    in
+	    let l = (List.flatten ll) in
 	      if (List.length l <> List.length lti) then
 		arity_error l (string_of_int (List.length lti))
 	      else
 		match unify lti l with
-		  | Equal  -> List.map unwrap_type lto
+		  | Equal  -> List.map type_eff_ext_to_type_eff lto
 		  | Unif t -> List.map (subst_type t) lto
 		  | Ko(str) -> 
-		      type_error2 (var_type_list_to_string l) 
-			(var_type_list_to_string lti) str
+		      type_error2 (type_eff_list_to_string l) 
+			(type_eff_ext_list_to_string lti) str
 
 
 (*********************************************************************************)
diff --git a/src/test/test.res.exp b/src/test/test.res.exp
index 006cdef135b97a391cb34355bcfbe1bd6abb3dac..73eaf964c0bdc426b0ea722e3cbddcdfddd989b4 100644
--- a/src/test/test.res.exp
+++ b/src/test/test.res.exp
@@ -5218,7 +5218,7 @@ type inter__selType =  {i : int; b : bool; r : real};
 
 	XXX evalType.ml:anonymous struct not yet supported ->  finish me!
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/Pascal/newpacks.lus
 
 ----------------------------------------------------------------------
@@ -5859,7 +5859,7 @@ type inter__selType =  {i : int; b : bool; r : real};
 
 	XXX evalType.ml:anonymous struct not yet supported ->  finish me!
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/Pascal/p.lus
 
 ----------------------------------------------------------------------
@@ -8120,7 +8120,7 @@ type morel4__arrayi = int^2^3;
 Warning. in file "should_work/fab_test/morel4.lus", line 33, col 17 to 17, token ',':
 ---> separator mismatch, ';' expected
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/fab_test/morel4.lus
 
 ----------------------------------------------------------------------
@@ -8198,7 +8198,7 @@ tel
 
 	XXX evalType.ml:anonymous struct not yet supported ->  finish me!
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/fab_test/morel5.lus
 
 ----------------------------------------------------------------------
@@ -9713,7 +9713,7 @@ type produitBool__Tacc_inShift =  {acc_in_PLC :  {multiplieur : bool^10; rank :
 
 	XXX evalType.ml:anonymous struct not yet supported ->  finish me!
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/lionel/ProduitBool/produitBool.lus
 
 ----------------------------------------------------------------------
@@ -9983,7 +9983,7 @@ type calculs_max__struct_max =  {max1 : int; max2 : int; imax1 : int; imax2 : in
 
 	XXX evalType.ml:anonymous struct not yet supported ->  finish me!
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/lionel/calculs_max.lus
 
 ----------------------------------------------------------------------
@@ -10022,7 +10022,7 @@ type deSimone__cell_accu =  {token : bool; grant : bool};
 
 	XXX evalType.ml:anonymous struct not yet supported ->  finish me!
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/lionel/deSimone.lus
 
 ----------------------------------------------------------------------
@@ -10148,17 +10148,19 @@ type matrice__T_fibo = int^2;
 const matrice__m = 3;
 const matrice__n = 2;
 	Exported nodes:
-*** Error in file "should_work/lionel/matrice.lus", line 15, col 8 to 10, token 'red': type error: 
-*** type 'int*int^3^2' was provided whereas
-*** type 'o*o' was expected
-*** and int <> int^3^2
-
 node matrice__fibo(accu_in:int^2) returns (accu_out:int^2; elt:int);
 let
    accu_out = [(accu_in[0] + accu_in[1]), accu_in[0]];
    elt = (accu_in[0] + accu_in[1]);
 tel
 -- end of node matrice__fibo
+node matrice__matrice(a:int) returns (sum:int; bid:int^2; T:int^3^2);
+let
+    (bid, T) = fill<<node Lustre__fill<<node matrice__fibo, const 3>>, const
+	 2>>([a, a]);
+   sum = red<<node Lustre__red<<node Lustre__+, const 3>>, const 2>>(0, T);
+tel
+-- end of node matrice__matrice
 
 ----------------------------------------------------------------------
 ====> ../lus2lic -vl 3 --compile-all-items should_work/lionel/matrice2.lus
@@ -10204,7 +10206,7 @@ const moyenne__size = 10;
 
 	XXX evalType.ml:anonymous struct not yet supported ->  finish me!
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/lionel/moyenne.lus
 
 ----------------------------------------------------------------------
@@ -10298,7 +10300,7 @@ const normal__COM_ERR = 0;
 
 	XXX evalType.ml:anonymous struct not yet supported ->  finish me!
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/lionel/normal.lus
 
 ----------------------------------------------------------------------
@@ -10458,7 +10460,7 @@ const testSilus__COM_ERR = 0;
 
 	XXX evalType.ml:anonymous struct not yet supported ->  finish me!
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/lionel/testSilus.lus
 
 ----------------------------------------------------------------------
@@ -10508,7 +10510,7 @@ type triSel__Exchange_accu =  {MinVal : int; MinRank : int; RankFrom : int; Curr
 
 	XXX evalType.ml:anonymous struct not yet supported ->  finish me!
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/lionel/triSel.lus
 
 ----------------------------------------------------------------------
@@ -10551,7 +10553,7 @@ const contractForElementSelectionInArray__size = 10;
 
 	XXX evalType.ml:anonymous struct not yet supported ->  finish me!
 
-*** oops: an internal error occurred in file evalType.ml, line 162, column 3
+*** oops: an internal error occurred in file evalType.ml, line 159, column 3
 *** when compiling lustre program should_work/packEnvTest/contractForElementSelectionInArray/contractForElementSelectionInArray.lus
 
 ----------------------------------------------------------------------
@@ -11734,5 +11736,5 @@ type const2__t8 = int^3^7^8^9^3^8^8;
 *** Error in file "should_fail/type/const2.lus", line 16, col 12 to 13, token '<>': type error: 
 *** type 'int*real' was provided whereas
 *** type 'a*a' was expected
-*** and int <> real
+*** int and real are not unifiable