From a89be8739c462b47d59e1364e3e2dc8096806400 Mon Sep 17 00:00:00 2001 From: kzvi <38590027+kzvi@users.noreply.github.com> Date: Thu, 27 Sep 2018 20:56:49 -0700 Subject: [PATCH] loosen lifetimes in type signature of Table::get (#4925) --- rust/flatbuffers/src/table.rs | 4 +-- .../rust_usage_test/tests/integration_test.rs | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/rust/flatbuffers/src/table.rs b/rust/flatbuffers/src/table.rs index d9e952d01..7b1c4a542 100644 --- a/rust/flatbuffers/src/table.rs +++ b/rust/flatbuffers/src/table.rs @@ -30,12 +30,12 @@ impl<'a> Table<'a> { Table { buf: buf, loc: loc } } #[inline] - pub fn vtable(&'a self) -> VTable<'a> { + pub fn vtable(&self) -> VTable<'a> { >>::follow(self.buf, self.loc) } #[inline] pub fn get + 'a>( - &'a self, + &self, slot_byte_loc: VOffsetT, default: Option, ) -> Option { diff --git a/tests/rust_usage_test/tests/integration_test.rs b/tests/rust_usage_test/tests/integration_test.rs index 0e5f8fac9..ca55f6527 100644 --- a/tests/rust_usage_test/tests/integration_test.rs +++ b/tests/rust_usage_test/tests/integration_test.rs @@ -234,6 +234,37 @@ mod generated_constants { } } +#[cfg(test)] +mod lifetime_correctness { + extern crate flatbuffers; + + use std::mem; + + use super::my_game; + use super::load_file; + + #[test] + fn table_get_field_from_static_buffer_1() { + let buf = load_file("../monsterdata_test.mon"); + // create 'static slice + let slice: &[u8] = &buf; + let slice: &'static [u8] = unsafe { mem::transmute(slice) }; + // make sure values retrieved from the 'static buffer are themselves 'static + let monster: my_game::example::Monster<'static> = my_game::example::get_root_as_monster(slice); + // this line should compile: + let name: Option<&'static str> = monster._tab.get::>(my_game::example::Monster::VT_NAME, None); + assert_eq!(name, Some("MyMonster")); + } + + #[test] + fn table_get_field_from_static_buffer_2() { + static DATA: [u8; 4] = [0, 0, 0, 0]; // some binary data + let table: flatbuffers::Table<'static> = flatbuffers::Table::new(&DATA, 0); + // this line should compile: + table.get::<&'static str>(0, None); + } +} + #[cfg(test)] mod roundtrip_generated_code { extern crate flatbuffers;