aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVille Voutilainen <ville.voutilainen@gmail.com>2015-01-06 22:44:32 +0200
committerJason Merrill <jason@gcc.gnu.org>2015-01-06 15:44:32 -0500
commit864822bd8880db5e75398a2e409dccb7545418ef (patch)
treea13a58d2c9f4194eb423925bafcc02a58f365f02 /gcc
parent512ef949392e2dbcc9d4e76b855da765c68db371 (diff)
downloadgcc-864822bd8880db5e75398a2e409dccb7545418ef.zip
gcc-864822bd8880db5e75398a2e409dccb7545418ef.tar.gz
gcc-864822bd8880db5e75398a2e409dccb7545418ef.tar.bz2
re PR c++/64489 (A simple struct wrapping a const int is not trivially copyable)
PR c++/64489 * class.c (check_field_decls): Make copy assignment operators complex only in c++98 mode. From-SVN: r219265
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/class.c32
-rw-r--r--gcc/testsuite/g++.dg/ext/is_trivially_constructible1.C5
3 files changed, 29 insertions, 14 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 004629b..9c0159f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2015-01-06 Ville Voutilainen <ville.voutilainen@gmail.com>
+
+ PR c++/64489
+ * class.c (check_field_decls): Make copy assignment operators
+ complex only in c++98 mode.
+
2015-01-05 Trevor Saunders <tsaunders@mozilla.com>
PR c++/31397
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index b798a52..2153a73 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -3607,13 +3607,15 @@ check_field_decls (tree t, tree *access_decls,
CLASSTYPE_NON_STD_LAYOUT (t) = 1;
if (DECL_INITIAL (x) == NULL_TREE)
SET_CLASSTYPE_REF_FIELDS_NEED_INIT (t, 1);
-
- /* ARM $12.6.2: [A member initializer list] (or, for an
- aggregate, initialization by a brace-enclosed list) is the
- only way to initialize nonstatic const and reference
- members. */
- TYPE_HAS_COMPLEX_COPY_ASSIGN (t) = 1;
- TYPE_HAS_COMPLEX_MOVE_ASSIGN (t) = 1;
+ if (cxx_dialect < cxx11)
+ {
+ /* ARM $12.6.2: [A member initializer list] (or, for an
+ aggregate, initialization by a brace-enclosed list) is the
+ only way to initialize nonstatic const and reference
+ members. */
+ TYPE_HAS_COMPLEX_COPY_ASSIGN (t) = 1;
+ TYPE_HAS_COMPLEX_MOVE_ASSIGN (t) = 1;
+ }
}
type = strip_array_types (type);
@@ -3715,13 +3717,15 @@ check_field_decls (tree t, tree *access_decls,
C_TYPE_FIELDS_READONLY (t) = 1;
if (DECL_INITIAL (x) == NULL_TREE)
SET_CLASSTYPE_READONLY_FIELDS_NEED_INIT (t, 1);
-
- /* ARM $12.6.2: [A member initializer list] (or, for an
- aggregate, initialization by a brace-enclosed list) is the
- only way to initialize nonstatic const and reference
- members. */
- TYPE_HAS_COMPLEX_COPY_ASSIGN (t) = 1;
- TYPE_HAS_COMPLEX_MOVE_ASSIGN (t) = 1;
+ if (cxx_dialect < cxx11)
+ {
+ /* ARM $12.6.2: [A member initializer list] (or, for an
+ aggregate, initialization by a brace-enclosed list) is the
+ only way to initialize nonstatic const and reference
+ members. */
+ TYPE_HAS_COMPLEX_COPY_ASSIGN (t) = 1;
+ TYPE_HAS_COMPLEX_MOVE_ASSIGN (t) = 1;
+ }
}
/* A field that is pseudo-const makes the structure likewise. */
else if (CLASS_TYPE_P (type))
diff --git a/gcc/testsuite/g++.dg/ext/is_trivially_constructible1.C b/gcc/testsuite/g++.dg/ext/is_trivially_constructible1.C
index c866373..a5bac7b 100644
--- a/gcc/testsuite/g++.dg/ext/is_trivially_constructible1.C
+++ b/gcc/testsuite/g++.dg/ext/is_trivially_constructible1.C
@@ -36,3 +36,8 @@ SA(!__is_trivially_constructible(D));
SA(__is_trivially_copyable(int));
SA(!__is_trivially_copyable(volatile int));
+
+struct E1 {const int val;};
+SA(__is_trivially_copyable(E1));
+struct E2 {int& val;};
+SA(__is_trivially_copyable(E2));