It's a relatively simple question (though maybe with not so simple answer), mainly out of curiosity and desire to understand intrinsincs better.
We have several types which are Send but not Sync (this is, for example, every Cell-like struct). Reasoning is easy to understand: when the type has interior mutability, we must be sure that we mutate it from one place only, but this place can be everywhere as long as it is singular.
But is there any case where the opposite would be sound - i.e., type is Sync and not Send? Seems that this will mean that it must have exactly one owner (some complex cloning semantics, like Rc?), but can have concurrent borrowers. I can't imagine this for now, but maybe someone has encountered this already?
Here's a concrete example using the "thread local storage in Drop" use case: OpenSpan<Attached>.The crate tracks the current tracing context in thread local storage and restores the previous on drop, so it can't be moved across threads.
It's interesting, then, that docs clearly state that Send is implemented for the struct, but description text says otherwise, and source code also lead to conclusion that it is not Send. Bug in cargo doc or some unhandled corner case?..
Another example is structs that only have &mut self methods. An & reference to it is completely opaque, so there's no harm if it is sent to another thread.