Merge pull request #652 from dtolnay/lifetimes

Enable lifetimes on opaque C++ types
This commit is contained in:
David Tolnay 2021-01-02 23:40:46 -08:00 committed by GitHub
commit 42883ac16b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 25 additions and 23 deletions

View File

@ -71,11 +71,6 @@ fn check_type_ident(cx: &mut Check, name: &NamedType) {
{
let msg = format!("unsupported type: {}", ident);
cx.error(ident, &msg);
return;
}
if !name.generics.lifetimes.is_empty() {
cx.error(name, "type with lifetime parameter is not supported yet");
}
}
@ -341,7 +336,10 @@ fn check_api_type(cx: &mut Check, ety: &ExternType) {
}
if let Some(lifetime) = ety.generics.lifetimes.first() {
cx.error(lifetime, "extern type with lifetimes is not supported yet");
if ety.lang == Lang::Rust {
let msg = "extern Rust type with lifetimes is not supported yet";
cx.error(lifetime, msg);
}
}
if !ety.bounds.is_empty() {
@ -447,10 +445,6 @@ fn check_api_type_alias(cx: &mut Check, alias: &TypeAlias) {
let msg = format!("derive({}) on extern type alias is not supported", derive);
cx.error(derive, msg);
}
if let Some(lifetime) = alias.generics.lifetimes.first() {
cx.error(lifetime, "extern type with lifetimes is not supported yet");
}
}
fn check_api_impl(cx: &mut Check, imp: &Impl) {

View File

@ -210,6 +210,15 @@ pub mod ffi {
type Job = crate::module::ffi::Job;
}
unsafe extern "C++" {
type Borrow<'a>;
fn c_return_borrow<'a>(s: &'a CxxString) -> UniquePtr<Borrow<'a>>;
#[rust_name = "c_return_borrow_elided"]
fn c_return_borrow(s: &CxxString) -> UniquePtr<Borrow>;
}
#[repr(u32)]
#[derive(Hash)]
enum COwnedEnum {

View File

@ -207,6 +207,12 @@ Enum c_return_enum(uint16_t n) {
}
}
Borrow::Borrow(const std::string &s) : s(s) {}
std::unique_ptr<Borrow> c_return_borrow(const std::string &s) {
return std::unique_ptr<Borrow>(new Borrow(s));
}
void c_take_primitive(size_t n) {
if (n == 2020) {
cxx_test_suite_set_correct();

View File

@ -77,6 +77,11 @@ enum COwnedEnum {
CVAL2,
};
struct Borrow {
Borrow(const std::string &s);
const std::string &s;
};
size_t c_return_primitive();
Shared c_return_shared();
::A::AShared c_return_ns_shared();
@ -110,6 +115,7 @@ size_t c_return_sum(size_t n1, size_t n2);
Enum c_return_enum(uint16_t n);
::A::AEnum c_return_ns_enum(uint16_t n);
::A::B::ABEnum c_return_nested_ns_enum(uint16_t n);
std::unique_ptr<Borrow> c_return_borrow(const std::string &s);
void c_take_primitive(size_t n);
void c_take_shared(Shared shared);

View File

@ -1,8 +0,0 @@
#[cxx::bridge]
mod ffi {
extern "C++" {
type Complex<'a, 'b>;
}
}
fn main() {}

View File

@ -1,5 +0,0 @@
error: extern type with lifetimes is not supported yet
--> $DIR/extern_type_lifetime.rs:4:22
|
4 | type Complex<'a, 'b>;
| ^^