Skip to content
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

Accept tuple.0.0 as tuple indexing (take 2) #71322

Merged
merged 9 commits into from
Jul 11, 2020
Merged

Conversation

petrochenkov
Copy link
Contributor

@petrochenkov petrochenkov commented Apr 19, 2020

If we expect something identifier-like when parsing a field name after ., but encounter a float token, we break that float token into parts, similarly to how we break && into & &, or << into < <, etc.

An alternative to #70420.

@rust-highfive
Copy link
Collaborator

r? @cramertj

(rust_highfive has picked a reviewer for you, use r? to override)

@rust-highfive rust-highfive added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Apr 19, 2020
@petrochenkov petrochenkov added T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-lang Relevant to the language team, which will review and decide on the PR/issue. labels Apr 19, 2020
@nikomatsakis
Copy link
Contributor

Nominating for @rust-lang/lang to discuss in upcoming meeting. (This was created at our request, see discussion in #70420.)

@CAD97
Copy link
Contributor

CAD97 commented Apr 21, 2020

(I don't know where else to put it but it felt relevant to note somewhere. You mention the possibility of only lexing decomposed floating point literals (i.e. 1.2 would be lit_int dot lit_int and not lit_float) and gluing floating point literals together in the parser. I'm taking this approach in an experimental formal lexical grammar, and it works, but is not without its fun edge cases. The most relevant is 0.0b·, where · is an XID_Continue character. Without floating point in the lexer, this naively lexes as lit_int dot lit_bin_int ERROR.)

And as a side side note: don't decompose away the e exponent of float literals or the 0b/0o/0x of non-base-10 integer literals; that way lies madness and very ugly identifier introspection.

As such, As a member of wg-grammar (but not speaking for the team), I'm somewhat wary of the impact this will have on an eventual syntactical specification. I don't think our current draft can split proc_macro tokens in the way required to implement this. However, I still think that the intent here is a net positive, and this token splitting seems like the least bad way to get this short term (i.e. before full decomposed tokens throughout).

@petrochenkov
Copy link
Contributor Author

petrochenkov commented Apr 21, 2020

@CAD97

And as a side side note: don't decompose away the e exponent of float literals or the 0b/0o/0x of non-base-10 integer literals; that way lies madness and very ugly identifier introspection.

:)
I didn't thought about splitting 0b/0o/0x, but lexically e seems to be just a integer token suffix like e.g. u8 (or any other currently invalid suffix reserved for future use).
To understand what part of 0xabcdefu8 is a suffix we need to lex until we encounter something outside of the [a-f] range. I guess that's the ugly introspection? (Hexadecimal integers will never be able to have the e suffix in this case.)

@CAD97
Copy link
Contributor

CAD97 commented Apr 21, 2020

@petrochenkov It might be easier if the entire stack is fully decomposed to treat 1e10f32 as a regular suffix. But the most annoying part for my experimental specification is that e.g. 0o0e is rejected by the lexer as an octal float, but if it were just a literal suffix, that would be accepted. Plus exponentiation is [eE][+-]?, so it can't just be handled by an integer suffix to a numeric base stem.

Treating 0[box] nondecimal integers as an integer suffix is annoying because then you have to introspect the integer token to see if it's a zero, in addition to checking the integer suffix for what looks like the rest of the literal.

I guess most of the pain comes down to the fact that 0o0e0 is rejected at the lexer level, otherwise float exponents probably could just be part of the literal suffix as far as the lexer is concerned.

In general, though, if you're doing decomposed tokens, it's really not great if you have to re-introspect tokens more granularly, except for the special case of reserved words (keywords). Eating the entire non-decimal integers and e-based floats in the raw lexer layer seems to be a lot more convenient so far. To not derail this PR further, if you want to talk about this further, you can open a thread over at the repo where I'm working on the experimental spec or message me on zulip. I'm open to being corrected 😄

@joshtriplett
Copy link
Member

Dropping nomination. Based on discussions in today's lang team meeting, we're fine with this approach, and we're happy to delegate further iteration and implementation to the compiler team.

@crlf0710
Copy link
Member

crlf0710 commented May 8, 2020

r? @estebank

@rust-highfive rust-highfive assigned estebank and unassigned cramertj May 8, 2020
@nikomatsakis
Copy link
Contributor

I would note a few things that we said in the lang team meeting but which weren't in Josh's summary, but I think they're worth noting:

  • I think this approach is clever, but it's going to push a bit of a burden onto all Rust parser implementations (e.g., syn will have to reproduce this sort of logic as well).
  • Modifying the lexer to use 'compound tokens' for floats (i.e., 1.0 produces a integer and then a dot and then another integer, with the "no whitespace" flag , or whatever scheme we wound up with for joint tokens) seems like it would've been the right approach, but it's backwards incompatible and would break existing code.
  • The approach @dtolnay used initially, I think, was to modify the lexer definition so that 0.0 lexes differently when preceded by a ., right? Or something like that? (I didn't find a very precise definition in the PR)

I guess that upon further reflection I'm not sure that putting this burden on the parser is the right call. It's going to effect our ability to make a formal grammar, and it's going to have to be replicated by all other parsers?

We could plausibly handle the backwards compatibility option by having the lexer have a flag, or by adopting the "smarter lexer" approach that I think @dtolnay originally proposed (since all proc-macros and the like would then benefit from using our lexer automatically).

I think in the end I'm comfortable with whatever approach we take, but I do think that we should

(a) have a write-up that expands on the different approaches considered
(b) summarize the pros/cons of each approach and the impacts on procedural macro authors and parser authors
(c) lays out the reason to pick one particular approach -- that's a bit what I'm missing.

As always, I don't think this has to be a treatise -- this comment is maybe a good part of the way there? But I think it'd be useful to write out the logic.

@nikomatsakis
Copy link
Contributor

Also, not to be a procedural stickler, but I am thinking that we really ought to be doing a FCP here, right? This is a visible change to the language and I think it merits a FCP to give folks a "heads up".

@petrochenkov do you think you could try a write-up like I described so I can fcp merge?

@petrochenkov
Copy link
Contributor Author

do you think you could try a write-up like I described so I can fcp merge?

Yes, probably next week.

@CAD97
Copy link
Contributor

CAD97 commented May 8, 2020

@nikomatsakis

[Using decomposed float tokens is] backwards incompatible

I don't think this is necessarily true.

Using decomposed tokens for floats in proc_macro::TokenStream or macro_rules!'s $:tt would be, but using a decomposed model for rustc_lexer and rustc_parse is not, so long as they're glued back together for the above stable APIs.

(That said: proc_macro based parsers (e.g. syn) would still have to do token splitting anyway, unless the gluing was done with the "smarter lexer" (informal) context. Effectively, it's requiring the macro_rules!-style operator gluing for float literals. Final side note: I'm exploring decomposing the literal suffix off of the literal literal in my micro lexer, so a design following that would have to have this gluing-for-proc_macro anyway.)

It depends on how close you want librustc_parse to be to proc_macro, I suppose. Or if you're willing to have librustc_parse diverge slightly from proc_macro and introduce a new meta::tokens::TokenStream that is more fully decomposed in the future. (proc_macro::TokenStream -> meta::tokens::TokenStream would be lossless (given a span splitting API) if it continues to not include whitespace explicitly.)

Looong term, I think properly (always) decomposing floats in the lexer is the better choice, but would require a breaking proc_macro -> meta transition to expose fully to proc_macro consumers. However, if (and only if) always representing floats as decomposed in the lexer token stream is infeasable, then I think adding another "smarter lexer" rule for this is probably less technical debt long term, because it's fully contained within the lexer (like the ident dot identifier rule; I think that most people would agree that having that split is way better).

(I can just say that my micro lexer experiment would not like it if it has to handle the "smarter lexer" option in its current design; the existing "smarter lexer" behavior for integer dot ident is the most complicated part of the definition as currently written, and dot ident $(dot ident)+, as currently specified, would take an infinite amount of rules. (It's fixable but would take a complete restructuring of the current formalism.))

TL;DR we can stability without stagnation our lexer if we just always shim to/from the stable proc_macro API. (Note: said shim will still be required if/when the "IDE syntax tree unification" happens (cc @matklad).)

@petrochenkov
Copy link
Contributor Author

petrochenkov commented May 8, 2020

TL;DR we can stability without stagnation our lexer if we just always shim to/from the stable proc_macro API.

And the shim already exists due to translation of doc comments and maybe some other stuff, it just works only in the opposite right now - "one rustc token -> multiple proc_macro token", rather than "multiple rustc tokens <-> one proc_macro token".

EDIT: The shim also currently has "multiple proc_macro tokens -> one rustc token" for lifetimes and "one proc_macro token -> multiple rustc tokens" for negative literals. (And multi-character operators of course, but they will go away if rust migrates to more fine-grained tokens.)

@petrochenkov petrochenkov added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels May 8, 2020
@nikomatsakis
Copy link
Contributor

@CAD97 Indeed. I believe the approach you're suggesting is what I was hinting at when I wrote this:

We could plausibly handle the backwards compatibility option by having the lexer have a flag, or by adopting the "smarter lexer" approach that I think @dtolnay originally proposed (since all proc-macros and the like would then benefit from using our lexer automatically).

In particular, we can clearly preserve the lexing behavior for procedural macros by inserting some shims to convert from the new tokens to the old ones -- and I think that's fine. But it's also true that procedural macros would probably prefer the tokens that rustc is seeing, since it would enable e.g. syn to parse Rust more easily (i.e., the same reason that our parser wants different tokens).

I guess this is what you meant when you talked about the "meta" shift -- i.e., we might use that shift as a kind of "edition" change for procedural macros?

@petrochenkov
Copy link
Contributor Author

petrochenkov commented May 17, 2020

Stabilization report

This PR implements parsing tuple.0.0 as two field accesses instead of erroneous tuple, . and floating point 0.0.
The feature is implemented as insta-stable.

To be more specific, if we expect something identifier-like when parsing a field name after ., but encounter a float token, we break that float token into parts, similarly to how we break && into & &, or << into < <, etc.

Larger picture

There are two ways to achieve tuple.0.0 being parsed as two tuple field accesses.

  • One way is to keep the current "compound" float tokens and introduce a special case into the lexer so it treats 0.0 differently depending on its context (as one float token, or as three integer and punctuation tokens).
  • Another way is to break the float tokens into more basic components (possibly suffixed integer tokens and punctuation) and defer the task of discerning between floats and tuple field accesses to the parser.

Pros and cons of both approaches:

  • Compound float tokens in general, broken in the lexer in few special cases
    • (Negative) From the general design point of view, if we have basic components which we want to break into parts sometimes (like 0.0 tokens), perhaps they are not basic enough and we need to rethink our set of basic components. Especially given that breaking floats doesn't require introducing any new basic components, since they can be broken into already existing integers and punctuation.
    • (Positive) Freezing the tokens produced by rustc lexer (which provides no stability guarantees) allows to avoid any compatibility issues with proc macro APIs and macro_rules matchers which do provide stability guarantees.
    • (Positive) There's some precedent for treating float tokens specially in the lexer, 0. is lexed as two tokens rather than as a float if it's followed by . or an identifier (to support ranges 0..1 and integer methods 0.foo()).
  • Always breaking float tokens into integers and punctuation in the lexer
    • (Positive) The general design point of view, see above. Compound operators (like <<) are currently represented as single tokens in rustc lexer and there are already plans to break them up with the same motivation.
    • (Positive) Can remove the existing floating-point-related special cases in rustc lexer (0..1 and 0.foo()).
    • (Negative) Proc macro API and tt matcher have stability guarantees, we will need shims at proc and decl macro boundaries to represent multiple internal tokens as one (0.0 or <<) when matching with tt and when producing proc macro tokens. (Bumping the major version of proc macro API and the ways to make migration from pmAPI1 to pmAPI2 painless are out of scope right now.)
    • (Negative?) Lexer does less work, so parsers have to do more work. There are multiple parsers, so they all will need to provide tools for combining multi-character operators (< < -> <<) and floating point literals (0 . 0 -> 0.0, assuming proc macro API migrates to the new model) from basic tokens, or breaking float tokens into parts (0.0 -> 0 . 0, assuming proc macro API is frozen). proc_macro crate itself doesn't provide such facilities, so they need to be implemented by crates like syn that provide conveniences on top of the barebones proc_macro.

This PR chooses the second strategy (breaking float tokens) by not introducing special float-breaking cases to the lexer, but emulates it in the parser, similarly to how we emulate future single-character punctuation by breaking << into < and < in the parser.
Later when we have some necessary infrastructural work done we migrate both << and 0.0 to more basic tokens properly in the lexer.

@petrochenkov
Copy link
Contributor Author

@rust-lang/lang
Could someone start an FCP?

@petrochenkov petrochenkov added S-waiting-on-team Status: Awaiting decision from the relevant subteam (see the T-<team> label). and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels May 17, 2020
@nikomatsakis
Copy link
Contributor

nikomatsakis commented May 18, 2020

@petrochenkov

Before I do, a point of clarification. Under the heading "Compound float tokens", you wrote

(Positive) There's some precedent for treating float tokens specially in the lexer, 0. is lexed as two tokens rather than as a float if it's followed by . or an identifier (to support ranges 0..1 and integer methods 0.foo()).

But this doesn't sound like using a compound float token, unless I'm misunderstanding. In particular, you wrote that 0. is lexed in different ways, whereas to be precedent, I would expect 0. to always be lexed as a floating point number and then to have the parser break it up into subtokens.

So I guess the question is, in what way is this a precedent? Or perhaps there's kind of a third route, somewhat similar to what @dtolnay originally proposed, where the lexer understands .0.0 and tries to get enough context to decide what tokens to produce?

Manishearth added a commit to Manishearth/rust that referenced this pull request Jul 11, 2020
Accept tuple.0.0 as tuple indexing (take 2)

If we expect something identifier-like when parsing a field name after `.`, but encounter a float token, we break that float token into parts, similarly to how we break `&&` into `&` `&`, or `<<` into `<` `<`, etc.

An alternative to rust-lang#70420.
bors added a commit to rust-lang-ci/rust that referenced this pull request Jul 11, 2020
…arth

Rollup of 19 pull requests

Successful merges:

 - rust-lang#71322 (Accept tuple.0.0 as tuple indexing (take 2))
 - rust-lang#72303 (Add core::future::{poll_fn, PollFn})
 - rust-lang#73862 (Stabilize casts and coercions to `&[T]` in const fn)
 - rust-lang#73887 (stabilize const mem::forget)
 - rust-lang#73989 (adjust ub-enum test to be endianess-independent)
 - rust-lang#74045 (Explain effects of debugging options from config.toml)
 - rust-lang#74076 (Add `read_exact_at` and `write_all_at` to WASI's `FileExt`)
 - rust-lang#74099 (Add VecDeque::range* methods)
 - rust-lang#74100 (Use str::strip* in bootstrap)
 - rust-lang#74103 (Only add CFGuard on `windows-msvc` targets)
 - rust-lang#74109 (Only allow `repr(i128/u128)` on enum)
 - rust-lang#74122 (Start-up clean-up)
 - rust-lang#74125 (Correctly mark the ending span of a match arm)
 - rust-lang#74127 (Avoid "whitelist")
 - rust-lang#74129 (:arrow_up: rust-analyzer)
 - rust-lang#74135 (Update books)
 - rust-lang#74145 (Update rust-installer to latest version)
 - rust-lang#74161 (Fix  disabled dockerfiles)
 - rust-lang#74162 (take self by value in ToPredicate)

Failed merges:

r? @ghost
@bors bors merged commit ec1e7e9 into rust-lang:master Jul 11, 2020
@jplatte
Copy link
Contributor

jplatte commented Jul 11, 2020

Should this have the relnotes tag and a milestone?

@Mark-Simulacrum Mark-Simulacrum added this to the 1.46 milestone Jul 11, 2020
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Aug 30, 2020
according to various people on tech-pkg@, there are no problems with
the Firefox build

Version 1.46.0 (2020-08-27)
==========================

Language
--------
- [`if`, `match`, and `loop` expressions can now be used in const functions.][72437]
- [Additionally you are now also able to coerce and cast to slices (`&[T]`) in
  const functions.][73862]
- [The `#[track_caller]` attribute can now be added to functions to use the
  function's caller's location information for panic messages.][72445]
- [Recursively indexing into tuples no longer needs parentheses.][71322] E.g.
  `x.0.0` over `(x.0).0`.
- [`mem::transmute` can now be used in static and constants.][72920] **Note**
  You currently can't use `mem::transmute` in constant functions.

Compiler
--------
- [You can now use the `cdylib` target on Apple iOS and tvOS platforms.][73516]
- [Enabled static "Position Independent Executables" by default
  for `x86_64-unknown-linux-musl`.][70740]

Libraries
---------
- [`mem::forget` is now a `const fn`.][73887]
- [`String` now implements `From<char>`.][73466]
- [The `leading_ones`, and `trailing_ones` methods have been stabilised for all
  integer types.][73032]
- [`vec::IntoIter<T>` now implements `AsRef<[T]>`.][72583]
- [All non-zero integer types (`NonZeroU8`) now implement `TryFrom` for their
  zero-able equivalent (e.g. `TryFrom<u8>`).][72717]
- [`&[T]` and `&mut [T]` now implement `PartialEq<Vec<T>>`.][71660]
- [`(String, u16)` now implements `ToSocketAddrs`.][73007]
- [`vec::Drain<'_, T>` now implements `AsRef<[T]>`.][72584]

Stabilized APIs
---------------
- [`Option::zip`]
- [`vec::Drain::as_slice`]

Cargo
-----
Added a number of new environment variables that are now available when
compiling your crate.

- [`CARGO_BIN_NAME` and `CARGO_CRATE_NAME`][cargo/8270] Providing the name of
  the specific binary being compiled and the name of the crate.
- [`CARGO_PKG_LICENSE`][cargo/8325] The license from the manifest of the package.
- [`CARGO_PKG_LICENSE_FILE`][cargo/8387] The path to the license file.

Compatibility Notes
-------------------
- [The target configuration option `abi_blacklist` has been renamed
  to `unsupported_abis`.][74150] The old name will still continue to work.
- [Rustc will now warn if you cast a C-like enum that implements `Drop`.][72331]
  This was previously accepted but will become a hard error in a future release.
- [Rustc will fail to compile if you have a struct with
  `#[repr(i128)]` or `#[repr(u128)]`.][74109] This representation is currently only
  allowed on `enum`s.
- [Tokens passed to `macro_rules!` are now always captured.][73293] This helps
  ensure that spans have the correct information, and may cause breakage if you
  were relying on receiving spans with dummy information.
- [The InnoSetup installer for Windows is no longer available.][72569] This was
  a legacy installer that was replaced by a MSI installer a few years ago but
  was still being built.
- [`{f32, f64}::asinh` now returns the correct values for negative numbers.][72486]
- [Rustc will no longer accept overlapping trait implementations that only
  differ in how the lifetime was bound.][72493]
- [Rustc now correctly relates the lifetime of an existential associated
  type.][71896] This fixes some edge cases where `rustc` would erroneously allow
  you to pass a shorter lifetime than expected.
- [Rustc now dynamically links to `libz` (also called `zlib`) on Linux.][74420]
  The library will need to be installed for `rustc` to work, even though we
  expect it to be already available on most systems.
- [Tests annotated with `#[should_panic]` are broken on ARMv7 while running
  under QEMU.][74820]
- [Pretty printing of some tokens in procedural macros changed.][75453] The
  exact output returned by rustc's pretty printing is an unstable
  implementation detail: we recommend any macro relying on it to switch to a
  more robust parsing system.

[75453]: rust-lang/rust#75453
[74820]: rust-lang/rust#74820
[74420]: rust-lang/rust#74420
[74109]: rust-lang/rust#74109
[74150]: rust-lang/rust#74150
[73862]: rust-lang/rust#73862
[73887]: rust-lang/rust#73887
[73466]: rust-lang/rust#73466
[73516]: rust-lang/rust#73516
[73293]: rust-lang/rust#73293
[73007]: rust-lang/rust#73007
[73032]: rust-lang/rust#73032
[72920]: rust-lang/rust#72920
[72569]: rust-lang/rust#72569
[72583]: rust-lang/rust#72583
[72584]: rust-lang/rust#72584
[72717]: rust-lang/rust#72717
[72437]: rust-lang/rust#72437
[72445]: rust-lang/rust#72445
[72486]: rust-lang/rust#72486
[72493]: rust-lang/rust#72493
[72331]: rust-lang/rust#72331
[71896]: rust-lang/rust#71896
[71660]: rust-lang/rust#71660
[71322]: rust-lang/rust#71322
[70740]: rust-lang/rust#70740
[cargo/8270]: rust-lang/cargo#8270
[cargo/8325]: rust-lang/cargo#8325
[cargo/8387]: rust-lang/cargo#8387
[`Option::zip`]: https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.zip
[`vec::Drain::as_slice`]: https://doc.rust-lang.org/stable/std/vec/struct.Drain.html#method.as_slice
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Oct 30, 2020
Pkgsrc changes:
 * Portability patches for Illumos have been intregrated upstream,
   so are no longer needed in pkgsrc.
 * Adjust one other patch, and update vendor/libc cargo checksum.

Upstream changes:

Version 1.46.0 (2020-08-27)
==========================

Language
--------
- [`if`, `match`, and `loop` expressions can now be used in const functions.]
  [72437]
- [Additionally you are now also able to coerce and cast to slices (`&[T]`) in
  const functions.][73862]
- [The `#[track_caller]` attribute can now be added to functions to use the
  function's caller's location information for panic messages.][72445]
- [Recursively indexing into tuples no longer needs parentheses.][71322] E.g.
  `x.0.0` over `(x.0).0`.
- [`mem::transmute` can now be used in static and constants.][72920] **Note**
  You currently can't use `mem::transmute` in constant functions.

Compiler
--------
- [You can now use the `cdylib` target on Apple iOS and tvOS platforms.][73516]
- [Enabled static "Position Independent Executables" by default
  for `x86_64-unknown-linux-musl`.][70740]

Libraries
---------
- [`mem::forget` is now a `const fn`.][73887]
- [`String` now implements `From<char>`.][73466]
- [The `leading_ones`, and `trailing_ones` methods have been stabilised for all
  integer types.][73032]
- [`vec::IntoIter<T>` now implements `AsRef<[T]>`.][72583]
- [All non-zero integer types (`NonZeroU8`) now implement `TryFrom` for their
  zero-able equivalent (e.g. `TryFrom<u8>`).][72717]
- [`&[T]` and `&mut [T]` now implement `PartialEq<Vec<T>>`.][71660]
- [`(String, u16)` now implements `ToSocketAddrs`.][73007]
- [`vec::Drain<'_, T>` now implements `AsRef<[T]>`.][72584]

Stabilized APIs
---------------
- [`Option::zip`]
- [`vec::Drain::as_slice`]

Cargo
-----
Added a number of new environment variables that are now available when
compiling your crate.

- [`CARGO_BIN_NAME` and `CARGO_CRATE_NAME`][cargo/8270] Providing the name of
  the specific binary being compiled and the name of the crate.
- [`CARGO_PKG_LICENSE`][cargo/8325] The license from the manifest of the
  package.
- [`CARGO_PKG_LICENSE_FILE`][cargo/8387] The path to the license file.

Compatibility Notes
-------------------
- [The target configuration option `abi_blacklist` has been renamed
  to `unsupported_abis`.][74150] The old name will still continue to work.
- [Rustc will now warn if you have a C-like enum that implements `Drop`.][72331]
  This was previously accepted but will become a hard error in a future release.
- [Rustc will fail to compile if you have a struct with
  `#[repr(i128)]` or `#[repr(u128)]`.][74109] This representation is currently
  only allowed on `enum`s.
- [Tokens passed to `macro_rules!` are now always captured.][73293] This helps
  ensure that spans have the correct information, and may cause breakage if you
  were relying on receiving spans with dummy information.
- [The InnoSetup installer for Windows is no longer available.][72569] This was
  a legacy installer that was replaced by a MSI installer a few years ago but
  was still being built.
- [`{f32, f64}::asinh` now returns the correct values for negative numbers.]
  [72486]
- [Rustc will no longer accept overlapping trait implementations that only
  differ in how the lifetime was bound.][72493]
- [Rustc now correctly relates the lifetime of an existential associated
  type.][71896] This fixes some edge cases where `rustc` would erroneously
  allow you to pass a shorter lifetime than expected.
- [Rustc now dynamically links to `libz` (also called `zlib`) on Linux.][74420]
  The library will need to be installed for `rustc` to work, even though we
  expect it to be already available on most systems.
- [Tests annotated with `#[should_panic]` are broken on ARMv7 while running
  under QEMU.][74820]
- [Pretty printing of some tokens in procedural macros changed.][75453] The
  exact output returned by rustc's pretty printing is an unstable
  implementation detail: we recommend any macro relying on it to switch to a
  more robust parsing system.

[75453]: rust-lang/rust#75453
[74820]: rust-lang/rust#74820
[74420]: rust-lang/rust#74420
[74109]: rust-lang/rust#74109
[74150]: rust-lang/rust#74150
[73862]: rust-lang/rust#73862
[73887]: rust-lang/rust#73887
[73466]: rust-lang/rust#73466
[73516]: rust-lang/rust#73516
[73293]: rust-lang/rust#73293
[73007]: rust-lang/rust#73007
[73032]: rust-lang/rust#73032
[72920]: rust-lang/rust#72920
[72569]: rust-lang/rust#72569
[72583]: rust-lang/rust#72583
[72584]: rust-lang/rust#72584
[72717]: rust-lang/rust#72717
[72437]: rust-lang/rust#72437
[72445]: rust-lang/rust#72445
[72486]: rust-lang/rust#72486
[72493]: rust-lang/rust#72493
[72331]: rust-lang/rust#72331
[71896]: rust-lang/rust#71896
[71660]: rust-lang/rust#71660
[71322]: rust-lang/rust#71322
[70740]: rust-lang/rust#70740
[cargo/8270]: rust-lang/cargo#8270
[cargo/8325]: rust-lang/cargo#8325
[cargo/8387]: rust-lang/cargo#8387
[`Option::zip`]: https://doc.rust-lang.org/stable/std/option/enum.Option.html#method.zip
[`vec::Drain::as_slice`]: https://doc.rust-lang.org/stable/std/vec/struct.Drain.html#method.as_slice
gwilymk referenced this pull request in agbrs/agb Mar 23, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [syn](https://togithub.com/dtolnay/syn) | dependencies | major | `1`
-> `2` |

---

### Release Notes

<details>
<summary>dtolnay/syn</summary>

### [`v2.0.8`](https://togithub.com/dtolnay/syn/releases/tag/2.0.8)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.7...2.0.8)

- Treat `try` keyword as 2015-edition identifier in definition of try
macro ([#&#8203;1422](https://togithub.com/dtolnay/syn/issues/1422))

### [`v2.0.7`](https://togithub.com/dtolnay/syn/releases/tag/2.0.7)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.6...2.0.7)

-   Fix parsing of `mut self` inside of Type::BareFn

### [`v2.0.6`](https://togithub.com/dtolnay/syn/releases/tag/2.0.6)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.5...2.0.6)

- Improve error message on missing ';' between statements
([#&#8203;1419](https://togithub.com/dtolnay/syn/issues/1419))
- Keep non-brace macro invocations in trailing expr position as
Expr::Macro
([#&#8203;1420](https://togithub.com/dtolnay/syn/issues/1420))

### [`v2.0.5`](https://togithub.com/dtolnay/syn/releases/tag/2.0.5)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.4...2.0.5)

- Expose `ExprMacro` data structure even when `features="full"` is not
used ([#&#8203;1417](https://togithub.com/dtolnay/syn/issues/1417))

### [`v2.0.4`](https://togithub.com/dtolnay/syn/releases/tag/2.0.4)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.3...2.0.4)

- Improve error reporting when parsing identifiers and paths
([#&#8203;1415](https://togithub.com/dtolnay/syn/issues/1415),
[#&#8203;1416](https://togithub.com/dtolnay/syn/issues/1416))

### [`v2.0.3`](https://togithub.com/dtolnay/syn/releases/tag/2.0.3)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.2...2.0.3)

- Expose `ExprGroup` data structure even when `features="full"` is not
used ([#&#8203;1412](https://togithub.com/dtolnay/syn/issues/1412))

### [`v2.0.2`](https://togithub.com/dtolnay/syn/releases/tag/2.0.2)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.1...2.0.2)

-   Documentation improvements

### [`v2.0.1`](https://togithub.com/dtolnay/syn/releases/tag/2.0.1)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.0...2.0.1)

- Add methods on syn::Meta for reporting error on an incorrect kind of
attribute ([#&#8203;1409](https://togithub.com/dtolnay/syn/issues/1409))

### [`v2.0.0`](https://togithub.com/dtolnay/syn/releases/tag/2.0.0)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.109...2.0.0)

This release contains a batch of syntax tree improvements to incorporate
ongoing Rust language development from the past 3.5 years since syn 1.

It never seems like an ideal time to finalize a syntax tree design,
considering the frankly alarming number of syntax-disrupting language
features currently in flight: keyword generics, restrictions,
capabilities and contexts, conditional constness, new varieties of
literals, dyn revamp such as explicitly dyn-safe traits and dyn-star,
expression syntax in various phases of being added or being torn out
(const blocks, try blocks, raw references), auto traits and negative
impls, generalizations to higher rank trait bounds, async closures and
static async trait methods, postfix keywords, pattern types, return type
notation, unsafe attributes, …

The plan continues to be the same as laid out originally in the 1.0.0
release announcement:

> Be aware that the underlying Rust language will continue to evolve.
Syn is able to accommodate most kinds of Rust grammar changes via the
nonexhaustive enums and `Verbatim` variants in the syntax tree, but we
will plan to put out new major versions on a 12 to 24 month cadence to
incorporate ongoing language changes as needed.

If anything, the takeaway from the 3.5 year longevity of syn 1 is that
this period was tamer from a language development perspective than
anticipated, but that is unlikely to last and I think around 24 months
is still the correct cadence to expect between releases going forward.

<br>

<p align="center"><a href="https://docs.rs/syn/2/syn/">[API
documentation for 2.0]</a></p>

### Breaking changes

-   Minimum required Rust version is raised from rustc 1.31 to 1.56.

##### Expressions

- Support for `box expr` syntax has been deleted, as it has been deleted
recently from rustc.

- Support for type ascription syntax `expr: Type` in expression position
has been deleted.

- Support for unstable `&raw const expr` raw-pointer reference syntax
has been deleted.

- The representation of generic arguments has been unified between
method calls and non-method paths into a single `GenericArgument` type,
which supersedes the previous `GenericMethodArgument` and
`MethodTurbofish`.

- Generic arguments now distinguish between associated types
(`AssocType`) and associated constant values (`AssocConst`). Previously
these would be parsed ambiguously as `Binding`.

- The binary assignment operators in `BinOp` have been renamed to align
with the naming used by the standard library's `core::ops` module's
traits. For example `BinOp::AddEq` is now called `BinOp::AddAssign`.

- `Expr::Struct` struct construction expressions now support structs
which are a variant of an enum associated type of a trait, as in `<Type
as Trait>::Assoc::Variant { ... }`, which has recently been added to
Rust.

- `Expr::Range` now follows the `start` and `end` naming used by the
standard library's `RangeBounds` trait, rather than `from`/`to` or
`lo`/`hi`.

- `Expr::AssignOp` has been merged into `Expr::Binary`, which now
represents both non-assignment and assignment binary operators.

- Stricter parsing of ranges. None of the following are valid
expressions, but were previously accepted by syn: `..=`, `lo..=`, `...`,
`...hi`, `lo...`, `lo...hi`.

- `Expr::Closure` now includes a representation for `for<...>`
lifetimes.

##### Statements

- Variants `Stmt::Expr` (tail-position expression without trailing
semicolon) and `Stmt::Semi` (non-tail expression with trailing
semicolon) have been combined into `Stmt::Expr` with the optional
semicolon represented by `Option<Token![;]>`.

- The syntax tree for `Stmt::Local` has been extended to handle
`let`/`else` syntax.

- Macros in statement position are now uniformly parsed as
`Stmt::Macro`. Previously these would be disambiguated to `Stmt::Item`,
although it was ambiguous whether a macro in statement position would
expand to an item (like `thread_local! { ... }`) vs an expression (like
`println! { ... }`).

##### Patterns

- Pattern parsing for all the different syntactic positions in which
patterns are allowed has been split into `Pat::parse_single` (for
function- and closure-argument position, where top-level `|` is not
allowed), `Pat::parse_multi` (where `|` is allowed) and
`Pat::parse_multi_with_leading_vert` (for the pattern of match arms,
which allow an optional leading `|`). Previously only a single `parse`
behavior was supported and behaved like the new `parse_single`.

- The `Pat` syntax tree now shares more common data structures with the
`Expr` syntax tree where possible, such as for literals, paths, macros,
and ranges in pattern position.

- Parsing of struct field patterns does a better job rejecting bogus
syntax such as `Struct { 0 asdf }` and `Struct { ref mut 0: asdf }`,
which were previously incorrectly accepted.

- `Pat::Range` now supports one-sided ranges by representing the start
and end bound of the range by `Option<Expr>`.

- `Pat::Struct` keeps track of attributes on the optional `..` "rest"
part of the pattern, as in `let Struct { x, #[cfg(any())] .. } = _;`.

- Parsing unary negation now enforces that only literal patterns can be
unarily negated. For example `-self::CONST` and `-const { 0i32 }` are
not valid syntax in pattern position.

- `Pat::TupleStruct` no longer wraps a value of type `PatTuple` but
represents that information in its fields directly.

- A single parenthesized pattern without trailing comma inside the
parentheses is no longer considered a `Pat::Tuple`, it will be parsed as
`Pat::Paren`.

- One-sided range patterns are no longer allowed inside of slice
patterns. `[lo..]` and `[..=hi]` are not considered valid pattern syntax
by Rust.

##### Items

- Typed `self` in a method signature, such as `self: Pin<&mut Self>`,
will now be parsed as `FnArg::Receiver`. This means `self`, whether with
or without an explicit type, is always treated as a `Receiver`.
Previously only the `&self` and `&mut self` shorthand receivers were
parsed as `Receiver`.

- `TraitItem::Method` and `ImplItem::Method` have been renamed to
`TraitItem::Fn` and `ImplItem::Fn`, as they do not necessarily represent
methods if the function signature contains no `self`.

- `Item::Macro2` has been deleted as "macros 2.0" syntax is no longer
considered on track for stabilization.

- Various item kinds now hold `Generics` which didn't used to have them.

- The variadic argument of an extern function signature can now be given
an optional parameter name.

-   `WherePredicate::Eq` is no longer supported.

- `Visibility::Crate` is no longer supported. This syntax has been
removed from rustc.

- Public visibility is now represented by a single `Token![pub]` token
rather than the old `VisPublic` struct.

- `LifetimeDef` is now called `LifetimeParam`. This name makes more
sense in the context of the `GenericParam` enum (which also includes
`TypeParam` and `ConstParam`), and is the name that the Rust Reference
uses.

- Modules and extern blocks (`Item::Mod` and `Item::ForeignMod`) can now
be marked `unsafe`.

##### Attributes

- The syntax tree for `Attribute` has been redesigned. The new API
better accommodates attributes which mix structured and unstructured
content at different levels of nesting.

-   `AttributeArgs` has been removed. Use `Punctuated<Meta, Token![,]>`.

- For parsing attribute contents, `parse_meta()` is superseded by a new
parsing library called `syn::meta`, and the `parse_nested_meta` method
on `Attribute`.

##### Tokens

- In string literals, the handling of non-ASCII whitespace after
trailing `\` now matches what is implemented by rustc. Space, horizontal
tab, line feed, and carriage return are the only 4 whitespace characters
which are supposed to be stripped from the beginning of the next line.

- The delimiter tokens `syn::token::Paren`, `Bracket`, and `Brace` now
store 2 spans (the open and close punctuation separately) rather than
just 1. Use `.join()` to obtain a single `Span` spanning the whole
group.

- Keyword construction now requires a single span; an array of 1 span is
no longer accepted. Use `Token![trait](span)` instead of
`Token![trait]([span])`.

- Some token types have been renamed to conform with terminology used by
the [Rust
Reference](https://doc.rust-lang.org/1.68.0/reference/tokens.html#punctuation).
These are `Add`->`Plus`, `Bang`->`Not`, `Colon2`->`PathSep`,
`Div`->`Slash`, `Dot2`->`DotDot`, `Dot3`->`DotDotDot`, `Rem`->`Percent`,
and `Sub`->`Minus`.

##### More

- Several enums have been made `#[non_exhaustive]` in anticipation of
upcoming language changes. This includes `WherePredicate`, `Lit`, and
`GenericArgument`.

- The `impl Extend<Pair<T, P>> for Punctuated<T, P>` now requires `P:
Default` and will push a default punctuation between the pre-existing
elements and the new ones, if there is not already a trailing
punctuation. Previously it would panic in this situation.

- `ParseStream::parse_terminated` now takes a peek-style punctuation
argument instead of turbofish. Replace `input.parse_terminated::<_,
Token![,]>(Thing::parse)` with `input.parse_terminated(Thing::parse,
Token![,])`.

###
[`v1.0.109`](https://togithub.com/dtolnay/syn/compare/1.0.108...1.0.109)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.108...1.0.109)

### [`v1.0.108`](https://togithub.com/dtolnay/syn/releases/tag/1.0.108)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.107...1.0.108)

- Fix handling of unusual whitespace after escaped newlines in
`LitStr::value`
([#&#8203;1381](https://togithub.com/dtolnay/syn/issues/1381), thanks
[@&#8203;ModProg](https://togithub.com/ModProg))

### [`v1.0.107`](https://togithub.com/dtolnay/syn/releases/tag/1.0.107)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.106...1.0.107)

-   Opt out of `-Zrustdoc-scrape-examples` on docs.rs for now

### [`v1.0.106`](https://togithub.com/dtolnay/syn/releases/tag/1.0.106)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.105...1.0.106)

-   Documentation improvements

### [`v1.0.105`](https://togithub.com/dtolnay/syn/releases/tag/1.0.105)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.104...1.0.105)

- Improve parse errors related to `dyn` and `impl` type syntax
([#&#8203;1245](https://togithub.com/dtolnay/syn/issues/1245))

### [`v1.0.104`](https://togithub.com/dtolnay/syn/releases/tag/1.0.104)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.103...1.0.104)

-   Add `PathArguments::is_none()`

### [`v1.0.103`](https://togithub.com/dtolnay/syn/releases/tag/1.0.103)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.102...1.0.103)

- Implement `PartialOrd` for `Cursor`
([#&#8203;1236](https://togithub.com/dtolnay/syn/issues/1236),
[#&#8203;1237](https://togithub.com/dtolnay/syn/issues/1237), thanks
[@&#8203;CAD97](https://togithub.com/CAD97))

### [`v1.0.102`](https://togithub.com/dtolnay/syn/releases/tag/1.0.102)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.101...1.0.102)

- More efficient internal representation for `TokenBuffer`
([#&#8203;1223](https://togithub.com/dtolnay/syn/issues/1223), thanks
[@&#8203;CAD97](https://togithub.com/CAD97))
- Fix parsing of a left shift after macro metavariable in type position
([#&#8203;1229](https://togithub.com/dtolnay/syn/issues/1229))

### [`v1.0.101`](https://togithub.com/dtolnay/syn/releases/tag/1.0.101)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.100...1.0.101)

- Eliminate a bunch of redundant work done by LitStr::parse
([#&#8203;1221](https://togithub.com/dtolnay/syn/issues/1221))

### [`v1.0.100`](https://togithub.com/dtolnay/syn/releases/tag/1.0.100)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.99...1.0.100)

- Parse closures with explicit empty lifetime parameter list `for<> ||
-> T {…}` ([#&#8203;1212](https://togithub.com/dtolnay/syn/issues/1212),
[https://github.com/rust-lang/rust/issues/97362](https://togithub.com/rust-lang/rust/issues/97362))
- Parse `dyn*` provisional syntax
([#&#8203;1213](https://togithub.com/dtolnay/syn/issues/1213),
[https://github.com/rust-lang/rust/issues/91611](https://togithub.com/rust-lang/rust/issues/91611))
- Parse attributes on the "rest" pattern of a struct in pattern
position, `Struct { #[attr] .. }`
([#&#8203;1214](https://togithub.com/dtolnay/syn/issues/1214))
- Parse `static async` and `static async move` closures
([#&#8203;1215](https://togithub.com/dtolnay/syn/issues/1215),
[https://github.com/rust-lang/rust/issues/62290](https://togithub.com/rust-lang/rust/issues/62290))

### [`v1.0.99`](https://togithub.com/dtolnay/syn/releases/tag/1.0.99)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.98...1.0.99)

-   Add categories and keywords to crates.io metadata

### [`v1.0.98`](https://togithub.com/dtolnay/syn/releases/tag/1.0.98)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.97...1.0.98)

-   Format example code with rustfmt

### [`v1.0.97`](https://togithub.com/dtolnay/syn/releases/tag/1.0.97)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.96...1.0.97)

-   Update examples

### [`v1.0.96`](https://togithub.com/dtolnay/syn/releases/tag/1.0.96)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.95...1.0.96)

- Add a `punct_mut()` method on `syn::punctuated::Pair` to return
`Option<&mut P>`
([#&#8203;1183](https://togithub.com/dtolnay/syn/issues/1183))

### [`v1.0.95`](https://togithub.com/dtolnay/syn/releases/tag/1.0.95)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.94...1.0.95)

- Replace unicode-xid with unicode-ident crate:
https://github.com/dtolnay/unicode-ident

### [`v1.0.94`](https://togithub.com/dtolnay/syn/releases/tag/1.0.94)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.93...1.0.94)

-   Resolve some unused_macro_rules warnings

### [`v1.0.93`](https://togithub.com/dtolnay/syn/releases/tag/1.0.93)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.92...1.0.93)

- Fix compile error when `Some` means something unusual in the
expression namespace of the scope where `custom_keyword` is invoked
([#&#8203;1171](https://togithub.com/dtolnay/syn/issues/1171), thanks
[@&#8203;zakarumych](https://togithub.com/zakarumych))

### [`v1.0.92`](https://togithub.com/dtolnay/syn/releases/tag/1.0.92)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.91...1.0.92)

- Make compatible with Miri's tag-raw-pointers mode
([#&#8203;1166](https://togithub.com/dtolnay/syn/issues/1166), thanks
[@&#8203;saethlin](https://togithub.com/saethlin))

### [`v1.0.91`](https://togithub.com/dtolnay/syn/releases/tag/1.0.91)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.90...1.0.91)

-   impl ToTokens for RangeLimits
-   impl Parse for ExprAwait
-   impl Parse for GenericMethodArgument
-   impl Parse for MethodTurbofish

### [`v1.0.90`](https://togithub.com/dtolnay/syn/releases/tag/1.0.90)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.89...1.0.90)

- Update recommended exhaustive matching idiom to use
`non_exhaustive_omitted_patterns` lint:

    ```rust
    match expr {
        Expr::Array(e) => {…}
        Expr::Assign(e) => {…}
        ...
        Expr::Yield(e) => {…}

        #[cfg_attr(test, deny(non_exhaustive_omitted_patterns))]
        _ => {/* some sane fallback */}
    }
    ```

### [`v1.0.89`](https://togithub.com/dtolnay/syn/releases/tag/1.0.89)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.88...1.0.89)

- Remove support for inner attributes on non-block expressions
([#&#8203;1146](https://togithub.com/dtolnay/syn/issues/1146),
[https://github.com/rust-lang/rust/pull/83312](https://togithub.com/rust-lang/rust/pull/83312))
- Fix panic on comma after `mut self` in a bare fn type
([#&#8203;1148](https://togithub.com/dtolnay/syn/issues/1148))

### [`v1.0.88`](https://togithub.com/dtolnay/syn/releases/tag/1.0.88)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.87...1.0.88)

- Parse `..` pattern in pattern of `let`
([#&#8203;1136](https://togithub.com/dtolnay/syn/issues/1136))
- Parse `for<…>` lifetime introducer on closures
([#&#8203;1135](https://togithub.com/dtolnay/syn/issues/1135))
- Reject postfix operators after cast
([#&#8203;1117](https://togithub.com/dtolnay/syn/issues/1117))
- Implement extra-traits for `Nothing`
([#&#8203;1144](https://togithub.com/dtolnay/syn/issues/1144))

### [`v1.0.87`](https://togithub.com/dtolnay/syn/releases/tag/1.0.87)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.86...1.0.87)

- Parse trait bounds containing associated constant constraint
([#&#8203;1138](https://togithub.com/dtolnay/syn/issues/1138))
- Change syntax of where-clauses on generic associated types
([#&#8203;1071](https://togithub.com/dtolnay/syn/issues/1071),
[https://github.com/rust-lang/rust/issues/89122](https://togithub.com/rust-lang/rust/issues/89122))

### [`v1.0.86`](https://togithub.com/dtolnay/syn/releases/tag/1.0.86)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.85...1.0.86)

-   Add support for parsing if- and while-let-chains (RFC 2497)

### [`v1.0.85`](https://togithub.com/dtolnay/syn/releases/tag/1.0.85)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.84...1.0.85)

- Add `token()` method to each variant of syn::Lit to expose the
underlying token representation with original formatting

### [`v1.0.84`](https://togithub.com/dtolnay/syn/releases/tag/1.0.84)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.83...1.0.84)

- Add
[`parse_quote_spanned!`](https://docs.rs/syn/1.0.84/syn/macro.parse_quote_spanned.html)
macro which is a combination `parse_quote!` + `quote_spanned!`

### [`v1.0.83`](https://togithub.com/dtolnay/syn/releases/tag/1.0.83)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.82...1.0.83)

- Fix panic parsing trait impl with qself in trait type: `impl
<Thing<>>::Trait for Type {}`
([#&#8203;1109](https://togithub.com/dtolnay/syn/issues/1109))
- Preserve attributes on let-else stmt: `#[attr] let pat = val else {
return }` ([#&#8203;1110](https://togithub.com/dtolnay/syn/issues/1110))

### [`v1.0.82`](https://togithub.com/dtolnay/syn/releases/tag/1.0.82)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.81...1.0.82)

- Support parenthesized generic argument syntax with `::` disambiguator:
`Fn::() -> !`
([#&#8203;1096](https://togithub.com/dtolnay/syn/issues/1096))

### [`v1.0.81`](https://togithub.com/dtolnay/syn/releases/tag/1.0.81)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.80...1.0.81)

- Support arbitrary precision negative literal tokens on rustc 1.56+
([#&#8203;1087](https://togithub.com/dtolnay/syn/issues/1087),
[#&#8203;1088](https://togithub.com/dtolnay/syn/issues/1088))

### [`v1.0.80`](https://togithub.com/dtolnay/syn/releases/tag/1.0.80)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.79...1.0.80)

- Parse unstable `~const` syntax in where-clauses
([#&#8203;1083](https://togithub.com/dtolnay/syn/issues/1083), tracking
issue
[https://github.com/rust-lang/rust/issues/67792](https://togithub.com/rust-lang/rust/issues/67792))

### [`v1.0.79`](https://togithub.com/dtolnay/syn/releases/tag/1.0.79)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.78...1.0.79)

- Support trailing `+` in `dyn Trait` syntax, including bare (non-`dyn`)
pre-2018 trait object syntax
([#&#8203;1075](https://togithub.com/dtolnay/syn/issues/1075),
[#&#8203;1077](https://togithub.com/dtolnay/syn/issues/1077),
[#&#8203;1078](https://togithub.com/dtolnay/syn/issues/1078),
[#&#8203;1079](https://togithub.com/dtolnay/syn/issues/1079),
[#&#8203;1080](https://togithub.com/dtolnay/syn/issues/1080),
[#&#8203;1081](https://togithub.com/dtolnay/syn/issues/1081))

### [`v1.0.78`](https://togithub.com/dtolnay/syn/releases/tag/1.0.78)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.77...1.0.78)

- Parse trailing `+` in the bounds of `impl Trait` type
([#&#8203;1073](https://togithub.com/dtolnay/syn/issues/1073))

### [`v1.0.77`](https://togithub.com/dtolnay/syn/releases/tag/1.0.77)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.76...1.0.77)

- Match Rust 1.57+'s parsing of dot and question mark after a curly
braced macro invocation
([#&#8203;1068](https://togithub.com/dtolnay/syn/issues/1068))

### [`v1.0.76`](https://togithub.com/dtolnay/syn/releases/tag/1.0.76)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.75...1.0.76)

- Parse unstable `let`–`else` syntax
([#&#8203;1050](https://togithub.com/dtolnay/syn/issues/1050),
[#&#8203;1057](https://togithub.com/dtolnay/syn/issues/1057))
- Parse qualified braced variant expressions and patterns: `<E>::V {..}`
([#&#8203;1058](https://togithub.com/dtolnay/syn/issues/1058),
[#&#8203;1059](https://togithub.com/dtolnay/syn/issues/1059))
- Fix precedence of outer attributes in front of an assignment
expression in statement position
([#&#8203;1060](https://togithub.com/dtolnay/syn/issues/1060))

### [`v1.0.75`](https://togithub.com/dtolnay/syn/releases/tag/1.0.75)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.74...1.0.75)

-   Improve spans on a method without body inside an impl block
- Documentation improvements
([#&#8203;922](https://togithub.com/dtolnay/syn/issues/922), thanks
[@&#8203;Tamschi](https://togithub.com/Tamschi))

### [`v1.0.74`](https://togithub.com/dtolnay/syn/releases/tag/1.0.74)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.73...1.0.74)

- Reject `for<'a> dyn Trait<'a>` syntax; the correct representation is
`dyn for<'a> Trait<'a>`
([#&#8203;1042](https://togithub.com/dtolnay/syn/issues/1042))

### [`v1.0.73`](https://togithub.com/dtolnay/syn/releases/tag/1.0.73)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.72...1.0.73)

- Add From\<Ident>, From\<Index>, From\<usize> for Member
([#&#8203;1038](https://togithub.com/dtolnay/syn/issues/1038), thanks
[@&#8203;m-ou-se](https://togithub.com/m-ou-se))

### [`v1.0.72`](https://togithub.com/dtolnay/syn/releases/tag/1.0.72)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.71...1.0.72)

- Parse const generics which use value of a previous const generic
parameter as a default value
([#&#8203;1027](https://togithub.com/dtolnay/syn/issues/1027))

### [`v1.0.71`](https://togithub.com/dtolnay/syn/releases/tag/1.0.71)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.70...1.0.71)

- Fix panic deserializing an ItemImpl with a non-path in trait position
([#&#8203;1023](https://togithub.com/dtolnay/syn/issues/1023))
- Parse visibility on impl blocks
([#&#8203;1024](https://togithub.com/dtolnay/syn/issues/1024))
- Fix parsing a type parameter default on the first generic parameter of
an impl block
([#&#8203;1025](https://togithub.com/dtolnay/syn/issues/1025), thanks
[@&#8203;taiki-e](https://togithub.com/taiki-e))

### [`v1.0.70`](https://togithub.com/dtolnay/syn/releases/tag/1.0.70)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.69...1.0.70)

- Fix precedence of closure body vs ExprRange rhs: `|| .. .method()`
([#&#8203;1019](https://togithub.com/dtolnay/syn/issues/1019))
- Parse inner attributes inside of structs and enums
([#&#8203;1022](https://togithub.com/dtolnay/syn/issues/1022))

### [`v1.0.69`](https://togithub.com/dtolnay/syn/releases/tag/1.0.69)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.68...1.0.69)

- Improve Parse impls of ExprBox, ExprUnary, ExprLet, ExprClosure,
ExprReference, ExprBreak, ExprContinue, ExprReturn, ExprYield to respect
precedence for parsing a subexpression beginning with the respective
keyword/punctuation
([#&#8203;1007](https://togithub.com/dtolnay/syn/issues/1007),
[#&#8203;1008](https://togithub.com/dtolnay/syn/issues/1008),
[#&#8203;1009](https://togithub.com/dtolnay/syn/issues/1009),
[#&#8203;1010](https://togithub.com/dtolnay/syn/issues/1010),
[#&#8203;1011](https://togithub.com/dtolnay/syn/issues/1011),
[#&#8203;1012](https://togithub.com/dtolnay/syn/issues/1012),
[#&#8203;1013](https://togithub.com/dtolnay/syn/issues/1013),
[#&#8203;1014](https://togithub.com/dtolnay/syn/issues/1014),
[#&#8203;1015](https://togithub.com/dtolnay/syn/issues/1015))

### [`v1.0.68`](https://togithub.com/dtolnay/syn/releases/tag/1.0.68)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.67...1.0.68)

- Preserve span of `LexError` on conversion to `syn::Error`
([#&#8203;1006](https://togithub.com/dtolnay/syn/issues/1006))

### [`v1.0.67`](https://togithub.com/dtolnay/syn/releases/tag/1.0.67)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.66...1.0.67)

- Accept outer attributes in the Parse impl of ExprBlock
([#&#8203;1004](https://togithub.com/dtolnay/syn/issues/1004))

### [`v1.0.66`](https://togithub.com/dtolnay/syn/releases/tag/1.0.66)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.65...1.0.66)

- Parse equality constraints on generic associated types
([#&#8203;979](https://togithub.com/dtolnay/syn/issues/979))
- Parse default value exprs in const generic declarations
([#&#8203;980](https://togithub.com/dtolnay/syn/issues/980))
- Fix infinite loop parsing malformed type ascription expression in
non-`full` mode
([#&#8203;978](https://togithub.com/dtolnay/syn/issues/978))
- Improve Parse impls of ExprArray, ExprAsync, ExprBlock, ExprMacro,
ExprParen, ExprRepeat, ExprStruct, ExprTryBlock, ExprUnsafe to succeed
parsing even in the presence of trailing binary operators
([#&#8203;991](https://togithub.com/dtolnay/syn/issues/991),
[#&#8203;992](https://togithub.com/dtolnay/syn/issues/992),
[#&#8203;993](https://togithub.com/dtolnay/syn/issues/993),
[#&#8203;994](https://togithub.com/dtolnay/syn/issues/994),
[#&#8203;995](https://togithub.com/dtolnay/syn/issues/995),
[#&#8203;996](https://togithub.com/dtolnay/syn/issues/996),
[#&#8203;997](https://togithub.com/dtolnay/syn/issues/997),
[#&#8203;998](https://togithub.com/dtolnay/syn/issues/998),
[#&#8203;999](https://togithub.com/dtolnay/syn/issues/999))

### [`v1.0.65`](https://togithub.com/dtolnay/syn/releases/tag/1.0.65)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.64...1.0.65)

- Parse visibility on macro_rules
([#&#8203;981](https://togithub.com/dtolnay/syn/issues/981), tracking
issue
[rust-lang/rust#&#8203;78855](https://togithub.com/rust-lang/rust/issues/78855))
- Parse leading vert in or-patterns
([#&#8203;982](https://togithub.com/dtolnay/syn/issues/982), matching
the Rust grammar change in
[rust-lang/rust#&#8203;81869](https://togithub.com/rust-lang/rust/issues/81869))
- Parse static with omitted type
([#&#8203;983](https://togithub.com/dtolnay/syn/issues/983))
- Parse placeholder type in type parameter position
([#&#8203;984](https://togithub.com/dtolnay/syn/issues/984))

### [`v1.0.64`](https://togithub.com/dtolnay/syn/releases/tag/1.0.64)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.63...1.0.64)

- Avoid `clippy::expl_impl_clone_on_copy` pedantic lint in downstream
custom token types
([#&#8203;976](https://togithub.com/dtolnay/syn/issues/976))

### [`v1.0.63`](https://togithub.com/dtolnay/syn/releases/tag/1.0.63)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.62...1.0.63)

- Fix parsing associated types with empty trait bound list after colon
([#&#8203;974](https://togithub.com/dtolnay/syn/issues/974))

### [`v1.0.62`](https://togithub.com/dtolnay/syn/releases/tag/1.0.62)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.61...1.0.62)

- Republish to work around docs.rs bug
[https://github.com/rust-lang/docs.rs/issues/1300](https://togithub.com/rust-lang/docs.rs/issues/1300)

### [`v1.0.61`](https://togithub.com/dtolnay/syn/releases/tag/1.0.61)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.60...1.0.61)

- Improve assertion failures on invalid use of `Punctuated` API
([#&#8203;970](https://togithub.com/dtolnay/syn/issues/970), thanks
[@&#8203;osa1](https://togithub.com/osa1))
- Add `Lifetime::span` and `Lifetime::set_span` accessors
([#&#8203;971](https://togithub.com/dtolnay/syn/issues/971))

### [`v1.0.60`](https://togithub.com/dtolnay/syn/releases/tag/1.0.60)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.59...1.0.60)

- Provide an idiom for testing exhaustiveness of pattern matches on
`Expr`, `Type`, `Pat`, `Item`, `ForeignItem`, `TraitItem`, and
`ImplItem` ([#&#8203;694](https://togithub.com/dtolnay/syn/issues/694))

    ```rust
    match expr {
        Expr::Array(e) => {...}
        Expr::Assign(e) => {...}
        ...
        Expr::Yield(e) => {...}

        #[cfg(test)]
        Expr::__TestExhaustive(_) => unimplemented!(),
        #[cfg(not(test))]
        _ => { /* some sane fallback */ }
    }
    ```

The above is the only supported idiom for exhaustive matching of those
enum. Do not write anything differently as it is not supported.

The conditional compilation on match-arms lets us fail your tests but
not break your library when adding a variant. You will be notified by a
test failure when a variant is added, so that you can add code to handle
it, but your library will continue to compile and work for downstream
users in the interim.

### [`v1.0.59`](https://togithub.com/dtolnay/syn/releases/tag/1.0.59)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.58...1.0.59)

- Parse empty supertrait lists consistently with rustc
([#&#8203;952](https://togithub.com/dtolnay/syn/issues/952))
- Fix loss of span information on comma tokens inside of Type::Tuple
during parse
([#&#8203;959](https://togithub.com/dtolnay/syn/issues/959))

### [`v1.0.58`](https://togithub.com/dtolnay/syn/releases/tag/1.0.58)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.57...1.0.58)

- Allow literals to parse as a const generic path argument even without
"full" feature enabled
([#&#8203;951](https://togithub.com/dtolnay/syn/issues/951))

    ```rust
    pub struct Struct {
        array: Array<10>,  // used to require `features = "full"`
    }
    ```

### [`v1.0.57`](https://togithub.com/dtolnay/syn/releases/tag/1.0.57)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.56...1.0.57)

- Make Punctuated::new available as a `const fn`
([#&#8203;949](https://togithub.com/dtolnay/syn/issues/949))

### [`v1.0.56`](https://togithub.com/dtolnay/syn/releases/tag/1.0.56)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.55...1.0.56)

- Add
[`Error::into_compile_error`](https://docs.rs/syn/1.0.56/syn/struct.Error.html#method.into_compile_error)

### [`v1.0.55`](https://togithub.com/dtolnay/syn/releases/tag/1.0.55)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.54...1.0.55)

- Preserve None-delimited group around macro metavariable when parsing
`T<$ty>` ([#&#8203;944](https://togithub.com/dtolnay/syn/issues/944),
[#&#8203;945](https://togithub.com/dtolnay/syn/issues/945))

### [`v1.0.54`](https://togithub.com/dtolnay/syn/releases/tag/1.0.54)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.53...1.0.54)

- Fix parsing of `impl` items with macro metavariable in the trait path:
`impl $trait for Type {...}`
([#&#8203;942](https://togithub.com/dtolnay/syn/issues/942))

### [`v1.0.53`](https://togithub.com/dtolnay/syn/releases/tag/1.0.53)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.52...1.0.53)

- Parse `impl !Trait {...}` syntax
([#&#8203;936](https://togithub.com/dtolnay/syn/issues/936))

### [`v1.0.52`](https://togithub.com/dtolnay/syn/releases/tag/1.0.52)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.51...1.0.52)

- Parse `unsafe extern` block syntax
([#&#8203;918](https://togithub.com/dtolnay/syn/issues/918))
- Parse `unsafe mod` syntax
([#&#8203;919](https://togithub.com/dtolnay/syn/issues/919))
- Parse `const {...}` block syntax
([#&#8203;921](https://togithub.com/dtolnay/syn/issues/921))
- Parse destructuring assignment syntax
([#&#8203;933](https://togithub.com/dtolnay/syn/issues/933))

### [`v1.0.51`](https://togithub.com/dtolnay/syn/releases/tag/1.0.51)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.50...1.0.51)

- Allow parsing signatures in which const generic params appear in front
of lifetime params
([#&#8203;920](https://togithub.com/dtolnay/syn/issues/920))

### [`v1.0.50`](https://togithub.com/dtolnay/syn/releases/tag/1.0.50)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.48...1.0.50)

- Apply `doc(cfg(...))` on feature gated APIs for docs.rs-rendered
documentation
([#&#8203;925](https://togithub.com/dtolnay/syn/issues/925))

### [`v1.0.48`](https://togithub.com/dtolnay/syn/releases/tag/1.0.48)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.47...1.0.48)

-   Rebuild for https://astexplorer.net

### [`v1.0.47`](https://togithub.com/dtolnay/syn/releases/tag/1.0.47)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.46...1.0.47)

-   Documentation improvements

### [`v1.0.46`](https://togithub.com/dtolnay/syn/releases/tag/1.0.46)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.45...1.0.46)

- Fix parsing structured attributes that contain nested absolute paths,
such as `#[derive(::serde::Serialize)]`
([#&#8203;909](https://togithub.com/dtolnay/syn/issues/909))

### [`v1.0.45`](https://togithub.com/dtolnay/syn/releases/tag/1.0.45)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.44...1.0.45)

- Provide more detailed error messages when parsing specific literal
kind ([#&#8203;908](https://togithub.com/dtolnay/syn/issues/908))

### [`v1.0.44`](https://togithub.com/dtolnay/syn/releases/tag/1.0.44)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.43...1.0.44)

- Fix some parsing of patterns inside of None-delimited groups
([#&#8203;907](https://togithub.com/dtolnay/syn/issues/907))

### [`v1.0.43`](https://togithub.com/dtolnay/syn/releases/tag/1.0.43)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.42...1.0.43)

-   Add Parse impl for syn::Signature

### [`v1.0.42`](https://togithub.com/dtolnay/syn/releases/tag/1.0.42)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.41...1.0.42)

- Fix several bugs involving unusual suffixes on integer and floating
point literal tokens
([#&#8203;898](https://togithub.com/dtolnay/syn/issues/898),
[#&#8203;899](https://togithub.com/dtolnay/syn/issues/899),
[#&#8203;900](https://togithub.com/dtolnay/syn/issues/900))

### [`v1.0.41`](https://togithub.com/dtolnay/syn/releases/tag/1.0.41)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.40...1.0.41)

- Fix panic on printing an incomplete (having fewer path segments than
originally parsed with) qualified path (ExprPath, PatPath, TypePath
containing QSelf)
([#&#8203;891](https://togithub.com/dtolnay/syn/issues/891), thanks
[@&#8203;taiki-e](https://togithub.com/taiki-e))
- Fix panic triggered by syntactically invalid overflowing negative
float literal after `.` in a field access position, e.g. `let _ =
obj.-0.9E999999`
([#&#8203;895](https://togithub.com/dtolnay/syn/issues/895), thanks
[@&#8203;sameer](https://togithub.com/sameer))
- Enable using `parse_macro_input!` with a Parser function rather than
type having a Parse impl
([#&#8203;896](https://togithub.com/dtolnay/syn/issues/896), thanks
[@&#8203;sbrocket](https://togithub.com/sbrocket))

### [`v1.0.40`](https://togithub.com/dtolnay/syn/releases/tag/1.0.40)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.39...1.0.40)

- Fix panic on parsing float literals having both an exponent and a
suffix beginning with 'e' or 'E', such as `9e99e999`
([#&#8203;893](https://togithub.com/dtolnay/syn/issues/893))

### [`v1.0.39`](https://togithub.com/dtolnay/syn/releases/tag/1.0.39)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.38...1.0.39)

- Improve compile time by pre-expanding derives
([#&#8203;885](https://togithub.com/dtolnay/syn/issues/885))
- Parse const generic parameters in any order relative to type
parameters ([#&#8203;886](https://togithub.com/dtolnay/syn/issues/886))

### [`v1.0.38`](https://togithub.com/dtolnay/syn/releases/tag/1.0.38)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.37...1.0.38)

- Accept traits with parenthesized path arguments in impls
([#&#8203;880](https://togithub.com/dtolnay/syn/issues/880), thanks
[@&#8203;alecmocatta](https://togithub.com/alecmocatta))

### [`v1.0.37`](https://togithub.com/dtolnay/syn/releases/tag/1.0.37)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.36...1.0.37)

- Handle shebang in a way that matches rustc 1.46+
([#&#8203;876](https://togithub.com/dtolnay/syn/issues/876),
[https://github.com/rust-lang/rust/pull/71487](https://togithub.com/rust-lang/rust/pull/71487),
[https://github.com/rust-lang/rust/pull/73596](https://togithub.com/rust-lang/rust/pull/73596))

    ```rust
    #!//am/i/a/comment

    fn main() {} // ^ shebang
    ```

    ```rust
    #!//am/i/a/comment

    [allow(dead_code)] // ^ not a shebang
    fn main() {}
    ```

- Accept <code>tuple.0.  0</code> as a tuple indexing expression
([#&#8203;877](https://togithub.com/dtolnay/syn/issues/877))

### [`v1.0.36`](https://togithub.com/dtolnay/syn/releases/tag/1.0.36)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.35...1.0.36)

- Add Lit::span, Lit::set_span
([#&#8203;874](https://togithub.com/dtolnay/syn/issues/874))

### [`v1.0.35`](https://togithub.com/dtolnay/syn/releases/tag/1.0.35)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.34...1.0.35)

- Fix parsing of Expr::Field in non-full mode
([#&#8203;870](https://togithub.com/dtolnay/syn/issues/870))

### [`v1.0.34`](https://togithub.com/dtolnay/syn/releases/tag/1.0.34)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.33...1.0.34)

-   Documentation improvements

### [`v1.0.33`](https://togithub.com/dtolnay/syn/releases/tag/1.0.33)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.32...1.0.33)

- Parse `tuple.0.0` as an indexing expression
([https://github.com/rust-lang/rust/pull/71322](https://togithub.com/rust-lang/rust/pull/71322))
- Add `Parse` impls for optional of proc-macro2 types:
`Option<TokenTree>`, `Option<Punct>`, `Option<Literal>`, `Option<Group>`

### [`v1.0.32`](https://togithub.com/dtolnay/syn/releases/tag/1.0.32)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.31...1.0.32)

- Fix parsing $:item macro_rules metavariables containing outer
attributes ([#&#8203;852](https://togithub.com/dtolnay/syn/issues/852))

### [`v1.0.31`](https://togithub.com/dtolnay/syn/releases/tag/1.0.31)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.30...1.0.31)

- Add
[`Expr::parse_without_eager_brace`](https://docs.rs/syn/1.0.31/syn/enum.Expr.html#method.parse_without_eager_brace)
to parse expressions in ambiguous syntactic position.

Rust grammar has an ambiguity where braces sometimes turn a path
expression into a struct initialization and sometimes do not. In the
following code, the expression `S {}` is one expression. Presumably
there is an empty struct `struct S {}` defined somewhere which it is
instantiating.

    ```rust
    let _ = *S {};

    // parsed by rustc as: `*(S {})`
    ```

We would want to parse the above using `Expr::parse` after the `=`
token.

    But in the following, `S {}` is *not* a struct init expression.

    ```rust
    if *S {} {}

    // parsed by rustc as:
    //
    //    if (*S) {
    //        /* empty block */
    //    }
    //    {
    //        /* another empty block */
    //    }
    ```

For that reason we would want to parse if-conditions using
`Expr::parse_without_eager_brace` after the `if` token. Same for similar
syntactic positions such as the condition expr after a `while` token or
the expr at the top of a `match`.

The Rust grammar's choices around which way this ambiguity is resolved
at various syntactic positions is fairly arbitrary. Really either parse
behavior could work in most positions, and language designers just
decide each case based on which is more likely to be what the programmer
had in mind most of the time.

    ```rust
    if return S {} {}

    // parsed by rustc as:
    //
    //    if (return (S {})) {
    //    }
    //
    // but could equally well have been this other arbitrary choice:
    //
    //    if (return S) {
    //    }
    //    {}
    ```

Note the grammar ambiguity on trailing braces is distinct from
precedence and is not captured by assigning a precedence level to the
braced struct init expr in relation to other operators. This can be
illustrated by `return 0..S {}` vs `match 0..S {}`. The former parses as
`return (0..(S {}))` implying tighter precedence for struct init than
`..`, while the latter parses as `match (0..S) {}` implying tighter
precedence for `..` than struct init, a contradiction.

### [`v1.0.30`](https://togithub.com/dtolnay/syn/releases/tag/1.0.30)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.29...1.0.30)

- Parse struct init expressions where the type name is an interpolated
macro_rules metavariable, such as `$struct {}` where $struct:ident
([#&#8203;842](https://togithub.com/dtolnay/syn/issues/842))
- Handle nesting of None-delimited groups
([#&#8203;843](https://togithub.com/dtolnay/syn/issues/843), thanks
[@&#8203;Aaron1011](https://togithub.com/Aaron1011))

### [`v1.0.29`](https://togithub.com/dtolnay/syn/releases/tag/1.0.29)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.28...1.0.29)

- Parse macro call exprs where the macro name is an interpolated
macro_rules metavariable, such as `$macro!()`
([#&#8203;838](https://togithub.com/dtolnay/syn/issues/838))
- Parse paths containing generic parameters where the first path segment
is an interpolated macro_rules metavariable, such as `$seg<'a>`
([#&#8203;839](https://togithub.com/dtolnay/syn/issues/839))

### [`v1.0.28`](https://togithub.com/dtolnay/syn/releases/tag/1.0.28)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.27...1.0.28)

- Recognize empty None-delimited group produced by interpolating a $:vis
macro metavariable when parsing a Visibility
([#&#8203;836](https://togithub.com/dtolnay/syn/issues/836))

### [`v1.0.27`](https://togithub.com/dtolnay/syn/releases/tag/1.0.27)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.26...1.0.27)

- Parse function calls in which the callee is an interpolated macro
variable `$fn(...)`
([#&#8203;833](https://togithub.com/dtolnay/syn/issues/833))

### [`v1.0.26`](https://togithub.com/dtolnay/syn/releases/tag/1.0.26)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.25...1.0.26)

- Parse paths containing an interpolated first component, such as
`$first::rest`
([https://github.com/rust-lang/rust/issues/72608](https://togithub.com/rust-lang/rust/issues/72608),
[#&#8203;832](https://togithub.com/dtolnay/syn/issues/832))

### [`v1.0.25`](https://togithub.com/dtolnay/syn/releases/tag/1.0.25)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.24...1.0.25)

- Parse opt-out `?const` trait bounds
([#&#8203;767](https://togithub.com/dtolnay/syn/issues/767))
- Parse const generics in method generic arguments
([#&#8203;816](https://togithub.com/dtolnay/syn/issues/816), thanks
[@&#8203;yodaldevoid](https://togithub.com/yodaldevoid))
- Parse trait bounds on type alias items
([#&#8203;821](https://togithub.com/dtolnay/syn/issues/821))
- Parse const generics on impl blocks
([#&#8203;822](https://togithub.com/dtolnay/syn/issues/822))
- Fix precedence of attributes on binary expressions to match rustc
([#&#8203;823](https://togithub.com/dtolnay/syn/issues/823))
- Remove parsing of `extern::` paths which were removed from nightly in
January 2019
([#&#8203;825](https://togithub.com/dtolnay/syn/issues/825),
[https://github.com/rust-lang/rust/pull/57572](https://togithub.com/rust-lang/rust/pull/57572))
- Add `Punctuated::clear`, analogous to Vec::clear
([#&#8203;828](https://togithub.com/dtolnay/syn/issues/828))

### [`v1.0.24`](https://togithub.com/dtolnay/syn/releases/tag/1.0.24)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.23...1.0.24)

- Parse `mut self` receiver in function pointer type
([#&#8203;812](https://togithub.com/dtolnay/syn/issues/812),
[#&#8203;814](https://togithub.com/dtolnay/syn/issues/814))
- Parse const trait impls
([#&#8203;813](https://togithub.com/dtolnay/syn/issues/813))
- Improve error reporting inside struct expressions and struct patterns
([#&#8203;818](https://togithub.com/dtolnay/syn/issues/818))

### [`v1.0.23`](https://togithub.com/dtolnay/syn/releases/tag/1.0.23)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.22...1.0.23)

- Parse inner attributes in traits
([#&#8203;803](https://togithub.com/dtolnay/syn/issues/803))
- Parse const underscore in traits and impls
([#&#8203;804](https://togithub.com/dtolnay/syn/issues/804))
- Implement Extend<Error> for Error
([#&#8203;805](https://togithub.com/dtolnay/syn/issues/805))
- Parse Or patterns
([#&#8203;806](https://togithub.com/dtolnay/syn/issues/806))
- Parse outer attributes on Expr\* structs
([#&#8203;807](https://togithub.com/dtolnay/syn/issues/807))
- Parse top level const/static without value
([#&#8203;808](https://togithub.com/dtolnay/syn/issues/808))
- Parse syntactically accepted functions
([#&#8203;809](https://togithub.com/dtolnay/syn/issues/809))
- Parse extern static with value
([#&#8203;810](https://togithub.com/dtolnay/syn/issues/810))

Thanks [@&#8203;taiki-e](https://togithub.com/taiki-e) for all of these.

### [`v1.0.22`](https://togithub.com/dtolnay/syn/releases/tag/1.0.22)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.21...1.0.22)

- Parse literal suffix on byte string, byte, and char literal tokens:
`br#"..."#suffix`, `b'?'suffix`, `'?'suffix`
([#&#8203;799](https://togithub.com/dtolnay/syn/issues/799),
[#&#8203;800](https://togithub.com/dtolnay/syn/issues/800))

### [`v1.0.21`](https://togithub.com/dtolnay/syn/releases/tag/1.0.21)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.20...1.0.21)

-   Documentation improvements

### [`v1.0.20`](https://togithub.com/dtolnay/syn/releases/tag/1.0.20)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.19...1.0.20)

- Improve span of error message when an error during
`syn::Macro::parse_body` is triggered past the last token of the macro
body ([#&#8203;791](https://togithub.com/dtolnay/syn/issues/791))

### [`v1.0.19`](https://togithub.com/dtolnay/syn/releases/tag/1.0.19)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.18...1.0.19)

- Parse a more lenient extern type syntax inside extern blocks
([#&#8203;763](https://togithub.com/dtolnay/syn/issues/763))

### [`v1.0.18`](https://togithub.com/dtolnay/syn/releases/tag/1.0.18)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.17...1.0.18)

- Ignore unparsed empty None-delimited groups at the end of a macro
input ([#&#8203;783](https://togithub.com/dtolnay/syn/issues/783))

### [`v1.0.17`](https://togithub.com/dtolnay/syn/releases/tag/1.0.17)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.16...1.0.17)

-   Expose `syn::Lit` in `default-features = false` mode

### [`v1.0.16`](https://togithub.com/dtolnay/syn/releases/tag/1.0.16)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.15...1.0.16)

- Fix parsing of `&raw` raw reference operator
([https://github.com/rust-lang/rust/issues/64490](https://togithub.com/rust-lang/rust/issues/64490))
to require explicitly specified constness, `&raw mut` or `&raw const`

### [`v1.0.15`](https://togithub.com/dtolnay/syn/releases/tag/1.0.15)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.14...1.0.15)

- Add
[`Punctuated::first_mut`](https://docs.rs/syn/1.0.15/syn/punctuated/struct.Punctuated.html#method.first_mut)
to return a mut reference to the first sequence element

### [`v1.0.14`](https://togithub.com/dtolnay/syn/releases/tag/1.0.14)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.13...1.0.14)

- Produce more helpful error messages from
[Attribute::parse_args](https://docs.rs/syn/1.0/syn/struct.Attribute.html#method.parse_args)

### [`v1.0.13`](https://togithub.com/dtolnay/syn/releases/tag/1.0.13)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.12...1.0.13)

- Allow parse_quote! to parse Vec\<Stmt>, with the same behavior as
Block::parse_within
([#&#8203;741](https://togithub.com/dtolnay/syn/issues/741))

### [`v1.0.12`](https://togithub.com/dtolnay/syn/releases/tag/1.0.12)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.11...1.0.12)

- Reject function signatures with an incorrectly placed receiver
parameter, like `fn f(x: u8, &self)`
- Produce correctly spanned error when parsing punct beyond the end of a
delimited group
([#&#8203;739](https://togithub.com/dtolnay/syn/issues/739))

### [`v1.0.11`](https://togithub.com/dtolnay/syn/releases/tag/1.0.11)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.10...1.0.11)

- Implement quote::IdentFragment for syn::Member and syn::Index so that
spans are preserved when using these types in quote's `format_ident!`
macro

    ```rust
    use quote::format_ident;
    use syn::Index;

    let index: Index = /* ... */;
    let ident = format_ident!("__{}", index); // produces __0, __1, etc
    ```

### [`v1.0.10`](https://togithub.com/dtolnay/syn/releases/tag/1.0.10)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.9...1.0.10)

- Provide `Hash` and `Eq` impls for syn::Member even without
"extra-traits" feature enabled, as this type is commonly useful in a
hashset

### [`v1.0.9`](https://togithub.com/dtolnay/syn/releases/tag/1.0.9)

[Compare Source](https://togithub.com/dtolnay/syn/compare/1.0.8...1.0.9)

- Fix failure to parse tuple struct fields of tuple type starting with
`crate` ([#&#8203;720](https://togithub.com/dtolnay/syn/issues/720),
[#&#8203;723](https://togithub.com/dtolnay/syn/issues/723), thanks
[@&#8203;mystor](https://togithub.com/mystor))
- Fix unexpected tokens being ignored when using Speculative::advance_to
([#&#8203;721](https://togithub.com/dtolnay/syn/issues/721),
[#&#8203;723](https://togithub.com/dtolnay/syn/issues/723), thanks
[@&#8203;mystor](https://togithub.com/mystor))

### [`v1.0.8`](https://togithub.com/dtolnay/syn/releases/tag/1.0.8)

[Compare Source](https://togithub.com/dtolnay/syn/compare/1.0.7...1.0.8)

- Require trailing comma when parsing TypeTuple with one element
([#&#8203;716](https://togithub.com/dtolnay/syn/issues/716), thanks
[@&#8203;8BitMate](https://togithub.com/8BitMate))

### [`v1.0.7`](https://togithub.com/dtolnay/syn/releases/tag/1.0.7)

[Compare Source](https://togithub.com/dtolnay/syn/compare/1.0.6...1.0.7)

- Add a receiver getter to syn::Signature
([#&#8203;714](https://togithub.com/dtolnay/syn/issues/714), thanks
[@&#8203;mystor](https://togithub.com/mystor))

    ```rust
    impl Signature {
/// A method's `self` receiver, such as `&self` or `self: Box<Self>`.
        pub fn receiver(&self) -> Option<&FnArg>;
    }
    ```

### [`v1.0.6`](https://togithub.com/dtolnay/syn/releases/tag/1.0.6)

[Compare Source](https://togithub.com/dtolnay/syn/compare/1.0.5...1.0.6)

- Add conversions from Item{Struct,Enum,Union} into DeriveInput
([#&#8203;711](https://togithub.com/dtolnay/syn/issues/711), thanks
[@&#8203;mystor](https://togithub.com/mystor))
- Add Fields::len and Fields::is_empty
([#&#8203;712](https://togithub.com/dtolnay/syn/issues/712), thanks
[@&#8203;mjbshaw](https://togithub.com/mjbshaw))

### [`v1.0.5`](https://togithub.com/dtolnay/syn/releases/tag/1.0.5)

[Compare Source](https://togithub.com/dtolnay/syn/compare/1.0.4...1.0.5)

- Expose syn::Variadic with just "derive" feature, not "full", because
it appears in Type::BareFn

### [`v1.0.4`](https://togithub.com/dtolnay/syn/releases/tag/1.0.4)

[Compare Source](https://togithub.com/dtolnay/syn/compare/1.0.3...1.0.4)

- Fix size_hint of Punctuated iterators
([#&#8203;700](https://togithub.com/dtolnay/syn/issues/700), thanks
[@&#8203;ExpHP](https://togithub.com/ExpHP))

### [`v1.0.3`](https://togithub.com/dtolnay/syn/releases/tag/1.0.3)

[Compare Source](https://togithub.com/dtolnay/syn/compare/1.0.2...1.0.3)

- Add
[`Path::get_ident`](https://docs.rs/syn/1.0/syn/struct.Path.html#method.get_ident)
([#&#8203;696](https://togithub.com/dtolnay/syn/issues/696), thanks
[@&#8203;infinity0](https://togithub.com/infinity0))

### [`v1.0.2`](https://togithub.com/dtolnay/syn/releases/tag/1.0.2)

[Compare Source](https://togithub.com/dtolnay/syn/compare/1.0.1...1.0.2)

-   Documentation improvements

### [`v1.0.1`](https://togithub.com/dtolnay/syn/releases/tag/1.0.1)

[Compare Source](https://togithub.com/dtolnay/syn/compare/1.0.0...1.0.1)

- Add
[`LitInt::base10_parse`](https://docs.rs/syn/1.0/syn/struct.LitInt.html#method.base10\_parse)
to produce error that has the right span when parsing literal digits

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://app.renovatebot.com/dashboard#github/agbrs/agb).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS4xMC4yIiwidXBkYXRlZEluVmVyIjoiMzUuMTcuMSJ9-->
mohammadfawaz added a commit to essential-contributions/pint that referenced this pull request Jul 12, 2023
Closes #72 

Fairly simple change:
- Tuple types
- Tuple expressions
- Tuple indexing expressions. Error out on invalid indices such as `0xa`
or anything that is not a `usize`.

Note that `t.0.0` does not currently work, but `t.0 .0`. Once we
implement #66, we can then write `(t.0).0`. In the future, we can
support `t.0.0` which can be done in two ways:
- Special case the lexer to _not_ parse the `0.0` as a real in the case
of a tuple access (this means the lexer now has to concern itself with
the context).
- Break the real `0.0` apart in the pasrer, which kinda what Rust does
(see rust-lang/rust#71322 after an attempt for
the other method in rust-lang/rust#70420)
yoav-lavi referenced this pull request in grafbase/grafbase Sep 5, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [syn](https://togithub.com/dtolnay/syn) | dependencies | major | `1`
-> `2` |

---

### Release Notes

<details>
<summary>dtolnay/syn (syn)</summary>

### [`v2.0.27`](https://togithub.com/dtolnay/syn/releases/tag/2.0.27)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.26...2.0.27)

- Documentation improvements (thanks
[@&#8203;GuillaumeGomez](https://togithub.com/GuillaumeGomez))

### [`v2.0.26`](https://togithub.com/dtolnay/syn/releases/tag/2.0.26)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.25...2.0.26)

- Implement `Spanned` for `QSelf`
([#&#8203;1465](https://togithub.com/dtolnay/syn/issues/1465))

### [`v2.0.25`](https://togithub.com/dtolnay/syn/releases/tag/2.0.25)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.24...2.0.25)

- Support single identifier as unbraced const generic argument
([#&#8203;1483](https://togithub.com/dtolnay/syn/issues/1483))
- Produce error message when LitStr::parse is used on a suffixed string
literal ([#&#8203;1484](https://togithub.com/dtolnay/syn/issues/1484))

### [`v2.0.24`](https://togithub.com/dtolnay/syn/releases/tag/2.0.24)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.23...2.0.24)

- Fix duplication of braces around const generic argument in non-full
mode ([#&#8203;1482](https://togithub.com/dtolnay/syn/issues/1482))

### [`v2.0.23`](https://togithub.com/dtolnay/syn/releases/tag/2.0.23)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.22...2.0.23)

- Preserve attributes on verbatim Item in statement position
([#&#8203;1476](https://togithub.com/dtolnay/syn/issues/1476))
- Support generic_const_exprs where-clauses such as `where [(); {
T::COUNT }]:` in non-"full" mode
([#&#8203;1478](https://togithub.com/dtolnay/syn/issues/1478))

### [`v2.0.22`](https://togithub.com/dtolnay/syn/releases/tag/2.0.22)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.21...2.0.22)

- Parse `c"…"` c-string literals (tracking issue:
[https://github.com/rust-lang/rust/issues/105723](https://togithub.com/rust-lang/rust/issues/105723))

### [`v2.0.21`](https://togithub.com/dtolnay/syn/releases/tag/2.0.21)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.20...2.0.21)

- Fix value computed by `LitByteStr::value` in the case of a cooked byte
string literal containing form feed or vertical tab characters following
an escaped newline
([#&#8203;1474](https://togithub.com/dtolnay/syn/issues/1474))

### [`v2.0.20`](https://togithub.com/dtolnay/syn/releases/tag/2.0.20)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.19...2.0.20)

-   Documentation improvements

### [`v2.0.19`](https://togithub.com/dtolnay/syn/releases/tag/2.0.19)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.18...2.0.19)

- Improve rendering of compile errors within 2015-edition code calling a
2018+ edition proc macro
([#&#8203;1467](https://togithub.com/dtolnay/syn/issues/1467), thanks
[@&#8203;danielhenrymantilla](https://togithub.com/danielhenrymantilla))

### [`v2.0.18`](https://togithub.com/dtolnay/syn/releases/tag/2.0.18)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.17...2.0.18)

- Permit empty attr in syn::meta::parser
([#&#8203;1460](https://togithub.com/dtolnay/syn/issues/1460))

### [`v2.0.17`](https://togithub.com/dtolnay/syn/releases/tag/2.0.17)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.16...2.0.17)

- Enable proc_macro support on wasm targets
([#&#8203;1459](https://togithub.com/dtolnay/syn/issues/1459))

### [`v2.0.16`](https://togithub.com/dtolnay/syn/releases/tag/2.0.16)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.15...2.0.16)

- Parse `builtin #` syntax as Expr::Verbatim
([https://github.com/rust-lang/rust/issues/110680](https://togithub.com/rust-lang/rust/issues/110680),
[#&#8203;1454](https://togithub.com/dtolnay/syn/issues/1454))

### [`v2.0.15`](https://togithub.com/dtolnay/syn/releases/tag/2.0.15)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.14...2.0.15)

- Ensure `Type::Tuple` of length 1 prints as a tuple even if trailing
comma is not provided in the Punctuated
([#&#8203;1444](https://togithub.com/dtolnay/syn/issues/1444), thanks
[@&#8203;Fancyflame](https://togithub.com/Fancyflame))

### [`v2.0.14`](https://togithub.com/dtolnay/syn/releases/tag/2.0.14)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.13...2.0.14)

- Add Punctuated::pop_punct()
([#&#8203;1442](https://togithub.com/dtolnay/syn/issues/1442), thanks
[@&#8203;programmerjake](https://togithub.com/programmerjake))

### [`v2.0.13`](https://togithub.com/dtolnay/syn/releases/tag/2.0.13)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.12...2.0.13)

- Improve spans of Expr::Field parsed from a float Literal
([#&#8203;1433](https://togithub.com/dtolnay/syn/issues/1433),
[#&#8203;1436](https://togithub.com/dtolnay/syn/issues/1436))

### [`v2.0.12`](https://togithub.com/dtolnay/syn/releases/tag/2.0.12)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.11...2.0.12)

- Refer to `compile_error!` by absolute path in token stream produced by
syn::Error::to_compile_error
([#&#8203;1431](https://togithub.com/dtolnay/syn/issues/1431), thanks
[@&#8203;smoelius](https://togithub.com/smoelius))

### [`v2.0.11`](https://togithub.com/dtolnay/syn/releases/tag/2.0.11)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.10...2.0.11)

- Improve error message on empty parens inside parse_nested_meta
([#&#8203;1428](https://togithub.com/dtolnay/syn/issues/1428))

### [`v2.0.10`](https://togithub.com/dtolnay/syn/releases/tag/2.0.10)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/2.0.9...2.0.10)

- Fix visibility being parsed incorrectly on macro invocations inside of
a trait

### [`v2.0.9`](https://togithub.com/dtolnay/syn/releases/tag/2.0.9)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.8...2.0.9)

- Disallow `type` items in an extern block, trait, or module from being
marked `default`

### [`v2.0.8`](https://togithub.com/dtolnay/syn/releases/tag/2.0.8)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.7...2.0.8)

- Treat `try` keyword as 2015-edition identifier in definition of try
macro ([#&#8203;1422](https://togithub.com/dtolnay/syn/issues/1422))

### [`v2.0.7`](https://togithub.com/dtolnay/syn/releases/tag/2.0.7)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.6...2.0.7)

-   Fix parsing of `mut self` inside of Type::BareFn

### [`v2.0.6`](https://togithub.com/dtolnay/syn/releases/tag/2.0.6)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.5...2.0.6)

- Improve error message on missing ';' between statements
([#&#8203;1419](https://togithub.com/dtolnay/syn/issues/1419))
- Keep non-brace macro invocations in trailing expr position as
Expr::Macro
([#&#8203;1420](https://togithub.com/dtolnay/syn/issues/1420))

### [`v2.0.5`](https://togithub.com/dtolnay/syn/releases/tag/2.0.5)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.4...2.0.5)

- Expose `ExprMacro` data structure even when `features="full"` is not
used ([#&#8203;1417](https://togithub.com/dtolnay/syn/issues/1417))

### [`v2.0.4`](https://togithub.com/dtolnay/syn/releases/tag/2.0.4)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.3...2.0.4)

- Improve error reporting when parsing identifiers and paths
([#&#8203;1415](https://togithub.com/dtolnay/syn/issues/1415),
[#&#8203;1416](https://togithub.com/dtolnay/syn/issues/1416))

### [`v2.0.3`](https://togithub.com/dtolnay/syn/releases/tag/2.0.3)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.2...2.0.3)

- Expose `ExprGroup` data structure even when `features="full"` is not
used ([#&#8203;1412](https://togithub.com/dtolnay/syn/issues/1412))

### [`v2.0.2`](https://togithub.com/dtolnay/syn/releases/tag/2.0.2)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.1...2.0.2)

-   Documentation improvements

### [`v2.0.1`](https://togithub.com/dtolnay/syn/releases/tag/2.0.1)

[Compare Source](https://togithub.com/dtolnay/syn/compare/2.0.0...2.0.1)

- Add methods on syn::Meta for reporting error on an incorrect kind of
attribute ([#&#8203;1409](https://togithub.com/dtolnay/syn/issues/1409))

### [`v2.0.0`](https://togithub.com/dtolnay/syn/releases/tag/2.0.0)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.109...2.0.0)

This release contains a batch of syntax tree improvements to incorporate
ongoing Rust language development from the past 3.5 years since syn 1.

It never seems like an ideal time to finalize a syntax tree design,
considering the frankly alarming number of syntax-disrupting language
features currently in flight: keyword generics, restrictions,
capabilities and contexts, conditional constness, new varieties of
literals, dyn revamp such as explicitly dyn-safe traits and dyn-star,
expression syntax in various phases of being added or being torn out
(const blocks, try blocks, raw references), auto traits and negative
impls, generalizations to higher rank trait bounds, async closures and
static async trait methods, postfix keywords, pattern types, return type
notation, unsafe attributes, …

The plan continues to be the same as laid out originally in the 1.0.0
release announcement:

> Be aware that the underlying Rust language will continue to evolve.
Syn is able to accommodate most kinds of Rust grammar changes via the
nonexhaustive enums and `Verbatim` variants in the syntax tree, but we
will plan to put out new major versions on a 12 to 24 month cadence to
incorporate ongoing language changes as needed.

If anything, the takeaway from the 3.5 year longevity of syn 1 is that
this period was tamer from a language development perspective than
anticipated, but that is unlikely to last and I think around 24 months
is still the correct cadence to expect between releases going forward.

<br>

<p align="center"><a href="https://docs.rs/syn/2/syn/">[API
documentation for 2.0]</a></p>

### Breaking changes

-   Minimum required Rust version is raised from rustc 1.31 to 1.56.

##### Expressions

- Support for `box expr` syntax has been deleted, as it has been deleted
recently from rustc.

- Support for type ascription syntax `expr: Type` in expression position
has been deleted.

- Support for unstable `&raw const expr` raw-pointer reference syntax
has been deleted.

- The representation of generic arguments has been unified between
method calls and non-method paths into a single `GenericArgument` type,
which supersedes the previous `GenericMethodArgument` and
`MethodTurbofish`.

- Generic arguments now distinguish between associated types
(`AssocType`) and associated constant values (`AssocConst`). Previously
these would be parsed ambiguously as `Binding`.

- The binary assignment operators in `BinOp` have been renamed to align
with the naming used by the standard library's `core::ops` module's
traits. For example `BinOp::AddEq` is now called `BinOp::AddAssign`.

- `Expr::Struct` struct construction expressions now support structs
which are a variant of an enum associated type of a trait, as in `<Type
as Trait>::Assoc::Variant { ... }`, which has recently been added to
Rust.

- `Expr::Range` now follows the `start` and `end` naming used by the
standard library's `RangeBounds` trait, rather than `from`/`to` or
`lo`/`hi`.

- `Expr::AssignOp` has been merged into `Expr::Binary`, which now
represents both non-assignment and assignment binary operators.

- Stricter parsing of ranges. None of the following are valid
expressions, but were previously accepted by syn: `..=`, `lo..=`, `...`,
`...hi`, `lo...`, `lo...hi`.

- `Expr::Closure` now includes a representation for `for<...>`
lifetimes.

##### Statements

- Variants `Stmt::Expr` (tail-position expression without trailing
semicolon) and `Stmt::Semi` (non-tail expression with trailing
semicolon) have been combined into `Stmt::Expr` with the optional
semicolon represented by `Option<Token![;]>`.

- The syntax tree for `Stmt::Local` has been extended to handle
`let`/`else` syntax.

- Macros in statement position are now uniformly parsed as
`Stmt::Macro`. Previously these would be disambiguated to `Stmt::Item`,
although it was ambiguous whether a macro in statement position would
expand to an item (like `thread_local! { ... }`) vs an expression (like
`println! { ... }`).

##### Patterns

- Pattern parsing for all the different syntactic positions in which
patterns are allowed has been split into `Pat::parse_single` (for
function- and closure-argument position, where top-level `|` is not
allowed), `Pat::parse_multi` (where `|` is allowed) and
`Pat::parse_multi_with_leading_vert` (for the pattern of match arms,
which allow an optional leading `|`). Previously only a single `parse`
behavior was supported and behaved like the new `parse_single`.

- The `Pat` syntax tree now shares more common data structures with the
`Expr` syntax tree where possible, such as for literals, paths, macros,
and ranges in pattern position.

- Parsing of struct field patterns does a better job rejecting bogus
syntax such as `Struct { 0 asdf }` and `Struct { ref mut 0: asdf }`,
which were previously incorrectly accepted.

- `Pat::Range` now supports one-sided ranges by representing the start
and end bound of the range by `Option<Expr>`.

- `Pat::Struct` keeps track of attributes on the optional `..` "rest"
part of the pattern, as in `let Struct { x, #[cfg(any())] .. } = _;`.

- Parsing unary negation now enforces that only literal patterns can be
unarily negated. For example `-self::CONST` and `-const { 0i32 }` are
not valid syntax in pattern position.

- `Pat::TupleStruct` no longer wraps a value of type `PatTuple` but
represents that information in its fields directly.

- A single parenthesized pattern without trailing comma inside the
parentheses is no longer considered a `Pat::Tuple`, it will be parsed as
`Pat::Paren`.

- One-sided range patterns are no longer allowed inside of slice
patterns. `[lo..]` and `[..=hi]` are not considered valid pattern syntax
by Rust.

##### Items

- Typed `self` in a method signature, such as `self: Pin<&mut Self>`,
will now be parsed as `FnArg::Receiver`. This means `self`, whether with
or without an explicit type, is always treated as a `Receiver`.
Previously only the `&self` and `&mut self` shorthand receivers were
parsed as `Receiver`.

- `TraitItem::Method` and `ImplItem::Method` have been renamed to
`TraitItem::Fn` and `ImplItem::Fn`, as they do not necessarily represent
methods if the function signature contains no `self`.

- `Item::Macro2` has been deleted as "macros 2.0" syntax is no longer
considered on track for stabilization.

- Various item kinds now hold `Generics` which didn't used to have them.

- The variadic argument of an extern function signature can now be given
an optional parameter name.

-   `WherePredicate::Eq` is no longer supported.

- `Visibility::Crate` is no longer supported. This syntax has been
removed from rustc.

- Public visibility is now represented by a single `Token![pub]` token
rather than the old `VisPublic` struct.

- `LifetimeDef` is now called `LifetimeParam`. This name makes more
sense in the context of the `GenericParam` enum (which also includes
`TypeParam` and `ConstParam`), and is the name that the Rust Reference
uses.

- Modules and extern blocks (`Item::Mod` and `Item::ForeignMod`) can now
be marked `unsafe`.

##### Attributes

- The syntax tree for `Attribute` has been redesigned. The new API
better accommodates attributes which mix structured and unstructured
content at different levels of nesting.

-   `AttributeArgs` has been removed. Use `Punctuated<Meta, Token![,]>`.

- For parsing attribute contents, `parse_meta()` is superseded by a new
parsing library called `syn::meta`, and the `parse_nested_meta` method
on `Attribute`.

##### Tokens

- In string literals, the handling of non-ASCII whitespace after
trailing `\` now matches what is implemented by rustc. Space, horizontal
tab, line feed, and carriage return are the only 4 whitespace characters
which are supposed to be stripped from the beginning of the next line.

- The delimiter tokens `syn::token::Paren`, `Bracket`, and `Brace` now
store 2 spans (the open and close punctuation separately) rather than
just 1. Use `.join()` to obtain a single `Span` spanning the whole
group.

- Keyword construction now requires a single span; an array of 1 span is
no longer accepted. Use `Token![trait](span)` instead of
`Token![trait]([span])`.

- Some token types have been renamed to conform with terminology used by
the [Rust
Reference](https://doc.rust-lang.org/1.68.0/reference/tokens.html#punctuation).
These are `Add`->`Plus`, `Bang`->`Not`, `Colon2`->`PathSep`,
`Div`->`Slash`, `Dot2`->`DotDot`, `Dot3`->`DotDotDot`, `Rem`->`Percent`,
and `Sub`->`Minus`.

##### More

- Several enums have been made `#[non_exhaustive]` in anticipation of
upcoming language changes. This includes `WherePredicate`, `Lit`, and
`GenericArgument`.

- The `impl Extend<Pair<T, P>> for Punctuated<T, P>` now requires `P:
Default` and will push a default punctuation between the pre-existing
elements and the new ones, if there is not already a trailing
punctuation. Previously it would panic in this situation.

- `ParseStream::parse_terminated` now takes a peek-style punctuation
argument instead of turbofish. Replace `input.parse_terminated::<_,
Token![,]>(Thing::parse)` with `input.parse_terminated(Thing::parse,
Token![,])`.

###
[`v1.0.109`](https://togithub.com/dtolnay/syn/compare/1.0.108...1.0.109)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.108...1.0.109)

### [`v1.0.108`](https://togithub.com/dtolnay/syn/releases/tag/1.0.108)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.107...1.0.108)

- Fix handling of unusual whitespace after escaped newlines in
`LitStr::value`
([#&#8203;1381](https://togithub.com/dtolnay/syn/issues/1381), thanks
[@&#8203;ModProg](https://togithub.com/ModProg))

### [`v1.0.107`](https://togithub.com/dtolnay/syn/releases/tag/1.0.107)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.106...1.0.107)

-   Opt out of `-Zrustdoc-scrape-examples` on docs.rs for now

### [`v1.0.106`](https://togithub.com/dtolnay/syn/releases/tag/1.0.106)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.105...1.0.106)

-   Documentation improvements

### [`v1.0.105`](https://togithub.com/dtolnay/syn/releases/tag/1.0.105)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.104...1.0.105)

- Improve parse errors related to `dyn` and `impl` type syntax
([#&#8203;1245](https://togithub.com/dtolnay/syn/issues/1245))

### [`v1.0.104`](https://togithub.com/dtolnay/syn/releases/tag/1.0.104)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.103...1.0.104)

-   Add `PathArguments::is_none()`

### [`v1.0.103`](https://togithub.com/dtolnay/syn/releases/tag/1.0.103)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.102...1.0.103)

- Implement `PartialOrd` for `Cursor`
([#&#8203;1236](https://togithub.com/dtolnay/syn/issues/1236),
[#&#8203;1237](https://togithub.com/dtolnay/syn/issues/1237), thanks
[@&#8203;CAD97](https://togithub.com/CAD97))

### [`v1.0.102`](https://togithub.com/dtolnay/syn/releases/tag/1.0.102)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.101...1.0.102)

- More efficient internal representation for `TokenBuffer`
([#&#8203;1223](https://togithub.com/dtolnay/syn/issues/1223), thanks
[@&#8203;CAD97](https://togithub.com/CAD97))
- Fix parsing of a left shift after macro metavariable in type position
([#&#8203;1229](https://togithub.com/dtolnay/syn/issues/1229))

### [`v1.0.101`](https://togithub.com/dtolnay/syn/releases/tag/1.0.101)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.100...1.0.101)

- Eliminate a bunch of redundant work done by LitStr::parse
([#&#8203;1221](https://togithub.com/dtolnay/syn/issues/1221))

### [`v1.0.100`](https://togithub.com/dtolnay/syn/releases/tag/1.0.100)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.99...1.0.100)

- Parse closures with explicit empty lifetime parameter list `for<> ||
-> T {…}` ([#&#8203;1212](https://togithub.com/dtolnay/syn/issues/1212),
[https://github.com/rust-lang/rust/issues/97362](https://togithub.com/rust-lang/rust/issues/97362))
- Parse `dyn*` provisional syntax
([#&#8203;1213](https://togithub.com/dtolnay/syn/issues/1213),
[https://github.com/rust-lang/rust/issues/91611](https://togithub.com/rust-lang/rust/issues/91611))
- Parse attributes on the "rest" pattern of a struct in pattern
position, `Struct { #[attr] .. }`
([#&#8203;1214](https://togithub.com/dtolnay/syn/issues/1214))
- Parse `static async` and `static async move` closures
([#&#8203;1215](https://togithub.com/dtolnay/syn/issues/1215),
[https://github.com/rust-lang/rust/issues/62290](https://togithub.com/rust-lang/rust/issues/62290))

### [`v1.0.99`](https://togithub.com/dtolnay/syn/releases/tag/1.0.99)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.98...1.0.99)

-   Add categories and keywords to crates.io metadata

### [`v1.0.98`](https://togithub.com/dtolnay/syn/releases/tag/1.0.98)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.97...1.0.98)

-   Format example code with rustfmt

### [`v1.0.97`](https://togithub.com/dtolnay/syn/releases/tag/1.0.97)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.96...1.0.97)

-   Update examples

### [`v1.0.96`](https://togithub.com/dtolnay/syn/releases/tag/1.0.96)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.95...1.0.96)

- Add a `punct_mut()` method on `syn::punctuated::Pair` to return
`Option<&mut P>`
([#&#8203;1183](https://togithub.com/dtolnay/syn/issues/1183))

### [`v1.0.95`](https://togithub.com/dtolnay/syn/releases/tag/1.0.95)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.94...1.0.95)

- Replace unicode-xid with unicode-ident crate:
https://github.com/dtolnay/unicode-ident

### [`v1.0.94`](https://togithub.com/dtolnay/syn/releases/tag/1.0.94)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.93...1.0.94)

-   Resolve some unused_macro_rules warnings

### [`v1.0.93`](https://togithub.com/dtolnay/syn/releases/tag/1.0.93)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.92...1.0.93)

- Fix compile error when `Some` means something unusual in the
expression namespace of the scope where `custom_keyword` is invoked
([#&#8203;1171](https://togithub.com/dtolnay/syn/issues/1171), thanks
[@&#8203;zakarumych](https://togithub.com/zakarumych))

### [`v1.0.92`](https://togithub.com/dtolnay/syn/releases/tag/1.0.92)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.91...1.0.92)

- Make compatible with Miri's tag-raw-pointers mode
([#&#8203;1166](https://togithub.com/dtolnay/syn/issues/1166), thanks
[@&#8203;saethlin](https://togithub.com/saethlin))

### [`v1.0.91`](https://togithub.com/dtolnay/syn/releases/tag/1.0.91)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.90...1.0.91)

-   impl ToTokens for RangeLimits
-   impl Parse for ExprAwait
-   impl Parse for GenericMethodArgument
-   impl Parse for MethodTurbofish

### [`v1.0.90`](https://togithub.com/dtolnay/syn/releases/tag/1.0.90)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.89...1.0.90)

- Update recommended exhaustive matching idiom to use
`non_exhaustive_omitted_patterns` lint:

    ```rust
    match expr {
        Expr::Array(e) => {…}
        Expr::Assign(e) => {…}
        ...
        Expr::Yield(e) => {…}

        #[cfg_attr(test, deny(non_exhaustive_omitted_patterns))]
        _ => {/* some sane fallback */}
    }
    ```

### [`v1.0.89`](https://togithub.com/dtolnay/syn/releases/tag/1.0.89)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.88...1.0.89)

- Remove support for inner attributes on non-block expressions
([#&#8203;1146](https://togithub.com/dtolnay/syn/issues/1146),
[https://github.com/rust-lang/rust/pull/83312](https://togithub.com/rust-lang/rust/pull/83312))
- Fix panic on comma after `mut self` in a bare fn type
([#&#8203;1148](https://togithub.com/dtolnay/syn/issues/1148))

### [`v1.0.88`](https://togithub.com/dtolnay/syn/releases/tag/1.0.88)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.87...1.0.88)

- Parse `..` pattern in pattern of `let`
([#&#8203;1136](https://togithub.com/dtolnay/syn/issues/1136))
- Parse `for<…>` lifetime introducer on closures
([#&#8203;1135](https://togithub.com/dtolnay/syn/issues/1135))
- Reject postfix operators after cast
([#&#8203;1117](https://togithub.com/dtolnay/syn/issues/1117))
- Implement extra-traits for `Nothing`
([#&#8203;1144](https://togithub.com/dtolnay/syn/issues/1144))

### [`v1.0.87`](https://togithub.com/dtolnay/syn/releases/tag/1.0.87)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.86...1.0.87)

- Parse trait bounds containing associated constant constraint
([#&#8203;1138](https://togithub.com/dtolnay/syn/issues/1138))
- Change syntax of where-clauses on generic associated types
([#&#8203;1071](https://togithub.com/dtolnay/syn/issues/1071),
[https://github.com/rust-lang/rust/issues/89122](https://togithub.com/rust-lang/rust/issues/89122))

### [`v1.0.86`](https://togithub.com/dtolnay/syn/releases/tag/1.0.86)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.85...1.0.86)

-   Add support for parsing if- and while-let-chains (RFC 2497)

### [`v1.0.85`](https://togithub.com/dtolnay/syn/releases/tag/1.0.85)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.84...1.0.85)

- Add `token()` method to each variant of syn::Lit to expose the
underlying token representation with original formatting

### [`v1.0.84`](https://togithub.com/dtolnay/syn/releases/tag/1.0.84)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.83...1.0.84)

- Add
[`parse_quote_spanned!`](https://docs.rs/syn/1.0.84/syn/macro.parse_quote_spanned.html)
macro which is a combination `parse_quote!` + `quote_spanned!`

### [`v1.0.83`](https://togithub.com/dtolnay/syn/releases/tag/1.0.83)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.82...1.0.83)

- Fix panic parsing trait impl with qself in trait type: `impl
<Thing<>>::Trait for Type {}`
([#&#8203;1109](https://togithub.com/dtolnay/syn/issues/1109))
- Preserve attributes on let-else stmt: `#[attr] let pat = val else {
return }` ([#&#8203;1110](https://togithub.com/dtolnay/syn/issues/1110))

### [`v1.0.82`](https://togithub.com/dtolnay/syn/releases/tag/1.0.82)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.81...1.0.82)

- Support parenthesized generic argument syntax with `::` disambiguator:
`Fn::() -> !`
([#&#8203;1096](https://togithub.com/dtolnay/syn/issues/1096))

### [`v1.0.81`](https://togithub.com/dtolnay/syn/releases/tag/1.0.81)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.80...1.0.81)

- Support arbitrary precision negative literal tokens on rustc 1.56+
([#&#8203;1087](https://togithub.com/dtolnay/syn/issues/1087),
[#&#8203;1088](https://togithub.com/dtolnay/syn/issues/1088))

### [`v1.0.80`](https://togithub.com/dtolnay/syn/releases/tag/1.0.80)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.79...1.0.80)

- Parse unstable `~const` syntax in where-clauses
([#&#8203;1083](https://togithub.com/dtolnay/syn/issues/1083), tracking
issue
[https://github.com/rust-lang/rust/issues/67792](https://togithub.com/rust-lang/rust/issues/67792))

### [`v1.0.79`](https://togithub.com/dtolnay/syn/releases/tag/1.0.79)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.78...1.0.79)

- Support trailing `+` in `dyn Trait` syntax, including bare (non-`dyn`)
pre-2018 trait object syntax
([#&#8203;1075](https://togithub.com/dtolnay/syn/issues/1075),
[#&#8203;1077](https://togithub.com/dtolnay/syn/issues/1077),
[#&#8203;1078](https://togithub.com/dtolnay/syn/issues/1078),
[#&#8203;1079](https://togithub.com/dtolnay/syn/issues/1079),
[#&#8203;1080](https://togithub.com/dtolnay/syn/issues/1080),
[#&#8203;1081](https://togithub.com/dtolnay/syn/issues/1081))

### [`v1.0.78`](https://togithub.com/dtolnay/syn/releases/tag/1.0.78)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.77...1.0.78)

- Parse trailing `+` in the bounds of `impl Trait` type
([#&#8203;1073](https://togithub.com/dtolnay/syn/issues/1073))

### [`v1.0.77`](https://togithub.com/dtolnay/syn/releases/tag/1.0.77)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.76...1.0.77)

- Match Rust 1.57+'s parsing of dot and question mark after a curly
braced macro invocation
([#&#8203;1068](https://togithub.com/dtolnay/syn/issues/1068))

### [`v1.0.76`](https://togithub.com/dtolnay/syn/releases/tag/1.0.76)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.75...1.0.76)

- Parse unstable `let`–`else` syntax
([#&#8203;1050](https://togithub.com/dtolnay/syn/issues/1050),
[#&#8203;1057](https://togithub.com/dtolnay/syn/issues/1057))
- Parse qualified braced variant expressions and patterns: `<E>::V {..}`
([#&#8203;1058](https://togithub.com/dtolnay/syn/issues/1058),
[#&#8203;1059](https://togithub.com/dtolnay/syn/issues/1059))
- Fix precedence of outer attributes in front of an assignment
expression in statement position
([#&#8203;1060](https://togithub.com/dtolnay/syn/issues/1060))

### [`v1.0.75`](https://togithub.com/dtolnay/syn/releases/tag/1.0.75)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.74...1.0.75)

-   Improve spans on a method without body inside an impl block
- Documentation improvements
([#&#8203;922](https://togithub.com/dtolnay/syn/issues/922), thanks
[@&#8203;Tamschi](https://togithub.com/Tamschi))

### [`v1.0.74`](https://togithub.com/dtolnay/syn/releases/tag/1.0.74)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.73...1.0.74)

- Reject `for<'a> dyn Trait<'a>` syntax; the correct representation is
`dyn for<'a> Trait<'a>`
([#&#8203;1042](https://togithub.com/dtolnay/syn/issues/1042))

### [`v1.0.73`](https://togithub.com/dtolnay/syn/releases/tag/1.0.73)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.72...1.0.73)

- Add From\<Ident>, From\<Index>, From\<usize> for Member
([#&#8203;1038](https://togithub.com/dtolnay/syn/issues/1038), thanks
[@&#8203;m-ou-se](https://togithub.com/m-ou-se))

### [`v1.0.72`](https://togithub.com/dtolnay/syn/releases/tag/1.0.72)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.71...1.0.72)

- Parse const generics which use value of a previous const generic
parameter as a default value
([#&#8203;1027](https://togithub.com/dtolnay/syn/issues/1027))

### [`v1.0.71`](https://togithub.com/dtolnay/syn/releases/tag/1.0.71)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.70...1.0.71)

- Fix panic deserializing an ItemImpl with a non-path in trait position
([#&#8203;1023](https://togithub.com/dtolnay/syn/issues/1023))
- Parse visibility on impl blocks
([#&#8203;1024](https://togithub.com/dtolnay/syn/issues/1024))
- Fix parsing a type parameter default on the first generic parameter of
an impl block
([#&#8203;1025](https://togithub.com/dtolnay/syn/issues/1025), thanks
[@&#8203;taiki-e](https://togithub.com/taiki-e))

### [`v1.0.70`](https://togithub.com/dtolnay/syn/releases/tag/1.0.70)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.69...1.0.70)

- Fix precedence of closure body vs ExprRange rhs: `|| .. .method()`
([#&#8203;1019](https://togithub.com/dtolnay/syn/issues/1019))
- Parse inner attributes inside of structs and enums
([#&#8203;1022](https://togithub.com/dtolnay/syn/issues/1022))

### [`v1.0.69`](https://togithub.com/dtolnay/syn/releases/tag/1.0.69)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.68...1.0.69)

- Improve Parse impls of ExprBox, ExprUnary, ExprLet, ExprClosure,
ExprReference, ExprBreak, ExprContinue, ExprReturn, ExprYield to respect
precedence for parsing a subexpression beginning with the respective
keyword/punctuation
([#&#8203;1007](https://togithub.com/dtolnay/syn/issues/1007),
[#&#8203;1008](https://togithub.com/dtolnay/syn/issues/1008),
[#&#8203;1009](https://togithub.com/dtolnay/syn/issues/1009),
[#&#8203;1010](https://togithub.com/dtolnay/syn/issues/1010),
[#&#8203;1011](https://togithub.com/dtolnay/syn/issues/1011),
[#&#8203;1012](https://togithub.com/dtolnay/syn/issues/1012),
[#&#8203;1013](https://togithub.com/dtolnay/syn/issues/1013),
[#&#8203;1014](https://togithub.com/dtolnay/syn/issues/1014),
[#&#8203;1015](https://togithub.com/dtolnay/syn/issues/1015))

### [`v1.0.68`](https://togithub.com/dtolnay/syn/releases/tag/1.0.68)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.67...1.0.68)

- Preserve span of `LexError` on conversion to `syn::Error`
([#&#8203;1006](https://togithub.com/dtolnay/syn/issues/1006))

### [`v1.0.67`](https://togithub.com/dtolnay/syn/releases/tag/1.0.67)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.66...1.0.67)

- Accept outer attributes in the Parse impl of ExprBlock
([#&#8203;1004](https://togithub.com/dtolnay/syn/issues/1004))

### [`v1.0.66`](https://togithub.com/dtolnay/syn/releases/tag/1.0.66)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.65...1.0.66)

- Parse equality constraints on generic associated types
([#&#8203;979](https://togithub.com/dtolnay/syn/issues/979))
- Parse default value exprs in const generic declarations
([#&#8203;980](https://togithub.com/dtolnay/syn/issues/980))
- Fix infinite loop parsing malformed type ascription expression in
non-`full` mode
([#&#8203;978](https://togithub.com/dtolnay/syn/issues/978))
- Improve Parse impls of ExprArray, ExprAsync, ExprBlock, ExprMacro,
ExprParen, ExprRepeat, ExprStruct, ExprTryBlock, ExprUnsafe to succeed
parsing even in the presence of trailing binary operators
([#&#8203;991](https://togithub.com/dtolnay/syn/issues/991),
[#&#8203;992](https://togithub.com/dtolnay/syn/issues/992),
[#&#8203;993](https://togithub.com/dtolnay/syn/issues/993),
[#&#8203;994](https://togithub.com/dtolnay/syn/issues/994),
[#&#8203;995](https://togithub.com/dtolnay/syn/issues/995),
[#&#8203;996](https://togithub.com/dtolnay/syn/issues/996),
[#&#8203;997](https://togithub.com/dtolnay/syn/issues/997),
[#&#8203;998](https://togithub.com/dtolnay/syn/issues/998),
[#&#8203;999](https://togithub.com/dtolnay/syn/issues/999))

### [`v1.0.65`](https://togithub.com/dtolnay/syn/releases/tag/1.0.65)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.64...1.0.65)

- Parse visibility on macro_rules
([#&#8203;981](https://togithub.com/dtolnay/syn/issues/981), tracking
issue
[rust-lang/rust#78855](https://togithub.com/rust-lang/rust/issues/78855))
- Parse leading vert in or-patterns
([#&#8203;982](https://togithub.com/dtolnay/syn/issues/982), matching
the Rust grammar change in
[rust-lang/rust#81869](https://togithub.com/rust-lang/rust/issues/81869))
- Parse static with omitted type
([#&#8203;983](https://togithub.com/dtolnay/syn/issues/983))
- Parse placeholder type in type parameter position
([#&#8203;984](https://togithub.com/dtolnay/syn/issues/984))

### [`v1.0.64`](https://togithub.com/dtolnay/syn/releases/tag/1.0.64)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.63...1.0.64)

- Avoid `clippy::expl_impl_clone_on_copy` pedantic lint in downstream
custom token types
([#&#8203;976](https://togithub.com/dtolnay/syn/issues/976))

### [`v1.0.63`](https://togithub.com/dtolnay/syn/releases/tag/1.0.63)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.62...1.0.63)

- Fix parsing associated types with empty trait bound list after colon
([#&#8203;974](https://togithub.com/dtolnay/syn/issues/974))

### [`v1.0.62`](https://togithub.com/dtolnay/syn/releases/tag/1.0.62)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.61...1.0.62)

- Republish to work around docs.rs bug
[https://github.com/rust-lang/docs.rs/issues/1300](https://togithub.com/rust-lang/docs.rs/issues/1300)

### [`v1.0.61`](https://togithub.com/dtolnay/syn/releases/tag/1.0.61)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.60...1.0.61)

- Improve assertion failures on invalid use of `Punctuated` API
([#&#8203;970](https://togithub.com/dtolnay/syn/issues/970), thanks
[@&#8203;osa1](https://togithub.com/osa1))
- Add `Lifetime::span` and `Lifetime::set_span` accessors
([#&#8203;971](https://togithub.com/dtolnay/syn/issues/971))

### [`v1.0.60`](https://togithub.com/dtolnay/syn/releases/tag/1.0.60)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.59...1.0.60)

- Provide an idiom for testing exhaustiveness of pattern matches on
`Expr`, `Type`, `Pat`, `Item`, `ForeignItem`, `TraitItem`, and
`ImplItem` ([#&#8203;694](https://togithub.com/dtolnay/syn/issues/694))

    ```rust
    match expr {
        Expr::Array(e) => {...}
        Expr::Assign(e) => {...}
        ...
        Expr::Yield(e) => {...}

        #[cfg(test)]
        Expr::__TestExhaustive(_) => unimplemented!(),
        #[cfg(not(test))]
        _ => { /* some sane fallback */ }
    }
    ```

The above is the only supported idiom for exhaustive matching of those
enum. Do not write anything differently as it is not supported.

The conditional compilation on match-arms lets us fail your tests but
not break your library when adding a variant. You will be notified by a
test failure when a variant is added, so that you can add code to handle
it, but your library will continue to compile and work for downstream
users in the interim.

### [`v1.0.59`](https://togithub.com/dtolnay/syn/releases/tag/1.0.59)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.58...1.0.59)

- Parse empty supertrait lists consistently with rustc
([#&#8203;952](https://togithub.com/dtolnay/syn/issues/952))
- Fix loss of span information on comma tokens inside of Type::Tuple
during parse
([#&#8203;959](https://togithub.com/dtolnay/syn/issues/959))

### [`v1.0.58`](https://togithub.com/dtolnay/syn/releases/tag/1.0.58)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.57...1.0.58)

- Allow literals to parse as a const generic path argument even without
"full" feature enabled
([#&#8203;951](https://togithub.com/dtolnay/syn/issues/951))

    ```rust
    pub struct Struct {
        array: Array<10>,  // used to require `features = "full"`
    }
    ```

### [`v1.0.57`](https://togithub.com/dtolnay/syn/releases/tag/1.0.57)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.56...1.0.57)

- Make Punctuated::new available as a `const fn`
([#&#8203;949](https://togithub.com/dtolnay/syn/issues/949))

### [`v1.0.56`](https://togithub.com/dtolnay/syn/releases/tag/1.0.56)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.55...1.0.56)

- Add
[`Error::into_compile_error`](https://docs.rs/syn/1.0.56/syn/struct.Error.html#method.into_compile_error)

### [`v1.0.55`](https://togithub.com/dtolnay/syn/releases/tag/1.0.55)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.54...1.0.55)

- Preserve None-delimited group around macro metavariable when parsing
`T<$ty>` ([#&#8203;944](https://togithub.com/dtolnay/syn/issues/944),
[#&#8203;945](https://togithub.com/dtolnay/syn/issues/945))

### [`v1.0.54`](https://togithub.com/dtolnay/syn/releases/tag/1.0.54)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.53...1.0.54)

- Fix parsing of `impl` items with macro metavariable in the trait path:
`impl $trait for Type {...}`
([#&#8203;942](https://togithub.com/dtolnay/syn/issues/942))

### [`v1.0.53`](https://togithub.com/dtolnay/syn/releases/tag/1.0.53)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.52...1.0.53)

- Parse `impl !Trait {...}` syntax
([#&#8203;936](https://togithub.com/dtolnay/syn/issues/936))

### [`v1.0.52`](https://togithub.com/dtolnay/syn/releases/tag/1.0.52)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.51...1.0.52)

- Parse `unsafe extern` block syntax
([#&#8203;918](https://togithub.com/dtolnay/syn/issues/918))
- Parse `unsafe mod` syntax
([#&#8203;919](https://togithub.com/dtolnay/syn/issues/919))
- Parse `const {...}` block syntax
([#&#8203;921](https://togithub.com/dtolnay/syn/issues/921))
- Parse destructuring assignment syntax
([#&#8203;933](https://togithub.com/dtolnay/syn/issues/933))

### [`v1.0.51`](https://togithub.com/dtolnay/syn/releases/tag/1.0.51)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.50...1.0.51)

- Allow parsing signatures in which const generic params appear in front
of lifetime params
([#&#8203;920](https://togithub.com/dtolnay/syn/issues/920))

### [`v1.0.50`](https://togithub.com/dtolnay/syn/releases/tag/1.0.50)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.48...1.0.50)

- Apply `doc(cfg(...))` on feature gated APIs for docs.rs-rendered
documentation
([#&#8203;925](https://togithub.com/dtolnay/syn/issues/925))

### [`v1.0.48`](https://togithub.com/dtolnay/syn/releases/tag/1.0.48)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.47...1.0.48)

-   Rebuild for https://astexplorer.net

### [`v1.0.47`](https://togithub.com/dtolnay/syn/releases/tag/1.0.47)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.46...1.0.47)

-   Documentation improvements

### [`v1.0.46`](https://togithub.com/dtolnay/syn/releases/tag/1.0.46)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.45...1.0.46)

- Fix parsing structured attributes that contain nested absolute paths,
such as `#[derive(::serde::Serialize)]`
([#&#8203;909](https://togithub.com/dtolnay/syn/issues/909))

### [`v1.0.45`](https://togithub.com/dtolnay/syn/releases/tag/1.0.45)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.44...1.0.45)

- Provide more detailed error messages when parsing specific literal
kind ([#&#8203;908](https://togithub.com/dtolnay/syn/issues/908))

### [`v1.0.44`](https://togithub.com/dtolnay/syn/releases/tag/1.0.44)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.43...1.0.44)

- Fix some parsing of patterns inside of None-delimited groups
([#&#8203;907](https://togithub.com/dtolnay/syn/issues/907))

### [`v1.0.43`](https://togithub.com/dtolnay/syn/releases/tag/1.0.43)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.42...1.0.43)

-   Add Parse impl for syn::Signature

### [`v1.0.42`](https://togithub.com/dtolnay/syn/releases/tag/1.0.42)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.41...1.0.42)

- Fix several bugs involving unusual suffixes on integer and floating
point literal tokens
([#&#8203;898](https://togithub.com/dtolnay/syn/issues/898),
[#&#8203;899](https://togithub.com/dtolnay/syn/issues/899),
[#&#8203;900](https://togithub.com/dtolnay/syn/issues/900))

### [`v1.0.41`](https://togithub.com/dtolnay/syn/releases/tag/1.0.41)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.40...1.0.41)

- Fix panic on printing an incomplete (having fewer path segments than
originally parsed with) qualified path (ExprPath, PatPath, TypePath
containing QSelf)
([#&#8203;891](https://togithub.com/dtolnay/syn/issues/891), thanks
[@&#8203;taiki-e](https://togithub.com/taiki-e))
- Fix panic triggered by syntactically invalid overflowing negative
float literal after `.` in a field access position, e.g. `let _ =
obj.-0.9E999999`
([#&#8203;895](https://togithub.com/dtolnay/syn/issues/895), thanks
[@&#8203;sameer](https://togithub.com/sameer))
- Enable using `parse_macro_input!` with a Parser function rather than
type having a Parse impl
([#&#8203;896](https://togithub.com/dtolnay/syn/issues/896), thanks
[@&#8203;sbrocket](https://togithub.com/sbrocket))

### [`v1.0.40`](https://togithub.com/dtolnay/syn/releases/tag/1.0.40)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.39...1.0.40)

- Fix panic on parsing float literals having both an exponent and a
suffix beginning with 'e' or 'E', such as `9e99e999`
([#&#8203;893](https://togithub.com/dtolnay/syn/issues/893))

### [`v1.0.39`](https://togithub.com/dtolnay/syn/releases/tag/1.0.39)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.38...1.0.39)

- Improve compile time by pre-expanding derives
([#&#8203;885](https://togithub.com/dtolnay/syn/issues/885))
- Parse const generic parameters in any order relative to type
parameters ([#&#8203;886](https://togithub.com/dtolnay/syn/issues/886))

### [`v1.0.38`](https://togithub.com/dtolnay/syn/releases/tag/1.0.38)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.37...1.0.38)

- Accept traits with parenthesized path arguments in impls
([#&#8203;880](https://togithub.com/dtolnay/syn/issues/880), thanks
[@&#8203;alecmocatta](https://togithub.com/alecmocatta))

### [`v1.0.37`](https://togithub.com/dtolnay/syn/releases/tag/1.0.37)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.36...1.0.37)

- Handle shebang in a way that matches rustc 1.46+
([#&#8203;876](https://togithub.com/dtolnay/syn/issues/876),
[https://github.com/rust-lang/rust/pull/71487](https://togithub.com/rust-lang/rust/pull/71487),
[https://github.com/rust-lang/rust/pull/73596](https://togithub.com/rust-lang/rust/pull/73596))

    ```rust
    #!//am/i/a/comment

    fn main() {} // ^ shebang
    ```

    ```rust
    #!//am/i/a/comment

    [allow(dead_code)] // ^ not a shebang
    fn main() {}
    ```

- Accept <code>tuple.0.  0</code> as a tuple indexing expression
([#&#8203;877](https://togithub.com/dtolnay/syn/issues/877))

### [`v1.0.36`](https://togithub.com/dtolnay/syn/releases/tag/1.0.36)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.35...1.0.36)

- Add Lit::span, Lit::set_span
([#&#8203;874](https://togithub.com/dtolnay/syn/issues/874))

### [`v1.0.35`](https://togithub.com/dtolnay/syn/releases/tag/1.0.35)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.34...1.0.35)

- Fix parsing of Expr::Field in non-full mode
([#&#8203;870](https://togithub.com/dtolnay/syn/issues/870))

### [`v1.0.34`](https://togithub.com/dtolnay/syn/releases/tag/1.0.34)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.33...1.0.34)

-   Documentation improvements

### [`v1.0.33`](https://togithub.com/dtolnay/syn/releases/tag/1.0.33)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.32...1.0.33)

- Parse `tuple.0.0` as an indexing expression
([https://github.com/rust-lang/rust/pull/71322](https://togithub.com/rust-lang/rust/pull/71322))
- Add `Parse` impls for optional of proc-macro2 types:
`Option<TokenTree>`, `Option<Punct>`, `Option<Literal>`, `Option<Group>`

### [`v1.0.32`](https://togithub.com/dtolnay/syn/releases/tag/1.0.32)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.31...1.0.32)

- Fix parsing $:item macro_rules metavariables containing outer
attributes ([#&#8203;852](https://togithub.com/dtolnay/syn/issues/852))

### [`v1.0.31`](https://togithub.com/dtolnay/syn/releases/tag/1.0.31)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.30...1.0.31)

- Add
[`Expr::parse_without_eager_brace`](https://docs.rs/syn/1.0.31/syn/enum.Expr.html#method.parse_without_eager_brace)
to parse expressions in ambiguous syntactic position.

Rust grammar has an ambiguity where braces sometimes turn a path
expression into a struct initialization and sometimes do not. In the
following code, the expression `S {}` is one expression. Presumably
there is an empty struct `struct S {}` defined somewhere which it is
instantiating.

    ```rust
    let _ = *S {};

    // parsed by rustc as: `*(S {})`
    ```

We would want to parse the above using `Expr::parse` after the `=`
token.

    But in the following, `S {}` is *not* a struct init expression.

    ```rust
    if *S {} {}

    // parsed by rustc as:
    //
    //    if (*S) {
    //        /* empty block */
    //    }
    //    {
    //        /* another empty block */
    //    }
    ```

For that reason we would want to parse if-conditions using
`Expr::parse_without_eager_brace` after the `if` token. Same for similar
syntactic positions such as the condition expr after a `while` token or
the expr at the top of a `match`.

The Rust grammar's choices around which way this ambiguity is resolved
at various syntactic positions is fairly arbitrary. Really either parse
behavior could work in most positions, and language designers just
decide each case based on which is more likely to be what the programmer
had in mind most of the time.

    ```rust
    if return S {} {}

    // parsed by rustc as:
    //
    //    if (return (S {})) {
    //    }
    //
    // but could equally well have been this other arbitrary choice:
    //
    //    if (return S) {
    //    }
    //    {}
    ```

Note the grammar ambiguity on trailing braces is distinct from
precedence and is not captured by assigning a precedence level to the
braced struct init expr in relation to other operators. This can be
illustrated by `return 0..S {}` vs `match 0..S {}`. The former parses as
`return (0..(S {}))` implying tighter precedence for struct init than
`..`, while the latter parses as `match (0..S) {}` implying tighter
precedence for `..` than struct init, a contradiction.

### [`v1.0.30`](https://togithub.com/dtolnay/syn/releases/tag/1.0.30)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.29...1.0.30)

- Parse struct init expressions where the type name is an interpolated
macro_rules metavariable, such as `$struct {}` where $struct:ident
([#&#8203;842](https://togithub.com/dtolnay/syn/issues/842))
- Handle nesting of None-delimited groups
([#&#8203;843](https://togithub.com/dtolnay/syn/issues/843), thanks
[@&#8203;Aaron1011](https://togithub.com/Aaron1011))

### [`v1.0.29`](https://togithub.com/dtolnay/syn/releases/tag/1.0.29)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.28...1.0.29)

- Parse macro call exprs where the macro name is an interpolated
macro_rules metavariable, such as `$macro!()`
([#&#8203;838](https://togithub.com/dtolnay/syn/issues/838))
- Parse paths containing generic parameters where the first path segment
is an interpolated macro_rules metavariable, such as `$seg<'a>`
([#&#8203;839](https://togithub.com/dtolnay/syn/issues/839))

### [`v1.0.28`](https://togithub.com/dtolnay/syn/releases/tag/1.0.28)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.27...1.0.28)

- Recognize empty None-delimited group produced by interpolating a $:vis
macro metavariable when parsing a Visibility
([#&#8203;836](https://togithub.com/dtolnay/syn/issues/836))

### [`v1.0.27`](https://togithub.com/dtolnay/syn/releases/tag/1.0.27)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.26...1.0.27)

- Parse function calls in which the callee is an interpolated macro
variable `$fn(...)`
([#&#8203;833](https://togithub.com/dtolnay/syn/issues/833))

### [`v1.0.26`](https://togithub.com/dtolnay/syn/releases/tag/1.0.26)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.25...1.0.26)

- Parse paths containing an interpolated first component, such as
`$first::rest`
([https://github.com/rust-lang/rust/issues/72608](https://togithub.com/rust-lang/rust/issues/72608),
[#&#8203;832](https://togithub.com/dtolnay/syn/issues/832))

### [`v1.0.25`](https://togithub.com/dtolnay/syn/releases/tag/1.0.25)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.24...1.0.25)

- Parse opt-out `?const` trait bounds
([#&#8203;767](https://togithub.com/dtolnay/syn/issues/767))
- Parse const generics in method generic arguments
([#&#8203;816](https://togithub.com/dtolnay/syn/issues/816), thanks
[@&#8203;yodaldevoid](https://togithub.com/yodaldevoid))
- Parse trait bounds on type alias items
([#&#8203;821](https://togithub.com/dtolnay/syn/issues/821))
- Parse const generics on impl blocks
([#&#8203;822](https://togithub.com/dtolnay/syn/issues/822))
- Fix precedence of attributes on binary expressions to match rustc
([#&#8203;823](https://togithub.com/dtolnay/syn/issues/823))
- Remove parsing of `extern::` paths which were removed from nightly in
January 2019
([#&#8203;825](https://togithub.com/dtolnay/syn/issues/825),
[https://github.com/rust-lang/rust/pull/57572](https://togithub.com/rust-lang/rust/pull/57572))
- Add `Punctuated::clear`, analogous to Vec::clear
([#&#8203;828](https://togithub.com/dtolnay/syn/issues/828))

### [`v1.0.24`](https://togithub.com/dtolnay/syn/releases/tag/1.0.24)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.23...1.0.24)

- Parse `mut self` receiver in function pointer type
([#&#8203;812](https://togithub.com/dtolnay/syn/issues/812),
[#&#8203;814](https://togithub.com/dtolnay/syn/issues/814))
- Parse const trait impls
([#&#8203;813](https://togithub.com/dtolnay/syn/issues/813))
- Improve error reporting inside struct expressions and struct patterns
([#&#8203;818](https://togithub.com/dtolnay/syn/issues/818))

### [`v1.0.23`](https://togithub.com/dtolnay/syn/releases/tag/1.0.23)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.22...1.0.23)

- Parse inner attributes in traits
([#&#8203;803](https://togithub.com/dtolnay/syn/issues/803))
- Parse const underscore in traits and impls
([#&#8203;804](https://togithub.com/dtolnay/syn/issues/804))
- Implement Extend<Error> for Error
([#&#8203;805](https://togithub.com/dtolnay/syn/issues/805))
- Parse Or patterns
([#&#8203;806](https://togithub.com/dtolnay/syn/issues/806))
- Parse outer attributes on Expr\* structs
([#&#8203;807](https://togithub.com/dtolnay/syn/issues/807))
- Parse top level const/static without value
([#&#8203;808](https://togithub.com/dtolnay/syn/issues/808))
- Parse syntactically accepted functions
([#&#8203;809](https://togithub.com/dtolnay/syn/issues/809))
- Parse extern static with value
([#&#8203;810](https://togithub.com/dtolnay/syn/issues/810))

Thanks [@&#8203;taiki-e](https://togithub.com/taiki-e) for all of these.

### [`v1.0.22`](https://togithub.com/dtolnay/syn/releases/tag/1.0.22)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.21...1.0.22)

- Parse literal suffix on byte string, byte, and char literal tokens:
`br#"..."#suffix`, `b'?'suffix`, `'?'suffix`
([#&#8203;799](https://togithub.com/dtolnay/syn/issues/799),
[#&#8203;800](https://togithub.com/dtolnay/syn/issues/800))

### [`v1.0.21`](https://togithub.com/dtolnay/syn/releases/tag/1.0.21)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.20...1.0.21)

-   Documentation improvements

### [`v1.0.20`](https://togithub.com/dtolnay/syn/releases/tag/1.0.20)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.19...1.0.20)

- Improve span of error message when an error during
`syn::Macro::parse_body` is triggered past the last token of the macro
body ([#&#8203;791](https://togithub.com/dtolnay/syn/issues/791))

### [`v1.0.19`](https://togithub.com/dtolnay/syn/releases/tag/1.0.19)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.18...1.0.19)

- Parse a more lenient extern type syntax inside extern blocks
([#&#8203;763](https://togithub.com/dtolnay/syn/issues/763))

### [`v1.0.18`](https://togithub.com/dtolnay/syn/releases/tag/1.0.18)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.17...1.0.18)

- Ignore unparsed empty None-delimited groups at the end of a macro
input ([#&#8203;783](https://togithub.com/dtolnay/syn/issues/783))

### [`v1.0.17`](https://togithub.com/dtolnay/syn/releases/tag/1.0.17)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.16...1.0.17)

-   Expose `syn::Lit` in `default-features = false` mode

### [`v1.0.16`](https://togithub.com/dtolnay/syn/releases/tag/1.0.16)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.15...1.0.16)

- Fix parsing of `&raw` raw reference operator
([https://github.com/rust-lang/rust/issues/64490](https://togithub.com/rust-lang/rust/issues/64490))
to require explicitly specified constness, `&raw mut` or `&raw const`

### [`v1.0.15`](https://togithub.com/dtolnay/syn/releases/tag/1.0.15)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.14...1.0.15)

- Add
[`Punctuated::first_mut`](https://docs.rs/syn/1.0.15/syn/punctuated/struct.Punctuated.html#method.first_mut)
to return a mut reference to the first sequence element

### [`v1.0.14`](https://togithub.com/dtolnay/syn/releases/tag/1.0.14)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.13...1.0.14)

- Produce more helpful error messages from
[Attribute::parse_args](https://docs.rs/syn/1.0/syn/struct.Attribute.html#method.parse_args)

### [`v1.0.13`](https://togithub.com/dtolnay/syn/releases/tag/1.0.13)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.12...1.0.13)

- Allow parse_quote! to parse Vec\<Stmt>, with the same behavior as
Block::parse_within
([#&#8203;741](https://togithub.com/dtolnay/syn/issues/741))

### [`v1.0.12`](https://togithub.com/dtolnay/syn/releases/tag/1.0.12)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.11...1.0.12)

- Reject function signatures with an incorrectly placed receiver
parameter, like `fn f(x: u8, &self)`
- Produce correctly spanned error when parsing punct beyond the end of a
delimited group
([#&#8203;739](https://togithub.com/dtolnay/syn/issues/739))

### [`v1.0.11`](https://togithub.com/dtolnay/syn/releases/tag/1.0.11)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.10...1.0.11)

- Implement quote::IdentFragment for syn::Member and syn::Index so that
spans are preserved when using these types in quote's `format_ident!`
macro

    ```rust
    use quote::format_ident;
    use syn::Index;

    let index: Index = /* ... */;
    let ident = format_ident!("__{}", index); // produces __0, __1, etc
    ```

### [`v1.0.10`](https://togithub.com/dtolnay/syn/releases/tag/1.0.10)

[Compare
Source](https://togithub.com/dtolnay/syn/compare/1.0.9...1.0.10)

- Provide `Hash` and `Eq` impls for syn::Member even without
"extra-traits" feature enabled, as this type is commonly useful in a
hashset

### [`v1.0.9`](https://togithub.com/dtolnay/syn/releases/tag/1.0.9)

[Compare Source](https://togithub.com/dtolnay/syn/compare/1.0.8...1.0.9)

- Fix failure to parse tuple struct fields of tuple type starting with
`crate` ([#&#8203;720](https://togithub.com/dtolnay/syn/issues/720),
[#&#8203;723](https://togithub.com/dtolnay/syn/issues/723), thanks
[@&#8203;mystor](https://togithub.com/mystor))
- Fix unexpected tokens being ignored when using Speculative::advance_to
([#&#8203;721](https://togithub.com/dtolnay/syn/issues/721),
[#&#8203;723](https://togithub.com/dtolnay/syn/issues/723), thank

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/grafbase/api).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi4xMS4wIiwidXBkYXRlZEluVmVyIjoiMzYuMTEuMCIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. relnotes Marks issues that should be documented in the release notes of the next release. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-lang Relevant to the language team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.