diff options
author | dgregor <dgregor@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-04-12 11:47:56 +0000 |
---|---|---|
committer | dgregor <dgregor@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-04-12 11:47:56 +0000 |
commit | 5bfe6313be46eb5f3355345dddb5df965cb28104 (patch) | |
tree | 88963ed1125aa1dd825676f3893fc6db6c464dd5 /gcc/c-common.c | |
parent | a128a28fc63546687581d693ab90296646823661 (diff) | |
download | gcc-5bfe6313be46eb5f3355345dddb5df965cb28104.tar.gz |
2007-04-12 Douglas Gregor <doug.gregor@gmail.com>
PR c++/31078
PR c++/31103
* c-common.c (c_build_qualified_type): Set canonical type
appropriately.
2007-04-12 Douglas Gregor <doug.gregor@gmail.com>
PR c++/31078
* g++.dg/other/pr31078.C: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123740 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/c-common.c')
-rw-r--r-- | gcc/c-common.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/c-common.c b/gcc/c-common.c index 8f71e6916ed..761a9b44acf 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -2894,8 +2894,26 @@ c_build_qualified_type (tree type, int type_quals) } if (!t) { + tree domain = TYPE_DOMAIN (type); + t = build_variant_type_copy (type); TREE_TYPE (t) = element_type; + + if (TYPE_STRUCTURAL_EQUALITY_P (element_type) + || (domain && TYPE_STRUCTURAL_EQUALITY_P (domain))) + SET_TYPE_STRUCTURAL_EQUALITY (t); + else if (TYPE_CANONICAL (element_type) != element_type + || (domain && TYPE_CANONICAL (domain) != domain)) + { + tree unqualified_canon + = build_array_type (TYPE_CANONICAL (element_type), + domain? TYPE_CANONICAL (domain) + : NULL_TREE); + TYPE_CANONICAL (t) + = c_build_qualified_type (unqualified_canon, type_quals); + } + else + TYPE_CANONICAL (t) = t; } return t; } |