Skip to content

Commit 7a1245e

Browse files
cknittclaude
andcommitted
Show signature mismatches as the actual and expected declaration, each under its location
Why: A signature mismatch printed every enclosing module in full, then the two declarations, then their locations as "file:line:" lines with a label on the next line that read like headings with nothing under them, and the reasons without a break. Which text was where had to be matched up by hand, and declarations that read the same looked like a declaration not including itself. The type checker's errors separate their parts with blank lines and indent the content under a lead-in. Diagnostic modified (type declaration in an interface): Example: // Foo.res type t = {a: int, b: int} // Foo.resi type t = {x: int, y: int} Before (diagnostic): The implementation Foo.res does not match the interface foo.cmi: Type declarations do not match: type t = {a: int, b: int} is not included in type t = {x: int, y: int} Foo.resi:1:1-25: Expected declaration Foo.res:1:1-25: Actual declaration Fields number 1 have different names, a and x. After (diagnostic): The implementation Foo.res does not match the interface foo.cmi: Actual declaration (Foo.res:1:1-25): type t = {a: int, b: int} Expected declaration (Foo.resi:1:1-25): type t = {x: int, y: int} Fields number 1 have different names, a and x. Diagnostic modified (value in a nested module): Example: // Foo.res module Inner = { let value = "not an int" } // Foo.resi module Inner: { let value: int } Before (diagnostic): In module Inner: Modules do not match: { let value: string } is not included in { let value: int } In module Inner: Values do not match: let value: string is not included in let value: int Foo.resi:2:3-16: Expected declaration Foo.res:2:7-11: Actual declaration After (diagnostic): In module Inner: Actual declaration (Foo.res:2:7-11): let value: string Expected declaration (Foo.resi:2:3-16): let value: int Diagnostic modified (functor result): Example: module type S = { type t } module M: { module F: (X: S) => S with type t = X.t } = { module F = (X: S) => { type t = int } } Before (diagnostic): Signature mismatch: Modules do not match: … In module F: Modules do not match: … At position module F: (X) => <here> Modules do not match: … At position module F: (X) => <here> Type declarations do not match: type t = int is not included in type t = X.t functor_signature_mismatch.res:6:36: Expected declaration functor_signature_mismatch.res:9:5-16: Actual declaration After (diagnostic): Signature mismatch: In the result of functor F: Actual declaration (functor_signature_mismatch.res:9:5-16): type t = int Expected declaration (functor_signature_mismatch.res:6:36): type t = X.t Diagnostic modified (functor parameter): Example: module M: { module F: (X: {let a: int}) => {} } = { module F = (X: {let a: string}) => {} } Before (diagnostic): Signature mismatch: Modules do not match: … the module, then the functor, each pair printed in full At position module F: (X: <here>) => ... Values do not match: let a: int is not included in let a: string inclusion_layout_functor_parameter.res:12:7-19: Expected declaration inclusion_layout_functor_parameter.res:6:7-16: Actual declaration After (diagnostic): In the parameter X of functor F: Actual declaration (inclusion_layout_functor_parameter.res:12:7-19): let a: string Expected declaration (inclusion_layout_functor_parameter.res:6:7-16): let a: int Diagnostic modified (missing values): Example: module M: { module N: { let a: int let b: string } } = { module N = {} } Before (diagnostic): Signature mismatch: Modules do not match: … the module, then module N, each pair printed in full In module N: The value `b` is required but not provided inclusion_layout_missing_values.res:5:5-17: Expected declaration In module N: The value `a` is required but not provided inclusion_layout_missing_values.res:4:5-14: Expected declaration After (diagnostic): In module N: The value `a` is required but not provided. Expected declaration (inclusion_layout_missing_values.res:4:5-14): let a: int The value `b` is required but not provided. Expected declaration (inclusion_layout_missing_values.res:5:5-17): let b: string Diagnostic modified (runtime representation reason): Before (diagnostic): Their runtime representations differ: the first declaration states values whose typeof is "object", the second declaration states values whose typeof is "string". After (diagnostic): Their runtime representations differ: The actual declaration states values whose typeof is "object". The expected declaration states values whose typeof is "string". Diagnostic modified (extension constructor declared in an interface): Example: // Foo.res type t += Boom(string) // Foo.resi type t += Boom(int) Before (diagnostic): Foo.res: Expected declaration After (diagnostic): Expected declaration (Foo.resi:4:3-13): type t += Boom(int) Matching modified (what an inclusion error prints, Includemod.report_error): Before (text): every symptom from the whole module down, a big one as "..."; "In module P:" or "At position <module type with <here>>" before each After (text): the header (implementation against interface), then only the symptoms at the end of the path: a module or module type comparison is left out when an item inside it follows "In module P:", "In module type P.T:", "In the result of functor P:", "In the parameter X of functor P:", or "At position ..." otherwise, once for consecutive items at the same position missing items in the order of the expected signature in a functor's parameter, where inclusion is reversed, the implementation's side is still the actual declaration Representation modified (extension constructor locations in .cmi files, Subst.extension_constructor): Before (representation): ext_loc ↦ Location.none when saving After (representation): ext_loc ↦ kept when locations are kept, as for every other declaration effect: reanalyze also records a reference to an exception declared in an interface Review: Is anything dropped that was useful? The enclosing modules printed in full repeated the items below them; the path line names where the items are. A big part was printed as "..." for the same reason, so the size check is gone. Review: Why "actual" and "expected" and not "implementation" and "interface"? The same errors are reported for module type constraints and functor arguments within one file, where there is no interface. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Kbf3gLpf7RN1MiRcubPgRn Signed-off-by: Christoph Knittel <ck@cca.io>
1 parent 25e3dfb commit 7a1245e

77 files changed

Lines changed: 652 additions & 797 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
- Show a signature mismatch as the actual and the expected declaration, each under its location, with only the items that differ and the module path to them.
2+
- Keep the location of an extension constructor or exception declared in an interface, so that errors and reanalyze point to it.

‎compiler/ml/includecore.ml‎

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -225,22 +225,29 @@ let report_type_mismatch0 first second decl ppf err =
225225
| Record_representation (_rep1, _rep2) ->
226226
pr "Their internal representations differ"
227227
| Unboxed_representation b ->
228-
pr "Their internal representations differ:@ %s %s %s"
229-
(if b then second else first)
228+
pr "@[<v 2>Their internal representations differ:@,%s %s %s@]"
229+
(String.capitalize_ascii (if b then second else first))
230230
decl "uses unboxed representation"
231-
| Immediate -> pr "%s is not an immediate type" first
231+
| Immediate -> pr "%s %s is not an immediate type" first decl
232232
| Tag_name -> pr "Their @tag annotations differ"
233233
| Variant_representation s ->
234234
pr "The internal representations for case %s are not equal" (Ident.name s)
235235
| Not_undefined ->
236236
pr
237-
"Their runtime representations differ:@ %s %s is @notUndefined,@ but %s \
238-
%s can hold undefined"
239-
second decl first decl
237+
"@[<v 2>Their runtime representations differ:@,\
238+
%s %s is @notUndefined,@,\
239+
but %s %s can hold undefined@]"
240+
(String.capitalize_ascii second)
241+
decl first decl
240242
| Runtime_annotation (declared1, declared2) ->
241243
pr
242-
"Their runtime representations differ:@ %s %s states %s,@ %s %s states %s"
243-
first decl declared1 second decl declared2
244+
"@[<v 2>Their runtime representations differ:@,\
245+
%s %s states %s.@,\
246+
%s %s states %s@]"
247+
(String.capitalize_ascii first)
248+
decl declared1
249+
(String.capitalize_ascii second)
250+
decl declared2
244251

245252
let report_type_mismatch first second decl ppf =
246253
List.iter (fun err ->

‎compiler/ml/includemod.ml‎

Lines changed: 119 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ open Typedtree
2020
open Types
2121

2222
type symptom =
23-
| Missing_field of Ident.t * Location.t * string (* kind *)
23+
| Missing_field of Ident.t * Location.t * string * signature_item
24+
(** The name, location, kind and declaration of an expected item *)
2425
| Value_descriptions of Ident.t * value_description * value_description
2526
| Type_declarations of
2627
Ident.t
@@ -331,7 +332,8 @@ and signatures ~loc env cxt subst sig1 sig2 =
331332
(* see PR#5098 *)
332333
simplify_structure_coercion cc id_pos_list runtime_fields
333334
else Tcoerce_structure (cc, id_pos_list, runtime_fields)
334-
| _ -> raise (Error unpaired))
335+
(* In the order of the expected signature *)
336+
| _ -> raise (Error (List.rev unpaired)))
335337
| item2 :: rem -> (
336338
let id2, loc, name2 = item_ident_name item2 in
337339
let name2, report =
@@ -357,7 +359,7 @@ and signatures ~loc env cxt subst sig1 sig2 =
357359
| exception Not_found ->
358360
let unpaired =
359361
if report then
360-
(cxt, env, Missing_field (id2, loc, kind_of_field_desc name2))
362+
(cxt, env, Missing_field (id2, loc, kind_of_field_desc name2, item2))
361363
:: unpaired
362364
else unpaired
363365
in
@@ -485,12 +487,21 @@ let modtypes env m1 m2 =
485487
open Format
486488
open Printtyp
487489

488-
let show_loc msg ppf loc =
489-
fprintf ppf "@\n@[<2>%a:@ %s@]" Location.print_loc loc msg
490+
(* A declaration under a label naming its side and its location *)
491+
let show_declaration label loc pp ppf x =
492+
fprintf ppf "@[<v 2>%s (%a):@,%a@]" label Location.print_loc loc pp x
490493

491-
let show_locs ppf (loc1, loc2) =
492-
show_loc "Expected declaration" ppf loc2;
493-
show_loc "Actual declaration" ppf loc1
494+
(* [x1] is included in [x2]. In a functor's parameter, where inclusion goes
495+
the other way, [swapped] is true and [x2] is the actual declaration. *)
496+
let show_declarations ~swapped pp ppf (x1, loc1, x2, loc2) =
497+
let (actual, actual_loc), (expected, expected_loc) =
498+
if swapped then ((x2, loc2), (x1, loc1)) else ((x1, loc1), (x2, loc2))
499+
in
500+
fprintf ppf "%a@,@,%a"
501+
(show_declaration "Actual declaration" actual_loc pp)
502+
actual
503+
(show_declaration "Expected declaration" expected_loc pp)
504+
expected
494505

495506
let find_arity_mismatch env ty1 ty2 =
496507
let rec loop seen ty1 ty2 =
@@ -535,47 +546,50 @@ let show_arity_mismatch env ppf (d1 : value_description)
535546
if n = 1 then "1 argument" else string_of_int n ^ " arguments"
536547
in
537548
fprintf ppf
538-
"@\n\
549+
"@,\
550+
@,\
539551
@[The implementation contains a function taking %s where the interface \
540552
expects one taking %s.@]"
541553
(args n1) (args n2)
542554
| _ -> ()
543555

544-
let include_symptom env ppf = function
545-
| Missing_field (id, loc, kind) ->
546-
fprintf ppf "The %s `%a` is required but not provided" kind ident id;
547-
show_loc "Expected declaration" ppf loc
556+
let include_symptom ~swapped env ppf = function
557+
| Missing_field (id, loc, kind, item) ->
558+
fprintf ppf "The %s `%a` is required but not provided.@,@,%a" kind ident id
559+
(show_declaration
560+
(if swapped then "Actual declaration" else "Expected declaration")
561+
loc signature)
562+
[item]
548563
| Value_descriptions (id, d1, d2) ->
549-
fprintf ppf
550-
"@[<hv 2>Values do not match:@ %a@;<1 -2>is not included in@ %a@]"
551-
(value_description id) d1 (value_description id) d2;
552-
show_arity_mismatch env ppf d1 d2;
553-
show_locs ppf (d1.val_loc, d2.val_loc)
564+
show_declarations ~swapped (value_description id) ppf
565+
(d1, d1.val_loc, d2, d2.val_loc);
566+
if swapped then show_arity_mismatch env ppf d2 d1
567+
else show_arity_mismatch env ppf d1 d2
554568
| Type_declarations (id, d1, d2, errs) ->
555-
fprintf ppf "@[<v>@[<hv>%s:@;<1 2>%a@ %s@;<1 2>%a@]%a%a@]"
556-
"Type declarations do not match" (type_declaration id) d1
557-
"is not included in" (type_declaration id) d2 show_locs
558-
(d1.type_loc, d2.type_loc)
559-
(Includecore.report_type_mismatch "the first" "the second" "declaration")
560-
errs
569+
show_declarations ~swapped (type_declaration id) ppf
570+
(d1, d1.type_loc, d2, d2.type_loc);
571+
if List.exists (fun err -> err <> Includecore.Manifest) errs then
572+
let first, second =
573+
if swapped then ("the expected", "the actual")
574+
else ("the actual", "the expected")
575+
in
576+
fprintf ppf "@,%a"
577+
(Includecore.report_type_mismatch first second "declaration")
578+
errs
561579
| Extension_constructors (id, x1, x2) ->
562-
fprintf ppf
563-
"@[<hv 2>Extension declarations do not match:@ %a@;\
564-
<1 -2>is not included in@ %a@]"
565-
(extension_constructor id) x1 (extension_constructor id) x2;
566-
show_locs ppf (x1.ext_loc, x2.ext_loc)
580+
show_declarations ~swapped (extension_constructor id) ppf
581+
(x1, x1.ext_loc, x2, x2.ext_loc)
567582
| Module_types (mty1, mty2) ->
583+
let actual, expected = if swapped then (mty2, mty1) else (mty1, mty2) in
568584
fprintf ppf
569-
"@[<hv 2>Modules do not match:@ %a@;<1 -2>is not included in@ %a@]"
570-
modtype mty1 modtype mty2
585+
"@[<v 2>Actual module type:@,%a@]@,@,@[<v 2>Expected module type:@,%a@]"
586+
modtype actual modtype expected
571587
| Modtype_infos (id, d1, d2) ->
572-
fprintf ppf
573-
"@[<hv 2>Module type declarations do not match:@ %a@;\
574-
<1 -2>does not match@ %a@]"
575-
(modtype_declaration id) d1 (modtype_declaration id) d2
588+
show_declarations ~swapped (modtype_declaration id) ppf
589+
(d1, d1.mtd_loc, d2, d2.mtd_loc)
576590
| Modtype_permutation -> fprintf ppf "Illegal permutation of structure fields"
577591
| Interface_mismatch (impl_name, intf_name) ->
578-
fprintf ppf "@[The implementation %s@ does not match the interface %s:"
592+
fprintf ppf "@[The implementation %s@ does not match the interface %s:@]"
579593
impl_name intf_name
580594
| Unbound_modtype_path path ->
581595
fprintf ppf "Unbound module type %a" Printtyp.path path
@@ -603,83 +617,92 @@ and argname x =
603617
let s = Ident.name x in
604618
if s = "*" then "" else s
605619

606-
let path_of_context = function
620+
(* The path of the modules a context goes through, outermost first *)
621+
let path_of_modules = function
607622
| Module id :: rem ->
608623
let rec subm path = function
609-
| [] -> path
624+
| [] -> Some path
610625
| Module id :: rem -> subm (Pdot (path, Ident.name id, -1)) rem
611-
| _ -> assert false
626+
| (Modtype _ | Arg _ | Body _) :: _ -> None
612627
in
613628
subm (Pident id) rem
614-
| _ -> assert false
629+
| (Modtype _ | Arg _ | Body _) :: _ | [] -> None
615630

631+
(* Where in the module an error is, as a line before it. [cxt] is outermost
632+
first. A module type or a functor's result at the end of a module path is
633+
named in words; any other position is shown as a module type with <here>. *)
616634
let context ppf cxt =
635+
let split_last l =
636+
match List.rev l with
637+
| last :: rev_init -> Some (List.rev rev_init, last)
638+
| [] -> None
639+
in
617640
if cxt = [] then ()
618-
else if
619-
List.for_all
620-
(function
621-
| Module _ -> true
622-
| _ -> false)
623-
cxt
624-
then fprintf ppf "In module %a:@ " path (path_of_context cxt)
625-
else fprintf ppf "@[<hv 2>At position@ %a@]@ " context cxt
626-
627-
let include_err ppf (cxt, env, err) =
628-
Printtyp.wrap_printing_env env (fun () ->
629-
fprintf ppf "@[<v>%a%a@]" context (List.rev cxt) (include_symptom env) err)
630-
631-
let error_size = 400 (* in heap words *)
632-
633-
(* An error part is big when its heap representation exceeds
634-
[error_size] words. Each distinct reachable block counts its header
635-
and fields; a block without scannable fields (string, float, custom) or a
636-
closure counts its header only. String contents are excluded so that the
637-
decision is independent of source file names stored in locations. The walk
638-
stops as soon as the limit is exceeded, which bounds the visited list. *)
639-
let is_big obj =
640-
let size = ref 0 in
641-
let visited = ref [] in
642-
let exception Big in
643-
let rec walk (o : Obj.t) =
644-
if Obj.is_block o && not (List.memq o !visited) then (
645-
visited := o :: !visited;
646-
let tag = Obj.tag o in
647-
let scan =
648-
tag < Obj.no_scan_tag && tag <> Obj.closure_tag && tag <> Obj.infix_tag
649-
in
650-
size := !size + if scan then 1 + Obj.size o else 1;
651-
if !size > error_size then raise_notrace Big;
652-
if scan then
653-
for i = 0 to Obj.size o - 1 do
654-
walk (Obj.field o i)
655-
done)
641+
else
642+
match (path_of_modules cxt, split_last cxt) with
643+
| Some p, _ -> fprintf ppf "In module %a:@,@," path p
644+
| None, Some ([], Modtype id) ->
645+
fprintf ppf "In module type %a:@,@," ident id
646+
| None, Some (modules, Modtype id) -> (
647+
match path_of_modules modules with
648+
| Some p -> fprintf ppf "In module type %a.%a:@,@," path p ident id
649+
| None -> fprintf ppf "@[<hv 2>At position@ %a@]@,@," context cxt)
650+
| None, Some (modules, Body _) -> (
651+
match path_of_modules modules with
652+
| Some p -> fprintf ppf "In the result of functor %a:@,@," path p
653+
| None -> fprintf ppf "@[<hv 2>At position@ %a@]@,@," context cxt)
654+
| None, Some (modules, Arg x) -> (
655+
match path_of_modules modules with
656+
| Some p ->
657+
fprintf ppf "In the parameter %a of functor %a:@,@," ident x path p
658+
| None -> fprintf ppf "@[<hv 2>At position@ %a@]@,@," context cxt)
659+
| None, _ -> fprintf ppf "@[<hv 2>At position@ %a@]@,@," context cxt
660+
661+
let include_err ~show_context ppf (cxt, env, err) =
662+
(* Inclusion is reversed in each functor parameter on the way *)
663+
let swapped =
664+
List.length
665+
(List.filter
666+
(function
667+
| Arg _ -> true
668+
| Module _ | Modtype _ | Body _ -> false)
669+
cxt)
670+
mod 2
671+
= 1
656672
in
657-
try
658-
walk (Obj.repr obj);
659-
false
660-
with Big -> true
661-
673+
Printtyp.wrap_printing_env env (fun () ->
674+
fprintf ppf "@[<v>%a%a@]"
675+
(fun ppf cxt -> if show_context then context ppf cxt)
676+
(List.rev cxt)
677+
(include_symptom ~swapped env)
678+
err)
679+
680+
(* An error is a path of symptoms from the whole module down to the items that
681+
differ. The modules on the way are left out, as the items at the end say
682+
what differs, each under the position it is at. *)
662683
let report_error ppf errs =
663-
if errs = [] then ()
664-
else
665-
let errs, err = Ext_list.split_at_last errs in
666-
let pe = ref true in
667-
let include_err' ppf ((_, _, obj) as err) =
668-
if not (is_big obj) then fprintf ppf "%a@ " include_err err
669-
else if !pe then (
670-
fprintf ppf "...@ ";
671-
pe := false)
672-
in
673-
let print_errs ppf = List.iter (include_err' ppf) in
674-
fprintf ppf "@[<v>%a%a@]" print_errs errs include_err err
684+
let rec shown = function
685+
| [] -> []
686+
| [err] -> [err]
687+
| (_, _, (Module_types _ | Modtype_infos _)) :: rest -> shown rest
688+
| err :: rest -> err :: shown rest
689+
in
690+
let rec print ppf previous_cxt = function
691+
| [] -> ()
692+
| ((cxt, _, _) as err) :: rest ->
693+
if previous_cxt <> None then fprintf ppf "@,@,";
694+
include_err ~show_context:(previous_cxt <> Some cxt) ppf err;
695+
print ppf (Some cxt) rest
696+
in
697+
fprintf ppf "@[<v>%a@]" (fun ppf errs -> print ppf None errs) (shown errs)
675698

676699
let better_candidate_loc (x : error list) =
677700
match x with
678701
| [(_, _, Interface_mismatch _); (_, _, descr)] -> (
679702
match descr with
680703
| Value_descriptions (_, d1, _) -> Some d1.val_loc
681704
| Type_declarations (_, tdcl1, _, _) -> Some tdcl1.type_loc
682-
| Missing_field (_, loc, _) -> Some loc
705+
| Missing_field (_, loc, _, _) -> Some loc
683706
| _ -> None)
684707
| _ -> None
685708

‎compiler/ml/includemod.mli‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ val type_declarations :
3838
val print_coercion : formatter -> module_coercion -> unit
3939

4040
type symptom =
41-
| Missing_field of Ident.t * Location.t * string (* kind *)
41+
| Missing_field of Ident.t * Location.t * string * signature_item
42+
(** The name, location, kind and declaration of an expected item *)
4243
| Value_descriptions of Ident.t * value_description * value_description
4344
| Type_declarations of
4445
Ident.t

‎compiler/ml/subst.ml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ let extension_constructor s ext =
304304
ext_ret_type = may_map (typexp_rec s) ext.ext_ret_type;
305305
ext_private = ext.ext_private;
306306
ext_attributes = attrs s ext.ext_attributes;
307-
ext_loc = (if s.for_saving then Location.none else ext.ext_loc);
307+
ext_loc = loc s ext.ext_loc;
308308
ext_is_exception = ext.ext_is_exception;
309309
})
310310

‎compiler/ml/typemod.ml‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1858,7 +1858,7 @@ let report_error ppf = function
18581858
| Cannot_apply mty ->
18591859
fprintf ppf "@[This module is not a functor; it has type@ %a@]" modtype mty
18601860
| Not_included errs ->
1861-
fprintf ppf "@[<v>Signature mismatch:@ %a@]" Includemod.report_error errs
1861+
fprintf ppf "@[<v>Signature mismatch:@,@,%a@]" Includemod.report_error errs
18621862
| Cannot_eliminate_dependency mty ->
18631863
fprintf ppf
18641864
"@[This functor has type@ %a@ The parameter cannot be eliminated in the \
@@ -1874,12 +1874,16 @@ let report_error ppf = function
18741874
| With_mismatch (lid, explanation) ->
18751875
fprintf ppf
18761876
"@[<v>@[In this `with' constraint, the new definition of %a@ does not \
1877-
match its original definition@ in the constrained signature:@]@ %a@]"
1877+
match its original definition@ in the constrained signature:@]@,\
1878+
@,\
1879+
%a@]"
18781880
longident lid Includemod.report_error explanation
18791881
| With_makes_applicative_functor_ill_typed (lid, path, explanation) ->
18801882
fprintf ppf
18811883
"@[<v>@[This `with' constraint on %a makes the applicative functor @ \
1882-
type %s ill-typed in the constrained signature:@]@ %a@]"
1884+
type %s ill-typed in the constrained signature:@]@,\
1885+
@,\
1886+
%a@]"
18831887
longident lid (Path.name path) Includemod.report_error explanation
18841888
| With_changes_module_alias (lid, id, path) ->
18851889
fprintf ppf

‎tests/analysis_tests/tests-reanalyze/deadcode/expected/deadcode.txt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,6 +1463,8 @@
14631463
addDeclaration_ Value +test Shadow.res:11:6 path:+Shadow.M
14641464
addDeclaration_ Value +test Shadow.res:9:6 path:+Shadow.M
14651465
Scanning TestDeadExn.cmt Source:TestDeadExn.res
1466+
add_value_reference TestDeadExn.res:1:12 --> DeadExn.resi:2:0
1467+
add_type_reference TestDeadExn.res:1:12 --> DeadExn.resi:2:0
14661468
Scanning TestEmitInnerModules.cmt Source:TestEmitInnerModules.res
14671469
addDeclaration_ Value +x TestEmitInnerModules.res:3:6 path:+TestEmitInnerModules.Inner
14681470
addDeclaration_ Value +y TestEmitInnerModules.res:5:6 path:+TestEmitInnerModules.Inner

0 commit comments

Comments
 (0)