diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2000-11-30 16:51:54 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2000-11-30 16:51:54 +0000 |
commit | 31b1b95769d40692822b6516545827e781b28a7b (patch) | |
tree | 446d4fb260622f5bf21fc136f96641455eac063d | |
parent | 039df8c7c71068e2ace9d1f8e8b26b8413b8c271 (diff) | |
download | gcc-31b1b95769d40692822b6516545827e781b28a7b.zip gcc-31b1b95769d40692822b6516545827e781b28a7b.tar.gz gcc-31b1b95769d40692822b6516545827e781b28a7b.tar.bz2 |
method.c (do_build_copy_constructor): Preserve cv qualifications when accessing source object members.
cp:
* method.c (do_build_copy_constructor): Preserve cv
qualifications when accessing source object members.
(do_build_assign_ref): Likewise. Remove separate diagnostics for
unnamed fields.
testsuite:
* g++.old-deja/g++.other/op3.C: New test.
From-SVN: r37896
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/method.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.other/op3.C | 63 |
4 files changed, 85 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3fbdf3d..8c3934f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2000-11-30 Nathan Sidwell <nathan@codesourcery.com> + * method.c (do_build_copy_constructor): Preserve cv + qualifications when accessing source object members. + (do_build_assign_ref): Likewise. Remove separate diagnostics for + unnamed fields. + +2000-11-30 Nathan Sidwell <nathan@codesourcery.com> + * method.c (do_build_assign_ref): Construct appropriately CV-qualified base reference. Don't allow const casts in base conversion. diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 896656d..4f2e58d 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -2341,6 +2341,7 @@ do_build_copy_constructor (fndecl) tree binfos = TYPE_BINFO_BASETYPES (current_class_type); tree member_init_list = NULL_TREE; tree base_init_list = NULL_TREE; + int cvquals = CP_TYPE_QUALS (TREE_TYPE (parm)); int i; /* Initialize all the base-classes. */ @@ -2387,7 +2388,9 @@ do_build_copy_constructor (fndecl) else continue; - init = build (COMPONENT_REF, TREE_TYPE (field), init, field); + init = build (COMPONENT_REF, + build_qualified_type (TREE_TYPE (field), cvquals), + init, field); init = build_tree_list (NULL_TREE, init); member_init_list @@ -2423,13 +2426,13 @@ do_build_assign_ref (fndecl) tree fields = TYPE_FIELDS (current_class_type); int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type); tree binfos = TYPE_BINFO_BASETYPES (current_class_type); + int cvquals = CP_TYPE_QUALS (TREE_TYPE (parm)); int i; for (i = 0; i < n_bases; ++i) { tree basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i)); - tree p = build_qualified_type - (basetype, CP_TYPE_QUALS (TREE_TYPE (parm))); + tree p = build_qualified_type (basetype, cvquals); p = convert_to_reference (build_reference_type (p), parm, @@ -2449,18 +2452,12 @@ do_build_assign_ref (fndecl) if (CP_TYPE_CONST_P (TREE_TYPE (field))) { - if (DECL_NAME (field)) - cp_error ("non-static const member `%#D', can't use default assignment operator", field); - else - cp_error ("non-static const member in type `%T', can't use default assignment operator", current_class_type); + cp_error ("non-static const member `%#D', can't use default assignment operator", field); continue; } else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE) { - if (DECL_NAME (field)) - cp_error ("non-static reference member `%#D', can't use default assignment operator", field); - else - cp_error ("non-static reference member in type `%T', can't use default assignment operator", current_class_type); + cp_error ("non-static reference member `%#D', can't use default assignment operator", field); continue; } @@ -2487,7 +2484,9 @@ do_build_assign_ref (fndecl) continue; comp = build (COMPONENT_REF, TREE_TYPE (field), comp, field); - init = build (COMPONENT_REF, TREE_TYPE (field), init, field); + init = build (COMPONENT_REF, + build_qualified_type (TREE_TYPE (field), cvquals), + init, field); finish_expr_stmt (build_modify_expr (comp, NOP_EXPR, init)); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dae0f95..ca0fc26 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,9 @@ 2000-11-30 Nathan Sidwell <nathan@codesourcery.com> + * g++.old-deja/g++.other/op3.C: New test. + +2000-11-30 Nathan Sidwell <nathan@codesourcery.com> + * g++.old-deja/g++.other/op2.C: New test. 2000-11-30 Nathan Sidwell <nathan@codesourcery.com> diff --git a/gcc/testsuite/g++.old-deja/g++.other/op3.C b/gcc/testsuite/g++.old-deja/g++.other/op3.C new file mode 100644 index 0000000..957b4d3 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/op3.C @@ -0,0 +1,63 @@ +// Copyright (C) 2000 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 28 Nov 2000 <nathan@codesourcery.com> + +// Related to bug 91. We'd not preserve constness accessing a member of the +// source type in copy ctor and assignment op. + +#include <stdio.h> + +int glob = 0; + +struct A +{ + A() {} + + A( A& arg) + { printf ("%s\n", __PRETTY_FUNCTION__); glob = 1;} + + A( const A& arg) + { printf ("%s\n", __PRETTY_FUNCTION__); glob = 2;} + + A& operator=( A& ) + { printf ("%s\n", __PRETTY_FUNCTION__); glob = 3; return *this; } + + A& operator=( const A& ) + { printf ("%s\n", __PRETTY_FUNCTION__); glob = 4; return *this; } +}; + +struct B +{ + A a; + B () {} +}; + +void foo( A& ) +{ + printf ("%s\n", __PRETTY_FUNCTION__); glob = 5; +} + +void foo( const A& ) +{ + printf ("%s\n", __PRETTY_FUNCTION__); glob = 6; +} + +int main() +{ + const A a0; + glob = 0; printf ("A(cA) : "); A a1(a0); if (glob != 2) return 1; + glob = 0; printf ("A(A ) : "); A a2(a1); if (glob != 1) return 2; + + const B b0; + glob = 0; printf ("B(cB) : "); B b1(b0); if (glob != 2) return 3; + glob = 0; printf ("B(B ) : "); B b2(b1); if (glob != 2) return 4; + + glob = 0; printf ("A= cA : "); a1 = a0; if (glob != 4) return 5; + glob = 0; printf ("A= A : "); a1 = a2; if (glob != 3) return 6; + glob = 0; printf ("B= cB : "); b1 = b0; if (glob != 4) return 7; + glob = 0; printf ("B= B : "); b1 = b2; if (glob != 4) return 8; + + glob = 0; printf ("foo(cB): "); foo(b0.a); if (glob != 6) return 9; + glob = 0; printf ("foo(B ): "); foo(b2.a); if (glob != 5) return 10; + + return 0; +} |