mirror of
https://github.com/rust-lang/rust.git
synced 2024-10-30 05:51:58 +00:00
Auto merge of #123036 - matthiaskrgr:rollup-dj8hra4, r=matthiaskrgr
Rollup of 9 pull requests Successful merges: - #122842 (Don't emit an error about failing to produce a file with a specific name if user never gave an explicit name) - #122881 (Delegation: fix ICE on `bound_vars` divergence) - #122910 (Validate that we're only matching on unit struct for path pattern) - #122970 (Use `chunk_by` when building `ReverseSccGraph`) - #122988 (add even more tests! ) - #122999 (Fix unpretty UI test when /tmp does not exist) - #123001 (Rename `{enter,exit}_lint_attrs` to `check_attributes{,_post}`) - #123022 (Add `async-closures/once.rs` back to cranelift tests) - #123034 (Add a bunch of needs-unwind annotations to tests) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
60b5ca6275
@ -1,6 +1,5 @@
|
||||
use crate::constraints::ConstraintSccIndex;
|
||||
use crate::RegionInferenceContext;
|
||||
use itertools::Itertools;
|
||||
use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
|
||||
use rustc_data_structures::graph::vec_graph::VecGraph;
|
||||
use rustc_data_structures::graph::WithSuccessors;
|
||||
@ -48,16 +47,16 @@ impl RegionInferenceContext<'_> {
|
||||
.universal_regions
|
||||
.universal_regions()
|
||||
.map(|region| (self.constraint_sccs.scc(region), region))
|
||||
.collect_vec();
|
||||
.collect::<Vec<_>>();
|
||||
paired_scc_regions.sort();
|
||||
let universal_regions = paired_scc_regions.iter().map(|&(_, region)| region).collect();
|
||||
|
||||
let mut scc_regions = FxIndexMap::default();
|
||||
let mut start = 0;
|
||||
for (scc, group) in &paired_scc_regions.into_iter().group_by(|(scc, _)| *scc) {
|
||||
let group_size = group.count();
|
||||
scc_regions.insert(scc, start..start + group_size);
|
||||
start += group_size;
|
||||
for chunk in paired_scc_regions.chunk_by(|&(scc1, _), &(scc2, _)| scc1 == scc2) {
|
||||
let (scc, _) = chunk[0];
|
||||
scc_regions.insert(scc, start..start + chunk.len());
|
||||
start += chunk.len();
|
||||
}
|
||||
|
||||
self.rev_scc_graph = Some(ReverseSccGraph { graph, scc_regions, universal_regions });
|
||||
|
@ -41,21 +41,6 @@ rm tests/ui/parser/unclosed-delimiter-in-dep.rs # submodule contains //~ERROR
|
||||
# missing features
|
||||
# ================
|
||||
|
||||
# requires stack unwinding
|
||||
# FIXME add needs-unwind to these tests
|
||||
rm -r tests/run-make/libtest-junit
|
||||
rm tests/ui/asm/may_unwind.rs
|
||||
rm tests/ui/stable-mir-print/basic_function.rs
|
||||
|
||||
# extra warning about -Cpanic=abort for proc macros
|
||||
rm tests/ui/proc-macro/crt-static.rs
|
||||
rm tests/ui/proc-macro/proc-macro-deprecated-attr.rs
|
||||
rm tests/ui/proc-macro/quote-debug.rs
|
||||
rm tests/ui/proc-macro/no-missing-docs.rs
|
||||
rm tests/ui/rust-2018/proc-macro-crate-in-paths.rs
|
||||
rm tests/ui/proc-macro/allowed-signatures.rs
|
||||
rm tests/ui/proc-macro/no-mangle-in-proc-macro-issue-111888.rs
|
||||
|
||||
# vendor intrinsics
|
||||
rm tests/ui/simd/array-type.rs # "Index argument for `simd_insert` is not a constant"
|
||||
rm tests/ui/asm/x86_64/evex512-implicit-feature.rs # unimplemented AVX512 x86 vendor intrinsic
|
||||
@ -154,7 +139,6 @@ rm tests/ui/codegen/subtyping-enforces-type-equality.rs # assert_assignable bug
|
||||
# ======================
|
||||
rm tests/ui/backtrace.rs # TODO warning
|
||||
rm tests/ui/process/nofile-limit.rs # TODO some AArch64 linking issue
|
||||
rm tests/ui/async-await/async-closures/once.rs # FIXME bug in the rustc FnAbi calculation code
|
||||
|
||||
rm tests/ui/stdio-is-blocking.rs # really slow with unoptimized libstd
|
||||
|
||||
|
@ -592,7 +592,7 @@ fn produce_final_output_artifacts(
|
||||
.unwrap()
|
||||
.to_owned();
|
||||
|
||||
if crate_output.outputs.contains_key(&output_type) {
|
||||
if crate_output.outputs.contains_explicit_name(&output_type) {
|
||||
// 2) Multiple codegen units, with `--emit foo=some_name`. We have
|
||||
// no good solution for this case, so warn the user.
|
||||
sess.dcx().emit_warn(errors::IgnoringEmitPath { extension });
|
||||
|
@ -793,12 +793,20 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
|
||||
fd: &'tcx hir::FnDecl<'tcx>,
|
||||
body_id: hir::BodyId,
|
||||
_: Span,
|
||||
_: LocalDefId,
|
||||
def_id: LocalDefId,
|
||||
) {
|
||||
let output = match fd.output {
|
||||
hir::FnRetTy::DefaultReturn(_) => None,
|
||||
hir::FnRetTy::Return(ty) => Some(ty),
|
||||
};
|
||||
if let Some(ty) = output
|
||||
&& let hir::TyKind::InferDelegation(sig_id, _) = ty.kind
|
||||
{
|
||||
let bound_vars: Vec<_> =
|
||||
self.tcx.fn_sig(sig_id).skip_binder().bound_vars().iter().collect();
|
||||
let hir_id = self.tcx.local_def_id_to_hir_id(def_id);
|
||||
self.map.late_bound_vars.insert(hir_id, bound_vars);
|
||||
}
|
||||
self.visit_fn_like_elision(fd.inputs, output, matches!(fk, intravisit::FnKind::Closure));
|
||||
intravisit::walk_fn_kind(self, fk);
|
||||
self.visit_nested_body(body_id)
|
||||
|
@ -2492,13 +2492,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||
hir_ty: Option<&hir::Ty<'_>>,
|
||||
) -> ty::PolyFnSig<'tcx> {
|
||||
let tcx = self.tcx();
|
||||
let bound_vars = if let hir::FnRetTy::Return(ret_ty) = decl.output
|
||||
&& let hir::TyKind::InferDelegation(sig_id, _) = ret_ty.kind
|
||||
{
|
||||
tcx.fn_sig(sig_id).skip_binder().bound_vars()
|
||||
} else {
|
||||
tcx.late_bound_vars(hir_id)
|
||||
};
|
||||
let bound_vars = tcx.late_bound_vars(hir_id);
|
||||
debug!(?bound_vars);
|
||||
|
||||
// We proactively collect all the inferred type params to emit a single error per fn def.
|
||||
|
@ -919,8 +919,25 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
let e = report_unexpected_variant_res(tcx, res, qpath, pat.span, E0533, expected);
|
||||
return Ty::new_error(tcx, e);
|
||||
}
|
||||
Res::SelfCtor(..)
|
||||
| Res::Def(
|
||||
Res::SelfCtor(def_id) => {
|
||||
if let ty::Adt(adt_def, _) = *tcx.type_of(def_id).skip_binder().kind()
|
||||
&& adt_def.is_struct()
|
||||
&& let Some((CtorKind::Const, _)) = adt_def.non_enum_variant().ctor
|
||||
{
|
||||
// Ok, we allow unit struct ctors in patterns only.
|
||||
} else {
|
||||
let e = report_unexpected_variant_res(
|
||||
tcx,
|
||||
res,
|
||||
qpath,
|
||||
pat.span,
|
||||
E0533,
|
||||
"unit struct",
|
||||
);
|
||||
return Ty::new_error(tcx, e);
|
||||
}
|
||||
}
|
||||
Res::Def(
|
||||
DefKind::Ctor(_, CtorKind::Const)
|
||||
| DefKind::Const
|
||||
| DefKind::AssocConst
|
||||
|
@ -73,10 +73,10 @@ impl<'a, T: EarlyLintPass> EarlyContextAndPass<'a, T> {
|
||||
|
||||
self.inlined_check_id(id);
|
||||
debug!("early context: enter_attrs({:?})", attrs);
|
||||
lint_callback!(self, enter_lint_attrs, attrs);
|
||||
lint_callback!(self, check_attributes, attrs);
|
||||
ensure_sufficient_stack(|| f(self));
|
||||
debug!("early context: exit_attrs({:?})", attrs);
|
||||
lint_callback!(self, exit_lint_attrs, attrs);
|
||||
lint_callback!(self, check_attributes_post, attrs);
|
||||
self.context.builder.pop(push);
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,6 @@
|
||||
//! for all lint attributes.
|
||||
|
||||
use crate::{passes::LateLintPassObject, LateContext, LateLintPass, LintStore};
|
||||
use rustc_ast as ast;
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_data_structures::sync::{join, Lrc};
|
||||
use rustc_hir as hir;
|
||||
@ -62,13 +61,13 @@ impl<'tcx, T: LateLintPass<'tcx>> LateContextAndPass<'tcx, T> {
|
||||
let prev = self.context.last_node_with_lint_attrs;
|
||||
self.context.last_node_with_lint_attrs = id;
|
||||
debug!("late context: enter_attrs({:?})", attrs);
|
||||
lint_callback!(self, enter_lint_attrs, attrs);
|
||||
lint_callback!(self, check_attributes, attrs);
|
||||
for attr in attrs {
|
||||
lint_callback!(self, check_attribute, attr);
|
||||
}
|
||||
f(self);
|
||||
debug!("late context: exit_attrs({:?})", attrs);
|
||||
lint_callback!(self, exit_lint_attrs, attrs);
|
||||
lint_callback!(self, check_attributes_post, attrs);
|
||||
self.context.last_node_with_lint_attrs = prev;
|
||||
}
|
||||
|
||||
@ -310,10 +309,6 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas
|
||||
lint_callback!(self, check_path, p, id);
|
||||
hir_visit::walk_path(self, p);
|
||||
}
|
||||
|
||||
fn visit_attribute(&mut self, attr: &'tcx ast::Attribute) {
|
||||
lint_callback!(self, check_attribute, attr);
|
||||
}
|
||||
}
|
||||
|
||||
// Combines multiple lint passes into a single pass, at runtime. Each
|
||||
|
@ -41,13 +41,8 @@ macro_rules! late_lint_methods {
|
||||
fn check_variant(a: &'tcx rustc_hir::Variant<'tcx>);
|
||||
fn check_path(a: &rustc_hir::Path<'tcx>, b: rustc_hir::HirId);
|
||||
fn check_attribute(a: &'tcx rustc_ast::Attribute);
|
||||
|
||||
/// Called when entering a syntax node that can have lint attributes such
|
||||
/// as `#[allow(...)]`. Called with *all* the attributes of that node.
|
||||
fn enter_lint_attrs(a: &'tcx [rustc_ast::Attribute]);
|
||||
|
||||
/// Counterpart to `enter_lint_attrs`.
|
||||
fn exit_lint_attrs(a: &'tcx [rustc_ast::Attribute]);
|
||||
fn check_attributes(a: &'tcx [rustc_ast::Attribute]);
|
||||
fn check_attributes_post(a: &'tcx [rustc_ast::Attribute]);
|
||||
]);
|
||||
)
|
||||
}
|
||||
@ -162,16 +157,11 @@ macro_rules! early_lint_methods {
|
||||
fn check_impl_item(a: &rustc_ast::AssocItem);
|
||||
fn check_variant(a: &rustc_ast::Variant);
|
||||
fn check_attribute(a: &rustc_ast::Attribute);
|
||||
fn check_attributes(a: &[rustc_ast::Attribute]);
|
||||
fn check_attributes_post(a: &[rustc_ast::Attribute]);
|
||||
fn check_mac_def(a: &rustc_ast::MacroDef);
|
||||
fn check_mac(a: &rustc_ast::MacCall);
|
||||
|
||||
/// Called when entering a syntax node that can have lint attributes such
|
||||
/// as `#[allow(...)]`. Called with *all* the attributes of that node.
|
||||
fn enter_lint_attrs(a: &[rustc_ast::Attribute]);
|
||||
|
||||
/// Counterpart to `enter_lint_attrs`.
|
||||
fn exit_lint_attrs(a: &[rustc_ast::Attribute]);
|
||||
|
||||
fn enter_where_predicate(a: &rustc_ast::WherePredicate);
|
||||
fn exit_where_predicate(a: &rustc_ast::WherePredicate);
|
||||
]);
|
||||
|
@ -557,6 +557,11 @@ impl OutputTypes {
|
||||
self.0.contains_key(key)
|
||||
}
|
||||
|
||||
/// Returns `true` if user specified a name and not just produced type
|
||||
pub fn contains_explicit_name(&self, key: &OutputType) -> bool {
|
||||
self.0.get(key).map_or(false, |f| f.is_some())
|
||||
}
|
||||
|
||||
pub fn iter(&self) -> BTreeMapIter<'_, OutputType, Option<OutFileName>> {
|
||||
self.0.iter()
|
||||
}
|
||||
|
@ -143,13 +143,13 @@ impl Msrv {
|
||||
None
|
||||
}
|
||||
|
||||
pub fn enter_lint_attrs(&mut self, sess: &Session, attrs: &[Attribute]) {
|
||||
pub fn check_attributes(&mut self, sess: &Session, attrs: &[Attribute]) {
|
||||
if let Some(version) = Self::parse_attr(sess, attrs) {
|
||||
self.stack.push(version);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn exit_lint_attrs(&mut self, sess: &Session, attrs: &[Attribute]) {
|
||||
pub fn check_attributes_post(&mut self, sess: &Session, attrs: &[Attribute]) {
|
||||
if Self::parse_attr(sess, attrs).is_some() {
|
||||
self.stack.pop();
|
||||
}
|
||||
|
@ -158,10 +158,10 @@ impl<'tcx> LateLintPass<'tcx> for CognitiveComplexity {
|
||||
}
|
||||
}
|
||||
|
||||
fn enter_lint_attrs(&mut self, cx: &LateContext<'tcx>, attrs: &'tcx [Attribute]) {
|
||||
fn check_attributes(&mut self, cx: &LateContext<'tcx>, attrs: &'tcx [Attribute]) {
|
||||
self.limit.push_attrs(cx.sess(), attrs, "cognitive_complexity");
|
||||
}
|
||||
fn exit_lint_attrs(&mut self, cx: &LateContext<'tcx>, attrs: &'tcx [Attribute]) {
|
||||
fn check_attributes_post(&mut self, cx: &LateContext<'tcx>, attrs: &'tcx [Attribute]) {
|
||||
self.limit.pop_attrs(cx.sess(), attrs, "cognitive_complexity");
|
||||
}
|
||||
}
|
||||
|
@ -162,12 +162,12 @@ impl MissingDoc {
|
||||
impl_lint_pass!(MissingDoc => [MISSING_DOCS_IN_PRIVATE_ITEMS]);
|
||||
|
||||
impl<'tcx> LateLintPass<'tcx> for MissingDoc {
|
||||
fn enter_lint_attrs(&mut self, _: &LateContext<'tcx>, attrs: &'tcx [ast::Attribute]) {
|
||||
fn check_attributes(&mut self, _: &LateContext<'tcx>, attrs: &'tcx [ast::Attribute]) {
|
||||
let doc_hidden = self.doc_hidden() || is_doc_hidden(attrs);
|
||||
self.doc_hidden_stack.push(doc_hidden);
|
||||
}
|
||||
|
||||
fn exit_lint_attrs(&mut self, _: &LateContext<'tcx>, _: &'tcx [ast::Attribute]) {
|
||||
fn check_attributes_post(&mut self, _: &LateContext<'tcx>, _: &'tcx [ast::Attribute]) {
|
||||
self.doc_hidden_stack.pop().expect("empty doc_hidden_stack");
|
||||
}
|
||||
|
||||
|
@ -42,7 +42,7 @@ impl LateLintPass<'_> for MsrvAttrImpl {
|
||||
.filter(|t| matches!(t.unpack(), GenericArgKind::Type(_)))
|
||||
.any(|t| match_type(cx, t.expect_ty(), &paths::MSRV))
|
||||
})
|
||||
&& !items.iter().any(|item| item.ident.name == sym!(enter_lint_attrs))
|
||||
&& !items.iter().any(|item| item.ident.name == sym!(check_attributes))
|
||||
{
|
||||
let context = if is_late_pass { "LateContext" } else { "EarlyContext" };
|
||||
let lint_pass = if is_late_pass { "LateLintPass" } else { "EarlyLintPass" };
|
||||
|
@ -131,14 +131,14 @@ use rustc_middle::hir::nested_filter;
|
||||
#[macro_export]
|
||||
macro_rules! extract_msrv_attr {
|
||||
($context:ident) => {
|
||||
fn enter_lint_attrs(&mut self, cx: &rustc_lint::$context<'_>, attrs: &[rustc_ast::ast::Attribute]) {
|
||||
fn check_attributes(&mut self, cx: &rustc_lint::$context<'_>, attrs: &[rustc_ast::ast::Attribute]) {
|
||||
let sess = rustc_lint::LintContext::sess(cx);
|
||||
self.msrv.enter_lint_attrs(sess, attrs);
|
||||
self.msrv.check_attributes(sess, attrs);
|
||||
}
|
||||
|
||||
fn exit_lint_attrs(&mut self, cx: &rustc_lint::$context<'_>, attrs: &[rustc_ast::ast::Attribute]) {
|
||||
fn check_attributes_post(&mut self, cx: &rustc_lint::$context<'_>, attrs: &[rustc_ast::ast::Attribute]) {
|
||||
let sess = rustc_lint::LintContext::sess(cx);
|
||||
self.msrv.exit_lint_attrs(sess, attrs);
|
||||
self.msrv.check_attributes_post(sess, attrs);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ const ENTRY_LIMIT: usize = 900;
|
||||
// FIXME: The following limits should be reduced eventually.
|
||||
|
||||
const ISSUES_ENTRY_LIMIT: usize = 1750;
|
||||
const ROOT_ENTRY_LIMIT: usize = 859;
|
||||
const ROOT_ENTRY_LIMIT: usize = 860;
|
||||
|
||||
const EXPECTED_TEST_FILE_EXTENSIONS: &[&str] = &[
|
||||
"rs", // test source files
|
||||
|
@ -1,4 +1,5 @@
|
||||
# ignore-cross-compile
|
||||
# needs-unwind contains should_panic test
|
||||
include ../tools.mk
|
||||
|
||||
# Test expected libtest's junit output
|
||||
|
@ -1,5 +1,6 @@
|
||||
//@ run-pass
|
||||
//@ needs-asm-support
|
||||
//@ needs-unwind
|
||||
|
||||
#![feature(asm_unwind)]
|
||||
|
||||
|
@ -0,0 +1,17 @@
|
||||
// ICE cannot convert Refree.. to a region vid
|
||||
// issue: rust-lang/rust#114464
|
||||
|
||||
#![feature(generic_const_exprs)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
fn test<const N: usize>() {}
|
||||
|
||||
fn wow<'a>() {
|
||||
test::<{
|
||||
let _: &'a ();
|
||||
//~^ ERROR cannot capture late-bound lifetime in constant
|
||||
3
|
||||
}>();
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,11 @@
|
||||
error: cannot capture late-bound lifetime in constant
|
||||
--> $DIR/convert-refree-region-vid-ice-114464.rs:11:17
|
||||
|
|
||||
LL | fn wow<'a>() {
|
||||
| -- lifetime defined here
|
||||
LL | test::<{
|
||||
LL | let _: &'a ();
|
||||
| ^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -0,0 +1,13 @@
|
||||
// ICE no entry found for key generics_of
|
||||
// issue: rust-lang/rust#113133
|
||||
|
||||
#![allow(incomplete_features)]
|
||||
#![feature(generic_const_exprs, non_lifetime_binders)]
|
||||
|
||||
pub fn foo()
|
||||
where
|
||||
for<const N: usize = { const fn bar() {} bar(); 1 }> ():,
|
||||
//~^ ERROR defaults for generic parameters are not allowed in `for<...>` binders
|
||||
{}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,8 @@
|
||||
error: defaults for generic parameters are not allowed in `for<...>` binders
|
||||
--> $DIR/no-entry-found-for-key-ice-gce-nlb-113133.rs:9:9
|
||||
|
|
||||
LL | for<const N: usize = { const fn bar() {} bar(); 1 }> ():,
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -0,0 +1,39 @@
|
||||
// rust-lang/rust#119731
|
||||
// ICE ... unevaluated constant UnevaluatedConst
|
||||
|
||||
#![feature(generic_const_exprs)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
mod v20 {
|
||||
const v4: usize = 512;
|
||||
pub type v11 = [[usize; v4]; v4];
|
||||
//~^ WARN type `v11` should have an upper camel case name
|
||||
const v2: v11 = [[256; v4]; v4];
|
||||
|
||||
const v0: [[usize; v4]; v4] = v6(v8);
|
||||
//~^ ERROR cannot find value `v8` in this scope
|
||||
//~| ERROR cannot find function `v6` in this scope
|
||||
pub struct v17<const v10: usize, const v7: v11> {
|
||||
//~^ WARN type `v17` should have an upper camel case name
|
||||
//~| ERROR `[[usize; v4]; v4]` is forbidden as the type of a const generic parameter
|
||||
_p: (),
|
||||
}
|
||||
|
||||
impl v17<512, v0> {
|
||||
pub const fn v21() -> v18 {}
|
||||
//~^ ERROR cannot find type `v18` in this scope
|
||||
}
|
||||
|
||||
impl<const v10: usize> v17<v10, v2> {
|
||||
//~^ ERROR maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#1}
|
||||
//~| ERROR maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#1}
|
||||
pub const fn v21() -> v18 {
|
||||
//~^ ERROR cannot find type `v18` in this scope
|
||||
v18 { _p: () }
|
||||
//~^ ERROR cannot find struct, variant or union type `v18` in this scope
|
||||
}
|
||||
}
|
||||
}
|
||||
pub use v20::{v13, v17};
|
||||
//~^ ERROR unresolved import `v20::v13`
|
||||
fn main() {}
|
@ -0,0 +1,92 @@
|
||||
error[E0432]: unresolved import `v20::v13`
|
||||
--> $DIR/unevaluated-const-ice-119731.rs:37:15
|
||||
|
|
||||
LL | pub use v20::{v13, v17};
|
||||
| ^^^
|
||||
| |
|
||||
| no `v13` in `v20`
|
||||
| help: a similar name exists in the module: `v11`
|
||||
|
||||
error[E0425]: cannot find value `v8` in this scope
|
||||
--> $DIR/unevaluated-const-ice-119731.rs:13:38
|
||||
|
|
||||
LL | const v0: [[usize; v4]; v4] = v6(v8);
|
||||
| ^^ not found in this scope
|
||||
|
||||
error[E0412]: cannot find type `v18` in this scope
|
||||
--> $DIR/unevaluated-const-ice-119731.rs:23:31
|
||||
|
|
||||
LL | pub type v11 = [[usize; v4]; v4];
|
||||
| --------------------------------- similarly named type alias `v11` defined here
|
||||
...
|
||||
LL | pub const fn v21() -> v18 {}
|
||||
| ^^^ help: a type alias with a similar name exists: `v11`
|
||||
|
||||
error[E0412]: cannot find type `v18` in this scope
|
||||
--> $DIR/unevaluated-const-ice-119731.rs:30:31
|
||||
|
|
||||
LL | pub type v11 = [[usize; v4]; v4];
|
||||
| --------------------------------- similarly named type alias `v11` defined here
|
||||
...
|
||||
LL | pub const fn v21() -> v18 {
|
||||
| ^^^ help: a type alias with a similar name exists: `v11`
|
||||
|
||||
error[E0422]: cannot find struct, variant or union type `v18` in this scope
|
||||
--> $DIR/unevaluated-const-ice-119731.rs:32:13
|
||||
|
|
||||
LL | pub type v11 = [[usize; v4]; v4];
|
||||
| --------------------------------- similarly named type alias `v11` defined here
|
||||
...
|
||||
LL | v18 { _p: () }
|
||||
| ^^^ help: a type alias with a similar name exists: `v11`
|
||||
|
||||
warning: type `v11` should have an upper camel case name
|
||||
--> $DIR/unevaluated-const-ice-119731.rs:9:14
|
||||
|
|
||||
LL | pub type v11 = [[usize; v4]; v4];
|
||||
| ^^^ help: convert the identifier to upper camel case (notice the capitalization): `V11`
|
||||
|
|
||||
= note: `#[warn(non_camel_case_types)]` on by default
|
||||
|
||||
warning: type `v17` should have an upper camel case name
|
||||
--> $DIR/unevaluated-const-ice-119731.rs:16:16
|
||||
|
|
||||
LL | pub struct v17<const v10: usize, const v7: v11> {
|
||||
| ^^^ help: convert the identifier to upper camel case (notice the capitalization): `V17`
|
||||
|
||||
error[E0425]: cannot find function `v6` in this scope
|
||||
--> $DIR/unevaluated-const-ice-119731.rs:13:35
|
||||
|
|
||||
LL | const v0: [[usize; v4]; v4] = v6(v8);
|
||||
| ^^ not found in this scope
|
||||
|
||||
error: `[[usize; v4]; v4]` is forbidden as the type of a const generic parameter
|
||||
--> $DIR/unevaluated-const-ice-119731.rs:16:48
|
||||
|
|
||||
LL | pub struct v17<const v10: usize, const v7: v11> {
|
||||
| ^^^
|
||||
|
|
||||
= note: the only supported types are integers, `bool` and `char`
|
||||
help: add `#![feature(adt_const_params)]` to the crate attributes to enable more complex and user defined types
|
||||
|
|
||||
LL + #![feature(adt_const_params)]
|
||||
|
|
||||
|
||||
error: maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#1}
|
||||
--> $DIR/unevaluated-const-ice-119731.rs:27:37
|
||||
|
|
||||
LL | impl<const v10: usize> v17<v10, v2> {
|
||||
| ^^
|
||||
|
||||
error: maximum number of nodes exceeded in constant v20::v17::<v10, v2>::{constant#1}
|
||||
--> $DIR/unevaluated-const-ice-119731.rs:27:37
|
||||
|
|
||||
LL | impl<const v10: usize> v17<v10, v2> {
|
||||
| ^^
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error: aborting due to 9 previous errors; 2 warnings emitted
|
||||
|
||||
Some errors have detailed explanations: E0412, E0422, E0425, E0432.
|
||||
For more information about an error, try `rustc --explain E0412`.
|
18
tests/ui/delegation/ice-issue-122550.rs
Normal file
18
tests/ui/delegation/ice-issue-122550.rs
Normal file
@ -0,0 +1,18 @@
|
||||
#![feature(fn_delegation)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
trait Trait {
|
||||
fn description(&self) -> &str {}
|
||||
//~^ ERROR mismatched types
|
||||
}
|
||||
|
||||
struct F;
|
||||
struct S(F);
|
||||
|
||||
impl S {
|
||||
reuse <S as Trait>::description { &self.0 }
|
||||
//~^ ERROR mismatched types
|
||||
//~| ERROR the trait bound `S: Trait` is not satisfied
|
||||
}
|
||||
|
||||
fn main() {}
|
31
tests/ui/delegation/ice-issue-122550.stderr
Normal file
31
tests/ui/delegation/ice-issue-122550.stderr
Normal file
@ -0,0 +1,31 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/ice-issue-122550.rs:5:35
|
||||
|
|
||||
LL | fn description(&self) -> &str {}
|
||||
| ^^ expected `&str`, found `()`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/ice-issue-122550.rs:13:39
|
||||
|
|
||||
LL | reuse <S as Trait>::description { &self.0 }
|
||||
| ^^^^^^^ expected `&S`, found `&F`
|
||||
|
|
||||
= note: expected reference `&S`
|
||||
found reference `&F`
|
||||
|
||||
error[E0277]: the trait bound `S: Trait` is not satisfied
|
||||
--> $DIR/ice-issue-122550.rs:13:12
|
||||
|
|
||||
LL | reuse <S as Trait>::description { &self.0 }
|
||||
| ^ the trait `Trait` is not implemented for `S`
|
||||
|
|
||||
help: this trait has no implementations, consider adding one
|
||||
--> $DIR/ice-issue-122550.rs:4:1
|
||||
|
|
||||
LL | trait Trait {
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0277, E0308.
|
||||
For more information about an error, try `rustc --explain E0277`.
|
@ -0,0 +1,35 @@
|
||||
// ICE assertion failed: matches!(self.def_kind(ct.def.did), DefKind :: AnonConst)
|
||||
// issue: rust-lang/rust#108220
|
||||
//@ check-pass
|
||||
|
||||
#![feature(associated_const_equality)]
|
||||
#![allow(unused)]
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
pub struct NoPin;
|
||||
|
||||
pub trait SetAlternate<const A: u8> {}
|
||||
|
||||
impl SetAlternate<0> for NoPin {}
|
||||
|
||||
pub trait PinA<PER> {
|
||||
const A: u8;
|
||||
}
|
||||
|
||||
impl<PER> PinA<PER> for NoPin {
|
||||
const A: u8 = 0;
|
||||
}
|
||||
|
||||
pub trait Pins<USART> {}
|
||||
|
||||
impl<USART, T, const TA: u8> Pins<USART> for T where
|
||||
T: PinA<USART, A = { TA }> + SetAlternate<TA>
|
||||
{
|
||||
}
|
||||
|
||||
struct Serial<USART>(PhantomData<USART>);
|
||||
|
||||
impl<USART> Serial<USART> where NoPin: Pins<USART> {}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,16 @@
|
||||
// ICE expected ReFree to map to ReEarlyBound
|
||||
// issue: rust-lang/rust#108580
|
||||
//@ check-pass
|
||||
|
||||
trait Foo {
|
||||
fn bar(&self) -> impl Iterator<Item = impl Sized> + '_;
|
||||
}
|
||||
|
||||
impl Foo for () {
|
||||
fn bar(&self) -> impl Iterator + '_ {
|
||||
//~^ WARN impl trait in impl method signature does not match trait method signature
|
||||
vec![()].into_iter()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn main() {}
|
@ -0,0 +1,19 @@
|
||||
warning: impl trait in impl method signature does not match trait method signature
|
||||
--> $DIR/expeced-refree-to-map-to-reearlybound-ice-108580.rs:10:22
|
||||
|
|
||||
LL | fn bar(&self) -> impl Iterator<Item = impl Sized> + '_;
|
||||
| ------------------------------------- return type from trait method defined here
|
||||
...
|
||||
LL | fn bar(&self) -> impl Iterator + '_ {
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: add `#[allow(refining_impl_trait)]` if it is intended for this to be part of the public API of this crate
|
||||
= note: we are soliciting feedback, see issue #121718 <https://github.com/rust-lang/rust/issues/121718> for more information
|
||||
= note: `#[warn(refining_impl_trait_internal)]` on by default
|
||||
help: replace the return type so that it matches the trait
|
||||
|
|
||||
LL | fn bar(&self) -> impl Iterator<Item = impl Sized> + '_ {
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
18
tests/ui/mir/mir-build-2021-closure-capture-ice-110453-1.rs
Normal file
18
tests/ui/mir/mir-build-2021-closure-capture-ice-110453-1.rs
Normal file
@ -0,0 +1,18 @@
|
||||
// ICE in mir building with captured value of unresolved type
|
||||
// None in compiler/rustc_mir_build/src/build/expr/as_place.rs
|
||||
// issue: rust-lang/rust#110453
|
||||
//@ edition:2021
|
||||
|
||||
#![crate_type="lib"]
|
||||
|
||||
pub struct B;
|
||||
pub fn a() -> B { B }
|
||||
|
||||
mod handlers {
|
||||
pub struct C(B);
|
||||
//~^ ERROR cannot find type `B` in this scope
|
||||
pub fn c() -> impl Fn() -> C {
|
||||
let a1 = ();
|
||||
|| C((crate::a(), a1).into())
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
error[E0412]: cannot find type `B` in this scope
|
||||
--> $DIR/mir-build-2021-closure-capture-ice-110453-1.rs:12:18
|
||||
|
|
||||
LL | pub struct C(B);
|
||||
| ^ not found in this scope
|
||||
|
|
||||
help: consider importing this struct
|
||||
|
|
||||
LL + use crate::B;
|
||||
|
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0412`.
|
11
tests/ui/mir/mir-build-2021-closure-capture-ice-110453-2.rs
Normal file
11
tests/ui/mir/mir-build-2021-closure-capture-ice-110453-2.rs
Normal file
@ -0,0 +1,11 @@
|
||||
// ICE in mir building with captured value of unresolved type
|
||||
// None in compiler/rustc_mir_build/src/build/expr/as_place.rs
|
||||
// issue: rust-lang/rust#110453
|
||||
//@ edition:2021
|
||||
|
||||
#![crate_type="lib"]
|
||||
|
||||
pub fn dup(f: impl Fn(i32) -> i32) -> impl Fn(as_str) -> i32 {
|
||||
//~^ ERROR cannot find type `as_str` in this scope
|
||||
move |a| f(a * 2)
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
error[E0412]: cannot find type `as_str` in this scope
|
||||
--> $DIR/mir-build-2021-closure-capture-ice-110453-2.rs:8:47
|
||||
|
|
||||
LL | pub fn dup(f: impl Fn(i32) -> i32) -> impl Fn(as_str) -> i32 {
|
||||
| ^^^^^^ not found in this scope
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0412`.
|
44
tests/ui/nll/unexpected-inference-var-ice-116599.rs
Normal file
44
tests/ui/nll/unexpected-inference-var-ice-116599.rs
Normal file
@ -0,0 +1,44 @@
|
||||
// ICE unexpected inference var
|
||||
// issue: rust-lang/rust#116599
|
||||
//@ check-pass
|
||||
|
||||
pub trait EvaluateConstMethods {
|
||||
type Trait: TraitWithConstMethods;
|
||||
|
||||
/// **This block breaks**
|
||||
const DATA_3: Data3 = {
|
||||
<<<Self::Trait as TraitWithConstMethods>::Method2 as ConstFn<_, _>>::Body<
|
||||
<<Self::Trait as TraitWithConstMethods>::Method1 as ConstFn<_, _>>::Body<ContainsData1>,
|
||||
> as Contains<_>>::ITEM
|
||||
};
|
||||
}
|
||||
|
||||
pub trait TraitWithConstMethods {
|
||||
/// "const trait method" of signature `fn(Data1) -> Data2`
|
||||
type Method1: ConstFn<Data1, Data2>;
|
||||
|
||||
/// "const trait method" of signature `fn(Data2) -> Data3`
|
||||
type Method2: ConstFn<Data2, Data3>;
|
||||
}
|
||||
|
||||
/// A trait which tries to implement const methods in traits
|
||||
pub trait ConstFn<Arg, Ret> {
|
||||
type Body<T: Contains<Arg>>: Contains<Ret>;
|
||||
}
|
||||
|
||||
/// A ZST which represents / "contains" a const value which can be pass to a [`ConstFn`]
|
||||
pub trait Contains<T> {
|
||||
const ITEM: T;
|
||||
}
|
||||
|
||||
pub struct ContainsData1;
|
||||
impl Contains<Data1> for ContainsData1 {
|
||||
const ITEM: Data1 = Data1 {};
|
||||
}
|
||||
|
||||
// Arbitrary data
|
||||
pub struct Data1 {}
|
||||
pub struct Data2 {}
|
||||
pub struct Data3 {}
|
||||
|
||||
pub fn main() {}
|
@ -4,12 +4,12 @@ impl S {
|
||||
fn foo(&mur Self) {}
|
||||
//~^ ERROR expected identifier, found keyword `Self`
|
||||
//~| ERROR expected one of `:`, `@`
|
||||
//~| ERROR the `Self` constructor can only be used with
|
||||
//~| ERROR expected unit struct, found self constructor `Self`
|
||||
fn bar(&'static mur Self) {}
|
||||
//~^ ERROR unexpected lifetime
|
||||
//~| ERROR expected identifier, found keyword `Self`
|
||||
//~| ERROR expected one of `:`, `@`
|
||||
//~| ERROR the `Self` constructor can only be used with
|
||||
//~| ERROR expected unit struct, found self constructor `Self`
|
||||
|
||||
fn baz(&mur Self @ _) {}
|
||||
//~^ ERROR expected one of `:`, `@`
|
||||
|
@ -40,17 +40,18 @@ error: expected one of `:`, `@`, or `|`, found keyword `Self`
|
||||
LL | fn baz(&mur Self @ _) {}
|
||||
| ^^^^ expected one of `:`, `@`, or `|`
|
||||
|
||||
error: the `Self` constructor can only be used with tuple or unit structs
|
||||
error[E0533]: expected unit struct, found self constructor `Self`
|
||||
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:4:17
|
||||
|
|
||||
LL | fn foo(&mur Self) {}
|
||||
| ^^^^ help: use curly brackets: `Self { /* fields */ }`
|
||||
| ^^^^ not a unit struct
|
||||
|
||||
error: the `Self` constructor can only be used with tuple or unit structs
|
||||
error[E0533]: expected unit struct, found self constructor `Self`
|
||||
--> $DIR/issue-70549-resolve-after-recovered-self-ctor.rs:8:25
|
||||
|
|
||||
LL | fn bar(&'static mur Self) {}
|
||||
| ^^^^ help: use curly brackets: `Self { /* fields */ }`
|
||||
| ^^^^ not a unit struct
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0533`.
|
||||
|
37
tests/ui/pattern/no-match-tuple-variant-self-ctor.rs
Normal file
37
tests/ui/pattern/no-match-tuple-variant-self-ctor.rs
Normal file
@ -0,0 +1,37 @@
|
||||
//@ revisions: tuple unit struct_
|
||||
//@[unit] check-pass
|
||||
|
||||
#[cfg(unit)]
|
||||
mod unit {
|
||||
struct S;
|
||||
impl S {
|
||||
fn foo() {
|
||||
let Self = S;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(tuple)]
|
||||
mod tuple {
|
||||
struct S(());
|
||||
impl S {
|
||||
fn foo() {
|
||||
let Self = S;
|
||||
//[tuple]~^ ERROR expected unit struct
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(struct_)]
|
||||
mod struct_ {
|
||||
struct S {}
|
||||
impl S {
|
||||
fn foo() {
|
||||
let Self = S;
|
||||
//[struct_]~^ ERROR expected value, found struct `S`
|
||||
//[struct_]~| ERROR expected unit struct, found self constructor `Self`
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,19 @@
|
||||
error[E0423]: expected value, found struct `S`
|
||||
--> $DIR/no-match-tuple-variant-self-ctor.rs:30:24
|
||||
|
|
||||
LL | struct S {}
|
||||
| ----------- `S` defined here
|
||||
...
|
||||
LL | let Self = S;
|
||||
| ^ help: use struct literal syntax instead: `S {}`
|
||||
|
||||
error[E0533]: expected unit struct, found self constructor `Self`
|
||||
--> $DIR/no-match-tuple-variant-self-ctor.rs:30:17
|
||||
|
|
||||
LL | let Self = S;
|
||||
| ^^^^ not a unit struct
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0423, E0533.
|
||||
For more information about an error, try `rustc --explain E0423`.
|
@ -0,0 +1,9 @@
|
||||
error[E0533]: expected unit struct, found self constructor `Self`
|
||||
--> $DIR/no-match-tuple-variant-self-ctor.rs:19:17
|
||||
|
|
||||
LL | let Self = S;
|
||||
| ^^^^ not a unit struct
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0533`.
|
@ -1,6 +1,7 @@
|
||||
//@ check-pass
|
||||
//@ force-host
|
||||
//@ no-prefer-dynamic
|
||||
//@ needs-unwind compiling proc macros with panic=abort causes a warning
|
||||
|
||||
#![crate_type = "proc-macro"]
|
||||
#![allow(private_interfaces)]
|
||||
@ -9,7 +10,7 @@ use proc_macro::TokenStream;
|
||||
|
||||
#[proc_macro]
|
||||
pub fn foo<T>(t: T) -> TokenStream {
|
||||
TokenStream::new()
|
||||
TokenStream::new()
|
||||
}
|
||||
|
||||
trait Project {
|
||||
|
@ -7,6 +7,7 @@
|
||||
//@ force-host
|
||||
//@ no-prefer-dynamic
|
||||
//@ needs-dynamic-linking
|
||||
//@ needs-unwind compiling proc macros with panic=abort causes a warning
|
||||
|
||||
#![crate_type = "proc-macro"]
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
//@ build-pass
|
||||
//@ force-host
|
||||
//@ no-prefer-dynamic
|
||||
//@ needs-unwind compiling proc macros with panic=abort causes a warning
|
||||
//@ aux-build:exports_no_mangle.rs
|
||||
#![crate_type = "proc-macro"]
|
||||
|
||||
|
@ -4,6 +4,7 @@
|
||||
//@ build-pass (FIXME(62277): could be check-pass?)
|
||||
//@ force-host
|
||||
//@ no-prefer-dynamic
|
||||
//@ needs-unwind compiling proc macros with panic=abort causes a warning
|
||||
|
||||
#![crate_type = "proc-macro"]
|
||||
#![deny(missing_docs)]
|
||||
|
@ -1,6 +1,7 @@
|
||||
//@ check-pass
|
||||
//@ force-host
|
||||
//@ no-prefer-dynamic
|
||||
//@ needs-unwind compiling proc macros with panic=abort causes a warning
|
||||
|
||||
#![deny(deprecated)]
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
//@ force-host
|
||||
//@ no-prefer-dynamic
|
||||
//@ compile-flags: -Z unpretty=expanded
|
||||
//@ needs-unwind compiling proc macros with panic=abort causes a warning
|
||||
//
|
||||
// This file is not actually used as a proc-macro - instead,
|
||||
// it's just used to show the output of the `quote!` macro
|
||||
|
@ -4,6 +4,7 @@
|
||||
//@ force-host
|
||||
//@ no-prefer-dynamic
|
||||
//@ compile-flags: -Z unpretty=expanded
|
||||
//@ needs-unwind compiling proc macros with panic=abort causes a warning
|
||||
//
|
||||
// This file is not actually used as a proc-macro - instead,
|
||||
// it's just used to show the output of the `quote!` macro
|
||||
|
@ -1,6 +1,7 @@
|
||||
//@ build-pass (FIXME(62277): could be check-pass?)
|
||||
//@ force-host
|
||||
//@ no-prefer-dynamic
|
||||
//@ needs-unwind compiling proc macros with panic=abort causes a warning
|
||||
|
||||
#![crate_type = "proc-macro"]
|
||||
#![deny(rust_2018_compatibility)]
|
||||
|
@ -0,0 +1,15 @@
|
||||
// ICE min_specialization:
|
||||
// Ok(['?0, Const { ty: usize, kind: Leaf(0x0000000000000000) }]) is not fully resolved
|
||||
// issue: rust-lang/rust#113045
|
||||
|
||||
#![feature(min_specialization)]
|
||||
|
||||
trait X {}
|
||||
|
||||
impl<'a, const N: usize> X for [(); N] {}
|
||||
|
||||
impl<'a, Unconstrained> X for [(); 0] {}
|
||||
//~^ ERROR the type parameter `Unconstrained` is not constrained by the impl trait, self type, or predicates
|
||||
//~| ERROR specialization impl does not specialize any associated items
|
||||
|
||||
fn main() {}
|
@ -0,0 +1,21 @@
|
||||
error[E0207]: the type parameter `Unconstrained` is not constrained by the impl trait, self type, or predicates
|
||||
--> $DIR/ice-const-not-fully-resolved-113045.rs:11:10
|
||||
|
|
||||
LL | impl<'a, Unconstrained> X for [(); 0] {}
|
||||
| ^^^^^^^^^^^^^ unconstrained type parameter
|
||||
|
||||
error: specialization impl does not specialize any associated items
|
||||
--> $DIR/ice-const-not-fully-resolved-113045.rs:11:1
|
||||
|
|
||||
LL | impl<'a, Unconstrained> X for [(); 0] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: impl is a specialization of this impl
|
||||
--> $DIR/ice-const-not-fully-resolved-113045.rs:9:1
|
||||
|
|
||||
LL | impl<'a, const N: usize> X for [(); N] {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0207`.
|
@ -1,6 +1,7 @@
|
||||
//@ compile-flags: -Z unpretty=stable-mir -Z mir-opt-level=3
|
||||
//@ check-pass
|
||||
//@ only-x86_64
|
||||
//@ needs-unwind unwind edges are different with panic=abort
|
||||
|
||||
fn foo(i: i32) -> i32 {
|
||||
i + 1
|
||||
|
@ -0,0 +1,21 @@
|
||||
// ICE 'broken MIR: bad assignment: NoSolution'
|
||||
// on trait with default method and no impls
|
||||
// issue: rust-lang/rust#109869
|
||||
|
||||
type Spanned<T> = (T, ());
|
||||
|
||||
trait Span<T> {}
|
||||
|
||||
impl<T> Span<T> for (T, ()) {}
|
||||
|
||||
impl<F, T: From<F>> From<Spanned<F>> for dyn Span<T>
|
||||
where
|
||||
Self: Sized
|
||||
{
|
||||
fn from((from, ()): Spanned<F>) -> Self {
|
||||
(T::from(from), ())
|
||||
//~^ ERROR mismatched types
|
||||
}
|
||||
}
|
||||
|
||||
pub fn main() {}
|
@ -0,0 +1,19 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/ice-trait-with-default-method-but-no-impl-broken-mir-109869-1.rs:16:9
|
||||
|
|
||||
LL | fn from((from, ()): Spanned<F>) -> Self {
|
||||
| ---- expected `(dyn Span<T> + 'static)` because of return type
|
||||
LL | (T::from(from), ())
|
||||
| ^^^^^^^^^^^^^^^^^^^ expected `dyn Span`, found `(T, ())`
|
||||
|
|
||||
= note: expected trait object `(dyn Span<T> + 'static)`
|
||||
found tuple `(T, ())`
|
||||
= help: `(T, ())` implements `Span` so you could box the found value and coerce it to the trait object `Box<dyn Span>`, you will have to change the expected type as well
|
||||
help: call `Into::into` on this expression to convert `(T, ())` into `(dyn Span<T> + 'static)`
|
||||
|
|
||||
LL | (T::from(from), ()).into()
|
||||
| +++++++
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
@ -0,0 +1,17 @@
|
||||
// ICE 'broken MIR: bad assignment: NoSolution'
|
||||
// on trait with default method and no impls
|
||||
// issue: rust-lang/rust#109869
|
||||
|
||||
trait Empty<T> {}
|
||||
|
||||
impl<T> Default for dyn Empty<T>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
fn default() -> Self {
|
||||
()
|
||||
//~^ ERROR mismatched types
|
||||
}
|
||||
}
|
||||
|
||||
pub fn main() {}
|
@ -0,0 +1,14 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/ice-trait-with-default-method-but-no-impl-broken-mir-109869-2.rs:12:9
|
||||
|
|
||||
LL | fn default() -> Self {
|
||||
| ---- expected `(dyn Empty<T> + 'static)` because of return type
|
||||
LL | ()
|
||||
| ^^ expected `dyn Empty`, found `()`
|
||||
|
|
||||
= note: expected trait object `(dyn Empty<T> + 'static)`
|
||||
found unit type `()`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
@ -0,0 +1,18 @@
|
||||
// ICE 'broken MIR: bad assignment: NoSolution'
|
||||
// on trait with default method and no impls
|
||||
// issue: rust-lang/rust#109869
|
||||
|
||||
#![feature(trivial_bounds)]
|
||||
trait Empty {}
|
||||
|
||||
impl Default for dyn Empty
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
fn default() -> Self {
|
||||
()
|
||||
//~^ ERROR mismatched types
|
||||
}
|
||||
}
|
||||
|
||||
pub fn main() {}
|
@ -0,0 +1,14 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/ice-trait-with-default-method-but-no-impl-broken-mir-109869-trivial-bounds.rs:13:9
|
||||
|
|
||||
LL | fn default() -> Self {
|
||||
| ---- expected `(dyn Empty + 'static)` because of return type
|
||||
LL | ()
|
||||
| ^^ expected `dyn Empty`, found `()`
|
||||
|
|
||||
= note: expected trait object `(dyn Empty + 'static)`
|
||||
found unit type `()`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
@ -0,0 +1,41 @@
|
||||
// ICE Failed to normalize closure with TAIT
|
||||
// issue: rust-lang/rust#109020
|
||||
//@ check-pass
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
type WithEmplacableForFn<'a> = impl EmplacableFn + 'a;
|
||||
|
||||
fn with_emplacable_for<'a, F, R>(mut f: F) -> R
|
||||
where
|
||||
F: for<'b> FnMut(Emplacable<WithEmplacableForFn<'b>>) -> R,
|
||||
{
|
||||
fn with_emplacable_for_inner<'a, R>(
|
||||
_: &'a (),
|
||||
_: &mut dyn FnMut(Emplacable<WithEmplacableForFn<'a>>) -> R,
|
||||
) -> R {
|
||||
fn _constrain(_: &mut ()) -> WithEmplacableForFn<'_> {
|
||||
()
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
|
||||
with_emplacable_for_inner(&(), &mut f)
|
||||
}
|
||||
|
||||
trait EmplacableFn {}
|
||||
|
||||
impl EmplacableFn for () {}
|
||||
|
||||
struct Emplacable<F>
|
||||
where
|
||||
F: EmplacableFn,
|
||||
{
|
||||
phantom: PhantomData<F>,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
with_emplacable_for(|_| {});
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
//@ normalize-stderr-test "error `.*`" -> "$$ERROR_MESSAGE"
|
||||
//@ compile-flags: -o/tmp/ -Zunpretty=ast-tree
|
||||
//@ compile-flags: -o. -Zunpretty=ast-tree
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,4 +1,4 @@
|
||||
error: failed to write `/tmp/` due to $ERROR_MESSAGE
|
||||
error: failed to write `.` due to $ERROR_MESSAGE
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
23
tests/ui/warnings/no-explicit-path-issue-122509.rs
Normal file
23
tests/ui/warnings/no-explicit-path-issue-122509.rs
Normal file
@ -0,0 +1,23 @@
|
||||
//@ build-pass
|
||||
//@ compile-flags: -C codegen-units=2 --emit asm
|
||||
|
||||
fn one() -> usize {
|
||||
1
|
||||
}
|
||||
|
||||
pub mod a {
|
||||
pub fn two() -> usize {
|
||||
::one() + ::one()
|
||||
}
|
||||
}
|
||||
|
||||
pub mod b {
|
||||
pub fn three() -> usize {
|
||||
::one() + ::a::two()
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
a::two();
|
||||
b::three();
|
||||
}
|
Loading…
Reference in New Issue
Block a user