about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDylan DPC <dylan.dpc@gmail.com>2020-05-26 22:11:31 +0200
committerGitHub <noreply@github.com>2020-05-26 22:11:31 +0200
commit401b3aefe94723df7c55965f128f83a9f7b233ab (patch)
treee2a37740b7490822a955b61be1feebe9124030d7
parente38fdda243c890bc8f4ce93eb82fd1bf750ebbe7 (diff)
parent09619bc4592418aa66a77bf90c6c2efbd648d103 (diff)
downloadrust-401b3aefe94723df7c55965f128f83a9f7b233ab.tar.gz
rust-401b3aefe94723df7c55965f128f83a9f7b233ab.zip
Rollup merge of #72401 - ecstatic-morse:issue-72394, r=eddyb
Use correct function for detecting `const fn` in unsafety checking

Resolves #72394.
-rw-r--r--src/librustc_mir/transform/check_unsafety.rs4
-rw-r--r--src/test/ui/unsafe/unsafe-unstable-const-fn.rs13
-rw-r--r--src/test/ui/unsafe/unsafe-unstable-const-fn.stderr11
3 files changed, 26 insertions, 2 deletions
diff --git a/src/librustc_mir/transform/check_unsafety.rs b/src/librustc_mir/transform/check_unsafety.rs
index 9bcb45f6493..a335fa2de41 100644
--- a/src/librustc_mir/transform/check_unsafety.rs
+++ b/src/librustc_mir/transform/check_unsafety.rs
@@ -14,7 +14,7 @@ use rustc_span::symbol::{sym, Symbol};
 
 use std::ops::Bound;
 
-use crate::const_eval::{is_const_fn, is_min_const_fn};
+use crate::const_eval::is_min_const_fn;
 use crate::util;
 
 pub struct UnsafetyChecker<'a, 'tcx> {
@@ -527,7 +527,7 @@ fn unsafety_check_result(tcx: TyCtxt<'_>, def_id: LocalDefId) -> UnsafetyCheckRe
     let (const_context, min_const_fn) = match tcx.hir().body_owner_kind(id) {
         hir::BodyOwnerKind::Closure => (false, false),
         hir::BodyOwnerKind::Fn => {
-            (is_const_fn(tcx, def_id.to_def_id()), is_min_const_fn(tcx, def_id.to_def_id()))
+            (tcx.is_const_fn_raw(def_id.to_def_id()), is_min_const_fn(tcx, def_id.to_def_id()))
         }
         hir::BodyOwnerKind::Const | hir::BodyOwnerKind::Static(_) => (true, false),
     };
diff --git a/src/test/ui/unsafe/unsafe-unstable-const-fn.rs b/src/test/ui/unsafe/unsafe-unstable-const-fn.rs
new file mode 100644
index 00000000000..d9d85ee9132
--- /dev/null
+++ b/src/test/ui/unsafe/unsafe-unstable-const-fn.rs
@@ -0,0 +1,13 @@
+#![stable(feature = "foo", since = "1.33.0")]
+#![feature(staged_api)]
+#![feature(const_compare_raw_pointers)]
+#![feature(const_fn)]
+
+#[stable(feature = "foo", since = "1.33.0")]
+#[rustc_const_unstable(feature = "const_foo", issue = "none")]
+const fn unstable(a: *const i32, b: *const i32) -> bool {
+    a == b
+    //~^ pointer operation is unsafe
+}
+
+fn main() {}
diff --git a/src/test/ui/unsafe/unsafe-unstable-const-fn.stderr b/src/test/ui/unsafe/unsafe-unstable-const-fn.stderr
new file mode 100644
index 00000000000..d8f3737c8f5
--- /dev/null
+++ b/src/test/ui/unsafe/unsafe-unstable-const-fn.stderr
@@ -0,0 +1,11 @@
+error[E0133]: pointer operation is unsafe and requires unsafe function or block
+  --> $DIR/unsafe-unstable-const-fn.rs:9:5
+   |
+LL |     a == b
+   |     ^^^^^^ pointer operation
+   |
+   = note: operations on pointers in constants
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0133`.