Revert trivial impl of Borrow<str> for Atom#272
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_BROWSERSis awhere
BrowserNameAtomis an Atom generated withstring_cache_codegen.The signature of the
getfunction:Kis 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
Fromthat 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?