From 864822bd8880db5e75398a2e409dccb7545418ef Mon Sep 17 00:00:00 2001 From: Ville Voutilainen Date: Tue, 6 Jan 2015 22:44:32 +0200 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 ++++ gcc/cp/class.c | 32 +++++++++++-------- .../g++.dg/ext/is_trivially_constructible1.C | 5 +++ 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 004629b8848..9c0159f812b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-01-06 Ville Voutilainen + + PR c++/64489 + * class.c (check_field_decls): Make copy assignment operators + complex only in c++98 mode. + 2015-01-05 Trevor Saunders PR c++/31397 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index b798a52702f..2153a73241a 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 c8663739e7d..a5bac7b482e 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));