aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2003-12-23 09:02:12 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2003-12-23 09:02:12 +0000
commit5d027e7b0312df4d691c9e5fb90020e41a034af9 (patch)
treeae015fce692d5b02e73ddf17575b92ccb278820c
parent4b8a63d6c27da50c38587c25f6c2211047648d62 (diff)
downloadgcc-5d027e7b0312df4d691c9e5fb90020e41a034af9.zip
gcc-5d027e7b0312df4d691c9e5fb90020e41a034af9.tar.gz
gcc-5d027e7b0312df4d691c9e5fb90020e41a034af9.tar.bz2
re PR c++/13387 (assignment to base class corrupts subclass)
PR c++/13387 * cp-lang.c (cxx_get_alias_set): Correct logic for a base type. From-SVN: r74968
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cp-lang.c5
2 files changed, 8 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9e39313..69cbbed 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2003-12-23 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/13387
+ * cp-lang.c (cxx_get_alias_set): Correct logic for a base type.
+
2003-12-22 Mark Mitchell <mark@codesourcery.com>
* decl.c (start_function): Do not check
diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c
index d9959e0..94cf462 100644
--- a/gcc/cp/cp-lang.c
+++ b/gcc/cp/cp-lang.c
@@ -292,11 +292,12 @@ ok_to_generate_alias_set_for_type (tree t)
static HOST_WIDE_INT
cxx_get_alias_set (tree t)
{
- if (CLASS_TYPE_P (t) && TYPE_CONTEXT (t) && CLASS_TYPE_P (TYPE_CONTEXT (t))
+ if (TREE_CODE (t) == RECORD_TYPE
+ && TYPE_CONTEXT (t) && CLASS_TYPE_P (TYPE_CONTEXT (t))
&& CLASSTYPE_AS_BASE (TYPE_CONTEXT (t)) == t)
/* The base variant of a type must be in the same alias set as the
complete type. */
- t = TYPE_CONTEXT (t);
+ return get_alias_set (TYPE_CONTEXT (t));
if (/* It's not yet safe to use alias sets for some classes in C++. */
!ok_to_generate_alias_set_for_type (t)