We have many classes that copy cotr and assignment operator are deleted
in different projects, gcc, gdb and gold.  So this patch adds a macro
to do this, and replace these existing mechanical code with macro
DISABLE_COPY_AND_ASSIGN.
The patch was posted in gdb-patches,
https://sourceware.org/ml/gdb-patches/2017-07/msg00254.html but we
think it is better to put this macro in include/ansidecl.h so that
other projects can use it too.

Boostrapped on x86_64-linux-gnu.  Is it OK?

include:

2017-07-19  Yao Qi  <yao...@linaro.org>
            Pedro Alves  <pal...@redhat.com>

        * ansidecl.h (DISABLE_COPY_AND_ASSIGN): New macro.

gcc/cp:

2017-07-19  Yao Qi  <yao...@linaro.org>

        * cp-tree.h (class ovl_iterator): Use DISABLE_COPY_AND_ASSIGN.
        * name-lookup.c (struct name_loopup): Likewise.

gcc:

2017-07-19  Yao Qi  <yao...@linaro.org>

        * tree-ssa-scopedtables.h (class avail_exprs_stack): Use
        DISABLE_COPY_AND_ASSIGN.
        (class const_and_copies): Likewise.
---
 gcc/cp/cp-tree.h            |  4 +---
 gcc/cp/name-lookup.c        |  3 +--
 gcc/tree-ssa-scopedtables.h |  6 ++----
 include/ansidecl.h          | 19 +++++++++++++++++++
 4 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index abc9b65..9a45680 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -718,9 +718,7 @@ class ovl_iterator
   }
 
  private:
-  /* Do not duplicate.  */
-  ovl_iterator &operator= (const ovl_iterator &);
-  ovl_iterator (const ovl_iterator &);
+  DISABLE_COPY_AND_ASSIGN (ovl_iterator);
 
  public:
   operator bool () const
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index cd7428a..f80958d 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -194,8 +194,7 @@ public:
   }
 
 private: /* Uncopyable, unmovable, unassignable. I am a rock. */
-  name_lookup (const name_lookup &);
-  name_lookup &operator= (const name_lookup &);
+  DISABLE_COPY_AND_ASSIGN (name_lookup);
 
 protected:
   static bool seen_p (tree scope)
diff --git a/gcc/tree-ssa-scopedtables.h b/gcc/tree-ssa-scopedtables.h
index df304ae..692da8a 100644
--- a/gcc/tree-ssa-scopedtables.h
+++ b/gcc/tree-ssa-scopedtables.h
@@ -158,8 +158,7 @@ class avail_exprs_stack
 
   /* We do not allow copying this object or initializing one
      from another.  */
-  avail_exprs_stack& operator= (const avail_exprs_stack&);
-  avail_exprs_stack (class avail_exprs_stack &);
+  DISABLE_COPY_AND_ASSIGN (avail_exprs_stack);
 };
 
 /* This class defines an unwindable const/copy equivalence table
@@ -197,8 +196,7 @@ class const_and_copies
 
  private:
   vec<tree> m_stack;
-  const_and_copies& operator= (const const_and_copies&);
-  const_and_copies (class const_and_copies &);
+  DISABLE_COPY_AND_ASSIGN (const_and_copies);
 };
 
 void initialize_expr_from_cond (tree cond, struct hashable_expr *expr);
diff --git a/include/ansidecl.h b/include/ansidecl.h
index f6e1761..796f744 100644
--- a/include/ansidecl.h
+++ b/include/ansidecl.h
@@ -354,6 +354,25 @@ So instead we use the macro below and test it against 
specific values.  */
 # define FINAL
 #endif
 
+/* A macro to disable the copy constructor and assignment operator.
+   When building with C++11 and above, the methods are explicitly
+   deleted, causing a compile-time error if something tries to copy.
+   For C++03, this just declares the methods, causing a link-time
+   error if the methods end up called (assuming you don't
+   define them).  For C++03, for best results, place the macro
+   under the private: access specifier, so that most attempts at
+   copy are caught at compile-time.  */
+
+#if __cplusplus >= 201103
+#define DISABLE_COPY_AND_ASSIGN(TYPE)          \
+  TYPE (const TYPE&) = delete;                 \
+  void operator= (const TYPE &) = delete
+  #else
+#define DISABLE_COPY_AND_ASSIGN(TYPE)          \
+  TYPE (const TYPE&);                          \
+  void operator= (const TYPE &)
+#endif /* __cplusplus >= 201103 */
+
 #ifdef __cplusplus
 }
 #endif
-- 
1.9.1

Reply via email to