aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2021-04-02 01:29:50 -0400
committerGitHub <noreply@github.com>2021-04-02 01:29:50 -0400
commit67c75dd2f5f1a2ca2e2e45fde53e23e215156255 (patch)
treea3fc9a639c9b91c8cd8edc5cfec86d05b4b6b1e8
parent756b5b64f09525ccec07ba512a7e53e3419ad8f8 (diff)
parente294a2b52cf1dac4199daeb769c77ff8fd9103e7 (diff)
downloadcxx-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.rs14
-rw-r--r--tests/ui/expected_named.rs9
-rw-r--r--tests/ui/expected_named.stderr11
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>>;
+ | ^^^^^^^^^^^^^^^^^