Skip to content

Commit

Permalink
Add test for issue-40231
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnTitor committed Nov 12, 2019
1 parent ec45882 commit bae9832
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 0 deletions.
54 changes: 54 additions & 0 deletions src/test/ui/issues/issue-40231-1.rs
@@ -0,0 +1,54 @@
// check-pass

#![allow(dead_code)]

trait Structure<E>: Sized where E: Encoding {
type RefTarget: ?Sized;
type FfiPtr;
unsafe fn borrow_from_ffi_ptr<'a>(ptr: Self::FfiPtr) -> Option<&'a Self::RefTarget>;
}

enum Slice {}

impl<E> Structure<E> for Slice where E: Encoding {
type RefTarget = [E::Unit];
type FfiPtr = (*const E::FfiUnit, usize);
unsafe fn borrow_from_ffi_ptr<'a>(_ptr: Self::FfiPtr) -> Option<&'a Self::RefTarget> {
panic!()
}
}

trait Encoding {
type Unit: Unit;
type FfiUnit;
}

trait Unit {}

enum Utf16 {}

impl Encoding for Utf16 {
type Unit = Utf16Unit;
type FfiUnit = u16;
}

struct Utf16Unit(pub u16);

impl Unit for Utf16Unit {}

type SUtf16Str = SeStr<Slice, Utf16>;

struct SeStr<S, E> where S: Structure<E>, E: Encoding {
_data: S::RefTarget,
}

impl<S, E> SeStr<S, E> where S: Structure<E>, E: Encoding {
pub unsafe fn from_ptr<'a>(_ptr: S::FfiPtr) -> Option<&'a Self> {
panic!()
}
}

fn main() {
const TEXT_U16: &'static [u16] = &[];
let _ = unsafe { SUtf16Str::from_ptr((TEXT_U16.as_ptr(), TEXT_U16.len())).unwrap() };
}
54 changes: 54 additions & 0 deletions src/test/ui/issues/issue-40231-2.rs
@@ -0,0 +1,54 @@
// check-pass

#![allow(dead_code)]

trait Structure<E>: Sized where E: Encoding {
type RefTarget: ?Sized;
type FfiPtr;
unsafe fn borrow_from_ffi_ptr<'a>(ptr: Self::FfiPtr) -> Option<&'a Self::RefTarget>;
}

enum Slice {}

impl<E> Structure<E> for Slice where E: Encoding {
type RefTarget = [E::Unit];
type FfiPtr = (*const E::FfiUnit, usize);
unsafe fn borrow_from_ffi_ptr<'a>(_ptr: Self::FfiPtr) -> Option<&'a Self::RefTarget> {
panic!()
}
}

trait Encoding {
type Unit: Unit;
type FfiUnit;
}

trait Unit {}

enum Utf16 {}

impl Encoding for Utf16 {
type Unit = Utf16Unit;
type FfiUnit = u16;
}

struct Utf16Unit(pub u16);

impl Unit for Utf16Unit {}

struct SUtf16Str {
_data: <Slice as Structure<Utf16>>::RefTarget,
}

impl SUtf16Str {
pub unsafe fn from_ptr<'a>(ptr: <Slice as Structure<Utf16>>::FfiPtr)
-> Option<&'a Self> {
std::mem::transmute::<Option<&[<Utf16 as Encoding>::Unit]>, _>(
<Slice as Structure<Utf16>>::borrow_from_ffi_ptr(ptr))
}
}

fn main() {
const TEXT_U16: &'static [u16] = &[];
let _ = unsafe { SUtf16Str::from_ptr((TEXT_U16.as_ptr(), TEXT_U16.len())).unwrap() };
}

0 comments on commit bae9832

Please sign in to comment.