Auto merge of #77224 - RalfJung:rollup-hdvb96c, r=RalfJung
Rollup of 12 pull requests Successful merges: - #75454 (Explicitly document the size guarantees that Option makes.) - #76631 (Add `x.py setup`) - #77076 (Add missing code examples on slice iter types) - #77093 (merge `need_type_info_err(_const)`) - #77122 (Add `#![feature(const_fn_floating_point_arithmetic)]`) - #77127 (Update mdBook) - #77161 (Remove TrustedLen requirement from BuilderMethods::switch) - #77166 (update Miri) - #77181 (Add doc alias for pointer primitive) - #77204 (Remove stray word from `ClosureKind::extends` docs) - #77207 (Rename `whence` to `span`) - #77211 (Remove unused #[allow(...)] statements from compiler/) Failed merges: - #77170 (Remove `#[rustc_allow_const_fn_ptr]` and add `#![feature(const_fn_fn_ptr_basics)]`) r? `@ghost`
This commit is contained in:
commit
e37c99fa1c
74 changed files with 808 additions and 342 deletions
|
|
@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||
|
||||
## [Non-breaking changes since the last major version]
|
||||
|
||||
- Add `x.py setup` [#76631](https://github.com/rust-lang/rust/pull/76631)
|
||||
- Add a changelog for x.py [#76626](https://github.com/rust-lang/rust/pull/76626)
|
||||
- Optionally, download LLVM from CI on Linux and NixOS
|
||||
+ [#76439](https://github.com/rust-lang/rust/pull/76349)
|
||||
|
|
|
|||
|
|
@ -7,21 +7,34 @@
|
|||
|
||||
use std::env;
|
||||
|
||||
use bootstrap::{Build, Config};
|
||||
use bootstrap::{Build, Config, Subcommand};
|
||||
|
||||
fn main() {
|
||||
let args = env::args().skip(1).collect::<Vec<_>>();
|
||||
let config = Config::parse(&args);
|
||||
|
||||
let changelog_suggestion = check_version(&config);
|
||||
if let Some(suggestion) = &changelog_suggestion {
|
||||
|
||||
// NOTE: Since `./configure` generates a `config.toml`, distro maintainers will see the
|
||||
// changelog warning, not the `x.py setup` message.
|
||||
let suggest_setup = !config.config.exists() && !matches!(config.cmd, Subcommand::Setup { .. });
|
||||
if suggest_setup {
|
||||
println!("warning: you have not made a `config.toml`");
|
||||
println!("help: consider running `x.py setup` or copying `config.toml.example`");
|
||||
} else if let Some(suggestion) = &changelog_suggestion {
|
||||
println!("{}", suggestion);
|
||||
}
|
||||
|
||||
Build::new(config).build();
|
||||
|
||||
if let Some(suggestion) = changelog_suggestion {
|
||||
if suggest_setup {
|
||||
println!("warning: you have not made a `config.toml`");
|
||||
println!("help: consider running `x.py setup` or copying `config.toml.example`");
|
||||
} else if let Some(suggestion) = &changelog_suggestion {
|
||||
println!("{}", suggestion);
|
||||
}
|
||||
|
||||
if suggest_setup || changelog_suggestion.is_some() {
|
||||
println!("note: this message was printed twice to make it more likely to be seen");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -549,7 +549,9 @@ impl<'a> Builder<'a> {
|
|||
Subcommand::Dist { ref paths } => (Kind::Dist, &paths[..]),
|
||||
Subcommand::Install { ref paths } => (Kind::Install, &paths[..]),
|
||||
Subcommand::Run { ref paths } => (Kind::Run, &paths[..]),
|
||||
Subcommand::Format { .. } | Subcommand::Clean { .. } => panic!(),
|
||||
Subcommand::Format { .. } | Subcommand::Clean { .. } | Subcommand::Setup { .. } => {
|
||||
panic!()
|
||||
}
|
||||
};
|
||||
|
||||
Self::new_internal(build, kind, paths.to_owned())
|
||||
|
|
|
|||
|
|
@ -73,6 +73,8 @@ pub struct Config {
|
|||
pub keep_stage: Vec<u32>,
|
||||
pub keep_stage_std: Vec<u32>,
|
||||
pub src: PathBuf,
|
||||
// defaults to `config.toml`
|
||||
pub config: PathBuf,
|
||||
pub jobs: Option<u32>,
|
||||
pub cmd: Subcommand,
|
||||
pub incremental: bool,
|
||||
|
|
@ -513,6 +515,7 @@ impl Config {
|
|||
config.rust_codegen_backends = vec![INTERNER.intern_str("llvm")];
|
||||
config.deny_warnings = true;
|
||||
config.missing_tools = false;
|
||||
config.config = PathBuf::from("config.toml");
|
||||
|
||||
// set by bootstrap.py
|
||||
config.build = TargetSelection::from_user(&env!("BUILD_TRIPLE"));
|
||||
|
|
@ -558,7 +561,7 @@ impl Config {
|
|||
let get_toml = |file: PathBuf| {
|
||||
use std::process;
|
||||
|
||||
let contents = t!(fs::read_to_string(&file), "configuration file did not exist");
|
||||
let contents = t!(fs::read_to_string(&file), "`include` config not found");
|
||||
match toml::from_str(&contents) {
|
||||
Ok(table) => table,
|
||||
Err(err) => {
|
||||
|
|
@ -644,6 +647,7 @@ impl Config {
|
|||
| Subcommand::Clippy { .. }
|
||||
| Subcommand::Fix { .. }
|
||||
| Subcommand::Run { .. }
|
||||
| Subcommand::Setup { .. }
|
||||
| Subcommand::Format { .. } => flags.stage.unwrap_or(0),
|
||||
};
|
||||
|
||||
|
|
@ -668,6 +672,7 @@ impl Config {
|
|||
| Subcommand::Clippy { .. }
|
||||
| Subcommand::Fix { .. }
|
||||
| Subcommand::Run { .. }
|
||||
| Subcommand::Setup { .. }
|
||||
| Subcommand::Format { .. } => {}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use std::env;
|
|||
use std::path::PathBuf;
|
||||
use std::process;
|
||||
|
||||
use build_helper::t;
|
||||
use getopts::Options;
|
||||
|
||||
use crate::builder::Builder;
|
||||
|
|
@ -89,6 +90,9 @@ pub enum Subcommand {
|
|||
Run {
|
||||
paths: Vec<PathBuf>,
|
||||
},
|
||||
Setup {
|
||||
path: String,
|
||||
},
|
||||
}
|
||||
|
||||
impl Default for Subcommand {
|
||||
|
|
@ -199,6 +203,7 @@ To learn more about a subcommand, run `./x.py <subcommand> -h`",
|
|||
|| (s == "install")
|
||||
|| (s == "run")
|
||||
|| (s == "r")
|
||||
|| (s == "setup")
|
||||
});
|
||||
let subcommand = match subcommand {
|
||||
Some(s) => s,
|
||||
|
|
@ -453,10 +458,21 @@ Arguments:
|
|||
At least a tool needs to be called.",
|
||||
);
|
||||
}
|
||||
"setup" => {
|
||||
subcommand_help.push_str(
|
||||
"\n
|
||||
Arguments:
|
||||
This subcommand accepts a 'profile' to use for builds. For example:
|
||||
|
||||
./x.py setup library
|
||||
|
||||
The profile is optional and you will be prompted interactively if it is not given.",
|
||||
);
|
||||
}
|
||||
_ => {}
|
||||
};
|
||||
// Get any optional paths which occur after the subcommand
|
||||
let paths = matches.free[1..].iter().map(|p| p.into()).collect::<Vec<PathBuf>>();
|
||||
let mut paths = matches.free[1..].iter().map(|p| p.into()).collect::<Vec<PathBuf>>();
|
||||
|
||||
let cfg_file = env::var_os("BOOTSTRAP_CONFIG").map(PathBuf::from);
|
||||
let verbose = matches.opt_present("verbose");
|
||||
|
|
@ -508,6 +524,20 @@ Arguments:
|
|||
}
|
||||
Subcommand::Run { paths }
|
||||
}
|
||||
"setup" => {
|
||||
let path = if paths.len() > 1 {
|
||||
println!("\nat most one profile can be passed to setup\n");
|
||||
usage(1, &opts, verbose, &subcommand_help)
|
||||
} else if let Some(path) = paths.pop() {
|
||||
t!(path.into_os_string().into_string().map_err(|path| format!(
|
||||
"{} is not a valid UTF8 string",
|
||||
path.to_string_lossy()
|
||||
)))
|
||||
} else {
|
||||
t!(crate::setup::interactive_path())
|
||||
};
|
||||
Subcommand::Setup { path }
|
||||
}
|
||||
_ => {
|
||||
usage(1, &opts, verbose, &subcommand_help);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -141,6 +141,7 @@ mod metadata;
|
|||
mod native;
|
||||
mod run;
|
||||
mod sanity;
|
||||
mod setup;
|
||||
mod test;
|
||||
mod tool;
|
||||
mod toolstate;
|
||||
|
|
@ -165,7 +166,7 @@ mod job {
|
|||
|
||||
use crate::cache::{Interned, INTERNER};
|
||||
pub use crate::config::Config;
|
||||
use crate::flags::Subcommand;
|
||||
pub use crate::flags::Subcommand;
|
||||
|
||||
const LLVM_TOOLS: &[&str] = &[
|
||||
"llvm-nm", // used to inspect binaries; it shows symbol names, their sizes and visibility
|
||||
|
|
@ -470,6 +471,10 @@ impl Build {
|
|||
return clean::clean(self, all);
|
||||
}
|
||||
|
||||
if let Subcommand::Setup { path: include_name } = &self.config.cmd {
|
||||
return setup::setup(&self.config.src, include_name);
|
||||
}
|
||||
|
||||
{
|
||||
let builder = builder::Builder::new(&self);
|
||||
if let Some(path) = builder.paths.get(0) {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ impl Step for ExpandYamlAnchors {
|
|||
|
||||
/// Runs the `expand-yaml_anchors` tool.
|
||||
///
|
||||
/// This tool in `src/tools` read the CI configuration files written in YAML and expands the
|
||||
/// This tool in `src/tools` reads the CI configuration files written in YAML and expands the
|
||||
/// anchors in them, since GitHub Actions doesn't support them.
|
||||
fn run(self, builder: &Builder<'_>) {
|
||||
builder.info("Expanding YAML anchors in the GitHub Actions configuration");
|
||||
|
|
|
|||
88
src/bootstrap/setup.rs
Normal file
88
src/bootstrap/setup.rs
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
use crate::t;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::{
|
||||
env, fs,
|
||||
io::{self, Write},
|
||||
};
|
||||
|
||||
pub fn setup(src_path: &Path, include_name: &str) {
|
||||
let cfg_file = env::var_os("BOOTSTRAP_CONFIG").map(PathBuf::from);
|
||||
|
||||
if cfg_file.as_ref().map_or(false, |f| f.exists()) {
|
||||
let file = cfg_file.unwrap();
|
||||
println!(
|
||||
"error: you asked `x.py` to setup a new config file, but one already exists at `{}`",
|
||||
file.display()
|
||||
);
|
||||
println!(
|
||||
"help: try adding `profile = \"{}\"` at the top of {}",
|
||||
include_name,
|
||||
file.display()
|
||||
);
|
||||
println!(
|
||||
"note: this will use the configuration in {}/src/bootstrap/defaults/config.toml.{}",
|
||||
src_path.display(),
|
||||
include_name
|
||||
);
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
let path = cfg_file.unwrap_or_else(|| src_path.join("config.toml"));
|
||||
let settings = format!(
|
||||
"# Includes one of the default files in src/bootstrap/defaults\n\
|
||||
profile = \"{}\"\n",
|
||||
include_name
|
||||
);
|
||||
t!(fs::write(path, settings));
|
||||
|
||||
let include_path =
|
||||
format!("{}/src/bootstrap/defaults/config.toml.{}", src_path.display(), include_name);
|
||||
println!("`x.py` will now use the configuration at {}", include_path);
|
||||
|
||||
let suggestions = match include_name {
|
||||
"codegen" | "compiler" => &["check", "build", "test"][..],
|
||||
"library" => &["check", "build", "test library/std", "doc"],
|
||||
"user" => &["dist", "build"],
|
||||
_ => return,
|
||||
};
|
||||
|
||||
println!("To get started, try one of the following commands:");
|
||||
for cmd in suggestions {
|
||||
println!("- `x.py {}`", cmd);
|
||||
}
|
||||
|
||||
if include_name != "user" {
|
||||
println!(
|
||||
"For more suggestions, see https://rustc-dev-guide.rust-lang.org/building/suggested.html"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Used to get the path for `Subcommand::Setup`
|
||||
pub fn interactive_path() -> io::Result<String> {
|
||||
let mut input = String::new();
|
||||
println!(
|
||||
"Welcome to the Rust project! What do you want to do with x.py?
|
||||
a) Contribute to the standard library
|
||||
b) Contribute to the compiler
|
||||
c) Contribute to the compiler, and also modify LLVM or codegen
|
||||
d) Install Rust from source"
|
||||
);
|
||||
let template = loop {
|
||||
print!("Please choose one (a/b/c/d): ");
|
||||
io::stdout().flush()?;
|
||||
io::stdin().read_line(&mut input)?;
|
||||
break match input.trim().to_lowercase().as_str() {
|
||||
"a" | "lib" | "library" => "library",
|
||||
"b" | "compiler" => "compiler",
|
||||
"c" | "llvm" => "llvm",
|
||||
"d" | "user" | "maintainer" => "maintainer",
|
||||
_ => {
|
||||
println!("error: unrecognized option '{}'", input.trim());
|
||||
println!("note: press Ctrl+C to exit");
|
||||
continue;
|
||||
}
|
||||
};
|
||||
};
|
||||
Ok(template.to_owned())
|
||||
}
|
||||
|
|
@ -256,7 +256,7 @@ impl Clean<Item> for doctree::Module<'_> {
|
|||
|
||||
// determine if we should display the inner contents or
|
||||
// the outer `mod` item for the source code.
|
||||
let whence = {
|
||||
let span = {
|
||||
let sm = cx.sess().source_map();
|
||||
let outer = sm.lookup_char_pos(self.where_outer.lo());
|
||||
let inner = sm.lookup_char_pos(self.where_inner.lo());
|
||||
|
|
@ -272,7 +272,7 @@ impl Clean<Item> for doctree::Module<'_> {
|
|||
Item {
|
||||
name: Some(name),
|
||||
attrs,
|
||||
source: whence.clean(cx),
|
||||
source: span.clean(cx),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
deprecation: cx.deprecation(self.id).clean(cx),
|
||||
|
|
@ -912,7 +912,7 @@ impl Clean<Item> for doctree::Function<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
deprecation: cx.deprecation(self.id).clean(cx),
|
||||
|
|
@ -1020,7 +1020,7 @@ impl Clean<Item> for doctree::Trait<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs,
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: cx.tcx.hir().local_def_id(self.id).to_def_id(),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
|
|
@ -1044,7 +1044,7 @@ impl Clean<Item> for doctree::TraitAlias<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs,
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: cx.tcx.hir().local_def_id(self.id).to_def_id(),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
|
|
@ -1830,7 +1830,7 @@ impl Clean<Item> for doctree::Struct<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: cx.tcx.hir().local_def_id(self.id).to_def_id(),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
|
|
@ -1850,7 +1850,7 @@ impl Clean<Item> for doctree::Union<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: cx.tcx.hir().local_def_id(self.id).to_def_id(),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
|
|
@ -1880,7 +1880,7 @@ impl Clean<Item> for doctree::Enum<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: cx.tcx.hir().local_def_id(self.id).to_def_id(),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
|
|
@ -1899,7 +1899,7 @@ impl Clean<Item> for doctree::Variant<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
visibility: Inherited,
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
deprecation: cx.deprecation(self.id).clean(cx),
|
||||
|
|
@ -2047,7 +2047,7 @@ impl Clean<Item> for doctree::Typedef<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: cx.tcx.hir().local_def_id(self.id).to_def_id(),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
|
|
@ -2062,7 +2062,7 @@ impl Clean<Item> for doctree::OpaqueTy<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: cx.tcx.hir().local_def_id(self.id).to_def_id(),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
|
|
@ -2093,7 +2093,7 @@ impl Clean<Item> for doctree::Static<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: cx.tcx.hir().local_def_id(self.id).to_def_id(),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
|
|
@ -2114,7 +2114,7 @@ impl Clean<Item> for doctree::Constant<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: def_id.to_def_id(),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
|
|
@ -2168,7 +2168,7 @@ impl Clean<Vec<Item>> for doctree::Impl<'_> {
|
|||
let make_item = |trait_: Option<Type>, for_: Type, items: Vec<Item>| Item {
|
||||
name: None,
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: def_id.to_def_id(),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
|
|
@ -2219,7 +2219,7 @@ impl Clean<Vec<Item>> for doctree::ExternCrate<'_> {
|
|||
vec![Item {
|
||||
name: None,
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: DefId { krate: self.cnum, index: CRATE_DEF_INDEX },
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: None,
|
||||
|
|
@ -2284,7 +2284,7 @@ impl Clean<Vec<Item>> for doctree::Import<'_> {
|
|||
vec![Item {
|
||||
name: None,
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: DefId::local(CRATE_DEF_INDEX),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: None,
|
||||
|
|
@ -2326,7 +2326,7 @@ impl Clean<Item> for doctree::ForeignItem<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
def_id: cx.tcx.hir().local_def_id(self.id).to_def_id(),
|
||||
visibility: self.vis.clean(cx),
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
|
|
@ -2342,7 +2342,7 @@ impl Clean<Item> for doctree::Macro<'_> {
|
|||
Item {
|
||||
name: Some(name.clone()),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
visibility: Public,
|
||||
stability: cx.stability(self.hid).clean(cx),
|
||||
deprecation: cx.deprecation(self.hid).clean(cx),
|
||||
|
|
@ -2367,7 +2367,7 @@ impl Clean<Item> for doctree::ProcMacro<'_> {
|
|||
Item {
|
||||
name: Some(self.name.clean(cx)),
|
||||
attrs: self.attrs.clean(cx),
|
||||
source: self.whence.clean(cx),
|
||||
source: self.span.clean(cx),
|
||||
visibility: Public,
|
||||
stability: cx.stability(self.id).clean(cx),
|
||||
deprecation: cx.deprecation(self.id).clean(cx),
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ pub struct Struct<'hir> {
|
|||
pub generics: &'hir hir::Generics<'hir>,
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub fields: &'hir [hir::StructField<'hir>],
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
pub struct Union<'hir> {
|
||||
|
|
@ -100,7 +100,7 @@ pub struct Union<'hir> {
|
|||
pub generics: &'hir hir::Generics<'hir>,
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub fields: &'hir [hir::StructField<'hir>],
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
pub struct Enum<'hir> {
|
||||
|
|
@ -109,7 +109,7 @@ pub struct Enum<'hir> {
|
|||
pub generics: &'hir hir::Generics<'hir>,
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub id: hir::HirId,
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
pub name: Symbol,
|
||||
}
|
||||
|
||||
|
|
@ -118,7 +118,7 @@ pub struct Variant<'hir> {
|
|||
pub id: hir::HirId,
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub def: &'hir hir::VariantData<'hir>,
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
pub struct Function<'hir> {
|
||||
|
|
@ -128,7 +128,7 @@ pub struct Function<'hir> {
|
|||
pub name: Symbol,
|
||||
pub vis: &'hir hir::Visibility<'hir>,
|
||||
pub header: hir::FnHeader,
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
pub generics: &'hir hir::Generics<'hir>,
|
||||
pub body: hir::BodyId,
|
||||
}
|
||||
|
|
@ -139,7 +139,7 @@ pub struct Typedef<'hir> {
|
|||
pub name: Symbol,
|
||||
pub id: hir::HirId,
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
pub vis: &'hir hir::Visibility<'hir>,
|
||||
}
|
||||
|
||||
|
|
@ -148,7 +148,7 @@ pub struct OpaqueTy<'hir> {
|
|||
pub name: Symbol,
|
||||
pub id: hir::HirId,
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
pub vis: &'hir hir::Visibility<'hir>,
|
||||
}
|
||||
|
||||
|
|
@ -161,7 +161,7 @@ pub struct Static<'hir> {
|
|||
pub attrs: &'hir [ast::Attribute],
|
||||
pub vis: &'hir hir::Visibility<'hir>,
|
||||
pub id: hir::HirId,
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
pub struct Constant<'hir> {
|
||||
|
|
@ -171,7 +171,7 @@ pub struct Constant<'hir> {
|
|||
pub attrs: &'hir [ast::Attribute],
|
||||
pub vis: &'hir hir::Visibility<'hir>,
|
||||
pub id: hir::HirId,
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
pub struct Trait<'hir> {
|
||||
|
|
@ -183,7 +183,7 @@ pub struct Trait<'hir> {
|
|||
pub bounds: &'hir [hir::GenericBound<'hir>],
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub id: hir::HirId,
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
pub vis: &'hir hir::Visibility<'hir>,
|
||||
}
|
||||
|
||||
|
|
@ -193,7 +193,7 @@ pub struct TraitAlias<'hir> {
|
|||
pub bounds: &'hir [hir::GenericBound<'hir>],
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub id: hir::HirId,
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
pub vis: &'hir hir::Visibility<'hir>,
|
||||
}
|
||||
|
||||
|
|
@ -208,7 +208,7 @@ pub struct Impl<'hir> {
|
|||
pub for_: &'hir hir::Ty<'hir>,
|
||||
pub items: Vec<&'hir hir::ImplItem<'hir>>,
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
pub vis: &'hir hir::Visibility<'hir>,
|
||||
pub id: hir::HirId,
|
||||
}
|
||||
|
|
@ -219,7 +219,7 @@ pub struct ForeignItem<'hir> {
|
|||
pub name: Symbol,
|
||||
pub kind: &'hir hir::ForeignItemKind<'hir>,
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
// For Macro we store the DefId instead of the NodeId, since we also create
|
||||
|
|
@ -229,7 +229,7 @@ pub struct Macro<'hir> {
|
|||
pub hid: hir::HirId,
|
||||
pub def_id: hir::def_id::DefId,
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
pub matchers: Vec<Span>,
|
||||
pub imported_from: Option<Symbol>,
|
||||
}
|
||||
|
|
@ -240,7 +240,7 @@ pub struct ExternCrate<'hir> {
|
|||
pub path: Option<String>,
|
||||
pub vis: &'hir hir::Visibility<'hir>,
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
pub struct Import<'hir> {
|
||||
|
|
@ -250,7 +250,7 @@ pub struct Import<'hir> {
|
|||
pub attrs: &'hir [ast::Attribute],
|
||||
pub path: &'hir hir::Path<'hir>,
|
||||
pub glob: bool,
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
pub struct ProcMacro<'hir> {
|
||||
|
|
@ -259,7 +259,7 @@ pub struct ProcMacro<'hir> {
|
|||
pub kind: MacroKind,
|
||||
pub helpers: Vec<Symbol>,
|
||||
pub attrs: &'hir [ast::Attribute],
|
||||
pub whence: Span,
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
pub fn struct_type_from_def(vdata: &hir::VariantData<'_>) -> StructType {
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
attrs: &item.attrs,
|
||||
generics,
|
||||
fields: sd.fields(),
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -120,7 +120,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
attrs: &item.attrs,
|
||||
generics,
|
||||
fields: sd.fields(),
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -142,14 +142,14 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
id: v.id,
|
||||
attrs: &v.attrs,
|
||||
def: &v.data,
|
||||
whence: v.span,
|
||||
span: v.span,
|
||||
})
|
||||
.collect(),
|
||||
vis: &it.vis,
|
||||
generics,
|
||||
attrs: &it.attrs,
|
||||
id: it.hir_id,
|
||||
whence: it.span,
|
||||
span: it.span,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -208,7 +208,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
kind,
|
||||
helpers,
|
||||
attrs: &item.attrs,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
});
|
||||
}
|
||||
None => {
|
||||
|
|
@ -218,7 +218,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
attrs: &item.attrs,
|
||||
decl,
|
||||
name,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
generics,
|
||||
header,
|
||||
body,
|
||||
|
|
@ -402,7 +402,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
path: orig_name.map(|x| x.to_string()),
|
||||
vis: &item.vis,
|
||||
attrs: &item.attrs,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
})
|
||||
}
|
||||
hir::ItemKind::Use(_, hir::UseKind::ListStem) => {}
|
||||
|
|
@ -444,7 +444,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
attrs: &item.attrs,
|
||||
path,
|
||||
glob: is_glob,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
});
|
||||
}
|
||||
hir::ItemKind::Mod(ref m) => {
|
||||
|
|
@ -476,7 +476,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
name: ident.name,
|
||||
id: item.hir_id,
|
||||
attrs: &item.attrs,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
vis: &item.vis,
|
||||
};
|
||||
om.typedefs.push(t);
|
||||
|
|
@ -487,7 +487,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
name: ident.name,
|
||||
id: item.hir_id,
|
||||
attrs: &item.attrs,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
vis: &item.vis,
|
||||
};
|
||||
om.opaque_tys.push(t);
|
||||
|
|
@ -500,7 +500,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
id: item.hir_id,
|
||||
name: ident.name,
|
||||
attrs: &item.attrs,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
vis: &item.vis,
|
||||
};
|
||||
om.statics.push(s);
|
||||
|
|
@ -515,7 +515,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
id: item.hir_id,
|
||||
name: ident.name,
|
||||
attrs: &item.attrs,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
vis: &item.vis,
|
||||
};
|
||||
om.constants.push(s);
|
||||
|
|
@ -532,7 +532,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
bounds,
|
||||
id: item.hir_id,
|
||||
attrs: &item.attrs,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
vis: &item.vis,
|
||||
};
|
||||
om.traits.push(t);
|
||||
|
|
@ -544,7 +544,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
bounds,
|
||||
id: item.hir_id,
|
||||
attrs: &item.attrs,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
vis: &item.vis,
|
||||
};
|
||||
om.trait_aliases.push(t);
|
||||
|
|
@ -577,7 +577,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
items,
|
||||
attrs: &item.attrs,
|
||||
id: item.hir_id,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
vis: &item.vis,
|
||||
};
|
||||
om.impls.push(i);
|
||||
|
|
@ -603,7 +603,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
kind: &item.kind,
|
||||
vis: &item.vis,
|
||||
attrs: &item.attrs,
|
||||
whence: item.span,
|
||||
span: item.span,
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -623,7 +623,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
|||
def_id: self.cx.tcx.hir().local_def_id(def.hir_id).to_def_id(),
|
||||
attrs: &def.attrs,
|
||||
name: renamed.unwrap_or(def.ident.name),
|
||||
whence: def.span,
|
||||
span: def.span,
|
||||
matchers,
|
||||
imported_from: None,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,9 +2,7 @@ error[E0282]: type annotations needed
|
|||
--> $DIR/cannot-infer-const-args.rs:12:5
|
||||
|
|
||||
LL | foo();
|
||||
| ^^^
|
||||
|
|
||||
= note: cannot infer the value of the const parameter `X`
|
||||
| ^^^ cannot infer the value of const parameter `X` declared on the function `foo`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -2,9 +2,7 @@ error[E0282]: type annotations needed
|
|||
--> $DIR/cannot-infer-const-args.rs:12:5
|
||||
|
|
||||
LL | foo();
|
||||
| ^^^
|
||||
|
|
||||
= note: cannot infer the value of the const parameter `X`
|
||||
| ^^^ cannot infer the value of const parameter `X` declared on the function `foo`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
16
src/test/ui/const-generics/infer/issue-77092.rs
Normal file
16
src/test/ui/const-generics/infer/issue-77092.rs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
#![feature(min_const_generics)]
|
||||
|
||||
use std::convert::TryInto;
|
||||
|
||||
fn take_array_from_mut<T, const N: usize>(data: &mut [T], start: usize) -> &mut [T; N] {
|
||||
(&mut data[start .. start + N]).try_into().unwrap()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut arr = [0, 1, 2, 3, 4, 5, 6, 7, 8];
|
||||
|
||||
for i in 1 .. 4 {
|
||||
println!("{:?}", take_array_from_mut(&mut arr, i));
|
||||
//~^ ERROR type annotations needed
|
||||
}
|
||||
}
|
||||
9
src/test/ui/const-generics/infer/issue-77092.stderr
Normal file
9
src/test/ui/const-generics/infer/issue-77092.stderr
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
error[E0282]: type annotations needed
|
||||
--> $DIR/issue-77092.rs:13:26
|
||||
|
|
||||
LL | println!("{:?}", take_array_from_mut(&mut arr, i));
|
||||
| ^^^^^^^^^^^^^^^^^^^ cannot infer the value of the constant `{_: usize}`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
||||
|
|
@ -2,9 +2,7 @@ error[E0282]: type annotations needed
|
|||
--> $DIR/method-chain.rs:21:33
|
||||
|
|
||||
LL | Foo.bar().bar().bar().bar().baz();
|
||||
| ^^^
|
||||
|
|
||||
= note: cannot infer the value of the const parameter `N`
|
||||
| ^^^ cannot infer the value of const parameter `N` declared on the associated function `baz`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -2,9 +2,7 @@ error[E0282]: type annotations needed
|
|||
--> $DIR/method-chain.rs:21:33
|
||||
|
|
||||
LL | Foo.bar().bar().bar().bar().baz();
|
||||
| ^^^
|
||||
|
|
||||
= note: cannot infer the value of the const parameter `N`
|
||||
| ^^^ cannot infer the value of const parameter `N` declared on the associated function `baz`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -2,9 +2,7 @@ error[E0282]: type annotations needed
|
|||
--> $DIR/uninferred-consts.rs:14:9
|
||||
|
|
||||
LL | Foo.foo();
|
||||
| ^^^
|
||||
|
|
||||
= note: cannot infer the value of the const parameter `N`
|
||||
| ^^^ cannot infer the value of const parameter `N` declared on the associated function `foo`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -2,9 +2,7 @@ error[E0282]: type annotations needed
|
|||
--> $DIR/uninferred-consts.rs:14:9
|
||||
|
|
||||
LL | Foo.foo();
|
||||
| ^^^
|
||||
|
|
||||
= note: cannot infer the value of the const parameter `N`
|
||||
| ^^^ cannot infer the value of const parameter `N` declared on the associated function `foo`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ const extern fn unsize(x: &[u8; 3]) -> &[u8] { x }
|
|||
const unsafe extern "C" fn closure() -> fn() { || {} }
|
||||
//~^ ERROR function pointers in const fn are unstable
|
||||
const unsafe extern fn use_float() { 1.0 + 1.0; }
|
||||
//~^ ERROR only int, `bool` and `char` operations are stable in const fn
|
||||
//~^ ERROR floating point arithmetic
|
||||
const extern "C" fn ptr_cast(val: *const u8) { val as usize; }
|
||||
//~^ ERROR casting pointers to integers
|
||||
|
||||
|
|
|
|||
|
|
@ -7,14 +7,14 @@ LL | const unsafe extern "C" fn closure() -> fn() { || {} }
|
|||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
||||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const-extern-fn-min-const-fn.rs:6:38
|
||||
|
|
||||
LL | const unsafe extern fn use_float() { 1.0 + 1.0; }
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: casting pointers to integers in constant functions is unstable
|
||||
--> $DIR/const-extern-fn-min-const-fn.rs:8:48
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
error: fatal error triggered by #[rustc_error]
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:20:1
|
||||
|
|
||||
LL | fn main() {}
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
20
src/test/ui/consts/const_fn_floating_point_arithmetic.rs
Normal file
20
src/test/ui/consts/const_fn_floating_point_arithmetic.rs
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
// gate-test-const_fn_floating_point_arithmetic
|
||||
|
||||
// revisions: stock gated
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
#![cfg_attr(gated, feature(const_fn_floating_point_arithmetic))]
|
||||
|
||||
const fn add(f: f32) -> f32 { f + 2.0 }
|
||||
//[stock]~^ floating point arithmetic
|
||||
const fn sub(f: f32) -> f32 { 2.0 - f }
|
||||
//[stock]~^ floating point arithmetic
|
||||
const fn mul(f: f32, g: f32) -> f32 { f * g }
|
||||
//[stock]~^ floating point arithmetic
|
||||
const fn div(f: f32, g: f32) -> f32 { f / g }
|
||||
//[stock]~^ floating point arithmetic
|
||||
const fn neg(f: f32) -> f32 { -f }
|
||||
//[stock]~^ floating point arithmetic
|
||||
|
||||
#[rustc_error]
|
||||
fn main() {} //[gated]~ fatal error triggered by #[rustc_error]
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:8:31
|
||||
|
|
||||
LL | const fn add(f: f32) -> f32 { f + 2.0 }
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:10:31
|
||||
|
|
||||
LL | const fn sub(f: f32) -> f32 { 2.0 - f }
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:12:39
|
||||
|
|
||||
LL | const fn mul(f: f32, g: f32) -> f32 { f * g }
|
||||
| ^^^^^
|
||||
|
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:14:39
|
||||
|
|
||||
LL | const fn div(f: f32, g: f32) -> f32 { f / g }
|
||||
| ^^^^^
|
||||
|
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: floating point arithmetic is not allowed in constant functions
|
||||
--> $DIR/const_fn_floating_point_arithmetic.rs:16:31
|
||||
|
|
||||
LL | const fn neg(f: f32) -> f32 { -f }
|
||||
| ^^
|
||||
|
|
||||
= note: see issue #57241 <https://github.com/rust-lang/rust/issues/57241> for more information
|
||||
= help: add `#![feature(const_fn_floating_point_arithmetic)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
// build-pass (FIXME(62277): could be check-pass?)
|
||||
// run-pass
|
||||
|
||||
#![feature(const_fn)]
|
||||
#![feature(const_fn_floating_point_arithmetic)]
|
||||
|
||||
struct Foo<T>(T);
|
||||
struct Bar<T> { x: T }
|
||||
|
|
|
|||
|
|
@ -77,14 +77,6 @@ const fn foo11<T: std::fmt::Display>(t: T) -> T { t }
|
|||
//~^ ERROR trait bounds other than `Sized` on const fn parameters are unstable
|
||||
const fn foo11_2<T: Send>(t: T) -> T { t }
|
||||
//~^ ERROR trait bounds other than `Sized` on const fn parameters are unstable
|
||||
const fn foo19(f: f32) -> f32 { f * 2.0 }
|
||||
//~^ ERROR int, `bool` and `char` operations
|
||||
const fn foo19_2(f: f32) -> f32 { 2.0 - f }
|
||||
//~^ ERROR int, `bool` and `char` operations
|
||||
const fn foo19_3(f: f32) -> f32 { -f }
|
||||
//~^ ERROR int, `bool` and `char` operations
|
||||
const fn foo19_4(f: f32, g: f32) -> f32 { f / g }
|
||||
//~^ ERROR int, `bool` and `char` operations
|
||||
|
||||
static BAR: u32 = 42;
|
||||
const fn foo25() -> u32 { BAR } //~ ERROR cannot refer to statics
|
||||
|
|
|
|||
|
|
@ -76,44 +76,8 @@ LL | const fn foo11_2<T: Send>(t: T) -> T { t }
|
|||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
||||
--> $DIR/min_const_fn.rs:80:33
|
||||
|
|
||||
LL | const fn foo19(f: f32) -> f32 { f * 2.0 }
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
||||
--> $DIR/min_const_fn.rs:82:35
|
||||
|
|
||||
LL | const fn foo19_2(f: f32) -> f32 { 2.0 - f }
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
||||
--> $DIR/min_const_fn.rs:84:35
|
||||
|
|
||||
LL | const fn foo19_3(f: f32) -> f32 { -f }
|
||||
| ^^
|
||||
|
|
||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: only int, `bool` and `char` operations are stable in const fn
|
||||
--> $DIR/min_const_fn.rs:86:43
|
||||
|
|
||||
LL | const fn foo19_4(f: f32, g: f32) -> f32 { f / g }
|
||||
| ^^^^^
|
||||
|
|
||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0013]: constant functions cannot refer to statics
|
||||
--> $DIR/min_const_fn.rs:90:27
|
||||
--> $DIR/min_const_fn.rs:82:27
|
||||
|
|
||||
LL | const fn foo25() -> u32 { BAR }
|
||||
| ^^^
|
||||
|
|
@ -121,7 +85,7 @@ LL | const fn foo25() -> u32 { BAR }
|
|||
= help: consider extracting the value of the `static` to a `const`, and referring to that
|
||||
|
||||
error[E0013]: constant functions cannot refer to statics
|
||||
--> $DIR/min_const_fn.rs:91:37
|
||||
--> $DIR/min_const_fn.rs:83:37
|
||||
|
|
||||
LL | const fn foo26() -> &'static u32 { &BAR }
|
||||
| ^^^
|
||||
|
|
@ -129,7 +93,7 @@ LL | const fn foo26() -> &'static u32 { &BAR }
|
|||
= help: consider extracting the value of the `static` to a `const`, and referring to that
|
||||
|
||||
error[E0658]: casting pointers to integers in constant functions is unstable
|
||||
--> $DIR/min_const_fn.rs:92:42
|
||||
--> $DIR/min_const_fn.rs:84:42
|
||||
|
|
||||
LL | const fn foo30(x: *const u32) -> usize { x as usize }
|
||||
| ^^^^^^^^^^
|
||||
|
|
@ -138,7 +102,7 @@ LL | const fn foo30(x: *const u32) -> usize { x as usize }
|
|||
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: casting pointers to integers in constant functions is unstable
|
||||
--> $DIR/min_const_fn.rs:94:63
|
||||
--> $DIR/min_const_fn.rs:86:63
|
||||
|
|
||||
LL | const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize } }
|
||||
| ^^^^^^^^^^
|
||||
|
|
@ -147,7 +111,7 @@ LL | const fn foo30_with_unsafe(x: *const u32) -> usize { unsafe { x as usize }
|
|||
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: casting pointers to integers in constant functions is unstable
|
||||
--> $DIR/min_const_fn.rs:96:42
|
||||
--> $DIR/min_const_fn.rs:88:42
|
||||
|
|
||||
LL | const fn foo30_2(x: *mut u32) -> usize { x as usize }
|
||||
| ^^^^^^^^^^
|
||||
|
|
@ -156,7 +120,7 @@ LL | const fn foo30_2(x: *mut u32) -> usize { x as usize }
|
|||
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: casting pointers to integers in constant functions is unstable
|
||||
--> $DIR/min_const_fn.rs:98:63
|
||||
--> $DIR/min_const_fn.rs:90:63
|
||||
|
|
||||
LL | const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize } }
|
||||
| ^^^^^^^^^^
|
||||
|
|
@ -165,7 +129,7 @@ LL | const fn foo30_2_with_unsafe(x: *mut u32) -> usize { unsafe { x as usize }
|
|||
= help: add `#![feature(const_raw_ptr_to_usize_cast)]` to the crate attributes to enable
|
||||
|
||||
error[E0658]: mutable references are not allowed in constant functions
|
||||
--> $DIR/min_const_fn.rs:101:14
|
||||
--> $DIR/min_const_fn.rs:93:14
|
||||
|
|
||||
LL | const fn inc(x: &mut i32) { *x += 1 }
|
||||
| ^
|
||||
|
|
@ -174,7 +138,7 @@ LL | const fn inc(x: &mut i32) { *x += 1 }
|
|||
= help: add `#![feature(const_mut_refs)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:110:6
|
||||
--> $DIR/min_const_fn.rs:102:6
|
||||
|
|
||||
LL | impl<T: std::fmt::Debug> Foo<T> {
|
||||
| ^
|
||||
|
|
@ -183,7 +147,7 @@ LL | impl<T: std::fmt::Debug> Foo<T> {
|
|||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:115:6
|
||||
--> $DIR/min_const_fn.rs:107:6
|
||||
|
|
||||
LL | impl<T: std::fmt::Debug + Sized> Foo<T> {
|
||||
| ^
|
||||
|
|
@ -192,7 +156,7 @@ LL | impl<T: std::fmt::Debug + Sized> Foo<T> {
|
|||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:120:6
|
||||
--> $DIR/min_const_fn.rs:112:6
|
||||
|
|
||||
LL | impl<T: Sync + Sized> Foo<T> {
|
||||
| ^
|
||||
|
|
@ -201,7 +165,7 @@ LL | impl<T: Sync + Sized> Foo<T> {
|
|||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:126:34
|
||||
--> $DIR/min_const_fn.rs:118:34
|
||||
|
|
||||
LL | const fn no_apit2(_x: AlanTuring<impl std::fmt::Debug>) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -210,7 +174,7 @@ LL | const fn no_apit2(_x: AlanTuring<impl std::fmt::Debug>) {}
|
|||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:128:22
|
||||
--> $DIR/min_const_fn.rs:120:22
|
||||
|
|
||||
LL | const fn no_apit(_x: impl std::fmt::Debug) {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -219,7 +183,7 @@ LL | const fn no_apit(_x: impl std::fmt::Debug) {}
|
|||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:129:23
|
||||
--> $DIR/min_const_fn.rs:121:23
|
||||
|
|
||||
LL | const fn no_dyn_trait(_x: &dyn std::fmt::Debug) {}
|
||||
| ^^
|
||||
|
|
@ -228,7 +192,7 @@ LL | const fn no_dyn_trait(_x: &dyn std::fmt::Debug) {}
|
|||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:130:32
|
||||
--> $DIR/min_const_fn.rs:122:32
|
||||
|
|
||||
LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -237,7 +201,7 @@ LL | const fn no_dyn_trait_ret() -> &'static dyn std::fmt::Debug { &() }
|
|||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: trait bounds other than `Sized` on const fn parameters are unstable
|
||||
--> $DIR/min_const_fn.rs:135:41
|
||||
--> $DIR/min_const_fn.rs:127:41
|
||||
|
|
||||
LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1 }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
@ -246,7 +210,7 @@ LL | const fn really_no_traits_i_mean_it() { (&() as &dyn std::fmt::Debug, ()).1
|
|||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: function pointers in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:138:21
|
||||
--> $DIR/min_const_fn.rs:130:21
|
||||
|
|
||||
LL | const fn no_fn_ptrs(_x: fn()) {}
|
||||
| ^^
|
||||
|
|
@ -255,7 +219,7 @@ LL | const fn no_fn_ptrs(_x: fn()) {}
|
|||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0723]: function pointers in const fn are unstable
|
||||
--> $DIR/min_const_fn.rs:140:27
|
||||
--> $DIR/min_const_fn.rs:132:27
|
||||
|
|
||||
LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
|
||||
| ^^^^
|
||||
|
|
@ -263,7 +227,7 @@ LL | const fn no_fn_ptrs2() -> fn() { fn foo() {} foo }
|
|||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to 30 previous errors
|
||||
error: aborting due to 26 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0013, E0493, E0658, E0723.
|
||||
For more information about an error, try `rustc --explain E0013`.
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
we're apparently really bad at it",
|
||||
issue = "none")]
|
||||
|
||||
#![feature(const_fn, foo, foo2)]
|
||||
#![feature(const_fn, const_fn_floating_point_arithmetic, foo, foo2)]
|
||||
#![feature(staged_api)]
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
|
@ -25,9 +25,9 @@ const fn bar2() -> u32 { foo2() } //~ ERROR not yet stable as a const fn
|
|||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[rustc_const_stable(feature = "rust1", since = "1.0.0")]
|
||||
// conformity is required, even with `const_fn` feature gate
|
||||
// Const-stable functions cannot rely on unstable const-eval features.
|
||||
const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
//~^ ERROR const-stable function cannot use `#[feature(const_fn)]`
|
||||
//~^ ERROR const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||
|
||||
// check whether this function cannot be called even with the feature gate active
|
||||
#[unstable(feature = "foo2", issue = "none")]
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ LL | const fn bar2() -> u32 { foo2() }
|
|||
|
|
||||
= help: Const-stable functions can only call other const-stable functions
|
||||
|
||||
error: const-stable function cannot use `#[feature(const_fn)]`
|
||||
error: const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||
--> $DIR/min_const_fn_libstd_stability.rs:29:26
|
||||
|
|
||||
LL | const fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
we're apparently really bad at it",
|
||||
issue = "none")]
|
||||
|
||||
#![feature(const_fn, foo, foo2)]
|
||||
#![feature(const_fn, const_fn_floating_point_arithmetic, foo, foo2)]
|
||||
#![feature(staged_api)]
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
|
@ -27,7 +27,7 @@ const unsafe fn bar2() -> u32 { unsafe { foo2() } } //~ ERROR not yet stable as
|
|||
#[rustc_const_stable(feature = "rust1", since = "1.0.0")]
|
||||
// conformity is required, even with `const_fn` feature gate
|
||||
const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
//~^ ERROR const-stable function cannot use `#[feature(const_fn)]`
|
||||
//~^ ERROR const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||
|
||||
// check whether this function cannot be called even with the feature gate active
|
||||
#[unstable(feature = "foo2", issue = "none")]
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ LL | const unsafe fn bar2() -> u32 { unsafe { foo2() } }
|
|||
|
|
||||
= help: Const-stable functions can only call other const-stable functions
|
||||
|
||||
error: const-stable function cannot use `#[feature(const_fn)]`
|
||||
error: const-stable function cannot use `#[feature(const_fn_floating_point_arithmetic)]`
|
||||
--> $DIR/min_const_unsafe_fn_libstd_stability.rs:29:33
|
||||
|
|
||||
LL | const unsafe fn bar3() -> u32 { (5f32 + 6f32) as u32 }
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 02a33d411d8e385942776760a99535d69826349b
|
||||
Subproject commit 2f84bfc57dd0ef22269bb84dae10f71e5e23e85d
|
||||
|
|
@ -9,6 +9,6 @@ edition = "2018"
|
|||
clap = "2.25.0"
|
||||
|
||||
[dependencies.mdbook]
|
||||
version = "0.4.0"
|
||||
version = "0.4.3"
|
||||
default-features = false
|
||||
features = ["search"]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue