Tested on Linux-x64.

/cp
2015-01-05  Ville Voutilainen  <ville.voutilai...@gmail.com>

    PR c++/64489
    * class.c (check_field_decls): Make copy assignment operators
    complex only in c++98 mode.

/testsuite
2015-01-05  Ville Voutilainen  <ville.voutilai...@gmail.com>

    PR c++/64489
    * g++.dg/ext/is_trivially_constructible1.C: Add tests for trivially
    copyable classes that contain const members and reference members.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 07bbc69..421dae3 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -3606,13 +3606,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);
@@ -3714,13 +3716,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));

Reply via email to