Rollup merge of #126242 - yaahc:simplify-provider, r=jhpratt · model-checking/verify-rust-std@db03ec6 (original) (raw)

`@@ -404,9 +404,9 @@ fn request_by_type_tag<'a, I>(err: &'a (impl Error + ?Sized)) -> Option<I::Reifi

`

404

404

`where

`

405

405

`I: tags::Type<'a>,

`

406

406

`{

`

407

``

`-

let mut tagged = TaggedOption::<'a, I>(None);

`

``

407

`+

let mut tagged = Tagged { tag_id: TypeId::of::(), value: TaggedOption::<'a, I>(None) };

`

408

408

` err.provide(tagged.as_request());

`

409

``

`-

tagged.0

`

``

409

`+

tagged.value.0

`

410

410

`}

`

411

411

``

412

412

`///////////////////////////////////////////////////////////////////////////////

`

`@@ -507,16 +507,9 @@ where

`

507

507

`///

`

508

508

`#[unstable(feature = "error_generic_member_access", issue = "99301")]

`

509

509

`#[cfg_attr(not(doc), repr(transparent))] // work around https://github.com/rust-lang/rust/issues/90435

`

510

``

`-

pub struct Request<'a>(dyn Erased<'a> + 'a);

`

``

510

`+

pub struct Request<'a>(Tagged<dyn Erased<'a> + 'a>);

`

511

511

``

512

512

`impl<'a> Request<'a> {

`

513

``

`` -

/// Create a new &mut Request from a &mut dyn Erased trait object.

``

514

``

`-

fn new<'b>(erased: &'b mut (dyn Erased<'a> + 'a)) -> &'b mut Request<'a> {

`

515

``

`` -

// SAFETY: transmuting &mut (dyn Erased<'a> + 'a) to &mut Request<'a> is safe since

``

516

``

`` -

// Request is repr(transparent).

``

517

``

`-

unsafe { &mut *(erased as *mut dyn Erased<'a> as *mut Request<'a>) }

`

518

``

`-

}

`

519

``

-

520

513

`/// Provide a value or other type with only static lifetimes.

`

521

514

`///

`

522

515

`/// # Examples

`

`@@ -940,37 +933,38 @@ pub(crate) mod tags {

`

940

933

`#[repr(transparent)]

`

941

934

`pub(crate) struct TaggedOption<'a, I: tags::Type<'a>>(pub Option<I::Reified>);

`

942

935

``

943

``

`-

impl<'a, I: tags::Type<'a>> TaggedOption<'a, I> {

`

``

936

`+

impl<'a, I: tags::Type<'a>> Tagged<TaggedOption<'a, I>> {

`

944

937

`pub(crate) fn as_request(&mut self) -> &mut Request<'a> {

`

945

``

`-

Request::new(self as &mut (dyn Erased<'a> + 'a))

`

``

938

`+

let erased = self as &mut Tagged<dyn Erased<'a> + 'a>;

`

``

939

`` +

// SAFETY: transmuting &mut Tagged<dyn Erased<'a> + 'a> to &mut Request<'a> is safe since

``

``

940

`` +

// Request is repr(transparent).

``

``

941

`+

unsafe { &mut *(erased as *mut Tagged<dyn Erased<'a>> as *mut Request<'a>) }

`

946

942

`}

`

947

943

`}

`

948

944

``

949

945

`/// Represents a type-erased but identifiable object.

`

950

946

`///

`

951

947

`` /// This trait is exclusively implemented by the TaggedOption type.

``

952

``

`-

unsafe trait Erased<'a>: 'a {

`

953

``

`` -

/// The TypeId of the erased type.

``

954

``

`-

fn tag_id(&self) -> TypeId;

`

955

``

`-

}

`

``

948

`+

unsafe trait Erased<'a>: 'a {}

`

956

949

``

957

``

`-

unsafe impl<'a, I: tags::Type<'a>> Erased<'a> for TaggedOption<'a, I> {

`

958

``

`-

fn tag_id(&self) -> TypeId {

`

959

``

`-

TypeId::of::()

`

960

``

`-

}

`

``

950

`+

unsafe impl<'a, I: tags::Type<'a>> Erased<'a> for TaggedOption<'a, I> {}

`

``

951

+

``

952

`+

struct Tagged<E: ?Sized> {

`

``

953

`+

tag_id: TypeId,

`

``

954

`+

value: E,

`

961

955

`}

`

962

956

``

963

``

`-

impl<'a> dyn Erased<'a> + 'a {

`

``

957

`+

impl<'a> Tagged<dyn Erased<'a> + 'a> {

`

964

958

`` /// Returns some reference to the dynamic value if it is tagged with I,

``

965

959

`` /// or None otherwise.

``

966

960

`#[inline]

`

967

961

`fn downcast(&self) -> Option<&TaggedOption<'a, I>>

`

968

962

`where

`

969

963

`I: tags::Type<'a>,

`

970

964

`{

`

971

``

`-

if self.tag_id() == TypeId::of::() {

`

``

965

`+

if self.tag_id == TypeId::of::() {

`

972

966

`// SAFETY: Just checked whether we're pointing to an I.

`

973

``

`-

Some(unsafe { &*(self as *const Self).cast::<TaggedOption<'a, I>>() })

`

``

967

`+

Some(&unsafe { &*(self as *const Self).cast::<Tagged<TaggedOption<'a, I>>>() }.value)

`

974

968

`} else {

`

975

969

`None

`

976

970

`}

`

`@@ -983,9 +977,12 @@ impl<'a> dyn Erased<'a> + 'a {

`

983

977

`where

`

984

978

`I: tags::Type<'a>,

`

985

979

`{

`

986

``

`-

if self.tag_id() == TypeId::of::() {

`

987

``

`-

// SAFETY: Just checked whether we're pointing to an I.

`

988

``

`-

Some(unsafe { &mut *(self as *mut Self).cast::<TaggedOption<'a, I>>() })

`

``

980

`+

if self.tag_id == TypeId::of::() {

`

``

981

`+

Some(

`

``

982

`+

// SAFETY: Just checked whether we're pointing to an I.

`

``

983

`+

&mut unsafe { &mut *(self as *mut Self).cast::<Tagged<TaggedOption<'a, I>>>() }

`

``

984

`+

.value,

`

``

985

`+

)

`

989

986

`} else {

`

990

987

`None

`

991

988

`}

`