aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2020-07-22 08:27:30 -0700
committerNathan Sidwell <nathan@acm.org>2020-07-22 08:43:25 -0700
commit5324a3e621d9a2eec6addcc439c4adb1befa8ea9 (patch)
treee6113143051035c7b04d772f262e5f3f956236c5
parent0f32c94fc72313798b3a9033c92ceb34f7b7febc (diff)
downloadgcc-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.
-rw-r--r--gcc/cp/typeck.c24
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;