method vstmt s =
    self#incr_both_metrics (self#incr_slocs);
    begin
      match s.skind with
        | If _ ->
          (self#incr_both_metrics (self#incr_ifs);
           self#incr_both_metrics (self#incr_dpoints);)
        | Loop _ -> self#incr_both_metrics (self#incr_loops);
        | Goto _ -> self#incr_both_metrics (self#incr_gotos);
        | Return _ -> self#incr_both_metrics (self#incr_exits);
        | Switch (_, _, _slist, _) -> ()
        (* The catching block is one more possible flow alternative *)
        | TryFinally _
        | TryExcept _ -> self#incr_both_metrics (self#incr_dpoints);
        | _ -> ()
    end;
    (* Default cases are not path choice points, as normal labels.
       Non-default cases are ... just like if statements.
    *)

    let rec has_case_label labels =
      match labels with
        | (Case _) :: _->
          self#incr_both_metrics (self#incr_dpoints);
        | _ :: labels -> has_case_label labels
        | [] -> ()
    in has_case_label s.labels;
    Cil.DoChildren