@@ -97,8 +97,8 @@ static bool IsFieldOfVectorElem(const clang::MemberExpr *expr) {
9797}
9898
9999static bool IsPointerType (clang::ASTContext &ctx, clang::QualType type) {
100- return type->isPointerType () || GetStrongestIteratorCategory (ctx, type) ==
101- IteratorCategory::Contiguous ;
100+ return type->isPointerType () ||
101+ RuleRegistry::MapsToRefcountPointer (ctx, type) ;
102102}
103103
104104void ConverterRefCount::PendingDeref::set (std::string str, bool fresh) {
@@ -2848,12 +2848,6 @@ bool ConverterRefCount::ConvertCXXOperatorCallExpr(
28482848 break ;
28492849 }
28502850
2851- if (GetStrongestIteratorCategory (ctx_, expr->getArg (0 )->getType ()) ==
2852- IteratorCategory::Bidirectional) {
2853- Convert (expr->getArg (0 ));
2854- break ;
2855- }
2856-
28572851 {
28582852 bool deref = !isAddrOf ();
28592853 PushParen paren (*this , deref);
@@ -3314,7 +3308,8 @@ void ConverterRefCount::ConvertArrow(clang::Expr *expr) {
33143308 bool is_overloaded_arrow =
33153309 op && op->getOperator () == clang::OverloadedOperatorKind::OO_Arrow;
33163310
3317- if (!is_overloaded_arrow || IsUserOperatorCall (op)) {
3311+ if (!is_overloaded_arrow || IsUserOperatorCall (op) ||
3312+ RuleRegistry::ReturnsPointer (ctx_, expr)) {
33183313 auto pointee_type = expr->getType ()->getPointeeType ();
33193314 // Virtual methods, which take &mut self, are called through PtrDyn.
33203315 if (auto *record = pointee_type->getAsRecordDecl ();
@@ -3333,12 +3328,6 @@ void ConverterRefCount::ConvertArrow(clang::Expr *expr) {
33333328 return ;
33343329 }
33353330
3336- if (GetStrongestIteratorCategory (ctx_, op->getArg (0 )->getType ()) ==
3337- IteratorCategory::Bidirectional) {
3338- Convert (op->getArg (0 ));
3339- return ;
3340- }
3341-
33423331 Convert (expr);
33433332}
33443333
@@ -3348,12 +3337,6 @@ std::string ConverterRefCount::AccessLValueObject(clang::MemberExpr *member) {
33483337
33493338 bool is_mut = method && !method->isConst ();
33503339 if (member->isArrow ()) {
3351- auto *op =
3352- clang::dyn_cast<clang::CXXOperatorCallExpr>(object->IgnoreImplicit ());
3353- if (op && GetStrongestIteratorCategory (ctx_, op->getArg (0 )->getType ()) ==
3354- IteratorCategory::Bidirectional) {
3355- return ConvertRValue (op->getArg (0 ));
3356- }
33573340 auto str = is_mut ? ConvertLValue (object) : ConvertRValue (object);
33583341 auto pointee_type = object->getType ()->getPointeeType ();
33593342 return DerefPtrExpr (str, pointee_type);
0 commit comments