{
   for (breakpoint *b : all_breakpoints ())
     if (b->number == num)
-      return b->loc != nullptr && b->loc->next != nullptr;
+      return b->has_multiple_locations ();
 
   return false;
 }
 add_dummy_location (struct breakpoint *b,
                    struct program_space *pspace)
 {
-  gdb_assert (b->loc == NULL);
+  gdb_assert (!b->has_locations ());
 
   b->loc = new bp_location (b, bp_loc_other);
   b->loc->pspace = pspace;
         above left it without any location set up.  But,
         bpstat_stop_status requires a location to be able to report
         stops, so make sure there's at least a dummy one.  */
-      if (b->type == bp_watchpoint && b->loc == NULL)
+      if (b->type == bp_watchpoint && !b->has_locations ())
        add_dummy_location (b, frame_pspace);
     }
   else if (!within_current_scope)
 
   for (breakpoint *b : all_breakpoints_safe ())
     {
-      if (b->loc && b->loc->pspace != pspace)
+      if (b->has_locations () && b->loc->pspace != pspace)
        continue;
 
       switch (b->type)
 
   int locno = 0;
 
-  if (b != nullptr && b->loc != nullptr && b->loc->next != nullptr)
+  if (b != nullptr && b->has_multiple_locations ())
     {
       const bp_location *bl_i;
 
 bpstat_should_step ()
 {
   for (breakpoint *b : all_breakpoints ())
-    if (breakpoint_enabled (b) && b->type == bp_watchpoint && b->loc != NULL)
+    if (breakpoint_enabled (b)
+       && b->type == bp_watchpoint
+       && b->has_locations ())
       return true;
 
   return false;
   /* See comment in print_one_breakpoint concerning treatment of
      breakpoints with single disabled location.  */
   if (loc == NULL 
-      && (b->loc != NULL 
-         && (b->loc->next != NULL
+      && (b->has_locations ()
+         && (b->has_multiple_locations ()
              || !b->loc->enabled || b->loc->disabled_by_cond)))
     header_of_multiple = true;
+
   if (loc == NULL)
     loc = b->loc;
 
              if (header_of_multiple)
                uiout->field_string ("addr", "<MULTIPLE>",
                                     metadata_style.style ());
-             else if (b->loc == NULL || loc->shlib_disabled)
+             else if (!b->has_locations () || loc->shlib_disabled)
                uiout->field_string ("addr", "<PENDING>",
                                     metadata_style.style ());
              else
          annotate_field (5);
          if (!header_of_multiple)
            print_breakpoint_location (b, loc);
-         if (b->loc)
+         if (b->has_locations ())
            *last_loc = b->loc;
        }
     }
          && (!is_catchpoint (b) || is_exception_catchpoint (b)
              || is_ada_exception_catchpoint (b))
          && (allflag
-             || (b->loc && (b->loc->next
-                            || !b->loc->enabled
-                            || b->loc->disabled_by_cond))))
+             || (b->has_locations ()
+                 && (b->has_multiple_locations ()
+                     || !b->loc->enabled
+                     || b->loc->disabled_by_cond))))
        {
          gdb::optional<ui_out_emit_list> locations_list;
 
 int
 pending_breakpoint_p (struct breakpoint *b)
 {
-  return b->loc == NULL;
+  return !b->has_locations ();
 }
 
 /* Print information on breakpoints (including watchpoints and tracepoints).
 
          function_name = loc->msymbol->linkage_name ();
 
-         if (b->type == bp_breakpoint && b->loc == loc
-             && loc->next == NULL && b->related_breakpoint == b)
+         if (b->type == bp_breakpoint
+             && b->has_single_location ()
+             && b->related_breakpoint == b)
            {
              /* Create only the whole new breakpoint of this type but do not
                 mess more complicated breakpoints with multiple locations.  */
 enum print_stop_action
 ranged_breakpoint::print_it (const bpstat *bs) const
 {
-  struct bp_location *bl = loc;
   struct ui_out *uiout = current_uiout;
 
   gdb_assert (type == bp_hardware_breakpoint);
 
   /* Ranged breakpoints have only one location.  */
-  gdb_assert (bl && bl->next == NULL);
+  gdb_assert (this->has_single_location ());
 
   annotate_breakpoint (number);
 
   struct ui_out *uiout = current_uiout;
 
   /* Ranged breakpoints have only one location.  */
-  gdb_assert (bl && bl->next == NULL);
+  gdb_assert (this->has_single_location ());
 
   get_user_print_options (&opts);
 
   struct ui_out *uiout = current_uiout;
 
   /* Masked watchpoints have only one location.  */
-  gdb_assert (this->loc && this->loc->next == nullptr);
+  gdb_assert (this->has_single_location ());
 
   annotate_watchpoint (this->number);
   maybe_print_thread_hit_breakpoint (uiout);
 masked_watchpoint::print_one_detail (struct ui_out *uiout) const
 {
   /* Masked watchpoints have only one location.  */
-  gdb_assert (loc && loc->next == NULL);
+  gdb_assert (this->has_single_location ());
 
   uiout->text ("\tmask ");
   uiout->field_core_addr ("mask", loc->gdbarch, hw_wp_mask);
 
   /* i18n: cagney/2005-02-11: Below needs to be merged into a
      single string.  */
-  if (loc == NULL)
+  if (!this->has_locations ())
     {
       /* For pending locations, the output differs slightly based
         on extra_string.  If this is non-NULL, it contains either
        {
          /* If there is a single location, we can print the location
             more nicely.  */
-         if (loc->next == NULL)
+         if (!this->has_multiple_locations ())
            {
              const char *filename
                = symtab_to_filename_for_display (loc->symtab);
            gdb_printf (": %s.", locspec->to_string ());
        }
 
-      if (loc->next)
+      if (this->has_multiple_locations ())
        {
          struct bp_location *iter = loc;
          int n = 0;
 
   /* Print out extra_string if this breakpoint is pending.  It might
      contain, for example, conditions that were set by the user.  */
-  if (loc == NULL && extra_string != NULL)
+  if (!this->has_locations () && extra_string != NULL)
     gdb_printf (fp, " %s", extra_string.get ());
 
   print_recreate_thread (fp);
         errors.  */
       if (e.error == NOT_FOUND_ERROR
          && (condition_not_parsed
-             || (loc != NULL
+             || (this->has_locations ()
                  && search_pspace != NULL
                  && loc->pspace != search_pspace)
-             || (loc && loc->shlib_disabled)
-             || (loc && loc->pspace->executing_startup)
+             || (this->has_locations () && loc->shlib_disabled)
+             || (this->has_locations () && loc->pspace->executing_startup)
              || enable_state == bp_disabled))
        not_found_and_ok = true;
 
       /* If this is a multi-location breakpoint, check if the locations
         should be individually disabled.  Watchpoint locations are
         special, and not user visible.  */
-      if (!is_watchpoint (tp) && tp->loc && tp->loc->next)
+      if (!is_watchpoint (tp) && tp->has_multiple_locations ())
        {
          int n = 1;