diff --git a/infer/src/IR/Pvar.ml b/infer/src/IR/Pvar.ml index 9b4b04297..50958607e 100644 --- a/infer/src/IR/Pvar.ml +++ b/infer/src/IR/Pvar.ml @@ -22,9 +22,12 @@ type pvar_kind = (** synthetic variable to represent return value *) | Abduced_ref_param of Typ.Procname.t * int * Location.t (** synthetic variable to represent param passed by reference *) - | Global_var of (translation_unit * bool * bool * bool * bool) - (** global variable: translation unit + is it compile constant? + is it POD? + is it a static - local? + is it a static global *) + | Global_var of + { translation_unit: translation_unit + ; is_constexpr: bool (* is it compile constant? *) + ; is_pod: bool + ; is_static_local: bool + ; is_static_global: bool } (** global variable *) | Seed_var (** variable used to store the initial value of formal parameters *) [@@deriving compare] @@ -74,9 +77,9 @@ let pp_ f pv = F.fprintf f "%a|abducedRetvar" Mangled.pp name | Abduced_ref_param (_, index, _) -> F.fprintf f "%a|abducedRefParam%d" Mangled.pp name index - | Global_var (translation_unit, is_const, is_pod, _, _) -> + | Global_var {translation_unit; is_constexpr; is_pod} -> F.fprintf f "#GB<%a%s%s>$%a" pp_translation_unit translation_unit - (if is_const then "|const" else "") + (if is_constexpr then "|const" else "") (if not is_pod then "|!pod" else "") Mangled.pp name | Seed_var -> @@ -128,7 +131,9 @@ let is_seed pv = match pv.pv_kind with Seed_var -> true | _ -> false (** Check if the pvar is a global var *) let is_global pv = match pv.pv_kind with Global_var _ -> true | _ -> false -let is_static_local pv = match pv.pv_kind with Global_var (_, _, _, true, _) -> true | _ -> false +let is_static_local pv = + match pv.pv_kind with Global_var {is_static_local} -> is_static_local | _ -> false + (** Check if a pvar is the special "this" var *) let is_this pvar = Mangled.is_this (get_name pvar) @@ -214,7 +219,7 @@ let mk_global ?(is_constexpr = false) ?(is_pod = true) ?(is_static_local = false ?(is_static_global = false) ?translation_unit (name : Mangled.t) : t = { pv_hash= name_hash name ; pv_name= name - ; pv_kind= Global_var (translation_unit, is_constexpr, is_pod, is_static_local, is_static_global) + ; pv_kind= Global_var {translation_unit; is_constexpr; is_pod; is_static_local; is_static_global} } @@ -238,24 +243,24 @@ let mk_abduced_ref_param (proc_name : Typ.Procname.t) (index : int) (loc : Locat let get_translation_unit pvar = match pvar.pv_kind with - | Global_var (tu, _, _, _, _) -> - tu + | Global_var {translation_unit} -> + translation_unit | _ -> L.(die InternalError) "Expected a global variable" let is_compile_constant pvar = - match pvar.pv_kind with Global_var (_, b, _, _, _) -> b | _ -> false + match pvar.pv_kind with Global_var {is_constexpr} -> is_constexpr | _ -> false -let is_pod pvar = match pvar.pv_kind with Global_var (_, _, b, _, _) -> b | _ -> true +let is_pod pvar = match pvar.pv_kind with Global_var {is_pod} -> is_pod | _ -> true let get_initializer_pname {pv_name; pv_kind} = match pv_kind with - | Global_var (translation, _, _, _, is_static_global) -> + | Global_var {translation_unit; is_static_global} -> let name = Config.clang_initializer_prefix ^ Mangled.to_string_full pv_name in if is_static_global then - match translation with + match translation_unit with | Some file -> let mangled = SourceFile.to_string file |> Utils.string_crc_hex32 in Typ.Procname.C