mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-01 09:33:26 +00:00
Auto merge of #118687 - matthiaskrgr:rollup-317ztgu, r=matthiaskrgr
Rollup of 6 pull requests Successful merges: - #117981 (Remove deprecated `--check-cfg` syntax) - #118177 (Suppress warnings in LLVM wrapper when targeting MSVC) - #118317 (tip for define macro name after `macro_rules!`) - #118504 (Enforce `must_use` on associated types and RPITITs that have a must-use trait in bounds) - #118660 (rustc_arena: add `alloc_str`) - #118681 (Fix is_foreign_item for StableMIR instance ) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
8235469e48
@ -484,6 +484,20 @@ impl DroplessArena {
|
||||
}
|
||||
}
|
||||
|
||||
/// Allocates a string slice that is copied into the `DroplessArena`, returning a
|
||||
/// reference to it. Will panic if passed an empty string.
|
||||
///
|
||||
/// Panics:
|
||||
///
|
||||
/// - Zero-length string
|
||||
#[inline]
|
||||
pub fn alloc_str(&self, string: &str) -> &str {
|
||||
let slice = self.alloc_slice(string.as_bytes());
|
||||
|
||||
// SAFETY: the result has a copy of the same valid UTF-8 bytes.
|
||||
unsafe { std::str::from_utf8_unchecked(slice) }
|
||||
}
|
||||
|
||||
/// # Safety
|
||||
///
|
||||
/// The caller must ensure that `mem` is valid for writes up to `size_of::<T>() * len`, and that
|
||||
@ -655,6 +669,14 @@ pub macro declare_arena([$($a:tt $name:ident: $ty:ty,)*]) {
|
||||
self.dropless.alloc_slice(value)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn alloc_str(&self, string: &str) -> &str {
|
||||
if string.is_empty() {
|
||||
return "";
|
||||
}
|
||||
self.dropless.alloc_str(string)
|
||||
}
|
||||
|
||||
#[allow(clippy::mut_from_ref)]
|
||||
pub fn alloc_from_iter<T: ArenaAllocatable<'tcx, C>, C>(
|
||||
&self,
|
||||
|
@ -10,8 +10,8 @@ use rustc_data_structures::sync::Lrc;
|
||||
use rustc_errors::registry::Registry;
|
||||
use rustc_errors::{ErrorGuaranteed, Handler};
|
||||
use rustc_lint::LintStore;
|
||||
use rustc_middle::ty;
|
||||
use rustc_middle::util::Providers;
|
||||
use rustc_middle::{bug, ty};
|
||||
use rustc_parse::maybe_new_parser_from_source_str;
|
||||
use rustc_query_impl::QueryCtxt;
|
||||
use rustc_query_system::query::print_query_stack;
|
||||
@ -104,7 +104,6 @@ pub(crate) fn parse_check_cfg(handler: &EarlyErrorHandler, specs: Vec<String>) -
|
||||
let exhaustive_values = !specs.is_empty();
|
||||
let mut check_cfg = CheckCfg { exhaustive_names, exhaustive_values, ..CheckCfg::default() };
|
||||
|
||||
let mut old_syntax = None;
|
||||
for s in specs {
|
||||
let sess = ParseSess::with_silent_emitter(Some(format!(
|
||||
"this error occurred on the command line: `--check-cfg={s}`"
|
||||
@ -142,174 +141,101 @@ pub(crate) fn parse_check_cfg(handler: &EarlyErrorHandler, specs: Vec<String>) -
|
||||
expected_error();
|
||||
};
|
||||
|
||||
let mut set_old_syntax = || {
|
||||
// defaults are flipped for the old syntax
|
||||
if old_syntax == None {
|
||||
if !meta_item.has_name(sym::cfg) {
|
||||
expected_error();
|
||||
}
|
||||
|
||||
let mut names = Vec::new();
|
||||
let mut values: FxHashSet<_> = Default::default();
|
||||
|
||||
let mut any_specified = false;
|
||||
let mut values_specified = false;
|
||||
let mut values_any_specified = false;
|
||||
|
||||
for arg in args {
|
||||
if arg.is_word()
|
||||
&& let Some(ident) = arg.ident()
|
||||
{
|
||||
if values_specified {
|
||||
error!("`cfg()` names cannot be after values");
|
||||
}
|
||||
names.push(ident);
|
||||
} else if arg.has_name(sym::any)
|
||||
&& let Some(args) = arg.meta_item_list()
|
||||
{
|
||||
if any_specified {
|
||||
error!("`any()` cannot be specified multiple times");
|
||||
}
|
||||
any_specified = true;
|
||||
if !args.is_empty() {
|
||||
error!("`any()` must be empty");
|
||||
}
|
||||
} else if arg.has_name(sym::values)
|
||||
&& let Some(args) = arg.meta_item_list()
|
||||
{
|
||||
if names.is_empty() {
|
||||
error!("`values()` cannot be specified before the names");
|
||||
} else if values_specified {
|
||||
error!("`values()` cannot be specified multiple times");
|
||||
}
|
||||
values_specified = true;
|
||||
|
||||
for arg in args {
|
||||
if let Some(LitKind::Str(s, _)) = arg.lit().map(|lit| &lit.kind) {
|
||||
values.insert(Some(*s));
|
||||
} else if arg.has_name(sym::any)
|
||||
&& let Some(args) = arg.meta_item_list()
|
||||
{
|
||||
if values_any_specified {
|
||||
error!("`any()` in `values()` cannot be specified multiple times");
|
||||
}
|
||||
values_any_specified = true;
|
||||
if !args.is_empty() {
|
||||
error!("`any()` must be empty");
|
||||
}
|
||||
} else {
|
||||
error!("`values()` arguments must be string literals or `any()`");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
error!("`cfg()` arguments must be simple identifiers, `any()` or `values(...)`");
|
||||
}
|
||||
}
|
||||
|
||||
if values.is_empty() && !values_any_specified && !any_specified {
|
||||
values.insert(None);
|
||||
} else if !values.is_empty() && values_any_specified {
|
||||
error!(
|
||||
"`values()` arguments cannot specify string literals and `any()` at the same time"
|
||||
);
|
||||
}
|
||||
|
||||
if any_specified {
|
||||
if names.is_empty() && values.is_empty() && !values_specified && !values_any_specified {
|
||||
check_cfg.exhaustive_names = false;
|
||||
check_cfg.exhaustive_values = false;
|
||||
}
|
||||
old_syntax = Some(true);
|
||||
};
|
||||
|
||||
if meta_item.has_name(sym::names) {
|
||||
set_old_syntax();
|
||||
|
||||
check_cfg.exhaustive_names = true;
|
||||
for arg in args {
|
||||
if arg.is_word()
|
||||
&& let Some(ident) = arg.ident()
|
||||
{
|
||||
check_cfg.expecteds.entry(ident.name).or_insert(ExpectedValues::Any);
|
||||
} else {
|
||||
error!("`names()` arguments must be simple identifiers");
|
||||
}
|
||||
}
|
||||
} else if meta_item.has_name(sym::values) {
|
||||
set_old_syntax();
|
||||
|
||||
if let Some((name, values)) = args.split_first() {
|
||||
if name.is_word()
|
||||
&& let Some(ident) = name.ident()
|
||||
{
|
||||
let expected_values = check_cfg
|
||||
.expecteds
|
||||
.entry(ident.name)
|
||||
.and_modify(|expected_values| match expected_values {
|
||||
ExpectedValues::Some(_) => {}
|
||||
ExpectedValues::Any => {
|
||||
// handle the case where names(...) was done
|
||||
// before values by changing to a list
|
||||
*expected_values = ExpectedValues::Some(FxHashSet::default());
|
||||
}
|
||||
})
|
||||
.or_insert_with(|| ExpectedValues::Some(FxHashSet::default()));
|
||||
|
||||
let ExpectedValues::Some(expected_values) = expected_values else {
|
||||
bug!("`expected_values` should be a list a values")
|
||||
};
|
||||
|
||||
for val in values {
|
||||
if let Some(LitKind::Str(s, _)) = val.lit().map(|lit| &lit.kind) {
|
||||
expected_values.insert(Some(*s));
|
||||
} else {
|
||||
error!("`values()` arguments must be string literals");
|
||||
}
|
||||
}
|
||||
|
||||
if values.is_empty() {
|
||||
expected_values.insert(None);
|
||||
}
|
||||
} else {
|
||||
error!("`values()` first argument must be a simple identifier");
|
||||
}
|
||||
} else if args.is_empty() {
|
||||
check_cfg.exhaustive_values = true;
|
||||
} else {
|
||||
expected_error();
|
||||
}
|
||||
} else if meta_item.has_name(sym::cfg) {
|
||||
old_syntax = Some(false);
|
||||
|
||||
let mut names = Vec::new();
|
||||
let mut values: FxHashSet<_> = Default::default();
|
||||
|
||||
let mut any_specified = false;
|
||||
let mut values_specified = false;
|
||||
let mut values_any_specified = false;
|
||||
|
||||
for arg in args {
|
||||
if arg.is_word()
|
||||
&& let Some(ident) = arg.ident()
|
||||
{
|
||||
if values_specified {
|
||||
error!("`cfg()` names cannot be after values");
|
||||
}
|
||||
names.push(ident);
|
||||
} else if arg.has_name(sym::any)
|
||||
&& let Some(args) = arg.meta_item_list()
|
||||
{
|
||||
if any_specified {
|
||||
error!("`any()` cannot be specified multiple times");
|
||||
}
|
||||
any_specified = true;
|
||||
if !args.is_empty() {
|
||||
error!("`any()` must be empty");
|
||||
}
|
||||
} else if arg.has_name(sym::values)
|
||||
&& let Some(args) = arg.meta_item_list()
|
||||
{
|
||||
if names.is_empty() {
|
||||
error!("`values()` cannot be specified before the names");
|
||||
} else if values_specified {
|
||||
error!("`values()` cannot be specified multiple times");
|
||||
}
|
||||
values_specified = true;
|
||||
|
||||
for arg in args {
|
||||
if let Some(LitKind::Str(s, _)) = arg.lit().map(|lit| &lit.kind) {
|
||||
values.insert(Some(*s));
|
||||
} else if arg.has_name(sym::any)
|
||||
&& let Some(args) = arg.meta_item_list()
|
||||
{
|
||||
if values_any_specified {
|
||||
error!("`any()` in `values()` cannot be specified multiple times");
|
||||
}
|
||||
values_any_specified = true;
|
||||
if !args.is_empty() {
|
||||
error!("`any()` must be empty");
|
||||
}
|
||||
} else {
|
||||
error!("`values()` arguments must be string literals or `any()`");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
error!(
|
||||
"`cfg()` arguments must be simple identifiers, `any()` or `values(...)`"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if values.is_empty() && !values_any_specified && !any_specified {
|
||||
values.insert(None);
|
||||
} else if !values.is_empty() && values_any_specified {
|
||||
error!(
|
||||
"`values()` arguments cannot specify string literals and `any()` at the same time"
|
||||
);
|
||||
}
|
||||
|
||||
if any_specified {
|
||||
if names.is_empty()
|
||||
&& values.is_empty()
|
||||
&& !values_specified
|
||||
&& !values_any_specified
|
||||
{
|
||||
check_cfg.exhaustive_names = false;
|
||||
} else {
|
||||
error!("`cfg(any())` can only be provided in isolation");
|
||||
}
|
||||
} else {
|
||||
for name in names {
|
||||
check_cfg
|
||||
.expecteds
|
||||
.entry(name.name)
|
||||
.and_modify(|v| match v {
|
||||
ExpectedValues::Some(v) if !values_any_specified => {
|
||||
v.extend(values.clone())
|
||||
}
|
||||
ExpectedValues::Some(_) => *v = ExpectedValues::Any,
|
||||
ExpectedValues::Any => {}
|
||||
})
|
||||
.or_insert_with(|| {
|
||||
if values_any_specified {
|
||||
ExpectedValues::Any
|
||||
} else {
|
||||
ExpectedValues::Some(values.clone())
|
||||
}
|
||||
});
|
||||
}
|
||||
error!("`cfg(any())` can only be provided in isolation");
|
||||
}
|
||||
} else {
|
||||
expected_error();
|
||||
for name in names {
|
||||
check_cfg
|
||||
.expecteds
|
||||
.entry(name.name)
|
||||
.and_modify(|v| match v {
|
||||
ExpectedValues::Some(v) if !values_any_specified => {
|
||||
v.extend(values.clone())
|
||||
}
|
||||
ExpectedValues::Some(_) => *v = ExpectedValues::Any,
|
||||
ExpectedValues::Any => {}
|
||||
})
|
||||
.or_insert_with(|| {
|
||||
if values_any_specified {
|
||||
ExpectedValues::Any
|
||||
} else {
|
||||
ExpectedValues::Some(values.clone())
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -291,7 +291,7 @@ impl<'tcx> LateLintPass<'tcx> for UnusedResults {
|
||||
.map(|inner| MustUsePath::Pinned(Box::new(inner)))
|
||||
}
|
||||
ty::Adt(def, _) => is_def_must_use(cx, def.did(), span),
|
||||
ty::Alias(ty::Opaque, ty::AliasTy { def_id: def, .. }) => {
|
||||
ty::Alias(ty::Opaque | ty::Projection, ty::AliasTy { def_id: def, .. }) => {
|
||||
elaborate(
|
||||
cx.tcx,
|
||||
cx.tcx.explicit_item_bounds(def).instantiate_identity_iter_copied(),
|
||||
|
@ -3135,7 +3135,7 @@ declare_lint! {
|
||||
/// ### Example
|
||||
///
|
||||
/// ```text
|
||||
/// rustc --check-cfg 'names()'
|
||||
/// rustc --check-cfg 'cfg()'
|
||||
/// ```
|
||||
///
|
||||
/// ```rust,ignore (needs command line option)
|
||||
@ -3146,7 +3146,7 @@ declare_lint! {
|
||||
/// This will produce:
|
||||
///
|
||||
/// ```text
|
||||
/// warning: unknown condition name used
|
||||
/// warning: unexpected `cfg` condition name: `widnows`
|
||||
/// --> lint_example.rs:1:7
|
||||
/// |
|
||||
/// 1 | #[cfg(widnows)]
|
||||
@ -3157,9 +3157,10 @@ declare_lint! {
|
||||
///
|
||||
/// ### Explanation
|
||||
///
|
||||
/// This lint is only active when a `--check-cfg='names(...)'` option has been passed
|
||||
/// to the compiler and triggers whenever an unknown condition name or value is used.
|
||||
/// The known condition include names or values passed in `--check-cfg`, `--cfg`, and some
|
||||
/// This lint is only active when `--check-cfg` arguments are being passed
|
||||
/// to the compiler and triggers whenever an unexpected condition name or value is used.
|
||||
///
|
||||
/// The known condition include names or values passed in `--check-cfg`, and some
|
||||
/// well-knows names and values built into the compiler.
|
||||
pub UNEXPECTED_CFGS,
|
||||
Warn,
|
||||
|
@ -102,7 +102,7 @@ fn output(cmd: &mut Command) -> String {
|
||||
|
||||
fn main() {
|
||||
for component in REQUIRED_COMPONENTS.iter().chain(OPTIONAL_COMPONENTS.iter()) {
|
||||
println!("cargo:rustc-check-cfg=values(llvm_component,\"{component}\")");
|
||||
println!("cargo:rustc-check-cfg=cfg(llvm_component,values(\"{component}\"))");
|
||||
}
|
||||
|
||||
if tracked_env_var_os("RUST_CHECK").is_some() {
|
||||
|
@ -1,3 +1,5 @@
|
||||
#include "SuppressLLVMWarnings.h"
|
||||
|
||||
#include "llvm-c/BitReader.h"
|
||||
#include "llvm-c/Core.h"
|
||||
#include "llvm-c/Object.h"
|
||||
|
@ -1,3 +1,4 @@
|
||||
#include "SuppressLLVMWarnings.h"
|
||||
#include "llvm/Linker/Linker.h"
|
||||
|
||||
#include "LLVMWrapper.h"
|
||||
|
13
compiler/rustc_llvm/llvm-wrapper/SuppressLLVMWarnings.h
Normal file
13
compiler/rustc_llvm/llvm-wrapper/SuppressLLVMWarnings.h
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef _rustc_llvm_SuppressLLVMWarnings_h
|
||||
#define _rustc_llvm_SuppressLLVMWarnings_h
|
||||
|
||||
// LLVM currently generates many warnings when compiled using MSVC. These warnings make it difficult
|
||||
// to diagnose real problems when working on C++ code, so we suppress them.
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable:4530) // C++ exception handler used, but unwind semantics are not enabled.
|
||||
#pragma warning(disable:4624) // 'xxx': destructor was implicitly defined as deleted
|
||||
#pragma warning(disable:4244) // conversion from 'xxx' to 'yyy', possible loss of data
|
||||
#endif
|
||||
|
||||
#endif // _rustc_llvm_SuppressLLVMWarnings_h
|
@ -7,6 +7,7 @@
|
||||
// * https://github.com/llvm/llvm-project/blob/8ef3e895ad8ab1724e2b87cabad1dacdc7a397a3/llvm/include/llvm/Object/ArchiveWriter.h
|
||||
// * https://github.com/llvm/llvm-project/blob/8ef3e895ad8ab1724e2b87cabad1dacdc7a397a3/llvm/lib/Object/ArchiveWriter.cpp
|
||||
|
||||
#include "SuppressLLVMWarnings.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/Object/ObjectFile.h"
|
||||
|
@ -2614,9 +2614,7 @@ pub struct SymbolName<'tcx> {
|
||||
|
||||
impl<'tcx> SymbolName<'tcx> {
|
||||
pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
|
||||
SymbolName {
|
||||
name: unsafe { str::from_utf8_unchecked(tcx.arena.alloc_slice(name.as_bytes())) },
|
||||
}
|
||||
SymbolName { name: tcx.arena.alloc_str(name) }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -181,6 +181,8 @@ resolve_method_not_member_of_trait =
|
||||
method `{$method}` is not a member of trait `{$trait_}`
|
||||
.label = not a member of trait `{$trait_}`
|
||||
|
||||
resolve_missing_macro_rules_name = maybe you have forgotten to define a name for this `macro_rules!`
|
||||
|
||||
resolve_module_only =
|
||||
visibility must resolve to a module
|
||||
|
||||
|
@ -27,10 +27,8 @@ use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
use rustc_span::{BytePos, Span, SyntaxContext};
|
||||
use thin_vec::{thin_vec, ThinVec};
|
||||
|
||||
use crate::errors::{
|
||||
AddedMacroUse, ChangeImportBinding, ChangeImportBindingSuggestion, ConsiderAddingADerive,
|
||||
ExplicitUnsafeTraits,
|
||||
};
|
||||
use crate::errors::{AddedMacroUse, ChangeImportBinding, ChangeImportBindingSuggestion};
|
||||
use crate::errors::{ConsiderAddingADerive, ExplicitUnsafeTraits, MaybeMissingMacroRulesName};
|
||||
use crate::imports::{Import, ImportKind};
|
||||
use crate::late::{PatternSource, Rib};
|
||||
use crate::path_names_to_string;
|
||||
@ -1421,14 +1419,21 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||
"",
|
||||
);
|
||||
|
||||
if macro_kind == MacroKind::Bang && ident.name == sym::macro_rules {
|
||||
err.subdiagnostic(MaybeMissingMacroRulesName { span: ident.span });
|
||||
return;
|
||||
}
|
||||
|
||||
if macro_kind == MacroKind::Derive && (ident.name == sym::Send || ident.name == sym::Sync) {
|
||||
err.subdiagnostic(ExplicitUnsafeTraits { span: ident.span, ident });
|
||||
return;
|
||||
}
|
||||
|
||||
if self.macro_names.contains(&ident.normalize_to_macros_2_0()) {
|
||||
err.subdiagnostic(AddedMacroUse);
|
||||
return;
|
||||
}
|
||||
|
||||
if ident.name == kw::Default
|
||||
&& let ModuleKind::Def(DefKind::Enum, def_id, _) = parent_scope.module.kind
|
||||
{
|
||||
|
@ -665,6 +665,13 @@ pub(crate) struct ExplicitUnsafeTraits {
|
||||
pub(crate) ident: Ident,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[note(resolve_missing_macro_rules_name)]
|
||||
pub(crate) struct MaybeMissingMacroRulesName {
|
||||
#[primary_span]
|
||||
pub(crate) span: Span,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[help(resolve_added_macro_use)]
|
||||
pub(crate) struct AddedMacroUse;
|
||||
|
@ -187,9 +187,9 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
|
||||
new_item_kind(tables.tcx.def_kind(tables[item.0]))
|
||||
}
|
||||
|
||||
fn is_foreign_item(&self, item: CrateItem) -> bool {
|
||||
fn is_foreign_item(&self, item: DefId) -> bool {
|
||||
let tables = self.0.borrow();
|
||||
tables.tcx.is_foreign_item(tables[item.0])
|
||||
tables.tcx.is_foreign_item(tables[item])
|
||||
}
|
||||
|
||||
fn adt_kind(&self, def: AdtDef) -> AdtKind {
|
||||
|
@ -2119,11 +2119,7 @@ impl Interner {
|
||||
return Symbol::new(idx as u32);
|
||||
}
|
||||
|
||||
// SAFETY: we convert from `&str` to `&[u8]`, clone it into the arena,
|
||||
// and immediately convert the clone back to `&[u8]`, all because there
|
||||
// is no `inner.arena.alloc_str()` method. This is clearly safe.
|
||||
let string: &str =
|
||||
unsafe { str::from_utf8_unchecked(inner.arena.alloc_slice(string.as_bytes())) };
|
||||
let string: &str = inner.arena.alloc_str(string);
|
||||
|
||||
// SAFETY: we can extend the arena allocation to `'static` because we
|
||||
// only access these while the arena is still alive.
|
||||
|
@ -60,7 +60,7 @@ pub trait Context {
|
||||
fn item_kind(&self, item: CrateItem) -> ItemKind;
|
||||
|
||||
/// Returns whether this is a foreign item.
|
||||
fn is_foreign_item(&self, item: CrateItem) -> bool;
|
||||
fn is_foreign_item(&self, item: DefId) -> bool;
|
||||
|
||||
/// Returns the kind of a given algebraic data type
|
||||
fn adt_kind(&self, def: AdtDef) -> AdtKind;
|
||||
|
@ -120,7 +120,7 @@ impl CrateItem {
|
||||
}
|
||||
|
||||
pub fn is_foreign_item(&self) -> bool {
|
||||
with(|cx| cx.is_foreign_item(*self))
|
||||
with(|cx| cx.is_foreign_item(self.0))
|
||||
}
|
||||
|
||||
pub fn dump<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
|
||||
|
@ -39,9 +39,16 @@ impl Instance {
|
||||
with(|context| context.instance_body(self.def))
|
||||
}
|
||||
|
||||
/// Check whether this instance has a body available.
|
||||
///
|
||||
/// This call is much cheaper than `instance.body().is_some()`, since it doesn't try to build
|
||||
/// the StableMIR body.
|
||||
pub fn has_body(&self) -> bool {
|
||||
with(|cx| cx.has_body(self.def.def_id()))
|
||||
}
|
||||
|
||||
pub fn is_foreign_item(&self) -> bool {
|
||||
let item = CrateItem::try_from(*self);
|
||||
item.as_ref().is_ok_and(CrateItem::is_foreign_item)
|
||||
with(|cx| cx.is_foreign_item(self.def.def_id()))
|
||||
}
|
||||
|
||||
/// Get the instance type with generic substitutions applied and lifetimes erased.
|
||||
|
@ -370,9 +370,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.149"
|
||||
version = "0.2.150"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
|
||||
checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
|
||||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
|
@ -42,7 +42,7 @@ filetime = "0.2"
|
||||
hex = "0.4"
|
||||
home = "0.5.4"
|
||||
ignore = "0.4.10"
|
||||
libc = "0.2"
|
||||
libc = "0.2.150"
|
||||
object = { version = "0.32.0", default-features = false, features = ["archive", "coff", "read_core", "unaligned"] }
|
||||
once_cell = "1.7.2"
|
||||
opener = "0.5"
|
||||
|
@ -190,70 +190,3 @@ fn shoot_lasers() {}
|
||||
// the cfg(feature) list
|
||||
fn write_shakespeare() {}
|
||||
```
|
||||
|
||||
## The deprecated `names(...)` form
|
||||
|
||||
The `names(...)` form enables checking the names. This form uses a named list:
|
||||
|
||||
```bash
|
||||
rustc --check-cfg 'names(name1, name2, ... nameN)'
|
||||
```
|
||||
|
||||
where each `name` is a bare identifier (has no quotes). The order of the names is not significant.
|
||||
|
||||
If `--check-cfg names(...)` is specified at least once, then `rustc` will check all references to
|
||||
condition names. `rustc` will check every `#[cfg]` attribute, `#[cfg_attr]` attribute, `cfg` clause
|
||||
inside `#[link]` attribute and `cfg!(...)` call against the provided list of expected condition
|
||||
names. If a name is not present in this list, then `rustc` will report an `unexpected_cfgs` lint
|
||||
diagnostic. The default diagnostic level for this lint is `Warn`.
|
||||
|
||||
If `--check-cfg names(...)` is not specified, then `rustc` will not check references to condition
|
||||
names.
|
||||
|
||||
`--check-cfg names(...)` may be specified more than once. The result is that the list of valid
|
||||
condition names is merged across all options. It is legal for a condition name to be specified
|
||||
more than once; redundantly specifying a condition name has no effect.
|
||||
|
||||
To enable checking condition names with an empty set of valid condition names, use the following
|
||||
form. The parentheses are required.
|
||||
|
||||
```bash
|
||||
rustc --check-cfg 'names()'
|
||||
```
|
||||
|
||||
Note that `--check-cfg 'names()'` is _not_ equivalent to omitting the option entirely.
|
||||
The first form enables checking condition names, while specifying that there are no valid
|
||||
condition names (outside of the set of well-known names defined by `rustc`). Omitting the
|
||||
`--check-cfg 'names(...)'` option does not enable checking condition names.
|
||||
|
||||
## The deprecated `values(...)` form
|
||||
|
||||
The `values(...)` form enables checking the values within list-valued conditions. It has this
|
||||
form:
|
||||
|
||||
```bash
|
||||
rustc --check-cfg `values(name, "value1", "value2", ... "valueN")'
|
||||
```
|
||||
|
||||
where `name` is a bare identifier (has no quotes) and each `"value"` term is a quoted literal
|
||||
string. `name` specifies the name of the condition, such as `feature` or `target_os`.
|
||||
|
||||
When the `values(...)` option is specified, `rustc` will check every `#[cfg(name = "value")]`
|
||||
attribute, `#[cfg_attr(name = "value")]` attribute, `#[link(name = "a", cfg(name = "value"))]`
|
||||
and `cfg!(name = "value")` call. It will check that the `"value"` specified is present in the
|
||||
list of expected values. If `"value"` is not in it, then `rustc` will report an `unexpected_cfgs`
|
||||
lint diagnostic. The default diagnostic level for this lint is `Warn`.
|
||||
|
||||
To enable checking of values, but to provide an empty set of valid values, use this form:
|
||||
|
||||
```bash
|
||||
rustc --check-cfg `values(name)`
|
||||
```
|
||||
|
||||
The `--check-cfg values(...)` option can be repeated, both for the same condition name and for
|
||||
different names. If it is repeated for the same condition name, then the sets of values for that
|
||||
condition are merged together.
|
||||
|
||||
If `values()` is specified, then `rustc` will enable the checking of well-known values defined
|
||||
by itself. Note that it's necessary to specify the `values()` form to enable the checking of
|
||||
well known values, specifying the other forms doesn't implicitly enable it.
|
||||
|
@ -64,8 +64,12 @@ fn test_body(body: mir::Body) {
|
||||
let RigidTy::FnDef(def, args) = ty else { unreachable!() };
|
||||
let instance = Instance::resolve(def, &args).unwrap();
|
||||
let mangled_name = instance.mangled_name();
|
||||
let body = instance.body();
|
||||
assert!(body.is_some() || mangled_name == "setpwent", "Failed: {func:?}");
|
||||
assert!(instance.has_body() || (mangled_name == "setpwent"), "Failed: {func:?}");
|
||||
assert!(instance.has_body() ^ instance.is_foreign_item());
|
||||
if instance.has_body() {
|
||||
let body = instance.body().unwrap();
|
||||
assert!(!body.locals().is_empty(), "Body must at least have a return local");
|
||||
}
|
||||
}
|
||||
Goto { .. } | Assert { .. } | SwitchInt { .. } | Return | Drop { .. } => {
|
||||
/* Do nothing */
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition name: `unknown_key`
|
||||
--> $DIR/exhaustive-names-values.rs:11:7
|
||||
--> $DIR/exhaustive-names-values.rs:10:7
|
||||
|
|
||||
LL | #[cfg(unknown_key = "value")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -8,7 +8,7 @@ LL | #[cfg(unknown_key = "value")]
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: unexpected `cfg` condition value: `value`
|
||||
--> $DIR/exhaustive-names-values.rs:15:7
|
||||
--> $DIR/exhaustive-names-values.rs:14:7
|
||||
|
|
||||
LL | #[cfg(test = "value")]
|
||||
| ^^^^----------
|
||||
@ -18,13 +18,13 @@ LL | #[cfg(test = "value")]
|
||||
= note: no expected value for `test`
|
||||
|
||||
warning: unexpected `cfg` condition name: `feature`
|
||||
--> $DIR/exhaustive-names-values.rs:19:7
|
||||
--> $DIR/exhaustive-names-values.rs:18:7
|
||||
|
|
||||
LL | #[cfg(feature = "unk")]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unexpected `cfg` condition name: `feature`
|
||||
--> $DIR/exhaustive-names-values.rs:26:7
|
||||
--> $DIR/exhaustive-names-values.rs:25:7
|
||||
|
|
||||
LL | #[cfg(feature = "std")]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition name: `unknown_key`
|
||||
--> $DIR/exhaustive-names-values.rs:11:7
|
||||
--> $DIR/exhaustive-names-values.rs:10:7
|
||||
|
|
||||
LL | #[cfg(unknown_key = "value")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -8,7 +8,7 @@ LL | #[cfg(unknown_key = "value")]
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: unexpected `cfg` condition value: `value`
|
||||
--> $DIR/exhaustive-names-values.rs:15:7
|
||||
--> $DIR/exhaustive-names-values.rs:14:7
|
||||
|
|
||||
LL | #[cfg(test = "value")]
|
||||
| ^^^^----------
|
||||
@ -18,7 +18,7 @@ LL | #[cfg(test = "value")]
|
||||
= note: no expected value for `test`
|
||||
|
||||
warning: unexpected `cfg` condition value: `unk`
|
||||
--> $DIR/exhaustive-names-values.rs:19:7
|
||||
--> $DIR/exhaustive-names-values.rs:18:7
|
||||
|
|
||||
LL | #[cfg(feature = "unk")]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition name: `unknown_key`
|
||||
--> $DIR/exhaustive-names-values.rs:11:7
|
||||
--> $DIR/exhaustive-names-values.rs:10:7
|
||||
|
|
||||
LL | #[cfg(unknown_key = "value")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -8,7 +8,7 @@ LL | #[cfg(unknown_key = "value")]
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: unexpected `cfg` condition value: `value`
|
||||
--> $DIR/exhaustive-names-values.rs:15:7
|
||||
--> $DIR/exhaustive-names-values.rs:14:7
|
||||
|
|
||||
LL | #[cfg(test = "value")]
|
||||
| ^^^^----------
|
||||
@ -18,7 +18,7 @@ LL | #[cfg(test = "value")]
|
||||
= note: no expected value for `test`
|
||||
|
||||
warning: unexpected `cfg` condition value: `unk`
|
||||
--> $DIR/exhaustive-names-values.rs:19:7
|
||||
--> $DIR/exhaustive-names-values.rs:18:7
|
||||
|
|
||||
LL | #[cfg(feature = "unk")]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
@ -1,9 +1,8 @@
|
||||
// Check warning for unexpected cfg in the code.
|
||||
//
|
||||
// check-pass
|
||||
// revisions: empty_names_values empty_cfg feature full
|
||||
// revisions: empty_cfg feature full
|
||||
// compile-flags: -Z unstable-options
|
||||
// [empty_names_values]compile-flags: --check-cfg=names() --check-cfg=values()
|
||||
// [empty_cfg]compile-flags: --check-cfg=cfg()
|
||||
// [feature]compile-flags: --check-cfg=cfg(feature,values("std"))
|
||||
// [full]compile-flags: --check-cfg=cfg(feature,values("std")) --check-cfg=cfg()
|
||||
|
@ -1,9 +1,7 @@
|
||||
// Check warning for unexpected cfg
|
||||
//
|
||||
// check-pass
|
||||
// revisions: empty_names exhaustive_names
|
||||
// [empty_names]compile-flags: --check-cfg=names() -Z unstable-options
|
||||
// [exhaustive_names]compile-flags: --check-cfg=cfg() -Z unstable-options
|
||||
// compile-flags: --check-cfg=cfg() -Z unstable-options
|
||||
|
||||
#[cfg(unknown_key = "value")]
|
||||
//~^ WARNING unexpected `cfg` condition name
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition name: `unknown_key`
|
||||
--> $DIR/exhaustive-names.rs:8:7
|
||||
--> $DIR/exhaustive-names.rs:6:7
|
||||
|
|
||||
LL | #[cfg(unknown_key = "value")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition value: `value`
|
||||
--> $DIR/exhaustive-values.rs:9:7
|
||||
--> $DIR/exhaustive-values.rs:8:7
|
||||
|
|
||||
LL | #[cfg(test = "value")]
|
||||
| ^^^^----------
|
||||
|
@ -1,13 +0,0 @@
|
||||
warning: unexpected `cfg` condition value: `value`
|
||||
--> $DIR/exhaustive-values.rs:9:7
|
||||
|
|
||||
LL | #[cfg(test = "value")]
|
||||
| ^^^^----------
|
||||
| |
|
||||
| help: remove the value
|
||||
|
|
||||
= note: no expected value for `test`
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
@ -1,8 +1,7 @@
|
||||
// Check warning for unexpected cfg value
|
||||
//
|
||||
// check-pass
|
||||
// revisions: empty_values empty_cfg without_names
|
||||
// [empty_values]compile-flags: --check-cfg=values() -Z unstable-options
|
||||
// revisions: empty_cfg without_names
|
||||
// [empty_cfg]compile-flags: --check-cfg=cfg() -Z unstable-options
|
||||
// [without_names]compile-flags: --check-cfg=cfg(any()) -Z unstable-options
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition value: `value`
|
||||
--> $DIR/exhaustive-values.rs:9:7
|
||||
--> $DIR/exhaustive-values.rs:8:7
|
||||
|
|
||||
LL | #[cfg(test = "value")]
|
||||
| ^^^^----------
|
||||
|
@ -1,2 +0,0 @@
|
||||
error: invalid `--check-cfg` argument: `names("NOT_IDENT")` (`names()` arguments must be simple identifiers)
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Check that invalid --check-cfg are rejected
|
||||
//
|
||||
// check-fail
|
||||
// revisions: anything_else names_simple_ident values_simple_ident values_string_literals
|
||||
// revisions: anything_else
|
||||
// revisions: string_for_name_1 string_for_name_2 multiple_any multiple_values
|
||||
// revisions: multiple_values_any not_empty_any not_empty_values_any
|
||||
// revisions: values_any_missing_values values_any_before_ident ident_in_values_1
|
||||
@ -10,9 +10,6 @@
|
||||
//
|
||||
// compile-flags: -Z unstable-options
|
||||
// [anything_else]compile-flags: --check-cfg=anything_else(...)
|
||||
// [names_simple_ident]compile-flags: --check-cfg=names("NOT_IDENT")
|
||||
// [values_simple_ident]compile-flags: --check-cfg=values("NOT_IDENT")
|
||||
// [values_string_literals]compile-flags: --check-cfg=values(test,12)
|
||||
// [string_for_name_1]compile-flags: --check-cfg=cfg("NOT_IDENT")
|
||||
// [string_for_name_2]compile-flags: --check-cfg=cfg(foo,"NOT_IDENT",bar)
|
||||
// [multiple_any]compile-flags: --check-cfg=cfg(any(),any())
|
||||
|
@ -1,2 +0,0 @@
|
||||
error: invalid `--check-cfg` argument: `values("NOT_IDENT")` (`values()` first argument must be a simple identifier)
|
||||
|
@ -1,2 +0,0 @@
|
||||
error: invalid `--check-cfg` argument: `values(test,12)` (`values()` arguments must be string literals)
|
||||
|
@ -1,13 +1,10 @@
|
||||
// This test checks the combination of well known names, their activation via names(),
|
||||
// the usage of values(), and that no implicit is done with --cfg while also testing that
|
||||
// This test checks the combination of well known names, the usage of cfg(),
|
||||
// and that no implicit cfgs is added from --cfg while also testing that
|
||||
// we correctly lint on the `cfg!` macro and `cfg_attr` attribute.
|
||||
//
|
||||
// check-pass
|
||||
// revisions: names_values cfg
|
||||
// compile-flags: --cfg feature="bar" --cfg unknown_name -Z unstable-options
|
||||
// compile-flags: --check-cfg=cfg(names_values,cfg)
|
||||
// [names_values]compile-flags: --check-cfg=names() --check-cfg=values(feature,"foo")
|
||||
// [cfg]compile-flags: --check-cfg=cfg(feature,values("foo"))
|
||||
// compile-flags: --check-cfg=cfg(feature,values("foo"))
|
||||
|
||||
#[cfg(windows)]
|
||||
fn do_windows_stuff() {}
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition name: `widnows`
|
||||
--> $DIR/mix.rs:15:7
|
||||
--> $DIR/mix.rs:12:7
|
||||
|
|
||||
LL | #[cfg(widnows)]
|
||||
| ^^^^^^^ help: there is a config with a similar name: `windows`
|
||||
@ -7,7 +7,7 @@ LL | #[cfg(widnows)]
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: unexpected `cfg` condition value: (none)
|
||||
--> $DIR/mix.rs:19:7
|
||||
--> $DIR/mix.rs:16:7
|
||||
|
|
||||
LL | #[cfg(feature)]
|
||||
| ^^^^^^^- help: specify a config value: `= "foo"`
|
||||
@ -15,7 +15,7 @@ LL | #[cfg(feature)]
|
||||
= note: expected values for `feature` are: `foo`
|
||||
|
||||
warning: unexpected `cfg` condition value: `bar`
|
||||
--> $DIR/mix.rs:26:7
|
||||
--> $DIR/mix.rs:23:7
|
||||
|
|
||||
LL | #[cfg(feature = "bar")]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
@ -23,7 +23,7 @@ LL | #[cfg(feature = "bar")]
|
||||
= note: expected values for `feature` are: `foo`
|
||||
|
||||
warning: unexpected `cfg` condition value: `zebra`
|
||||
--> $DIR/mix.rs:30:7
|
||||
--> $DIR/mix.rs:27:7
|
||||
|
|
||||
LL | #[cfg(feature = "zebra")]
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
@ -31,21 +31,21 @@ LL | #[cfg(feature = "zebra")]
|
||||
= note: expected values for `feature` are: `foo`
|
||||
|
||||
warning: unexpected `cfg` condition name: `uu`
|
||||
--> $DIR/mix.rs:34:12
|
||||
--> $DIR/mix.rs:31:12
|
||||
|
|
||||
LL | #[cfg_attr(uu, test)]
|
||||
| ^^
|
||||
|
|
||||
= help: expected names are: `cfg`, `debug_assertions`, `doc`, `doctest`, `feature`, `miri`, `names_values`, `overflow_checks`, `panic`, `proc_macro`, `relocation_model`, `sanitize`, `target_abi`, `target_arch`, `target_endian`, `target_env`, `target_family`, `target_feature`, `target_has_atomic`, `target_has_atomic_equal_alignment`, `target_has_atomic_load_store`, `target_os`, `target_pointer_width`, `target_thread_local`, `target_vendor`, `test`, `unix`, `windows`
|
||||
= help: expected names are: `debug_assertions`, `doc`, `doctest`, `feature`, `miri`, `overflow_checks`, `panic`, `proc_macro`, `relocation_model`, `sanitize`, `target_abi`, `target_arch`, `target_endian`, `target_env`, `target_family`, `target_feature`, `target_has_atomic`, `target_has_atomic_equal_alignment`, `target_has_atomic_load_store`, `target_os`, `target_pointer_width`, `target_thread_local`, `target_vendor`, `test`, `unix`, `windows`
|
||||
|
||||
warning: unexpected `cfg` condition name: `widnows`
|
||||
--> $DIR/mix.rs:43:10
|
||||
--> $DIR/mix.rs:40:10
|
||||
|
|
||||
LL | cfg!(widnows);
|
||||
| ^^^^^^^ help: there is a config with a similar name: `windows`
|
||||
|
||||
warning: unexpected `cfg` condition value: `bar`
|
||||
--> $DIR/mix.rs:46:10
|
||||
--> $DIR/mix.rs:43:10
|
||||
|
|
||||
LL | cfg!(feature = "bar");
|
||||
| ^^^^^^^^^^^^^^^
|
||||
@ -53,7 +53,7 @@ LL | cfg!(feature = "bar");
|
||||
= note: expected values for `feature` are: `foo`
|
||||
|
||||
warning: unexpected `cfg` condition value: `zebra`
|
||||
--> $DIR/mix.rs:48:10
|
||||
--> $DIR/mix.rs:45:10
|
||||
|
|
||||
LL | cfg!(feature = "zebra");
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
@ -61,25 +61,25 @@ LL | cfg!(feature = "zebra");
|
||||
= note: expected values for `feature` are: `foo`
|
||||
|
||||
warning: unexpected `cfg` condition name: `xxx`
|
||||
--> $DIR/mix.rs:50:10
|
||||
--> $DIR/mix.rs:47:10
|
||||
|
|
||||
LL | cfg!(xxx = "foo");
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
warning: unexpected `cfg` condition name: `xxx`
|
||||
--> $DIR/mix.rs:52:10
|
||||
--> $DIR/mix.rs:49:10
|
||||
|
|
||||
LL | cfg!(xxx);
|
||||
| ^^^
|
||||
|
||||
warning: unexpected `cfg` condition name: `xxx`
|
||||
--> $DIR/mix.rs:54:14
|
||||
--> $DIR/mix.rs:51:14
|
||||
|
|
||||
LL | cfg!(any(xxx, windows));
|
||||
| ^^^
|
||||
|
||||
warning: unexpected `cfg` condition value: `bad`
|
||||
--> $DIR/mix.rs:56:14
|
||||
--> $DIR/mix.rs:53:14
|
||||
|
|
||||
LL | cfg!(any(feature = "bad", windows));
|
||||
| ^^^^^^^^^^^^^^^
|
||||
@ -87,43 +87,43 @@ LL | cfg!(any(feature = "bad", windows));
|
||||
= note: expected values for `feature` are: `foo`
|
||||
|
||||
warning: unexpected `cfg` condition name: `xxx`
|
||||
--> $DIR/mix.rs:58:23
|
||||
--> $DIR/mix.rs:55:23
|
||||
|
|
||||
LL | cfg!(any(windows, xxx));
|
||||
| ^^^
|
||||
|
||||
warning: unexpected `cfg` condition name: `xxx`
|
||||
--> $DIR/mix.rs:60:20
|
||||
--> $DIR/mix.rs:57:20
|
||||
|
|
||||
LL | cfg!(all(unix, xxx));
|
||||
| ^^^
|
||||
|
||||
warning: unexpected `cfg` condition name: `aa`
|
||||
--> $DIR/mix.rs:62:14
|
||||
--> $DIR/mix.rs:59:14
|
||||
|
|
||||
LL | cfg!(all(aa, bb));
|
||||
| ^^
|
||||
|
||||
warning: unexpected `cfg` condition name: `bb`
|
||||
--> $DIR/mix.rs:62:18
|
||||
--> $DIR/mix.rs:59:18
|
||||
|
|
||||
LL | cfg!(all(aa, bb));
|
||||
| ^^
|
||||
|
||||
warning: unexpected `cfg` condition name: `aa`
|
||||
--> $DIR/mix.rs:65:14
|
||||
--> $DIR/mix.rs:62:14
|
||||
|
|
||||
LL | cfg!(any(aa, bb));
|
||||
| ^^
|
||||
|
||||
warning: unexpected `cfg` condition name: `bb`
|
||||
--> $DIR/mix.rs:65:18
|
||||
--> $DIR/mix.rs:62:18
|
||||
|
|
||||
LL | cfg!(any(aa, bb));
|
||||
| ^^
|
||||
|
||||
warning: unexpected `cfg` condition value: `zebra`
|
||||
--> $DIR/mix.rs:68:20
|
||||
--> $DIR/mix.rs:65:20
|
||||
|
|
||||
LL | cfg!(any(unix, feature = "zebra"));
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
@ -131,13 +131,13 @@ LL | cfg!(any(unix, feature = "zebra"));
|
||||
= note: expected values for `feature` are: `foo`
|
||||
|
||||
warning: unexpected `cfg` condition name: `xxx`
|
||||
--> $DIR/mix.rs:70:14
|
||||
--> $DIR/mix.rs:67:14
|
||||
|
|
||||
LL | cfg!(any(xxx, feature = "zebra"));
|
||||
| ^^^
|
||||
|
||||
warning: unexpected `cfg` condition value: `zebra`
|
||||
--> $DIR/mix.rs:70:19
|
||||
--> $DIR/mix.rs:67:19
|
||||
|
|
||||
LL | cfg!(any(xxx, feature = "zebra"));
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
@ -145,19 +145,19 @@ LL | cfg!(any(xxx, feature = "zebra"));
|
||||
= note: expected values for `feature` are: `foo`
|
||||
|
||||
warning: unexpected `cfg` condition name: `xxx`
|
||||
--> $DIR/mix.rs:73:14
|
||||
--> $DIR/mix.rs:70:14
|
||||
|
|
||||
LL | cfg!(any(xxx, unix, xxx));
|
||||
| ^^^
|
||||
|
||||
warning: unexpected `cfg` condition name: `xxx`
|
||||
--> $DIR/mix.rs:73:25
|
||||
--> $DIR/mix.rs:70:25
|
||||
|
|
||||
LL | cfg!(any(xxx, unix, xxx));
|
||||
| ^^^
|
||||
|
||||
warning: unexpected `cfg` condition value: `zebra`
|
||||
--> $DIR/mix.rs:76:14
|
||||
--> $DIR/mix.rs:73:14
|
||||
|
|
||||
LL | cfg!(all(feature = "zebra", feature = "zebra", feature = "zebra"));
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
@ -165,7 +165,7 @@ LL | cfg!(all(feature = "zebra", feature = "zebra", feature = "zebra"));
|
||||
= note: expected values for `feature` are: `foo`
|
||||
|
||||
warning: unexpected `cfg` condition value: `zebra`
|
||||
--> $DIR/mix.rs:76:33
|
||||
--> $DIR/mix.rs:73:33
|
||||
|
|
||||
LL | cfg!(all(feature = "zebra", feature = "zebra", feature = "zebra"));
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
@ -173,7 +173,7 @@ LL | cfg!(all(feature = "zebra", feature = "zebra", feature = "zebra"));
|
||||
= note: expected values for `feature` are: `foo`
|
||||
|
||||
warning: unexpected `cfg` condition value: `zebra`
|
||||
--> $DIR/mix.rs:76:52
|
||||
--> $DIR/mix.rs:73:52
|
||||
|
|
||||
LL | cfg!(all(feature = "zebra", feature = "zebra", feature = "zebra"));
|
||||
| ^^^^^^^^^^^^^^^^^
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition value: `foo`
|
||||
--> $DIR/no-expected-values.rs:12:7
|
||||
--> $DIR/no-expected-values.rs:11:7
|
||||
|
|
||||
LL | #[cfg(feature = "foo")]
|
||||
| ^^^^^^^--------
|
||||
@ -10,7 +10,7 @@ LL | #[cfg(feature = "foo")]
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: unexpected `cfg` condition value: `foo`
|
||||
--> $DIR/no-expected-values.rs:16:7
|
||||
--> $DIR/no-expected-values.rs:15:7
|
||||
|
|
||||
LL | #[cfg(test = "foo")]
|
||||
| ^^^^--------
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition value: `foo`
|
||||
--> $DIR/no-expected-values.rs:12:7
|
||||
--> $DIR/no-expected-values.rs:11:7
|
||||
|
|
||||
LL | #[cfg(feature = "foo")]
|
||||
| ^^^^^^^--------
|
||||
@ -10,7 +10,7 @@ LL | #[cfg(feature = "foo")]
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: unexpected `cfg` condition value: `foo`
|
||||
--> $DIR/no-expected-values.rs:16:7
|
||||
--> $DIR/no-expected-values.rs:15:7
|
||||
|
|
||||
LL | #[cfg(test = "foo")]
|
||||
| ^^^^--------
|
||||
|
@ -1,10 +1,9 @@
|
||||
// Check that we detect unexpected value when none are allowed
|
||||
//
|
||||
// check-pass
|
||||
// revisions: values simple mixed empty
|
||||
// revisions: simple mixed empty
|
||||
// compile-flags: -Z unstable-options
|
||||
// compile-flags: --check-cfg=cfg(values,simple,mixed,empty)
|
||||
// [values]compile-flags: --check-cfg=values(test) --check-cfg=values(feature)
|
||||
// [simple]compile-flags: --check-cfg=cfg(test) --check-cfg=cfg(feature)
|
||||
// [mixed]compile-flags: --check-cfg=cfg(test,feature)
|
||||
// [empty]compile-flags: --check-cfg=cfg(test,feature,values())
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition value: `foo`
|
||||
--> $DIR/no-expected-values.rs:12:7
|
||||
--> $DIR/no-expected-values.rs:11:7
|
||||
|
|
||||
LL | #[cfg(feature = "foo")]
|
||||
| ^^^^^^^--------
|
||||
@ -10,7 +10,7 @@ LL | #[cfg(feature = "foo")]
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: unexpected `cfg` condition value: `foo`
|
||||
--> $DIR/no-expected-values.rs:16:7
|
||||
--> $DIR/no-expected-values.rs:15:7
|
||||
|
|
||||
LL | #[cfg(test = "foo")]
|
||||
| ^^^^--------
|
||||
|
@ -1,23 +0,0 @@
|
||||
warning: unexpected `cfg` condition value: `foo`
|
||||
--> $DIR/no-expected-values.rs:12:7
|
||||
|
|
||||
LL | #[cfg(feature = "foo")]
|
||||
| ^^^^^^^--------
|
||||
| |
|
||||
| help: remove the value
|
||||
|
|
||||
= note: no expected value for `feature`
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: unexpected `cfg` condition value: `foo`
|
||||
--> $DIR/no-expected-values.rs:16:7
|
||||
|
|
||||
LL | #[cfg(test = "foo")]
|
||||
| ^^^^--------
|
||||
| |
|
||||
| help: remove the value
|
||||
|
|
||||
= note: no expected value for `test`
|
||||
|
||||
warning: 2 warnings emitted
|
||||
|
@ -1,19 +0,0 @@
|
||||
warning: unexpected `cfg` condition value: (none)
|
||||
--> $DIR/order-independant.rs:8:7
|
||||
|
|
||||
LL | #[cfg(a)]
|
||||
| ^- help: specify a config value: `= "b"`
|
||||
|
|
||||
= note: expected values for `a` are: `b`
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: unexpected `cfg` condition value: `unk`
|
||||
--> $DIR/order-independant.rs:12:7
|
||||
|
|
||||
LL | #[cfg(a = "unk")]
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: expected values for `a` are: `b`
|
||||
|
||||
warning: 2 warnings emitted
|
||||
|
@ -1,19 +0,0 @@
|
||||
warning: unexpected `cfg` condition value: (none)
|
||||
--> $DIR/order-independant.rs:8:7
|
||||
|
|
||||
LL | #[cfg(a)]
|
||||
| ^- help: specify a config value: `= "b"`
|
||||
|
|
||||
= note: expected values for `a` are: `b`
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: unexpected `cfg` condition value: `unk`
|
||||
--> $DIR/order-independant.rs:12:7
|
||||
|
|
||||
LL | #[cfg(a = "unk")]
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: expected values for `a` are: `b`
|
||||
|
||||
warning: 2 warnings emitted
|
||||
|
@ -1,12 +1,13 @@
|
||||
// check-pass
|
||||
// revisions: names_before names_after
|
||||
//
|
||||
// revisions: values_before values_after
|
||||
// compile-flags: -Z unstable-options
|
||||
// compile-flags: --check-cfg=names(names_before,names_after)
|
||||
// [names_before]compile-flags: --check-cfg=names(a) --check-cfg=values(a,"b")
|
||||
// [names_after]compile-flags: --check-cfg=values(a,"b") --check-cfg=names(a)
|
||||
// compile-flags: --check-cfg=cfg(values_before,values_after)
|
||||
//
|
||||
// [values_before]compile-flags: --check-cfg=cfg(a,values("b")) --check-cfg=cfg(a)
|
||||
// [values_after]compile-flags: --check-cfg=cfg(a) --check-cfg=cfg(a,values("b"))
|
||||
|
||||
#[cfg(a)]
|
||||
//~^ WARNING unexpected `cfg` condition value
|
||||
fn my_cfg() {}
|
||||
|
||||
#[cfg(a = "unk")]
|
||||
|
11
tests/ui/check-cfg/order-independant.values_after.stderr
Normal file
11
tests/ui/check-cfg/order-independant.values_after.stderr
Normal file
@ -0,0 +1,11 @@
|
||||
warning: unexpected `cfg` condition value: `unk`
|
||||
--> $DIR/order-independant.rs:13:7
|
||||
|
|
||||
LL | #[cfg(a = "unk")]
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: expected values for `a` are: (none), `b`
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
11
tests/ui/check-cfg/order-independant.values_before.stderr
Normal file
11
tests/ui/check-cfg/order-independant.values_before.stderr
Normal file
@ -0,0 +1,11 @@
|
||||
warning: unexpected `cfg` condition value: `unk`
|
||||
--> $DIR/order-independant.rs:13:7
|
||||
|
|
||||
LL | #[cfg(a = "unk")]
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
= note: expected values for `a` are: (none), `b`
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
@ -1,10 +0,0 @@
|
||||
warning: unexpected `cfg` condition name: `widnows`
|
||||
--> $DIR/unexpected-cfg-name.rs:9:7
|
||||
|
|
||||
LL | #[cfg(widnows)]
|
||||
| ^^^^^^^ help: there is a config with a similar name: `windows`
|
||||
|
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
@ -1,10 +1,7 @@
|
||||
// Check warning for unexpected configuration name
|
||||
//
|
||||
// check-pass
|
||||
// revisions: names exhaustive
|
||||
// compile-flags: --check-cfg=cfg(names,exhaustive)
|
||||
// [names]compile-flags: --check-cfg=names() -Z unstable-options
|
||||
// [exhaustive]compile-flags: --check-cfg=cfg() -Z unstable-options
|
||||
// compile-flags: --check-cfg=cfg() -Z unstable-options
|
||||
|
||||
#[cfg(widnows)]
|
||||
//~^ WARNING unexpected `cfg` condition name
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition name: `widnows`
|
||||
--> $DIR/unexpected-cfg-name.rs:9:7
|
||||
--> $DIR/unexpected-cfg-name.rs:6:7
|
||||
|
|
||||
LL | #[cfg(widnows)]
|
||||
| ^^^^^^^ help: there is a config with a similar name: `windows`
|
@ -1,10 +1,8 @@
|
||||
// Check for unexpected configuration value in the code.
|
||||
//
|
||||
// check-pass
|
||||
// revisions: values cfg
|
||||
// compile-flags: -Z unstable-options
|
||||
// [values]compile-flags: --check-cfg=values(feature,"serde","full")
|
||||
// [cfg]compile-flags: --check-cfg=cfg(feature,values("serde","full"))
|
||||
// compile-flags: --cfg=feature="rand" -Z unstable-options
|
||||
// compile-flags: --check-cfg=cfg(feature,values("serde","full"))
|
||||
|
||||
#[cfg(feature = "sedre")]
|
||||
//~^ WARNING unexpected `cfg` condition value
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: unexpected `cfg` condition value: `sedre`
|
||||
--> $DIR/unexpected-cfg-value.rs:9:7
|
||||
--> $DIR/unexpected-cfg-value.rs:7:7
|
||||
|
|
||||
LL | #[cfg(feature = "sedre")]
|
||||
| ^^^^^^^^^^-------
|
||||
@ -10,7 +10,7 @@ LL | #[cfg(feature = "sedre")]
|
||||
= note: `#[warn(unexpected_cfgs)]` on by default
|
||||
|
||||
warning: unexpected `cfg` condition value: `rand`
|
||||
--> $DIR/unexpected-cfg-value.rs:16:7
|
||||
--> $DIR/unexpected-cfg-value.rs:14:7
|
||||
|
|
||||
LL | #[cfg(feature = "rand")]
|
||||
| ^^^^^^^^^^^^^^^^
|
@ -2,7 +2,7 @@
|
||||
//
|
||||
// check-pass
|
||||
// needs-llvm-components: x86
|
||||
// compile-flags: --crate-type=lib --check-cfg=values() --target={{src-base}}/check-cfg/my-awesome-platform.json -Z unstable-options
|
||||
// compile-flags: --crate-type=lib --check-cfg=cfg() --target={{src-base}}/check-cfg/my-awesome-platform.json -Z unstable-options
|
||||
|
||||
#![feature(lang_items, no_core, auto_traits)]
|
||||
#![no_core]
|
||||
|
@ -1,3 +1,3 @@
|
||||
// compile-flags: --check-cfg "names()"
|
||||
// compile-flags: --check-cfg "cfg()"
|
||||
|
||||
fn main() {}
|
||||
|
15
tests/ui/lint/unused/assoc-types.assoc_ty.stderr
Normal file
15
tests/ui/lint/unused/assoc-types.assoc_ty.stderr
Normal file
@ -0,0 +1,15 @@
|
||||
error: unused implementer of `Future` that must be used
|
||||
--> $DIR/assoc-types.rs:19:5
|
||||
|
|
||||
LL | T::foo();
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: futures do nothing unless you `.await` or poll them
|
||||
note: the lint level is defined here
|
||||
--> $DIR/assoc-types.rs:4:9
|
||||
|
|
||||
LL | #![deny(unused_must_use)]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
15
tests/ui/lint/unused/assoc-types.rpitit.stderr
Normal file
15
tests/ui/lint/unused/assoc-types.rpitit.stderr
Normal file
@ -0,0 +1,15 @@
|
||||
error: unused implementer of `Future` that must be used
|
||||
--> $DIR/assoc-types.rs:19:5
|
||||
|
|
||||
LL | T::foo();
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: futures do nothing unless you `.await` or poll them
|
||||
note: the lint level is defined here
|
||||
--> $DIR/assoc-types.rs:4:9
|
||||
|
|
||||
LL | #![deny(unused_must_use)]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
23
tests/ui/lint/unused/assoc-types.rs
Normal file
23
tests/ui/lint/unused/assoc-types.rs
Normal file
@ -0,0 +1,23 @@
|
||||
// edition: 2021
|
||||
// revisions: rpitit assoc_ty
|
||||
|
||||
#![deny(unused_must_use)]
|
||||
|
||||
use std::future::Future;
|
||||
|
||||
pub trait Tr {
|
||||
type Fut: Future<Output = ()>;
|
||||
|
||||
#[cfg(rpitit)]
|
||||
fn foo() -> impl Future<Output = ()>;
|
||||
|
||||
#[cfg(assoc_ty)]
|
||||
fn foo() -> Self::Fut;
|
||||
}
|
||||
|
||||
pub async fn bar<T: Tr>() {
|
||||
T::foo();
|
||||
//~^ ERROR unused implementer of `Future` that must be used
|
||||
}
|
||||
|
||||
fn main() {}
|
5
tests/ui/resolve/issue-118295.rs
Normal file
5
tests/ui/resolve/issue-118295.rs
Normal file
@ -0,0 +1,5 @@
|
||||
macro_rules! {}
|
||||
//~^ ERROR cannot find macro `macro_rules` in this scope
|
||||
//~| NOTE maybe you have forgotten to define a name for this `macro_rules!`
|
||||
|
||||
fn main() {}
|
14
tests/ui/resolve/issue-118295.stderr
Normal file
14
tests/ui/resolve/issue-118295.stderr
Normal file
@ -0,0 +1,14 @@
|
||||
error: cannot find macro `macro_rules` in this scope
|
||||
--> $DIR/issue-118295.rs:1:1
|
||||
|
|
||||
LL | macro_rules! {}
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
note: maybe you have forgotten to define a name for this `macro_rules!`
|
||||
--> $DIR/issue-118295.rs:1:1
|
||||
|
|
||||
LL | macro_rules! {}
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
Loading…
Reference in New Issue
Block a user