Don't recommend const fns on a stable build without a note about nightlies
Fixes #28490
This commit is contained in:
parent
6e5a325474
commit
dcf49b5f68
2 changed files with 26 additions and 6 deletions
|
|
@ -298,10 +298,18 @@ const FOO: i32 = { 0 }; // but brackets are useless here
|
|||
```
|
||||
"##,
|
||||
|
||||
// FIXME(#24111) Change the language here when const fn stabilizes
|
||||
E0015: r##"
|
||||
The only functions that can be called in static or constant expressions are
|
||||
`const` functions. Rust currently does not support more general compile-time
|
||||
function execution.
|
||||
`const` functions, and struct/enum constructors. `const` functions are only
|
||||
available on a nightly compiler. Rust currently does not support more general
|
||||
compile-time function execution.
|
||||
|
||||
```
|
||||
const FOO: Option<u8> = Some(1); // enum constructor
|
||||
struct Bar {x: u8}
|
||||
const BAR: Bar = Bar {x: 1}; // struct constructor
|
||||
```
|
||||
|
||||
See [RFC 911] for more details on the design of `const fn`s.
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ use util::nodemap::NodeMap;
|
|||
use rustc_front::hir;
|
||||
use syntax::ast;
|
||||
use syntax::codemap::Span;
|
||||
use syntax::feature_gate::UnstableFeatures;
|
||||
use rustc_front::visit::{self, FnKind, Visitor};
|
||||
|
||||
use std::collections::hash_map::Entry;
|
||||
|
|
@ -709,10 +710,21 @@ fn check_expr<'a, 'tcx>(v: &mut CheckCrateVisitor<'a, 'tcx>,
|
|||
if !is_const {
|
||||
v.add_qualif(ConstQualif::NOT_CONST);
|
||||
if v.mode != Mode::Var {
|
||||
span_err!(v.tcx.sess, e.span, E0015,
|
||||
"function calls in {}s are limited to \
|
||||
constant functions, \
|
||||
struct and enum constructors", v.msg());
|
||||
// FIXME(#24111) Remove this check when const fn stabilizes
|
||||
if let UnstableFeatures::Disallow = v.tcx.sess.opts.unstable_features {
|
||||
span_err!(v.tcx.sess, e.span, E0015,
|
||||
"function calls in {}s are limited to \
|
||||
struct and enum constructors", v.msg());
|
||||
v.tcx.sess.span_note(e.span,
|
||||
"a limited form of compile-time function \
|
||||
evaluation is available on a nightly \
|
||||
compiler via `const fn`");
|
||||
} else {
|
||||
span_err!(v.tcx.sess, e.span, E0015,
|
||||
"function calls in {}s are limited to \
|
||||
constant functions, \
|
||||
struct and enum constructors", v.msg());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue