diff options
author | zlaski <zlaski@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-07-01 01:44:12 +0000 |
---|---|---|
committer | zlaski <zlaski@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-07-01 01:44:12 +0000 |
commit | 4dfa7ebc6f20f3a753a6da36efaada673ec23523 (patch) | |
tree | 7f58bf31af2f4788ebcce144ba3eb984936a0960 /gcc/objc | |
parent | f27cea3abf8ded22456f5f46a812cc3915969815 (diff) | |
download | gcc-4dfa7ebc6f20f3a753a6da36efaada673ec23523.tar.gz |
[gcc/objc/ChangeLog]
2005-06-30 Ziemowit Laski <zlaski@apple.com>
* objc-act.c (objc_build_volatilized_type): New function.
(objc_volatilize_decl): Call objc_build_volatilized_type()
instead of build_qualified_type().
[gcc/testsuite/ChangeLog]
2005-06-30 Ziemowit Laski <zlaski@apple.com>
* obj-c++.dg/try-catch-11.mm: New.
* objc.dg/try-catch-10.m: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101493 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/objc')
-rw-r--r-- | gcc/objc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/objc/objc-act.c | 39 |
2 files changed, 43 insertions, 2 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index a11966ea7af..6963c53160a 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,9 @@ +2005-06-30 Ziemowit Laski <zlaski@apple.com> + + * objc-act.c (objc_build_volatilized_type): New function. + (objc_volatilize_decl): Call objc_build_volatilized_type() + instead of build_qualified_type(). + 2005-06-29 Ziemowit Laski <zlaski@apple.com> * objc-act.c (objc_build_internal_const_str_type): New function. diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index b522b8ddba6..e44f8b0fbd9 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -185,6 +185,7 @@ static tree build_protocol_initializer (tree, tree, tree, tree, tree); static tree get_class_ivars (tree, bool); static tree generate_protocol_list (tree); static void build_protocol_reference (tree); +static tree objc_build_volatilized_type (tree); #ifdef OBJCPLUS static void objc_generate_cxx_cdtors (void); @@ -868,6 +869,41 @@ objc_build_struct (tree name, tree fields, tree super_name) return s; } +/* Build a type differing from TYPE only in that TYPE_VOLATILE is set. + Unlike tree.c:build_qualified_type(), preserve TYPE_LANG_SPECIFIC in the + process. */ +static tree +objc_build_volatilized_type (tree type) +{ + tree t; + + /* Check if we have not constructed the desired variant already. */ + for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t)) + { + /* The type qualifiers must (obviously) match up. */ + if (!TYPE_VOLATILE (t) + || (TYPE_READONLY (t) != TYPE_READONLY (type)) + || (TYPE_RESTRICT (t) != TYPE_RESTRICT (type))) + continue; + + /* For pointer types, the pointees (and hence their TYPE_LANG_SPECIFIC + info, if any) must match up. */ + if (POINTER_TYPE_P (t) + && (TREE_TYPE (t) != TREE_TYPE (type))) + continue; + + /* Everything matches up! */ + return t; + } + + /* Ok, we could not re-use any of the pre-existing variants. Create + a new one. */ + t = build_variant_type_copy (type); + TYPE_VOLATILE (t) = 1; + + return t; +} + /* Mark DECL as being 'volatile' for purposes of Darwin _setjmp()/_longjmp() exception handling. Called from objc_mark_locals_volatile(). */ @@ -884,8 +920,7 @@ objc_volatilize_decl (tree decl) struct volatilized_type key; void **loc; - t = build_qualified_type (t, (TYPE_QUALS (t) - | TYPE_QUAL_VOLATILE)); + t = objc_build_volatilized_type (t); key.type = t; loc = htab_find_slot (volatilized_htab, &key, INSERT); |