From 4dfa7ebc6f20f3a753a6da36efaada673ec23523 Mon Sep 17 00:00:00 2001 From: zlaski Date: Fri, 1 Jul 2005 01:44:12 +0000 Subject: [gcc/objc/ChangeLog] 2005-06-30 Ziemowit Laski * 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 * 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 --- gcc/objc/ChangeLog | 6 ++++++ gcc/objc/objc-act.c | 39 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) (limited to 'gcc/objc') 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 + + * 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 * 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); -- cgit v1.2.1