diff options
author | Nathan Sidwell <nathan@acm.org> | 2020-07-22 08:27:30 -0700 |
---|---|---|
committer | Nathan Sidwell <nathan@acm.org> | 2020-07-22 08:43:25 -0700 |
commit | 5324a3e621d9a2eec6addcc439c4adb1befa8ea9 (patch) | |
tree | e6113143051035c7b04d772f262e5f3f956236c5 /gcc | |
parent | 0f32c94fc72313798b3a9033c92ceb34f7b7febc (diff) | |
download | gcc-5324a3e621d9a2eec6addcc439c4adb1befa8ea9.zip gcc-5324a3e621d9a2eec6addcc439c4adb1befa8ea9.tar.gz gcc-5324a3e621d9a2eec6addcc439c4adb1befa8ea9.tar.bz2 |
c++: structural_comptypes addition
I had to debug structural_comptypes, and its complex if conditions and
tail calling of same_type_p made that hard. I'd hope we can turn the
eqivalent of return boolean_fn () ? true : false; into a tail call of
the boolean. We also were not dealing with TYPEOF_TYPE.
gcc/cp/
* typeck.c (structural_comptypes): [DECLTYPE_TYPE] break
apart complex if.
[UNDERLYING_TYPE]: Use an if.
[TYPEOF_TYPE]: New.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/typeck.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 589e014..adc088c 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -1452,19 +1452,25 @@ structural_comptypes (tree t1, tree t2, int strict) case DECLTYPE_TYPE: if (DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t1) - != DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t2) - || (DECLTYPE_FOR_LAMBDA_CAPTURE (t1) - != DECLTYPE_FOR_LAMBDA_CAPTURE (t2)) - || (DECLTYPE_FOR_LAMBDA_PROXY (t1) - != DECLTYPE_FOR_LAMBDA_PROXY (t2)) - || !cp_tree_equal (DECLTYPE_TYPE_EXPR (t1), - DECLTYPE_TYPE_EXPR (t2))) + != DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t2)) + return false; + if (DECLTYPE_FOR_LAMBDA_CAPTURE (t1) != DECLTYPE_FOR_LAMBDA_CAPTURE (t2)) + return false; + if (DECLTYPE_FOR_LAMBDA_PROXY (t1) != DECLTYPE_FOR_LAMBDA_PROXY (t2)) + return false; + if (!cp_tree_equal (DECLTYPE_TYPE_EXPR (t1), DECLTYPE_TYPE_EXPR (t2))) return false; break; case UNDERLYING_TYPE: - return same_type_p (UNDERLYING_TYPE_TYPE (t1), - UNDERLYING_TYPE_TYPE (t2)); + if (!same_type_p (UNDERLYING_TYPE_TYPE (t1), UNDERLYING_TYPE_TYPE (t2))) + return false; + break; + + case TYPEOF_TYPE: + if (!cp_tree_equal (TYPEOF_TYPE_EXPR (t1), TYPEOF_TYPE_EXPR (t2))) + return false; + break; default: return false; |