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:
bors 2024-03-25 16:16:59 +00:00
commit 60b5ca6275
60 changed files with 744 additions and 77 deletions

View File

@ -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 });

View File

@ -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

View File

@ -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 });

View File

@ -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)

View File

@ -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.

View File

@ -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

View File

@ -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);
}
}

View File

@ -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

View File

@ -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);
]);

View File

@ -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()
}

View File

@ -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();
}

View File

@ -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");
}
}

View File

@ -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");
}

View File

@ -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" };

View File

@ -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);
}
};
}

View File

@ -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

View File

@ -1,4 +1,5 @@
# ignore-cross-compile
# needs-unwind contains should_panic test
include ../tools.mk
# Test expected libtest's junit output

View File

@ -1,5 +1,6 @@
//@ run-pass
//@ needs-asm-support
//@ needs-unwind
#![feature(asm_unwind)]

View File

@ -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() {}

View File

@ -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

View File

@ -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() {}

View File

@ -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

View File

@ -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() {}

View File

@ -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`.

View 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() {}

View 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`.

View File

@ -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() {}

View File

@ -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() {}

View File

@ -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

View 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())
}
}

View File

@ -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`.

View 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)
}

View File

@ -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`.

View 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() {}

View File

@ -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 `:`, `@`

View File

@ -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`.

View 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() {}

View File

@ -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`.

View File

@ -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`.

View File

@ -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 {

View File

@ -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"]

View File

@ -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"]

View File

@ -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)]

View File

@ -1,6 +1,7 @@
//@ check-pass
//@ force-host
//@ no-prefer-dynamic
//@ needs-unwind compiling proc macros with panic=abort causes a warning
#![deny(deprecated)]

View File

@ -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

View File

@ -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

View File

@ -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)]

View File

@ -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() {}

View File

@ -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`.

View File

@ -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

View File

@ -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() {}

View File

@ -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`.

View File

@ -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() {}

View File

@ -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`.

View File

@ -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() {}

View File

@ -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`.

View File

@ -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(|_| {});
}

View File

@ -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() {}

View File

@ -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

View 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();
}