File tree Expand file tree Collapse file tree 2 files changed +37
-0
lines changed
lib/StaticAnalyzer/Checkers/WebKit
test/Analysis/Checkers/WebKit Expand file tree Collapse file tree 2 files changed +37
-0
lines changed Original file line number Diff line number Diff line change @@ -165,6 +165,14 @@ bool tryToFindPtrOrigin(
165165 if (isSingleton (E->getFoundDecl ()))
166166 return callback (E, true );
167167 }
168+
169+ if (auto *MemberExpr = dyn_cast<CXXDependentScopeMemberExpr>(CalleeE)) {
170+ auto *Base = MemberExpr->getBase ();
171+ auto MemberName = MemberExpr->getMember ().getAsString ();
172+ bool IsGetter = MemberName == " get" || MemberName == " ptr" ;
173+ if (Base && isSafePtrType (Base->getType ()) && IsGetter)
174+ return callback (E, true );
175+ }
168176 }
169177
170178 // Sometimes, canonical type erroneously turns Ref<T> into T.
Original file line number Diff line number Diff line change @@ -561,6 +561,35 @@ void foo() {
561561
562562} // namespace ns_retained_return_value
563563
564+ namespace template_function {
565+
566+ class Base {
567+ public:
568+ virtual ~Base () = default ;
569+ void send (dispatch_queue_t ) const ;
570+ void ref () const ;
571+ void deref () const ;
572+ };
573+
574+ template <typename Traits>
575+ class Derived : public Base {
576+ public:
577+ virtual ~Derived () = default ;
578+
579+ void send (typename Traits::MessageType) const ;
580+
581+ virtual OSObjectPtr<dispatch_queue_t > msg (typename Traits::MessageType) const = 0;
582+ };
583+
584+ template <typename Traits>
585+ void Derived<Traits>::send(typename Traits::MessageType messageType) const
586+ {
587+ OSObjectPtr dictionary = msg (messageType);
588+ Base::send (dictionary.get ());
589+ }
590+
591+ } // namespace template_function
592+
564593@interface TestObject : NSObject
565594- (void )doWork : (NSString *)msg , ...;
566595- (void )doWorkOnSelf ;
You can’t perform that action at this time.
0 commit comments