Auto merge of #124289 - matthiaskrgr:rollup-oxw52jy, r=matthiaskrgr
Rollup of 5 pull requests Successful merges: - #123050 (panic_str only exists for the migration to 2021 panic macros) - #124067 (weak lang items are not allowed to be #[track_caller]) - #124099 (Disallow ambiguous attributes on expressions) - #124284 (parser: remove unused(no reads) max_angle_bracket_count field) - #124288 (remove `push_trait_bound_inner`) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
ad07aa12c9
@ -6,7 +6,7 @@ Erroneous code example:
|
|||||||
#![feature(lang_items)]
|
#![feature(lang_items)]
|
||||||
|
|
||||||
#[lang = "cookie"]
|
#[lang = "cookie"]
|
||||||
fn cookie() -> ! { // error: definition of an unknown language item: `cookie`
|
fn cookie() -> ! { // error: definition of an unknown lang item: `cookie`
|
||||||
loop {}
|
loop {}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -798,7 +798,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
|
|||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
gated!(
|
gated!(
|
||||||
lang, Normal, template!(NameValueStr: "name"), DuplicatesOk, EncodeCrossCrate::No, lang_items,
|
lang, Normal, template!(NameValueStr: "name"), DuplicatesOk, EncodeCrossCrate::No, lang_items,
|
||||||
"language items are subject to change",
|
"lang items are subject to change",
|
||||||
),
|
),
|
||||||
rustc_attr!(
|
rustc_attr!(
|
||||||
rustc_pass_by_value, Normal, template!(Word), ErrorFollowing,
|
rustc_pass_by_value, Normal, template!(Word), ErrorFollowing,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! Defines language items.
|
//! Defines lang items.
|
||||||
//!
|
//!
|
||||||
//! Language items are items that represent concepts intrinsic to the language
|
//! Language items are items that represent concepts intrinsic to the language
|
||||||
//! itself. Examples are:
|
//! itself. Examples are:
|
||||||
@ -16,7 +16,7 @@ use rustc_macros::HashStable_Generic;
|
|||||||
use rustc_span::symbol::{kw, sym, Symbol};
|
use rustc_span::symbol::{kw, sym, Symbol};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
/// All of the language items, defined or not.
|
/// All of the lang items, defined or not.
|
||||||
/// Defined lang items can come from the current crate or its dependencies.
|
/// Defined lang items can come from the current crate or its dependencies.
|
||||||
#[derive(HashStable_Generic, Debug)]
|
#[derive(HashStable_Generic, Debug)]
|
||||||
pub struct LanguageItems {
|
pub struct LanguageItems {
|
||||||
@ -57,7 +57,7 @@ macro_rules! language_item_table {
|
|||||||
) => {
|
) => {
|
||||||
|
|
||||||
enum_from_u32! {
|
enum_from_u32! {
|
||||||
/// A representation of all the valid language items in Rust.
|
/// A representation of all the valid lang items in Rust.
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Encodable, Decodable)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Encodable, Decodable)]
|
||||||
pub enum LangItem {
|
pub enum LangItem {
|
||||||
$(
|
$(
|
||||||
@ -177,7 +177,7 @@ language_item_table! {
|
|||||||
CoerceUnsized, sym::coerce_unsized, coerce_unsized_trait, Target::Trait, GenericRequirement::Minimum(1);
|
CoerceUnsized, sym::coerce_unsized, coerce_unsized_trait, Target::Trait, GenericRequirement::Minimum(1);
|
||||||
DispatchFromDyn, sym::dispatch_from_dyn, dispatch_from_dyn_trait, Target::Trait, GenericRequirement::Minimum(1);
|
DispatchFromDyn, sym::dispatch_from_dyn, dispatch_from_dyn_trait, Target::Trait, GenericRequirement::Minimum(1);
|
||||||
|
|
||||||
// language items relating to transmutability
|
// lang items relating to transmutability
|
||||||
TransmuteOpts, sym::transmute_opts, transmute_opts, Target::Struct, GenericRequirement::Exact(0);
|
TransmuteOpts, sym::transmute_opts, transmute_opts, Target::Struct, GenericRequirement::Exact(0);
|
||||||
TransmuteTrait, sym::transmute_trait, transmute_trait, Target::Trait, GenericRequirement::Exact(2);
|
TransmuteTrait, sym::transmute_trait, transmute_trait, Target::Trait, GenericRequirement::Exact(2);
|
||||||
|
|
||||||
@ -304,7 +304,7 @@ language_item_table! {
|
|||||||
OwnedBox, sym::owned_box, owned_box, Target::Struct, GenericRequirement::Minimum(1);
|
OwnedBox, sym::owned_box, owned_box, Target::Struct, GenericRequirement::Minimum(1);
|
||||||
GlobalAlloc, sym::global_alloc_ty, global_alloc_ty, Target::Struct, GenericRequirement::None;
|
GlobalAlloc, sym::global_alloc_ty, global_alloc_ty, Target::Struct, GenericRequirement::None;
|
||||||
|
|
||||||
// Experimental language item for Miri
|
// Experimental lang item for Miri
|
||||||
PtrUnique, sym::ptr_unique, ptr_unique, Target::Struct, GenericRequirement::Exact(1);
|
PtrUnique, sym::ptr_unique, ptr_unique, Target::Struct, GenericRequirement::Exact(1);
|
||||||
|
|
||||||
PhantomData, sym::phantom_data, phantom_data, Target::Struct, GenericRequirement::Exact(1);
|
PhantomData, sym::phantom_data, phantom_data, Target::Struct, GenericRequirement::Exact(1);
|
||||||
|
@ -43,16 +43,6 @@ impl<'tcx> Bounds<'tcx> {
|
|||||||
trait_ref: ty::PolyTraitRef<'tcx>,
|
trait_ref: ty::PolyTraitRef<'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
polarity: ty::PredicatePolarity,
|
polarity: ty::PredicatePolarity,
|
||||||
) {
|
|
||||||
self.push_trait_bound_inner(tcx, trait_ref, span, polarity);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn push_trait_bound_inner(
|
|
||||||
&mut self,
|
|
||||||
tcx: TyCtxt<'tcx>,
|
|
||||||
trait_ref: ty::PolyTraitRef<'tcx>,
|
|
||||||
span: Span,
|
|
||||||
polarity: ty::PredicatePolarity,
|
|
||||||
) {
|
) {
|
||||||
let clause = (
|
let clause = (
|
||||||
trait_ref
|
trait_ref
|
||||||
|
@ -535,7 +535,7 @@ pub fn check_intrinsic_type(
|
|||||||
|
|
||||||
sym::va_start | sym::va_end => match mk_va_list_ty(hir::Mutability::Mut) {
|
sym::va_start | sym::va_end => match mk_va_list_ty(hir::Mutability::Mut) {
|
||||||
Some((va_list_ref_ty, _)) => (0, 0, vec![va_list_ref_ty], Ty::new_unit(tcx)),
|
Some((va_list_ref_ty, _)) => (0, 0, vec![va_list_ref_ty], Ty::new_unit(tcx)),
|
||||||
None => bug!("`va_list` language item needed for C-variadic intrinsics"),
|
None => bug!("`va_list` lang item needed for C-variadic intrinsics"),
|
||||||
},
|
},
|
||||||
|
|
||||||
sym::va_copy => match mk_va_list_ty(hir::Mutability::Not) {
|
sym::va_copy => match mk_va_list_ty(hir::Mutability::Not) {
|
||||||
@ -543,12 +543,12 @@ pub fn check_intrinsic_type(
|
|||||||
let va_list_ptr_ty = Ty::new_mut_ptr(tcx, va_list_ty);
|
let va_list_ptr_ty = Ty::new_mut_ptr(tcx, va_list_ty);
|
||||||
(0, 0, vec![va_list_ptr_ty, va_list_ref_ty], Ty::new_unit(tcx))
|
(0, 0, vec![va_list_ptr_ty, va_list_ref_ty], Ty::new_unit(tcx))
|
||||||
}
|
}
|
||||||
None => bug!("`va_list` language item needed for C-variadic intrinsics"),
|
None => bug!("`va_list` lang item needed for C-variadic intrinsics"),
|
||||||
},
|
},
|
||||||
|
|
||||||
sym::va_arg => match mk_va_list_ty(hir::Mutability::Mut) {
|
sym::va_arg => match mk_va_list_ty(hir::Mutability::Mut) {
|
||||||
Some((va_list_ref_ty, _)) => (1, 0, vec![va_list_ref_ty], param(0)),
|
Some((va_list_ref_ty, _)) => (1, 0, vec![va_list_ref_ty], param(0)),
|
||||||
None => bug!("`va_list` language item needed for C-variadic intrinsics"),
|
None => bug!("`va_list` lang item needed for C-variadic intrinsics"),
|
||||||
},
|
},
|
||||||
|
|
||||||
sym::nontemporal_store => {
|
sym::nontemporal_store => {
|
||||||
|
@ -53,7 +53,7 @@ impl<'tcx> LateLintPass<'tcx> for NonPanicFmt {
|
|||||||
|
|
||||||
if Some(def_id) == cx.tcx.lang_items().begin_panic_fn()
|
if Some(def_id) == cx.tcx.lang_items().begin_panic_fn()
|
||||||
|| Some(def_id) == cx.tcx.lang_items().panic_fn()
|
|| Some(def_id) == cx.tcx.lang_items().panic_fn()
|
||||||
|| f_diagnostic_name == Some(sym::panic_str)
|
|| f_diagnostic_name == Some(sym::panic_str_2015)
|
||||||
{
|
{
|
||||||
if let Some(id) = f.span.ctxt().outer_expn_data().macro_def_id {
|
if let Some(id) = f.span.ctxt().outer_expn_data().macro_def_id {
|
||||||
if matches!(
|
if matches!(
|
||||||
|
@ -1208,7 +1208,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
|
|||||||
tcx.arena.alloc_from_iter(self.root.stability_implications.decode(self))
|
tcx.arena.alloc_from_iter(self.root.stability_implications.decode(self))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Iterates over the language items in the given crate.
|
/// Iterates over the lang items in the given crate.
|
||||||
fn get_lang_items(self, tcx: TyCtxt<'tcx>) -> &'tcx [(DefId, LangItem)] {
|
fn get_lang_items(self, tcx: TyCtxt<'tcx>) -> &'tcx [(DefId, LangItem)] {
|
||||||
tcx.arena.alloc_from_iter(
|
tcx.arena.alloc_from_iter(
|
||||||
self.root
|
self.root
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! Detecting language items.
|
//! Detecting lang items.
|
||||||
//!
|
//!
|
||||||
//! Language items are items that represent concepts intrinsic to the language
|
//! Language items are items that represent concepts intrinsic to the language
|
||||||
//! itself. Examples are:
|
//! itself. Examples are:
|
||||||
|
@ -160,7 +160,7 @@ pub fn deduced_param_attrs<'tcx>(
|
|||||||
return &[];
|
return &[];
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the Freeze language item isn't present, then don't bother.
|
// If the Freeze lang item isn't present, then don't bother.
|
||||||
if tcx.lang_items().freeze_trait().is_none() {
|
if tcx.lang_items().freeze_trait().is_none() {
|
||||||
return &[];
|
return &[];
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ impl<'tcx> MirPass<'tcx> for LowerSliceLenCalls {
|
|||||||
pub fn lower_slice_len_calls<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
pub fn lower_slice_len_calls<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
let language_items = tcx.lang_items();
|
let language_items = tcx.lang_items();
|
||||||
let Some(slice_len_fn_item_def_id) = language_items.slice_len_fn() else {
|
let Some(slice_len_fn_item_def_id) = language_items.slice_len_fn() else {
|
||||||
// there is no language item to compare to :)
|
// there is no lang item to compare to :)
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -624,6 +624,8 @@ parse_or_pattern_not_allowed_in_let_binding = top-level or-patterns are not allo
|
|||||||
parse_out_of_range_hex_escape = out of range hex escape
|
parse_out_of_range_hex_escape = out of range hex escape
|
||||||
.label = must be a character in the range [\x00-\x7f]
|
.label = must be a character in the range [\x00-\x7f]
|
||||||
|
|
||||||
|
parse_outer_attr_ambiguous = ambiguous outer attributes
|
||||||
|
|
||||||
parse_outer_attr_explanation = outer attributes, like `#[test]`, annotate the item following them
|
parse_outer_attr_explanation = outer attributes, like `#[test]`, annotate the item following them
|
||||||
|
|
||||||
parse_outer_attribute_not_allowed_on_if_else = outer attributes are not allowed on `if` and `else` branches
|
parse_outer_attribute_not_allowed_on_if_else = outer attributes are not allowed on `if` and `else` branches
|
||||||
|
@ -495,6 +495,15 @@ pub(crate) struct OuterAttributeNotAllowedOnIfElse {
|
|||||||
pub attributes: Span,
|
pub attributes: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(parse_outer_attr_ambiguous)]
|
||||||
|
pub(crate) struct AmbiguousOuterAttributes {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
#[subdiagnostic]
|
||||||
|
pub sugg: WrapInParentheses,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(parse_missing_in_in_for_loop)]
|
#[diag(parse_missing_in_in_for_loop)]
|
||||||
pub(crate) struct MissingInInForLoop {
|
pub(crate) struct MissingInInForLoop {
|
||||||
|
@ -327,7 +327,9 @@ impl<'a> Parser<'a> {
|
|||||||
this.parse_expr_assoc_with(prec + prec_adjustment, LhsExpr::NotYetParsed)
|
this.parse_expr_assoc_with(prec + prec_adjustment, LhsExpr::NotYetParsed)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let span = self.mk_expr_sp(&lhs, lhs_span, rhs.span);
|
self.error_ambiguous_outer_attrs(&lhs, lhs_span, rhs.span);
|
||||||
|
let span = lhs_span.to(rhs.span);
|
||||||
|
|
||||||
lhs = match op {
|
lhs = match op {
|
||||||
AssocOp::Add
|
AssocOp::Add
|
||||||
| AssocOp::Subtract
|
| AssocOp::Subtract
|
||||||
@ -426,6 +428,18 @@ impl<'a> Parser<'a> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn error_ambiguous_outer_attrs(&self, lhs: &P<Expr>, lhs_span: Span, rhs_span: Span) {
|
||||||
|
if let Some(attr) = lhs.attrs.iter().find(|a| a.style == AttrStyle::Outer) {
|
||||||
|
self.dcx().emit_err(errors::AmbiguousOuterAttributes {
|
||||||
|
span: attr.span.to(rhs_span),
|
||||||
|
sugg: errors::WrapInParentheses::Expression {
|
||||||
|
left: attr.span.shrink_to_lo(),
|
||||||
|
right: lhs_span.shrink_to_hi(),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Possibly translate the current token to an associative operator.
|
/// Possibly translate the current token to an associative operator.
|
||||||
/// The method does not advance the current token.
|
/// The method does not advance the current token.
|
||||||
///
|
///
|
||||||
@ -506,7 +520,8 @@ impl<'a> Parser<'a> {
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
let rhs_span = rhs.as_ref().map_or(cur_op_span, |x| x.span);
|
let rhs_span = rhs.as_ref().map_or(cur_op_span, |x| x.span);
|
||||||
let span = self.mk_expr_sp(&lhs, lhs.span, rhs_span);
|
self.error_ambiguous_outer_attrs(&lhs, lhs.span, rhs_span);
|
||||||
|
let span = lhs.span.to(rhs_span);
|
||||||
let limits =
|
let limits =
|
||||||
if op == AssocOp::DotDot { RangeLimits::HalfOpen } else { RangeLimits::Closed };
|
if op == AssocOp::DotDot { RangeLimits::HalfOpen } else { RangeLimits::Closed };
|
||||||
let range = self.mk_range(Some(lhs), rhs, limits);
|
let range = self.mk_range(Some(lhs), rhs, limits);
|
||||||
@ -722,7 +737,8 @@ impl<'a> Parser<'a> {
|
|||||||
expr_kind: fn(P<Expr>, P<Ty>) -> ExprKind,
|
expr_kind: fn(P<Expr>, P<Ty>) -> ExprKind,
|
||||||
) -> PResult<'a, P<Expr>> {
|
) -> PResult<'a, P<Expr>> {
|
||||||
let mk_expr = |this: &mut Self, lhs: P<Expr>, rhs: P<Ty>| {
|
let mk_expr = |this: &mut Self, lhs: P<Expr>, rhs: P<Ty>| {
|
||||||
this.mk_expr(this.mk_expr_sp(&lhs, lhs_span, rhs.span), expr_kind(lhs, rhs))
|
this.error_ambiguous_outer_attrs(&lhs, lhs_span, rhs.span);
|
||||||
|
this.mk_expr(lhs_span.to(rhs.span), expr_kind(lhs, rhs))
|
||||||
};
|
};
|
||||||
|
|
||||||
// Save the state of the parser before parsing type normally, in case there is a
|
// Save the state of the parser before parsing type normally, in case there is a
|
||||||
@ -3813,16 +3829,6 @@ impl<'a> Parser<'a> {
|
|||||||
self.mk_expr(span, ExprKind::Err(guar))
|
self.mk_expr(span, ExprKind::Err(guar))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create expression span ensuring the span of the parent node
|
|
||||||
/// is larger than the span of lhs and rhs, including the attributes.
|
|
||||||
fn mk_expr_sp(&self, lhs: &P<Expr>, lhs_span: Span, rhs_span: Span) -> Span {
|
|
||||||
lhs.attrs
|
|
||||||
.iter()
|
|
||||||
.find(|a| a.style == AttrStyle::Outer)
|
|
||||||
.map_or(lhs_span, |a| a.span)
|
|
||||||
.to(rhs_span)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn collect_tokens_for_expr(
|
fn collect_tokens_for_expr(
|
||||||
&mut self,
|
&mut self,
|
||||||
attrs: AttrWrapper,
|
attrs: AttrWrapper,
|
||||||
|
@ -162,7 +162,6 @@ pub struct Parser<'a> {
|
|||||||
///
|
///
|
||||||
/// See the comments in the `parse_path_segment` function for more details.
|
/// See the comments in the `parse_path_segment` function for more details.
|
||||||
unmatched_angle_bracket_count: u16,
|
unmatched_angle_bracket_count: u16,
|
||||||
max_angle_bracket_count: u16,
|
|
||||||
angle_bracket_nesting: u16,
|
angle_bracket_nesting: u16,
|
||||||
|
|
||||||
last_unexpected_token_span: Option<Span>,
|
last_unexpected_token_span: Option<Span>,
|
||||||
@ -430,7 +429,6 @@ impl<'a> Parser<'a> {
|
|||||||
num_bump_calls: 0,
|
num_bump_calls: 0,
|
||||||
break_last_token: false,
|
break_last_token: false,
|
||||||
unmatched_angle_bracket_count: 0,
|
unmatched_angle_bracket_count: 0,
|
||||||
max_angle_bracket_count: 0,
|
|
||||||
angle_bracket_nesting: 0,
|
angle_bracket_nesting: 0,
|
||||||
last_unexpected_token_span: None,
|
last_unexpected_token_span: None,
|
||||||
subparser_name,
|
subparser_name,
|
||||||
@ -778,7 +776,6 @@ impl<'a> Parser<'a> {
|
|||||||
if ate {
|
if ate {
|
||||||
// See doc comment for `unmatched_angle_bracket_count`.
|
// See doc comment for `unmatched_angle_bracket_count`.
|
||||||
self.unmatched_angle_bracket_count += 1;
|
self.unmatched_angle_bracket_count += 1;
|
||||||
self.max_angle_bracket_count += 1;
|
|
||||||
debug!("eat_lt: (increment) count={:?}", self.unmatched_angle_bracket_count);
|
debug!("eat_lt: (increment) count={:?}", self.unmatched_angle_bracket_count);
|
||||||
}
|
}
|
||||||
ate
|
ate
|
||||||
|
@ -299,7 +299,6 @@ impl<'a> Parser<'a> {
|
|||||||
// parsing a new path.
|
// parsing a new path.
|
||||||
if style == PathStyle::Expr {
|
if style == PathStyle::Expr {
|
||||||
self.unmatched_angle_bracket_count = 0;
|
self.unmatched_angle_bracket_count = 0;
|
||||||
self.max_angle_bracket_count = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generic arguments are found - `<`, `(`, `::<` or `::(`.
|
// Generic arguments are found - `<`, `(`, `::<` or `::(`.
|
||||||
|
@ -353,7 +353,7 @@ passes_incorrect_meta_item = expected a quoted string literal
|
|||||||
passes_incorrect_meta_item_suggestion = consider surrounding this with quotes
|
passes_incorrect_meta_item_suggestion = consider surrounding this with quotes
|
||||||
|
|
||||||
passes_incorrect_target =
|
passes_incorrect_target =
|
||||||
`{$name}` language item must be applied to a {$kind} with {$at_least ->
|
`{$name}` lang item must be applied to a {$kind} with {$at_least ->
|
||||||
[true] at least {$num}
|
[true] at least {$num}
|
||||||
*[false] {$num}
|
*[false] {$num}
|
||||||
} generic {$num ->
|
} generic {$num ->
|
||||||
@ -394,12 +394,21 @@ passes_invalid_macro_export_arguments = `{$name}` isn't a valid `#[macro_export]
|
|||||||
|
|
||||||
passes_invalid_macro_export_arguments_too_many_items = `#[macro_export]` can only take 1 or 0 arguments
|
passes_invalid_macro_export_arguments_too_many_items = `#[macro_export]` can only take 1 or 0 arguments
|
||||||
|
|
||||||
|
passes_lang_item_fn = {$name ->
|
||||||
|
[panic_impl] `#[panic_handler]`
|
||||||
|
*[other] `{$name}` lang item
|
||||||
|
} function
|
||||||
|
|
||||||
passes_lang_item_fn_with_target_feature =
|
passes_lang_item_fn_with_target_feature =
|
||||||
`{$name}` language item function is not allowed to have `#[target_feature]`
|
{passes_lang_item_fn} is not allowed to have `#[target_feature]`
|
||||||
.label = `{$name}` language item function is not allowed to have `#[target_feature]`
|
.label = {passes_lang_item_fn} is not allowed to have `#[target_feature]`
|
||||||
|
|
||||||
|
passes_lang_item_fn_with_track_caller =
|
||||||
|
{passes_lang_item_fn} is not allowed to have `#[track_caller]`
|
||||||
|
.label = {passes_lang_item_fn} is not allowed to have `#[target_feature]`
|
||||||
|
|
||||||
passes_lang_item_on_incorrect_target =
|
passes_lang_item_on_incorrect_target =
|
||||||
`{$name}` language item must be applied to a {$expected_target}
|
`{$name}` lang item must be applied to a {$expected_target}
|
||||||
.label = attribute should be applied to a {$expected_target}, not a {$actual_target}
|
.label = attribute should be applied to a {$expected_target}, not a {$actual_target}
|
||||||
|
|
||||||
passes_layout_abi =
|
passes_layout_abi =
|
||||||
@ -455,7 +464,7 @@ passes_missing_const_stab_attr =
|
|||||||
{$descr} has missing const stability attribute
|
{$descr} has missing const stability attribute
|
||||||
|
|
||||||
passes_missing_lang_item =
|
passes_missing_lang_item =
|
||||||
language item required, but not found: `{$name}`
|
lang item required, but not found: `{$name}`
|
||||||
.note = this can occur when a binary crate with `#![no_std]` is compiled for a target where `{$name}` is defined in the standard library
|
.note = this can occur when a binary crate with `#![no_std]` is compiled for a target where `{$name}` is defined in the standard library
|
||||||
.help = you may be able to compile for a target that doesn't need `{$name}`, specify a target with `--target` or in `.cargo/config`
|
.help = you may be able to compile for a target that doesn't need `{$name}`, specify a target with `--target` or in `.cargo/config`
|
||||||
|
|
||||||
@ -696,8 +705,8 @@ passes_unknown_feature =
|
|||||||
unknown feature `{$feature}`
|
unknown feature `{$feature}`
|
||||||
|
|
||||||
passes_unknown_lang_item =
|
passes_unknown_lang_item =
|
||||||
definition of an unknown language item: `{$name}`
|
definition of an unknown lang item: `{$name}`
|
||||||
.label = definition of unknown language item `{$name}`
|
.label = definition of unknown lang item `{$name}`
|
||||||
|
|
||||||
passes_unlabeled_cf_in_while_condition =
|
passes_unlabeled_cf_in_while_condition =
|
||||||
`break` or `continue` with no label in the condition of a `while` loop
|
`break` or `continue` with no label in the condition of a `while` loop
|
||||||
|
@ -11,9 +11,9 @@ use rustc_data_structures::fx::FxHashMap;
|
|||||||
use rustc_errors::StashKey;
|
use rustc_errors::StashKey;
|
||||||
use rustc_errors::{Applicability, DiagCtxt, IntoDiagArg, MultiSpan};
|
use rustc_errors::{Applicability, DiagCtxt, IntoDiagArg, MultiSpan};
|
||||||
use rustc_feature::{AttributeDuplicates, AttributeType, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP};
|
use rustc_feature::{AttributeDuplicates, AttributeType, BuiltinAttribute, BUILTIN_ATTRIBUTE_MAP};
|
||||||
use rustc_hir as hir;
|
|
||||||
use rustc_hir::def_id::LocalModDefId;
|
use rustc_hir::def_id::LocalModDefId;
|
||||||
use rustc_hir::intravisit::{self, Visitor};
|
use rustc_hir::intravisit::{self, Visitor};
|
||||||
|
use rustc_hir::{self as hir};
|
||||||
use rustc_hir::{
|
use rustc_hir::{
|
||||||
self, FnSig, ForeignItem, HirId, Item, ItemKind, TraitItem, CRATE_HIR_ID, CRATE_OWNER_ID,
|
self, FnSig, ForeignItem, HirId, Item, ItemKind, TraitItem, CRATE_HIR_ID, CRATE_OWNER_ID,
|
||||||
};
|
};
|
||||||
@ -519,7 +519,26 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||||||
self.dcx().emit_err(errors::NakedTrackedCaller { attr_span });
|
self.dcx().emit_err(errors::NakedTrackedCaller { attr_span });
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
Target::Fn | Target::Method(..) | Target::ForeignFn | Target::Closure => true,
|
Target::Fn => {
|
||||||
|
// `#[track_caller]` is not valid on weak lang items because they are called via
|
||||||
|
// `extern` declarations and `#[track_caller]` would alter their ABI.
|
||||||
|
if let Some((lang_item, _)) = hir::lang_items::extract(attrs)
|
||||||
|
&& let Some(item) = hir::LangItem::from_name(lang_item)
|
||||||
|
&& item.is_weak()
|
||||||
|
{
|
||||||
|
let sig = self.tcx.hir_node(hir_id).fn_sig().unwrap();
|
||||||
|
|
||||||
|
self.dcx().emit_err(errors::LangItemWithTrackCaller {
|
||||||
|
attr_span,
|
||||||
|
name: lang_item,
|
||||||
|
sig_span: sig.span,
|
||||||
|
});
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Target::Method(..) | Target::ForeignFn | Target::Closure => true,
|
||||||
// FIXME(#80564): We permit struct fields, match arms and macro defs to have an
|
// FIXME(#80564): We permit struct fields, match arms and macro defs to have an
|
||||||
// `#[track_caller]` attribute with just a lint, because we previously
|
// `#[track_caller]` attribute with just a lint, because we previously
|
||||||
// erroneously allowed it and some crates used it accidentally, to be compatible
|
// erroneously allowed it and some crates used it accidentally, to be compatible
|
||||||
@ -602,7 +621,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||||||
) -> bool {
|
) -> bool {
|
||||||
match target {
|
match target {
|
||||||
Target::Fn => {
|
Target::Fn => {
|
||||||
// `#[target_feature]` is not allowed in language items.
|
// `#[target_feature]` is not allowed in lang items.
|
||||||
if let Some((lang_item, _)) = hir::lang_items::extract(attrs)
|
if let Some((lang_item, _)) = hir::lang_items::extract(attrs)
|
||||||
// Calling functions with `#[target_feature]` is
|
// Calling functions with `#[target_feature]` is
|
||||||
// not unsafe on WASM, see #84988
|
// not unsafe on WASM, see #84988
|
||||||
|
@ -819,6 +819,16 @@ pub struct MissingLangItem {
|
|||||||
pub name: Symbol,
|
pub name: Symbol,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(passes_lang_item_fn_with_track_caller)]
|
||||||
|
pub struct LangItemWithTrackCaller {
|
||||||
|
#[primary_span]
|
||||||
|
pub attr_span: Span,
|
||||||
|
pub name: Symbol,
|
||||||
|
#[label]
|
||||||
|
pub sig_span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(passes_lang_item_fn_with_target_feature)]
|
#[diag(passes_lang_item_fn_with_target_feature)]
|
||||||
pub struct LangItemWithTargetFeature {
|
pub struct LangItemWithTargetFeature {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! Detecting language items.
|
//! Detecting lang items.
|
||||||
//!
|
//!
|
||||||
//! Language items are items that represent concepts intrinsic to the language
|
//! Language items are items that represent concepts intrinsic to the language
|
||||||
//! itself. Examples are:
|
//! itself. Examples are:
|
||||||
|
@ -14,7 +14,7 @@ use crate::errors::{
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// Checks the crate for usage of weak lang items, returning a vector of all the
|
/// Checks the crate for usage of weak lang items, returning a vector of all the
|
||||||
/// language items required by this crate, but not defined yet.
|
/// lang items required by this crate, but not defined yet.
|
||||||
pub fn check_crate(tcx: TyCtxt<'_>, items: &mut lang_items::LanguageItems, krate: &ast::Crate) {
|
pub fn check_crate(tcx: TyCtxt<'_>, items: &mut lang_items::LanguageItems, krate: &ast::Crate) {
|
||||||
// These are never called by user code, they're generated by the compiler.
|
// These are never called by user code, they're generated by the compiler.
|
||||||
// They will never implicitly be added to the `missing` array unless we do
|
// They will never implicitly be added to the `missing` array unless we do
|
||||||
|
@ -1042,7 +1042,7 @@ pub struct Resolver<'a, 'tcx> {
|
|||||||
block_map: NodeMap<Module<'a>>,
|
block_map: NodeMap<Module<'a>>,
|
||||||
/// A fake module that contains no definition and no prelude. Used so that
|
/// A fake module that contains no definition and no prelude. Used so that
|
||||||
/// some AST passes can generate identifiers that only resolve to local or
|
/// some AST passes can generate identifiers that only resolve to local or
|
||||||
/// language items.
|
/// lang items.
|
||||||
empty_module: Module<'a>,
|
empty_module: Module<'a>,
|
||||||
module_map: FxHashMap<DefId, Module<'a>>,
|
module_map: FxHashMap<DefId, Module<'a>>,
|
||||||
binding_parent_modules: FxHashMap<NameBinding<'a>, Module<'a>>,
|
binding_parent_modules: FxHashMap<NameBinding<'a>, Module<'a>>,
|
||||||
|
@ -1348,7 +1348,7 @@ symbols! {
|
|||||||
panic_misaligned_pointer_dereference,
|
panic_misaligned_pointer_dereference,
|
||||||
panic_nounwind,
|
panic_nounwind,
|
||||||
panic_runtime,
|
panic_runtime,
|
||||||
panic_str,
|
panic_str_2015,
|
||||||
panic_unwind,
|
panic_unwind,
|
||||||
panicking,
|
panicking,
|
||||||
param_attrs,
|
param_attrs,
|
||||||
|
@ -554,7 +554,7 @@
|
|||||||
#![stable(feature = "rust1", since = "1.0.0")]
|
#![stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|
||||||
use crate::iter::{self, FusedIterator, TrustedLen};
|
use crate::iter::{self, FusedIterator, TrustedLen};
|
||||||
use crate::panicking::{panic, panic_str};
|
use crate::panicking::{panic, panic_display};
|
||||||
use crate::pin::Pin;
|
use crate::pin::Pin;
|
||||||
use crate::{
|
use crate::{
|
||||||
cmp, convert, hint, mem,
|
cmp, convert, hint, mem,
|
||||||
@ -1991,7 +1991,7 @@ const fn unwrap_failed() -> ! {
|
|||||||
#[track_caller]
|
#[track_caller]
|
||||||
#[rustc_const_unstable(feature = "const_option", issue = "67441")]
|
#[rustc_const_unstable(feature = "const_option", issue = "67441")]
|
||||||
const fn expect_failed(msg: &str) -> ! {
|
const fn expect_failed(msg: &str) -> ! {
|
||||||
panic_str(msg)
|
panic_display(&msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -27,9 +27,9 @@ pub macro panic_2015 {
|
|||||||
($msg:literal $(,)?) => (
|
($msg:literal $(,)?) => (
|
||||||
$crate::panicking::panic($msg)
|
$crate::panicking::panic($msg)
|
||||||
),
|
),
|
||||||
// Use `panic_str` instead of `panic_display::<&str>` for non_fmt_panic lint.
|
// Use `panic_str_2015` instead of `panic_display::<&str>` for non_fmt_panic lint.
|
||||||
($msg:expr $(,)?) => ({
|
($msg:expr $(,)?) => ({
|
||||||
$crate::panicking::panic_str($msg);
|
$crate::panicking::panic_str_2015($msg);
|
||||||
}),
|
}),
|
||||||
// Special-case the single-argument case for const_panic.
|
// Special-case the single-argument case for const_panic.
|
||||||
("{}", $arg:expr $(,)?) => ({
|
("{}", $arg:expr $(,)?) => ({
|
||||||
|
@ -124,8 +124,8 @@ pub const fn panic_nounwind_fmt(fmt: fmt::Arguments<'_>, force_no_backtrace: boo
|
|||||||
// above.
|
// above.
|
||||||
|
|
||||||
/// The underlying implementation of core's `panic!` macro when no formatting is used.
|
/// The underlying implementation of core's `panic!` macro when no formatting is used.
|
||||||
// never inline unless panic_immediate_abort to avoid code
|
// Never inline unless panic_immediate_abort to avoid code
|
||||||
// bloat at the call sites as much as possible
|
// bloat at the call sites as much as possible.
|
||||||
#[cfg_attr(not(feature = "panic_immediate_abort"), inline(never), cold)]
|
#[cfg_attr(not(feature = "panic_immediate_abort"), inline(never), cold)]
|
||||||
#[cfg_attr(feature = "panic_immediate_abort", inline)]
|
#[cfg_attr(feature = "panic_immediate_abort", inline)]
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
@ -138,6 +138,11 @@ pub const fn panic(expr: &'static str) -> ! {
|
|||||||
// truncation and padding (even though none is used here). Using
|
// truncation and padding (even though none is used here). Using
|
||||||
// Arguments::new_const may allow the compiler to omit Formatter::pad from the
|
// Arguments::new_const may allow the compiler to omit Formatter::pad from the
|
||||||
// output binary, saving up to a few kilobytes.
|
// output binary, saving up to a few kilobytes.
|
||||||
|
// However, this optimization only works for `'static` strings: `new_const` also makes this
|
||||||
|
// message return `Some` from `Arguments::as_str`, which means it can become part of the panic
|
||||||
|
// payload without any allocation or copying. Shorter-lived strings would become invalid as
|
||||||
|
// stack frames get popped during unwinding, and couldn't be directly referenced from the
|
||||||
|
// payload.
|
||||||
panic_fmt(fmt::Arguments::new_const(&[expr]));
|
panic_fmt(fmt::Arguments::new_const(&[expr]));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,14 +228,6 @@ pub fn panic_nounwind_nobacktrace(expr: &'static str) -> ! {
|
|||||||
panic_nounwind_fmt(fmt::Arguments::new_const(&[expr]), /* force_no_backtrace */ true);
|
panic_nounwind_fmt(fmt::Arguments::new_const(&[expr]), /* force_no_backtrace */ true);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
|
||||||
#[track_caller]
|
|
||||||
#[rustc_diagnostic_item = "panic_str"]
|
|
||||||
#[rustc_const_unstable(feature = "panic_internals", issue = "none")]
|
|
||||||
pub const fn panic_str(expr: &str) -> ! {
|
|
||||||
panic_display(&expr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
#[cfg_attr(not(feature = "panic_immediate_abort"), inline(never), cold)]
|
#[cfg_attr(not(feature = "panic_immediate_abort"), inline(never), cold)]
|
||||||
#[cfg_attr(feature = "panic_immediate_abort", inline)]
|
#[cfg_attr(feature = "panic_immediate_abort", inline)]
|
||||||
@ -246,6 +243,16 @@ pub fn unreachable_display<T: fmt::Display>(x: &T) -> ! {
|
|||||||
panic_fmt(format_args!("internal error: entered unreachable code: {}", *x));
|
panic_fmt(format_args!("internal error: entered unreachable code: {}", *x));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This exists solely for the 2015 edition `panic!` macro to trigger
|
||||||
|
/// a lint on `panic!(my_str_variable);`.
|
||||||
|
#[inline]
|
||||||
|
#[track_caller]
|
||||||
|
#[rustc_diagnostic_item = "panic_str_2015"]
|
||||||
|
#[rustc_const_unstable(feature = "panic_internals", issue = "none")]
|
||||||
|
pub const fn panic_str_2015(expr: &str) -> ! {
|
||||||
|
panic_display(&expr);
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
#[rustc_do_not_const_check] // hooked by const-eval
|
#[rustc_do_not_const_check] // hooked by const-eval
|
||||||
|
@ -16,7 +16,7 @@ fn foo(
|
|||||||
|
|
||||||
fn skip_on_statements() {
|
fn skip_on_statements() {
|
||||||
#[rustfmt::skip]
|
#[rustfmt::skip]
|
||||||
5+3;
|
{ 5+3; }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[rustfmt::skip]
|
#[rustfmt::skip]
|
||||||
@ -33,11 +33,11 @@ mod foo {
|
|||||||
#[clippy::msrv = "1.29"]
|
#[clippy::msrv = "1.29"]
|
||||||
fn msrv_1_29() {
|
fn msrv_1_29() {
|
||||||
#[cfg_attr(rustfmt, rustfmt::skip)]
|
#[cfg_attr(rustfmt, rustfmt::skip)]
|
||||||
1+29;
|
{ 1+29; }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[clippy::msrv = "1.30"]
|
#[clippy::msrv = "1.30"]
|
||||||
fn msrv_1_30() {
|
fn msrv_1_30() {
|
||||||
#[rustfmt::skip]
|
#[rustfmt::skip]
|
||||||
1+30;
|
{ 1+30; }
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ fn foo(
|
|||||||
|
|
||||||
fn skip_on_statements() {
|
fn skip_on_statements() {
|
||||||
#[cfg_attr(rustfmt, rustfmt::skip)]
|
#[cfg_attr(rustfmt, rustfmt::skip)]
|
||||||
5+3;
|
{ 5+3; }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||||
@ -33,11 +33,11 @@ mod foo {
|
|||||||
#[clippy::msrv = "1.29"]
|
#[clippy::msrv = "1.29"]
|
||||||
fn msrv_1_29() {
|
fn msrv_1_29() {
|
||||||
#[cfg_attr(rustfmt, rustfmt::skip)]
|
#[cfg_attr(rustfmt, rustfmt::skip)]
|
||||||
1+29;
|
{ 1+29; }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[clippy::msrv = "1.30"]
|
#[clippy::msrv = "1.30"]
|
||||||
fn msrv_1_30() {
|
fn msrv_1_30() {
|
||||||
#[cfg_attr(rustfmt, rustfmt::skip)]
|
#[cfg_attr(rustfmt, rustfmt::skip)]
|
||||||
1+30;
|
{ 1+30; }
|
||||||
}
|
}
|
||||||
|
@ -214,8 +214,8 @@ type Os = NoSource;
|
|||||||
// #3313
|
// #3313
|
||||||
fn stmt_expr_attributes() {
|
fn stmt_expr_attributes() {
|
||||||
let foo ;
|
let foo ;
|
||||||
#[must_use]
|
(#[must_use]
|
||||||
foo = false ;
|
foo) = false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// #3509
|
// #3509
|
||||||
|
@ -248,8 +248,8 @@ type Os = NoSource;
|
|||||||
// #3313
|
// #3313
|
||||||
fn stmt_expr_attributes() {
|
fn stmt_expr_attributes() {
|
||||||
let foo;
|
let foo;
|
||||||
#[must_use]
|
(#[must_use]
|
||||||
foo = false;
|
foo) = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// #3509
|
// #3509
|
||||||
|
@ -13,17 +13,17 @@ fn syntax() {
|
|||||||
let _ = #[attr] ();
|
let _ = #[attr] ();
|
||||||
let _ = #[attr] (#[attr] 0,);
|
let _ = #[attr] (#[attr] 0,);
|
||||||
let _ = #[attr] (#[attr] 0, 0);
|
let _ = #[attr] (#[attr] 0, 0);
|
||||||
let _ = #[attr] 0 + #[attr] 0;
|
let _ = (#[attr] 0) + #[attr] 0;
|
||||||
let _ = #[attr] 0 / #[attr] 0;
|
let _ = (#[attr] 0) / #[attr] 0;
|
||||||
let _ = #[attr] 0 & #[attr] 0;
|
let _ = (#[attr] 0) & #[attr] 0;
|
||||||
let _ = #[attr] 0 % #[attr] 0;
|
let _ = (#[attr] 0) % #[attr] 0;
|
||||||
let _ = #[attr] (0 + 0);
|
let _ = #[attr] (0 + 0);
|
||||||
let _ = #[attr] !0;
|
let _ = #[attr] !0;
|
||||||
let _ = #[attr] -0;
|
let _ = #[attr] -0;
|
||||||
let _ = #[attr] false;
|
let _ = #[attr] false;
|
||||||
let _ = #[attr] 0;
|
let _ = #[attr] 0;
|
||||||
let _ = #[attr] 'c';
|
let _ = #[attr] 'c';
|
||||||
let _ = #[attr] x as Y;
|
let _ = (#[attr] x) as Y;
|
||||||
let _ = #[attr] (x as Y);
|
let _ = #[attr] (x as Y);
|
||||||
let _ =
|
let _ =
|
||||||
#[attr] while true {
|
#[attr] while true {
|
||||||
@ -88,9 +88,9 @@ fn syntax() {
|
|||||||
let _ = ();
|
let _ = ();
|
||||||
foo
|
foo
|
||||||
};
|
};
|
||||||
let _ = #[attr] x = y;
|
let _ = (#[attr] x) = y;
|
||||||
let _ = #[attr] (x = y);
|
let _ = #[attr] (x = y);
|
||||||
let _ = #[attr] x += y;
|
let _ = (#[attr] x) += y;
|
||||||
let _ = #[attr] (x += y);
|
let _ = #[attr] (x += y);
|
||||||
let _ = #[attr] foo.bar;
|
let _ = #[attr] foo.bar;
|
||||||
let _ = (#[attr] foo).bar;
|
let _ = (#[attr] foo).bar;
|
||||||
@ -98,8 +98,8 @@ fn syntax() {
|
|||||||
let _ = (#[attr] foo).0;
|
let _ = (#[attr] foo).0;
|
||||||
let _ = #[attr] foo[bar];
|
let _ = #[attr] foo[bar];
|
||||||
let _ = (#[attr] foo)[bar];
|
let _ = (#[attr] foo)[bar];
|
||||||
let _ = #[attr] 0..#[attr] 0;
|
let _ = (#[attr] 0)..#[attr] 0;
|
||||||
let _ = #[attr] 0..;
|
let _ = (#[attr] 0)..;
|
||||||
let _ = #[attr] (0..0);
|
let _ = #[attr] (0..0);
|
||||||
let _ = #[attr] (0..);
|
let _ = #[attr] (0..);
|
||||||
let _ = #[attr] (..0);
|
let _ = #[attr] (..0);
|
||||||
|
@ -148,13 +148,13 @@ fn _11() {
|
|||||||
let _ = #[rustc_dummy] (0);
|
let _ = #[rustc_dummy] (0);
|
||||||
let _ = #[rustc_dummy] (0,);
|
let _ = #[rustc_dummy] (0,);
|
||||||
let _ = #[rustc_dummy] (0, 0);
|
let _ = #[rustc_dummy] (0, 0);
|
||||||
let _ = #[rustc_dummy] 0 + #[rustc_dummy] 0;
|
let _ = (#[rustc_dummy] 0) + #[rustc_dummy] 0;
|
||||||
let _ = #[rustc_dummy] !0;
|
let _ = #[rustc_dummy] !0;
|
||||||
let _ = #[rustc_dummy] -0i32;
|
let _ = #[rustc_dummy] -0i32;
|
||||||
let _ = #[rustc_dummy] false;
|
let _ = #[rustc_dummy] false;
|
||||||
let _ = #[rustc_dummy] 'c';
|
let _ = #[rustc_dummy] 'c';
|
||||||
let _ = #[rustc_dummy] 0;
|
let _ = #[rustc_dummy] 0;
|
||||||
let _ = #[rustc_dummy] 0 as usize;
|
let _ = (#[rustc_dummy] 0) as usize;
|
||||||
let _ =
|
let _ =
|
||||||
#[rustc_dummy] while false {
|
#[rustc_dummy] while false {
|
||||||
#![rustc_dummy]
|
#![rustc_dummy]
|
||||||
@ -214,8 +214,8 @@ fn _11() {
|
|||||||
#![rustc_dummy]
|
#![rustc_dummy]
|
||||||
};
|
};
|
||||||
let mut x = 0;
|
let mut x = 0;
|
||||||
let _ = #[rustc_dummy] x = 15;
|
let _ = (#[rustc_dummy] x) = 15;
|
||||||
let _ = #[rustc_dummy] x += 15;
|
let _ = (#[rustc_dummy] x) += 15;
|
||||||
let s = Foo { data: () };
|
let s = Foo { data: () };
|
||||||
let _ = #[rustc_dummy] s.data;
|
let _ = #[rustc_dummy] s.data;
|
||||||
let _ = (#[rustc_dummy] s).data;
|
let _ = (#[rustc_dummy] s).data;
|
||||||
@ -225,8 +225,8 @@ fn _11() {
|
|||||||
let v = vec!(0);
|
let v = vec!(0);
|
||||||
let _ = #[rustc_dummy] v[0];
|
let _ = #[rustc_dummy] v[0];
|
||||||
let _ = (#[rustc_dummy] v)[0];
|
let _ = (#[rustc_dummy] v)[0];
|
||||||
let _ = #[rustc_dummy] 0..#[rustc_dummy] 0;
|
let _ = (#[rustc_dummy] 0)..#[rustc_dummy] 0;
|
||||||
let _ = #[rustc_dummy] 0..;
|
let _ = (#[rustc_dummy] 0)..;
|
||||||
let _ = #[rustc_dummy] (0..0);
|
let _ = #[rustc_dummy] (0..0);
|
||||||
let _ = #[rustc_dummy] (0..);
|
let _ = #[rustc_dummy] (0..);
|
||||||
let _ = #[rustc_dummy] (..0);
|
let _ = #[rustc_dummy] (..0);
|
||||||
|
@ -137,9 +137,9 @@ fn generate_input(path: &str) -> std::io::Result<()> {
|
|||||||
write!(
|
write!(
|
||||||
file,
|
file,
|
||||||
r#"
|
r#"
|
||||||
#![feature(panic_internals)]
|
fn panic_str(msg: &str) {{ panic!("{{}}", msg); }}
|
||||||
pub fn dummy() {{
|
pub fn dummy() {{
|
||||||
core::panicking::panic_str("oops");
|
panic_str("oops");
|
||||||
}}
|
}}
|
||||||
"#
|
"#
|
||||||
)?;
|
)?;
|
||||||
|
@ -1,26 +1,26 @@
|
|||||||
error[E0522]: definition of an unknown language item: `dummy_lang_item_1`
|
error[E0522]: definition of an unknown lang item: `dummy_lang_item_1`
|
||||||
--> $DIR/assoc-lang-items.rs:4:5
|
--> $DIR/assoc-lang-items.rs:4:5
|
||||||
|
|
|
|
||||||
LL | #[lang = "dummy_lang_item_1"]
|
LL | #[lang = "dummy_lang_item_1"]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown language item `dummy_lang_item_1`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown lang item `dummy_lang_item_1`
|
||||||
|
|
||||||
error[E0522]: definition of an unknown language item: `dummy_lang_item_2`
|
error[E0522]: definition of an unknown lang item: `dummy_lang_item_2`
|
||||||
--> $DIR/assoc-lang-items.rs:7:5
|
--> $DIR/assoc-lang-items.rs:7:5
|
||||||
|
|
|
|
||||||
LL | #[lang = "dummy_lang_item_2"]
|
LL | #[lang = "dummy_lang_item_2"]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown language item `dummy_lang_item_2`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown lang item `dummy_lang_item_2`
|
||||||
|
|
||||||
error[E0522]: definition of an unknown language item: `dummy_lang_item_3`
|
error[E0522]: definition of an unknown lang item: `dummy_lang_item_3`
|
||||||
--> $DIR/assoc-lang-items.rs:10:5
|
--> $DIR/assoc-lang-items.rs:10:5
|
||||||
|
|
|
|
||||||
LL | #[lang = "dummy_lang_item_3"]
|
LL | #[lang = "dummy_lang_item_3"]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown language item `dummy_lang_item_3`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown lang item `dummy_lang_item_3`
|
||||||
|
|
||||||
error[E0522]: definition of an unknown language item: `dummy_lang_item_4`
|
error[E0522]: definition of an unknown lang item: `dummy_lang_item_4`
|
||||||
--> $DIR/assoc-lang-items.rs:17:5
|
--> $DIR/assoc-lang-items.rs:17:5
|
||||||
|
|
|
|
||||||
LL | #[lang = "dummy_lang_item_4"]
|
LL | #[lang = "dummy_lang_item_4"]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown language item `dummy_lang_item_4`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition of unknown lang item `dummy_lang_item_4`
|
||||||
|
|
||||||
error: aborting due to 4 previous errors
|
error: aborting due to 4 previous errors
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#[lang = "cookie"]
|
#[lang = "cookie"]
|
||||||
fn cookie() -> ! {
|
fn cookie() -> ! {
|
||||||
//~^^ ERROR definition of an unknown language item: `cookie` [E0522]
|
//~^^ ERROR definition of an unknown lang item: `cookie` [E0522]
|
||||||
loop {}
|
loop {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error[E0522]: definition of an unknown language item: `cookie`
|
error[E0522]: definition of an unknown lang item: `cookie`
|
||||||
--> $DIR/E0522.rs:3:1
|
--> $DIR/E0522.rs:3:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "cookie"]
|
LL | #[lang = "cookie"]
|
||||||
| ^^^^^^^^^^^^^^^^^^ definition of unknown language item `cookie`
|
| ^^^^^^^^^^^^^^^^^^ definition of unknown lang item `cookie`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#![feature(lang_items)]
|
#![feature(lang_items)]
|
||||||
|
|
||||||
// Box is expected to be a struct, so this will error.
|
// Box is expected to be a struct, so this will error.
|
||||||
#[lang = "owned_box"] //~ ERROR language item must be applied to a struct
|
#[lang = "owned_box"] //~ ERROR lang item must be applied to a struct
|
||||||
static X: u32 = 42;
|
static X: u32 = 42;
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0718]: `owned_box` language item must be applied to a struct
|
error[E0718]: `owned_box` lang item must be applied to a struct
|
||||||
--> $DIR/E0718.rs:4:1
|
--> $DIR/E0718.rs:4:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "owned_box"]
|
LL | #[lang = "owned_box"]
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#[lang = "foo"] //~ ERROR language items are subject to change
|
#[lang = "foo"] //~ ERROR lang items are subject to change
|
||||||
//~^ ERROR definition of an unknown language item: `foo`
|
//~^ ERROR definition of an unknown lang item: `foo`
|
||||||
trait Foo {}
|
trait Foo {}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0658]: language items are subject to change
|
error[E0658]: lang items are subject to change
|
||||||
--> $DIR/feature-gate-lang-items.rs:1:1
|
--> $DIR/feature-gate-lang-items.rs:1:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "foo"]
|
LL | #[lang = "foo"]
|
||||||
@ -7,11 +7,11 @@ LL | #[lang = "foo"]
|
|||||||
= help: add `#![feature(lang_items)]` to the crate attributes to enable
|
= help: add `#![feature(lang_items)]` to the crate attributes to enable
|
||||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error[E0522]: definition of an unknown language item: `foo`
|
error[E0522]: definition of an unknown lang item: `foo`
|
||||||
--> $DIR/feature-gate-lang-items.rs:1:1
|
--> $DIR/feature-gate-lang-items.rs:1:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "foo"]
|
LL | #[lang = "foo"]
|
||||||
| ^^^^^^^^^^^^^^^ definition of unknown language item `foo`
|
| ^^^^^^^^^^^^^^^ definition of unknown lang item `foo`
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
@ -5,12 +5,12 @@
|
|||||||
#![no_core]
|
#![no_core]
|
||||||
|
|
||||||
#[lang = "sized"]
|
#[lang = "sized"]
|
||||||
//~^ ERROR: language items are subject to change [E0658]
|
//~^ ERROR: lang items are subject to change [E0658]
|
||||||
trait Sized {}
|
trait Sized {}
|
||||||
|
|
||||||
#[lang = "fn"]
|
#[lang = "fn"]
|
||||||
//~^ ERROR: language items are subject to change [E0658]
|
//~^ ERROR: lang items are subject to change [E0658]
|
||||||
//~| ERROR: `fn` language item must be applied to a trait with 1 generic argument
|
//~| ERROR: `fn` lang item must be applied to a trait with 1 generic argument
|
||||||
trait Fn {
|
trait Fn {
|
||||||
fn call(export_name);
|
fn call(export_name);
|
||||||
//~^ ERROR: expected type
|
//~^ ERROR: expected type
|
||||||
|
@ -4,7 +4,7 @@ error[E0573]: expected type, found built-in attribute `export_name`
|
|||||||
LL | fn call(export_name);
|
LL | fn call(export_name);
|
||||||
| ^^^^^^^^^^^ not a type
|
| ^^^^^^^^^^^ not a type
|
||||||
|
|
||||||
error[E0658]: language items are subject to change
|
error[E0658]: lang items are subject to change
|
||||||
--> $DIR/issue-83471.rs:7:1
|
--> $DIR/issue-83471.rs:7:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "sized"]
|
LL | #[lang = "sized"]
|
||||||
@ -13,7 +13,7 @@ LL | #[lang = "sized"]
|
|||||||
= help: add `#![feature(lang_items)]` to the crate attributes to enable
|
= help: add `#![feature(lang_items)]` to the crate attributes to enable
|
||||||
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
|
||||||
|
|
||||||
error[E0658]: language items are subject to change
|
error[E0658]: lang items are subject to change
|
||||||
--> $DIR/issue-83471.rs:11:1
|
--> $DIR/issue-83471.rs:11:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "fn"]
|
LL | #[lang = "fn"]
|
||||||
@ -32,7 +32,7 @@ LL | fn call(export_name);
|
|||||||
= note: for more information, see issue #41686 <https://github.com/rust-lang/rust/issues/41686>
|
= note: for more information, see issue #41686 <https://github.com/rust-lang/rust/issues/41686>
|
||||||
= note: `#[warn(anonymous_parameters)]` on by default
|
= note: `#[warn(anonymous_parameters)]` on by default
|
||||||
|
|
||||||
error[E0718]: `fn` language item must be applied to a trait with 1 generic argument
|
error[E0718]: `fn` lang item must be applied to a trait with 1 generic argument
|
||||||
--> $DIR/issue-83471.rs:11:1
|
--> $DIR/issue-83471.rs:11:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "fn"]
|
LL | #[lang = "fn"]
|
||||||
|
@ -18,11 +18,11 @@ trait Sync {}
|
|||||||
impl Sync for bool {}
|
impl Sync for bool {}
|
||||||
|
|
||||||
#[lang = "drop_in_place"]
|
#[lang = "drop_in_place"]
|
||||||
//~^ ERROR: `drop_in_place` language item must be applied to a function with at least 1 generic argument
|
//~^ ERROR: `drop_in_place` lang item must be applied to a function with at least 1 generic argument
|
||||||
fn drop_fn() {
|
fn drop_fn() {
|
||||||
while false {}
|
while false {}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[lang = "start"]
|
#[lang = "start"]
|
||||||
//~^ ERROR: `start` language item must be applied to a function with 1 generic argument
|
//~^ ERROR: `start` lang item must be applied to a function with 1 generic argument
|
||||||
fn start(){}
|
fn start(){}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0718]: `drop_in_place` language item must be applied to a function with at least 1 generic argument
|
error[E0718]: `drop_in_place` lang item must be applied to a function with at least 1 generic argument
|
||||||
--> $DIR/issue-87573.rs:20:1
|
--> $DIR/issue-87573.rs:20:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "drop_in_place"]
|
LL | #[lang = "drop_in_place"]
|
||||||
@ -7,7 +7,7 @@ LL |
|
|||||||
LL | fn drop_fn() {
|
LL | fn drop_fn() {
|
||||||
| - this function has 0 generic arguments
|
| - this function has 0 generic arguments
|
||||||
|
|
||||||
error[E0718]: `start` language item must be applied to a function with 1 generic argument
|
error[E0718]: `start` lang item must be applied to a function with 1 generic argument
|
||||||
--> $DIR/issue-87573.rs:26:1
|
--> $DIR/issue-87573.rs:26:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "start"]
|
LL | #[lang = "start"]
|
||||||
|
@ -9,30 +9,30 @@ trait MySized {}
|
|||||||
|
|
||||||
#[lang = "add"]
|
#[lang = "add"]
|
||||||
trait MyAdd<'a, T> {}
|
trait MyAdd<'a, T> {}
|
||||||
//~^^ ERROR: `add` language item must be applied to a trait with 1 generic argument [E0718]
|
//~^^ ERROR: `add` lang item must be applied to a trait with 1 generic argument [E0718]
|
||||||
|
|
||||||
#[lang = "drop_in_place"]
|
#[lang = "drop_in_place"]
|
||||||
//~^ ERROR `drop_in_place` language item must be applied to a function with at least 1 generic
|
//~^ ERROR `drop_in_place` lang item must be applied to a function with at least 1 generic
|
||||||
fn my_ptr_drop() {}
|
fn my_ptr_drop() {}
|
||||||
|
|
||||||
#[lang = "index"]
|
#[lang = "index"]
|
||||||
trait MyIndex<'a, T> {}
|
trait MyIndex<'a, T> {}
|
||||||
//~^^ ERROR: `index` language item must be applied to a trait with 1 generic argument [E0718]
|
//~^^ ERROR: `index` lang item must be applied to a trait with 1 generic argument [E0718]
|
||||||
|
|
||||||
#[lang = "phantom_data"]
|
#[lang = "phantom_data"]
|
||||||
//~^ ERROR `phantom_data` language item must be applied to a struct with 1 generic argument
|
//~^ ERROR `phantom_data` lang item must be applied to a struct with 1 generic argument
|
||||||
struct MyPhantomData<T, U>;
|
struct MyPhantomData<T, U>;
|
||||||
//~^ ERROR `T` is never used
|
//~^ ERROR `T` is never used
|
||||||
//~| ERROR `U` is never used
|
//~| ERROR `U` is never used
|
||||||
|
|
||||||
#[lang = "owned_box"]
|
#[lang = "owned_box"]
|
||||||
//~^ ERROR `owned_box` language item must be applied to a struct with at least 1 generic argument
|
//~^ ERROR `owned_box` lang item must be applied to a struct with at least 1 generic argument
|
||||||
struct Foo;
|
struct Foo;
|
||||||
|
|
||||||
// When the `start` lang item is missing generics very odd things can happen, especially when
|
// When the `start` lang item is missing generics very odd things can happen, especially when
|
||||||
// it comes to cross-crate monomorphization
|
// it comes to cross-crate monomorphization
|
||||||
#[lang = "start"]
|
#[lang = "start"]
|
||||||
//~^ ERROR `start` language item must be applied to a function with 1 generic argument [E0718]
|
//~^ ERROR `start` lang item must be applied to a function with 1 generic argument [E0718]
|
||||||
fn start(_: *const u8, _: isize, _: *const *const u8) -> isize {
|
fn start(_: *const u8, _: isize, _: *const *const u8) -> isize {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0718]: `add` language item must be applied to a trait with 1 generic argument
|
error[E0718]: `add` lang item must be applied to a trait with 1 generic argument
|
||||||
--> $DIR/lang-item-generic-requirements.rs:10:1
|
--> $DIR/lang-item-generic-requirements.rs:10:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "add"]
|
LL | #[lang = "add"]
|
||||||
@ -6,7 +6,7 @@ LL | #[lang = "add"]
|
|||||||
LL | trait MyAdd<'a, T> {}
|
LL | trait MyAdd<'a, T> {}
|
||||||
| ------- this trait has 2 generic arguments
|
| ------- this trait has 2 generic arguments
|
||||||
|
|
||||||
error[E0718]: `drop_in_place` language item must be applied to a function with at least 1 generic argument
|
error[E0718]: `drop_in_place` lang item must be applied to a function with at least 1 generic argument
|
||||||
--> $DIR/lang-item-generic-requirements.rs:14:1
|
--> $DIR/lang-item-generic-requirements.rs:14:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "drop_in_place"]
|
LL | #[lang = "drop_in_place"]
|
||||||
@ -15,7 +15,7 @@ LL |
|
|||||||
LL | fn my_ptr_drop() {}
|
LL | fn my_ptr_drop() {}
|
||||||
| - this function has 0 generic arguments
|
| - this function has 0 generic arguments
|
||||||
|
|
||||||
error[E0718]: `index` language item must be applied to a trait with 1 generic argument
|
error[E0718]: `index` lang item must be applied to a trait with 1 generic argument
|
||||||
--> $DIR/lang-item-generic-requirements.rs:18:1
|
--> $DIR/lang-item-generic-requirements.rs:18:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "index"]
|
LL | #[lang = "index"]
|
||||||
@ -23,7 +23,7 @@ LL | #[lang = "index"]
|
|||||||
LL | trait MyIndex<'a, T> {}
|
LL | trait MyIndex<'a, T> {}
|
||||||
| ------- this trait has 2 generic arguments
|
| ------- this trait has 2 generic arguments
|
||||||
|
|
||||||
error[E0718]: `phantom_data` language item must be applied to a struct with 1 generic argument
|
error[E0718]: `phantom_data` lang item must be applied to a struct with 1 generic argument
|
||||||
--> $DIR/lang-item-generic-requirements.rs:22:1
|
--> $DIR/lang-item-generic-requirements.rs:22:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "phantom_data"]
|
LL | #[lang = "phantom_data"]
|
||||||
@ -32,7 +32,7 @@ LL |
|
|||||||
LL | struct MyPhantomData<T, U>;
|
LL | struct MyPhantomData<T, U>;
|
||||||
| ------ this struct has 2 generic arguments
|
| ------ this struct has 2 generic arguments
|
||||||
|
|
||||||
error[E0718]: `owned_box` language item must be applied to a struct with at least 1 generic argument
|
error[E0718]: `owned_box` lang item must be applied to a struct with at least 1 generic argument
|
||||||
--> $DIR/lang-item-generic-requirements.rs:28:1
|
--> $DIR/lang-item-generic-requirements.rs:28:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "owned_box"]
|
LL | #[lang = "owned_box"]
|
||||||
@ -41,7 +41,7 @@ LL |
|
|||||||
LL | struct Foo;
|
LL | struct Foo;
|
||||||
| - this struct has 0 generic arguments
|
| - this struct has 0 generic arguments
|
||||||
|
|
||||||
error[E0718]: `start` language item must be applied to a function with 1 generic argument
|
error[E0718]: `start` lang item must be applied to a function with 1 generic argument
|
||||||
--> $DIR/lang-item-generic-requirements.rs:34:1
|
--> $DIR/lang-item-generic-requirements.rs:34:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "start"]
|
LL | #[lang = "start"]
|
||||||
|
@ -11,7 +11,7 @@ pub trait Sized {}
|
|||||||
|
|
||||||
#[lang = "start"]
|
#[lang = "start"]
|
||||||
#[target_feature(enable = "avx2")]
|
#[target_feature(enable = "avx2")]
|
||||||
//~^ ERROR `start` language item function is not allowed to have `#[target_feature]`
|
//~^ ERROR `start` lang item function is not allowed to have `#[target_feature]`
|
||||||
fn start<T>(_main: fn() -> T, _argc: isize, _argv: *const *const u8, _sigpipe: u8) -> isize {
|
fn start<T>(_main: fn() -> T, _argc: isize, _argv: *const *const u8, _sigpipe: u8) -> isize {
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
error: `start` language item function is not allowed to have `#[target_feature]`
|
error: `start` lang item function is not allowed to have `#[target_feature]`
|
||||||
--> $DIR/start_lang_item_with_target_feature.rs:13:1
|
--> $DIR/start_lang_item_with_target_feature.rs:13:1
|
||||||
|
|
|
|
||||||
LL | #[target_feature(enable = "avx2")]
|
LL | #[target_feature(enable = "avx2")]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
LL |
|
LL |
|
||||||
LL | fn start<T>(_main: fn() -> T, _argc: isize, _argv: *const *const u8, _sigpipe: u8) -> isize {
|
LL | fn start<T>(_main: fn() -> T, _argc: isize, _argv: *const *const u8, _sigpipe: u8) -> isize {
|
||||||
| ------------------------------------------------------------------------------------------- `start` language item function is not allowed to have `#[target_feature]`
|
| ------------------------------------------------------------------------------------------- `start` lang item function is not allowed to have `#[target_feature]`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -20,10 +20,10 @@ fn doc_comment_between_if_else(num: u8) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn doc_comment_on_expr(num: u8) -> bool {
|
fn doc_comment_on_expr(num: u8) -> bool {
|
||||||
/// useless doc comment
|
(/// useless doc comment
|
||||||
//~^ ERROR: attributes on expressions are experimental
|
//~^ ERROR: attributes on expressions are experimental
|
||||||
//~| ERROR: unused doc comment
|
//~| ERROR: unused doc comment
|
||||||
num == 3
|
num) == 3
|
||||||
}
|
}
|
||||||
|
|
||||||
fn doc_comment_on_expr_field() -> bool {
|
fn doc_comment_on_expr_field() -> bool {
|
||||||
|
@ -5,10 +5,10 @@ LL | else {
|
|||||||
| ^^^^ expected expression
|
| ^^^^ expected expression
|
||||||
|
|
||||||
error[E0658]: attributes on expressions are experimental
|
error[E0658]: attributes on expressions are experimental
|
||||||
--> $DIR/unused-doc-comments-edge-cases.rs:23:5
|
--> $DIR/unused-doc-comments-edge-cases.rs:23:6
|
||||||
|
|
|
|
||||||
LL | /// useless doc comment
|
LL | (/// useless doc comment
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: see issue #15701 <https://github.com/rust-lang/rust/issues/15701> for more information
|
= note: see issue #15701 <https://github.com/rust-lang/rust/issues/15701> for more information
|
||||||
= help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable
|
= help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable
|
||||||
@ -32,12 +32,12 @@ LL | #![deny(unused_doc_comments)]
|
|||||||
| ^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: unused doc comment
|
error: unused doc comment
|
||||||
--> $DIR/unused-doc-comments-edge-cases.rs:23:5
|
--> $DIR/unused-doc-comments-edge-cases.rs:23:6
|
||||||
|
|
|
|
||||||
LL | /// useless doc comment
|
LL | (/// useless doc comment
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
...
|
...
|
||||||
LL | num == 3
|
LL | num) == 3
|
||||||
| --- rustdoc does not generate documentation for expressions
|
| --- rustdoc does not generate documentation for expressions
|
||||||
|
|
|
|
||||||
= help: use `//` for a plain comment
|
= help: use `//` for a plain comment
|
||||||
|
@ -9,7 +9,7 @@ use core::panic::PanicInfo;
|
|||||||
|
|
||||||
#[panic_handler]
|
#[panic_handler]
|
||||||
#[target_feature(enable = "avx2")]
|
#[target_feature(enable = "avx2")]
|
||||||
//~^ ERROR `panic_impl` language item function is not allowed to have `#[target_feature]`
|
//~^ ERROR `#[panic_handler]` function is not allowed to have `#[target_feature]`
|
||||||
fn panic(info: &PanicInfo) -> ! {
|
fn panic(info: &PanicInfo) -> ! {
|
||||||
unimplemented!();
|
unimplemented!();
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
error: `panic_impl` language item function is not allowed to have `#[target_feature]`
|
error: `#[panic_handler]` function is not allowed to have `#[target_feature]`
|
||||||
--> $DIR/panic-handler-with-target-feature.rs:11:1
|
--> $DIR/panic-handler-with-target-feature.rs:11:1
|
||||||
|
|
|
|
||||||
LL | #[target_feature(enable = "avx2")]
|
LL | #[target_feature(enable = "avx2")]
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
LL |
|
LL |
|
||||||
LL | fn panic(info: &PanicInfo) -> ! {
|
LL | fn panic(info: &PanicInfo) -> ! {
|
||||||
| ------------------------------- `panic_impl` language item function is not allowed to have `#[target_feature]`
|
| ------------------------------- `#[panic_handler]` function is not allowed to have `#[target_feature]`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
14
tests/ui/panic-handler/panic-handler-with-track-caller.rs
Normal file
14
tests/ui/panic-handler/panic-handler-with-track-caller.rs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
//@ compile-flags:-C panic=abort
|
||||||
|
//@ only-x86_64
|
||||||
|
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use core::panic::PanicInfo;
|
||||||
|
|
||||||
|
#[panic_handler]
|
||||||
|
#[track_caller]
|
||||||
|
//~^ ERROR `#[panic_handler]` function is not allowed to have `#[track_caller]`
|
||||||
|
fn panic(info: &PanicInfo) -> ! {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
error: `#[panic_handler]` function is not allowed to have `#[track_caller]`
|
||||||
|
--> $DIR/panic-handler-with-track-caller.rs:10:1
|
||||||
|
|
|
||||||
|
LL | #[track_caller]
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
LL |
|
||||||
|
LL | fn panic(info: &PanicInfo) -> ! {
|
||||||
|
| ------------------------------- `#[panic_handler]` function is not allowed to have `#[target_feature]`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
@ -3,6 +3,6 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
#[panic_handler] //~ ERROR `panic_impl` language item must be applied to a function
|
#[panic_handler] //~ ERROR `panic_impl` lang item must be applied to a function
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
static X: u32 = 42;
|
static X: u32 = 42;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0718]: `panic_impl` language item must be applied to a function
|
error[E0718]: `panic_impl` lang item must be applied to a function
|
||||||
--> $DIR/panic-handler-wrong-location.rs:6:1
|
--> $DIR/panic-handler-wrong-location.rs:6:1
|
||||||
|
|
|
|
||||||
LL | #[panic_handler]
|
LL | #[panic_handler]
|
||||||
|
15
tests/ui/parser/attribute/attr-binary-expr-ambigous.fixed
Normal file
15
tests/ui/parser/attribute/attr-binary-expr-ambigous.fixed
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
//@ run-rustfix
|
||||||
|
#![feature(stmt_expr_attributes)]
|
||||||
|
#![allow(unused_assignments, unused_attributes)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut x = (#[deprecated] 1) + 2; //~ ERROR ambiguous
|
||||||
|
|
||||||
|
(#[deprecated] x) = 4; //~ ERROR ambiguous
|
||||||
|
|
||||||
|
x = (#[deprecated] 5) as i32; //~ ERROR ambiguous
|
||||||
|
|
||||||
|
let _r = (#[deprecated] 1)..6; //~ ERROR ambiguous
|
||||||
|
|
||||||
|
println!("{}", x);
|
||||||
|
}
|
15
tests/ui/parser/attribute/attr-binary-expr-ambigous.rs
Normal file
15
tests/ui/parser/attribute/attr-binary-expr-ambigous.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
//@ run-rustfix
|
||||||
|
#![feature(stmt_expr_attributes)]
|
||||||
|
#![allow(unused_assignments, unused_attributes)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut x = #[deprecated] 1 + 2; //~ ERROR ambiguous
|
||||||
|
|
||||||
|
#[deprecated] x = 4; //~ ERROR ambiguous
|
||||||
|
|
||||||
|
x = #[deprecated] 5 as i32; //~ ERROR ambiguous
|
||||||
|
|
||||||
|
let _r = #[deprecated] 1..6; //~ ERROR ambiguous
|
||||||
|
|
||||||
|
println!("{}", x);
|
||||||
|
}
|
46
tests/ui/parser/attribute/attr-binary-expr-ambigous.stderr
Normal file
46
tests/ui/parser/attribute/attr-binary-expr-ambigous.stderr
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
error: ambiguous outer attributes
|
||||||
|
--> $DIR/attr-binary-expr-ambigous.rs:6:17
|
||||||
|
|
|
||||||
|
LL | let mut x = #[deprecated] 1 + 2;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: wrap the expression in parentheses
|
||||||
|
|
|
||||||
|
LL | let mut x = (#[deprecated] 1) + 2;
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: ambiguous outer attributes
|
||||||
|
--> $DIR/attr-binary-expr-ambigous.rs:8:5
|
||||||
|
|
|
||||||
|
LL | #[deprecated] x = 4;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: wrap the expression in parentheses
|
||||||
|
|
|
||||||
|
LL | (#[deprecated] x) = 4;
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: ambiguous outer attributes
|
||||||
|
--> $DIR/attr-binary-expr-ambigous.rs:10:9
|
||||||
|
|
|
||||||
|
LL | x = #[deprecated] 5 as i32;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: wrap the expression in parentheses
|
||||||
|
|
|
||||||
|
LL | x = (#[deprecated] 5) as i32;
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: ambiguous outer attributes
|
||||||
|
--> $DIR/attr-binary-expr-ambigous.rs:12:14
|
||||||
|
|
|
||||||
|
LL | let _r = #[deprecated] 1..6;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: wrap the expression in parentheses
|
||||||
|
|
|
||||||
|
LL | let _r = (#[deprecated] 1)..6;
|
||||||
|
| + +
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
@ -10,6 +10,5 @@ use test_macros::identity_attr;
|
|||||||
fn main() {
|
fn main() {
|
||||||
let _x;
|
let _x;
|
||||||
let y = ();
|
let y = ();
|
||||||
#[identity_attr]
|
(#[identity_attr] _x) = y;
|
||||||
_x = y;
|
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#[lang = "foo"]
|
#[lang = "foo"]
|
||||||
fn bar() -> ! {
|
fn bar() -> ! {
|
||||||
//~^^ ERROR definition of an unknown language item: `foo`
|
//~^^ ERROR definition of an unknown lang item: `foo`
|
||||||
loop {}
|
loop {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error[E0522]: definition of an unknown language item: `foo`
|
error[E0522]: definition of an unknown lang item: `foo`
|
||||||
--> $DIR/unknown-language-item.rs:4:1
|
--> $DIR/unknown-language-item.rs:4:1
|
||||||
|
|
|
|
||||||
LL | #[lang = "foo"]
|
LL | #[lang = "foo"]
|
||||||
| ^^^^^^^^^^^^^^^ definition of unknown language item `foo`
|
| ^^^^^^^^^^^^^^^ definition of unknown lang item `foo`
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user