aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYao Qi <yao.qi@linaro.org>2017-09-15 15:40:50 +0000
committerYao Qi <yao.qi@linaro.org>2017-09-15 15:40:50 +0000
commit8f8b0fecd09a9c6de28e0a9757e8fe2484d72807 (patch)
treedfc46c853b094c05f63c142a46308c2f86a5503d
parent3e4b4861ef515def0c92f9b21f787c233b563122 (diff)
[include] Add macro DISABLE_COPY_AND_ASSIGN
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. include: 2017-09-15 Yao Qi <yao.qi@linaro.org> Pedro Alves <palves@redhat.com> * ansidecl.h (DISABLE_COPY_AND_ASSIGN): New macro. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@252823 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--include/ChangeLog5
-rw-r--r--include/ansidecl.h26
2 files changed, 31 insertions, 0 deletions
diff --git a/include/ChangeLog b/include/ChangeLog
index 47035883d3b..0221586d778 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,8 @@
+2017-09-15 Yao Qi <yao.qi@linaro.org>
+ Pedro Alves <palves@redhat.com>
+
+ * ansidecl.h (DISABLE_COPY_AND_ASSIGN): New macro.
+
2017-09-12 Jiong Wang <jiong.wang@arm.com>
* dwarf2.def (DW_CFA_AARCH64_negate_ra_state): New DW_CFA_DUP.
diff --git a/include/ansidecl.h b/include/ansidecl.h
index ab3b895a475..450ce35da4b 100644
--- a/include/ansidecl.h
+++ b/include/ansidecl.h
@@ -360,6 +360,32 @@ 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, like this,
+
+ class name_lookup
+ {
+ private:
+ DISABLE_COPY_AND_ASSIGN (name_lookup);
+ };
+
+ 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