diff options
author | Nathan Froyd <froydnj@codesourcery.com> | 2011-05-20 19:57:52 +0000 |
---|---|---|
committer | Nathan Froyd <froydnj@gcc.gnu.org> | 2011-05-20 19:57:52 +0000 |
commit | 769b55b24fa8db8cbe084203d2ed4354bbb6b060 (patch) | |
tree | 81929bef88ad47d8accd79f31dc83c413380fe1a /gcc/objc/objc-act.c | |
parent | e6450c11b26d746328554ba8041577e173fad8f1 (diff) | |
download | gcc-769b55b24fa8db8cbe084203d2ed4354bbb6b060.zip gcc-769b55b24fa8db8cbe084203d2ed4354bbb6b060.tar.gz gcc-769b55b24fa8db8cbe084203d2ed4354bbb6b060.tar.bz2 |
remove some TYPE_ARG_TYPES usage in objc/
remove some TYPE_ARG_TYPES usage in objc/
* objc-act.c (objc_compare_types): Use function_args_iterator
instead of TYPE_ARG_TYPES to compare function argument types.
From-SVN: r173977
Diffstat (limited to 'gcc/objc/objc-act.c')
-rw-r--r-- | gcc/objc/objc-act.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 7e69b0d..0e15fe5 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -2420,6 +2420,8 @@ objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee) lenient than C or C++ on this. */ if (TREE_CODE (ltyp) == FUNCTION_TYPE && TREE_CODE (rtyp) == FUNCTION_TYPE) { + function_args_iterator liter, riter; + /* Return types must be covariant. */ if (!comptypes (TREE_TYPE (ltyp), TREE_TYPE (rtyp)) && !objc_compare_types (TREE_TYPE (ltyp), TREE_TYPE (rtyp), @@ -2427,16 +2429,31 @@ objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee) return false; /* Argument types must be contravariant. */ - for (ltyp = TYPE_ARG_TYPES (ltyp), rtyp = TYPE_ARG_TYPES (rtyp); - ltyp && rtyp; ltyp = TREE_CHAIN (ltyp), rtyp = TREE_CHAIN (rtyp)) + function_args_iter_init (&liter, ltyp); + function_args_iter_init (&riter, rtyp); + + while (1) { - if (!comptypes (TREE_VALUE (rtyp), TREE_VALUE (ltyp)) - && !objc_compare_types (TREE_VALUE (rtyp), TREE_VALUE (ltyp), - argno, callee)) + ltyp = function_args_iter_cond (&liter); + rtyp = function_args_iter_cond (&riter); + + /* If we've exhaused both lists simulateously, we're done. */ + if (ltyp == NULL_TREE && rtyp == NULL_TREE) + break; + + /* If one list is shorter than the other, they fail to match. */ + if (ltyp == NULL_TREE || rtyp == NULL_TREE) return false; - } - return (ltyp == rtyp); + if (!comptypes (rtyp, ltyp) + && !objc_compare_types (rtyp, ltyp, argno, callee)) + return false; + + function_args_iter_next (&liter); + function_args_iter_next (&riter); + } + + return true; } /* Past this point, we are only interested in ObjC class instances, |