File tree Expand file tree Collapse file tree 4 files changed +52
-11
lines changed
compiler/rustc_hir_analysis/src Expand file tree Collapse file tree 4 files changed +52
-11
lines changed Original file line number Diff line number Diff line change @@ -409,6 +409,11 @@ fn check_constraints<'tcx>(
409409 emit ( "recursive delegation is not supported yet" ) ;
410410 }
411411
412+ if tcx. fn_sig ( sig_id) . skip_binder ( ) . skip_binder ( ) . c_variadic {
413+ // See issue #127443 for explanation.
414+ emit ( "delegation to C-variadic functions is not allowed" ) ;
415+ }
416+
412417 ret
413418}
414419
Original file line number Diff line number Diff line change 1+ //@ aux-crate:fn_header_aux=fn-header-aux.rs
2+
3+ #![ feature( c_variadic) ]
4+ #![ feature( fn_delegation) ]
5+ #![ allow( incomplete_features) ]
6+
7+ mod to_reuse {
8+ pub unsafe extern "C" fn variadic_fn ( n : usize , mut args: ...) { }
9+ }
10+
11+ reuse to_reuse:: variadic_fn;
12+ //~^ ERROR delegation to C-variadic functions is not allowed
13+ reuse fn_header_aux:: variadic_fn_extern;
14+ //~^ ERROR delegation to C-variadic functions is not allowed
15+
16+ fn main ( ) {
17+ unsafe {
18+ variadic_fn ( 0 ) ;
19+ variadic_fn ( 0 , 1 ) ;
20+ variadic_fn_extern ( 0 ) ;
21+ variadic_fn_extern ( 0 , 1 ) ;
22+ }
23+ let _: unsafe extern "C" fn ( usize , ...) = variadic_fn;
24+ let _: unsafe extern "C" fn ( usize , ...) = variadic_fn_extern;
25+ }
Original file line number Diff line number Diff line change 1+ error: delegation to C-variadic functions is not allowed
2+ --> $DIR/fn-header-variadic.rs:11:17
3+ |
4+ LL | pub unsafe extern "C" fn variadic_fn(n: usize, mut args: ...) {}
5+ | ------------------------------------------------------------- callee defined here
6+ ...
7+ LL | reuse to_reuse::variadic_fn;
8+ | ^^^^^^^^^^^
9+
10+ error: delegation to C-variadic functions is not allowed
11+ --> $DIR/fn-header-variadic.rs:13:22
12+ |
13+ LL | reuse fn_header_aux::variadic_fn_extern;
14+ | ^^^^^^^^^^^^^^^^^^
15+ |
16+ ::: $DIR/auxiliary/fn-header-aux.rs:7:1
17+ |
18+ LL | pub unsafe extern "C" fn variadic_fn_extern(n: usize, mut args: ...) {}
19+ | -------------------------------------------------------------------- callee defined here
20+
21+ error: aborting due to 2 previous errors
22+
Original file line number Diff line number Diff line change 1010mod to_reuse {
1111 pub unsafe fn unsafe_fn ( ) { }
1212 pub extern "C" fn extern_fn ( ) { }
13- pub unsafe extern "C" fn variadic_fn ( n : usize , mut args: ...) { }
1413 pub const fn const_fn ( ) { }
1514 pub async fn async_fn ( ) { }
1615}
1716
1817reuse to_reuse:: unsafe_fn;
1918reuse to_reuse:: extern_fn;
20- reuse to_reuse:: variadic_fn;
2119reuse to_reuse:: const_fn;
2220reuse to_reuse:: async_fn;
2321
2422reuse fn_header_aux:: unsafe_fn_extern;
2523reuse fn_header_aux:: extern_fn_extern;
26- reuse fn_header_aux:: variadic_fn_extern;
2724reuse fn_header_aux:: const_fn_extern;
2825reuse fn_header_aux:: async_fn_extern;
2926
@@ -46,12 +43,4 @@ fn main() {
4643 extern_fn_extern ( ) ;
4744 let _: extern "C" fn ( ) = extern_fn;
4845 let _: extern "C" fn ( ) = extern_fn_extern;
49- unsafe {
50- variadic_fn ( 0 ) ;
51- variadic_fn ( 0 , 1 ) ;
52- variadic_fn_extern ( 0 ) ;
53- variadic_fn_extern ( 0 , 1 ) ;
54- }
55- let _: unsafe extern "C" fn ( usize , ...) = variadic_fn;
56- let _: unsafe extern "C" fn ( usize , ...) = variadic_fn_extern;
5746}
You can’t perform that action at this time.
0 commit comments