From 476b6759762514c353b8f3d6375d86d747084340 Mon Sep 17 00:00:00 2001
From: Aaron Hill <aa1ronham@gmail.com>
Date: Tue, 29 Oct 2019 08:25:59 -0400
Subject: [PATCH] Panic if const-extern-fn is not used on nightly

---
 build.rs | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/build.rs b/build.rs
index fb1aae9b..dddc029e 100644
--- a/build.rs
+++ b/build.rs
@@ -3,8 +3,8 @@ use std::process::Command;
 use std::str;
 
 fn main() {
-    let rustc_minor_ver =
-        rustc_minor_version().expect("Failed to get rustc version");
+    let (rustc_minor_ver, is_nightly) =
+        rustc_minor_nightly().expect("Failed to get rustc version");
     let rustc_dep_of_std = env::var("CARGO_FEATURE_RUSTC_DEP_OF_STD").is_ok();
     let align_cargo_feature = env::var("CARGO_FEATURE_ALIGN").is_ok();
     let const_extern_fn_cargo_feature = env::var("CARGO_FEATURE_CONST_EXTERN_FN").is_ok();
@@ -75,11 +75,14 @@ fn main() {
     }
 
     if const_extern_fn_cargo_feature {
+        if !is_nightly || rustc_minor_ver < 40 {
+            panic!("const-extern-fn requires a nightly compiler >= 1.40")
+        }
         println!("cargo:rustc-cfg=libc_const_extern_fn");
     }
 }
 
-fn rustc_minor_version() -> Option<u32> {
+fn rustc_minor_nightly() -> Option<(u32, bool)> {
     macro_rules! otry {
         ($e:expr) => {
             match $e {
@@ -98,7 +101,12 @@ fn rustc_minor_version() -> Option<u32> {
         return None;
     }
 
-    otry!(pieces.next()).parse().ok()
+    let minor = pieces.next();
+    let nightly_raw = otry!(otry!(pieces.next()).split('-').nth(1));
+    let nightly = nightly_raw.starts_with("dev") || nightly_raw.starts_with("nightly");
+    let minor = otry!(otry!(minor).parse().ok());
+
+    Some((minor, nightly))
 }
 
 fn which_freebsd() -> Option<i32> {
-- 
GitLab