Skip to content

Commit

Permalink
Merge remote-tracking branch 'arielb1/raw-pointer-comparisons'
Browse files Browse the repository at this point in the history
  • Loading branch information
nikomatsakis committed Sep 4, 2015
2 parents 10c39c4 + c16c332 commit b992000
Showing 1 changed file with 58 additions and 0 deletions.
58 changes: 58 additions & 0 deletions text/0000-raw-pointer-comparisons.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
- Feature Name: raw-pointer-comparisons
- Start Date: 2015-05-27
- RFC PR: (leave this empty)
- Rust Issue: (leave this empty)

# Summary

Allow equality, but not order, comparisons between fat raw pointers
of the same type.

# Motivation

Currently, fat raw pointers can't be compared via either PartialEq or
PartialOrd (currently this causes an ICE). It seems to me that a primitive
type like a fat raw pointer should implement equality in some way.

However, there doesn't seem to be a sensible way to order raw fat pointers
unless we take vtable addresses into account, which is relatively weird.

# Detailed design

Implement PartialEq/Eq for fat raw pointers, defined as comparing both the
unsize-info and the address. This means that these are true:

```Rust
&s as &fmt::Debug as *const _ == &s as &fmt::Debug as *const _ // of course
&s.first_field as &fmt::Debug as *const _
!= &s as &fmt::Debug as *const _ // these are *different* (one
// prints only the first field,
// the other prints all fields).
```

But
```Rust
&s.first_field as &fmt::Debug as *const _ as *const () ==
&s as &fmt::Debug as *const _ as *const () // addresses are equal
```

# Drawbacks

Order comparisons may be useful for putting fat raw pointers into
ordering-based data structures (e.g. BinaryTree).

# Alternatives

@nrc suggested to implement heterogeneous comparisons between all thin
raw pointers and all fat raw pointers. I don't like this because equality
between fat raw pointers of different traits is false most of the
time (unless one of the traits is a supertrait of the other and/or the
only difference is in free lifetimes), and anyway you can always compare
by casting both pointers to a common type.

It is also possible to implement ordering too, either in unsize -> addr
lexicographic order or addr -> unsize lexicographic order.

# Unresolved questions

See Alternatives.

0 comments on commit b992000

Please sign in to comment.