Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Check ABI target compatibility for function pointers #128784

Merged
merged 2 commits into from
Oct 13, 2024

Conversation

tdittr
Copy link
Contributor

@tdittr tdittr commented Aug 7, 2024

Tracking issue: #130260
Related tracking issue: #87678

Compatibility of an ABI for a target was previously only performed on function definitions and extern blocks. This PR adds it also to function pointers to be consistent.

This might have broken some of the tests/ui/ depending on the platform, so a try run seems like a good idea.

Also this might break existing code, because we now emit extra errors. Does this require a crater run?

Example

// build with: --target=x86_64-unknown-linux-gnu 

// These raise E0570
extern "thiscall" fn foo() {}
extern "thiscall" { fn bar() }

// This did not raise any error
fn baz(f: extern "thiscall" fn()) { f() }

Open Questions

@rustbot
Copy link
Collaborator

rustbot commented Aug 7, 2024

r? @compiler-errors

rustbot has assigned @compiler-errors.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Aug 7, 2024
@rustbot
Copy link
Collaborator

rustbot commented Aug 7, 2024

HIR ty lowering was modified

cc @fmease

Copy link
Contributor Author

@tdittr tdittr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some notes we had while writing this PR.

compiler/rustc_hir_analysis/src/check/check.rs Outdated Show resolved Hide resolved
compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs Outdated Show resolved Hide resolved
tests/ui/abi/unsupported.rs Outdated Show resolved Hide resolved
tests/ui/c-variadic/variadic-ffi-2.rs Outdated Show resolved Hide resolved
@rust-log-analyzer

This comment has been minimized.

@tdittr
Copy link
Contributor Author

tdittr commented Aug 10, 2024

Thinking about it and seeing how many tests already broke by this and this only showing up on specific targets, maybe this should only raise a future incompatibility warning?

@tdittr
Copy link
Contributor Author

tdittr commented Aug 15, 2024

@compiler-errors could you trigger a try run for this PR? Just to check if there are more tests that fail when run on a different target

@jieyouxu
Copy link
Member

jieyouxu commented Aug 15, 2024

could you trigger a try run for this PR? Just to check if there are more tests that fail when run on a different target

Do you have any particular targets in mind? I added some common try-jobs to your PR description. We can run a first battery of try-jobs on the common targets.

@jieyouxu
Copy link
Member

@bors try

bors added a commit to rust-lang-ci/rust that referenced this pull request Aug 15, 2024
Check ABI target compatibility for function pointers

Related tracking issue: rust-lang#87678

Compatibility of an ABI for a target was previously only performed on function definitions and `extern` blocks. This PR adds it also to function pointers to be consistent.

This might have broken some of the `tests/ui/` depending on the platform, so a try run seems like a good idea.

Also this might break existing code, because we now emit extra errors. Does this require a crater run?

# Example
```rust
// build with: --target=x86_64-unknown-linux-gnu

// These raise E0570
extern "thiscall" fn foo() {}
extern "thiscall" { fn bar() }

// This did not raise any error
fn baz(f: extern "thiscall" fn()) { f() }
```

try-job: aarch64-gnu
try-job: aarch64-apple
try-job: x86_64-msvc
try-job: x86_64-mingw
try-job: i686-msvc
try-job: i686-mingw
try-job: test-various
try-job: armhf-gnu
@bors
Copy link
Contributor

bors commented Aug 15, 2024

⌛ Trying commit 0cef57e with merge adb3631...

@rust-log-analyzer

This comment has been minimized.

@bors
Copy link
Contributor

bors commented Aug 15, 2024

💔 Test failed - checks-actions

@bors bors added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Aug 15, 2024
@tdittr
Copy link
Contributor Author

tdittr commented Aug 16, 2024

could you trigger a try run for this PR? Just to check if there are more tests that fail when run on a different target

Do you have any particular targets in mind? I added some common try-jobs to your PR description. We can run a first battery of try-jobs on the common targets.

Thanks you! Sorry I missed that I could have filtered out specific jobs. I'll try to fix this soon.

@jieyouxu
Copy link
Member

Thanks you! Sorry I missed that I could have filtered out specific jobs. I'll try to fix this soon.

Feel free to ping me if you need another run.

@tdittr
Copy link
Contributor Author

tdittr commented Aug 16, 2024

Just saw the t-compiler/meeting discussion that mentioned this PR. And this comment by @compiler-errors

At least AFAICT #128784 is motivated primarily by "C-cmse-nonsecure-call"

I think this PR actually fixes a Bug, we came across this while working on CMSE, but the problem seems to be bigger. ABIs are not checked at all for target compatibility when used with function pointers.

Or did we miss something and not checking ABIs on function pointers is on purpose? Is there a valid use-case for using a function pointer with an ABI for a different target somewhere?

@tdittr
Copy link
Contributor Author

tdittr commented Aug 16, 2024

Just so I don't forget to check them. The list of all usages of function pointers in rust-lang/rust:

with ABIs listed in the reference
$ rg --sort path --iglob \*.rs 'extern\s+"(cdecl|stdcall|win64|sysv64|aapcs|fastcall|vectorcall|thiscall|efiapi)"\s+fn\s*\('

✔️ This is gated by #[cfg(target_os = "uefi")] so should be fine.

library/std/src/sys/pal/uefi/helpers.rs
27:    unsafe extern "efiapi" fn(_: *mut r_efi::efi::Handle, _: ...) -> r_efi::efi::Status;
30:    unsafe extern "efiapi" fn(_: r_efi::efi::Handle, _: ...) -> r_efi::efi::Status;
  • this needs to be checked, maybe we can use another ABI here?
tests/debuginfo/type-names.rs
20:// gdb-check:type = type_names::GenericStruct<type_names::Struct1, extern "fastcall" fn(isize) -> usize>
375:    let generic_struct2: GenericStruct<Struct1, extern "fastcall" fn(isize) -> usize> =

✔️ Rustdoc seems fine with this even on aarch64

tests/rustdoc-json/fn_pointer/abi.rs
21:pub type AbiVecorcall = extern "vectorcall" fn();

✔️ This is gated by #[cfg(target_arch = "x86_64")]

tests/ui/abi/abi-sysv64-arg-passing.rs
272:    fn indirect_call(func: unsafe extern "sysv64" fn(s: S) -> u64, s: S) -> u64 {

✔️ These were added by this PR

tests/ui/abi/unsupported.rs
47:fn aapcs_ptr(f: extern "aapcs" fn()) {
122:fn thiscall_ptr(f: extern "thiscall" fn()) {
148:fn stdcall_ptr(f: extern "stdcall" fn()) {

✔️ gated by //@ only-x86_64

tests/ui/asm/issue-97490.rs
5:pub type Yes = extern "sysv64" fn(&'static u8) -> !;

✔️ gated by //@ only-x86_64

tests/ui/c-variadic/feature-gate-extended_varargs_abi_support.rs
3:fn efiapi(f: extern "efiapi" fn(usize, ...)) {
8:fn sysv(f: extern "sysv64" fn(usize, ...)) {
13:fn win(f: extern "win64" fn(usize, ...)) {

✔️ gated by //@ only-arm

tests/ui/c-variadic/variadic-ffi-2-arm.rs
5:fn aapcs(f: extern "aapcs" fn(usize, ...)) {

✔️ gated by //@ ignore-arm and various #[cfg(target_arch = "...")]

tests/ui/c-variadic/variadic-ffi-2.rs
5:fn baz(f: extern "stdcall" fn(usize, ...)) {
15:fn sysv(f: extern "sysv64" fn(usize, ...)) {
19:fn win(f: extern "win64" fn(usize, ...)) {
22:fn efiapi(f: extern "efiapi" fn(usize, ...)) {

✔️ has //@ compile-flags: --target=i686-pc-windows-msvc

tests/ui/feature-gates/feature-gate-vectorcall.rs
29:type TA = extern "vectorcall" fn(); //~ ERROR vectorcall is experimental
with other ABIs
$ rg --sort path --iglob \*.rs 'extern\s+"(x86-interrupt|aapcs-unwind|C-cmse-nonsecure-call|ptx-kernel|msp430-interrupt|riscv-interrupt-m|riscv-interrupt-s|avr-interrupt|avr
-non-blocking-interrupt)"\s+fn\s*\('

✔️ only in comments

compiler/rustc_feature/src/unstable.rs
333:    /// Allows `extern "avr-interrupt" fn()` and `extern "avr-non-blocking-interrupt" fn()`.
335:    /// Allows `extern "C-cmse-nonsecure-call" fn()`.
337:    /// Allows `extern "msp430-interrupt" fn()`.
341:    /// Allows `extern "riscv-interrupt-m" fn()` and `extern "riscv-interrupt-s" fn()`.
343:    /// Allows `extern "x86-interrupt" fn()`.

✔️ only in text

src/tools/rust-analyzer/crates/ide-db/src/generated/lints.rs
1091:        unsafe { core::mem::transmute::<usize, extern "C-cmse-nonsecure-call" fn() -> u32>(addr) };
1163:pub static TIM0_VECTOR: extern "msp430-interrupt" fn() = tim0;

✔️ introduced by this PR

tests/ui/abi/unsupported.rs
34:fn ptx_ptr(f: extern "ptx-kernel" fn()) {
64:fn msp430_ptr(f: extern "msp430-interrupt" fn()) {
73:fn avr_ptr(f: extern "avr-interrupt" fn()) {
85:fn riscv_ptr(f: extern "riscv-interrupt-m" fn()) {
103:fn x86_ptr(f: extern "x86-interrupt" fn()) {
173:fn cmse_ptr(f: extern "C-cmse-nonsecure-call" fn()) {

✔️ Checks for this error and ignores supported targets

tests/ui/cmse-nonsecure/cmse-nonsecure-call/gate_test.rs
9:        core::mem::transmute::<usize, extern "C-cmse-nonsecure-call" fn(i32, i32, i32, i32) -> i32>(

✔️ Has //@ compile-flags: --target thumbv8m.main-none-eabi

tests/ui/cmse-nonsecure/cmse-nonsecure-call/generics.rs
17:    f2: extern "C-cmse-nonsecure-call" fn(impl Copy, u32, u32, u32) -> u64,
19:    f3: extern "C-cmse-nonsecure-call" fn(T, u32, u32, u32) -> u64, //~ ERROR [E0798]
20:    f4: extern "C-cmse-nonsecure-call" fn(Wrapper<T>, u32, u32, u32) -> u64, //~ ERROR [E0798]

✔️ Has //@ compile-flags: --target thumbv8m.main-none-eabi

tests/ui/cmse-nonsecure/cmse-nonsecure-call/params-via-stack.rs
17:    f1: extern "C-cmse-nonsecure-call" fn(u32, u32, u32, u32, x: u32, y: u32), //~ ERROR [E0798]
18:    f2: extern "C-cmse-nonsecure-call" fn(u32, u32, u32, u16, u16),            //~ ERROR [E0798]
19:    f3: extern "C-cmse-nonsecure-call" fn(u32, u64, u32),                      //~ ERROR [E0798]
20:    f4: extern "C-cmse-nonsecure-call" fn(AlignRelevant, u32),                 //~ ERROR [E0798]
21:    f5: extern "C-cmse-nonsecure-call" fn([u32; 5]),                           //~ ERROR [E0798]

✔️ Has //@ compile-flags: --target thumbv8m.main-none-eabi

tests/ui/cmse-nonsecure/cmse-nonsecure-call/return-via-stack.rs
25:    f1: extern "C-cmse-nonsecure-call" fn() -> ReprCU64, //~ ERROR [E0798]
26:    f2: extern "C-cmse-nonsecure-call" fn() -> ReprCBytes, //~ ERROR [E0798]
27:    f3: extern "C-cmse-nonsecure-call" fn() -> U64Compound, //~ ERROR [E0798]
28:    f4: extern "C-cmse-nonsecure-call" fn() -> ReprCAlign16, //~ ERROR [E0798]
29:    f5: extern "C-cmse-nonsecure-call" fn() -> [u8; 5],  //~ ERROR [E0798]
35:    u128: extern "C-cmse-nonsecure-call" fn() -> u128, //~ ERROR [E0798]
36:    i128: extern "C-cmse-nonsecure-call" fn() -> i128, //~ ERROR [E0798]
51:    f1: extern "C-cmse-nonsecure-call" fn() -> ReprRustUnionU64, //~ ERROR [E0798]
52:    f2: extern "C-cmse-nonsecure-call" fn() -> ReprCUnionU64,    //~ ERROR [E0798]

✔️ Has //@ compile-flags: --target thumbv8m.main-none-eabi

tests/ui/cmse-nonsecure/cmse-nonsecure-call/via-registers.rs
31:    f1: extern "C-cmse-nonsecure-call" fn(),
32:    f2: extern "C-cmse-nonsecure-call" fn(u32, u32, u32, u32),
33:    f3: extern "C-cmse-nonsecure-call" fn(u64, u64),
34:    f4: extern "C-cmse-nonsecure-call" fn(u128),
35:    f5: extern "C-cmse-nonsecure-call" fn(f64, f32, f32),
36:    f6: extern "C-cmse-nonsecure-call" fn(ReprTransparentStruct<u64>, U32Compound),
37:    f7: extern "C-cmse-nonsecure-call" fn([u32; 4]),
43:    f1: extern "C-cmse-nonsecure-call" fn() -> u32,
44:    f2: extern "C-cmse-nonsecure-call" fn() -> u64,
45:    f3: extern "C-cmse-nonsecure-call" fn() -> i64,
46:    f4: extern "C-cmse-nonsecure-call" fn() -> f64,
47:    f5: extern "C-cmse-nonsecure-call" fn() -> [u8; 4],
48:    f6: extern "C-cmse-nonsecure-call" fn() -> ReprTransparentStruct<u64>,
49:    f7: extern "C-cmse-nonsecure-call" fn() -> ReprTransparentStruct<ReprTransparentStruct<u64>>,
50:    f8: extern "C-cmse-nonsecure-call" fn() -> ReprTransparentEnumU64,
51:    f9: extern "C-cmse-nonsecure-call" fn() -> U32Compound,

✔️ Has //@ compile-flags: --target=avr-unknown-gnu-atmega328

tests/ui/feature-gates/feature-gate-abi-avr-interrupt.rs
43:type TA = extern "avr-interrupt" fn();
45:type TAU = extern "avr-non-blocking-interrupt" fn();

✔️ Has //@ compile-flags: --target=...

tests/ui/feature-gates/feature-gate-abi-msp430-interrupt.rs
30:type TA = extern "msp430-interrupt" fn();

✔️ Has //@ compile-flags: --target=...

tests/ui/feature-gates/feature-gate-abi-riscv-interrupt.rs
32:type TA = extern "riscv-interrupt-m" fn();

✔️ Has //@ compile-flags: --target=...

tests/ui/feature-gates/feature-gate-abi-x86-interrupt.rs
26:type A7 = extern "x86-interrupt" fn(); //~ ERROR x86-interrupt ABI is experimental

✔️ Has //@ compile-flags: --target=...

tests/ui/feature-gates/feature-gate-abi_ptx.rs
24:type TAU = extern "ptx-kernel" fn(); //~ ERROR PTX ABIs are experimental

If there is a better way then greping these I would be happy to learn about it 😉

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if it is ok to change this test from fastcall (only allowed on x86) to system.

From what I understand this test only wants to check that the ABI actually show up in the debug output, and I would guess that system works just as nice for this.

@tdittr
Copy link
Contributor Author

tdittr commented Aug 16, 2024

I think I found all the places that use extern "..." fn() now. Can you give it another try @jieyouxu ? I think the task selection looks good the way it is right now.

@jieyouxu
Copy link
Member

I think I found all the places that use extern "..." fn() now. Can you give it another try @jieyouxu ? I think the task selection looks good the way it is right now.

Sure. @bors try

bors added a commit to rust-lang-ci/rust that referenced this pull request Aug 16, 2024
Check ABI target compatibility for function pointers

Related tracking issue: rust-lang#87678

Compatibility of an ABI for a target was previously only performed on function definitions and `extern` blocks. This PR adds it also to function pointers to be consistent.

This might have broken some of the `tests/ui/` depending on the platform, so a try run seems like a good idea.

Also this might break existing code, because we now emit extra errors. Does this require a crater run?

# Example
```rust
// build with: --target=x86_64-unknown-linux-gnu

// These raise E0570
extern "thiscall" fn foo() {}
extern "thiscall" { fn bar() }

// This did not raise any error
fn baz(f: extern "thiscall" fn()) { f() }
```

# Places to check in the tests:
* [x] Check if we can use another ABI here
```
tests/debuginfo/type-names.rs
20:// gdb-check:type = type_names::GenericStruct<type_names::Struct1, extern "fastcall" fn(isize) -> usize>
375:    let generic_struct2: GenericStruct<Struct1, extern "fastcall" fn(isize) -> usize> =
```

try-job: aarch64-gnu
try-job: aarch64-apple
try-job: x86_64-msvc
try-job: x86_64-mingw
try-job: i686-msvc
try-job: i686-mingw
try-job: test-various
try-job: armhf-gnu
@bors
Copy link
Contributor

bors commented Aug 16, 2024

⌛ Trying commit b2be5a8 with merge d7da183...

@rust-log-analyzer

This comment has been minimized.

@bors
Copy link
Contributor

bors commented Aug 16, 2024

💔 Test failed - checks-actions

@tdittr
Copy link
Contributor Author

tdittr commented Aug 16, 2024

Oh I missed that one, I think it is fixed now, tested locally with s390x-unknown-linux-gnu which triggered the same case. Can we give it one more try @jieyouxu ? I also reduced the try jobs a bit, since msvc or mingw should not make a difference.

@jieyouxu
Copy link
Member

Oh I missed that one, I think it is fixed now, tested locally with s390x-unknown-linux-gnu which triggered the same case. Can we give it one more try @jieyouxu ? I also reduced the try jobs a bit, since msvc or mingw should not make a difference.

Sure. @bors try

@nikomatsakis
Copy link
Contributor

I think it'd be ok if we allowed you to declare-but-not-call functions that are not valid on your architecture (it strikes me as potentially quite annoying to not be able to do that, actually), but I think we should be consistent. If we were going to make that change I'd expect to make it everywhere.

@traviscross
Copy link
Contributor

@rustbot labels -I-lang-nominated

We discussed this in the meeting today... and it's now in FCP.

@rustbot rustbot removed the I-lang-nominated Nominated for discussion during a lang team meeting. label Oct 2, 2024
@tmandry
Copy link
Member

tmandry commented Oct 3, 2024

I agree that we might want to allow this for uncalled private functions (or downgrade to a lint), but we would probably want to make sure codegen never happens for those functions because it isn't clear what a backend would do with them. Looks like #87678 is the place for more discussion of this.

@rfcbot reviewed

@rfcbot rfcbot added finished-final-comment-period The final comment period is finished for this PR / Issue. to-announce Announce this issue on triage meeting and removed final-comment-period In the final comment period and will be merged soon unless new substantive objections are raised. labels Oct 12, 2024
@rfcbot
Copy link

rfcbot commented Oct 12, 2024

The final comment period, with a disposition to merge, as per the review above, is now complete.

As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed.

This will be merged soon.

@RalfJung
Copy link
Member

@rustbot ready

@rustbot rustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Oct 12, 2024
@RalfJung RalfJung removed the S-waiting-on-team Status: Awaiting decision from the relevant subteam (see the T-<team> label). label Oct 12, 2024
@RalfJung
Copy link
Member

@compiler-errors wrote

LGTM, but T-lang nominating as a final lint sign-off.

But I'm going to let them do the r+ since this is quite the big PR and it did require some rebasing since the review.

Copy link
Member

@compiler-errors compiler-errors left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. One diagnostic tweak, but I can review that as a follow-up PR.

Some(false) | None => {
tcx.node_span_lint(UNSUPPORTED_FN_PTR_CALLING_CONVENTIONS, hir_id, span, |lint| {
lint.primary_message(
"use of calling convention not supported on this target on function pointer",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This diagnostic is a bit awkward. Perhaps change it to:

"the calling convention {} is not supported on this target"

I think mentioning fn ptrs is also unnecessary, since it's also a warning for items (and soon an error).

@compiler-errors
Copy link
Member

@bors r+

@bors
Copy link
Contributor

bors commented Oct 12, 2024

📌 Commit 867e776 has been approved by compiler-errors

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Oct 12, 2024
@compiler-errors
Copy link
Member

@tdittr would you like to tweak this message as a follow-up, or should I?

matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Oct 12, 2024
…iler-errors

Check ABI target compatibility for function pointers

Tracking issue: rust-lang#130260
Related tracking issue: rust-lang#87678

Compatibility of an ABI for a target was previously only performed on function definitions and `extern` blocks. This PR adds it also to function pointers to be consistent.

This might have broken some of the `tests/ui/` depending on the platform, so a try run seems like a good idea.

Also this might break existing code, because we now emit extra errors. Does this require a crater run?

# Example
```rust
// build with: --target=x86_64-unknown-linux-gnu

// These raise E0570
extern "thiscall" fn foo() {}
extern "thiscall" { fn bar() }

// This did not raise any error
fn baz(f: extern "thiscall" fn()) { f() }
```

# Open Questions
* [x] Should this report a future incompatibility warning like rust-lang#87678 ?
* [ ] Is this the best place to perform the check?
bors added a commit to rust-lang-ci/rust that referenced this pull request Oct 12, 2024
…iaskrgr

Rollup of 8 pull requests

Successful merges:

 - rust-lang#128784 (Check ABI target compatibility for function pointers)
 - rust-lang#130965 (make `Step` doc-comments more clear)
 - rust-lang#131239 (Don't assume traits used as type are trait objs in 2021 edition)
 - rust-lang#131277 (Handle `clippy` cases of `rustc::potential_query_instability` lint)
 - rust-lang#131503 (More clearly document Stdin::read_line)
 - rust-lang#131567 (Emit an error for unstable attributes that reference already stable features)
 - rust-lang#131599 (Shallowly match opaque key in storage)
 - rust-lang#131617 (remove const_cow_is_borrowed feature gate)

Failed merges:

 - rust-lang#131616 (merge const_ipv4 / const_ipv6 feature gate into 'ip' feature gate)

r? `@ghost`
`@rustbot` modify labels: rollup
@bors bors merged commit 57be141 into rust-lang:master Oct 13, 2024
6 checks passed
@rustbot rustbot added this to the 1.83.0 milestone Oct 13, 2024
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Oct 13, 2024
Rollup merge of rust-lang#128784 - tdittr:check-abi-on-fn-ptr, r=compiler-errors

Check ABI target compatibility for function pointers

Tracking issue: rust-lang#130260
Related tracking issue: rust-lang#87678

Compatibility of an ABI for a target was previously only performed on function definitions and `extern` blocks. This PR adds it also to function pointers to be consistent.

This might have broken some of the `tests/ui/` depending on the platform, so a try run seems like a good idea.

Also this might break existing code, because we now emit extra errors. Does this require a crater run?

# Example
```rust
// build with: --target=x86_64-unknown-linux-gnu

// These raise E0570
extern "thiscall" fn foo() {}
extern "thiscall" { fn bar() }

// This did not raise any error
fn baz(f: extern "thiscall" fn()) { f() }
```

# Open Questions
* [x] Should this report a future incompatibility warning like rust-lang#87678 ?
* [ ] Is this the best place to perform the check?
@tdittr
Copy link
Contributor Author

tdittr commented Oct 14, 2024

@tdittr would you like to tweak this message as a follow-up, or should I?

I will do it :)

@tdittr tdittr deleted the check-abi-on-fn-ptr branch October 14, 2024 05:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. I-lang-easy-decision Issue: The decision needed by the team is conjectured to be easy. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. T-lang Relevant to the language team, which will review and decide on the PR/issue. to-announce Announce this issue on triage meeting
Projects
None yet
Development

Successfully merging this pull request may close these issues.