Weird completion list on records with company, including modules

I am using Emacs, Tuareg, utop and Company (and merlin), and the autocomplete feature gives strange lists when a record field is involved. Consider the following

type t = {x:int; y:int}
type t2 = {f: t; g:t}

let f x = x.f.(*autocomplete here*)

The list has x and y as expected, but also a bunch of modules, including Stdlib and Camlinternalformat :

Can anybody reproduce this ? Is this a legitimate completion (I do not think so) ?

Apparently, utop is involved (I have a utop-company-backend in the company settings). The function UTop_complete.complete does return a bunch of module and constructor names on a string ending with a dot, or on an empty string :

UTop_complete.complete ~phrase_terminator:"" ~input:"x.f.";;

val _27 : int * (string * string) list =
  (4,
   [("Afl_instrument", ""); ("Alias_analysis", ""); ("Allocated_const", "");
    ("Annot", ""); ("Arch", ""); ("Arg_helper", ""); ("Asmgen", "");
    ("Asmlibrarian", ""); ("Asmlink", ""); ("Asmpackager", "");
    ("Assert_failure", ""); ("Ast_helper", ""); ("Ast_invariants", "");
    ("Ast_iterator", ""); ("Ast_mapper", ""); ("Asttypes", "");
    ("Attr_helper", ""); ("Augment_specialised_args", "");
    ("Backend_intf", ""); ("Backend_var", ""); ("Binutils", "");
    ("Branch_relaxation", ""); ("Branch_relaxation_intf", ""); ("Btype", "");
    ("Build_export_info", ""); ("Build_path_prefix_map", "");
    ("Builtin_attributes", ""); ("Bytegen", ""); ("Bytelibrarian", "");
    ("Bytelink", ""); ("Bytepackager", ""); ("Bytesections", "");
    ("CSE", ""); ("CSEgen", ""); ("CamlinternalFormat", "");
    ("CamlinternalFormatBasics", ""); ("CamlinternalLazy", "");
    ("CamlinternalMenhirLib", ""); ("CamlinternalMod", "");
    ("CamlinternalOO", ""); ("Ccomp", ""); ("Clambda", "");
    ("Clambda_primitives", ""); ("Clflags", ""); ("Closure", "");
    ("Closure_conversion", ""); ("Closure_conversion_aux", "");
    ("Closure_element", ""); ("Closure_id", ""); ("Closure_middle_end", "");
    ("Closure_offsets", ""); ("Closure_origin", ""); ("Cmi_format", "");
    ("Cmm", ""); ("Cmm_helpers", ""); ("Cmm_invariants", ""); ("Cmmgen", "");
    ("Cmmgen_state", ""); ("Cmo_format", ""); ("Cmt2annot", "");
    ("Cmt_format", ""); ("Cmx_format", ""); ("Cmxs_format", "");
    ("Coloring", ""); ("Comballoc", ""); ("Compenv", "");
    ("Compilation_unit", ""); ("Compile", ""); ("Compile_common", "");
    ("Compilenv", ""); ("Compmisc", ""); ("Compression", ""); ("Config", "");
    ("Config_boot", ""); ("Config_main", ""); ("Consistbl", "");
    ("Continuation_already_taken", ""); ("Convert_primitives", "");
    ("Ctype", ""); ("Data_types", ""); ("Dataflow", ""); ("Datarepr", "");
    ("Deadcode", ""); ("Debuginfo", ""); ("Depend", ""); ("Diffing", "");
    ("Diffing_with_keys", ""); ("Division_by_zero", ""); ("Dll", "");
    ("Docstrings", ""); ("Domainstate", ""); ("Effect_analysis", "");
    ("Emit", ""); ("Emitaux", ""); ("Emitcode", ""); ("Emitenv", "");
    ("End_of_f"... (* string length 11; truncated *), ""); ("Env", "");
    ("Envaux", ""); ...])

This makes me wonder why the completion list in the end is not longer. Maybe there is some filtering done, but that fails to remove the “internal” modules ?

This probably because of the syntax for qualified field references:

x.Mod.f

This references the field f that is defined in module Mod. This syntax is useful to access a field with a shadowed name or when the type of the value has not been deduced and the bare field name is not in scope.

But why those modules precisely ? I tried to do open List before completing, and List does not appear in the completion popup. So it’s not because those modules are opened.