Skip to content

Commit 378fcea

Browse files
authored
Merge pull request #157 from madsmtm/remove-manuallydrop-message
Remove `Message` impl for `ManuallyDrop` + fix UI test
2 parents ee5948e + f5b20ea commit 378fcea

File tree

10 files changed

+52
-33
lines changed

10 files changed

+52
-33
lines changed

objc2-encode/src/encode.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,25 @@ mod tests {
609609
);
610610
}
611611

612+
#[test]
613+
fn test_extern_fn_pointer_elided_lifetime() {
614+
fn impls_encode<T: Encode>(_x: T) {}
615+
616+
extern "C" fn my_fn1(_x: &i32) {}
617+
extern "C" fn my_fn2(_x: &i32, _y: &u8) {}
618+
extern "C" fn my_fn3(x: &u8) -> &u8 {
619+
x
620+
}
621+
extern "C" fn my_fn4<'a, 'b>(x: &'a u8, _y: &'b i32) -> &'a u8 {
622+
x
623+
}
624+
625+
impls_encode(my_fn1 as extern "C" fn(_));
626+
impls_encode(my_fn2 as extern "C" fn(_, _));
627+
impls_encode(my_fn3 as extern "C" fn(_) -> _);
628+
impls_encode(my_fn4 as extern "C" fn(_, _) -> _);
629+
}
630+
612631
#[test]
613632
fn test_encode_arguments() {
614633
assert!(<()>::ENCODINGS.is_empty());

objc2/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
6666
* Properly sealed the `MessageArguments` trait (it already had a hidden
6767
method, so this is not really a breaking change).
6868

69+
### Removed
70+
* **BREAKING**: `ManuallyDrop` no longer implements `Message` directly.
71+
6972

7073
## 0.3.0-alpha.6 - 2022-01-03
7174

objc2/src/message/mod.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,6 @@ use self::verify::{verify_message_signature, VerificationError};
6161
/// [`objc_msgSend`]: https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend
6262
pub unsafe trait Message: RefEncode {}
6363

64-
// SAFETY: `ManuallyDrop` is `repr(transparent)`.
65-
unsafe impl<T: Message + ?Sized> Message for ManuallyDrop<T> {}
66-
6764
unsafe impl Message for Object {}
6865

6966
// TODO: Make this fully private

tests/ui/fn_ptr_reference_encode.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,19 @@
22
//! higher-ranked over lifetimes.
33
//!
44
//! Ideally, they should be, but they can't be right now.
5-
//!
6-
//! (Also test that we can use `_` to work around this).
75
use objc2::Encode;
86

97
extern "C" fn my_fn(_x: &i32) {}
108

11-
fn e<T: Encode>(_x: T) {}
9+
fn impls_encode<T: Encode>(_x: T) {}
1210

1311
fn main() {
14-
// Works
15-
e(my_fn as extern "C" fn(_));
12+
// Works (though currently fails on nightly, see https://github.com/rust-lang/rust/issues/97997).
13+
impls_encode(my_fn as extern "C" fn(_));
1614
// Can't be written:
1715
// let encoding = <extern "C" fn(_) as Encode>::ENCODING;
1816

1917
// Fails
20-
e(my_fn as extern "C" fn(&i32));
21-
// Also fails, properly tested in `fn_ptr_reference_encode2`
22-
let encoding = <extern "C" fn(&i32) as Encode>::ENCODING;
18+
impls_encode(my_fn as extern "C" fn(&i32));
19+
let _encoding = <extern "C" fn(&i32) as Encode>::ENCODING;
2320
}
Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
11
error: implementation of `Encode` is not general enough
2-
--> ui/fn_ptr_reference_encode.rs:20:5
2+
--> ui/fn_ptr_reference_encode.rs:13:5
33
|
4-
20 | e(my_fn as extern "C" fn(&i32));
5-
| ^ implementation of `Encode` is not general enough
4+
13 | impls_encode(my_fn as extern "C" fn(_));
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Encode` is not general enough
6+
|
7+
= note: `Encode` would have to be implemented for the type `for<'r> extern "C" fn(&'r i32)`
8+
= note: ...but `Encode` is actually implemented for the type `extern "C" fn(&'0 i32)`, for some specific lifetime `'0`
9+
10+
error: implementation of `Encode` is not general enough
11+
--> ui/fn_ptr_reference_encode.rs:18:5
12+
|
13+
18 | impls_encode(my_fn as extern "C" fn(&i32));
14+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Encode` is not general enough
15+
|
16+
= note: `Encode` would have to be implemented for the type `for<'r> extern "C" fn(&'r i32)`
17+
= note: ...but `Encode` is actually implemented for the type `extern "C" fn(&'0 i32)`, for some specific lifetime `'0`
18+
19+
error: implementation of `Encode` is not general enough
20+
--> ui/fn_ptr_reference_encode.rs:19:21
21+
|
22+
19 | let _encoding = <extern "C" fn(&i32) as Encode>::ENCODING;
23+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Encode` is not general enough
624
|
725
= note: `Encode` would have to be implemented for the type `for<'r> extern "C" fn(&'r i32)`
826
= note: ...but `Encode` is actually implemented for the type `extern "C" fn(&'0 i32)`, for some specific lifetime `'0`

tests/ui/fn_ptr_reference_encode2.rs

Lines changed: 0 additions & 7 deletions
This file was deleted.

tests/ui/fn_ptr_reference_encode2.stderr

Lines changed: 0 additions & 8 deletions
This file was deleted.

tests/ui/fn_ptr_reference_method.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use objc2::runtime::{Object, Sel};
1212
extern "C" fn my_fn(_this: &Object, _cmd: Sel, _x: &Object) {}
1313

1414
fn main() {
15-
let builder = ClassBuilder::new("SomeTestClass", class!(NSObject)).unwrap();
15+
let mut builder = ClassBuilder::new("SomeTestClass", class!(NSObject)).unwrap();
1616
unsafe {
1717
// Works
1818
builder.add_method(sel!(first:), my_fn as extern "C" fn(&Object, _, _));

tests/ui/fn_ptr_reference_method2.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use objc2::runtime::{Object, Sel};
77
extern "C" fn my_fn(_this: &Object, _cmd: Sel, _x: &Object) {}
88

99
fn main() {
10-
let builder = ClassBuilder::new("SomeTestClass", class!(NSObject)).unwrap();
10+
let mut builder = ClassBuilder::new("SomeTestClass", class!(NSObject)).unwrap();
1111
unsafe {
1212
builder.add_method(sel!(both:), my_fn as extern "C" fn(&Object, Sel, &Object));
1313
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error: implementation of `MethodImplementation` is not general enough
2-
--> ui/fn_ptr_reference_method2.rs:12:17
2+
--> ui/fn_ptr_reference_method2.rs:12:9
33
|
44
12 | builder.add_method(sel!(both:), my_fn as extern "C" fn(&Object, Sel, &Object));
5-
| ^^^^^^^^^^ implementation of `MethodImplementation` is not general enough
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `MethodImplementation` is not general enough
66
|
77
= note: `MethodImplementation` would have to be implemented for the type `for<'r, 's> extern "C" fn(&'r objc2::runtime::Object, objc2::runtime::Sel, &'s objc2::runtime::Object)`
88
= note: ...but `MethodImplementation` is actually implemented for the type `for<'r> extern "C" fn(&'r objc2::runtime::Object, objc2::runtime::Sel, &'0 objc2::runtime::Object)`, for some specific lifetime `'0`

0 commit comments

Comments
 (0)