aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2021-03-27 00:24:32 -0400
committerDavid Tolnay <dtolnay@gmail.com>2021-03-27 01:23:04 -0400
commiteb55cee41e23109283f87dd1100ca044b1ab2693 (patch)
treee65c46abb7a5e21f1f90d538233b4ceb9af736e1
parentfedc63bfb734b533f50849fb13c821cbc9fc35bb (diff)
downloadcxx-eb55cee41e23109283f87dd1100ca044b1ab2693.tar.gz
Improve span of errors on impls of type with lifetimes
-rw-r--r--macro/src/expand.rs12
-rw-r--r--macro/src/generics.rs8
-rw-r--r--tests/ui/nonlocal_rust_type.stderr13
3 files changed, 17 insertions, 16 deletions
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index c68c13de..d979bea6 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -1138,7 +1138,7 @@ fn expand_rust_box(key: NamedImplKey, types: &Types, explicit_impl: Option<&Impl
let local_dealloc = format_ident!("{}dealloc", local_prefix);
let local_drop = format_ident!("{}drop", local_prefix);
- let (impl_generics, ty_generics) = generics::split_for_impl(explicit_impl, resolve);
+ let (impl_generics, ty_generics) = generics::split_for_impl(key, explicit_impl, resolve);
let begin_span =
explicit_impl.map_or_else(Span::call_site, |explicit| explicit.impl_token.span);
@@ -1187,7 +1187,7 @@ fn expand_rust_vec(key: NamedImplKey, types: &Types, explicit_impl: Option<&Impl
let local_reserve_total = format_ident!("{}reserve_total", local_prefix);
let local_set_len = format_ident!("{}set_len", local_prefix);
- let (impl_generics, ty_generics) = generics::split_for_impl(explicit_impl, resolve);
+ let (impl_generics, ty_generics) = generics::split_for_impl(key, explicit_impl, resolve);
let begin_span =
explicit_impl.map_or_else(Span::call_site, |explicit| explicit.impl_token.span);
@@ -1251,7 +1251,7 @@ fn expand_unique_ptr(
let link_release = format!("{}release", prefix);
let link_drop = format!("{}drop", prefix);
- let (impl_generics, ty_generics) = generics::split_for_impl(explicit_impl, resolve);
+ let (impl_generics, ty_generics) = generics::split_for_impl(key, explicit_impl, resolve);
let can_construct_from_value = types.structs.contains_key(ident)
|| types.enums.contains_key(ident)
@@ -1348,7 +1348,7 @@ fn expand_shared_ptr(
let link_get = format!("{}get", prefix);
let link_drop = format!("{}drop", prefix);
- let (impl_generics, ty_generics) = generics::split_for_impl(explicit_impl, resolve);
+ let (impl_generics, ty_generics) = generics::split_for_impl(key, explicit_impl, resolve);
let can_construct_from_value = types.structs.contains_key(ident)
|| types.enums.contains_key(ident)
@@ -1427,7 +1427,7 @@ fn expand_weak_ptr(key: NamedImplKey, types: &Types, explicit_impl: Option<&Impl
let link_upgrade = format!("{}upgrade", prefix);
let link_drop = format!("{}drop", prefix);
- let (impl_generics, ty_generics) = generics::split_for_impl(explicit_impl, resolve);
+ let (impl_generics, ty_generics) = generics::split_for_impl(key, explicit_impl, resolve);
let begin_span =
explicit_impl.map_or_else(Span::call_site, |explicit| explicit.impl_token.span);
@@ -1505,7 +1505,7 @@ fn expand_cxx_vector(
let link_unique_ptr_release = format!("{}release", unique_ptr_prefix);
let link_unique_ptr_drop = format!("{}drop", unique_ptr_prefix);
- let (impl_generics, ty_generics) = generics::split_for_impl(explicit_impl, resolve);
+ let (impl_generics, ty_generics) = generics::split_for_impl(key, explicit_impl, resolve);
let begin_span =
explicit_impl.map_or_else(Span::call_site, |explicit| explicit.impl_token.span);
diff --git a/macro/src/generics.rs b/macro/src/generics.rs
index 039dddd5..6c391fc7 100644
--- a/macro/src/generics.rs
+++ b/macro/src/generics.rs
@@ -1,3 +1,4 @@
+use crate::syntax::instantiate::NamedImplKey;
use crate::syntax::resolve::Resolution;
use crate::syntax::Impl;
use proc_macro2::TokenStream;
@@ -9,11 +10,13 @@ pub struct ImplGenerics<'a> {
}
pub struct TyGenerics<'a> {
+ key: NamedImplKey<'a>,
explicit_impl: Option<&'a Impl>,
resolve: Resolution<'a>,
}
pub fn split_for_impl<'a>(
+ key: NamedImplKey<'a>,
explicit_impl: Option<&'a Impl>,
resolve: Resolution<'a>,
) -> (ImplGenerics<'a>, TyGenerics<'a>) {
@@ -22,6 +25,7 @@ pub fn split_for_impl<'a>(
resolve,
};
let ty_generics = TyGenerics {
+ key,
explicit_impl,
resolve,
};
@@ -43,7 +47,9 @@ impl<'a> ToTokens for TyGenerics<'a> {
if let Some(imp) = self.explicit_impl {
imp.ty_generics.to_tokens(tokens);
} else {
- self.resolve.generics.to_tokens(tokens);
+ self.key.lt_token.to_tokens(tokens);
+ self.resolve.generics.lifetimes.to_tokens(tokens);
+ self.key.gt_token.to_tokens(tokens);
}
}
}
diff --git a/tests/ui/nonlocal_rust_type.stderr b/tests/ui/nonlocal_rust_type.stderr
index 584090a5..7310509f 100644
--- a/tests/ui/nonlocal_rust_type.stderr
+++ b/tests/ui/nonlocal_rust_type.stderr
@@ -12,16 +12,11 @@ error[E0117]: only traits defined in the current crate can be implemented for ar
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
--> $DIR/nonlocal_rust_type.rs:7:1
|
-7 | #[cxx::bridge]
- | ^^^^^^^^^^^^^^ impl doesn't use only types from inside the current crate
+7 | #[cxx::bridge]
+ | ^^^^^^^^^^^^^^ impl doesn't use only types from inside the current crate
...
-10 | type OptBuilder<'a>;
- | ___________________________-
-11 | | }
-12 | |
-13 | | struct MyBuilder<'a> {
-14 | | rs: Box<OptBuilder<'a>>,
- | |__________________________- `Option` is not defined in the current crate
+14 | rs: Box<OptBuilder<'a>>,
+ | --------------- `Option` is not defined in the current crate
|
= note: define and implement a trait or new type instead
= note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info)