-
Notifications
You must be signed in to change notification settings - Fork 79
Revert trivial impl of Borrow<str> for Atom #272
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
With the additional let chrome = CANIUSE_BROWSERS.get("chrome").unwrap(); without a conversion to |
But I noticed that we actually have to revert this for correctness reasons which we oversaw in the original PR: impl<Static: StaticAtomSet> Hash for Atom<Static> {
#[inline]
fn hash<H>(&self, state: &mut H)
where
H: Hasher,
{
state.write_u32(self.get_hash())
}
} without actually hashing the contents as |
Right, I get that with the additional - impl<Static> Borrow<str> for Atom<Static>
where Static: StaticAtomSet;
- impl<T> Borrow<T> for T
where T: ?Sized; According to expression precedence, What am I missing :(
Ha, the example in the Borrow doc is for exactly this scenario. |
@bors-servo r+ |
📌 Commit 9c7b0aa has been approved by |
Revert trivial impl of Borrow<str> for Atom #266 caused a breaking change (see #271) in 0.8.5 (which was yanked). This PR fixes #271 / will allow publishing new versions (so #268 can make it out). I've just started learning Rust, haven't been able to 100% wrap my head around the issue. The breaking change manifesting in the "browserlist-rs" crate: ```rust error[E0283]: type annotations needed --> {.. snip ..}\browserslist-rs-0.12.3\src\data\caniuse.rs:91:35 | 91 | let chrome = CANIUSE_BROWSERS.get(&"chrome".into()).unwrap(); | ^^^ ---------------- type must be known at this point | | | cannot infer type of the type parameter `Q` declared on the associated function `get` | = note: multiple `impl`s satisfying `Atom<BrowserNameAtomStaticSet>: Borrow<_>` found in the following crates: `core`, `string_cache`: - impl<Static> Borrow<str> for Atom<Static> where Static: StaticAtomSet; - impl<T> Borrow<T> for T where T: ?Sized; note: required by a bound in `AHashMap::<K, V, S>::get` --> {.. snip ..}\ahash-0.7.6\src\hash_map.rs:81:12 | 81 | K: Borrow<Q>, | ^^^^^^^^^ required by this bound in `AHashMap::<K, V, S>::get` help: consider specifying the generic argument | 91 | let chrome = CANIUSE_BROWSERS.get::<Q>(&"chrome".into()).unwrap(); | +++++ ``` `CANIUSE_BROWSERS` is a ```rust AHashMap<BrowserNameAtom, BrowserStat> ``` where `BrowserNameAtom` is an Atom generated with `string_cache_codegen`. The signature of the `get` function: ```rust pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V> where K: Borrow<Q>, Q: Hash + Eq, { self.0.get(k) } ``` `K` is the generic key type for the hash map. This is the exact same signature as the std lib HashMap, to which it delegates. When I debug 0.8.4 usage locally, the `From` that gets used for the `into()` is ```rust impl<'a, Static: StaticAtomSet> From<&'a str> for Atom<Static> { #[inline] fn from(string_to_add: &str) -> Self { Atom::from(Cow::Borrowed(string_to_add)) } } ``` It isn't clear to me how the `Borrow<str>` impl that was added "competes" with the std lib's implementation here. It doesn't seem relevant?
💔 Test failed - checks-github |
@bors-servo r+ |
📌 Commit 4e45fde has been approved by |
☀️ Test successful - checks-github |
Can we publish a new version? |
Publish 0.8.6. The breaking change was reverted in #272.
#266 caused a breaking change (see #271) in 0.8.5 (which was yanked).
This PR fixes #271 / will allow publishing new versions (so #268 can make it out).
I've just started learning Rust, haven't been able to 100% wrap my head around the issue.
The breaking change manifesting in the "browserlist-rs" crate:
CANIUSE_BROWSERS
is awhere
BrowserNameAtom
is an Atom generated withstring_cache_codegen
.The signature of the
get
function:K
is the generic key type for the hash map.This is the exact same signature as the std lib HashMap, to which it delegates.
When I debug 0.8.4 usage locally, the
From
that gets used for theinto()
isIt isn't clear to me how the
Borrow<str>
impl that was added "competes" with the std lib's implementation here.It doesn't seem relevant?