Skip to content
Closed
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions compiler/rustc_feature/src/unstable.rs
Original file line number Diff line number Diff line change
@@ -529,6 +529,8 @@ declare_features! (
(unstable, inline_const_pat, "1.58.0", Some(76001)),
/// Allows using `pointer` and `reference` in intra-doc links
(unstable, intra_doc_pointers, "1.51.0", Some(80896)),
// Allows using the `kl` and `widekl` target features and the associated intrinsics
(unstable, keylocker_x86, "CURRENT_RUSTC_VERSION", Some(134813)),
// Allows setting the threshold for the `large_assignments` lint.
(unstable, large_assignments, "1.52.0", Some(83518)),
/// Allow to have type alias types for inter-crate use.
81 changes: 42 additions & 39 deletions compiler/rustc_mir_build/src/thir/pattern/mod.rs
Original file line number Diff line number Diff line change
@@ -155,42 +155,41 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
fn lower_pattern_range_endpoint(
&mut self,
expr: Option<&'tcx hir::PatExpr<'tcx>>,
) -> Result<
(Option<PatRangeBoundary<'tcx>>, Option<Ascription<'tcx>>, Option<LocalDefId>),
ErrorGuaranteed,
> {
match expr {
None => Ok((None, None, None)),
Some(expr) => {
let (kind, ascr, inline_const) = match self.lower_lit(expr) {
PatKind::ExpandedConstant { subpattern, def_id, is_inline: true } => {
(subpattern.kind, None, def_id.as_local())
}
PatKind::ExpandedConstant { subpattern, is_inline: false, .. } => {
(subpattern.kind, None, None)
}
PatKind::AscribeUserType { ascription, subpattern: box Pat { kind, .. } } => {
(kind, Some(ascription), None)
}
kind => (kind, None, None),
};
let value = match kind {
PatKind::Constant { value } => value,
PatKind::ExpandedConstant { subpattern, .. }
if let PatKind::Constant { value } = subpattern.kind =>
{
value
}
_ => {
let msg = format!(
"found bad range pattern endpoint `{expr:?}` outside of error recovery"
);
return Err(self.tcx.dcx().span_delayed_bug(expr.span, msg));
// Out-parameters collecting extra data to be reapplied by the caller
ascriptions: &mut Vec<Ascription<'tcx>>,
inline_consts: &mut Vec<LocalDefId>,
) -> Result<Option<PatRangeBoundary<'tcx>>, ErrorGuaranteed> {
let Some(expr) = expr else { return Ok(None) };

// Lower the endpoint into a temporary `PatKind` that will then be
// deconstructed to obtain the constant value and other data.
let mut kind: PatKind<'tcx> = self.lower_lit(expr);

// Unpeel any ascription or inline-const wrapper nodes.
loop {
match kind {
PatKind::AscribeUserType { ascription, subpattern } => {
ascriptions.push(ascription);
kind = subpattern.kind;
}
PatKind::ExpandedConstant { is_inline, def_id, subpattern } => {
if is_inline {
inline_consts.extend(def_id.as_local());
}
};
Ok((Some(PatRangeBoundary::Finite(value)), ascr, inline_const))
kind = subpattern.kind;
}
_ => break,
}
}

// The unpeeled kind should now be a constant, giving us the endpoint value.
let PatKind::Constant { value } = kind else {
let msg =
format!("found bad range pattern endpoint `{expr:?}` outside of error recovery");
return Err(self.tcx.dcx().span_delayed_bug(expr.span, msg));
};

Ok(Some(PatRangeBoundary::Finite(value)))
}

/// Overflowing literals are linted against in a late pass. This is mostly fine, except when we
@@ -253,11 +252,15 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
self.tcx.dcx().span_bug(span, msg);
}

let (lo, lo_ascr, lo_inline) = self.lower_pattern_range_endpoint(lo_expr)?;
let (hi, hi_ascr, hi_inline) = self.lower_pattern_range_endpoint(hi_expr)?;
// Collect extra data while lowering the endpoints, to be reapplied later.
let mut ascriptions = vec![];
let mut inline_consts = vec![];

let mut lower_endpoint =
|expr| self.lower_pattern_range_endpoint(expr, &mut ascriptions, &mut inline_consts);

let lo = lo.unwrap_or(PatRangeBoundary::NegInfinity);
let hi = hi.unwrap_or(PatRangeBoundary::PosInfinity);
let lo = lower_endpoint(lo_expr)?.unwrap_or(PatRangeBoundary::NegInfinity);
let hi = lower_endpoint(hi_expr)?.unwrap_or(PatRangeBoundary::PosInfinity);

let cmp = lo.compare_with(hi, ty, self.tcx, self.typing_env);
let mut kind = PatKind::Range(Box::new(PatRange { lo, hi, end, ty }));
@@ -298,13 +301,13 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
// If we are handling a range with associated constants (e.g.
// `Foo::<'a>::A..=Foo::B`), we need to put the ascriptions for the associated
// constants somewhere. Have them on the range pattern.
for ascription in [lo_ascr, hi_ascr].into_iter().flatten() {
for ascription in ascriptions {
kind = PatKind::AscribeUserType {
ascription,
subpattern: Box::new(Pat { span, ty, kind }),
};
}
for def in [lo_inline, hi_inline].into_iter().flatten() {
for def in inline_consts {
kind = PatKind::ExpandedConstant {
def_id: def.to_def_id(),
is_inline: true,
1 change: 1 addition & 0 deletions compiler/rustc_span/src/symbol.rs
Original file line number Diff line number Diff line change
@@ -1148,6 +1148,7 @@ symbols! {
iterator,
iterator_collect_fn,
kcfi,
keylocker_x86,
keyword,
kind,
kreg,
2 changes: 2 additions & 0 deletions compiler/rustc_target/src/target_features.rs
Original file line number Diff line number Diff line change
@@ -409,6 +409,7 @@ const X86_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
("fma", Stable, &["avx"]),
("fxsr", Stable, &[]),
("gfni", Unstable(sym::avx512_target_feature), &["sse2"]),
("kl", Unstable(sym::keylocker_x86), &["sse2"]),
("lahfsahf", Unstable(sym::lahfsahf_target_feature), &[]),
("lzcnt", Stable, &[]),
("movbe", Stable, &[]),
@@ -433,6 +434,7 @@ const X86_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
("tbm", Unstable(sym::tbm_target_feature), &[]),
("vaes", Unstable(sym::avx512_target_feature), &["avx2", "aes"]),
("vpclmulqdq", Unstable(sym::avx512_target_feature), &["avx", "pclmulqdq"]),
("widekl", Unstable(sym::keylocker_x86), &["kl"]),
("x87", Unstable(sym::x87_target_feature), &[]),
("xop", Unstable(sym::xop_target_feature), &[/*"fma4", */ "avx", "sse4a"]),
("xsave", Stable, &[]),
12 changes: 5 additions & 7 deletions src/bootstrap/src/bin/main.rs
Original file line number Diff line number Diff line change
@@ -11,12 +11,12 @@ use std::str::FromStr;
use std::{env, process};

use bootstrap::{
Build, CONFIG_CHANGE_HISTORY, Config, Flags, Subcommand, find_recent_config_change_ids,
Build, CONFIG_CHANGE_HISTORY, Config, Flags, Subcommand, debug, find_recent_config_change_ids,
human_readable_changes, t,
};
use build_helper::ci::CiEnv;
#[cfg(feature = "tracing")]
use tracing::{debug, instrument};
use tracing::instrument;

#[cfg_attr(feature = "tracing", instrument(level = "trace", name = "main"))]
fn main() {
@@ -29,10 +29,8 @@ fn main() {
return;
}

#[cfg(feature = "tracing")]
debug!("parsing flags");
let flags = Flags::parse(&args);
#[cfg(feature = "tracing")]
debug!("parsing config based on flags");
let config = Config::parse(flags);

@@ -95,7 +93,6 @@ fn main() {
let dump_bootstrap_shims = config.dump_bootstrap_shims;
let out_dir = config.out.clone();

#[cfg(feature = "tracing")]
debug!("creating new build based on config");
Build::new(config).build();

@@ -207,8 +204,9 @@ fn check_version(config: &Config) -> Option<String> {
// Due to the conditional compilation via the `tracing` cargo feature, this means that `tracing`
// usages in bootstrap need to be also gated behind the `tracing` feature:
//
// - `tracing` macros (like `trace!`) and anything from `tracing`, `tracing_subscriber` and
// `tracing-tree` will need to be gated by `#[cfg(feature = "tracing")]`.
// - `tracing` macros with log levels (`trace!`, `debug!`, `warn!`, `info`, `error`) should not be
// used *directly*. You should use the wrapped `tracing` macros which gate the actual invocations
// behind `feature = "tracing"`.
// - `tracing`'s `#[instrument(..)]` macro will need to be gated like `#![cfg_attr(feature =
// "tracing", instrument(..))]`.
#[cfg(feature = "tracing")]
2 changes: 1 addition & 1 deletion src/bootstrap/src/core/build_steps/compile.rs
Original file line number Diff line number Diff line change
@@ -339,7 +339,7 @@ fn copy_self_contained_objects(
// to using gcc from a glibc-targeting toolchain for linking.
// To do that we have to distribute musl startup objects as a part of Rust toolchain
// and link with them manually in the self-contained mode.
if target.contains("musl") && !target.contains("unikraft") {
if target.needs_crt_begin_end() {
let srcdir = builder.musl_libdir(target).unwrap_or_else(|| {
panic!("Target {:?} does not have a \"musl-libdir\" key", target.triple)
});
4 changes: 3 additions & 1 deletion src/bootstrap/src/core/build_steps/llvm.rs
Original file line number Diff line number Diff line change
@@ -1295,7 +1295,9 @@ impl Step for CrtBeginEnd {
}

fn make_run(run: RunConfig<'_>) {
run.builder.ensure(CrtBeginEnd { target: run.target });
if run.target.needs_crt_begin_end() {
run.builder.ensure(CrtBeginEnd { target: run.target });
}
}

/// Build crtbegin.o/crtend.o for musl target.
6 changes: 5 additions & 1 deletion src/bootstrap/src/core/builder/cargo.rs
Original file line number Diff line number Diff line change
@@ -659,14 +659,18 @@ impl Builder<'_> {
// Build proc macros both for the host and the target unless proc-macros are not
// supported by the target.
if target != compiler.host && cmd_kind != Kind::Check {
let error = command(self.rustc(compiler))
let mut rustc_cmd = command(self.rustc(compiler));
self.add_rustc_lib_path(compiler, &mut rustc_cmd);

let error = rustc_cmd
.arg("--target")
.arg(target.rustc_target_arg())
.arg("--print=file-names")
.arg("--crate-type=proc-macro")
.arg("-")
.run_capture(self)
.stderr();

let not_supported = error
.lines()
.any(|line| line.contains("unsupported crate type `proc-macro`"));
4 changes: 4 additions & 0 deletions src/bootstrap/src/core/config/config.rs
Original file line number Diff line number Diff line change
@@ -575,6 +575,10 @@ impl TargetSelection {
env::var("OSTYPE").is_ok_and(|v| v.to_lowercase().contains("cygwin"))
}

pub fn needs_crt_begin_end(&self) -> bool {
self.contains("musl") && !self.contains("unikraft")
}

/// Path to the file defining the custom target, if any.
pub fn filepath(&self) -> Option<&Path> {
self.file.as_ref().map(Path::new)
87 changes: 43 additions & 44 deletions src/bootstrap/src/lib.rs
Original file line number Diff line number Diff line change
@@ -28,8 +28,6 @@ use std::{env, fs, io, str};
use build_helper::ci::gha;
use build_helper::exit;
use termcolor::{ColorChoice, StandardStream, WriteColor};
#[cfg(feature = "tracing")]
use tracing::{debug, instrument, span, trace};
use utils::build_stamp::BuildStamp;
use utils::channel::GitInfo;

@@ -46,6 +44,8 @@ pub use core::builder::PathSet;
pub use core::config::Config;
pub use core::config::flags::{Flags, Subcommand};

#[cfg(feature = "tracing")]
use tracing::{instrument, span};
pub use utils::change_tracker::{
CONFIG_CHANGE_HISTORY, find_recent_config_change_ids, human_readable_changes,
};
@@ -541,72 +541,71 @@ impl Build {
/// Executes the entire build, as configured by the flags and configuration.
#[cfg_attr(feature = "tracing", instrument(level = "debug", name = "Build::build", skip_all))]
pub fn build(&mut self) {
#[cfg(feature = "tracing")]
trace!("setting up job management");
unsafe {
crate::utils::job::setup(self);
}

#[cfg(feature = "tracing")]
trace!("downloading rustfmt early");

// Download rustfmt early so that it can be used in rust-analyzer configs.
trace!("downloading rustfmt early");
let _ = &builder::Builder::new(self).initial_rustfmt();

#[cfg(feature = "tracing")]
let hardcoded_span =
span!(tracing::Level::DEBUG, "handling hardcoded subcommands (Format, Suggest, Perf)")
.entered();

// hardcoded subcommands
match &self.config.cmd {
Subcommand::Format { check, all } => {
return core::build_steps::format::format(
&builder::Builder::new(self),
*check,
*all,
&self.config.paths,
);
}
Subcommand::Suggest { run } => {
return core::build_steps::suggest::suggest(&builder::Builder::new(self), *run);
}
Subcommand::Perf { .. } => {
return core::build_steps::perf::perf(&builder::Builder::new(self));
}
_cmd => {
#[cfg(feature = "tracing")]
debug!(cmd = ?_cmd, "not a hardcoded subcommand; returning to normal handling");
// Handle hard-coded subcommands.
{
#[cfg(feature = "tracing")]
let _hardcoded_span = span!(
tracing::Level::DEBUG,
"handling hardcoded subcommands (Format, Suggest, Perf)"
)
.entered();

match &self.config.cmd {
Subcommand::Format { check, all } => {
return core::build_steps::format::format(
&builder::Builder::new(self),
*check,
*all,
&self.config.paths,
);
}
Subcommand::Suggest { run } => {
return core::build_steps::suggest::suggest(&builder::Builder::new(self), *run);
}
Subcommand::Perf { .. } => {
return core::build_steps::perf::perf(&builder::Builder::new(self));
}
_cmd => {
debug!(cmd = ?_cmd, "not a hardcoded subcommand; returning to normal handling");
}
}
}

#[cfg(feature = "tracing")]
drop(hardcoded_span);
#[cfg(feature = "tracing")]
debug!("handling subcommand normally");
debug!("handling subcommand normally");
}

if !self.config.dry_run() {
#[cfg(feature = "tracing")]
let _real_run_span = span!(tracing::Level::DEBUG, "executing real run").entered();

// We first do a dry-run. This is a sanity-check to ensure that
// steps don't do anything expensive in the dry-run.
{
#[cfg(feature = "tracing")]
let _sanity_check_span =
span!(tracing::Level::DEBUG, "(1) executing dry-run sanity-check").entered();

// We first do a dry-run. This is a sanity-check to ensure that
// steps don't do anything expensive in the dry-run.
self.config.dry_run = DryRun::SelfCheck;
let builder = builder::Builder::new(self);
builder.execute_cli();
}

#[cfg(feature = "tracing")]
let _actual_run_span =
span!(tracing::Level::DEBUG, "(2) executing actual run").entered();
self.config.dry_run = DryRun::Disabled;
let builder = builder::Builder::new(self);
builder.execute_cli();
// Actual run.
{
#[cfg(feature = "tracing")]
let _actual_run_span =
span!(tracing::Level::DEBUG, "(2) executing actual run").entered();
self.config.dry_run = DryRun::Disabled;
let builder = builder::Builder::new(self);
builder.execute_cli();
}
} else {
#[cfg(feature = "tracing")]
let _dry_run_span = span!(tracing::Level::DEBUG, "executing dry run").entered();
2 changes: 2 additions & 0 deletions src/bootstrap/src/utils/mod.rs
Original file line number Diff line number Diff line change
@@ -14,6 +14,8 @@ pub(crate) mod render_tests;
pub(crate) mod shared_helpers;
pub(crate) mod tarball;

pub(crate) mod tracing;

#[cfg(feature = "build-metrics")]
pub(crate) mod metrics;

49 changes: 49 additions & 0 deletions src/bootstrap/src/utils/tracing.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
//! Wrapper macros for [`tracing`] macros to avoid having to write `cfg(feature = "tracing")`-gated
//! `debug!`/`trace!` everytime, e.g.
//!
//! ```rust,ignore (example)
//! #[cfg(feature = "tracing")]
//! trace!("...");
//! ```
//!
//! When `feature = "tracing"` is inactive, these macros expand to nothing.
#[macro_export]
macro_rules! trace {
($($tokens:tt)*) => {
#[cfg(feature = "tracing")]
::tracing::trace!($($tokens)*)
}
}

#[macro_export]
macro_rules! debug {
($($tokens:tt)*) => {
#[cfg(feature = "tracing")]
::tracing::debug!($($tokens)*)
}
}

#[macro_export]
macro_rules! warn {
($($tokens:tt)*) => {
#[cfg(feature = "tracing")]
::tracing::warn!($($tokens)*)
}
}

#[macro_export]
macro_rules! info {
($($tokens:tt)*) => {
#[cfg(feature = "tracing")]
::tracing::info!($($tokens)*)
}
}

#[macro_export]
macro_rules! error {
($($tokens:tt)*) => {
#[cfg(feature = "tracing")]
::tracing::error!($($tokens)*)
}
}
2 changes: 1 addition & 1 deletion src/librustdoc/clean/mod.rs
Original file line number Diff line number Diff line change
@@ -1934,7 +1934,7 @@ fn can_elide_trait_object_lifetime_bound<'tcx>(
preds: &'tcx ty::List<ty::PolyExistentialPredicate<'tcx>>,
tcx: TyCtxt<'tcx>,
) -> bool {
// Below we quote extracts from https://doc.rust-lang.org/reference/lifetime-elision.html#default-trait-object-lifetimes
// Below we quote extracts from https://doc.rust-lang.org/stable/reference/lifetime-elision.html#default-trait-object-lifetimes

// > If the trait object is used as a type argument of a generic type then the containing type is
// > first used to try to infer a bound.
6 changes: 3 additions & 3 deletions src/librustdoc/clean/utils.rs
Original file line number Diff line number Diff line change
@@ -588,9 +588,9 @@ pub(crate) fn attrs_have_doc_flag<'a>(
/// so that the channel is consistent.
///
/// Set by `bootstrap::Builder::doc_rust_lang_org_channel` in order to keep tests passing on beta/stable.
pub(crate) const DOC_RUST_LANG_ORG_CHANNEL: &str = env!("DOC_RUST_LANG_ORG_CHANNEL");
pub(crate) static DOC_CHANNEL: Lazy<&'static str> =
Lazy::new(|| DOC_RUST_LANG_ORG_CHANNEL.rsplit('/').find(|c| !c.is_empty()).unwrap());
pub(crate) const DOC_RUST_LANG_ORG_VERSION: &str = env!("DOC_RUST_LANG_ORG_CHANNEL");
pub(crate) static RUSTDOC_VERSION: Lazy<&'static str> =
Lazy::new(|| DOC_RUST_LANG_ORG_VERSION.rsplit('/').find(|c| !c.is_empty()).unwrap());

/// Render a sequence of macro arms in a format suitable for displaying to the user
/// as part of an item declaration.
2 changes: 1 addition & 1 deletion src/librustdoc/core.rs
Original file line number Diff line number Diff line change
@@ -387,7 +387,7 @@ pub(crate) fn run_global_ctxt(
let help = format!(
"The following guide may be of use:\n\
{}/rustdoc/how-to-write-documentation.html",
crate::DOC_RUST_LANG_ORG_CHANNEL
crate::DOC_RUST_LANG_ORG_VERSION
);
tcx.node_lint(
crate::lint::MISSING_CRATE_LEVEL_DOCS,
2 changes: 1 addition & 1 deletion src/librustdoc/html/layout.rs
Original file line number Diff line number Diff line change
@@ -112,7 +112,7 @@ pub(crate) fn render<T: Print, S: Print>(
display_krate_with_trailing_slash,
display_krate_version_number,
display_krate_version_extra,
rust_channel: *crate::clean::utils::DOC_CHANNEL,
rust_channel: *crate::clean::utils::RUSTDOC_VERSION,
rustdoc_version,
}
.render()
4 changes: 2 additions & 2 deletions src/librustdoc/html/render/context.rs
Original file line number Diff line number Diff line change
@@ -32,7 +32,7 @@ use crate::html::render::write_shared::write_shared;
use crate::html::url_parts_builder::UrlPartsBuilder;
use crate::html::{layout, sources, static_files};
use crate::scrape_examples::AllCallLocations;
use crate::try_err;
use crate::{DOC_RUST_LANG_ORG_VERSION, try_err};

/// Major driving force in all rustdoc rendering. This contains information
/// about where in the tree-like hierarchy rendering is occurring and controls
@@ -730,7 +730,7 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
<noscript>\
<section>\
<p>You need to enable JavaScript to use keyboard commands or search.</p>\
<p>For more information, browse the <a href=\"https://doc.rust-lang.org/rustdoc/\">rustdoc handbook</a>.</p>\
<p>For more information, browse the <a href=\"{DOC_RUST_LANG_ORG_VERSION}/rustdoc/\">rustdoc handbook</a>.</p>\
</section>\
</noscript>",
)
4 changes: 2 additions & 2 deletions src/librustdoc/html/render/mod.rs
Original file line number Diff line number Diff line change
@@ -79,7 +79,7 @@ use crate::html::markdown::{
use crate::html::static_files::SCRAPE_EXAMPLES_HELP_MD;
use crate::html::{highlight, sources};
use crate::scrape_examples::{CallData, CallLocation};
use crate::{DOC_RUST_LANG_ORG_CHANNEL, try_none};
use crate::{DOC_RUST_LANG_ORG_VERSION, try_none};

pub(crate) fn ensure_trailing_slash(v: &str) -> impl fmt::Display + '_ {
fmt::from_fn(move |f| {
@@ -480,7 +480,7 @@ fn scrape_examples_help(shared: &SharedContext<'_>) -> String {
content.push_str(&format!(
"## More information\n\n\
If you want more information about this feature, please read the [corresponding chapter in \
the Rustdoc book]({DOC_RUST_LANG_ORG_CHANNEL}/rustdoc/scraped-examples.html)."
the Rustdoc book]({DOC_RUST_LANG_ORG_VERSION}/rustdoc/scraped-examples.html)."
));

let mut ids = IdMap::default();
2 changes: 1 addition & 1 deletion src/librustdoc/html/render/print_item.rs
Original file line number Diff line number Diff line change
@@ -924,7 +924,7 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra
<a href=\"{base}/reference/items/traits.html#dyn-compatibility\">dyn compatible</a>.</p>\
<p><i>In older versions of Rust, dyn compatibility was called \"object safety\", \
so this trait is not object safe.</i></p></div>",
base = crate::clean::utils::DOC_RUST_LANG_ORG_CHANNEL
base = crate::clean::utils::DOC_RUST_LANG_ORG_VERSION
),
);
}
16 changes: 8 additions & 8 deletions src/librustdoc/html/static/js/main.js
Original file line number Diff line number Diff line change
@@ -1534,10 +1534,10 @@ function preLoadCss(cssUrl) {

function buildHelpMenu() {
const book_info = document.createElement("span");
const channel = getVar("channel");
const drloChannel = `https://doc.rust-lang.org/${getVar("channel")}`;
book_info.className = "top";
book_info.innerHTML = `You can find more information in \
<a href="https://doc.rust-lang.org/${channel}/rustdoc/">the rustdoc book</a>.`;
<a href="${drloChannel}/rustdoc/">the rustdoc book</a>.`;

const shortcuts = [
["?", "Show this help dialog"],
@@ -1557,8 +1557,8 @@ function preLoadCss(cssUrl) {
div_shortcuts.innerHTML = "<h2>Keyboard Shortcuts</h2><dl>" + shortcuts + "</dl></div>";

const infos = [
`For a full list of all search features, take a look <a \
href="https://doc.rust-lang.org/${channel}/rustdoc/read-documentation/search.html">here</a>.`,
`For a full list of all search features, take a look \
<a href="${drloChannel}/rustdoc/read-documentation/search.html">here</a>.`,
"Prefix searches with a type followed by a colon (e.g., <code>fn:</code>) to \
restrict the search to a given item kind.",
"Accepted kinds are: <code>fn</code>, <code>mod</code>, <code>struct</code>, \
@@ -1568,10 +1568,10 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/read-documentation/search.htm
<code>-&gt; vec</code> or <code>String, enum:Cow -&gt; bool</code>)",
"You can look for items with an exact name by putting double quotes around \
your request: <code>\"string\"</code>",
"Look for functions that accept or return \
<a href=\"https://doc.rust-lang.org/std/primitive.slice.html\">slices</a> and \
<a href=\"https://doc.rust-lang.org/std/primitive.array.html\">arrays</a> by writing \
square brackets (e.g., <code>-&gt; [u8]</code> or <code>[] -&gt; Option</code>)",
`Look for functions that accept or return \
<a href="${drloChannel}/std/primitive.slice.html">slices</a> and \
<a href="${drloChannel}/std/primitive.array.html">arrays</a> by writing square \
brackets (e.g., <code>-&gt; [u8]</code> or <code>[] -&gt; Option</code>)`,
"Look for items inside another one by searching for a path: <code>vec::Vec</code>",
].map(x => "<p>" + x + "</p>").join("");
const div_infos = document.createElement("div");
9 changes: 5 additions & 4 deletions src/librustdoc/html/static/js/search.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// ignore-tidy-filelength
/* global addClass, getNakedUrl, getSettingValue */
/* global addClass, getNakedUrl, getSettingValue, getVar */
/* global onEachLazy, removeClass, searchState, browserSupportsHistoryApi, exports */

"use strict";
@@ -4923,17 +4923,18 @@ ${item.displayPath}<span class="${type}">${name}</span>\
}
});
} else if (query.error === null) {
const dlroChannel = `https://doc.rust-lang.org/${getVar("channel")}`;
output.className = "search-failed" + extraClass;
output.innerHTML = "No results :(<br/>" +
"Try on <a href=\"https://duckduckgo.com/?q=" +
encodeURIComponent("rust " + query.userQuery) +
"\">DuckDuckGo</a>?<br/><br/>" +
"Or try looking in one of these:<ul><li>The <a " +
"href=\"https://doc.rust-lang.org/reference/index.html\">Rust Reference</a> " +
`href="${dlroChannel}/reference/index.html">Rust Reference</a> ` +
" for technical details about the language.</li><li><a " +
"href=\"https://doc.rust-lang.org/rust-by-example/index.html\">Rust By " +
`href="${dlroChannel}/rust-by-example/index.html">Rust By ` +
"Example</a> for expository code examples.</a></li><li>The <a " +
"href=\"https://doc.rust-lang.org/book/index.html\">Rust Book</a> for " +
`href="${dlroChannel}/book/index.html">Rust Book</a> for ` +
"introductions to language features and the language itself.</li><li><a " +
"href=\"https://docs.rs\">Docs.rs</a> for documentation of crates released on" +
" <a href=\"https://crates.io/\">crates.io</a>.</li></ul>";
2 changes: 1 addition & 1 deletion src/librustdoc/html/templates/type_layout.html
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ <h2 id="layout" class="section-header"> {# #}
unstable</strong> and may even differ between compilations. {#+ #}
The only exception is types with certain <code>repr(...)</code> {#+ #}
attributes. Please see the Rust Reference's {#+ #}
<a href="https://doc.rust-lang.org/reference/type-layout.html">“Type Layout”</a> {#+ #}
<a href="{{ crate::DOC_RUST_LANG_ORG_VERSION }}/reference/type-layout.html">“Type Layout”</a> {#+ #}
chapter for details on type layout guarantees. {# #}
</p> {# #}
</div> {# #}
2 changes: 1 addition & 1 deletion src/librustdoc/html/templates/type_layout_size.html
Original file line number Diff line number Diff line change
@@ -7,6 +7,6 @@
{{ size +}} bytes
{% endif %}
{% if is_uninhabited %}
{# +#} (<a href="https://doc.rust-lang.org/stable/reference/glossary.html#uninhabited">uninhabited</a>)
{# +#} (<a href="{{ crate::DOC_RUST_LANG_ORG_VERSION }}/reference/glossary.html#uninhabited">uninhabited</a>)
{% endif %}
{% endif %}
4 changes: 2 additions & 2 deletions src/librustdoc/lib.rs
Original file line number Diff line number Diff line change
@@ -82,7 +82,7 @@ use rustc_session::config::{ErrorOutputType, RustcOptGroup, make_crate_type_opti
use rustc_session::{EarlyDiagCtxt, getopts};
use tracing::info;

use crate::clean::utils::DOC_RUST_LANG_ORG_CHANNEL;
use crate::clean::utils::DOC_RUST_LANG_ORG_VERSION;

/// A macro to create a FxHashMap.
///
@@ -709,7 +709,7 @@ fn usage(argv0: &str) {
println!("{}", options.usage(&format!("{argv0} [options] <input>")));
println!(" @path Read newline separated options from `path`\n");
println!(
"More information available at {DOC_RUST_LANG_ORG_CHANNEL}/rustdoc/what-is-rustdoc.html",
"More information available at {DOC_RUST_LANG_ORG_VERSION}/rustdoc/what-is-rustdoc.html",
);
}

2 changes: 1 addition & 1 deletion src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
@@ -2168,7 +2168,7 @@ fn disambiguator_error(
report_diagnostic(cx.tcx, BROKEN_INTRA_DOC_LINKS, msg, &diag_info, |diag, _sp, _link_range| {
let msg = format!(
"see {}/rustdoc/write-documentation/linking-to-items-by-name.html#namespaces-and-disambiguators for more info about disambiguators",
crate::DOC_RUST_LANG_ORG_CHANNEL
crate::DOC_RUST_LANG_ORG_VERSION
);
diag.note(msg);
});
4 changes: 2 additions & 2 deletions tests/rustdoc/type-layout.rs
Original file line number Diff line number Diff line change
@@ -86,11 +86,11 @@ pub enum WithNiche {
}

//@ hasraw type_layout/enum.Uninhabited.html 'Size: '
//@ hasraw - '0 bytes (<a href="https://doc.rust-lang.org/stable/reference/glossary.html#uninhabited">uninhabited</a>)'
//@ hasraw - '0 bytes (<a href="{{channel}}/reference/glossary.html#uninhabited">uninhabited</a>)'
pub enum Uninhabited {}

//@ hasraw type_layout/struct.Uninhabited2.html 'Size: '
//@ hasraw - '8 bytes (<a href="https://doc.rust-lang.org/stable/reference/glossary.html#uninhabited">uninhabited</a>)'
//@ hasraw - '8 bytes (<a href="{{channel}}/reference/glossary.html#uninhabited">uninhabited</a>)'
pub struct Uninhabited2(std::convert::Infallible, u64);

pub trait Project { type Assoc; }
2 changes: 2 additions & 0 deletions tests/ui/check-cfg/target_feature.stderr
Original file line number Diff line number Diff line change
@@ -127,6 +127,7 @@ LL | cfg!(target_feature = "_UNEXPECTED_VALUE");
`isa-68881`
`isa-68882`
`jsconv`
`kl`
`lahfsahf`
`lasx`
`lbt`
@@ -271,6 +272,7 @@ LL | cfg!(target_feature = "_UNEXPECTED_VALUE");
`vsx`
`wfxt`
`wide-arithmetic`
`widekl`
`x87`
`xop`
`xsave`
6 changes: 6 additions & 0 deletions tests/ui/feature-gates/feature-gate-keylocker_x86.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
//@ only-x86_64
#[target_feature(enable = "kl")]
//~^ ERROR: currently unstable
unsafe fn foo() {}

fn main() {}
13 changes: 13 additions & 0 deletions tests/ui/feature-gates/feature-gate-keylocker_x86.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error[E0658]: the target feature `kl` is currently unstable
--> $DIR/feature-gate-keylocker_x86.rs:2:18
|
LL | #[target_feature(enable = "kl")]
| ^^^^^^^^^^^^^
|
= note: see issue #134813 <https://github.com/rust-lang/rust/issues/134813> for more information
= help: add `#![feature(keylocker_x86)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0658`.
10 changes: 6 additions & 4 deletions tests/ui/simd/array-trait.rs
Original file line number Diff line number Diff line change
@@ -24,10 +24,12 @@ pub struct T<S: Simd>([S::Lane; S::SIZE]);
//~| ERROR SIMD vector element type should be a primitive scalar
//~| ERROR unconstrained generic constant

extern "rust-intrinsic" {
fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;
fn simd_extract<T, E>(x: T, idx: u32) -> E;
}
#[rustc_intrinsic]
unsafe fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;

#[rustc_intrinsic]
unsafe fn simd_extract<T, E>(x: T, idx: u32) -> E;


pub fn main() {
let mut t = T::<i32x4>([0; 4]);
10 changes: 6 additions & 4 deletions tests/ui/simd/array-type.rs
Original file line number Diff line number Diff line change
@@ -12,10 +12,12 @@ struct S([i32; 4]);
#[derive(Copy, Clone)]
struct T<const N: usize>([i32; N]);

extern "rust-intrinsic" {
fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;
fn simd_extract<T, E>(x: T, idx: u32) -> E;
}
#[rustc_intrinsic]
unsafe fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;

#[rustc_intrinsic]
unsafe fn simd_extract<T, E>(x: T, idx: u32) -> E;


pub fn main() {
let mut s = S([0; 4]);
5 changes: 2 additions & 3 deletions tests/ui/simd/generics.rs
Original file line number Diff line number Diff line change
@@ -21,9 +21,8 @@ struct B<T>([T; 4]);
struct C<T, const N: usize>([T; N]);


extern "rust-intrinsic" {
fn simd_add<T>(x: T, y: T) -> T;
}
#[rustc_intrinsic]
unsafe fn simd_add<T>(x: T, y: T) -> T;

fn add<T: ops::Add<Output=T>>(lhs: T, rhs: T) -> T {
lhs + rhs
74 changes: 53 additions & 21 deletions tests/ui/simd/intrinsic/float-math-pass.rs
Original file line number Diff line number Diff line change
@@ -15,27 +15,59 @@
#[derive(Copy, Clone, PartialEq, Debug)]
struct f32x4(pub [f32; 4]);

extern "rust-intrinsic" {
fn simd_fsqrt<T>(x: T) -> T;
fn simd_fabs<T>(x: T) -> T;
fn simd_fsin<T>(x: T) -> T;
fn simd_fcos<T>(x: T) -> T;
fn simd_fexp<T>(x: T) -> T;
fn simd_fexp2<T>(x: T) -> T;
fn simd_fma<T>(x: T, y: T, z: T) -> T;
fn simd_relaxed_fma<T>(x: T, y: T, z: T) -> T;
fn simd_flog<T>(x: T) -> T;
fn simd_flog10<T>(x: T) -> T;
fn simd_flog2<T>(x: T) -> T;
fn simd_fpow<T>(x: T, y: T) -> T;
fn simd_fpowi<T>(x: T, y: i32) -> T;

// rounding functions
fn simd_ceil<T>(x: T) -> T;
fn simd_floor<T>(x: T) -> T;
fn simd_round<T>(x: T) -> T;
fn simd_trunc<T>(x: T) -> T;
}
#[rustc_intrinsic]
unsafe fn simd_fsqrt<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_fabs<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_fsin<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_fcos<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_fexp<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_fexp2<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_fma<T>(x: T, y: T, z: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_relaxed_fma<T>(x: T, y: T, z: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_flog<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_flog10<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_flog2<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_fpow<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_fpowi<T>(x: T, y: i32) -> T;


// rounding functions
#[rustc_intrinsic]
unsafe fn simd_ceil<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_floor<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_round<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_trunc<T>(x: T) -> T;


macro_rules! assert_approx_eq_f32 {
($a:expr, $b:expr) => ({
67 changes: 48 additions & 19 deletions tests/ui/simd/intrinsic/generic-arithmetic-2.rs
Original file line number Diff line number Diff line change
@@ -14,25 +14,54 @@ pub struct u32x4(pub [u32; 4]);
#[derive(Copy, Clone)]
pub struct f32x4(pub [f32; 4]);

extern "rust-intrinsic" {
fn simd_add<T>(x: T, y: T) -> T;
fn simd_sub<T>(x: T, y: T) -> T;
fn simd_mul<T>(x: T, y: T) -> T;
fn simd_div<T>(x: T, y: T) -> T;
fn simd_rem<T>(x: T, y: T) -> T;
fn simd_shl<T>(x: T, y: T) -> T;
fn simd_shr<T>(x: T, y: T) -> T;
fn simd_and<T>(x: T, y: T) -> T;
fn simd_or<T>(x: T, y: T) -> T;
fn simd_xor<T>(x: T, y: T) -> T;

fn simd_neg<T>(x: T) -> T;
fn simd_bswap<T>(x: T) -> T;
fn simd_bitreverse<T>(x: T) -> T;
fn simd_ctlz<T>(x: T) -> T;
fn simd_ctpop<T>(x: T) -> T;
fn simd_cttz<T>(x: T) -> T;
}
#[rustc_intrinsic]
unsafe fn simd_add<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_sub<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_mul<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_div<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_rem<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_shl<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_shr<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_and<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_or<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_xor<T>(x: T, y: T) -> T;


#[rustc_intrinsic]
unsafe fn simd_neg<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_bswap<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_bitreverse<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_ctlz<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_ctpop<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_cttz<T>(x: T) -> T;

fn main() {
let x = i32x4([0, 0, 0, 0]);
48 changes: 24 additions & 24 deletions tests/ui/simd/intrinsic/generic-arithmetic-2.stderr
Original file line number Diff line number Diff line change
@@ -1,143 +1,143 @@
error[E0511]: invalid monomorphization of `simd_add` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:81:9
--> $DIR/generic-arithmetic-2.rs:110:9
|
LL | simd_add(0, 0);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_sub` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:83:9
--> $DIR/generic-arithmetic-2.rs:112:9
|
LL | simd_sub(0, 0);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_mul` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:85:9
--> $DIR/generic-arithmetic-2.rs:114:9
|
LL | simd_mul(0, 0);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_div` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:87:9
--> $DIR/generic-arithmetic-2.rs:116:9
|
LL | simd_div(0, 0);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shl` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:89:9
--> $DIR/generic-arithmetic-2.rs:118:9
|
LL | simd_shl(0, 0);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shr` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:91:9
--> $DIR/generic-arithmetic-2.rs:120:9
|
LL | simd_shr(0, 0);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_and` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:93:9
--> $DIR/generic-arithmetic-2.rs:122:9
|
LL | simd_and(0, 0);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_or` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:95:9
--> $DIR/generic-arithmetic-2.rs:124:9
|
LL | simd_or(0, 0);
| ^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_xor` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:97:9
--> $DIR/generic-arithmetic-2.rs:126:9
|
LL | simd_xor(0, 0);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_neg` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:100:9
--> $DIR/generic-arithmetic-2.rs:129:9
|
LL | simd_neg(0);
| ^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_bswap` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:102:9
--> $DIR/generic-arithmetic-2.rs:131:9
|
LL | simd_bswap(0);
| ^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_bitreverse` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:104:9
--> $DIR/generic-arithmetic-2.rs:133:9
|
LL | simd_bitreverse(0);
| ^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_ctlz` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:106:9
--> $DIR/generic-arithmetic-2.rs:135:9
|
LL | simd_ctlz(0);
| ^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_cttz` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-arithmetic-2.rs:108:9
--> $DIR/generic-arithmetic-2.rs:137:9
|
LL | simd_cttz(0);
| ^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shl` intrinsic: unsupported operation on `f32x4` with element `f32`
--> $DIR/generic-arithmetic-2.rs:111:9
--> $DIR/generic-arithmetic-2.rs:140:9
|
LL | simd_shl(z, z);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shr` intrinsic: unsupported operation on `f32x4` with element `f32`
--> $DIR/generic-arithmetic-2.rs:113:9
--> $DIR/generic-arithmetic-2.rs:142:9
|
LL | simd_shr(z, z);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_and` intrinsic: unsupported operation on `f32x4` with element `f32`
--> $DIR/generic-arithmetic-2.rs:115:9
--> $DIR/generic-arithmetic-2.rs:144:9
|
LL | simd_and(z, z);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_or` intrinsic: unsupported operation on `f32x4` with element `f32`
--> $DIR/generic-arithmetic-2.rs:117:9
--> $DIR/generic-arithmetic-2.rs:146:9
|
LL | simd_or(z, z);
| ^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_xor` intrinsic: unsupported operation on `f32x4` with element `f32`
--> $DIR/generic-arithmetic-2.rs:119:9
--> $DIR/generic-arithmetic-2.rs:148:9
|
LL | simd_xor(z, z);
| ^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_bswap` intrinsic: unsupported operation on `f32x4` with element `f32`
--> $DIR/generic-arithmetic-2.rs:121:9
--> $DIR/generic-arithmetic-2.rs:150:9
|
LL | simd_bswap(z);
| ^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_bitreverse` intrinsic: unsupported operation on `f32x4` with element `f32`
--> $DIR/generic-arithmetic-2.rs:123:9
--> $DIR/generic-arithmetic-2.rs:152:9
|
LL | simd_bitreverse(z);
| ^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_ctlz` intrinsic: unsupported operation on `f32x4` with element `f32`
--> $DIR/generic-arithmetic-2.rs:125:9
--> $DIR/generic-arithmetic-2.rs:154:9
|
LL | simd_ctlz(z);
| ^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_ctpop` intrinsic: unsupported operation on `f32x4` with element `f32`
--> $DIR/generic-arithmetic-2.rs:127:9
--> $DIR/generic-arithmetic-2.rs:156:9
|
LL | simd_ctpop(z);
| ^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_cttz` intrinsic: unsupported operation on `f32x4` with element `f32`
--> $DIR/generic-arithmetic-2.rs:129:9
--> $DIR/generic-arithmetic-2.rs:158:9
|
LL | simd_cttz(z);
| ^^^^^^^^^^^^
67 changes: 48 additions & 19 deletions tests/ui/simd/intrinsic/generic-arithmetic-pass.rs
Original file line number Diff line number Diff line change
@@ -23,25 +23,54 @@ macro_rules! all_eq {
}};
}

extern "rust-intrinsic" {
fn simd_add<T>(x: T, y: T) -> T;
fn simd_sub<T>(x: T, y: T) -> T;
fn simd_mul<T>(x: T, y: T) -> T;
fn simd_div<T>(x: T, y: T) -> T;
fn simd_rem<T>(x: T, y: T) -> T;
fn simd_shl<T>(x: T, y: T) -> T;
fn simd_shr<T>(x: T, y: T) -> T;
fn simd_and<T>(x: T, y: T) -> T;
fn simd_or<T>(x: T, y: T) -> T;
fn simd_xor<T>(x: T, y: T) -> T;

fn simd_neg<T>(x: T) -> T;
fn simd_bswap<T>(x: T) -> T;
fn simd_bitreverse<T>(x: T) -> T;
fn simd_ctlz<T>(x: T) -> T;
fn simd_ctpop<T>(x: T) -> T;
fn simd_cttz<T>(x: T) -> T;
}
#[rustc_intrinsic]
unsafe fn simd_add<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_sub<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_mul<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_div<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_rem<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_shl<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_shr<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_and<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_or<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_xor<T>(x: T, y: T) -> T;


#[rustc_intrinsic]
unsafe fn simd_neg<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_bswap<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_bitreverse<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_ctlz<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_ctpop<T>(x: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_cttz<T>(x: T) -> T;

fn main() {
let x1 = i32x4([1, 2, 3, 4]);
10 changes: 6 additions & 4 deletions tests/ui/simd/intrinsic/generic-arithmetic-saturating-2.rs
Original file line number Diff line number Diff line change
@@ -14,10 +14,12 @@ pub struct x4<T>(pub [T; 4]);
#[derive(Copy, Clone)]
pub struct f32x4(pub [f32; 4]);

extern "rust-intrinsic" {
fn simd_saturating_add<T>(x: T, y: T) -> T;
fn simd_saturating_sub<T>(x: T, y: T) -> T;
}
#[rustc_intrinsic]
unsafe fn simd_saturating_add<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_saturating_sub<T>(x: T, y: T) -> T;


fn main() {
let x = i32x4([0, 0, 0, 0]);
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
error[E0511]: invalid monomorphization of `simd_saturating_add` intrinsic: expected element type `f32` of vector type `f32x4` to be a signed or unsigned integer type
--> $DIR/generic-arithmetic-saturating-2.rs:33:9
--> $DIR/generic-arithmetic-saturating-2.rs:35:9
|
LL | simd_saturating_add(z, z);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_saturating_sub` intrinsic: expected element type `f32` of vector type `f32x4` to be a signed or unsigned integer type
--> $DIR/generic-arithmetic-saturating-2.rs:35:9
--> $DIR/generic-arithmetic-saturating-2.rs:37:9
|
LL | simd_saturating_sub(z, z);
| ^^^^^^^^^^^^^^^^^^^^^^^^^
10 changes: 6 additions & 4 deletions tests/ui/simd/intrinsic/generic-arithmetic-saturating-pass.rs
Original file line number Diff line number Diff line change
@@ -12,10 +12,12 @@ struct u32x4(pub [u32; 4]);
#[derive(Copy, Clone)]
struct I32<const N: usize>([i32; N]);

extern "rust-intrinsic" {
fn simd_saturating_add<T>(x: T, y: T) -> T;
fn simd_saturating_sub<T>(x: T, y: T) -> T;
}
#[rustc_intrinsic]
unsafe fn simd_saturating_add<T>(x: T, y: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_saturating_sub<T>(x: T, y: T) -> T;


fn main() {
// unsigned
6 changes: 3 additions & 3 deletions tests/ui/simd/intrinsic/generic-as.rs
Original file line number Diff line number Diff line change
@@ -2,9 +2,9 @@

#![feature(repr_simd, intrinsics)]

extern "rust-intrinsic" {
fn simd_as<T, U>(x: T) -> U;
}

#[rustc_intrinsic]
unsafe fn simd_as<T, U>(x: T) -> U;

#[derive(Copy, Clone)]
#[repr(simd)]
5 changes: 2 additions & 3 deletions tests/ui/simd/intrinsic/generic-bitmask-pass.rs
Original file line number Diff line number Diff line change
@@ -21,9 +21,8 @@ struct u8x4(pub [u8; 4]);
#[derive(Copy, Clone, PartialEq, Debug)]
struct Tx4<T>(pub [T; 4]);

extern "rust-intrinsic" {
fn simd_bitmask<T, U>(x: T) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_bitmask<T, U>(x: T) -> U;

fn main() {
let z = u32x4([0, 0, 0, 0]);
5 changes: 2 additions & 3 deletions tests/ui/simd/intrinsic/generic-bitmask.rs
Original file line number Diff line number Diff line change
@@ -30,9 +30,8 @@ struct u8x32([u8; 32]);
#[derive(Copy, Clone)]
struct u8x64([u8; 64]);

extern "rust-intrinsic" {
fn simd_bitmask<T, U>(x: T) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_bitmask<T, U>(x: T) -> U;

fn main() {
let m2 = u32x2([0; 2]);
10 changes: 5 additions & 5 deletions tests/ui/simd/intrinsic/generic-bitmask.stderr
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u16`, expected `u8` or `[u8; 1]`
--> $DIR/generic-bitmask.rs:53:22
--> $DIR/generic-bitmask.rs:52:22
|
LL | let _: u16 = simd_bitmask(m2);
| ^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u16`, expected `u8` or `[u8; 1]`
--> $DIR/generic-bitmask.rs:56:22
--> $DIR/generic-bitmask.rs:55:22
|
LL | let _: u16 = simd_bitmask(m8);
| ^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u32`, expected `u16` or `[u8; 2]`
--> $DIR/generic-bitmask.rs:59:22
--> $DIR/generic-bitmask.rs:58:22
|
LL | let _: u32 = simd_bitmask(m16);
| ^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u64`, expected `u32` or `[u8; 4]`
--> $DIR/generic-bitmask.rs:62:22
--> $DIR/generic-bitmask.rs:61:22
|
LL | let _: u64 = simd_bitmask(m32);
| ^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u128`, expected `u64` or `[u8; 8]`
--> $DIR/generic-bitmask.rs:65:23
--> $DIR/generic-bitmask.rs:64:23
|
LL | let _: u128 = simd_bitmask(m64);
| ^^^^^^^^^^^^^^^^^
5 changes: 2 additions & 3 deletions tests/ui/simd/intrinsic/generic-bswap-byte.rs
Original file line number Diff line number Diff line change
@@ -10,9 +10,8 @@ struct i8x4([i8; 4]);
#[derive(Copy, Clone)]
struct u8x4([u8; 4]);

extern "rust-intrinsic" {
fn simd_bswap<T>(x: T) -> T;
}
#[rustc_intrinsic]
unsafe fn simd_bswap<T>(x: T) -> T;

fn main() {
unsafe {
6 changes: 3 additions & 3 deletions tests/ui/simd/intrinsic/generic-cast-pass.rs
Original file line number Diff line number Diff line change
@@ -3,9 +3,9 @@

#![feature(repr_simd, intrinsics)]

extern "rust-intrinsic" {
fn simd_cast<T, U>(x: T) -> U;
}

#[rustc_intrinsic]
unsafe fn simd_cast<T, U>(x: T) -> U;

use std::cmp::{max, min};

5 changes: 2 additions & 3 deletions tests/ui/simd/intrinsic/generic-cast-pointer-width.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
//@ run-pass
#![feature(repr_simd, intrinsics)]

extern "rust-intrinsic" {
fn simd_cast<T, U>(x: T) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_cast<T, U>(x: T) -> U;

#[derive(Copy, Clone)]
#[repr(simd)]
5 changes: 2 additions & 3 deletions tests/ui/simd/intrinsic/generic-cast.rs
Original file line number Diff line number Diff line change
@@ -21,9 +21,8 @@ struct f32x4([f32; 4]);
struct f32x8([f32; 8]);


extern "rust-intrinsic" {
fn simd_cast<T, U>(x: T) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_cast<T, U>(x: T) -> U;

fn main() {
let x = i32x4([0, 0, 0, 0]);
8 changes: 4 additions & 4 deletions tests/ui/simd/intrinsic/generic-cast.stderr
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
error[E0511]: invalid monomorphization of `simd_cast` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-cast.rs:32:9
--> $DIR/generic-cast.rs:31:9
|
LL | simd_cast::<i32, i32>(0);
| ^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_cast` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-cast.rs:34:9
--> $DIR/generic-cast.rs:33:9
|
LL | simd_cast::<i32, i32x4>(0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_cast` intrinsic: expected SIMD return type, found non-SIMD `i32`
--> $DIR/generic-cast.rs:36:9
--> $DIR/generic-cast.rs:35:9
|
LL | simd_cast::<i32x4, i32>(x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_cast` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i32x8` with length 8
--> $DIR/generic-cast.rs:38:9
--> $DIR/generic-cast.rs:37:9
|
LL | simd_cast::<_, i32x8>(x);
| ^^^^^^^^^^^^^^^^^^^^^^^^
26 changes: 18 additions & 8 deletions tests/ui/simd/intrinsic/generic-comparison-pass.rs
Original file line number Diff line number Diff line change
@@ -14,14 +14,24 @@ struct u32x4(pub [u32; 4]);
#[derive(Copy, Clone)]
struct f32x4(pub [f32; 4]);

extern "rust-intrinsic" {
fn simd_eq<T, U>(x: T, y: T) -> U;
fn simd_ne<T, U>(x: T, y: T) -> U;
fn simd_lt<T, U>(x: T, y: T) -> U;
fn simd_le<T, U>(x: T, y: T) -> U;
fn simd_gt<T, U>(x: T, y: T) -> U;
fn simd_ge<T, U>(x: T, y: T) -> U;
}

#[rustc_intrinsic]
unsafe fn simd_eq<T, U>(x: T, y: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_ne<T, U>(x: T, y: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_lt<T, U>(x: T, y: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_le<T, U>(x: T, y: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_gt<T, U>(x: T, y: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_ge<T, U>(x: T, y: T) -> U;

macro_rules! cmp {
($method: ident($lhs: expr, $rhs: expr)) => {{
26 changes: 18 additions & 8 deletions tests/ui/simd/intrinsic/generic-comparison.rs
Original file line number Diff line number Diff line change
@@ -11,14 +11,24 @@ struct i32x4([i32; 4]);
#[allow(non_camel_case_types)]
struct i16x8([i16; 8]);

extern "rust-intrinsic" {
fn simd_eq<T, U>(x: T, y: T) -> U;
fn simd_ne<T, U>(x: T, y: T) -> U;
fn simd_lt<T, U>(x: T, y: T) -> U;
fn simd_le<T, U>(x: T, y: T) -> U;
fn simd_gt<T, U>(x: T, y: T) -> U;
fn simd_ge<T, U>(x: T, y: T) -> U;
}

#[rustc_intrinsic]
unsafe fn simd_eq<T, U>(x: T, y: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_ne<T, U>(x: T, y: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_lt<T, U>(x: T, y: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_le<T, U>(x: T, y: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_gt<T, U>(x: T, y: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_ge<T, U>(x: T, y: T) -> U;

fn main() {
let x = i32x4([0, 0, 0, 0]);
36 changes: 18 additions & 18 deletions tests/ui/simd/intrinsic/generic-comparison.stderr
Original file line number Diff line number Diff line change
@@ -1,107 +1,107 @@
error[E0511]: invalid monomorphization of `simd_eq` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:27:9
--> $DIR/generic-comparison.rs:37:9
|
LL | simd_eq::<i32, i32>(0, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_ne` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:29:9
--> $DIR/generic-comparison.rs:39:9
|
LL | simd_ne::<i32, i32>(0, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_lt` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:31:9
--> $DIR/generic-comparison.rs:41:9
|
LL | simd_lt::<i32, i32>(0, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_le` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:33:9
--> $DIR/generic-comparison.rs:43:9
|
LL | simd_le::<i32, i32>(0, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_gt` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:35:9
--> $DIR/generic-comparison.rs:45:9
|
LL | simd_gt::<i32, i32>(0, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_ge` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:37:9
--> $DIR/generic-comparison.rs:47:9
|
LL | simd_ge::<i32, i32>(0, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_eq` intrinsic: expected SIMD return type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:40:9
--> $DIR/generic-comparison.rs:50:9
|
LL | simd_eq::<_, i32>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_ne` intrinsic: expected SIMD return type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:42:9
--> $DIR/generic-comparison.rs:52:9
|
LL | simd_ne::<_, i32>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_lt` intrinsic: expected SIMD return type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:44:9
--> $DIR/generic-comparison.rs:54:9
|
LL | simd_lt::<_, i32>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_le` intrinsic: expected SIMD return type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:46:9
--> $DIR/generic-comparison.rs:56:9
|
LL | simd_le::<_, i32>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_gt` intrinsic: expected SIMD return type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:48:9
--> $DIR/generic-comparison.rs:58:9
|
LL | simd_gt::<_, i32>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_ge` intrinsic: expected SIMD return type, found non-SIMD `i32`
--> $DIR/generic-comparison.rs:50:9
--> $DIR/generic-comparison.rs:60:9
|
LL | simd_ge::<_, i32>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_eq` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8
--> $DIR/generic-comparison.rs:53:9
--> $DIR/generic-comparison.rs:63:9
|
LL | simd_eq::<_, i16x8>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_ne` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8
--> $DIR/generic-comparison.rs:55:9
--> $DIR/generic-comparison.rs:65:9
|
LL | simd_ne::<_, i16x8>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_lt` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8
--> $DIR/generic-comparison.rs:57:9
--> $DIR/generic-comparison.rs:67:9
|
LL | simd_lt::<_, i16x8>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_le` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8
--> $DIR/generic-comparison.rs:59:9
--> $DIR/generic-comparison.rs:69:9
|
LL | simd_le::<_, i16x8>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_gt` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8
--> $DIR/generic-comparison.rs:61:9
--> $DIR/generic-comparison.rs:71:9
|
LL | simd_gt::<_, i16x8>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_ge` intrinsic: expected return type with length 4 (same as input type `i32x4`), found `i16x8` with length 8
--> $DIR/generic-comparison.rs:63:9
--> $DIR/generic-comparison.rs:73:9
|
LL | simd_ge::<_, i16x8>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^
13 changes: 8 additions & 5 deletions tests/ui/simd/intrinsic/generic-elements-pass.rs
Original file line number Diff line number Diff line change
@@ -16,12 +16,15 @@ struct i32x4([i32; 4]);
#[allow(non_camel_case_types)]
struct i32x8([i32; 8]);

extern "rust-intrinsic" {
fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;
fn simd_extract<T, E>(x: T, idx: u32) -> E;
#[rustc_intrinsic]
unsafe fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;

fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_extract<T, E>(x: T, idx: u32) -> E;


#[rustc_intrinsic]
unsafe fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;

#[repr(simd)]
struct SimdShuffleIdx<const LEN: usize>([u32; LEN]);
19 changes: 13 additions & 6 deletions tests/ui/simd/intrinsic/generic-elements.rs
Original file line number Diff line number Diff line change
@@ -29,13 +29,20 @@ struct f32x4([f32; 4]);
#[allow(non_camel_case_types)]
struct f32x8([f32; 8]);

extern "rust-intrinsic" {
fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;
fn simd_extract<T, E>(x: T, idx: u32) -> E;

fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;
fn simd_shuffle_generic<T, U, const IDX: &'static [u32]>(x: T, y: T) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_insert<T, E>(x: T, idx: u32, y: E) -> T;

#[rustc_intrinsic]
unsafe fn simd_extract<T, E>(x: T, idx: u32) -> E;


#[rustc_intrinsic]
unsafe fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;

#[rustc_intrinsic]
unsafe fn simd_shuffle_generic<T, U, const IDX: &'static [u32]>(x: T, y: T) -> U;


#[repr(simd)]
struct SimdShuffleIdx<const LEN: usize>([u32; LEN]);
42 changes: 21 additions & 21 deletions tests/ui/simd/intrinsic/generic-elements.stderr
Original file line number Diff line number Diff line change
@@ -1,125 +1,125 @@
error[E0511]: invalid monomorphization of `simd_insert` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-elements.rs:47:9
--> $DIR/generic-elements.rs:54:9
|
LL | simd_insert(0, 0, 0);
| ^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_insert` intrinsic: expected inserted type `i32` (element of input `i32x4`), found `f64`
--> $DIR/generic-elements.rs:49:9
--> $DIR/generic-elements.rs:56:9
|
LL | simd_insert(x, 0, 1.0);
| ^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_extract` intrinsic: expected return type `i32` (element of input `i32x4`), found `f32`
--> $DIR/generic-elements.rs:51:9
--> $DIR/generic-elements.rs:58:9
|
LL | simd_extract::<_, f32>(x, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-elements.rs:55:9
--> $DIR/generic-elements.rs:62:9
|
LL | simd_shuffle::<i32, _, i32>(0, 0, IDX2);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-elements.rs:58:9
--> $DIR/generic-elements.rs:65:9
|
LL | simd_shuffle::<i32, _, i32>(0, 0, IDX4);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-elements.rs:61:9
--> $DIR/generic-elements.rs:68:9
|
LL | simd_shuffle::<i32, _, i32>(0, 0, IDX8);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x2` with element type `f32`
--> $DIR/generic-elements.rs:64:9
--> $DIR/generic-elements.rs:71:9
|
LL | simd_shuffle::<_, _, f32x2>(x, x, IDX2);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x4` with element type `f32`
--> $DIR/generic-elements.rs:66:9
--> $DIR/generic-elements.rs:73:9
|
LL | simd_shuffle::<_, _, f32x4>(x, x, IDX4);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x8` with element type `f32`
--> $DIR/generic-elements.rs:68:9
--> $DIR/generic-elements.rs:75:9
|
LL | simd_shuffle::<_, _, f32x8>(x, x, IDX8);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: expected return type of length 2, found `i32x8` with length 8
--> $DIR/generic-elements.rs:71:9
--> $DIR/generic-elements.rs:78:9
|
LL | simd_shuffle::<_, _, i32x8>(x, x, IDX2);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: expected return type of length 4, found `i32x8` with length 8
--> $DIR/generic-elements.rs:73:9
--> $DIR/generic-elements.rs:80:9
|
LL | simd_shuffle::<_, _, i32x8>(x, x, IDX4);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: expected return type of length 8, found `i32x2` with length 2
--> $DIR/generic-elements.rs:75:9
--> $DIR/generic-elements.rs:82:9
|
LL | simd_shuffle::<_, _, i32x2>(x, x, IDX8);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle_generic` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-elements.rs:79:9
--> $DIR/generic-elements.rs:86:9
|
LL | simd_shuffle_generic::<i32, i32, I2>(0, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle_generic` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-elements.rs:82:9
--> $DIR/generic-elements.rs:89:9
|
LL | simd_shuffle_generic::<i32, i32, I4>(0, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle_generic` intrinsic: expected SIMD input type, found non-SIMD `i32`
--> $DIR/generic-elements.rs:85:9
--> $DIR/generic-elements.rs:92:9
|
LL | simd_shuffle_generic::<i32, i32, I8>(0, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle_generic` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x2` with element type `f32`
--> $DIR/generic-elements.rs:88:9
--> $DIR/generic-elements.rs:95:9
|
LL | simd_shuffle_generic::<_, f32x2, I2>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle_generic` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x4` with element type `f32`
--> $DIR/generic-elements.rs:90:9
--> $DIR/generic-elements.rs:97:9
|
LL | simd_shuffle_generic::<_, f32x4, I4>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle_generic` intrinsic: expected return element type `i32` (element of input `i32x4`), found `f32x8` with element type `f32`
--> $DIR/generic-elements.rs:92:9
--> $DIR/generic-elements.rs:99:9
|
LL | simd_shuffle_generic::<_, f32x8, I8>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle_generic` intrinsic: expected return type of length 2, found `i32x8` with length 8
--> $DIR/generic-elements.rs:95:9
--> $DIR/generic-elements.rs:102:9
|
LL | simd_shuffle_generic::<_, i32x8, I2>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle_generic` intrinsic: expected return type of length 4, found `i32x8` with length 8
--> $DIR/generic-elements.rs:97:9
--> $DIR/generic-elements.rs:104:9
|
LL | simd_shuffle_generic::<_, i32x8, I4>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_shuffle_generic` intrinsic: expected return type of length 8, found `i32x2` with length 2
--> $DIR/generic-elements.rs:99:9
--> $DIR/generic-elements.rs:106:9
|
LL | simd_shuffle_generic::<_, i32x2, I8>(x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9 changes: 5 additions & 4 deletions tests/ui/simd/intrinsic/generic-gather-pass.rs
Original file line number Diff line number Diff line change
@@ -10,10 +10,11 @@
#[derive(Copy, Clone, PartialEq, Debug)]
struct x4<T>(pub [T; 4]);

extern "rust-intrinsic" {
fn simd_gather<T, U, V>(x: T, y: U, z: V) -> T;
fn simd_scatter<T, U, V>(x: T, y: U, z: V) -> ();
}
#[rustc_intrinsic]
unsafe fn simd_gather<T, U, V>(x: T, y: U, z: V) -> T;

#[rustc_intrinsic]
unsafe fn simd_scatter<T, U, V>(x: T, y: U, z: V) -> ();

fn main() {
let mut x = [0_f32, 1., 2., 3., 4., 5., 6., 7.];
45 changes: 32 additions & 13 deletions tests/ui/simd/intrinsic/generic-reduction-pass.rs
Original file line number Diff line number Diff line change
@@ -24,19 +24,38 @@ struct f32x4(pub [f32; 4]);
#[derive(Copy, Clone)]
struct b8x4(pub [i8; 4]);

extern "rust-intrinsic" {
fn simd_reduce_add_unordered<T, U>(x: T) -> U;
fn simd_reduce_mul_unordered<T, U>(x: T) -> U;
fn simd_reduce_add_ordered<T, U>(x: T, acc: U) -> U;
fn simd_reduce_mul_ordered<T, U>(x: T, acc: U) -> U;
fn simd_reduce_min<T, U>(x: T) -> U;
fn simd_reduce_max<T, U>(x: T) -> U;
fn simd_reduce_and<T, U>(x: T) -> U;
fn simd_reduce_or<T, U>(x: T) -> U;
fn simd_reduce_xor<T, U>(x: T) -> U;
fn simd_reduce_all<T>(x: T) -> bool;
fn simd_reduce_any<T>(x: T) -> bool;
}
#[rustc_intrinsic]
unsafe fn simd_reduce_add_unordered<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_mul_unordered<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_add_ordered<T, U>(x: T, acc: U) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_mul_ordered<T, U>(x: T, acc: U) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_min<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_max<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_and<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_or<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_xor<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_all<T>(x: T) -> bool;

#[rustc_intrinsic]
unsafe fn simd_reduce_any<T>(x: T) -> bool;

fn main() {
unsafe {
28 changes: 19 additions & 9 deletions tests/ui/simd/intrinsic/generic-reduction.rs
Original file line number Diff line number Diff line change
@@ -15,16 +15,26 @@ pub struct f32x4(pub [f32; 4]);
#[derive(Copy, Clone)]
pub struct u32x4(pub [u32; 4]);

#[rustc_intrinsic]
unsafe fn simd_reduce_add_ordered<T, U>(x: T, y: U) -> U;

extern "rust-intrinsic" {
fn simd_reduce_add_ordered<T, U>(x: T, y: U) -> U;
fn simd_reduce_mul_ordered<T, U>(x: T, y: U) -> U;
fn simd_reduce_and<T, U>(x: T) -> U;
fn simd_reduce_or<T, U>(x: T) -> U;
fn simd_reduce_xor<T, U>(x: T) -> U;
fn simd_reduce_all<T>(x: T) -> bool;
fn simd_reduce_any<T>(x: T) -> bool;
}
#[rustc_intrinsic]
unsafe fn simd_reduce_mul_ordered<T, U>(x: T, y: U) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_and<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_or<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_xor<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_reduce_all<T>(x: T) -> bool;

#[rustc_intrinsic]
unsafe fn simd_reduce_any<T>(x: T) -> bool;

fn main() {
let x = u32x4([0, 0, 0, 0]);
20 changes: 10 additions & 10 deletions tests/ui/simd/intrinsic/generic-reduction.stderr
Original file line number Diff line number Diff line change
@@ -1,59 +1,59 @@
error[E0511]: invalid monomorphization of `simd_reduce_add_ordered` intrinsic: expected return type `f32` (element of input `f32x4`), found `i32`
--> $DIR/generic-reduction.rs:34:9
--> $DIR/generic-reduction.rs:44:9
|
LL | simd_reduce_add_ordered(z, 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_reduce_mul_ordered` intrinsic: expected return type `f32` (element of input `f32x4`), found `i32`
--> $DIR/generic-reduction.rs:36:9
--> $DIR/generic-reduction.rs:46:9
|
LL | simd_reduce_mul_ordered(z, 1);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_reduce_and` intrinsic: expected return type `u32` (element of input `u32x4`), found `f32`
--> $DIR/generic-reduction.rs:39:22
--> $DIR/generic-reduction.rs:49:22
|
LL | let _: f32 = simd_reduce_and(x);
| ^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_reduce_or` intrinsic: expected return type `u32` (element of input `u32x4`), found `f32`
--> $DIR/generic-reduction.rs:41:22
--> $DIR/generic-reduction.rs:51:22
|
LL | let _: f32 = simd_reduce_or(x);
| ^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_reduce_xor` intrinsic: expected return type `u32` (element of input `u32x4`), found `f32`
--> $DIR/generic-reduction.rs:43:22
--> $DIR/generic-reduction.rs:53:22
|
LL | let _: f32 = simd_reduce_xor(x);
| ^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_reduce_and` intrinsic: unsupported simd_reduce_and from `f32x4` with element `f32` to `f32`
--> $DIR/generic-reduction.rs:46:22
--> $DIR/generic-reduction.rs:56:22
|
LL | let _: f32 = simd_reduce_and(z);
| ^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_reduce_or` intrinsic: unsupported simd_reduce_or from `f32x4` with element `f32` to `f32`
--> $DIR/generic-reduction.rs:48:22
--> $DIR/generic-reduction.rs:58:22
|
LL | let _: f32 = simd_reduce_or(z);
| ^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_reduce_xor` intrinsic: unsupported simd_reduce_xor from `f32x4` with element `f32` to `f32`
--> $DIR/generic-reduction.rs:50:22
--> $DIR/generic-reduction.rs:60:22
|
LL | let _: f32 = simd_reduce_xor(z);
| ^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_reduce_all` intrinsic: unsupported simd_reduce_all from `f32x4` with element `f32` to `bool`
--> $DIR/generic-reduction.rs:53:23
--> $DIR/generic-reduction.rs:63:23
|
LL | let _: bool = simd_reduce_all(z);
| ^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_reduce_any` intrinsic: unsupported simd_reduce_any from `f32x4` with element `f32` to `bool`
--> $DIR/generic-reduction.rs:55:23
--> $DIR/generic-reduction.rs:65:23
|
LL | let _: bool = simd_reduce_any(z);
| ^^^^^^^^^^^^^^^^^^
10 changes: 6 additions & 4 deletions tests/ui/simd/intrinsic/generic-select-pass.rs
Original file line number Diff line number Diff line change
@@ -29,10 +29,12 @@ struct f32x4(pub [f32; 4]);
#[derive(Copy, Clone, PartialEq, Debug)]
struct b8x4(pub [i8; 4]);

extern "rust-intrinsic" {
fn simd_select<T, U>(x: T, a: U, b: U) -> U;
fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_select<T, U>(x: T, a: U, b: U) -> U;

#[rustc_intrinsic]
unsafe fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U;


fn main() {
let m0 = b8x4([!0, !0, !0, !0]);
11 changes: 7 additions & 4 deletions tests/ui/simd/intrinsic/generic-select.rs
Original file line number Diff line number Diff line change
@@ -22,10 +22,13 @@ struct b8x4(pub [i8; 4]);
#[derive(Copy, Clone, PartialEq)]
struct b8x8(pub [i8; 8]);

extern "rust-intrinsic" {
fn simd_select<T, U>(x: T, a: U, b: U) -> U;
fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U;
}

#[rustc_intrinsic]
unsafe fn simd_select<T, U>(x: T, a: U, b: U) -> U;

#[rustc_intrinsic]
unsafe fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U;


fn main() {
let m4 = b8x4([0, 0, 0, 0]);
16 changes: 8 additions & 8 deletions tests/ui/simd/intrinsic/generic-select.stderr
Original file line number Diff line number Diff line change
@@ -1,47 +1,47 @@
error[E0511]: invalid monomorphization of `simd_select` intrinsic: mismatched lengths: mask length `8` != other vector length `4`
--> $DIR/generic-select.rs:39:9
--> $DIR/generic-select.rs:42:9
|
LL | simd_select(m8, x, x);
| ^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_select` intrinsic: mask element type is `u32`, expected `i_`
--> $DIR/generic-select.rs:42:9
--> $DIR/generic-select.rs:45:9
|
LL | simd_select(x, x, x);
| ^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_select` intrinsic: mask element type is `f32`, expected `i_`
--> $DIR/generic-select.rs:45:9
--> $DIR/generic-select.rs:48:9
|
LL | simd_select(z, z, z);
| ^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_select` intrinsic: expected SIMD argument type, found non-SIMD `u32`
--> $DIR/generic-select.rs:48:9
--> $DIR/generic-select.rs:51:9
|
LL | simd_select(m4, 0u32, 1u32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: invalid bitmask `u16`, expected `u8` or `[u8; 1]`
--> $DIR/generic-select.rs:51:9
--> $DIR/generic-select.rs:54:9
|
LL | simd_select_bitmask(0u16, x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: expected SIMD argument type, found non-SIMD `u32`
--> $DIR/generic-select.rs:54:9
--> $DIR/generic-select.rs:57:9
|
LL | simd_select_bitmask(0u8, 1u32, 2u32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: invalid bitmask `f32`, expected `u8` or `[u8; 1]`
--> $DIR/generic-select.rs:57:9
--> $DIR/generic-select.rs:60:9
|
LL | simd_select_bitmask(0.0f32, x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0511]: invalid monomorphization of `simd_select_bitmask` intrinsic: invalid bitmask `&str`, expected `u8` or `[u8; 1]`
--> $DIR/generic-select.rs:60:9
--> $DIR/generic-select.rs:63:9
|
LL | simd_select_bitmask("x", x, x);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6 changes: 3 additions & 3 deletions tests/ui/simd/intrinsic/generic-shuffle.rs
Original file line number Diff line number Diff line change
@@ -9,9 +9,9 @@
#[derive(Copy, Clone)]
pub struct Simd<T, const N: usize>([T; N]);

extern "rust-intrinsic" {
fn simd_shuffle<T, I, U>(a: T, b: T, i: I) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_shuffle<T, I, U>(a: T, b: T, i: I) -> U;


fn main() {
const I: Simd<u32, 2> = Simd([0; 2]);
5 changes: 2 additions & 3 deletions tests/ui/simd/intrinsic/inlining-issue67557-ice.rs
Original file line number Diff line number Diff line change
@@ -5,9 +5,8 @@
//@ compile-flags: -Zmir-opt-level=4
#![feature(intrinsics, repr_simd)]

extern "rust-intrinsic" {
fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;

#[repr(simd)]
#[derive(Debug, PartialEq)]
5 changes: 2 additions & 3 deletions tests/ui/simd/intrinsic/inlining-issue67557.rs
Original file line number Diff line number Diff line change
@@ -5,9 +5,8 @@
//@ compile-flags: -Zmir-opt-level=4
#![feature(intrinsics, repr_simd)]

extern "rust-intrinsic" {
fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;

#[repr(simd)]
#[derive(Debug, PartialEq)]
21 changes: 12 additions & 9 deletions tests/ui/simd/intrinsic/issue-85855.rs
Original file line number Diff line number Diff line change
@@ -5,15 +5,18 @@
#![feature(intrinsics)]
#![crate_type="lib"]

extern "rust-intrinsic" {
fn simd_saturating_add<'a, T: 'a>(x: T, y: T);
//~^ ERROR: intrinsic has wrong number of lifetime parameters

fn simd_add<'a, T>(x: T, y: T) -> T;
#[rustc_intrinsic]
unsafe fn simd_saturating_add<'a, T: 'a>(x: T, y: T);
//~^ ERROR: intrinsic has wrong number of lifetime parameters

fn simd_sub<T, U>(x: T, y: U);
//~^ ERROR: intrinsic has wrong number of type parameters
#[rustc_intrinsic]
unsafe fn simd_add<'a, T>(x: T, y: T) -> T;

fn simd_mul<T, const N: usize>(x: T, y: T);
//~^ ERROR: intrinsic has wrong number of const parameters
}
#[rustc_intrinsic]
unsafe fn simd_sub<T, U>(x: T, y: U);
//~^ ERROR: intrinsic has wrong number of type parameters

#[rustc_intrinsic]
unsafe fn simd_mul<T, const N: usize>(x: T, y: T);
//~^ ERROR: intrinsic has wrong number of const parameters
18 changes: 9 additions & 9 deletions tests/ui/simd/intrinsic/issue-85855.stderr
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
error[E0094]: intrinsic has wrong number of lifetime parameters: found 1, expected 0
--> $DIR/issue-85855.rs:9:27
--> $DIR/issue-85855.rs:10:30
|
LL | fn simd_saturating_add<'a, T: 'a>(x: T, y: T);
| ^^^^^^^^^^^ expected 0 lifetime parameters
LL | unsafe fn simd_saturating_add<'a, T: 'a>(x: T, y: T);
| ^^^^^^^^^^^ expected 0 lifetime parameters

error[E0094]: intrinsic has wrong number of type parameters: found 2, expected 1
--> $DIR/issue-85855.rs:14:16
--> $DIR/issue-85855.rs:17:19
|
LL | fn simd_sub<T, U>(x: T, y: U);
| ^^^^^^ expected 1 type parameter
LL | unsafe fn simd_sub<T, U>(x: T, y: U);
| ^^^^^^ expected 1 type parameter

error[E0094]: intrinsic has wrong number of const parameters: found 1, expected 0
--> $DIR/issue-85855.rs:17:16
--> $DIR/issue-85855.rs:21:19
|
LL | fn simd_mul<T, const N: usize>(x: T, y: T);
| ^^^^^^^^^^^^^^^^^^^ expected 0 const parameters
LL | unsafe fn simd_mul<T, const N: usize>(x: T, y: T);
| ^^^^^^^^^^^^^^^^^^^ expected 0 const parameters

error: aborting due to 3 previous errors

14 changes: 9 additions & 5 deletions tests/ui/simd/intrinsic/ptr-cast.rs
Original file line number Diff line number Diff line change
@@ -2,11 +2,15 @@

#![feature(repr_simd, intrinsics)]

extern "rust-intrinsic" {
fn simd_cast_ptr<T, U>(x: T) -> U;
fn simd_expose_provenance<T, U>(x: T) -> U;
fn simd_with_exposed_provenance<T, U>(x: T) -> U;
}

#[rustc_intrinsic]
unsafe fn simd_cast_ptr<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_expose_provenance<T, U>(x: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_with_exposed_provenance<T, U>(x: T) -> U;

#[derive(Copy, Clone)]
#[repr(simd)]
5 changes: 2 additions & 3 deletions tests/ui/simd/issue-105439.rs
Original file line number Diff line number Diff line change
@@ -9,9 +9,8 @@
#[repr(simd)]
struct i32x4([i32; 4]);

extern "rust-intrinsic" {
pub(crate) fn simd_add<T>(x: T, y: T) -> T;
}
#[rustc_intrinsic]
pub(crate) unsafe fn simd_add<T>(x: T, y: T) -> T;

#[inline(always)]
fn to_array(a: i32x4) -> [i32; 4] {
5 changes: 2 additions & 3 deletions tests/ui/simd/issue-39720.rs
Original file line number Diff line number Diff line change
@@ -11,9 +11,8 @@ pub struct Char3(pub [i8; 3]);
#[derive(Copy, Clone, Debug)]
pub struct Short3(pub [i16; 3]);

extern "rust-intrinsic" {
fn simd_cast<T, U>(x: T) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_cast<T, U>(x: T) -> U;

fn main() {
let cast: Short3 = unsafe { simd_cast(Char3([10, -3, -9])) };
10 changes: 6 additions & 4 deletions tests/ui/simd/issue-85915-simd-ptrs.rs
Original file line number Diff line number Diff line change
@@ -22,10 +22,12 @@ struct f32x4([f32; 4]);
#[derive(Copy, Clone, PartialEq, Debug)]
struct i32x4([i32; 4]);

extern "rust-intrinsic" {
fn simd_gather<T, U, V>(x: T, y: U, z: V) -> T;
fn simd_scatter<T, U, V>(x: T, y: U, z: V) -> ();
}

#[rustc_intrinsic]
unsafe fn simd_gather<T, U, V>(x: T, y: U, z: V) -> T;

#[rustc_intrinsic]
unsafe fn simd_scatter<T, U, V>(x: T, y: U, z: V) -> ();

fn main() {
let mut x = [0_f32, 1., 2., 3., 4., 5., 6., 7.];
5 changes: 2 additions & 3 deletions tests/ui/simd/issue-89193.rs
Original file line number Diff line number Diff line change
@@ -10,9 +10,8 @@
#[derive(Copy, Clone, PartialEq, Debug)]
struct x4<T>(pub [T; 4]);

extern "rust-intrinsic" {
fn simd_gather<T, U, V>(x: T, y: U, z: V) -> T;
}
#[rustc_intrinsic]
unsafe fn simd_gather<T, U, V>(x: T, y: U, z: V) -> T;

fn main() {
let x: [usize; 4] = [10, 11, 12, 13];
10 changes: 6 additions & 4 deletions tests/ui/simd/masked-load-store-build-fail.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
//@ build-fail
#![feature(repr_simd, intrinsics)]

extern "rust-intrinsic" {
fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T;
fn simd_masked_store<M, P, T>(mask: M, pointer: P, values: T) -> ();
}

#[rustc_intrinsic]
unsafe fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_masked_store<M, P, T>(mask: M, pointer: P, values: T) -> ();

#[derive(Copy, Clone)]
#[repr(simd)]
16 changes: 8 additions & 8 deletions tests/ui/simd/masked-load-store-build-fail.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0511]: invalid monomorphization of `simd_masked_load` intrinsic: expected third argument with length 8 (same as input type `Simd<i8, 8>`), found `Simd<u8, 4>` with length 4
--> $DIR/masked-load-store-build-fail.rs:18:9
--> $DIR/masked-load-store-build-fail.rs:20:9
|
LL | / simd_masked_load(
LL | | Simd::<i8, 8>([-1, 0, -1, -1, 0, 0, 0, 0]),
@@ -9,7 +9,7 @@ LL | | );
| |_________^

error[E0511]: invalid monomorphization of `simd_masked_load` intrinsic: expected element type `u8` of second argument `*const i8` to be a pointer to the element type `u8` of the first argument `Simd<u8, 4>`, found `u8` != `*_ u8`
--> $DIR/masked-load-store-build-fail.rs:25:9
--> $DIR/masked-load-store-build-fail.rs:27:9
|
LL | / simd_masked_load(
LL | | Simd::<i8, 4>([-1, 0, -1, -1]),
@@ -19,7 +19,7 @@ LL | | );
| |_________^

error[E0511]: invalid monomorphization of `simd_masked_load` intrinsic: expected element type `u32` of second argument `*const u8` to be a pointer to the element type `u32` of the first argument `Simd<u32, 4>`, found `u32` != `*_ u32`
--> $DIR/masked-load-store-build-fail.rs:32:9
--> $DIR/masked-load-store-build-fail.rs:34:9
|
LL | / simd_masked_load(
LL | | Simd::<i8, 4>([-1, 0, -1, -1]),
@@ -29,7 +29,7 @@ LL | | );
| |_________^

error[E0511]: invalid monomorphization of `simd_masked_load` intrinsic: expected element type `u8` of third argument `Simd<u8, 4>` to be a signed integer type
--> $DIR/masked-load-store-build-fail.rs:39:9
--> $DIR/masked-load-store-build-fail.rs:41:9
|
LL | / simd_masked_load(
LL | | Simd::<u8, 4>([1, 0, 1, 1]),
@@ -39,7 +39,7 @@ LL | | );
| |_________^

error[E0511]: invalid monomorphization of `simd_masked_store` intrinsic: expected element type `u32` of second argument `*const u8` to be a pointer to the element type `u32` of the first argument `Simd<u32, 4>`, found `u32` != `*mut u32`
--> $DIR/masked-load-store-build-fail.rs:46:9
--> $DIR/masked-load-store-build-fail.rs:48:9
|
LL | / simd_masked_store(
LL | | Simd([-1i8; 4]),
@@ -49,7 +49,7 @@ LL | | );
| |_________^

error[E0511]: invalid monomorphization of `simd_masked_store` intrinsic: expected element type `u8` of second argument `*const u8` to be a pointer to the element type `u8` of the first argument `Simd<u8, 4>`, found `u8` != `*mut u8`
--> $DIR/masked-load-store-build-fail.rs:53:9
--> $DIR/masked-load-store-build-fail.rs:55:9
|
LL | / simd_masked_store(
LL | | Simd([-1i8; 4]),
@@ -59,7 +59,7 @@ LL | | );
| |_________^

error[E0511]: invalid monomorphization of `simd_masked_store` intrinsic: expected third argument with length 4 (same as input type `Simd<i8, 4>`), found `Simd<u8, 2>` with length 2
--> $DIR/masked-load-store-build-fail.rs:60:9
--> $DIR/masked-load-store-build-fail.rs:62:9
|
LL | / simd_masked_store(
LL | | Simd([-1i8; 4]),
@@ -69,7 +69,7 @@ LL | | );
| |_________^

error[E0511]: invalid monomorphization of `simd_masked_store` intrinsic: expected element type `u8` of third argument `Simd<u32, 4>` to be a signed integer type
--> $DIR/masked-load-store-build-fail.rs:67:9
--> $DIR/masked-load-store-build-fail.rs:69:9
|
LL | / simd_masked_store(
LL | | Simd([1u32; 4]),
9 changes: 5 additions & 4 deletions tests/ui/simd/masked-load-store-check-fail.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
//@ check-fail
#![feature(repr_simd, intrinsics)]

extern "rust-intrinsic" {
fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T;
fn simd_masked_store<M, P, T>(mask: M, pointer: P, values: T) -> ();
}
#[rustc_intrinsic]
unsafe fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_masked_store<M, P, T>(mask: M, pointer: P, values: T) -> ();

#[derive(Copy, Clone)]
#[repr(simd)]
20 changes: 10 additions & 10 deletions tests/ui/simd/masked-load-store-check-fail.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error[E0308]: mismatched types
--> $DIR/masked-load-store-check-fail.rs:21:13
--> $DIR/masked-load-store-check-fail.rs:22:13
|
LL | let _x: Simd<u8, 2> = simd_masked_load(
| ---------------- arguments to this function are incorrect
@@ -10,7 +10,7 @@ LL | Simd::<u8, 4>([9; 4])
= note: expected struct `Simd<_, 2>`
found struct `Simd<_, 4>`
help: the return type of this call is `Simd<u8, 4>` due to the type of the argument passed
--> $DIR/masked-load-store-check-fail.rs:18:31
--> $DIR/masked-load-store-check-fail.rs:19:31
|
LL | let _x: Simd<u8, 2> = simd_masked_load(
| _______________________________^
@@ -21,13 +21,13 @@ LL | | Simd::<u8, 4>([9; 4])
LL | | );
| |_________^
note: function defined here
--> $DIR/masked-load-store-check-fail.rs:5:8
--> $DIR/masked-load-store-check-fail.rs:5:11
|
LL | fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T;
| ^^^^^^^^^^^^^^^^
LL | unsafe fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T;
| ^^^^^^^^^^^^^^^^ ---------

error[E0308]: mismatched types
--> $DIR/masked-load-store-check-fail.rs:28:13
--> $DIR/masked-load-store-check-fail.rs:29:13
|
LL | let _x: Simd<u32, 4> = simd_masked_load(
| ---------------- arguments to this function are incorrect
@@ -38,7 +38,7 @@ LL | default
= note: expected struct `Simd<u32, _>`
found struct `Simd<u8, _>`
help: the return type of this call is `Simd<u8, 4>` due to the type of the argument passed
--> $DIR/masked-load-store-check-fail.rs:25:32
--> $DIR/masked-load-store-check-fail.rs:26:32
|
LL | let _x: Simd<u32, 4> = simd_masked_load(
| ________________________________^
@@ -49,10 +49,10 @@ LL | | default
LL | | );
| |_________^
note: function defined here
--> $DIR/masked-load-store-check-fail.rs:5:8
--> $DIR/masked-load-store-check-fail.rs:5:11
|
LL | fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T;
| ^^^^^^^^^^^^^^^^
LL | unsafe fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T;
| ^^^^^^^^^^^^^^^^ ---------

error: aborting due to 2 previous errors

9 changes: 5 additions & 4 deletions tests/ui/simd/masked-load-store.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
//@ run-pass
#![feature(repr_simd, intrinsics)]

extern "rust-intrinsic" {
fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T;
fn simd_masked_store<M, P, T>(mask: M, pointer: P, values: T) -> ();
}
#[rustc_intrinsic]
unsafe fn simd_masked_load<M, P, T>(mask: M, pointer: P, values: T) -> T;

#[rustc_intrinsic]
unsafe fn simd_masked_store<M, P, T>(mask: M, pointer: P, values: T) -> ();

#[derive(Copy, Clone)]
#[repr(simd)]
2 changes: 1 addition & 1 deletion tests/ui/simd/monomorphize-shuffle-index.generic.stderr
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: overly complex generic constant
--> $DIR/monomorphize-shuffle-index.rs:29:45
--> $DIR/monomorphize-shuffle-index.rs:32:45
|
LL | return simd_shuffle_generic::<_, _, { &Self::I.0 }>(a, b);
| ^^----------^^
15 changes: 9 additions & 6 deletions tests/ui/simd/monomorphize-shuffle-index.rs
Original file line number Diff line number Diff line change
@@ -4,12 +4,15 @@
#![feature(repr_simd, intrinsics, adt_const_params, unsized_const_params, generic_const_exprs)]
#![allow(incomplete_features)]

extern "rust-intrinsic" {
#[cfg(old)]
fn simd_shuffle<T, I, U>(a: T, b: T, i: I) -> U;
#[cfg(any(generic, generic_with_fn))]
fn simd_shuffle_generic<T, U, const I: &'static [u32]>(a: T, b: T) -> U;
}

#[rustc_intrinsic]
#[cfg(old)]
unsafe fn simd_shuffle<T, I, U>(a: T, b: T, i: I) -> U;

#[rustc_intrinsic]
#[cfg(any(generic, generic_with_fn))]
unsafe fn simd_shuffle_generic<T, U, const I: &'static [u32]>(a: T, b: T) -> U;


#[derive(Copy, Clone)]
#[repr(simd)]
5 changes: 2 additions & 3 deletions tests/ui/simd/repr_packed.rs
Original file line number Diff line number Diff line change
@@ -22,9 +22,8 @@ fn check_ty<T>() {
check_size_align::<T, 15>();
}

extern "rust-intrinsic" {
fn simd_add<T>(a: T, b: T) -> T;
}
#[rustc_intrinsic]
unsafe fn simd_add<T>(a: T, b: T) -> T;

fn main() {
check_ty::<u8>();
5 changes: 2 additions & 3 deletions tests/ui/simd/shuffle.rs
Original file line number Diff line number Diff line change
@@ -8,9 +8,8 @@

use std::marker::ConstParamTy;

extern "rust-intrinsic" {
fn simd_shuffle<T, I, U>(a: T, b: T, i: I) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_shuffle<T, I, U>(a: T, b: T, i: I) -> U;

#[derive(Copy, Clone, ConstParamTy, PartialEq, Eq)]
#[repr(simd)]
10 changes: 6 additions & 4 deletions tests/ui/simd/simd-bitmask-notpow2.rs
Original file line number Diff line number Diff line change
@@ -4,10 +4,12 @@
//@ ignore-endian-big
#![feature(repr_simd, intrinsics)]

extern "rust-intrinsic" {
fn simd_bitmask<T, U>(v: T) -> U;
fn simd_select_bitmask<T, U>(m: T, a: U, b: U) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_bitmask<T, U>(v: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_select_bitmask<T, U>(m: T, a: U, b: U) -> U;


fn main() {
// Non-power-of-2 multi-byte mask.
10 changes: 6 additions & 4 deletions tests/ui/simd/simd-bitmask.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
//@run-pass
#![feature(repr_simd, intrinsics)]

extern "rust-intrinsic" {
fn simd_bitmask<T, U>(v: T) -> U;
fn simd_select_bitmask<T, U>(m: T, a: U, b: U) -> U;
}
#[rustc_intrinsic]
unsafe fn simd_bitmask<T, U>(v: T) -> U;

#[rustc_intrinsic]
unsafe fn simd_select_bitmask<T, U>(m: T, a: U, b: U) -> U;


#[derive(Copy, Clone)]
#[repr(simd)]