From: Ville Voutilainen Date: Tue, 6 Jan 2015 20:44:32 +0000 (+0200) Subject: re PR c++/64489 (A simple struct wrapping a const int is not trivially copyable) X-Git-Tag: releases/gcc-5.1.0~2014 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=864822bd8880db5e75398a2e409dccb7545418ef;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 004629b88489..9c0159f812bf 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 b798a52702fd..2153a73241a3 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 c8663739e7db..a5bac7b482e5 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));