diff options
author | David Tolnay <dtolnay@gmail.com> | 2021-04-02 01:29:50 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-02 01:29:50 -0400 |
commit | 67c75dd2f5f1a2ca2e2e45fde53e23e215156255 (patch) | |
tree | a3fc9a639c9b91c8cd8edc5cfec86d05b4b6b1e8 | |
parent | 756b5b64f09525ccec07ba512a7e53e3419ad8f8 (diff) | |
parent | e294a2b52cf1dac4199daeb769c77ff8fd9103e7 (diff) | |
download | cxx-67c75dd2f5f1a2ca2e2e45fde53e23e215156255.tar.gz |
Merge pull request #806 from dtolnay/elision
Fill in angle brackets with appropriate span if elided from impl key
-rw-r--r-- | macro/src/generics.rs | 14 | ||||
-rw-r--r-- | tests/ui/expected_named.rs | 9 | ||||
-rw-r--r-- | tests/ui/expected_named.stderr | 11 |
3 files changed, 31 insertions, 3 deletions
diff --git a/macro/src/generics.rs b/macro/src/generics.rs index 6c391fc7..3de0330b 100644 --- a/macro/src/generics.rs +++ b/macro/src/generics.rs @@ -3,6 +3,7 @@ use crate::syntax::resolve::Resolution; use crate::syntax::Impl; use proc_macro2::TokenStream; use quote::ToTokens; +use syn::Token; pub struct ImplGenerics<'a> { explicit_impl: Option<&'a Impl>, @@ -46,10 +47,17 @@ impl<'a> ToTokens for TyGenerics<'a> { fn to_tokens(&self, tokens: &mut TokenStream) { if let Some(imp) = self.explicit_impl { imp.ty_generics.to_tokens(tokens); - } else { - self.key.lt_token.to_tokens(tokens); + } else if !self.resolve.generics.lifetimes.is_empty() { + let span = self.key.rust.span(); + self.key + .lt_token + .unwrap_or_else(|| Token![<](span)) + .to_tokens(tokens); self.resolve.generics.lifetimes.to_tokens(tokens); - self.key.gt_token.to_tokens(tokens); + self.key + .gt_token + .unwrap_or_else(|| Token![>](span)) + .to_tokens(tokens); } } } diff --git a/tests/ui/expected_named.rs b/tests/ui/expected_named.rs new file mode 100644 index 00000000..31626d1f --- /dev/null +++ b/tests/ui/expected_named.rs @@ -0,0 +1,9 @@ +#[cxx::bridge] +mod ffi { + unsafe extern "C++" { + type Borrowed<'a>; + fn borrowed() -> UniquePtr<Borrowed>; + } +} + +fn main() {} diff --git a/tests/ui/expected_named.stderr b/tests/ui/expected_named.stderr new file mode 100644 index 00000000..46764014 --- /dev/null +++ b/tests/ui/expected_named.stderr @@ -0,0 +1,11 @@ +error[E0106]: missing lifetime specifier + --> $DIR/expected_named.rs:5:36 + | +5 | fn borrowed() -> UniquePtr<Borrowed>; + | ^^^^^^^^ expected named lifetime parameter + | + = help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from +help: consider using the `'static` lifetime + | +5 | fn borrowed() -> UniquePtr<Borrowed<'static>>; + | ^^^^^^^^^^^^^^^^^ |