Put the RFC behind a feature gate result_ffi_guarantees · rust-lang/rust@ed532cc (original) (raw)

``

1

`+

#![allow(dead_code)]

`

``

2

`+

#![deny(improper_ctypes)]

`

``

3

`+

#![feature(ptr_internals)]

`

``

4

+

``

5

`+

use std::num;

`

``

6

+

``

7

`+

enum Z {}

`

``

8

+

``

9

`+

#[repr(transparent)]

`

``

10

`+

struct TransparentStruct(T, std:📑:PhantomData);

`

``

11

+

``

12

`+

#[repr(transparent)]

`

``

13

`+

enum TransparentEnum {

`

``

14

`+

Variant(T, std:📑:PhantomData),

`

``

15

`+

}

`

``

16

+

``

17

`+

struct NoField;

`

``

18

+

``

19

`+

extern "C" {

`

``

20

`+

fn result_ref_t(x: Result<&'static u8, ()>);

`

``

21

`` +

//~^ ERROR extern block uses type `Result

``

``

22

`+

fn result_fn_t(x: Result<extern "C" fn(), ()>);

`

``

23

`` +

//~^ ERROR extern block uses type `Result

``

``

24

`+

fn result_nonnull_t(x: Result<std::ptr::NonNull, ()>);

`

``

25

`` +

//~^ ERROR extern block uses type `Result

``

``

26

`+

fn result_unique_t(x: Result<std::ptr::Unique, ()>);

`

``

27

`` +

//~^ ERROR extern block uses type `Result

``

``

28

`+

fn result_nonzero_u8_t(x: Result<num::NonZero, ()>);

`

``

29

`` +

//~^ ERROR extern block uses type `Result

``

``

30

`+

fn result_nonzero_u16_t(x: Result<num::NonZero, ()>);

`

``

31

`` +

//~^ ERROR extern block uses type `Result

``

``

32

`+

fn result_nonzero_u32_t(x: Result<num::NonZero, ()>);

`

``

33

`` +

//~^ ERROR extern block uses type `Result

``

``

34

`+

fn result_nonzero_u64_t(x: Result<num::NonZero, ()>);

`

``

35

`` +

//~^ ERROR extern block uses type `Result

``

``

36

`+

fn result_nonzero_usize_t(x: Result<num::NonZero, ()>);

`

``

37

`` +

//~^ ERROR extern block uses type `Result

``

``

38

`+

fn result_nonzero_i8_t(x: Result<num::NonZero, ()>);

`

``

39

`` +

//~^ ERROR extern block uses type `Result

``

``

40

`+

fn result_nonzero_i16_t(x: Result<num::NonZero, ()>);

`

``

41

`` +

//~^ ERROR extern block uses type `Result

``

``

42

`+

fn result_nonzero_i32_t(x: Result<num::NonZero, ()>);

`

``

43

`` +

//~^ ERROR extern block uses type `Result

``

``

44

`+

fn result_nonzero_i64_t(x: Result<num::NonZero, ()>);

`

``

45

`` +

//~^ ERROR extern block uses type `Result

``

``

46

`+

fn result_nonzero_isize_t(x: Result<num::NonZero, ()>);

`

``

47

`` +

//~^ ERROR extern block uses type `Result

``

``

48

`+

fn result_transparent_struct_t(x: Result<TransparentStruct<num::NonZero>, ()>);

`

``

49

`` +

//~^ ERROR extern block uses type `Result

``

``

50

`+

fn result_transparent_enum_t(x: Result<TransparentEnum<num::NonZero>, ()>);

`

``

51

`` +

//~^ ERROR extern block uses type `Result

``

``

52

`+

fn result_phantom_t(x: Result<num::NonZero, std:📑:PhantomData<()>>);

`

``

53

`` +

//~^ ERROR extern block uses type `Result

``

``

54

`+

fn result_1zst_exhaustive_no_variant_t(x: Result<num::NonZero, Z>);

`

``

55

`` +

//~^ ERROR extern block uses type `Result

``

``

56

`+

fn result_1zst_exhaustive_no_field_t(x: Result<num::NonZero, NoField>);

`

``

57

`` +

//~^ ERROR extern block uses type `Result

``

``

58

+

``

59

`+

fn result_ref_e(x: Result<(), &'static u8>);

`

``

60

`` +

//~^ ERROR extern block uses type `Result

``

``

61

`+

fn result_fn_e(x: Result<(), extern "C" fn()>);

`

``

62

`` +

//~^ ERROR extern block uses type `Result

``

``

63

`+

fn result_nonnull_e(x: Result<(), std::ptr::NonNull>);

`

``

64

`` +

//~^ ERROR extern block uses type `Result

``

``

65

`+

fn result_unique_e(x: Result<(), std::ptr::Unique>);

`

``

66

`` +

//~^ ERROR extern block uses type `Result

``

``

67

`+

fn result_nonzero_u8_e(x: Result<(), num::NonZero>);

`

``

68

`` +

//~^ ERROR extern block uses type `Result

``

``

69

`+

fn result_nonzero_u16_e(x: Result<(), num::NonZero>);

`

``

70

`` +

//~^ ERROR extern block uses type `Result

``

``

71

`+

fn result_nonzero_u32_e(x: Result<(), num::NonZero>);

`

``

72

`` +

//~^ ERROR extern block uses type `Result

``

``

73

`+

fn result_nonzero_u64_e(x: Result<(), num::NonZero>);

`

``

74

`` +

//~^ ERROR extern block uses type `Result

``

``

75

`+

fn result_nonzero_usize_e(x: Result<(), num::NonZero>);

`

``

76

`` +

//~^ ERROR extern block uses type `Result

``

``

77

`+

fn result_nonzero_i8_e(x: Result<(), num::NonZero>);

`

``

78

`` +

//~^ ERROR extern block uses type `Result

``

``

79

`+

fn result_nonzero_i16_e(x: Result<(), num::NonZero>);

`

``

80

`` +

//~^ ERROR extern block uses type `Result

``

``

81

`+

fn result_nonzero_i32_e(x: Result<(), num::NonZero>);

`

``

82

`` +

//~^ ERROR extern block uses type `Result

``

``

83

`+

fn result_nonzero_i64_e(x: Result<(), num::NonZero>);

`

``

84

`` +

//~^ ERROR extern block uses type `Result

``

``

85

`+

fn result_nonzero_isize_e(x: Result<(), num::NonZero>);

`

``

86

`` +

//~^ ERROR extern block uses type `Result

``

``

87

`+

fn result_transparent_struct_e(x: Result<(), TransparentStruct<num::NonZero>>);

`

``

88

`` +

//~^ ERROR extern block uses type `Result

``

``

89

`+

fn result_transparent_enum_e(x: Result<(), TransparentEnum<num::NonZero>>);

`

``

90

`` +

//~^ ERROR extern block uses type `Result

``

``

91

`+

fn result_phantom_e(x: Result<num::NonZero, std:📑:PhantomData<()>>);

`

``

92

`` +

//~^ ERROR extern block uses type `Result

``

``

93

`+

fn result_1zst_exhaustive_no_variant_e(x: Result<Z, num::NonZero>);

`

``

94

`` +

//~^ ERROR extern block uses type `Result

``

``

95

`+

fn result_1zst_exhaustive_no_field_e(x: Result<NoField, num::NonZero>);

`

``

96

`` +

//~^ ERROR extern block uses type `Result

``

``

97

`+

}

`

``

98

+

``

99

`+

pub fn main() {}

`