Closed Bug 221316 Opened 22 years ago Closed 22 years ago

nsCOMPtr operator== doesn't handle multiple inheritance correctly

Categories

(Core :: XPCOM, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: bryner, Assigned: bryner)

Details

Attachments

(1 file)

Here's an example: class Foo : public nsIFoo, public nsIBar { ... }; void Foo::someFunction() { nsCOMPtr<nsIBar> ptr(this); if (ptr == this) { ... } } The comparison will return false because nsCOMPtr casts both arguments to void*.
Attachment #132696 - Flags: superreview?(darin)
Attachment #132696 - Flags: review?(dbaron)
Comment on attachment 132696 [details] [diff] [review] fix suggested by dbaron Looks fine to me, except that for the last for I'd rather skip the NS_CONST_CASTs and leave them un-cast.
Attachment #132696 - Flags: review?(dbaron) → review+
Comment on attachment 132696 [details] [diff] [review] fix suggested by dbaron sr=darin with the same comment as dbaron. i think the code would be clearer without the unnecessary NS_CONST_CAST expressions.
Attachment #132696 - Flags: superreview?(darin) → superreview+
Actually, I take that back. Leave the NS_CONST_CASTs. They might help some compilers when converting arguments.
Comment on attachment 132696 [details] [diff] [review] fix suggested by dbaron >@@ -1216,7 +1216,7 @@ inline > NSCAP_BOOL > operator==( U* lhs, const nsCOMPtr<T>& rhs ) > { >- return NS_STATIC_CAST(void*, lhs) == NS_STATIC_CAST(const void*, rhs.get()); >+ return NS_CONST_CAST(U*, lhs) == NS_STATIC_CAST(const T*, rhs.get()); > } > And fix this one so it casts to |const U*|. :-)
This change breaks MipsPro (7.4.1) on IRIX: cc-1042 CC: ERROR File = ../../../../dist/include/xpcom/nsCOMPtr.h, Line = 1211 The types of operands "const nsIHTMLCSSStyleSheet *" and "const nsDerivedSafe<nsIStyleSheet> *" are incompatible. return NS_STATIC_CAST(const T*, lhs.get()) == NS_CONST_CAST(const U*, rhs); ^ detected during instantiation of "NSCAP_BOOL operator==(const nsCOMPtr<nsIHTMLCSSStyleSheet> &, nsDerivedSafe<nsIStyleSheet> *)" at line 782 of "/build2/tinderbox/mozilla/build/IRIX_6.5_Depend/mozilla/co ntent/xml/document/src/nsXMLDocument.cpp" cc-1042 CC: ERROR File = ../../../../dist/include/xpcom/nsCOMPtr.h, Line = 1211 The types of operands "const nsIHTMLStyleSheet *" and "const nsDerivedSafe<nsIStyleSheet> *" are incompatible. return NS_STATIC_CAST(const T*, lhs.get()) == NS_CONST_CAST(const U*, rhs); ^ detected during instantiation of "NSCAP_BOOL operator==(const nsCOMPtr<nsIHTMLStyleSheet> &, nsDerivedSafe<nsIStyleSheet> *)" at line 835 of "/build2/tinderbox/mozilla/build/IRIX_6.5_Depend/mozilla/co ntent/xml/document/src/nsXMLDocument.cpp"
That's been fixed. Look at tinderbox. And see also bug 221525.
Great, thanks :-)
checked in, and I think we got the bustage under control.
Status: NEW → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: