diff options
Diffstat (limited to 'gcc/objc')
-rw-r--r-- | gcc/objc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/objc/objc-act.c | 16 |
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index b3647d99..0759c8d 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,9 @@ +2007-01-02 Douglas Gregor <doug.gregor@gmail.com> + + * objc-act.c (objc_build_volatilized_type): Keep track of + canonical types. + (objc_get_protocol_qualified_type): Ditto. + 2006-11-02 Andreas Tobler <a.tobler@schweiz.org> * objc-act.c (objc_finish_file): Remove ifdef clause for OBJCPLUS and diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index d0c3447..bd79796 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -908,6 +908,14 @@ objc_build_volatilized_type (tree type) t = build_variant_type_copy (type); TYPE_VOLATILE (t) = 1; + /* Set up the canonical type information. */ + if (TYPE_STRUCTURAL_EQUALITY_P (type)) + SET_TYPE_STRUCTURAL_EQUALITY (t); + else if (TYPE_CANONICAL (type) != type) + TYPE_CANONICAL (t) = objc_build_volatilized_type (TYPE_CANONICAL (type)); + else + TYPE_CANONICAL (t) = t; + return t; } @@ -1370,7 +1378,13 @@ objc_get_protocol_qualified_type (tree interface, tree protocols) to the pointee. */ if (is_ptr) { - TREE_TYPE (type) = build_variant_type_copy (TREE_TYPE (type)); + tree orig_pointee_type = TREE_TYPE (type); + TREE_TYPE (type) = build_variant_type_copy (orig_pointee_type); + + /* Set up the canonical type information. */ + TYPE_CANONICAL (type) + = TYPE_CANONICAL (TYPE_POINTER_TO (orig_pointee_type)); + TYPE_POINTER_TO (TREE_TYPE (type)) = type; type = TREE_TYPE (type); } |