changeset 31855:1daf8bfceac3

default or disable more ctors, dtors, and assignment ops In most classes in liboctave and libinterp (except for the files in octave-value subdirectory) that had at least one of the following functions defined default constructor copy constructor copy assignment operator destructor declare all of them. In most cases, this means declaring default or deleted functions. In some cases, explicit definitions have been replaced by equivalent default functions. In some cases, default or deleted move constructors and move assignment operators have also been declared. Files affected: __magick_read__.cc, c-file-ptr-stream.h, dynamic-ld.h, environment.h, error.h, event-manager.h, fcn-info.h, genprops.awk, gl-render.cc, gl-render.h, gl2ps-print.cc, graphics-toolkit.h, graphics.cc, graphics.in.h, gtk-manager.h, hook-fcn.h, input.h, interpreter.cc, latex-text-renderer.cc, load-path.h, load-save.h, ls-hdf5.h, mex.cc, mxarray.h, oct-errno.h, oct-fstrm.h, oct-hist.h, oct-iostrm.h, oct-map.h, oct-prcstrm.h, oct-process.h, oct-stdstrm.h, oct-stream.cc, oct-stream.h, oct-strstrm.h, pager.h, procstream.h, symrec.h, symtab.h, text-engine.h, text-renderer.h, utils.h, __init_fltk__.cc, __init_gnuplot__.cc, __ode15__.cc, audiodevinfo.cc, octave.h, anon-fcn-validator.h, bp-table.h, comment-list.h, lex.h, oct-lvalue.h, oct-parse.yy, parse.h, profiler.h, pt-args-block.h, pt-binop.h, pt-bp.h, pt-cbinop.h, pt-classdef.h, pt-cmd.h, pt-decl.h, pt-eval.h, pt-id.h, pt-misc.h, pt-spmd.h, token.h, Array-base.cc, CColVector.h, CNDArray.h, CRowVector.h, CSparse.h, Range.h, boolNDArray.h, boolSparse.h, chNDArray.h, dColVector.h, dNDArray.h, dRowVector.h, dSparse.h, fCColVector.h, fCNDArray.h, fCRowVector.h, fColVector.h, fNDArray.h, fRowVector.h, idx-vector.h, DASPK.h, DASRT.h, DASSL.h, DET.h, LSODE.h, Quad.h, chol.h, oct-fftw.h, oct-norm.cc, oct-rand.h, sparse-qr.cc, svd.cc, child-list.h, file-stat.h, oct-env.h, oct-group.h, oct-time.h, action-container.h, cmd-edit.cc, cmd-hist.cc, kpse.h, lo-array-errwarn.h, lo-regexp.h, oct-mutex.cc, oct-mutex.h, oct-refcount.h, oct-shlib.cc, oct-shlib.h, oct-string.h, octave-preserve-stream-state.h, quit.h, unwind-prot.h, and octave-svgconvert.cc.
author John W. Eaton <jwe@octave.org>
date Fri, 17 Feb 2023 23:27:46 -0500
parents 8c37bbe334d4
children c80cf1588ed0
files libinterp/corefcn/__magick_read__.cc libinterp/corefcn/c-file-ptr-stream.h libinterp/corefcn/dynamic-ld.h libinterp/corefcn/environment.h libinterp/corefcn/error.h libinterp/corefcn/event-manager.h libinterp/corefcn/fcn-info.h libinterp/corefcn/genprops.awk libinterp/corefcn/gl-render.cc libinterp/corefcn/gl-render.h libinterp/corefcn/gl2ps-print.cc libinterp/corefcn/graphics-toolkit.h libinterp/corefcn/graphics.cc libinterp/corefcn/graphics.in.h libinterp/corefcn/gtk-manager.h libinterp/corefcn/hook-fcn.h libinterp/corefcn/input.h libinterp/corefcn/interpreter.cc libinterp/corefcn/latex-text-renderer.cc libinterp/corefcn/load-path.h libinterp/corefcn/load-save.h libinterp/corefcn/ls-hdf5.h libinterp/corefcn/mex.cc libinterp/corefcn/mxarray.h libinterp/corefcn/oct-errno.h libinterp/corefcn/oct-fstrm.h libinterp/corefcn/oct-hist.h libinterp/corefcn/oct-iostrm.h libinterp/corefcn/oct-map.h libinterp/corefcn/oct-prcstrm.h libinterp/corefcn/oct-process.h libinterp/corefcn/oct-stdstrm.h libinterp/corefcn/oct-stream.cc libinterp/corefcn/oct-stream.h libinterp/corefcn/oct-strstrm.h libinterp/corefcn/pager.h libinterp/corefcn/procstream.h libinterp/corefcn/symrec.h libinterp/corefcn/symtab.h libinterp/corefcn/text-engine.h libinterp/corefcn/text-renderer.h libinterp/corefcn/utils.h libinterp/dldfcn/__init_fltk__.cc libinterp/dldfcn/__init_gnuplot__.cc libinterp/dldfcn/__ode15__.cc libinterp/dldfcn/audiodevinfo.cc libinterp/octave.h libinterp/parse-tree/anon-fcn-validator.h libinterp/parse-tree/bp-table.h libinterp/parse-tree/comment-list.h libinterp/parse-tree/lex.h libinterp/parse-tree/oct-lvalue.h libinterp/parse-tree/oct-parse.yy libinterp/parse-tree/parse.h libinterp/parse-tree/profiler.h libinterp/parse-tree/pt-args-block.h libinterp/parse-tree/pt-binop.h libinterp/parse-tree/pt-bp.h libinterp/parse-tree/pt-cbinop.h libinterp/parse-tree/pt-classdef.h libinterp/parse-tree/pt-cmd.h libinterp/parse-tree/pt-decl.h libinterp/parse-tree/pt-eval.h libinterp/parse-tree/pt-id.h libinterp/parse-tree/pt-misc.h libinterp/parse-tree/pt-spmd.h libinterp/parse-tree/token.h liboctave/array/Array-base.cc liboctave/array/CColVector.h liboctave/array/CNDArray.h liboctave/array/CRowVector.h liboctave/array/CSparse.h liboctave/array/Range.h liboctave/array/boolNDArray.h liboctave/array/boolSparse.h liboctave/array/chNDArray.h liboctave/array/dColVector.h liboctave/array/dNDArray.h liboctave/array/dRowVector.h liboctave/array/dSparse.h liboctave/array/fCColVector.h liboctave/array/fCNDArray.h liboctave/array/fCRowVector.h liboctave/array/fColVector.h liboctave/array/fNDArray.h liboctave/array/fRowVector.h liboctave/array/idx-vector.h liboctave/numeric/DASPK.h liboctave/numeric/DASRT.h liboctave/numeric/DASSL.h liboctave/numeric/DET.h liboctave/numeric/LSODE.h liboctave/numeric/Quad.h liboctave/numeric/chol.h liboctave/numeric/oct-fftw.h liboctave/numeric/oct-norm.cc liboctave/numeric/oct-rand.h liboctave/numeric/sparse-qr.cc liboctave/numeric/svd.cc liboctave/system/child-list.h liboctave/system/file-stat.h liboctave/system/oct-env.h liboctave/system/oct-group.h liboctave/system/oct-time.h liboctave/util/action-container.h liboctave/util/cmd-edit.cc liboctave/util/cmd-hist.cc liboctave/util/kpse.h liboctave/util/lo-array-errwarn.h liboctave/util/lo-regexp.h liboctave/util/oct-mutex.cc liboctave/util/oct-mutex.h liboctave/util/oct-refcount.h liboctave/util/oct-shlib.cc liboctave/util/oct-shlib.h liboctave/util/oct-string.h liboctave/util/octave-preserve-stream-state.h liboctave/util/quit.h liboctave/util/unwind-prot.h src/octave-svgconvert.cc
diffstat 120 files changed, 627 insertions(+), 579 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/__magick_read__.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/__magick_read__.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -181,6 +181,8 @@
 {
 public:
 
+  image_region () = delete;
+
   image_region (const octave_scalar_map& options)
   {
     // FIXME: should we have better checking on the input map and values
@@ -208,15 +210,7 @@
     m_col_out = cols.numel ();
   }
 
-  // Default copy, move, and delete methods are all OK for this class.
-
-  image_region (const image_region&) = default;
-  image_region (image_region&&) = default;
-
-  image_region& operator = (const image_region&) = default;
-  image_region& operator = (image_region&&) = default;
-
-  ~image_region () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (image_region)
 
   octave_idx_type row_start () const { return m_row_start; }
   octave_idx_type col_start () const { return m_col_start; }
--- a/libinterp/corefcn/c-file-ptr-stream.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/c-file-ptr-stream.h	Fri Feb 17 23:27:46 2023 -0500
@@ -48,6 +48,8 @@
 
   FILE * stdiofile () { return m_f; }
 
+  c_file_ptr_buf () = delete;
+
   c_file_ptr_buf (FILE *f, close_fcn cf = file_close)
     : std::streambuf (), m_f (f), m_cf (cf)
   { }
@@ -109,6 +111,8 @@
 {
 public:
 
+  c_file_ptr_stream () = delete;
+
   c_file_ptr_stream (FILE_T m_f,
                      typename BUF_T::close_fcn m_cf = BUF_T::file_close)
     : STREAM_T (nullptr), m_buf (new BUF_T (m_f, m_cf))
@@ -155,6 +159,8 @@
 
   gzFile stdiofile () { return m_f; }
 
+  c_zfile_ptr_buf () = delete;
+
   c_zfile_ptr_buf (gzFile f, close_fcn cf = file_close)
     : std::streambuf (), m_f (f), m_cf (cf)
   { }
--- a/libinterp/corefcn/dynamic-ld.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/dynamic-ld.h	Fri Feb 17 23:27:46 2023 -0500
@@ -75,6 +75,8 @@
 
 public:
 
+  dynamic_loader () = delete;
+
   dynamic_loader (interpreter& interp)
     : m_interpreter (interp), m_loaded_shlibs (), m_doing_load (false)
   { }
--- a/libinterp/corefcn/environment.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/environment.h	Fri Feb 17 23:27:46 2023 -0500
@@ -45,6 +45,8 @@
       m_image_path (init_image_path ())
   { }
 
+  OCTAVE_DEFAULT_COPY_DELETE (environment)
+
   octave_value editor (const octave_value_list& args, int nargout);
 
   std::string editor () const { return m_editor; }
--- a/libinterp/corefcn/error.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/error.h	Fri Feb 17 23:27:46 2023 -0500
@@ -48,7 +48,7 @@
 
   OCTINTERP_API error_system (interpreter& interp);
 
-  OCTAVE_DISABLE_COPY_MOVE (error_system)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (error_system)
 
   ~error_system () = default;
 
--- a/libinterp/corefcn/event-manager.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/event-manager.h	Fri Feb 17 23:27:46 2023 -0500
@@ -296,7 +296,7 @@
 
   OCTINTERP_API event_manager (interpreter& interp);
 
-  OCTAVE_DISABLE_COPY_MOVE (event_manager)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (event_manager)
 
   virtual ~event_manager ();
 
--- a/libinterp/corefcn/fcn-info.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/fcn-info.h	Fri Feb 17 23:27:46 2023 -0500
@@ -68,7 +68,7 @@
         }
     }
 
-    OCTAVE_DISABLE_COPY_MOVE (fcn_info_rep)
+    OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (fcn_info_rep)
 
     ~fcn_info_rep () = default;
 
--- a/libinterp/corefcn/genprops.awk	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/genprops.awk	Fri Feb 17 23:27:46 2023 -0500
@@ -283,7 +283,9 @@
 {
   printf ("public:\n");
   printf ("  properties (const graphics_handle& mh, const graphics_handle& p);\n\n");
-  printf ("  ~properties () { }\n\n");
+  printf ("  properties () = delete;\n\n");
+  printf ("  OCTAVE_DEFAULT_COPY_MOVE (properties)\n\n");
+  printf ("  ~properties () = default;\n\n");
   printf ("  void set (const caseless_str& pname, const octave_value& val);\n\n");
   printf ("  octave_value get (bool all = false) const;\n\n");
   printf ("  octave_value get (const caseless_str& pname) const;\n\n");
--- a/libinterp/corefcn/gl-render.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/gl-render.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -114,6 +114,8 @@
         m_tx (double(m_w)/m_tw), m_ty (double(m_h)/m_th), m_valid (true)
     { }
 
+    OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (texture_rep)
+
     ~texture_rep ()
     {
       if (m_valid)
@@ -142,6 +144,8 @@
 
 public:
 
+  opengl_texture () = delete;
+
   opengl_texture (opengl_functions& glfcns)
     : m_rep (new texture_rep (glfcns))
   { }
@@ -151,11 +155,7 @@
     : m_rep (new texture_rep (glfcns, id, w, h, tw, th))
   { }
 
-  opengl_texture (const opengl_texture&) = default;
-
-  ~opengl_texture () = default;
-
-  opengl_texture& operator = (const opengl_texture&) = default;
+  OCTAVE_DEFAULT_COPY_DELETE (opengl_texture)
 
   static opengl_texture create (opengl_functions& glfcns,
                                 const octave_value& data);
@@ -461,6 +461,10 @@
         m_specular (ss), m_specular_exp (se), m_specular_color_refl (scr)
     { }
 
+    OCTAVE_DEFAULT_COPY (vertex_data_rep)
+
+    ~vertex_data_rep () = default;
+
     Matrix m_coords;
     Matrix m_color;
     Matrix m_vertex_normal;
@@ -516,7 +520,9 @@
       m_index (idx), m_first (true), m_tmp_vdata ()
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (patch_tessellator)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (patch_tessellator)
+
+  ~patch_tessellator () = default;
 
 protected:
   void begin (GLenum type)
@@ -656,6 +662,8 @@
 
 private:
 
+  // FIXME: We don't own this object; should it be a shared/weak/unique
+  // pointer?  Managed some other way?
   opengl_renderer *m_renderer;
   int m_color_mode;
   int m_light_mode;
--- a/libinterp/corefcn/gl-render.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/gl-render.h	Fri Feb 17 23:27:46 2023 -0500
@@ -43,7 +43,7 @@
 
   opengl_renderer (opengl_functions& glfcns);
 
-  OCTAVE_DISABLE_COPY_MOVE (opengl_renderer)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (opengl_renderer)
 
   virtual ~opengl_renderer () = default;
 
--- a/libinterp/corefcn/gl2ps-print.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/gl2ps-print.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -69,6 +69,8 @@
       m_fontname (), m_buffer_overflow (false), m_svg_def_index (0)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (gl2ps_renderer)
+
   ~gl2ps_renderer () = default;
 
   // FIXME: should we import the functions from the base class and
--- a/libinterp/corefcn/graphics-toolkit.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/graphics-toolkit.h	Fri Feb 17 23:27:46 2023 -0500
@@ -55,6 +55,8 @@
     : m_name (nm)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (base_graphics_toolkit)
+
   virtual ~base_graphics_toolkit () = default;
 
   std::string get_name () const
--- a/libinterp/corefcn/graphics.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/graphics.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -11600,6 +11600,10 @@
     : base_graphics_event (busyaction), m_handle (h), m_callback_name (),
       m_callback (cb), m_callback_data (data) { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (callback_event)
+
+  ~callback_event () = default;
+
   void execute ()
   {
     gh_manager& gh_mgr = octave::__get_gh_manager__ ();
@@ -11611,12 +11615,6 @@
   }
 
 private:
-  callback_event ()
-    : base_graphics_event (), m_handle (), m_callback_name (),
-      m_callback_data ()
-  { }
-
-private:
   graphics_handle m_handle;
   std::string m_callback_name;
   octave_value m_callback;
@@ -11632,6 +11630,10 @@
     : base_graphics_event (busyaction), m_handle (h), m_mcode (cmd)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (mcode_event)
+
+  ~mcode_event () = default;
+
   void execute ()
   {
     if (! m_mcode.empty ())
@@ -11649,11 +11651,6 @@
   }
 
 private:
-  mcode_event ()
-    : base_graphics_event (), m_handle (), m_mcode ()
-  { }
-
-private:
   graphics_handle m_handle;
   std::string m_mcode;
 };
@@ -11663,15 +11660,13 @@
 {
 public:
 
-  // function_event objects must be created with at least a function.
-
-  function_event () = delete;
-
   function_event (graphics_event::event_fcn fcn, void *data = nullptr)
     : base_graphics_event (), m_function (fcn), m_function_data (data)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (function_event)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (function_event)
+
+  ~function_event () = default;
 
   void execute ()
   {
@@ -11697,6 +11692,10 @@
       m_redraw_figure (redraw_figure)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (set_event)
+
+  ~set_event () = default;
+
   void execute ()
   {
     gh_manager& gh_mgr = octave::__get_gh_manager__ ();
@@ -11749,11 +11748,6 @@
   }
 
 private:
-  set_event ()
-    : base_graphics_event (), m_handle (), m_property_name (), m_property_value ()
-  { }
-
-private:
   graphics_handle m_handle;
   std::string m_property_name;
   octave_value m_property_value;
--- a/libinterp/corefcn/graphics.in.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/graphics.in.h	Fri Feb 17 23:27:46 2023 -0500
@@ -66,7 +66,8 @@
 class OCTINTERP_API base_scaler
 {
 public:
-  base_scaler () { }
+
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE (base_scaler)
 
   virtual ~base_scaler () = default;
 
@@ -100,7 +101,8 @@
 class lin_scaler : public base_scaler
 {
 public:
-  lin_scaler () { }
+
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (lin_scaler)
 
   Matrix scale (const Matrix& m) const { return m; }
 
@@ -118,7 +120,8 @@
 class log_scaler : public base_scaler
 {
 public:
-  log_scaler () { }
+
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (log_scaler)
 
   Matrix scale (const Matrix& m) const
   {
@@ -158,7 +161,8 @@
 class OCTINTERP_API neg_log_scaler : public base_scaler
 {
 public:
-  neg_log_scaler () { }
+
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (neg_log_scaler)
 
   Matrix scale (const Matrix& m) const
   {
@@ -198,6 +202,7 @@
 class OCTINTERP_API scaler
 {
 public:
+
   scaler () : m_rep (new base_scaler ()) { }
 
   scaler (const scaler& s) : m_rep (s.m_rep->clone ()) { }
@@ -301,6 +306,9 @@
       m_hidden (p.m_hidden), m_listeners ()
   { }
 
+  // FIXME: should we define assignment?
+  base_property& operator = (const base_property&) = delete;
+
   virtual ~base_property () = default;
 
   bool ok () const { return m_parent.ok (); }
@@ -438,12 +446,19 @@
 class OCTINTERP_API string_property : public base_property
 {
 public:
+
+  string_property () = delete;
+
   string_property (const std::string& s, const graphics_handle& h,
                    const std::string& val = "")
     : base_property (s, h), m_str (val) { }
 
-  string_property (const string_property& p)
-    : base_property (p), m_str (p.m_str) { }
+  string_property (const string_property&) = default;
+
+  // FIXME: should we define assignment?
+  string_property& operator = (const string_property&) = delete;
+
+  ~string_property () = default;
 
   octave_value get () const
   { return octave_value (m_str); }
@@ -486,6 +501,8 @@
 public:
   enum desired_enum { string_t, cell_t };
 
+  string_array_property () = delete;
+
   string_array_property (const std::string& s, const graphics_handle& h,
                          const std::string& val = "", const char& sep = '|',
                          const desired_enum& typ = string_t)
@@ -526,9 +543,12 @@
     m_str = strings;
   }
 
-  string_array_property (const string_array_property& p)
-    : base_property (p), m_desired_type (p.m_desired_type),
-      m_separator (p.m_separator), m_str (p.m_str) { }
+  string_array_property (const string_array_property&) = default;
+
+  // FIXME: should we define assignment?
+  string_array_property& operator = (const string_array_property&) = delete;
+
+  ~string_array_property () = default;
 
   octave_value get () const
   {
@@ -686,6 +706,8 @@
 public:
   enum type { char_t, cellstr_t };
 
+  text_label_property () = delete;
+
   text_label_property (const std::string& s, const graphics_handle& h,
                        const std::string& val = "")
     : base_property (s, h), m_value (val), m_stored_type (char_t)
@@ -732,9 +754,12 @@
       }
   }
 
-  text_label_property (const text_label_property& p)
-    : base_property (p), m_value (p.m_value), m_stored_type (p.m_stored_type)
-  { }
+  text_label_property (const text_label_property&) = default;
+
+  // FIXME: should we define assignment?
+  text_label_property& operator = (const text_label_property&) = delete;
+
+  ~text_label_property () = default;
 
   bool empty () const
   {
@@ -848,19 +873,7 @@
 public:
   OCTINTERP_API radio_values (const std::string& opt_string = "");
 
-  radio_values (const radio_values& a)
-    : m_default_val (a.m_default_val), m_possible_vals (a.m_possible_vals) { }
-
-  radio_values& operator = (const radio_values& a)
-  {
-    if (&a != this)
-      {
-        m_default_val = a.m_default_val;
-        m_possible_vals = a.m_possible_vals;
-      }
-
-    return *this;
-  }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (radio_values)
 
   std::string default_value () const { return m_default_val; }
 
@@ -928,6 +941,9 @@
 class OCTINTERP_API radio_property : public base_property
 {
 public:
+
+  radio_property () = delete;
+
   radio_property (const std::string& nm, const graphics_handle& h,
                   const radio_values& v = radio_values ())
     : base_property (nm, h),
@@ -943,8 +959,7 @@
     : base_property (nm, h),
       m_vals (v), m_current_val (def) { }
 
-  radio_property (const radio_property& p)
-    : base_property (p), m_vals (p.m_vals), m_current_val (p.m_current_val) { }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (radio_property)
 
   octave_value get () const { return octave_value (m_current_val); }
 
@@ -1023,17 +1038,7 @@
       error ("invalid color specification: %s", str.c_str ());
   }
 
-  color_values (const color_values& c)
-    : m_rgb (c.m_rgb)
-  { }
-
-  color_values& operator = (const color_values& c)
-  {
-    if (&c != this)
-      m_rgb = c.m_rgb;
-
-    return *this;
-  }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (color_values)
 
   bool operator == (const color_values& c) const
   {
@@ -1067,6 +1072,9 @@
 class OCTINTERP_API color_property : public base_property
 {
 public:
+
+  color_property () = delete;
+
   color_property (const color_values& c, const radio_values& v)
     : base_property ("", graphics_handle ()),
       m_current_type (color_t), m_color_val (c), m_radio_val (v),
@@ -1108,10 +1116,7 @@
       m_radio_val (v.m_radio_val), m_current_val (v.m_current_val)
   { }
 
-  color_property (const color_property& p)
-    : base_property (p), m_current_type (p.m_current_type),
-      m_color_val (p.m_color_val), m_radio_val (p.m_radio_val),
-      m_current_val (p.m_current_val) { }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (color_property)
 
   octave_value get () const
   {
@@ -1182,6 +1187,9 @@
 class OCTINTERP_API double_property : public base_property
 {
 public:
+
+  double_property () = delete;
+
   double_property (const std::string& nm, const graphics_handle& h,
                    double d = 0)
     : base_property (nm, h),
@@ -1195,6 +1203,11 @@
       m_minval (std::pair<double, bool> (octave_NaN, true)),
       m_maxval (std::pair<double, bool> (octave_NaN, true)) { }
 
+  // FIXME: should we define assignment?
+  double_property& operator = (const double_property&) = delete;
+
+  ~double_property () = default;
+
   octave_value get () const { return octave_value (m_current_val); }
 
   double double_value () const { return m_current_val; }
@@ -1294,6 +1307,9 @@
 class OCTINTERP_API double_radio_property : public base_property
 {
 public:
+
+  double_radio_property () = delete;
+
   double_radio_property (double d, const radio_values& v)
     : base_property ("", graphics_handle ()),
       m_current_type (double_t), m_dval (d), m_radio_val (v),
@@ -1314,10 +1330,7 @@
       m_radio_val (v.m_radio_val), m_current_val (v.m_current_val)
   { }
 
-  double_radio_property (const double_radio_property& p)
-    : base_property (p), m_current_type (p.m_current_type),
-      m_dval (p.m_dval), m_radio_val (p.m_radio_val),
-      m_current_val (p.m_current_val) { }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (double_radio_property)
 
   octave_value get () const
   {
@@ -1412,6 +1425,11 @@
       m_maxval (std::pair<double, bool> (octave_NaN, true))
   { }
 
+  // FIXME: Should we define assignment?
+  array_property& operator = (const array_property&) = delete;
+
+  ~array_property () = default;
+
   octave_value get () const { return m_data; }
 
   void add_constraint (const std::string& type)
@@ -1511,6 +1529,9 @@
 class OCTINTERP_API row_vector_property : public array_property
 {
 public:
+
+  row_vector_property () = delete;
+
   row_vector_property (const std::string& nm, const graphics_handle& h,
                        const octave_value& m)
     : array_property (nm, h, m)
@@ -1528,6 +1549,11 @@
     add_constraint (dim_vector (0, 0));
   }
 
+  // FIXME: should we define assignment?
+  row_vector_property& operator = (const row_vector_property&) = delete;
+
+  ~row_vector_property () = default;
+
   void add_constraint (const std::string& type)
   {
     array_property::add_constraint (type);
@@ -1605,6 +1631,9 @@
 class OCTINTERP_API bool_property : public radio_property
 {
 public:
+
+  bool_property () = delete;
+
   bool_property (const std::string& nm, const graphics_handle& h,
                  bool val)
     : radio_property (nm, h, radio_values (val ? "{on}|off" : "on|{off}"))
@@ -1616,8 +1645,7 @@
                                            "{on}|off" : "on|{off}"), val)
   { }
 
-  bool_property (const bool_property& p)
-    : radio_property (p) { }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (bool_property)
 
   bool is_on () const { return is ("on"); }
 
@@ -1644,13 +1672,20 @@
 class OCTINTERP_API handle_property : public base_property
 {
 public:
+
+  handle_property () = delete;
+
   handle_property (const std::string& nm, const graphics_handle& h,
                    const graphics_handle& val = graphics_handle ())
     : base_property (nm, h),
       m_current_val (val) { }
 
-  handle_property (const handle_property& p)
-    : base_property (p), m_current_val (p.m_current_val) { }
+  handle_property (const handle_property&) = default;
+
+  // FIXME: should we define assignment?
+  handle_property& operator = (const handle_property&) = delete;
+
+  ~handle_property () = default;
 
   octave_value get () const { return m_current_val.as_octave_value (); }
 
@@ -1689,12 +1724,19 @@
 class OCTINTERP_API any_property : public base_property
 {
 public:
+
+  any_property () = delete;
+
   any_property (const std::string& nm, const graphics_handle& h,
                 const octave_value& m = Matrix ())
     : base_property (nm, h), m_data (m) { }
 
-  any_property (const any_property& p)
-    : base_property (p), m_data (p.m_data) { }
+  any_property (const any_property&) = default;
+
+  // FIXME: should we define assignment?
+  any_property& operator = (const any_property&) = default;
+
+  ~any_property () = default;
 
   octave_value get () const { return m_data; }
 
@@ -1747,6 +1789,11 @@
     return *this;
   }
 
+  // FIXME: should we define assignment?
+  children_property& operator = (const children_property&) = delete;
+
+  ~children_property () = default;
+
   base_property * clone () const { return new children_property (*this); }
 
   bool remove_child (double val)
@@ -1914,12 +1961,19 @@
 class OCTINTERP_API callback_property : public base_property
 {
 public:
+
+  callback_property () = delete;
+
   callback_property (const std::string& nm, const graphics_handle& h,
                      const octave_value& m)
     : base_property (nm, h), m_callback (m) { }
 
-  callback_property (const callback_property& p)
-    : base_property (p), m_callback (p.m_callback) { }
+  callback_property (const callback_property&) = default;
+
+  // FIXME: should we define assignment?
+  callback_property& operator = (const callback_property&) = delete;
+
+  ~callback_property () = default;
 
   octave_value get () const { return m_callback; }
 
@@ -2143,7 +2197,7 @@
   property_list (const plist_map_type& m = plist_map_type ())
     : m_plist_map (m) { }
 
-  ~property_list () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (property_list)
 
   OCTINTERP_API void set (const caseless_str& name, const octave_value& val);
 
@@ -2184,6 +2238,8 @@
                    const graphics_handle& mh = graphics_handle (),
                    const graphics_handle& p = graphics_handle ());
 
+  OCTAVE_DEFAULT_COPY_MOVE (base_properties)
+
   virtual ~base_properties () = default;
 
   virtual std::string graphics_object_name () const { return "unknown"; }
@@ -2984,10 +3040,10 @@
 
 public:
 
+  OCTAVE_DISABLE_COPY_MOVE (root_figure)
+
   ~root_figure () = default;
 
-  OCTAVE_DISABLE_COPY_MOVE (root_figure)
-
   void mark_modified () { }
 
   void override_defaults (base_graphics_object& obj)
@@ -3285,10 +3341,13 @@
   properties m_properties;
 
 public:
+
   figure (const graphics_handle& mh, const graphics_handle& p)
     : base_graphics_object (), m_properties (mh, p), m_default_properties ()
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (figure)
+
   ~figure () = default;
 
   void override_defaults (base_graphics_object& obj)
@@ -4324,6 +4383,8 @@
     m_properties.update_transform ();
   }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (axes)
+
   ~axes () = default;
 
   void override_defaults (base_graphics_object& obj)
@@ -4475,6 +4536,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (line)
+
   ~line () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -4670,6 +4733,8 @@
     m_properties.set_clipping ("off");
   }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (text)
+
   ~text () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -4885,6 +4950,8 @@
     m_properties.initialize_data ();
   }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (image)
+
   ~image () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -4938,6 +5005,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (light)
+
   ~light () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -5208,6 +5277,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (patch)
+
   ~patch () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -5444,6 +5515,8 @@
     // object is added to the axes.
   }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (scatter)
+
   ~scatter () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -5658,6 +5731,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (surface)
+
   ~surface () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -5729,6 +5804,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (hggroup)
+
   ~hggroup () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -5834,6 +5911,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (uimenu)
+
   ~uimenu () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -5907,6 +5986,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (uicontextmenu)
+
   ~uicontextmenu () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -6020,6 +6101,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (uicontrol)
+
   ~uicontrol () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -6120,6 +6203,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (uibuttongroup)
+
   ~uibuttongroup () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -6205,6 +6290,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (uipanel)
+
   ~uipanel () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -6314,7 +6401,9 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
-  ~uitable () { }
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (uitable)
+
+  ~uitable () = default;
 
   base_properties& get_properties () { return m_properties; }
 
@@ -6363,6 +6452,8 @@
     : base_graphics_object (), m_properties (mh, p), m_default_properties ()
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (uitoolbar)
+
   ~uitoolbar () = default;
 
   void override_defaults (base_graphics_object& obj)
@@ -6479,6 +6570,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (uipushtool)
+
   ~uipushtool () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -6545,6 +6638,8 @@
     : base_graphics_object (), m_properties (mh, p)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (uitoggletool)
+
   ~uitoggletool () = default;
 
   base_properties& get_properties () { return m_properties; }
@@ -6593,6 +6688,8 @@
     : m_busyaction (busyaction)
   { };
 
+  OCTAVE_DEFAULT_COPY_MOVE (base_graphics_event)
+
   virtual ~base_graphics_event () = default;
 
   int get_busyaction () { return m_busyaction; };
--- a/libinterp/corefcn/gtk-manager.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/gtk-manager.h	Fri Feb 17 23:27:46 2023 -0500
@@ -45,6 +45,8 @@
 
   gtk_manager (interpreter& interp) : m_interpreter (interp) { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (gtk_manager)
+
   ~gtk_manager ()
   {
     unload_all_toolkits ();
--- a/libinterp/corefcn/hook-fcn.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/hook-fcn.h	Fri Feb 17 23:27:46 2023 -0500
@@ -42,9 +42,7 @@
 {
 public:
 
-  base_hook_function () = default;
-
-  base_hook_function (const base_hook_function&) = default;
+  OCTAVE_DEFAULT_CONSTRUCT_COPY (base_hook_function)
 
   virtual ~base_hook_function () = default;
 
@@ -70,11 +68,9 @@
   hook_function (const octave_value& f,
                  const octave_value& d = octave_value ());
 
-  ~hook_function () = default;
+  OCTAVE_DEFAULT_COPY (hook_function)
 
-  hook_function (const hook_function& hf) = default;
-
-  hook_function& operator = (const hook_function& hf) = default;
+  ~hook_function () = default;
 
   std::string id () const { return m_rep->id (); }
 
@@ -94,10 +90,14 @@
 {
 public:
 
+  named_hook_function () = delete;
+
   named_hook_function (const std::string& n, const octave_value& d)
     : m_name (n), m_data (d)
   { }
 
+  OCTAVE_DEFAULT_COPY_DELETE (named_hook_function)
+
   void eval (const octave_value_list& initial_args);
 
   std::string id () const { return m_name; }
@@ -115,6 +115,8 @@
 {
 public:
 
+  fcn_handle_hook_function () = delete;
+
   fcn_handle_hook_function (const octave_value& fh_arg, const octave_value& d)
     : m_ident (), m_valid (false), m_fcn_handle (fh_arg), m_data (d)
   {
@@ -130,6 +132,8 @@
       }
   }
 
+  OCTAVE_DEFAULT_COPY_DELETE (fcn_handle_hook_function)
+
   void eval (const octave_value_list& initial_args);
 
   std::string id () const { return m_ident; }
@@ -156,13 +160,7 @@
   typedef map_type::iterator iterator;
   typedef map_type::const_iterator const_iterator;
 
-  hook_function_list () = default;
-
-  ~hook_function_list () = default;
-
-  hook_function_list (const hook_function_list& lst) = default;
-
-  hook_function_list& operator = (const hook_function_list& lst) = default;
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_DELETE (hook_function_list)
 
   bool empty () const { return m_fcn_map.empty (); }
 
--- a/libinterp/corefcn/input.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/input.h	Fri Feb 17 23:27:46 2023 -0500
@@ -229,9 +229,7 @@
     : m_interpreter (interp)
   { }
 
-  base_reader (const base_reader& x)
-    : m_interpreter (x.m_interpreter)
-  { }
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (base_reader)
 
   virtual ~base_reader () = default;
 
@@ -260,6 +258,8 @@
 {
 public:
 
+  input_reader () = delete;
+
   input_reader (interpreter& interp);
 
   input_reader (interpreter& interp, FILE *file);
@@ -268,11 +268,7 @@
 
   input_reader (interpreter& interp, const std::string& str);
 
-  input_reader (const input_reader& ir) = default;
-
-  input_reader& operator = (const input_reader& ir) = default;
-
-  ~input_reader () = default;
+  OCTAVE_DEFAULT_COPY_DELETE (input_reader)
 
   std::string get_input (const std::string& prompt, bool& eof)
   {
--- a/libinterp/corefcn/interpreter.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/interpreter.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -772,7 +772,7 @@
   cli_input_reader (interpreter& interp)
     : m_interpreter (interp), m_thread () { }
 
-  OCTAVE_DISABLE_COPY_MOVE (cli_input_reader)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (cli_input_reader)
 
   ~cli_input_reader ()
   {
--- a/libinterp/corefcn/latex-text-renderer.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/latex-text-renderer.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -53,7 +53,6 @@
 OCTINTERP_API
 latex_renderer : public base_text_renderer
 {
-
 public:
 
   latex_renderer ()
@@ -77,6 +76,8 @@
     m_debug = ! sys::env::getenv ("OCTAVE_LATEX_DEBUG_FLAG").empty ();
   }
 
+  OCTAVE_DISABLE_COPY_MOVE (latex_renderer)
+
   ~latex_renderer ()
   {
     if (! m_tmp_dir.empty () && ! m_debug)
--- a/libinterp/corefcn/load-path.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/load-path.h	Fri Feb 17 23:27:46 2023 -0500
@@ -51,7 +51,7 @@
 
   typedef void (*hook_fcn_ptr) (const std::string& dir);
 
-  OCTAVE_DISABLE_COPY_MOVE (load_path)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (load_path)
 
   ~load_path () = default;
 
@@ -320,6 +320,8 @@
   {
   public:
 
+    file_info () = delete;
+
     file_info (const std::string& d, int t) : dir_name (d), types (t) { }
 
     file_info (const file_info& fi)
--- a/libinterp/corefcn/load-save.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/load-save.h	Fri Feb 17 23:27:46 2023 -0500
@@ -77,7 +77,7 @@
 
   OCTINTERP_API ~load_save_system ();
 
-  OCTAVE_DISABLE_COPY_MOVE (load_save_system)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (load_save_system)
 
   OCTINTERP_API octave_value
   crash_dumps_octave_core (const octave_value_list& args, int nargout);
--- a/libinterp/corefcn/ls-hdf5.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/ls-hdf5.h	Fri Feb 17 23:27:46 2023 -0500
@@ -51,6 +51,8 @@
 
   hdf5_fstreambase () : file_id (-1), current_item () { }
 
+  OCTAVE_DEFAULT_COPY_MOVE (hdf5_fstreambase)
+
   ~hdf5_fstreambase () { close (); }
 
   OCTINTERP_API hdf5_fstreambase (const char *name, int mode,
@@ -101,9 +103,12 @@
 struct hdf5_callback_data
 {
 public:
+
   hdf5_callback_data ()
     : name (), global (false), tc (), doc () { }
 
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (hdf5_callback_data)
+
   // the following fields are set by hdf5_read_data on successful return:
 
   // the name of the variable
--- a/libinterp/corefcn/mex.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/mex.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -448,6 +448,8 @@
 {
 public:
 
+  mxArray_octave_value () = delete;
+
   mxArray_octave_value (bool interleaved, const octave_value& ov)
     : mxArray_base (interleaved), m_val (ov), m_mutate_flag (false),
       m_id (mxUNKNOWN_CLASS), m_class_name (nullptr), m_ndims (-1),
@@ -999,11 +1001,13 @@
 {
 public:
 
+  mxArray_matlab () = delete;
+
   // No assignment!
   // FIXME: should this be implemented?
   //        Note that we *do* have a copy constructor.
 
-  mxArray_matlab& operator = (const mxArray_matlab&);
+  mxArray_matlab& operator = (const mxArray_matlab&) = delete;
 
   ~mxArray_matlab (void)
   {
@@ -1522,6 +1526,8 @@
 {
 public:
 
+  mxArray_base_full () = delete;
+
   mxArray_base_full (bool interleaved, mxClassID id, mwSize ndims,
                      const mwSize *dims, bool init = true)
     : mxArray_matlab (interleaved, id, ndims, dims),
@@ -1595,7 +1601,7 @@
   // No assignment!  FIXME: should this be implemented?  Note that we
   // do have a copy constructor.
 
-  mxArray_base_full& operator = (const mxArray_base_full&);
+  mxArray_base_full& operator = (const mxArray_base_full&) = delete;
 
   mxArray_base * dup (void) const
   {
@@ -1996,6 +2002,8 @@
 {
 public:
 
+  mxArray_interleaved_full () = delete;
+
   mxArray_interleaved_full (mxClassID id, mwSize ndims, const mwSize *dims,
                             mxComplexity flag = mxREAL, bool init = true)
     : mxArray_base_full (true, id, ndims, dims, init),
@@ -2034,7 +2042,7 @@
   // No assignment!  FIXME: should this be implemented?  Note that we
   // do have a copy constructor.
 
-  mxArray_interleaved_full& operator = (const mxArray_interleaved_full&);
+  mxArray_interleaved_full& operator = (const mxArray_interleaved_full&) = delete;
 
   mxArray_base * dup (void) const
   {
@@ -2063,6 +2071,8 @@
 {
 public:
 
+  mxArray_separate_full () = delete;
+
   mxArray_separate_full (mxClassID id, mwSize ndims, const mwSize *dims,
                          mxComplexity flag = mxREAL, bool init = true)
     : mxArray_base_full (false, id, ndims, dims, init),
@@ -2107,7 +2117,7 @@
   // No assignment!  FIXME: should this be implemented?  Note that we
   // do have a copy constructor.
 
-  mxArray_separate_full& operator = (const mxArray_separate_full&);
+  mxArray_separate_full& operator = (const mxArray_separate_full&) = delete;
 
   mxArray_base * dup (void) const
   {
@@ -2257,6 +2267,8 @@
 {
 public:
 
+  mxArray_base_sparse () = delete;
+
   mxArray_base_sparse (bool interleaved, mxClassID id, mwSize m, mwSize n,
                        mwSize nzmax)
     : mxArray_matlab (interleaved, id, m, n),
@@ -2290,7 +2302,7 @@
   // No assignment!  FIXME: should this be implemented?  Note that we
   // do have a copy constructor.
 
-  mxArray_base_sparse& operator = (const mxArray_base_sparse&);
+  mxArray_base_sparse& operator = (const mxArray_base_sparse&) = delete;
 
   mxArray_base * dup (void) const
   {
@@ -2440,6 +2452,8 @@
 {
 public:
 
+  mxArray_interleaved_sparse () = delete;
+
   mxArray_interleaved_sparse (mxClassID id, mwSize m, mwSize n, mwSize nzmax,
                               mxComplexity flag = mxREAL)
     : mxArray_base_sparse (true, id, m, n, nzmax),
@@ -2457,7 +2471,7 @@
   // No assignment!  FIXME: should this be implemented?  Note that we
   // do have a copy constructor.
 
-  mxArray_interleaved_sparse& operator = (const mxArray_interleaved_sparse&);
+  mxArray_interleaved_sparse& operator = (const mxArray_interleaved_sparse&) = delete;
 
   mxArray_base * dup (void) const
   {
@@ -2483,6 +2497,8 @@
 {
 public:
 
+  mxArray_separate_sparse () = delete;
+
   mxArray_separate_sparse (mxClassID id, mwSize m, mwSize n, mwSize nzmax,
                            mxComplexity flag = mxREAL)
     : mxArray_base_sparse (false, id, m, n, nzmax),
@@ -2508,7 +2524,7 @@
   // No assignment!  FIXME: should this be implemented?  Note that we
   // do have a copy constructor.
 
-  mxArray_separate_sparse& operator = (const mxArray_separate_sparse&);
+  mxArray_separate_sparse& operator = (const mxArray_separate_sparse&) = delete;
 
   mxArray_base * dup (void) const
   {
@@ -2589,6 +2605,8 @@
 {
 public:
 
+  mxArray_struct () = delete;
+
   mxArray_struct (bool interleaved, mwSize ndims, const mwSize *dims,
                   int num_keys, const char **keys)
     : mxArray_matlab (interleaved, mxSTRUCT_CLASS, ndims, dims),
@@ -2655,7 +2673,7 @@
   // No assignment!  FIXME: should this be implemented?  Note that we
   // do have a copy constructor.
 
-  mxArray_struct& operator = (const mxArray_struct& val);
+  mxArray_struct& operator = (const mxArray_struct& val) = delete;
 
   void init (const char **keys)
   {
@@ -2856,6 +2874,8 @@
 {
 public:
 
+  mxArray_cell () = delete;
+
   mxArray_cell (bool interleaved, mwSize ndims, const mwSize *dims)
     : mxArray_matlab (interleaved, mxCELL_CLASS, ndims, dims),
       m_data (static_cast<mxArray **> (mxArray::calloc (get_number_of_elements (), sizeof (mxArray *))))
@@ -2891,7 +2911,7 @@
   // No assignment!  FIXME: should this be implemented?  Note that we
   // do have a copy constructor.
 
-  mxArray_cell& operator = (const mxArray_cell&);
+  mxArray_cell& operator = (const mxArray_cell&) = delete;
 
   mxArray_base * dup (void) const { return new mxArray_cell (*this); }
 
@@ -3156,7 +3176,7 @@
   mex (octave_mex_function& f)
     : m_curr_mex_fcn (f), m_memlist (), m_arraylist (), m_fname (nullptr) { }
 
-  OCTAVE_DISABLE_COPY_MOVE (mex)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (mex)
 
   ~mex (void)
   {
--- a/libinterp/corefcn/mxarray.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/mxarray.h	Fri Feb 17 23:27:46 2023 -0500
@@ -94,6 +94,10 @@
 
 public:
 
+  mxArray_base () = delete;
+
+  OCTAVE_DEFAULT_COPY_MOVE (mxArray_base)
+
   virtual mxArray_base * dup () const = 0;
 
   virtual mxArray * as_mxArray () const { return nullptr; }
@@ -288,8 +292,6 @@
 
 protected:
 
-  mxArray_base (const mxArray_base&) = default;
-
   std::size_t get_numeric_element_size (std::size_t size) const
   {
     return (m_interleaved
@@ -371,7 +373,7 @@
     return retval;
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (mxArray)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (mxArray)
 
   OCTINTERP_API ~mxArray ();
 
--- a/libinterp/corefcn/oct-errno.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/oct-errno.h	Fri Feb 17 23:27:46 2023 -0500
@@ -43,6 +43,8 @@
 
 public:
 
+  OCTAVE_DISABLE_COPY_MOVE (octave_errno)
+
   ~octave_errno () = default;
 
   static bool instance_ok ();
@@ -74,7 +76,6 @@
   std::map<std::string, int> m_errno_tbl;
 
   static octave_errno *s_instance;
-
 };
 
 #endif
--- a/libinterp/corefcn/oct-fstrm.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/oct-fstrm.h	Fri Feb 17 23:27:46 2023 -0500
@@ -44,7 +44,7 @@
            std::ios::openmode arg_md = std::ios::in | std::ios::out,
            mach_info::float_format flt_fmt = mach_info::native_float_format ());
 
-  OCTAVE_DISABLE_COPY_MOVE (fstream)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (fstream)
 
   static stream
   create (const std::string& nm_arg,
--- a/libinterp/corefcn/oct-hist.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/oct-hist.h	Fri Feb 17 23:27:46 2023 -0500
@@ -44,7 +44,7 @@
 
   history_system (interpreter& interp);
 
-  OCTAVE_DISABLE_COPY_MOVE (history_system)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (history_system)
 
   ~history_system () = default;
 
--- a/libinterp/corefcn/oct-iostrm.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/oct-iostrm.h	Fri Feb 17 23:27:46 2023 -0500
@@ -123,7 +123,7 @@
       m_ostream (arg)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (ostream)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (ostream)
 
   static stream
   create (std::ostream *arg, const std::string& n = "");
--- a/libinterp/corefcn/oct-map.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/oct-map.h	Fri Feb 17 23:27:46 2023 -0500
@@ -40,19 +40,22 @@
 
 // A class holding a map field->index.  Supports reference-counting.
 class OCTINTERP_API
-  octave_fields
+octave_fields
 {
   class fields_rep : public std::map<std::string, octave_idx_type>
   {
   public:
+
     fields_rep () : std::map<std::string, octave_idx_type> (), m_count (1) { }
+
     fields_rep (const fields_rep& other)
       : std::map<std::string, octave_idx_type> (other), m_count (1) { }
 
-    octave::refcount<octave_idx_type> m_count;
+    fields_rep& operator = (const fields_rep&) = delete;
 
-  private:
-    fields_rep& operator = (const fields_rep&); // no assignment!
+    ~fields_rep () = default;
+
+    octave::refcount<octave_idx_type> m_count;
   };
 
   fields_rep *m_rep;
@@ -158,30 +161,19 @@
 };
 
 class OCTINTERP_API
-  octave_scalar_map
+octave_scalar_map
 {
 public:
 
   octave_scalar_map (const octave_fields& k)
     : m_keys (k), m_vals (k.nfields ()) { }
 
-  octave_scalar_map () : m_keys (), m_vals () { }
-
   octave_scalar_map (const string_vector& k)
     : m_keys (k), m_vals (k.numel ()) { }
 
-  octave_scalar_map (const octave_scalar_map& m)
-    : m_keys (m.m_keys), m_vals (m.m_vals) { }
-
   octave_scalar_map (const std::map<std::string, octave_value>& m);
 
-  octave_scalar_map& operator = (const octave_scalar_map& m)
-  {
-    m_keys = m.m_keys;
-    m_vals = m.m_vals;
-
-    return *this;
-  }
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (octave_scalar_map)
 
   // iteration support.
   // note that both const and non-const iterators are the same.
@@ -264,7 +256,6 @@
 
   octave_fields m_keys;
   std::vector<octave_value> m_vals;
-
 };
 
 template <>
@@ -273,7 +264,7 @@
 { return v.scalar_map_value (); }
 
 class OCTINTERP_API
-  octave_map
+octave_map
 {
 public:
 
@@ -285,8 +276,6 @@
 
   typedef octave_scalar_map element_type;
 
-  octave_map () : m_keys (), m_vals (), m_dimensions () { }
-
   octave_map (const dim_vector& dv) : m_keys (), m_vals (), m_dimensions (dv) { }
 
   octave_map (const string_vector& k)
@@ -295,19 +284,9 @@
   octave_map (const dim_vector& dv, const string_vector& k)
     : m_keys (k), m_vals (k.numel (), Cell (dv)), m_dimensions (dv) { }
 
-  octave_map (const octave_map& m)
-    : m_keys (m.m_keys), m_vals (m.m_vals), m_dimensions (m.m_dimensions) { }
-
   octave_map (const octave_scalar_map& m);
 
-  octave_map& operator = (const octave_map& m)
-  {
-    m_keys = m.m_keys;
-    m_vals = m.m_vals;
-    m_dimensions = m.m_dimensions;
-
-    return *this;
-  }
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (octave_map)
 
   // iteration support.
   // note that both const and non-const iterators are the same.
--- a/libinterp/corefcn/oct-prcstrm.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/oct-prcstrm.h	Fri Feb 17 23:27:46 2023 -0500
@@ -51,7 +51,7 @@
                       = octave::mach_info::native_float_format (),
                       const std::string& encoding = "utf-8");
 
-  OCTAVE_DISABLE_COPY_MOVE (octave_iprocstream)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (octave_iprocstream)
 
   static octave::stream
   create (const std::string& n, std::ios::openmode arg_md = std::ios::in,
@@ -75,7 +75,7 @@
                       = octave::mach_info::native_float_format (),
                       const std::string& encoding = "utf-8");
 
-  OCTAVE_DISABLE_COPY_MOVE (octave_oprocstream)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (octave_oprocstream)
 
   static octave::stream
   create (const std::string& n, std::ios::openmode arg_md = std::ios::out,
--- a/libinterp/corefcn/oct-process.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/oct-process.h	Fri Feb 17 23:27:46 2023 -0500
@@ -48,6 +48,8 @@
       m_stdout_output (stdout_output)
   { }
 
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (process_execution_result)
+
   static OCTINTERP_API process_execution_result
   of_success (int exit_status, const std::string& stdout_output);
 
--- a/libinterp/corefcn/oct-stdstrm.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/oct-stdstrm.h	Fri Feb 17 23:27:46 2023 -0500
@@ -50,7 +50,7 @@
       m_stream (f ? new STREAM_T (f, cf) : nullptr), m_fnum (fid)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tstdiostream)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tstdiostream)
 
   // Position a stream at OFFSET relative to ORIGIN.
 
@@ -143,7 +143,7 @@
     return stream (new stdiostream (n, f, m, ff, encoding, cf));
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (stdiostream)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (stdiostream)
 
 protected:
 
@@ -176,7 +176,7 @@
     return stream (new zstdiostream (n, f, fid, m, ff, encoding, cf));
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (zstdiostream)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (zstdiostream)
 
 protected:
 
--- a/libinterp/corefcn/oct-stream.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/oct-stream.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -1223,7 +1223,7 @@
 
   delimited_stream (std::istream& is, const delimited_stream& ds);
 
-  OCTAVE_DISABLE_COPY_MOVE (delimited_stream)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (delimited_stream)
 
   ~delimited_stream ();
 
@@ -1647,6 +1647,8 @@
     literal_conversion = 2
   };
 
+  textscan_format_elt () = delete;
+
   textscan_format_elt (const std::string& txt, int w = 0, int p = -1,
                        int bw = 0, bool dis = false, char typ = '\0',
                        const std::string& ch_class = std::string ())
@@ -1655,28 +1657,7 @@
       numeric (typ == 'd' || typ == 'u' || type == 'f' || type == 'n')
   { }
 
-  textscan_format_elt (const textscan_format_elt& e)
-    : text (e.text), width (e.width), prec (e.prec),
-      bitwidth (e.bitwidth), char_class (e.char_class), type (e.type),
-      discard (e.discard), numeric (e.numeric)
-  { }
-
-  textscan_format_elt& operator = (const textscan_format_elt& e)
-  {
-    if (this != &e)
-      {
-        text = e.text;
-        width = e.width;
-        prec = e.prec;
-        bitwidth = e.bitwidth;
-        discard = e.discard;
-        type = e.type;
-        numeric = e.numeric;
-        char_class = e.char_class;
-      }
-
-    return *this;
-  }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (textscan_format_elt)
 
   // The C-style format string.
   std::string text;
--- a/libinterp/corefcn/oct-stream.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/oct-stream.h	Fri Feb 17 23:27:46 2023 -0500
@@ -501,7 +501,7 @@
 
   OCTINTERP_API stream_list (interpreter& interp);
 
-  OCTAVE_DISABLE_COPY_MOVE (stream_list)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (stream_list)
 
   OCTINTERP_API ~stream_list ();
 
--- a/libinterp/corefcn/oct-strstrm.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/oct-strstrm.h	Fri Feb 17 23:27:46 2023 -0500
@@ -90,7 +90,7 @@
               const std::string& encoding = "utf-8")
     : base_strstream (arg_md, ff, encoding), m_istream (data) { }
 
-  OCTAVE_DISABLE_COPY_MOVE (istrstream)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (istrstream)
 
 protected:
 
--- a/libinterp/corefcn/pager.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/pager.h	Fri Feb 17 23:27:46 2023 -0500
@@ -49,6 +49,10 @@
 
   pager_buf () : std::stringbuf (), m_diary_skip (0) { }
 
+  OCTAVE_DISABLE_COPY_MOVE (pager_buf)
+
+  ~pager_buf () = default;
+
   void flush_current_contents_to_diary ();
 
   void set_diary_skip ();
@@ -93,7 +97,7 @@
 {
 public:
 
-  diary_buf () : std::stringbuf () { }
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (diary_buf)
 
 protected:
 
@@ -129,7 +133,7 @@
 
   output_system (interpreter& interp);
 
-  OCTAVE_DISABLE_COPY_MOVE (output_system)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (output_system)
 
   ~output_system () = default;
 
--- a/libinterp/corefcn/procstream.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/procstream.h	Fri Feb 17 23:27:46 2023 -0500
@@ -49,6 +49,8 @@
 
   procstreambase (const char *name, int mode);
 
+  OCTAVE_DISABLE_COPY_MOVE (procstreambase)
+
   ~procstreambase () { close (); }
 
   void open (const std::string& name, int mode)
@@ -76,10 +78,6 @@
     // FIXME: is there a better way to organize these classes?
     init (&m_pb);
   }
-
-  procstreambase (const procstreambase&);
-
-  procstreambase& operator = (const procstreambase&);
 };
 
 class
@@ -98,6 +96,8 @@
     : std::istream (nullptr), procstreambase (name, mode)
   { }
 
+  OCTAVE_DISABLE_COPY_MOVE (iprocstream)
+
   ~iprocstream () = default;
 
   void open (const std::string& name, int mode = std::ios::in)
@@ -109,12 +109,6 @@
   {
     procstreambase::open (name, mode);
   }
-
-private:
-
-  iprocstream (const iprocstream&);
-
-  iprocstream& operator = (const iprocstream&);
 };
 
 class
@@ -131,6 +125,8 @@
   oprocstream (const char *name, int mode = std::ios::out)
     : std::ostream (nullptr), procstreambase (name, mode) { }
 
+  OCTAVE_DISABLE_COPY_MOVE (oprocstream)
+
   ~oprocstream () = default;
 
   void open (const std::string& name, int mode = std::ios::out)
@@ -142,12 +138,6 @@
   {
     procstreambase::open (name, mode);
   }
-
-private:
-
-  oprocstream (const oprocstream&);
-
-  oprocstream& operator = (const oprocstream&);
 };
 
 class
@@ -166,6 +156,8 @@
     : std::iostream (nullptr), procstreambase (name, mode)
   { }
 
+  OCTAVE_DISABLE_COPY_MOVE (procstream)
+
   ~procstream () = default;
 
   void open (const std::string& name, int mode)
@@ -177,12 +169,6 @@
   {
     procstreambase::open (name, mode);
   }
-
-private:
-
-  procstream (const procstream&);
-
-  procstream& operator = (const procstream&);
 };
 
 OCTAVE_END_NAMESPACE(octave)
--- a/libinterp/corefcn/symrec.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/symrec.h	Fri Feb 17 23:27:46 2023 -0500
@@ -67,16 +67,14 @@
   {
   public:
 
+    symbol_record_rep () = delete;
+
     symbol_record_rep (const std::string& nm, symrec_t sc)
       : m_frame_offset (0), m_data_offset (0), m_storage_class (sc),
         m_name (nm)
     { }
 
-    symbol_record_rep (const symbol_record_rep&) = default;
-
-    symbol_record_rep& operator = (const symbol_record_rep&) = default;
-
-    ~symbol_record_rep () = default;
+    OCTAVE_DEFAULT_COPY_MOVE_DELETE (symbol_record_rep)
 
     // FIXME: use special storage class instead?
     bool is_valid () const { return ! m_name.empty (); }
--- a/libinterp/corefcn/symtab.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/symtab.h	Fri Feb 17 23:27:46 2023 -0500
@@ -60,7 +60,7 @@
 
   symbol_table (interpreter& interp);
 
-  OCTAVE_DISABLE_COPY_MOVE (symbol_table)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (symbol_table)
 
   ~symbol_table () = default;
 
--- a/libinterp/corefcn/text-engine.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/text-engine.h	Fri Feb 17 23:27:46 2023 -0500
@@ -56,14 +56,12 @@
 text_element
 {
 public:
-  text_element () { }
+
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE (text_element)
 
   virtual ~text_element () = default;
 
   virtual void accept (text_processor& p) = 0;
-
-private:
-  text_element (const text_element&);
 };
 
 class
@@ -71,19 +69,17 @@
 text_element_string : public text_element
 {
 public:
+
   text_element_string (const std::string& s = "")
     : text_element (), m_str (s) { }
 
-  ~text_element_string () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (text_element_string)
 
   std::string string_value () const { return m_str; }
 
   void accept (text_processor& p);
 
 private:
-  text_element_string (const text_element_string&);
-
-  //--------
 
   std::string m_str;
 };
@@ -93,12 +89,15 @@
 text_element_symbol : public text_element
 {
 public:
+
   enum { invalid_code = 0xFFFFFFFFU };
 
+  text_element_symbol () = delete;
+
   text_element_symbol (int sym)
     : text_element (), m_symbol (sym) { }
 
-  ~text_element_symbol () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (text_element_symbol)
 
   int get_symbol () const { return m_symbol; }
 
@@ -116,8 +115,8 @@
   : public text_element, public base_list<text_element *>
 {
 public:
-  text_element_list ()
-    : text_element (), base_list<text_element*> () { }
+
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE (text_element_list)
 
   text_element_list (text_element *e)
     : text_element (), base_list<text_element*> ()
@@ -143,6 +142,9 @@
 text_element_subscript : public text_element
 {
 public:
+
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (text_element_subscript)
+
   text_element_subscript (text_element *e)
     : text_element (), m_elem (e) { }
 
@@ -158,12 +160,8 @@
   text_element * get_element () { return m_elem; }
 
 private:
-  text_element_subscript ();
-
-  //--------
 
   text_element *m_elem;
-
 };
 
 class
@@ -171,6 +169,9 @@
 text_element_superscript : public text_element
 {
 public:
+
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (text_element_superscript)
+
   text_element_superscript (text_element *e)
     : text_element (), m_elem (e) { }
 
@@ -186,12 +187,8 @@
   text_element * get_element () { return m_elem; }
 
 private:
-  text_element_superscript ();
-
-  //--------
 
   text_element *m_elem;
-
 };
 
 class
@@ -199,6 +196,9 @@
 text_element_combined : public text_element_list
 {
 public:
+
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (text_element_combined)
+
   text_element_combined (text_element *e)
     : text_element_list (e) { }
 
@@ -214,6 +214,7 @@
 text_element_fontstyle : public text_element
 {
 public:
+
   enum fontstyle
   {
     normal,
@@ -222,22 +223,20 @@
     oblique
   };
 
+  text_element_fontstyle () = delete;
+
   text_element_fontstyle (fontstyle st)
     : text_element (), m_style (st) { }
 
-  ~text_element_fontstyle () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (text_element_fontstyle)
 
   fontstyle get_fontstyle () const { return m_style; }
 
   void accept (text_processor& p);
 
 private:
-  text_element_fontstyle ();
-
-  //--------
 
   fontstyle m_style;
-
 };
 
 class
@@ -245,22 +244,21 @@
 text_element_fontname : public text_element
 {
 public:
+
+  text_element_fontname () = delete;
+
   text_element_fontname (const std::string& fname)
     : text_element (), m_name (fname) { }
 
-  ~text_element_fontname () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (text_element_fontname)
 
   const std::string& get_fontname () const { return m_name; }
 
   void accept (text_processor& p);
 
 private:
-  text_element_fontname ();
-
-  //--------
 
   std::string m_name;
-
 };
 
 class
@@ -268,22 +266,21 @@
 text_element_fontsize : public text_element
 {
 public:
+
+  text_element_fontsize () = delete;
+
   text_element_fontsize (double fsize)
     : text_element (), m_size (fsize) { }
 
-  ~text_element_fontsize () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (text_element_fontsize)
 
   double get_fontsize () const { return m_size; }
 
   void accept (text_processor& p);
 
 private:
-  text_element_fontsize ();
-
-  //--------
 
   double m_size;
-
 };
 
 class
@@ -291,6 +288,9 @@
 text_element_color : public text_element
 {
 public:
+
+  text_element_color () = delete;
+
   text_element_color (double r, double g, double b)
     : text_element (), m_rgb (1, 3, 0.0)
   {
@@ -317,13 +317,14 @@
 #undef ASSIGN_COLOR
                         }
 
-  ~text_element_color () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (text_element_color)
 
   Matrix get_color () { return m_rgb; }
 
   void accept (text_processor& p);
 
 private:
+
   Matrix m_rgb;
 };
 
@@ -332,6 +333,7 @@
 text_processor
 {
 public:
+
   virtual void visit (text_element_string&) { }
 
   virtual void visit (text_element_symbol&) { }
@@ -363,7 +365,8 @@
   virtual void reset () { }
 
 protected:
-  text_processor () { }
+
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE (text_processor)
 
   virtual ~text_processor () = default;
 };
@@ -391,7 +394,8 @@
 text_parser
 {
 public:
-  text_parser () { }
+
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE (text_parser)
 
   virtual ~text_parser () = default;
 
@@ -407,9 +411,8 @@
 text_parser_none : public text_parser
 {
 public:
-  text_parser_none () : text_parser () { }
 
-  ~text_parser_none () = default;
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (text_parser_none)
 
   // FIXME: is it possible to use reference counting to manage the
   // memory for the object returned by the text parser?  That would be
@@ -427,11 +430,14 @@
 text_parser_tex : public text_parser
 {
 public:
+
   text_parser_tex ()
     : text_parser (), m_scanner (nullptr), m_buffer_state (nullptr),
       m_result (nullptr)
   { }
 
+  OCTAVE_DISABLE_COPY_MOVE (text_parser_tex)
+
   ~text_parser_tex ()
   { destroy_lexer (); }
 
--- a/libinterp/corefcn/text-renderer.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/text-renderer.h	Fri Feb 17 23:27:46 2023 -0500
@@ -130,37 +130,15 @@
   {
   public:
 
-    string (const std::string& s, font& f, const double x, const double y)
+    string () = delete;
+
+    string (const std::string& s, const font& f, double x, double y)
       : m_str (s), m_family (f.get_name ()), m_fnt (f), m_x (x), m_y (y),
         m_z (0.0), m_xdata (), m_code (0), m_color (Matrix (1, 3, 0.0)),
         m_svg_element ()
     { }
 
-    string (const string& s)
-      : m_str (s.m_str), m_family (s.m_family), m_fnt (s.m_fnt), m_x (s.m_x),
-        m_y (s.m_y), m_z (s.m_z), m_xdata (s.m_xdata), m_code (s.m_code),
-        m_color (s.m_color), m_svg_element (s.m_svg_element)
-    { }
-
-    ~string () = default;
-
-    string& operator = (const string& s)
-    {
-      if (&s != this)
-        {
-          m_str = s.m_str;
-          m_family = s.m_family;
-          m_fnt = s.m_fnt;
-          m_x = s.m_x;
-          m_y = s.m_y;
-          m_z = s.m_z;
-          m_xdata = s.m_xdata;
-          m_code = s.m_code;
-          m_color = s.m_color;
-        }
-
-      return *this;
-    }
+    OCTAVE_DEFAULT_COPY_MOVE_DELETE (string)
 
     void set_string (const std::string& s) { m_str = s; }
 
--- a/libinterp/corefcn/utils.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/corefcn/utils.h	Fri Feb 17 23:27:46 2023 -0500
@@ -68,6 +68,8 @@
 
   make_valid_name_options () = default;
 
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (make_valid_name_options)
+
   //! Extract attribute-value-pairs from an octave_value_list of strings.
   //!
   //! If attributes occur multiple times, the rightmost pair is chosen.
--- a/libinterp/dldfcn/__init_fltk__.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/dldfcn/__init_fltk__.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -144,6 +144,8 @@
 #endif
   }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (OpenGL_fltk)
+
   ~OpenGL_fltk () = default;
 
   void zoom (bool z)
@@ -307,6 +309,10 @@
     : m_menubar (new Fl_Menu_Bar (xx, yy, ww, hh))
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (fltk_uimenu)
+
+  ~fltk_uimenu () = default;
+
   int items_to_show ()
   {
     //returns the number of visible menu items
@@ -751,13 +757,6 @@
       m_menubar->clear ();
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (fltk_uimenu)
-
-  ~fltk_uimenu ()
-  {
-    // FLTK is supposed to manage memory for widgets.
-  }
-
 private:
 
   Fl_Menu_Bar *m_menubar;
@@ -878,7 +877,7 @@
       }
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (plot_window)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (plot_window)
 
   ~plot_window ()
   {
@@ -2267,6 +2266,8 @@
     Fl::visual (FL_RGB);
   }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (fltk_graphics_toolkit)
+
   ~fltk_graphics_toolkit () = default;
 
   bool is_valid () const { return true; }
--- a/libinterp/dldfcn/__init_gnuplot__.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/dldfcn/__init_gnuplot__.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -61,6 +61,7 @@
 class gnuplot_graphics_toolkit : public octave::base_graphics_toolkit
 {
 public:
+
   gnuplot_graphics_toolkit (octave::interpreter& interp)
     : octave::base_graphics_toolkit ("gnuplot"), m_interpreter (interp)
   {
@@ -85,6 +86,8 @@
       }
   }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (gnuplot_graphics_toolkit)
+
   ~gnuplot_graphics_toolkit () = default;
 
   bool is_valid () const { return true; }
--- a/libinterp/dldfcn/__ode15__.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/dldfcn/__ode15__.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -189,6 +189,7 @@
       m_sunJacMatrix (nullptr), m_sunLinearSolver (nullptr)
   { }
 
+  OCTAVE_DISABLE_COPY_MOVE (IDA)
 
   ~IDA ()
   {
--- a/libinterp/dldfcn/audiodevinfo.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/dldfcn/audiodevinfo.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -522,7 +522,11 @@
 class audioplayer : public octave_base_dld_value
 {
 public:
+
   audioplayer ();
+
+  OCTAVE_DISABLE_COPY_MOVE (audioplayer)
+
   ~audioplayer ();
 
   // Overloaded base functions
@@ -1274,7 +1278,11 @@
 class audiorecorder : public octave_base_dld_value
 {
 public:
+
   audiorecorder ();
+
+  OCTAVE_DISABLE_COPY_MOVE (audiorecorder)
+
   ~audiorecorder ();
 
   // Overloaded base functions
--- a/libinterp/octave.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/octave.h	Fri Feb 17 23:27:46 2023 -0500
@@ -48,9 +48,7 @@
 
   cmdline_options (int argc, char **argv);
 
-  cmdline_options (const cmdline_options&) = default;
-
-  cmdline_options& operator = (const cmdline_options&) = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (cmdline_options)
 
   int sys_argc () const { return m_all_args.numel (); }
   char ** sys_argv () const { return m_all_args.c_str_vec (); }
--- a/libinterp/parse-tree/anon-fcn-validator.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/anon-fcn-validator.h	Fri Feb 17 23:27:46 2023 -0500
@@ -45,7 +45,7 @@
 
   anon_fcn_validator (tree_parameter_list *, tree_expression *expr);
 
-  OCTAVE_DISABLE_COPY_MOVE (anon_fcn_validator)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (anon_fcn_validator)
 
   ~anon_fcn_validator () = default;
 
--- a/libinterp/parse-tree/bp-table.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/bp-table.h	Fri Feb 17 23:27:46 2023 -0500
@@ -62,6 +62,8 @@
       m_caught_that_stop (), m_warnings_that_stop ()
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (bp_table)
+
   ~bp_table () = default;
 
   // Set of breakpoint lines.
--- a/libinterp/parse-tree/comment-list.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/comment-list.h	Fri Feb 17 23:27:46 2023 -0500
@@ -98,7 +98,7 @@
 {
 public:
 
-  comment_list () { }
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (comment_list)
 
   void append (const comment_elt& elt)
   { base_list<comment_elt>::append (elt); }
--- a/libinterp/parse-tree/lex.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/lex.h	Fri Feb 17 23:27:46 2023 -0500
@@ -62,6 +62,8 @@
     symbol_table_context (interpreter& interp)
       : m_interpreter (interp), m_frame_stack () { }
 
+    OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (symbol_table_context)
+
     ~symbol_table_context () { clear (); }
 
     void clear ();
@@ -316,7 +318,7 @@
     init ();
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (lexical_feedback)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (lexical_feedback)
 
   ~lexical_feedback ();
 
@@ -535,6 +537,8 @@
       : m_buffer (), m_offset (0), m_chars_left (0), m_eof (false)
     { }
 
+    OCTAVE_DEFAULT_COPY_MOVE_DELETE (input_buffer)
+
     void fill (const std::string& input, bool eof_arg);
 
     // Copy at most max_size characters to buf.
@@ -561,6 +565,8 @@
 
     comment_buffer () : m_comment_list (nullptr) { }
 
+    OCTAVE_DISABLE_COPY_MOVE (comment_buffer)
+
     ~comment_buffer () { delete m_comment_list; }
 
     void append (const std::string& s, comment_elt::comment_type t)
@@ -601,7 +607,7 @@
     init ();
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (base_lexer)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (base_lexer)
 
   virtual ~base_lexer ();
 
@@ -768,7 +774,9 @@
       m_initial_input (true)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (lexer)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (lexer)
+
+  ~lexer () = default;
 
   void reset ()
   {
@@ -842,7 +850,9 @@
     append_input (input, eof);
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (push_lexer)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (push_lexer)
+
+  ~push_lexer () = default;
 
   bool is_push_lexer () const { return true; }
 
--- a/libinterp/parse-tree/oct-lvalue.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/oct-lvalue.h	Fri Feb 17 23:27:46 2023 -0500
@@ -46,11 +46,7 @@
       m_type (), m_idx ()
   { }
 
-  octave_lvalue (const octave_lvalue&) = default;
-
-  octave_lvalue& operator = (const octave_lvalue&) = delete;
-
-  ~octave_lvalue () = default;
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (octave_lvalue)
 
   bool is_black_hole () const { return m_black_hole; }
 
--- a/libinterp/parse-tree/oct-parse.yy	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/oct-parse.yy	Fri Feb 17 23:27:46 2023 -0500
@@ -2412,6 +2412,8 @@
   {
   public:
 
+    parse_exception () = delete;
+
     parse_exception (const std::string& message,
                      const std::string& fcn_name = "",
                      const std::string& file_name = "",
@@ -2421,11 +2423,7 @@
         m_line (line), m_column (column)
     { }
 
-    parse_exception (const parse_exception&) = default;
-
-    parse_exception& operator = (const parse_exception&) = default;
-
-    ~parse_exception () = default;
+    OCTAVE_DEFAULT_COPY_MOVE_DELETE (parse_exception)
 
     std::string message () const { return m_message; }
 
--- a/libinterp/parse-tree/parse.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/parse.h	Fri Feb 17 23:27:46 2023 -0500
@@ -161,7 +161,7 @@
 
   OCTINTERP_API base_parser (base_lexer& lxr);
 
-  OCTAVE_DISABLE_COPY_MOVE (base_parser)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (base_parser)
 
   virtual ~base_parser ();
 
@@ -845,7 +845,7 @@
     : base_parser (*lxr)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (parser)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (parser)
 
   ~parser () = default;
 
@@ -869,7 +869,7 @@
       m_interpreter (interp), m_reader (reader)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (push_parser)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (push_parser)
 
   ~push_parser () = default;
 
--- a/libinterp/parse-tree/profiler.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/profiler.h	Fri Feb 17 23:27:46 2023 -0500
@@ -76,7 +76,7 @@
         }
     }
 
-    OCTAVE_DISABLE_COPY_MOVE (enter)
+    OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (enter)
 
     ~enter ()
     {
@@ -107,8 +107,11 @@
   struct stats
   {
   public:
+
     stats ();
 
+    OCTAVE_DEFAULT_COPY_MOVE_DELETE (stats)
+
     typedef std::set<octave_idx_type> function_set;
 
     // Convert a function_set list to an Octave array of indices.
@@ -137,7 +140,7 @@
 
     virtual ~tree_node ();
 
-    OCTAVE_DISABLE_COPY_MOVE (tree_node)
+    OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_node)
 
     void add_time (double dt) { m_time += dt; }
 
--- a/libinterp/parse-tree/pt-args-block.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/pt-args-block.h	Fri Feb 17 23:27:46 2023 -0500
@@ -49,7 +49,7 @@
     : m_size_args (size_args)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_arg_size_spec)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_arg_size_spec)
 
   ~tree_arg_size_spec ()
   {
@@ -76,7 +76,7 @@
     : m_fcn_args (fcn_args)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_arg_validation_fcns)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_arg_validation_fcns)
 
   ~tree_arg_validation_fcns ()
   {
@@ -108,7 +108,7 @@
       m_default_value (default_value)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_arg_validation)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_arg_validation)
 
   ~tree_arg_validation ()
   {
@@ -219,7 +219,7 @@
       m_lead_comm (nullptr), m_trail_comm (nullptr)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_arguments_block)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_arguments_block)
 
   ~tree_arguments_block ()
   {
--- a/libinterp/parse-tree/pt-binop.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/pt-binop.h	Fri Feb 17 23:27:46 2023 -0500
@@ -128,13 +128,13 @@
 public:
 
   tree_braindead_shortcircuit_binary_expression (tree_expression *a,
-      tree_expression *b,
-      int l, int c,
-      octave_value::binary_op t)
+                                                 tree_expression *b,
+                                                 int l, int c,
+                                                 octave_value::binary_op t)
     : tree_binary_expression (a, b, l, c, t)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_braindead_shortcircuit_binary_expression)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_braindead_shortcircuit_binary_expression)
 
   ~tree_braindead_shortcircuit_binary_expression () = default;
 
--- a/libinterp/parse-tree/pt-bp.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/pt-bp.h	Fri Feb 17 23:27:46 2023 -0500
@@ -50,7 +50,7 @@
       m_bp_list (), m_bp_cond_list ()
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_breakpoint)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_breakpoint)
 
   ~tree_breakpoint () = default;
 
--- a/libinterp/parse-tree/pt-cbinop.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/pt-cbinop.h	Fri Feb 17 23:27:46 2023 -0500
@@ -54,7 +54,10 @@
       m_etype (ct)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_compound_binary_expression)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_compound_binary_expression)
+
+  // FIXME: who is responsibile for deleting M_LHS and M_RHS?
+  ~tree_compound_binary_expression () = default;
 
   octave_value::compound_binary_op cop_type () const { return m_etype; }
 
--- a/libinterp/parse-tree/pt-classdef.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/pt-classdef.h	Fri Feb 17 23:27:46 2023 -0500
@@ -50,14 +50,14 @@
 {
 public:
 
-  tree_superclass_ref () = delete;
-
   tree_superclass_ref (const std::string& meth, const std::string& cls,
                        int l = -1, int c = -1)
     : tree_expression (l, c), m_method_name (meth), m_class_name (cls)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_superclass_ref)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_superclass_ref)
+
+  ~tree_superclass_ref () = default;
 
   std::string method_name () const
   {
@@ -97,13 +97,13 @@
 {
 public:
 
-  tree_metaclass_query () = delete;
-
   tree_metaclass_query (const std::string& cls, int l = -1, int c = -1)
     : tree_expression (l, c), m_class_name (cls)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_metaclass_query)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_metaclass_query)
+
+  ~tree_metaclass_query () = default;
 
   std::string class_name () const { return m_class_name; }
 
@@ -195,7 +195,7 @@
     : m_cls_name (cname)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_classdef_superclass)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_classdef_superclass)
 
   ~tree_classdef_superclass () = default;
 
@@ -249,7 +249,7 @@
       m_lead_comm (lc), m_trail_comm (tc)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_classdef_element)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_classdef_element)
 
   ~tree_classdef_element ()
   {
@@ -291,7 +291,7 @@
   tree_classdef_property (tree_arg_validation *av,
                           comment_list *comments = nullptr);
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_classdef_property)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_classdef_property)
 
   ~tree_classdef_property ();
 
@@ -352,7 +352,7 @@
     : tree_classdef_element<tree_classdef_property_list> (a, plist, lc, tc, l, c)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_classdef_properties_block)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_classdef_properties_block)
 
   ~tree_classdef_properties_block () = default;
 
@@ -395,7 +395,7 @@
     : tree_classdef_element<tree_classdef_methods_list> (a, mlist, lc, tc, l, c)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_classdef_methods_block)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_classdef_methods_block)
 
   ~tree_classdef_methods_block () = default;
 
@@ -475,7 +475,7 @@
     : tree_classdef_element<tree_classdef_events_list> (a, elist, lc, tc, l, c)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_classdef_events_block)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_classdef_events_block)
 
   ~tree_classdef_events_block () = default;
 
@@ -492,7 +492,7 @@
   tree_classdef_enum (tree_identifier *i, tree_expression *e,
                       comment_list *comments);
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_classdef_enum)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_classdef_enum)
 
   ~tree_classdef_enum ()
   {
@@ -559,7 +559,7 @@
     : tree_classdef_element<tree_classdef_enum_list> (a, elist, lc, tc, l, c)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_classdef_enum_block)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_classdef_enum_block)
 
   ~tree_classdef_enum_block () = default;
 
@@ -688,7 +688,7 @@
       m_trail_comm (tc), m_pack_name (pn), m_file_name (fn)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_classdef)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_classdef)
 
   ~tree_classdef ()
   {
--- a/libinterp/parse-tree/pt-cmd.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/pt-cmd.h	Fri Feb 17 23:27:46 2023 -0500
@@ -95,7 +95,7 @@
   tree_function_def (octave_function *f, int l = -1, int c = -1)
     : tree_command (l, c), m_fcn (f) { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_function_def)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_function_def)
 
   ~tree_function_def () = default;
 
--- a/libinterp/parse-tree/pt-decl.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/pt-decl.h	Fri Feb 17 23:27:46 2023 -0500
@@ -59,7 +59,7 @@
 
   tree_decl_elt (tree_identifier *i, tree_expression *e = nullptr);
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_decl_elt)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_decl_elt)
 
   ~tree_decl_elt ();
 
@@ -170,7 +170,7 @@
   tree_decl_command (const std::string& n, tree_decl_init_list *t,
                      int l = -1, int c = -1);
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_decl_command)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_decl_command)
 
   ~tree_decl_command ();
 
--- a/libinterp/parse-tree/pt-eval.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/pt-eval.h	Fri Feb 17 23:27:46 2023 -0500
@@ -81,13 +81,7 @@
   {
   public:
 
-    value_stack () = default;
-
-    value_stack (const value_stack&) = default;
-
-    value_stack& operator = (const value_stack&) = default;
-
-    ~value_stack () = default;
+    OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (value_stack)
 
     void push (const T& val) { m_stack.push (val); }
 
@@ -148,7 +142,7 @@
       m_index_position (0), m_num_indices (0)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_evaluator)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_evaluator)
 
   ~tree_evaluator () = default;
 
--- a/libinterp/parse-tree/pt-id.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/pt-id.h	Fri Feb 17 23:27:46 2023 -0500
@@ -118,6 +118,10 @@
   tree_black_hole (int l = -1, int c = -1)
     : tree_identifier (l, c) { }
 
+  OCTAVE_DISABLE_COPY_MOVE (tree_black_hole)
+
+  ~tree_black_hole () = default;
+
   std::string name () const { return "~"; }
 
   bool is_black_hole () const { return true; }
--- a/libinterp/parse-tree/pt-misc.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/pt-misc.h	Fri Feb 17 23:27:46 2023 -0500
@@ -68,7 +68,7 @@
     append (new tree_decl_elt (id));
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_parameter_list)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_parameter_list)
 
   ~tree_parameter_list ();
 
--- a/libinterp/parse-tree/pt-spmd.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/pt-spmd.h	Fri Feb 17 23:27:46 2023 -0500
@@ -48,7 +48,7 @@
     : tree_command (l, c), m_body (body), m_lead_comm (lc), m_trail_comm (tc)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (tree_spmd_command)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (tree_spmd_command)
 
   ~tree_spmd_command ();
 
--- a/libinterp/parse-tree/token.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/libinterp/parse-tree/token.h	Fri Feb 17 23:27:46 2023 -0500
@@ -89,7 +89,7 @@
   token (int tv, const std::string& mth, const std::string& cls,
          const filepos& beg_pos, const filepos& end_pos);
 
-  OCTAVE_DISABLE_COPY_MOVE (token)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (token)
 
   ~token ();
 
--- a/liboctave/array/Array-base.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/Array-base.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -312,6 +312,7 @@
 class rec_permute_helper
 {
 public:
+
   rec_permute_helper (const dim_vector& dv, const Array<octave_idx_type>& perm)
 
     : m_n (dv.ndims ()), m_top (0), m_dim (new octave_idx_type [2*m_n]),
@@ -350,7 +351,7 @@
 
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (rec_permute_helper)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (rec_permute_helper)
 
   ~rec_permute_helper () { delete [] m_dim; }
 
@@ -522,6 +523,7 @@
 class rec_index_helper
 {
 public:
+
   rec_index_helper (const dim_vector& dv, const Array<octave::idx_vector>& ia)
     : m_n (ia.numel ()), m_top (0), m_dim (new octave_idx_type [2*m_n]),
       m_cdim (m_dim + m_n), m_idx (new octave::idx_vector [m_n])
@@ -551,7 +553,7 @@
       }
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (rec_index_helper)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (rec_index_helper)
 
   ~rec_index_helper () { delete [] m_idx; delete [] m_dim; }
 
@@ -638,6 +640,7 @@
 class rec_resize_helper
 {
 public:
+
   rec_resize_helper (const dim_vector& ndv, const dim_vector& odv)
     : m_cext (nullptr), m_sext (nullptr), m_dext (nullptr), m_n (0)
   {
@@ -663,7 +666,7 @@
     m_cext[0] *= ld;
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (rec_resize_helper)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (rec_resize_helper)
 
   ~rec_resize_helper () { delete [] m_cext; }
 
--- a/liboctave/array/CColVector.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/CColVector.h	Fri Feb 17 23:27:46 2023 -0500
@@ -67,6 +67,8 @@
     return *this;
   }
 
+  ~ComplexColumnVector () = default;
+
   OCTAVE_API bool operator == (const ComplexColumnVector& a) const;
   OCTAVE_API bool operator != (const ComplexColumnVector& a) const;
 
--- a/liboctave/array/CNDArray.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/CNDArray.h	Fri Feb 17 23:27:46 2023 -0500
@@ -62,6 +62,8 @@
     return *this;
   }
 
+  ~ComplexNDArray () = default;
+
   // unary operations
 
   OCTAVE_API boolNDArray operator ! () const;
--- a/liboctave/array/CRowVector.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/CRowVector.h	Fri Feb 17 23:27:46 2023 -0500
@@ -66,6 +66,8 @@
     return *this;
   }
 
+  ~ComplexRowVector () = default;
+
   OCTAVE_API bool operator == (const ComplexRowVector& a) const;
   OCTAVE_API bool operator != (const ComplexRowVector& a) const;
 
--- a/liboctave/array/CSparse.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/CSparse.h	Fri Feb 17 23:27:46 2023 -0500
@@ -105,6 +105,8 @@
     return *this;
   }
 
+  ~SparseComplexMatrix () = default;
+
   OCTAVE_API bool operator == (const SparseComplexMatrix& a) const;
   OCTAVE_API bool operator != (const SparseComplexMatrix& a) const;
 
--- a/liboctave/array/Range.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/Range.h	Fri Feb 17 23:27:46 2023 -0500
@@ -106,28 +106,7 @@
     return range<T> (base, increment, final_val, numel, reverse);
   }
 
-  range (const range<T>& r)
-    : m_base (r.m_base), m_increment (r.m_increment),
-      m_limit (r.m_limit), m_final (r.m_final),
-      m_numel (r.m_numel), m_reverse (r.m_reverse)
-  { }
-
-  range<T>& operator = (const range<T>& r)
-  {
-    if (this != &r)
-      {
-        m_base = r.m_base;
-        m_increment = r.m_increment;
-        m_limit = r.m_limit;
-        m_final = r.m_final;
-        m_numel = r.m_numel;
-        m_reverse = r.m_reverse;
-      }
-
-    return *this;
-  }
-
-  ~range () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (range)
 
   T base () const { return m_base; }
   T increment () const { return m_increment; }
--- a/liboctave/array/boolNDArray.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/boolNDArray.h	Fri Feb 17 23:27:46 2023 -0500
@@ -58,6 +58,8 @@
     return *this;
   }
 
+  ~boolNDArray () = default;
+
   // unary operations
 
   OCTAVE_API boolNDArray operator ! () const;
--- a/liboctave/array/boolSparse.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/boolSparse.h	Fri Feb 17 23:27:46 2023 -0500
@@ -83,6 +83,8 @@
     return *this;
   }
 
+  ~SparseBoolMatrix () = default;
+
   OCTAVE_API bool operator == (const SparseBoolMatrix& a) const;
   OCTAVE_API bool operator != (const SparseBoolMatrix& a) const;
 
--- a/liboctave/array/chNDArray.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/chNDArray.h	Fri Feb 17 23:27:46 2023 -0500
@@ -66,6 +66,8 @@
     return *this;
   }
 
+  ~charNDArray () = default;
+
   bool any_element_is_nan () const { return false; }
 
   // FIXME: this is not quite the right thing.
--- a/liboctave/array/dColVector.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/dColVector.h	Fri Feb 17 23:27:46 2023 -0500
@@ -59,6 +59,8 @@
     return *this;
   }
 
+  ~ColumnVector () = default;
+
   OCTAVE_API bool operator == (const ColumnVector& a) const;
   OCTAVE_API bool operator != (const ColumnVector& a) const;
 
--- a/liboctave/array/dNDArray.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/dNDArray.h	Fri Feb 17 23:27:46 2023 -0500
@@ -69,6 +69,8 @@
     return *this;
   }
 
+  ~NDArray () = default;
+
   // unary operations
 
   OCTAVE_API boolNDArray operator ! () const;
--- a/liboctave/array/dRowVector.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/dRowVector.h	Fri Feb 17 23:27:46 2023 -0500
@@ -59,6 +59,8 @@
     return *this;
   }
 
+  ~RowVector () = default;
+
   OCTAVE_API bool operator == (const RowVector& a) const;
   OCTAVE_API bool operator != (const RowVector& a) const;
 
--- a/liboctave/array/dSparse.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/dSparse.h	Fri Feb 17 23:27:46 2023 -0500
@@ -95,6 +95,8 @@
     return *this;
   }
 
+  ~SparseMatrix () = default;
+
   OCTAVE_API bool operator == (const SparseMatrix& a) const;
   OCTAVE_API bool operator != (const SparseMatrix& a) const;
 
--- a/liboctave/array/fCColVector.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/fCColVector.h	Fri Feb 17 23:27:46 2023 -0500
@@ -69,6 +69,8 @@
     return *this;
   }
 
+  ~FloatComplexColumnVector () = default;
+
   OCTAVE_API bool operator == (const FloatComplexColumnVector& a) const;
   OCTAVE_API bool operator != (const FloatComplexColumnVector& a) const;
 
--- a/liboctave/array/fCNDArray.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/fCNDArray.h	Fri Feb 17 23:27:46 2023 -0500
@@ -63,6 +63,8 @@
     return *this;
   }
 
+  ~FloatComplexNDArray () = default;
+
   // unary operations
 
   OCTAVE_API boolNDArray operator ! () const;
--- a/liboctave/array/fCRowVector.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/fCRowVector.h	Fri Feb 17 23:27:46 2023 -0500
@@ -70,6 +70,8 @@
     return *this;
   }
 
+  ~FloatComplexRowVector () = default;
+
   OCTAVE_API bool operator == (const FloatComplexRowVector& a) const;
   OCTAVE_API bool operator != (const FloatComplexRowVector& a) const;
 
--- a/liboctave/array/fColVector.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/fColVector.h	Fri Feb 17 23:27:46 2023 -0500
@@ -62,6 +62,8 @@
     return *this;
   }
 
+  ~FloatColumnVector () = default;
+
   OCTAVE_API bool operator == (const FloatColumnVector& a) const;
   OCTAVE_API bool operator != (const FloatColumnVector& a) const;
 
--- a/liboctave/array/fNDArray.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/fNDArray.h	Fri Feb 17 23:27:46 2023 -0500
@@ -66,6 +66,8 @@
     return *this;
   }
 
+  ~FloatNDArray () = default;
+
   // unary operations
 
   OCTAVE_API boolNDArray operator ! () const;
--- a/liboctave/array/fRowVector.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/fRowVector.h	Fri Feb 17 23:27:46 2023 -0500
@@ -60,6 +60,8 @@
     return *this;
   }
 
+  ~FloatRowVector () = default;
+
   OCTAVE_API bool operator == (const FloatRowVector& a) const;
   OCTAVE_API bool operator != (const FloatRowVector& a) const;
 
--- a/liboctave/array/idx-vector.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/array/idx-vector.h	Fri Feb 17 23:27:46 2023 -0500
@@ -129,6 +129,8 @@
 
     OCTAVE_DISABLE_COPY_MOVE (idx_colon_rep)
 
+    ~idx_colon_rep () = default;
+
     octave_idx_type xelem (octave_idx_type i) const { return i; }
 
     OCTAVE_API octave_idx_type checkelem (octave_idx_type i) const;
@@ -172,6 +174,8 @@
 
     OCTAVE_DISABLE_COPY_MOVE (idx_range_rep)
 
+    ~idx_range_rep () = default;
+
     octave_idx_type xelem (octave_idx_type i) const
     { return m_start + i * m_step; }
 
@@ -222,6 +226,8 @@
 
     OCTAVE_DISABLE_COPY_MOVE (idx_scalar_rep)
 
+    ~idx_scalar_rep () = default;
+
     // Zero-based constructor.
     OCTAVE_API idx_scalar_rep (octave_idx_type i);
 
--- a/liboctave/numeric/DASPK.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/DASPK.h	Fri Feb 17 23:27:46 2023 -0500
@@ -56,7 +56,7 @@
       m_liw (0), m_lrw (0), m_info (), m_iwork (), m_rwork (), m_abs_tol (),
       m_rel_tol () { }
 
-  ~DASPK () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (DASPK)
 
   ColumnVector do_integrate (double t);
 
--- a/liboctave/numeric/DASRT.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/DASRT.h	Fri Feb 17 23:27:46 2023 -0500
@@ -97,7 +97,7 @@
       m_rwork (), m_abs_tol (), m_rel_tol ()
   { }
 
-  ~DASRT () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (DASRT)
 
   DASRT_result integrate (const ColumnVector& tout);
 
--- a/liboctave/numeric/DASSL.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/DASSL.h	Fri Feb 17 23:27:46 2023 -0500
@@ -56,7 +56,7 @@
       m_liw (0), m_lrw (0), m_info (), m_iwork (), m_rwork (), m_abs_tol (),
       m_rel_tol () { }
 
-  ~DASSL () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (DASSL)
 
   ColumnVector do_integrate (double t);
 
--- a/liboctave/numeric/DET.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/DET.h	Fri Feb 17 23:27:46 2023 -0500
@@ -57,14 +57,7 @@
     m_e2 += f;
   }
 
-  base_det (const base_det& a) : m_c2 (a.m_c2), m_e2 (a.m_e2) { }
-
-  base_det& operator = (const base_det& a)
-  {
-    m_c2 = a.m_c2;
-    m_e2 = a.m_e2;
-    return *this;
-  }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (base_det)
 
   T coef () const { return m_c2; }
   int exp () const { return m_e2; }
--- a/liboctave/numeric/LSODE.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/LSODE.h	Fri Feb 17 23:27:46 2023 -0500
@@ -49,7 +49,7 @@
       m_method_flag (0), m_itask (0), m_iopt (0), m_itol (0), m_liw (0),
       m_lrw (0), m_iwork (), m_rwork (), m_rel_tol (0.0), m_abs_tol () { }
 
-  ~LSODE () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (LSODE)
 
   ColumnVector do_integrate (double t);
 
--- a/liboctave/numeric/Quad.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/Quad.h	Fri Feb 17 23:27:46 2023 -0500
@@ -42,12 +42,16 @@
 {
 public:
 
+  Quad () = delete;
+
   Quad (integrand_fcn fcn)
     : Quad_options (), m_f (fcn), m_ff () { }
 
   Quad (float_integrand_fcn fcn)
     : Quad_options (), m_f (), m_ff (fcn) { }
 
+  OCTAVE_DEFAULT_COPY_MOVE (Quad)
+
   virtual ~Quad () = default;
 
   virtual double integrate ()
@@ -120,6 +124,8 @@
 {
 public:
 
+  DefQuad () = delete;
+
   DefQuad (integrand_fcn fcn)
     : Quad (fcn), m_lower_limit (0.0), m_upper_limit (1.0), m_singularities ()
   { }
@@ -137,7 +143,7 @@
     : Quad (fcn), m_lower_limit (0.0), m_upper_limit (1.0),
       m_singularities (sing) { }
 
-  ~DefQuad () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (DefQuad)
 
   double do_integrate (octave_idx_type& ier, octave_idx_type& neval,
                        double& abserr);
@@ -161,13 +167,15 @@
 
   enum IntegralType { bound_to_inf, neg_inf_to_bound, doubly_infinite };
 
+  IndefQuad () = delete;
+
   IndefQuad (integrand_fcn fcn)
     : Quad (fcn), m_bound (0.0), m_type (bound_to_inf) { }
 
   IndefQuad (integrand_fcn fcn, double b, IntegralType t)
     : Quad (fcn), m_bound (b), m_type (t) { }
 
-  ~IndefQuad () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (IndefQuad)
 
   double do_integrate (octave_idx_type& ier, octave_idx_type& neval,
                        double& abserr);
@@ -187,6 +195,8 @@
 {
 public:
 
+  FloatDefQuad () = delete;
+
   FloatDefQuad (float_integrand_fcn fcn)
     : Quad (fcn), m_lower_limit (0.0), m_upper_limit (1.0), m_singularities ()
   { }
@@ -204,7 +214,7 @@
     : Quad (fcn), m_lower_limit (0.0), m_upper_limit (1.0),
       m_singularities (sing) { }
 
-  ~FloatDefQuad () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (FloatDefQuad)
 
   OCTAVE_NORETURN double do_integrate (octave_idx_type& ier,
                                        octave_idx_type& neval, double& abserr);
@@ -228,13 +238,15 @@
 
   enum IntegralType { bound_to_inf, neg_inf_to_bound, doubly_infinite };
 
+  FloatIndefQuad () = delete;
+
   FloatIndefQuad (float_integrand_fcn fcn)
     : Quad (fcn), m_bound (0.0), m_type (bound_to_inf) { }
 
   FloatIndefQuad (float_integrand_fcn fcn, double b, IntegralType t)
     : Quad (fcn), m_bound (b), m_type (t) { }
 
-  ~FloatIndefQuad () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (FloatIndefQuad)
 
   OCTAVE_NORETURN double do_integrate (octave_idx_type& ier,
                                        octave_idx_type& neval, double& abserr);
--- a/liboctave/numeric/chol.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/chol.h	Fri Feb 17 23:27:46 2023 -0500
@@ -56,20 +56,7 @@
     info = init (a, upper, calc_cond);
   }
 
-  chol (const chol& a)
-    : m_chol_mat (a.m_chol_mat), m_rcond (a.m_rcond), m_is_upper (a.m_is_upper) { }
-
-  chol& operator = (const chol& a)
-  {
-    if (this != &a)
-      {
-        m_chol_mat = a.m_chol_mat;
-        m_rcond = a.m_rcond;
-        m_is_upper = a.m_is_upper;
-      }
-
-    return *this;
-  }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (chol)
 
   T chol_matrix () const { return m_chol_mat; }
 
--- a/liboctave/numeric/oct-fftw.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/oct-fftw.h	Fri Feb 17 23:27:46 2023 -0500
@@ -327,9 +327,7 @@
 {
 public:
 
-  fftw () = delete;
-
-  OCTAVE_DISABLE_COPY_MOVE (fftw)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE_DELETE (fftw)
 
   static int fft (const double *in, Complex *out, std::size_t npts,
                   std::size_t nsamples = 1, octave_idx_type stride = 1,
--- a/liboctave/numeric/oct-norm.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/oct-norm.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -75,9 +75,11 @@
 class norm_accumulator_p
 {
 public:
-  norm_accumulator_p () { } // we need this one for Array
+
   norm_accumulator_p (R pp) : m_p(pp), m_scl(0), m_sum(1) { }
 
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (norm_accumulator_p)
+
   template <typename U>
   void accum (U val)
   {
@@ -106,9 +108,11 @@
 class norm_accumulator_mp
 {
 public:
-  norm_accumulator_mp () { } // we need this one for Array
+
   norm_accumulator_mp (R pp) : m_p(pp), m_scl(0), m_sum(1) { }
 
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (norm_accumulator_mp)
+
   template <typename U>
   void accum (U val)
   {
@@ -137,8 +141,11 @@
 class norm_accumulator_2
 {
 public:
+
   norm_accumulator_2 () : m_scl(0), m_sum(1) { }
 
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (norm_accumulator_2)
+
   void accum (R val)
   {
     R t = std::abs (val);
@@ -175,7 +182,11 @@
 class norm_accumulator_1
 {
 public:
+
   norm_accumulator_1 () : m_sum (0) { }
+
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (norm_accumulator_1)
+
   template <typename U>
   void accum (U val)
   {
@@ -193,7 +204,11 @@
 class norm_accumulator_inf
 {
 public:
+
   norm_accumulator_inf () : m_max (0) { }
+
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (norm_accumulator_inf)
+
   template <typename U>
   void accum (U val)
   {
@@ -214,7 +229,11 @@
 class norm_accumulator_minf
 {
 public:
+
   norm_accumulator_minf () : m_min (numeric_limits<R>::Inf ()) { }
+
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (norm_accumulator_minf)
+
   template <typename U>
   void accum (U val)
   {
@@ -235,7 +254,11 @@
 class norm_accumulator_0
 {
 public:
+
   norm_accumulator_0 () : m_num (0) { }
+
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (norm_accumulator_0)
+
   template <typename U>
   void accum (U val)
   {
--- a/liboctave/numeric/oct-rand.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/oct-rand.h	Fri Feb 17 23:27:46 2023 -0500
@@ -49,6 +49,8 @@
 
 public:
 
+  OCTAVE_DISABLE_COPY_MOVE (rand)
+
   ~rand () = default;
 
   static bool instance_ok ();
--- a/liboctave/numeric/sparse-qr.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/sparse-qr.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -75,7 +75,7 @@
 
   sparse_qr_rep (const SPARSE_T& a, int order);
 
-  OCTAVE_DISABLE_COPY_MOVE (sparse_qr_rep)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (sparse_qr_rep)
 
   ~sparse_qr_rep ();
 
--- a/liboctave/numeric/svd.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/numeric/svd.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -48,7 +48,8 @@
 gejsv_lwork
 {
 public:
-  gejsv_lwork () = delete;
+
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE_DELETE (gejsv_lwork)
 
   // Unfortunately, dgejsv and sgejsv do not provide estimation of 'lwork'.
   // Thus, we have to estimate it according to corresponding LAPACK
--- a/liboctave/system/child-list.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/system/child-list.h	Fri Feb 17 23:27:46 2023 -0500
@@ -76,7 +76,7 @@
 {
 public:
 
-  child_list () { }
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (child_list)
 
   void insert (pid_t pid, child::child_event_handler f);
 
--- a/liboctave/system/file-stat.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/system/file-stat.h	Fri Feb 17 23:27:46 2023 -0500
@@ -275,27 +275,14 @@
 {
 public:
 
+  file_fstat () = delete;
+
   file_fstat (int n) : base_file_stat (), m_fid (n)
   {
     update_internal ();
   }
 
-  file_fstat (const file_fstat& fs)
-    : base_file_stat (fs), m_fid (fs.m_fid) { }
-
-  file_fstat& operator = (const file_fstat& fs)
-  {
-    if (this != &fs)
-      {
-        base_file_stat::operator = (fs);
-
-        m_fid = fs.m_fid;
-      }
-
-    return *this;
-  }
-
-  ~file_fstat () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (file_fstat)
 
   void get_stats (bool force = false)
   {
--- a/liboctave/system/oct-env.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/system/oct-env.h	Fri Feb 17 23:27:46 2023 -0500
@@ -46,6 +46,8 @@
 
   OCTAVE_DISABLE_COPY_MOVE (env)
 
+  ~env () = default;
+
   static std::string polite_directory_format (const std::string& name);
 
   static bool absolute_pathname (const std::string& s);
--- a/liboctave/system/oct-group.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/system/oct-group.h	Fri Feb 17 23:27:46 2023 -0500
@@ -48,24 +48,7 @@
     : m_name (), m_passwd (), m_gid (0), m_mem (), m_valid (false)
   { }
 
-  group (const group& gr)
-    : m_name (gr.m_name), m_passwd (gr.m_passwd),
-      m_gid (gr.m_gid), m_mem (gr.m_mem), m_valid (gr.m_valid)
-  { }
-
-  group& operator = (const group& gr)
-  {
-    if (this != &gr)
-      {
-        m_name = gr.m_name;
-        m_passwd = gr.m_passwd;
-        m_gid = gr.m_gid;
-        m_mem = gr.m_mem;
-        m_valid = gr.m_valid;
-      }
-
-    return *this;
-  }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (group)
 
   std::string name () const;
 
--- a/liboctave/system/oct-time.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/system/oct-time.h	Fri Feb 17 23:27:46 2023 -0500
@@ -332,13 +332,7 @@
   gmtime (const time& ot)
     : base_tm () { init (ot); }
 
-  gmtime& operator = (const gmtime& t)
-  {
-    base_tm::operator = (t);
-    return *this;
-  }
-
-  ~gmtime () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (gmtime)
 
 private:
 
@@ -350,26 +344,18 @@
 {
 public:
 
+  strptime () = delete;
+
   strptime (const std::string& str, const std::string& fmt)
     : base_tm (), m_nchars (0)
   {
     init (str, fmt);
   }
 
-  strptime (const strptime& s)
-    : base_tm (s), m_nchars (s.m_nchars) { }
-
-  strptime& operator = (const strptime& s)
-  {
-    base_tm::operator = (s);
-    m_nchars = s.m_nchars;
-    return *this;
-  }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (strptime)
 
   int characters_converted () const { return m_nchars; }
 
-  ~strptime () = default;
-
 private:
 
   int m_nchars;
@@ -390,23 +376,7 @@
     stamp ();
   }
 
-  cpu_time (const cpu_time& tm)
-    : m_usr_sec (tm.m_usr_sec), m_sys_sec (tm.m_sys_sec),
-      m_usr_usec (tm.m_usr_usec), m_sys_usec (tm.m_sys_usec)
-  { }
-
-  cpu_time& operator = (const cpu_time& tm)
-  {
-    if (&tm != this)
-      {
-        m_usr_sec = tm.m_usr_sec;
-        m_sys_sec = tm.m_sys_sec;
-        m_usr_usec = tm.m_usr_usec;
-        m_sys_usec = tm.m_sys_usec;
-      }
-
-    return *this;
-  }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (cpu_time)
 
   OCTAVE_API void stamp ();
 
@@ -454,41 +424,7 @@
     stamp ();
   }
 
-  resource_usage (const resource_usage& ru)
-    : m_cpu (ru.m_cpu), m_maxrss (ru.m_maxrss),
-      m_ixrss (ru.m_ixrss), m_idrss (ru.m_idrss),
-      m_isrss (ru.m_isrss), m_minflt (ru.m_minflt),
-      m_majflt (ru.m_majflt), m_nswap (ru.m_nswap),
-      m_inblock (ru.m_inblock), m_oublock (ru.m_oublock),
-      m_msgsnd (ru.m_msgsnd), m_msgrcv (ru.m_msgrcv),
-      m_nsignals (ru.m_nsignals), m_nvcsw (ru.m_nvcsw),
-      m_nivcsw (ru.m_nivcsw)
-  { }
-
-  resource_usage& operator = (const resource_usage& ru)
-  {
-    if (&ru != this)
-      {
-        m_cpu = ru.m_cpu;
-
-        m_maxrss = ru.m_maxrss;
-        m_ixrss = ru.m_ixrss;
-        m_idrss = ru.m_idrss;
-        m_isrss = ru.m_isrss;
-        m_minflt = ru.m_minflt;
-        m_majflt = ru.m_majflt;
-        m_nswap = ru.m_nswap;
-        m_inblock = ru.m_inblock;
-        m_oublock = ru.m_oublock;
-        m_msgsnd = ru.m_msgsnd;
-        m_msgrcv = ru.m_msgrcv;
-        m_nsignals = ru.m_nsignals;
-        m_nvcsw = ru.m_nvcsw;
-        m_nivcsw = ru.m_nivcsw;
-      }
-
-    return *this;
-  }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (resource_usage)
 
   OCTAVE_API void stamp ();
 
--- a/liboctave/util/action-container.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/action-container.h	Fri Feb 17 23:27:46 2023 -0500
@@ -109,7 +109,9 @@
     restore_var_elem (T& ref, const T& val)
       : m_ptr (&ref), m_val (val) { }
 
-    OCTAVE_DISABLE_COPY_MOVE (restore_var_elem)
+    OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (restore_var_elem)
+
+    ~restore_var_elem () = default;
 
     void run () { *m_ptr = m_val; }
 
@@ -129,7 +131,9 @@
     delete_ptr_elem (T *ptr)
       : m_ptr (ptr) { }
 
-    OCTAVE_DISABLE_COPY_MOVE (delete_ptr_elem)
+    OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (delete_ptr_elem)
+
+    ~delete_ptr_elem () = default;
 
     void run () { delete m_ptr; }
 
--- a/liboctave/util/cmd-edit.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/cmd-edit.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -83,6 +83,8 @@
 
   gnu_readline ();
 
+  OCTAVE_DISABLE_COPY_MOVE (gnu_readline)
+
   ~gnu_readline () = default;
 
   void do_set_name (const std::string& n);
--- a/liboctave/util/cmd-hist.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/cmd-hist.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -64,6 +64,8 @@
   gnu_history ()
     : command_history (), m_mark (0) { }
 
+  OCTAVE_DISABLE_COPY_MOVE (gnu_history)
+
   ~gnu_history () = default;
 
   void do_process_histcontrol (const std::string&);
--- a/liboctave/util/kpse.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/kpse.h	Fri Feb 17 23:27:46 2023 -0500
@@ -38,19 +38,15 @@
 {
 public:
 
+  kpse_path_iterator () = delete;
+
   kpse_path_iterator (const std::string& p)
     : m_path (p), m_b (0), m_e (0), m_len (m_path.length ())
   {
     set_end ();
   }
 
-  kpse_path_iterator (const kpse_path_iterator&) = default;
-
-  // No assignment!
-
-  kpse_path_iterator& operator = (const kpse_path_iterator&) = delete;
-
-  ~kpse_path_iterator () = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (kpse_path_iterator)
 
   kpse_path_iterator operator ++ (int)
   {
--- a/liboctave/util/lo-array-errwarn.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/lo-array-errwarn.h	Fri Feb 17 23:27:46 2023 -0500
@@ -45,6 +45,8 @@
 {
 public:
 
+  index_exception () = delete;
+
   index_exception (const std::string& index, octave_idx_type nd = 0,
                    octave_idx_type dim = -1, const char *var = "")
     : m_index (index), m_nd (nd), m_dim (dim), m_var (var)
@@ -52,6 +54,8 @@
     set_message (expression ());
   }
 
+  OCTAVE_DEFAULT_COPY_MOVE (index_exception)
+
   ~index_exception () = default;
 
   // ID of error to throw.
--- a/liboctave/util/lo-regexp.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/lo-regexp.h	Fri Feb 17 23:27:46 2023 -0500
@@ -164,6 +164,8 @@
   {
   public:
 
+    match_element () = delete;
+
     match_element (const string_vector& nt, const string_vector& t,
                    const std::string& ms, const Matrix& te,
                    double s, double e)
@@ -171,9 +173,7 @@
         m_token_extents (te), m_start (s), m_end (e)
     { }
 
-    match_element (const match_element&) = default;
-
-    match_element& operator = (const match_element&) = default;
+    OCTAVE_DEFAULT_COPY_MOVE_DELETE (match_element)
 
     std::string match_string () const { return m_match_string; }
     string_vector named_tokens () const { return m_named_tokens; }
@@ -208,11 +208,7 @@
       : base_list<match_element> (l), m_named_pats (np)
     { }
 
-    match_data (const match_data&) = default;
-
-    match_data& operator = (const match_data&) = default;
-
-    ~match_data () = default;
+    OCTAVE_DEFAULT_COPY_MOVE_DELETE (match_data)
 
     string_vector named_patterns () const { return m_named_pats; }
 
--- a/liboctave/util/oct-mutex.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/oct-mutex.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -114,6 +114,7 @@
 pthread_mutex : public base_mutex
 {
 public:
+
   pthread_mutex ()
     : base_mutex (), m_pm ()
   {
@@ -125,6 +126,8 @@
     pthread_mutexattr_destroy (&attr);
   }
 
+  OCTAVE_DISABLE_COPY_MOVE (pthread_mutex)
+
   ~pthread_mutex ()
   {
     pthread_mutex_destroy (&m_pm);
--- a/liboctave/util/oct-mutex.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/oct-mutex.h	Fri Feb 17 23:27:46 2023 -0500
@@ -41,7 +41,7 @@
 public:
   friend class mutex;
 
-  base_mutex () = default;
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE (base_mutex)
 
   virtual ~base_mutex () = default;
 
@@ -59,11 +59,7 @@
 public:
   mutex ();
 
-  mutex (const mutex& m) = default;
-
-  ~mutex () = default;
-
-  mutex& operator = (const mutex& m) = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (mutex)
 
   void lock ()
   {
@@ -101,7 +97,7 @@
       m_lock_result = m_mutex.try_lock ();
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (autolock)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (autolock)
 
   ~autolock ()
   {
--- a/liboctave/util/oct-refcount.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/oct-refcount.h	Fri Feb 17 23:27:46 2023 -0500
@@ -45,7 +45,7 @@
     : m_count (initial_count)
   { }
 
-  OCTAVE_DISABLE_COPY_MOVE (refcount)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (refcount)
 
   ~refcount () = default;
 
--- a/liboctave/util/oct-shlib.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/oct-shlib.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -178,7 +178,7 @@
 
   octave_dlopen_shlib (const std::string& f);
 
-  OCTAVE_DISABLE_COPY_MOVE (octave_dlopen_shlib)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (octave_dlopen_shlib)
 
   ~octave_dlopen_shlib ();
 
--- a/liboctave/util/oct-shlib.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/oct-shlib.h	Fri Feb 17 23:27:46 2023 -0500
@@ -54,6 +54,8 @@
         m_search_all_loaded (false)
     { }
 
+    OCTAVE_DISABLE_COPY_MOVE (dynlib_rep)
+
   protected:
 
     OCTAVE_API
--- a/liboctave/util/oct-string.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/oct-string.h	Fri Feb 17 23:27:46 2023 -0500
@@ -160,16 +160,16 @@
 
 
 template<class Facet>
-struct
-  deletable_facet : Facet
+struct deletable_facet : Facet
 {
+  deletable_facet () = delete;
+
   template<class ...Args>
   deletable_facet (Args&& ...args)
     : Facet (std::forward<Args> (args)...)
   { }
 
-  // destructor needs to be public
-  ~deletable_facet () { }
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (deletable_facet)
 };
 
 class
@@ -178,12 +178,12 @@
 {
 public:
 
-  OCTAVE_DISABLE_COPY_MOVE (codecvt_u8)
-
   codecvt_u8 (const std::string& enc)
     : m_enc (enc)
   { }
 
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (codecvt_u8)
+
   virtual ~codecvt_u8 () { }
 
   typedef char InternT;
--- a/liboctave/util/octave-preserve-stream-state.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/octave-preserve-stream-state.h	Fri Feb 17 23:27:46 2023 -0500
@@ -37,11 +37,15 @@
 {
 public:
 
+  preserve_stream_state () = delete;
+
   preserve_stream_state (std::ios& s)
     : m_stream (s), m_oflags (s.flags ()), m_oprecision (s.precision ()),
       m_owidth (s.width ()), m_ofill (s.fill ())
   { }
 
+  OCTAVE_DEFAULT_COPY_MOVE (preserve_stream_state)
+
   ~preserve_stream_state ()
   {
     m_stream.flags (m_oflags);
--- a/liboctave/util/quit.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/quit.h	Fri Feb 17 23:27:46 2023 -0500
@@ -168,11 +168,7 @@
       m_safe_to_return (safe_to_return)
   { }
 
-  exit_exception (const exit_exception&) = default;
-
-  exit_exception& operator = (exit_exception&) = default;
-
-  ~exit_exception (void) = default;
+  OCTAVE_DEFAULT_COPY_MOVE_DELETE (exit_exception)
 
   const char * what (void) const noexcept { return "exit exception"; }
 
--- a/liboctave/util/unwind-prot.h	Fri Feb 17 23:18:24 2023 -0500
+++ b/liboctave/util/unwind-prot.h	Fri Feb 17 23:27:46 2023 -0500
@@ -317,7 +317,7 @@
     m_ref = new_val;
   }
 
-  OCTAVE_DISABLE_COPY_MOVE (unwind_protect_var)
+  OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (unwind_protect_var)
 
   ~unwind_protect_var ()
   {
--- a/src/octave-svgconvert.cc	Fri Feb 17 23:18:24 2023 -0500
+++ b/src/octave-svgconvert.cc	Fri Feb 17 23:27:46 2023 -0500
@@ -53,8 +53,11 @@
 class pdfpainter : public QPainter
 {
 public:
+
+  pdfpainter () = delete;
+
   pdfpainter (QString fname, QRectF sz)
-      :  m_printer ()
+    : m_printer ()
   {
     // Printer settings
     m_printer.setOutputFormat (QPrinter::PdfFormat);
@@ -70,9 +73,12 @@
     setWindow (sz.toRect ());
   }
 
+  OCTAVE_DEFAULT_COPY_MOVE (pdfpainter)
+
   ~pdfpainter () { end (); }
 
 private:
+
   QPrinter m_printer;
 };
 
@@ -146,13 +152,11 @@
 class octave_polygon
 {
 public:
-  octave_polygon ()
-  { }
 
   octave_polygon (QPolygonF p)
   { m_polygons.push_back (p); }
 
-  ~octave_polygon () { }
+  OCTAVE_DEFAULT_CONSTRUCT_COPY_MOVE_DELETE (octave_polygon)
 
   int count () const
   { return m_polygons.count (); }