rust/compiler
bors 116201eefe Auto merge of #97461 - eddyb:proc-macro-less-payload, r=bjorn3
proc_macro: don't pass a client-side function pointer through the server.

Before this PR, `proc_macro::bridge::Client<F>` contained both:
* the C ABI entry-point `run`, that the server can call to start the client
* some "payload" `f: F` passed to that entry-point
  * in practice, this was always a (client-side Rust ABI) `fn` pointer to the actual function the proc macro author wrote, i.e. `#[proc_macro] fn foo(input: TokenStream) -> TokenStream`

In other words, the client was passing one of its (Rust) `fn` pointers to the server, which was passing it back to the client, for the client to call (see later below for why that was ever needed).

I was inspired by `@nnethercote's` attempt to remove the `get_handle_counters` field from `Client` (see https://github.com/rust-lang/rust/pull/97004#issuecomment-1139273301), which combined with removing the `f` ("payload") field, could theoretically allow for a `#[repr(transparent)]` `Client` that mostly just newtypes the C ABI entry-point `fn` pointer <sub>(and in the context of e.g. wasm isolation, that's *all* you want, since you can reason about it from outside the wasm VM, as just a 32-bit "function table index", that you can pass to the wasm VM to call that function)</sub>.

<hr/>

So this PR removes that "payload". But it's not a simple refactor: the reason the field existed in the first place is because monomorphizing over a function type doesn't let you call the function without having a value of that type, because function types don't implement anything like `Default`, i.e.:
```rust
extern "C" fn ffi_wrapper<A, R, F: Fn(A) -> R>(arg: A) -> R {
    let f: F = ???; // no way to get a value of `F`
    f(arg)
}
```
That could be solved with something like this, if it was allowed:
```rust
extern "C" fn ffi_wrapper<
    A, R,
    F: Fn(A) -> R,
    const f: F // not allowed because the type is a generic param
>(arg: A) -> R {
    f(arg)
}
```

Instead, this PR contains a workaround in `proc_macro::bridge::selfless_reify` (see its module-level comment for more details) that can provide something similar to the `ffi_wrapper` example above, but limited to `F` being `Copy` and ZST (and requiring an `F` value to prove the caller actually can create values of `F` and it's not uninhabited or some other unsound situation).

<hr/>

Hopefully this time we don't have a performance regression, and this has a chance to land.

cc `@mystor` `@bjorn3`
2022-05-28 16:49:52 +00:00
..
rustc update jemalloc-sys to jemalloc v5.3 2022-05-25 08:25:15 +02:00
rustc_apfloat
rustc_arena
rustc_ast Rollup merge of #97254 - jhpratt:remove-crate-vis, r=cjgillot 2022-05-23 07:43:50 +02:00
rustc_ast_lowering rustc_parse: Move AST -> TokenStream conversion logic to rustc_ast 2022-05-22 12:01:07 +03:00
rustc_ast_passes clippy::complexity fixes 2022-05-26 13:14:24 +02:00
rustc_ast_pretty Rollup merge of #97254 - jhpratt:remove-crate-vis, r=cjgillot 2022-05-23 07:43:50 +02:00
rustc_attr RFC3239: Implement compact cfg(target(..)) 2022-05-24 13:51:36 +02:00
rustc_borrowck Auto merge of #97284 - b-naber:constraint-dyn-impl-suggestion, r=estebank 2022-05-28 04:04:29 +00:00
rustc_builtin_macros Auto merge of #97461 - eddyb:proc-macro-less-payload, r=bjorn3 2022-05-28 16:49:52 +00:00
rustc_codegen_cranelift Add flag for stricter checks on uninit/zeroed 2022-05-24 14:26:52 +01:00
rustc_codegen_gcc rustc_codegen_ssa: derive copy and clone for various enums 2022-05-25 10:34:35 +02:00
rustc_codegen_llvm rustc_codegen_ssa: cleanup AtomicOrdering 2022-05-25 10:34:35 +02:00
rustc_codegen_ssa clippy::complexity fixes 2022-05-26 13:14:24 +02:00
rustc_const_eval Auto merge of #96046 - oli-obk:const_typeck, r=cjgillot 2022-05-27 11:31:37 +00:00
rustc_data_structures libcore: Add iter::from_generator which is like iter::from_fn, but for coroutines instead of functions 2022-05-27 01:51:31 +03:00
rustc_driver
rustc_error_codes rustc: Stricter checking for #[link] attributes 2022-05-15 02:45:47 +03:00
rustc_error_messages macros: introduce fluent_messages macro 2022-05-24 16:48:17 +01:00
rustc_errors macros: introduce fluent_messages macro 2022-05-24 16:48:17 +01:00
rustc_expand proc_macro: don't pass a client-side function pointer through the server. 2022-05-27 19:29:21 +00:00
rustc_feature Rollup merge of #96913 - Urgau:rfc3239-part2, r=petrochenkov 2022-05-25 10:48:28 +02:00
rustc_fs_util
rustc_graphviz update graphviz links 2022-05-12 18:31:42 +09:00
rustc_hir Lifetime variance fixes for rustdoc 2022-05-22 14:22:40 -07:00
rustc_hir_pretty use hir::Let in hir::Guard 2022-05-09 20:35:58 +08:00
rustc_incremental rename visit item-like methods 2022-05-13 11:46:06 -04:00
rustc_index Auto merge of #95418 - cjgillot:more-disk, r=davidtwco 2022-05-20 20:49:55 +00:00
rustc_infer suggest constraining dyn trait in impl in NLL 2022-05-25 18:13:17 +02:00
rustc_interface Remove the check_mod_intrinsics query 2022-05-24 15:46:23 +00:00
rustc_lexer
rustc_lint Rollup merge of #97266 - est31:unknown_lints_cfg_attr, r=lcnr 2022-05-25 07:08:42 +09:00
rustc_lint_defs Fix typo 2022-05-23 14:07:40 +02:00
rustc_llvm Add LLVM based mingw-w64 targets 2022-05-13 20:14:15 +02:00
rustc_log clippy::complexity fixes 2022-05-26 13:14:24 +02:00
rustc_macros macros: introduce fluent_messages macro 2022-05-24 16:48:17 +01:00
rustc_metadata Auto merge of #97004 - nnethercote:proc-macro-tweaks, r=eddyb 2022-05-27 06:09:45 +00:00
rustc_middle Auto merge of #97383 - dingxiangfei2009:restore-region-scope-tree-query, r=dingxiangfei2009 2022-05-28 14:30:25 +00:00
rustc_mir_build Auto merge of #97383 - dingxiangfei2009:restore-region-scope-tree-query, r=dingxiangfei2009 2022-05-28 14:30:25 +00:00
rustc_mir_dataflow Add dead store elimination pass 2022-05-24 22:50:21 -04:00
rustc_mir_transform Add dead store elimination pass 2022-05-24 22:50:21 -04:00
rustc_monomorphize Auto merge of #97168 - SparrowLii:accesses, r=cjgillot 2022-05-26 11:15:15 +00:00
rustc_parse Minor improvement on else-no-if diagnostic 2022-05-24 15:22:13 -07:00
rustc_parse_format
rustc_passes Remove the check_mod_intrinsics query 2022-05-24 15:46:23 +00:00
rustc_plugin_impl
rustc_privacy Rollup merge of #97096 - tmiasko:reachable-constructor, r=petrochenkov 2022-05-18 07:40:58 +09:00
rustc_query_impl Auto merge of #97239 - jhpratt:remove-crate-vis, r=joshtriplett 2022-05-21 06:38:49 +00:00
rustc_query_system Auto merge of #96094 - Elliot-Roberts:fix_doctests, r=compiler-errors 2022-05-07 06:30:29 +00:00
rustc_resolve Rollup merge of #97240 - TaKO8Ki:improve-errors-about-typos-on-variables, r=compiler-errors 2022-05-24 12:18:30 +09:00
rustc_save_analysis [save-analysis] Reference the variant not enum at struct-literal construction. 2022-05-12 16:34:02 -07:00
rustc_serialize Cache more queries on disk. 2022-05-13 08:06:48 +02:00
rustc_session Add flag for stricter checks on uninit/zeroed 2022-05-24 14:26:52 +01:00
rustc_span Auto merge of #97386 - nnethercote:optimize-pos-adjustments, r=bjorn3 2022-05-26 22:01:19 +00:00
rustc_symbol_mangling Auto merge of #96883 - jackh726:early-binder-2, r=oli-obk 2022-05-14 23:53:11 +00:00
rustc_target Simplify implementation of -Z gcc-ld 2022-05-25 23:55:22 +03:00
rustc_trait_selection Auto merge of #96046 - oli-obk:const_typeck, r=cjgillot 2022-05-27 11:31:37 +00:00
rustc_traits Remove crate visibility usage in compiler 2022-05-20 20:04:54 -04:00
rustc_ty_utils Auto merge of #97012 - oli-obk:🦀_intrinsics, r=davidtwco 2022-05-17 09:39:26 +00:00
rustc_type_ir
rustc_typeck Auto merge of #97383 - dingxiangfei2009:restore-region-scope-tree-query, r=dingxiangfei2009 2022-05-28 14:30:25 +00:00