Auto merge of #124916 - matthiaskrgr:rollup-vmpmt4u, r=matthiaskrgr
Rollup of 4 pull requests Successful merges: - #124777 (Fix Error Messages for `break` Inside Coroutines) - #124837 (Migrate `run-make/rustdoc-map-file` to rmake) - #124875 (Fix more ICEs in `diagnostic::on_unimplemented`) - #124908 (Handle field projections like slice indexing in invalid_reference_casting) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
5f8c17dcc0
@ -202,7 +202,8 @@ fn is_cast_to_bigger_memory_layout<'tcx>(
|
||||
|
||||
// if the current expr looks like this `&mut expr[index]` then just looking
|
||||
// at `expr[index]` won't give us the underlying allocation, so we just skip it
|
||||
if let ExprKind::Index(..) = e_alloc.kind {
|
||||
// the same logic applies field access like `&mut expr.field`
|
||||
if let ExprKind::Index(..) | ExprKind::Field(..) = e_alloc.kind {
|
||||
return None;
|
||||
}
|
||||
|
||||
|
@ -52,16 +52,16 @@ passes_attr_only_in_functions =
|
||||
passes_both_ffi_const_and_pure =
|
||||
`#[ffi_const]` function cannot be `#[ffi_pure]`
|
||||
|
||||
passes_break_inside_async_block =
|
||||
`{$name}` inside of an `async` block
|
||||
.label = cannot `{$name}` inside of an `async` block
|
||||
.async_block_label = enclosing `async` block
|
||||
|
||||
passes_break_inside_closure =
|
||||
`{$name}` inside of a closure
|
||||
.label = cannot `{$name}` inside of a closure
|
||||
.closure_label = enclosing closure
|
||||
|
||||
passes_break_inside_coroutine =
|
||||
`{$name}` inside `{$kind}` {$source}
|
||||
.label = cannot `{$name}` inside `{$kind}` {$source}
|
||||
.coroutine_label = enclosing `{$kind}` {$source}
|
||||
|
||||
passes_break_non_loop =
|
||||
`break` with value from a `{$kind}` loop
|
||||
.label = can only break with a value inside `loop` or breakable block
|
||||
|
@ -1086,14 +1086,16 @@ pub struct BreakInsideClosure<'a> {
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(passes_break_inside_async_block, code = E0267)]
|
||||
pub struct BreakInsideAsyncBlock<'a> {
|
||||
#[diag(passes_break_inside_coroutine, code = E0267)]
|
||||
pub struct BreakInsideCoroutine<'a> {
|
||||
#[primary_span]
|
||||
#[label]
|
||||
pub span: Span,
|
||||
#[label(passes_async_block_label)]
|
||||
pub closure_span: Span,
|
||||
#[label(passes_coroutine_label)]
|
||||
pub coroutine_span: Span,
|
||||
pub name: &'a str,
|
||||
pub kind: &'a str,
|
||||
pub source: &'a str,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
|
@ -13,7 +13,7 @@
|
||||
use rustc_span::{BytePos, Span};
|
||||
|
||||
use crate::errors::{
|
||||
BreakInsideAsyncBlock, BreakInsideClosure, BreakNonLoop, ContinueLabeledBlock, OutsideLoop,
|
||||
BreakInsideClosure, BreakInsideCoroutine, BreakNonLoop, ContinueLabeledBlock, OutsideLoop,
|
||||
OutsideLoopSuggestion, UnlabeledCfInWhileCondition, UnlabeledInLabeledBlock,
|
||||
};
|
||||
|
||||
@ -23,7 +23,7 @@ enum Context {
|
||||
Fn,
|
||||
Loop(hir::LoopSource),
|
||||
Closure(Span),
|
||||
AsyncClosure(Span),
|
||||
Coroutine { coroutine_span: Span, kind: hir::CoroutineDesugaring, source: hir::CoroutineSource },
|
||||
UnlabeledBlock(Span),
|
||||
LabeledBlock,
|
||||
Constant,
|
||||
@ -89,12 +89,10 @@ fn visit_expr(&mut self, e: &'hir hir::Expr<'hir>) {
|
||||
hir::ExprKind::Closure(&hir::Closure {
|
||||
ref fn_decl, body, fn_decl_span, kind, ..
|
||||
}) => {
|
||||
// FIXME(coroutines): This doesn't handle coroutines correctly
|
||||
let cx = match kind {
|
||||
hir::ClosureKind::Coroutine(hir::CoroutineKind::Desugared(
|
||||
hir::CoroutineDesugaring::Async,
|
||||
hir::CoroutineSource::Block,
|
||||
)) => AsyncClosure(fn_decl_span),
|
||||
hir::ClosureKind::Coroutine(hir::CoroutineKind::Desugared(kind, source)) => {
|
||||
Coroutine { coroutine_span: fn_decl_span, kind, source }
|
||||
}
|
||||
_ => Closure(fn_decl_span),
|
||||
};
|
||||
self.visit_fn_decl(fn_decl);
|
||||
@ -227,8 +225,24 @@ fn require_break_cx(&self, name: &str, span: Span, break_span: Span) {
|
||||
Closure(closure_span) => {
|
||||
self.sess.dcx().emit_err(BreakInsideClosure { span, closure_span, name });
|
||||
}
|
||||
AsyncClosure(closure_span) => {
|
||||
self.sess.dcx().emit_err(BreakInsideAsyncBlock { span, closure_span, name });
|
||||
Coroutine { coroutine_span, kind, source } => {
|
||||
let kind = match kind {
|
||||
hir::CoroutineDesugaring::Async => "async",
|
||||
hir::CoroutineDesugaring::Gen => "gen",
|
||||
hir::CoroutineDesugaring::AsyncGen => "async gen",
|
||||
};
|
||||
let source = match source {
|
||||
hir::CoroutineSource::Block => "block",
|
||||
hir::CoroutineSource::Closure => "closure",
|
||||
hir::CoroutineSource::Fn => "function",
|
||||
};
|
||||
self.sess.dcx().emit_err(BreakInsideCoroutine {
|
||||
span,
|
||||
coroutine_span,
|
||||
name,
|
||||
kind,
|
||||
source,
|
||||
});
|
||||
}
|
||||
UnlabeledBlock(block_span) if is_break && block_span.eq_ctxt(break_span) => {
|
||||
let suggestion = Some(OutsideLoopSuggestion { block_span, break_span });
|
||||
|
@ -350,12 +350,14 @@ fn maybe_emit_warning<'tcx>(
|
||||
option_name: &'static str,
|
||||
) {
|
||||
if let (Some(new_item), Some(old_item)) = (new, old) {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id.expect_local()),
|
||||
new_item,
|
||||
IgnoredDiagnosticOption { span: new_item, prev_span: old_item, option_name },
|
||||
);
|
||||
if let Some(item_def_id) = item_def_id.as_local() {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id),
|
||||
new_item,
|
||||
IgnoredDiagnosticOption { span: new_item, prev_span: old_item, option_name },
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -639,30 +641,38 @@ fn parse_attribute(
|
||||
AttrArgs::Eq(span, AttrArgsEq::Hir(expr)) => span.to(expr.span),
|
||||
};
|
||||
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id.expect_local()),
|
||||
report_span,
|
||||
MalformedOnUnimplementedAttrLint::new(report_span),
|
||||
);
|
||||
if let Some(item_def_id) = item_def_id.as_local() {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id),
|
||||
report_span,
|
||||
MalformedOnUnimplementedAttrLint::new(report_span),
|
||||
);
|
||||
}
|
||||
Ok(None)
|
||||
}
|
||||
} else if is_diagnostic_namespace_variant {
|
||||
match &attr.kind {
|
||||
AttrKind::Normal(p) if !matches!(p.item.args, AttrArgs::Empty) => {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id.expect_local()),
|
||||
attr.span,
|
||||
MalformedOnUnimplementedAttrLint::new(attr.span),
|
||||
);
|
||||
if let Some(item_def_id) = item_def_id.as_local() {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id),
|
||||
attr.span,
|
||||
MalformedOnUnimplementedAttrLint::new(attr.span),
|
||||
);
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
if let Some(item_def_id) = item_def_id.as_local() {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id),
|
||||
attr.span,
|
||||
MissingOptionsForOnUnimplementedAttr,
|
||||
)
|
||||
}
|
||||
}
|
||||
_ => tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id.expect_local()),
|
||||
attr.span,
|
||||
MissingOptionsForOnUnimplementedAttr,
|
||||
),
|
||||
};
|
||||
|
||||
Ok(None)
|
||||
@ -791,12 +801,14 @@ fn verify(&self, tcx: TyCtxt<'tcx>, item_def_id: DefId) -> Result<(), ErrorGuara
|
||||
|| format_spec.precision_span.is_some()
|
||||
|| format_spec.fill_span.is_some())
|
||||
{
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id.expect_local()),
|
||||
self.span,
|
||||
InvalidFormatSpecifier,
|
||||
);
|
||||
if let Some(item_def_id) = item_def_id.as_local() {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id),
|
||||
self.span,
|
||||
InvalidFormatSpecifier,
|
||||
);
|
||||
}
|
||||
}
|
||||
match a.position {
|
||||
Position::ArgumentNamed(s) => {
|
||||
@ -812,15 +824,17 @@ fn verify(&self, tcx: TyCtxt<'tcx>, item_def_id: DefId) -> Result<(), ErrorGuara
|
||||
s if generics.params.iter().any(|param| param.name == s) => (),
|
||||
s => {
|
||||
if self.is_diagnostic_namespace_variant {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id.expect_local()),
|
||||
self.span,
|
||||
UnknownFormatParameterForOnUnimplementedAttr {
|
||||
argument_name: s,
|
||||
trait_name,
|
||||
},
|
||||
);
|
||||
if let Some(item_def_id) = item_def_id.as_local() {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id),
|
||||
self.span,
|
||||
UnknownFormatParameterForOnUnimplementedAttr {
|
||||
argument_name: s,
|
||||
trait_name,
|
||||
},
|
||||
);
|
||||
}
|
||||
} else {
|
||||
result = Err(struct_span_code_err!(
|
||||
tcx.dcx(),
|
||||
@ -842,12 +856,14 @@ fn verify(&self, tcx: TyCtxt<'tcx>, item_def_id: DefId) -> Result<(), ErrorGuara
|
||||
// `{:1}` and `{}` are not to be used
|
||||
Position::ArgumentIs(..) | Position::ArgumentImplicitlyIs(_) => {
|
||||
if self.is_diagnostic_namespace_variant {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id.expect_local()),
|
||||
self.span,
|
||||
DisallowedPositionalArgument,
|
||||
);
|
||||
if let Some(item_def_id) = item_def_id.as_local() {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id),
|
||||
self.span,
|
||||
DisallowedPositionalArgument,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
let reported = struct_span_code_err!(
|
||||
tcx.dcx(),
|
||||
@ -870,12 +886,14 @@ fn verify(&self, tcx: TyCtxt<'tcx>, item_def_id: DefId) -> Result<(), ErrorGuara
|
||||
// so that users are aware that something is not correct
|
||||
for e in parser.errors {
|
||||
if self.is_diagnostic_namespace_variant {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id.expect_local()),
|
||||
self.span,
|
||||
WrappedParserError { description: e.description, label: e.label },
|
||||
);
|
||||
if let Some(item_def_id) = item_def_id.as_local() {
|
||||
tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
tcx.local_def_id_to_hir_id(item_def_id),
|
||||
self.span,
|
||||
WrappedParserError { description: e.description, label: e.label },
|
||||
);
|
||||
}
|
||||
} else {
|
||||
let reported =
|
||||
struct_span_code_err!(tcx.dcx(), self.span, E0231, "{}", e.description,).emit();
|
||||
|
@ -245,7 +245,6 @@ run-make/rlib-format-packed-bundled-libs/Makefile
|
||||
run-make/rmeta-preferred/Makefile
|
||||
run-make/rustc-macro-dep-files/Makefile
|
||||
run-make/rustdoc-io-error/Makefile
|
||||
run-make/rustdoc-map-file/Makefile
|
||||
run-make/rustdoc-output-path/Makefile
|
||||
run-make/rustdoc-scrape-examples-invalid-expr/Makefile
|
||||
run-make/rustdoc-scrape-examples-macros/Makefile
|
||||
|
@ -1,5 +0,0 @@
|
||||
include ../tools.mk
|
||||
|
||||
all:
|
||||
$(RUSTDOC) -Z unstable-options --generate-redirect-map foo.rs -o "$(TMPDIR)/out"
|
||||
"$(PYTHON)" validate_json.py "$(TMPDIR)/out"
|
15
tests/run-make/rustdoc-map-file/rmake.rs
Normal file
15
tests/run-make/rustdoc-map-file/rmake.rs
Normal file
@ -0,0 +1,15 @@
|
||||
use run_make_support::{rustdoc, tmp_dir};
|
||||
use std::process::Command;
|
||||
|
||||
fn main() {
|
||||
let out_dir = tmp_dir().join("out");
|
||||
rustdoc()
|
||||
.input("foo.rs")
|
||||
.arg("-Zunstable-options")
|
||||
.arg("--generate-redirect-map")
|
||||
.output(&out_dir)
|
||||
.run();
|
||||
// FIXME (GuillaumeGomez): Port the python script to Rust as well.
|
||||
let python = std::env::var("PYTHON").unwrap_or("python".into());
|
||||
assert!(Command::new(python).arg("validate_json.py").arg(&out_dir).status().unwrap().success());
|
||||
}
|
@ -29,14 +29,14 @@ async fn return_targets_async_block_not_async_fn() -> u8 {
|
||||
|
||||
fn no_break_in_async_block() {
|
||||
async {
|
||||
break 0u8; //~ ERROR `break` inside of an `async` block
|
||||
break 0u8; //~ ERROR `break` inside `async` block
|
||||
};
|
||||
}
|
||||
|
||||
fn no_break_in_async_block_even_with_outer_loop() {
|
||||
loop {
|
||||
async {
|
||||
break 0u8; //~ ERROR `break` inside of an `async` block
|
||||
break 0u8; //~ ERROR `break` inside `async` block
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -1,18 +1,18 @@
|
||||
error[E0267]: `break` inside of an `async` block
|
||||
error[E0267]: `break` inside `async` block
|
||||
--> $DIR/async-block-control-flow-static-semantics.rs:32:9
|
||||
|
|
||||
LL | / async {
|
||||
LL | | break 0u8;
|
||||
| | ^^^^^^^^^ cannot `break` inside of an `async` block
|
||||
| | ^^^^^^^^^ cannot `break` inside `async` block
|
||||
LL | | };
|
||||
| |_____- enclosing `async` block
|
||||
|
||||
error[E0267]: `break` inside of an `async` block
|
||||
error[E0267]: `break` inside `async` block
|
||||
--> $DIR/async-block-control-flow-static-semantics.rs:39:13
|
||||
|
|
||||
LL | / async {
|
||||
LL | | break 0u8;
|
||||
| | ^^^^^^^^^ cannot `break` inside of an `async` block
|
||||
| | ^^^^^^^^^ cannot `break` inside `async` block
|
||||
LL | | };
|
||||
| |_________- enclosing `async` block
|
||||
|
||||
|
26
tests/ui/coroutine/break-inside-coroutine-issue-124495.rs
Normal file
26
tests/ui/coroutine/break-inside-coroutine-issue-124495.rs
Normal file
@ -0,0 +1,26 @@
|
||||
//@ edition: 2024
|
||||
//@ compile-flags: -Z unstable-options
|
||||
|
||||
#![feature(gen_blocks)]
|
||||
#![feature(async_closure)]
|
||||
|
||||
async fn async_fn() {
|
||||
break; //~ ERROR `break` inside `async` function
|
||||
}
|
||||
|
||||
gen fn gen_fn() {
|
||||
break; //~ ERROR `break` inside `gen` function
|
||||
}
|
||||
|
||||
async gen fn async_gen_fn() {
|
||||
break; //~ ERROR `break` inside `async gen` function
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _ = async { break; }; //~ ERROR `break` inside `async` block
|
||||
let _ = async || { break; }; //~ ERROR `break` inside `async` closure
|
||||
|
||||
let _ = gen { break; }; //~ ERROR `break` inside `gen` block
|
||||
|
||||
let _ = async gen { break; }; //~ ERROR `break` inside `async gen` block
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
error[E0267]: `break` inside `async` function
|
||||
--> $DIR/break-inside-coroutine-issue-124495.rs:8:5
|
||||
|
|
||||
LL | async fn async_fn() {
|
||||
| _____________________-
|
||||
LL | | break;
|
||||
| | ^^^^^ cannot `break` inside `async` function
|
||||
LL | | }
|
||||
| |_- enclosing `async` function
|
||||
|
||||
error[E0267]: `break` inside `gen` function
|
||||
--> $DIR/break-inside-coroutine-issue-124495.rs:12:5
|
||||
|
|
||||
LL | gen fn gen_fn() {
|
||||
| _________________-
|
||||
LL | | break;
|
||||
| | ^^^^^ cannot `break` inside `gen` function
|
||||
LL | | }
|
||||
| |_- enclosing `gen` function
|
||||
|
||||
error[E0267]: `break` inside `async gen` function
|
||||
--> $DIR/break-inside-coroutine-issue-124495.rs:16:5
|
||||
|
|
||||
LL | async gen fn async_gen_fn() {
|
||||
| _____________________________-
|
||||
LL | | break;
|
||||
| | ^^^^^ cannot `break` inside `async gen` function
|
||||
LL | | }
|
||||
| |_- enclosing `async gen` function
|
||||
|
||||
error[E0267]: `break` inside `async` block
|
||||
--> $DIR/break-inside-coroutine-issue-124495.rs:20:21
|
||||
|
|
||||
LL | let _ = async { break; };
|
||||
| --------^^^^^---
|
||||
| | |
|
||||
| | cannot `break` inside `async` block
|
||||
| enclosing `async` block
|
||||
|
||||
error[E0267]: `break` inside `async` closure
|
||||
--> $DIR/break-inside-coroutine-issue-124495.rs:21:24
|
||||
|
|
||||
LL | let _ = async || { break; };
|
||||
| --^^^^^---
|
||||
| | |
|
||||
| | cannot `break` inside `async` closure
|
||||
| enclosing `async` closure
|
||||
|
||||
error[E0267]: `break` inside `gen` block
|
||||
--> $DIR/break-inside-coroutine-issue-124495.rs:23:19
|
||||
|
|
||||
LL | let _ = gen { break; };
|
||||
| ------^^^^^---
|
||||
| | |
|
||||
| | cannot `break` inside `gen` block
|
||||
| enclosing `gen` block
|
||||
|
||||
error[E0267]: `break` inside `async gen` block
|
||||
--> $DIR/break-inside-coroutine-issue-124495.rs:25:25
|
||||
|
|
||||
LL | let _ = async gen { break; };
|
||||
| ------------^^^^^---
|
||||
| | |
|
||||
| | cannot `break` inside `async gen` block
|
||||
| enclosing `async gen` block
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0267`.
|
@ -1,2 +1,26 @@
|
||||
#[diagnostic::on_unimplemented(aa = "broken")]
|
||||
pub trait Test {}
|
||||
pub trait MissingAttr {}
|
||||
|
||||
#[diagnostic::on_unimplemented(label = "a", label = "b")]
|
||||
pub trait DuplicateAttr {}
|
||||
|
||||
#[diagnostic::on_unimplemented = "broken"]
|
||||
pub trait NotMetaList {}
|
||||
|
||||
#[diagnostic::on_unimplemented]
|
||||
pub trait Empty {}
|
||||
|
||||
#[diagnostic::on_unimplemented {}]
|
||||
pub trait WrongDelim {}
|
||||
|
||||
#[diagnostic::on_unimplemented(label = "{A:.3}")]
|
||||
pub trait BadFormatter<A> {}
|
||||
|
||||
#[diagnostic::on_unimplemented(label = "test {}")]
|
||||
pub trait NoImplicitArgs {}
|
||||
|
||||
#[diagnostic::on_unimplemented(label = "{missing}")]
|
||||
pub trait MissingArg {}
|
||||
|
||||
#[diagnostic::on_unimplemented(label = "{_}")]
|
||||
pub trait BadArg {}
|
||||
|
@ -0,0 +1,31 @@
|
||||
//@ edition:2021
|
||||
//@ aux-build:bad_on_unimplemented.rs
|
||||
|
||||
// Do not ICE when encountering a malformed `#[diagnostic::on_unimplemented]` annotation in a
|
||||
// dependency when incorrectly used (#124651).
|
||||
|
||||
extern crate bad_on_unimplemented;
|
||||
|
||||
use bad_on_unimplemented::*;
|
||||
|
||||
fn missing_attr<T: MissingAttr>(_: T) {}
|
||||
fn duplicate_attr<T: DuplicateAttr>(_: T) {}
|
||||
fn not_meta_list<T: NotMetaList>(_: T) {}
|
||||
fn empty<T: Empty>(_: T) {}
|
||||
fn wrong_delim<T: WrongDelim>(_: T) {}
|
||||
fn bad_formatter<T: BadFormatter<()>>(_: T) {}
|
||||
fn no_implicit_args<T: NoImplicitArgs>(_: T) {}
|
||||
fn missing_arg<T: MissingArg>(_: T) {}
|
||||
fn bad_arg<T: BadArg>(_: T) {}
|
||||
|
||||
fn main() {
|
||||
missing_attr(()); //~ ERROR E0277
|
||||
duplicate_attr(()); //~ ERROR E0277
|
||||
not_meta_list(()); //~ ERROR E0277
|
||||
empty(()); //~ ERROR E0277
|
||||
wrong_delim(()); //~ ERROR E0277
|
||||
bad_formatter(()); //~ ERROR E0277
|
||||
no_implicit_args(()); //~ ERROR E0277
|
||||
missing_arg(()); //~ ERROR E0277
|
||||
bad_arg(()); //~ ERROR E0277
|
||||
}
|
@ -0,0 +1,134 @@
|
||||
error[E0277]: the trait bound `(): bad_on_unimplemented::MissingAttr` is not satisfied
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:22:18
|
||||
|
|
||||
LL | missing_attr(());
|
||||
| ------------ ^^ the trait `bad_on_unimplemented::MissingAttr` is not implemented for `()`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
note: required by a bound in `missing_attr`
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:11:20
|
||||
|
|
||||
LL | fn missing_attr<T: MissingAttr>(_: T) {}
|
||||
| ^^^^^^^^^^^ required by this bound in `missing_attr`
|
||||
|
||||
error[E0277]: the trait bound `(): bad_on_unimplemented::DuplicateAttr` is not satisfied
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:23:20
|
||||
|
|
||||
LL | duplicate_attr(());
|
||||
| -------------- ^^ a
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= help: the trait `bad_on_unimplemented::DuplicateAttr` is not implemented for `()`
|
||||
note: required by a bound in `duplicate_attr`
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:12:22
|
||||
|
|
||||
LL | fn duplicate_attr<T: DuplicateAttr>(_: T) {}
|
||||
| ^^^^^^^^^^^^^ required by this bound in `duplicate_attr`
|
||||
|
||||
error[E0277]: the trait bound `(): bad_on_unimplemented::NotMetaList` is not satisfied
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:24:19
|
||||
|
|
||||
LL | not_meta_list(());
|
||||
| ------------- ^^ the trait `bad_on_unimplemented::NotMetaList` is not implemented for `()`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
note: required by a bound in `not_meta_list`
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:13:21
|
||||
|
|
||||
LL | fn not_meta_list<T: NotMetaList>(_: T) {}
|
||||
| ^^^^^^^^^^^ required by this bound in `not_meta_list`
|
||||
|
||||
error[E0277]: the trait bound `(): bad_on_unimplemented::Empty` is not satisfied
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:25:11
|
||||
|
|
||||
LL | empty(());
|
||||
| ----- ^^ the trait `bad_on_unimplemented::Empty` is not implemented for `()`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
note: required by a bound in `empty`
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:14:13
|
||||
|
|
||||
LL | fn empty<T: Empty>(_: T) {}
|
||||
| ^^^^^ required by this bound in `empty`
|
||||
|
||||
error[E0277]: the trait bound `(): bad_on_unimplemented::WrongDelim` is not satisfied
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:26:17
|
||||
|
|
||||
LL | wrong_delim(());
|
||||
| ----------- ^^ the trait `bad_on_unimplemented::WrongDelim` is not implemented for `()`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
note: required by a bound in `wrong_delim`
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:15:19
|
||||
|
|
||||
LL | fn wrong_delim<T: WrongDelim>(_: T) {}
|
||||
| ^^^^^^^^^^ required by this bound in `wrong_delim`
|
||||
|
||||
error[E0277]: the trait bound `(): bad_on_unimplemented::BadFormatter<()>` is not satisfied
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:27:19
|
||||
|
|
||||
LL | bad_formatter(());
|
||||
| ------------- ^^ ()
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= help: the trait `bad_on_unimplemented::BadFormatter<()>` is not implemented for `()`
|
||||
note: required by a bound in `bad_formatter`
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:16:21
|
||||
|
|
||||
LL | fn bad_formatter<T: BadFormatter<()>>(_: T) {}
|
||||
| ^^^^^^^^^^^^^^^^ required by this bound in `bad_formatter`
|
||||
|
||||
error[E0277]: the trait bound `(): bad_on_unimplemented::NoImplicitArgs` is not satisfied
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:28:22
|
||||
|
|
||||
LL | no_implicit_args(());
|
||||
| ---------------- ^^ test {}
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= help: the trait `bad_on_unimplemented::NoImplicitArgs` is not implemented for `()`
|
||||
note: required by a bound in `no_implicit_args`
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:17:24
|
||||
|
|
||||
LL | fn no_implicit_args<T: NoImplicitArgs>(_: T) {}
|
||||
| ^^^^^^^^^^^^^^ required by this bound in `no_implicit_args`
|
||||
|
||||
error[E0277]: the trait bound `(): bad_on_unimplemented::MissingArg` is not satisfied
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:29:17
|
||||
|
|
||||
LL | missing_arg(());
|
||||
| ----------- ^^ {missing}
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= help: the trait `bad_on_unimplemented::MissingArg` is not implemented for `()`
|
||||
note: required by a bound in `missing_arg`
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:18:19
|
||||
|
|
||||
LL | fn missing_arg<T: MissingArg>(_: T) {}
|
||||
| ^^^^^^^^^^ required by this bound in `missing_arg`
|
||||
|
||||
error[E0277]: the trait bound `(): bad_on_unimplemented::BadArg` is not satisfied
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:30:13
|
||||
|
|
||||
LL | bad_arg(());
|
||||
| ------- ^^ {_}
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= help: the trait `bad_on_unimplemented::BadArg` is not implemented for `()`
|
||||
note: required by a bound in `bad_arg`
|
||||
--> $DIR/malformed_foreign_on_unimplemented.rs:19:15
|
||||
|
|
||||
LL | fn bad_arg<T: BadArg>(_: T) {}
|
||||
| ^^^^^^ required by this bound in `bad_arg`
|
||||
|
||||
error: aborting due to 9 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
@ -1,17 +0,0 @@
|
||||
//@ edition:2021
|
||||
//@ compile-flags:--test
|
||||
//@ aux-build:bad_on_unimplemented.rs
|
||||
|
||||
// Do not ICE when encountering a malformed `#[diagnostic::on_unimplemented]` annotation in a
|
||||
// dependency when incorrectly used (#124651).
|
||||
|
||||
extern crate bad_on_unimplemented;
|
||||
|
||||
use bad_on_unimplemented::Test;
|
||||
|
||||
fn breakage<T: Test>(_: T) {}
|
||||
|
||||
#[test]
|
||||
fn test() {
|
||||
breakage(1); //~ ERROR E0277
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
error[E0277]: the trait bound `{integer}: Test` is not satisfied
|
||||
--> $DIR/on_unimplemented_ice.rs:16:14
|
||||
|
|
||||
LL | breakage(1);
|
||||
| -------- ^ the trait `Test` is not implemented for `{integer}`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
note: required by a bound in `breakage`
|
||||
--> $DIR/on_unimplemented_ice.rs:12:16
|
||||
|
|
||||
LL | fn breakage<T: Test>(_: T) {}
|
||||
| ^^^^ required by this bound in `breakage`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
@ -255,6 +255,12 @@ unsafe fn slice_index(array: &mut [u8], offset: usize) {
|
||||
let a3 = a2 as *mut u64;
|
||||
unsafe { *a3 = 3 };
|
||||
}
|
||||
|
||||
unsafe fn field_access(v: &mut Vec3<i32>) {
|
||||
let r = &mut v.0;
|
||||
let ptr = r as *mut i32 as *mut Vec3<i32>;
|
||||
unsafe { *ptr = Vec3(0, 0, 0) }
|
||||
}
|
||||
}
|
||||
|
||||
const RAW_PTR: *mut u8 = 1 as *mut u8;
|
||||
|
Loading…
Reference in New Issue
Block a user