+2020-09-16  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * ada-lang.c (ada_language_data): Remove
+       la_struct_too_deep_ellipsis initializer.
+       (ada_language::struct_too_deep_ellipsis): New member function.
+       * c-lang.c (c_language_data): Remove la_struct_too_deep_ellipsis
+       initializer.
+       (cplus_language_data): Likewise.
+       (asm_language_data): Likewise.
+       (minimal_language_data): Likewise.
+       * cp-valprint.c (cp_print_value): Update call to
+       struct_too_deep_ellipsis.
+       * d-lang.c (d_language_data): Remove la_struct_too_deep_ellipsis
+       initializer.
+       * f-lang.c (f_language_data): Likewise.
+       (f_language::struct_too_deep_ellipsis): New member function.
+       * go-lang.c (go_language_data): Remove la_struct_too_deep_ellipsis
+       initializer.
+       * language.c (unknown_language_data): Likewise.
+       (auto_language_data): Likewise.
+       * language.h (language_data): Delete la_struct_too_deep_ellipsis
+       member variable.
+       (language_defn::struct_too_deep_ellipsis): New member function.
+       * m2-lang.c (m2_language_data): Remove la_struct_too_deep_ellipsis
+       initializer.Q
+       * objc-lang.c (objc_language_data): Likewise.
+       * opencl-lang.c (opencl_language_data): Likewise.
+       * p-lang.c (pascal_language_data): Likewise.
+       * rust-lang.c (rust_language_data): Likewise.
+       * valprint.c (val_print_check_max_depth): Update call to
+       struct_too_deep_ellipsis.
+
 2020-09-16  Felix Willgerodt  <felix.willgerodt@intel.com>
 
        * MAINTAINERS (Write After Approval): Add myself.
 
   0,                            /* c-style arrays */
   1,                            /* String lower bound */
   &ada_varobj_ops,
-  "(...)"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the Ada language.  */
     return ada_is_string_type (type);
   }
 
+  /* See language.h.  */
+
+  const char *struct_too_deep_ellipsis () const override
+  { return "(...)"; }
 
 protected:
   /* See language.h.  */
 
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
   &c_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the C language.  */
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
   &cplus_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* A class for the C++ language.  */
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
   &default_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* A class for the ASM language.  */
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
   &default_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* A class for the minimal language.  */
 
              && recurse >= options->max_depth)
            {
              const struct language_defn *language = current_language;
-             gdb_assert (language->la_struct_too_deep_ellipsis != NULL);
-             fputs_filtered (language->la_struct_too_deep_ellipsis, stream);
+             gdb_assert (language->struct_too_deep_ellipsis () != NULL);
+             fputs_filtered (language->struct_too_deep_ellipsis (), stream);
            }
          else
            {
 
   1,                           /* C-style arrays.  */
   0,                           /* String lower bound.  */
   &default_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the D language.  */
 
   0,                           /* arrays are first-class (not c-style) */
   1,                           /* String lower bound */
   &default_varobj_ops,
-  "(...)"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the Fortran language.  */
                && TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_CHAR));
   }
 
+  /* See language.h.  */
+
+  const char *struct_too_deep_ellipsis () const override
+  { return "(...)"; }
+
 protected:
 
   /* See language.h.  */
 
   1,                           /* C-style arrays.  */
   0,                           /* String lower bound.  */
   &default_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the Go language.  */
 
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
   &default_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the unknown language.  */
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
   &default_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the fake "auto" language.  */
 
 
     /* Various operations on varobj.  */
     const struct lang_varobj_ops *la_varobj_ops;
-
-    /* This string is used by the 'set print max-depth' setting.  When GDB
-       replaces a struct or union (during value printing) that is "too
-       deep" this string is displayed instead.  */
-    const char *la_struct_too_deep_ellipsis;
-
   };
 
 /* Base class from which all other language classes derive.  */
   /* Return true if TYPE is a string type.  */
   virtual bool is_string_type_p (struct type *type) const;
 
+  /* Return a string that is used by the 'set print max-depth' setting.
+     When GDB replaces a struct or union (during value printing) that is
+     "too deep" this string is displayed instead.  The default value here
+     suits most languages.  If overriding then the string here should
+     ideally be similar in style to the default; an opener, three '.', and
+     a closer.  */
+
+  virtual const char *struct_too_deep_ellipsis () const
+  { return "{...}"; }
+
 protected:
 
   /* This is the overridable part of the GET_SYMBOL_NAME_MATCHER method.
 
   0,                           /* arrays are first-class (not c-style) */
   0,                           /* String lower bound */
   &default_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the M2 language.  */
 
   1,                           /* C-style arrays */
   0,                           /* String lower bound */
   &default_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the Objective-C language.  */
 
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
   &default_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the OpenCL language.  */
 
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
   &default_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the Pascal language.  */
 
   1,                           /* c-style arrays */
   0,                           /* String lower bound */
   &default_varobj_ops,
-  "{...}"                      /* la_struct_too_deep_ellipsis */
 };
 
 /* Class representing the Rust language.  */
 
 {
   if (options->max_depth > -1 && recurse >= options->max_depth)
     {
-      gdb_assert (language->la_struct_too_deep_ellipsis != NULL);
-      fputs_filtered (language->la_struct_too_deep_ellipsis, stream);
+      gdb_assert (language->struct_too_deep_ellipsis () != NULL);
+      fputs_filtered (language->struct_too_deep_ellipsis (), stream);
       return true;
     }