Skip to content

Add support for making functions const#1536

Merged
bors merged 6 commits intorust-lang:masterfrom
Aaron1011:feature/const-fn
Nov 18, 2019
Merged

Add support for making functions const#1536
bors merged 6 commits intorust-lang:masterfrom
Aaron1011:feature/const-fn

Conversation

@Aaron1011
Copy link
Contributor

@Aaron1011 Aaron1011 commented Sep 30, 2019

PR rust-lang/rust#64906 adds the ability to write const extern fn and const unsafe extern fn, which will allow manys functions in libc to become const.

This is particuarly useful for functions which correspond to C macros (e.g. CMSG_SPACE). In C, these macros are constant expressions, allowing them to be used when declaring arrays. However, since the corresponding libc functions are not const, writing equivalent Rust code is impossible. Users must either perform an unecessary heap allocation, or pull in bindgen to evaluate the macro for specific values (e.g. CMSG_SPACE(1)).

However, the syntax const extern fn is not currently parsed by rust. To allow libc to use this without breaking backwards compatibility (i.e. bumping the minimum Rust version), I've taken the following approach:

  1. A new off-by-default feature extern-const-fn is added to libc.
  2. The internal f! macro has two versions, selected at compile-time by a cfg_if. When extern-const-fn is enabled, the declared f! macro passes through the const keyword from the macro user to the final definition (pub const unsafe extern fn foo. When extern-const-fn is disabled, the const keyword passed by the macro user is discarded, resulting in a plain pub extern const fn being declared.

Unfortunately, I couldn't manage to get macro_rules to accept a normal const token in the proper place (after pub). I had to resort to placing it in curly brackets:

pub {const} fn foo(val: u8) -> i8 {
}

The f! macro then translates this to a function definition with const in the proper position.

I'd appreciate it if someone who's more familiar with macro_rules! could see if I missed a way to get the desired syntax.

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants