mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Auto merge of #104845 - matthiaskrgr:rollup-tckj956, r=matthiaskrgr
Rollup of 11 pull requests Successful merges: - #104514 (Use node_ty_opt to avoid ICE in visit_ty) - #104704 (Allow power10-vector feature in PowerPC) - #104747 (resolve: Don't use constructor def ids in the map for field names) - #104773 (OpaqueCast projections are always overlapping, they can't possibly be disjoint) - #104774 (Document split{_ascii,}_whitespace() for empty strings) - #104780 (make `error_reported` check for delayed bugs) - #104782 (Bump the const eval step limit) - #104792 (rustdoc: simplify `.search-results-title` CSS) - #104796 (lint: do not warn unused parens around higher-ranked function pointers) - #104820 (Remove normalize_projection_type) - #104822 (with_query_mode -> new) Failed merges: - #104716 (move 2 candidates into builtin candidate) - #104841 (Assert that we don't capture escaping bound vars in `Fn` trait selection) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
65a6e22668
@ -320,16 +320,10 @@ fn place_projection_conflict<'tcx>(
|
||||
debug!("place_element_conflict: DISJOINT-OR-EQ-DEREF");
|
||||
Overlap::EqualOrDisjoint
|
||||
}
|
||||
(ProjectionElem::OpaqueCast(v1), ProjectionElem::OpaqueCast(v2)) => {
|
||||
if v1 == v2 {
|
||||
// same type - recur.
|
||||
debug!("place_element_conflict: DISJOINT-OR-EQ-OPAQUE");
|
||||
Overlap::EqualOrDisjoint
|
||||
} else {
|
||||
// Different types. Disjoint!
|
||||
debug!("place_element_conflict: DISJOINT-OPAQUE");
|
||||
Overlap::Disjoint
|
||||
}
|
||||
(ProjectionElem::OpaqueCast(_), ProjectionElem::OpaqueCast(_)) => {
|
||||
// casts to other types may always conflict irrespective of the type being cast to.
|
||||
debug!("place_element_conflict: DISJOINT-OR-EQ-OPAQUE");
|
||||
Overlap::EqualOrDisjoint
|
||||
}
|
||||
(ProjectionElem::Field(f1, _), ProjectionElem::Field(f2, _)) => {
|
||||
if f1 == f2 {
|
||||
|
@ -215,6 +215,7 @@ const HEXAGON_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
|
||||
const POWERPC_ALLOWED_FEATURES: &[(&str, Option<Symbol>)] = &[
|
||||
// tidy-alphabetical-start
|
||||
("altivec", Some(sym::powerpc_target_feature)),
|
||||
("power10-vector", Some(sym::powerpc_target_feature)),
|
||||
("power8-altivec", Some(sym::powerpc_target_feature)),
|
||||
("power8-vector", Some(sym::powerpc_target_feature)),
|
||||
("power9-altivec", Some(sym::powerpc_target_feature)),
|
||||
|
@ -1044,13 +1044,24 @@ impl Handler {
|
||||
}
|
||||
pub fn has_errors_or_lint_errors(&self) -> Option<ErrorGuaranteed> {
|
||||
if self.inner.borrow().has_errors_or_lint_errors() {
|
||||
Some(ErrorGuaranteed(()))
|
||||
Some(ErrorGuaranteed::unchecked_claim_error_was_emitted())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
pub fn has_errors_or_delayed_span_bugs(&self) -> bool {
|
||||
self.inner.borrow().has_errors_or_delayed_span_bugs()
|
||||
pub fn has_errors_or_delayed_span_bugs(&self) -> Option<ErrorGuaranteed> {
|
||||
if self.inner.borrow().has_errors_or_delayed_span_bugs() {
|
||||
Some(ErrorGuaranteed::unchecked_claim_error_was_emitted())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
pub fn is_compilation_going_to_fail(&self) -> Option<ErrorGuaranteed> {
|
||||
if self.inner.borrow().is_compilation_going_to_fail() {
|
||||
Some(ErrorGuaranteed::unchecked_claim_error_was_emitted())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
pub fn print_error_count(&self, registry: &Registry) {
|
||||
@ -1484,6 +1495,10 @@ impl HandlerInner {
|
||||
self.err_count() > 0 || self.lint_err_count > 0 || self.warn_count > 0
|
||||
}
|
||||
|
||||
fn is_compilation_going_to_fail(&self) -> bool {
|
||||
self.has_errors() || self.lint_err_count > 0 || !self.delayed_span_bugs.is_empty()
|
||||
}
|
||||
|
||||
fn abort_if_errors(&mut self) {
|
||||
self.emit_stashed_diagnostics();
|
||||
|
||||
|
@ -361,9 +361,12 @@ impl<'cx, 'tcx> Visitor<'tcx> for WritebackCx<'cx, 'tcx> {
|
||||
|
||||
fn visit_ty(&mut self, hir_ty: &'tcx hir::Ty<'tcx>) {
|
||||
intravisit::walk_ty(self, hir_ty);
|
||||
let ty = self.fcx.node_ty(hir_ty.hir_id);
|
||||
let ty = self.resolve(ty, &hir_ty.span);
|
||||
self.write_ty_to_typeck_results(hir_ty.hir_id, ty);
|
||||
// If there are type checking errors, Type privacy pass will stop,
|
||||
// so we may not get the type from hid_id, see #104513
|
||||
if let Some(ty) = self.fcx.node_ty_opt(hir_ty.hir_id) {
|
||||
let ty = self.resolve(ty, &hir_ty.span);
|
||||
self.write_ty_to_typeck_results(hir_ty.hir_id, ty);
|
||||
}
|
||||
}
|
||||
|
||||
fn visit_infer(&mut self, inf: &'tcx hir::InferArg) {
|
||||
|
@ -322,7 +322,7 @@ pub fn finalize_session_directory(sess: &Session, svh: Svh) {
|
||||
|
||||
let incr_comp_session_dir: PathBuf = sess.incr_comp_session_dir().clone();
|
||||
|
||||
if sess.has_errors_or_delayed_span_bugs() {
|
||||
if let Some(_) = sess.has_errors_or_delayed_span_bugs() {
|
||||
// If there have been any errors during compilation, we don't want to
|
||||
// publish this session directory. Rather, we'll just delete it.
|
||||
|
||||
|
@ -28,7 +28,7 @@ pub fn save_dep_graph(tcx: TyCtxt<'_>) {
|
||||
return;
|
||||
}
|
||||
// This is going to be deleted in finalize_session_directory, so let's not create it
|
||||
if sess.has_errors_or_delayed_span_bugs() {
|
||||
if let Some(_) = sess.has_errors_or_delayed_span_bugs() {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -89,7 +89,7 @@ pub fn save_work_product_index(
|
||||
return;
|
||||
}
|
||||
// This is going to be deleted in finalize_session_directory, so let's not create it
|
||||
if sess.has_errors_or_delayed_span_bugs() {
|
||||
if let Some(_) = sess.has_errors_or_delayed_span_bugs() {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -8,14 +8,6 @@ use super::FulfillmentError;
|
||||
use super::{ObligationCause, PredicateObligation};
|
||||
|
||||
pub trait TraitEngine<'tcx>: 'tcx {
|
||||
fn normalize_projection_type(
|
||||
&mut self,
|
||||
infcx: &InferCtxt<'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
projection_ty: ty::ProjectionTy<'tcx>,
|
||||
cause: ObligationCause<'tcx>,
|
||||
) -> Ty<'tcx>;
|
||||
|
||||
/// Requires that `ty` must implement the trait with `def_id` in
|
||||
/// the given environment. This trait must not have any type
|
||||
/// parameters (except for `Self`).
|
||||
|
@ -1015,6 +1015,7 @@ impl EarlyLintPass for UnusedParens {
|
||||
if let ast::TyKind::Paren(r) = &ty.kind {
|
||||
match &r.kind {
|
||||
ast::TyKind::TraitObject(..) => {}
|
||||
ast::TyKind::BareFn(b) if b.generic_params.len() > 0 => {}
|
||||
ast::TyKind::ImplTrait(_, bounds) if bounds.len() > 1 => {}
|
||||
ast::TyKind::Array(_, len) => {
|
||||
self.check_unused_delims_expr(
|
||||
|
@ -38,7 +38,7 @@ pub fn provide(providers: &mut ty::query::Providers) {
|
||||
tcx.hir().krate_attrs(),
|
||||
tcx.sess,
|
||||
sym::const_eval_limit,
|
||||
1_000_000,
|
||||
2_000_000,
|
||||
),
|
||||
}
|
||||
}
|
||||
|
@ -97,10 +97,10 @@ pub trait TypeVisitable<'tcx>: fmt::Debug + Clone {
|
||||
}
|
||||
fn error_reported(&self) -> Result<(), ErrorGuaranteed> {
|
||||
if self.references_error() {
|
||||
if let Some(reported) = ty::tls::with(|tcx| tcx.sess.has_errors()) {
|
||||
if let Some(reported) = ty::tls::with(|tcx| tcx.sess.is_compilation_going_to_fail()) {
|
||||
Err(reported)
|
||||
} else {
|
||||
bug!("expect tcx.sess.has_errors return true");
|
||||
bug!("expect tcx.sess.is_compilation_going_to_fail return `Some`");
|
||||
}
|
||||
} else {
|
||||
Ok(())
|
||||
|
@ -667,7 +667,7 @@ impl<K: DepKind> DepGraph<K> {
|
||||
None => {}
|
||||
}
|
||||
|
||||
if !qcx.dep_context().sess().has_errors_or_delayed_span_bugs() {
|
||||
if let None = qcx.dep_context().sess().has_errors_or_delayed_span_bugs() {
|
||||
panic!("try_mark_previous_green() - Forcing the DepNode should have set its color")
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@ use rustc_middle::metadata::ModChild;
|
||||
use rustc_middle::ty::{self, DefIdTree};
|
||||
use rustc_session::cstore::CrateStore;
|
||||
use rustc_span::hygiene::{ExpnId, LocalExpnId, MacroKind};
|
||||
use rustc_span::source_map::{respan, Spanned};
|
||||
use rustc_span::source_map::respan;
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
use rustc_span::Span;
|
||||
|
||||
@ -329,10 +329,12 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
.iter()
|
||||
.map(|field| respan(field.span, field.ident.map_or(kw::Empty, |ident| ident.name)))
|
||||
.collect();
|
||||
self.insert_field_names(def_id, field_names);
|
||||
self.r.field_names.insert(def_id, field_names);
|
||||
}
|
||||
|
||||
fn insert_field_names(&mut self, def_id: DefId, field_names: Vec<Spanned<Symbol>>) {
|
||||
fn insert_field_names_extern(&mut self, def_id: DefId) {
|
||||
let field_names =
|
||||
self.r.cstore().struct_field_names_untracked(def_id, self.r.session).collect();
|
||||
self.r.field_names.insert(def_id, field_names);
|
||||
}
|
||||
|
||||
@ -995,8 +997,6 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
let cstore = self.r.cstore();
|
||||
match res {
|
||||
Res::Def(DefKind::Struct, def_id) => {
|
||||
let field_names =
|
||||
cstore.struct_field_names_untracked(def_id, self.r.session).collect();
|
||||
if let Some((ctor_kind, ctor_def_id)) = cstore.ctor_untracked(def_id) {
|
||||
let ctor_res = Res::Def(DefKind::Ctor(CtorOf::Struct, ctor_kind), ctor_def_id);
|
||||
let ctor_vis = cstore.visibility_untracked(ctor_def_id);
|
||||
@ -1006,13 +1006,9 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||
.struct_constructors
|
||||
.insert(def_id, (ctor_res, ctor_vis, field_visibilities));
|
||||
}
|
||||
self.insert_field_names(def_id, field_names);
|
||||
}
|
||||
Res::Def(DefKind::Union, def_id) => {
|
||||
let field_names =
|
||||
cstore.struct_field_names_untracked(def_id, self.r.session).collect();
|
||||
self.insert_field_names(def_id, field_names);
|
||||
self.insert_field_names_extern(def_id)
|
||||
}
|
||||
Res::Def(DefKind::Union, def_id) => self.insert_field_names_extern(def_id),
|
||||
Res::Def(DefKind::AssocFn, def_id) => {
|
||||
if cstore.fn_has_self_parameter_untracked(def_id, self.r.session) {
|
||||
self.r.has_self.insert(def_id);
|
||||
@ -1514,20 +1510,16 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> {
|
||||
};
|
||||
|
||||
// Define a constructor name in the value namespace.
|
||||
let fields_id = if let Some((ctor_kind, ctor_node_id)) = CtorKind::from_ast(&variant.data) {
|
||||
if let Some((ctor_kind, ctor_node_id)) = CtorKind::from_ast(&variant.data) {
|
||||
let ctor_def_id = self.r.local_def_id(ctor_node_id);
|
||||
let ctor_res =
|
||||
Res::Def(DefKind::Ctor(CtorOf::Variant, ctor_kind), ctor_def_id.to_def_id());
|
||||
self.r.define(parent, ident, ValueNS, (ctor_res, ctor_vis, variant.span, expn_id));
|
||||
self.r.visibilities.insert(ctor_def_id, ctor_vis);
|
||||
ctor_def_id
|
||||
} else {
|
||||
def_id
|
||||
};
|
||||
}
|
||||
|
||||
// Record field names for error reporting.
|
||||
// FIXME: Always use non-ctor id as the key.
|
||||
self.insert_field_names_local(fields_id.to_def_id(), &variant.data);
|
||||
self.insert_field_names_local(def_id.to_def_id(), &variant.data);
|
||||
|
||||
visit::walk_variant(self, variant);
|
||||
}
|
||||
|
@ -21,6 +21,7 @@ use rustc_hir::def::Namespace::{self, *};
|
||||
use rustc_hir::def::{self, CtorKind, CtorOf, DefKind};
|
||||
use rustc_hir::def_id::{DefId, CRATE_DEF_ID, LOCAL_CRATE};
|
||||
use rustc_hir::PrimTy;
|
||||
use rustc_middle::ty::DefIdTree;
|
||||
use rustc_session::lint;
|
||||
use rustc_session::parse::feature_err;
|
||||
use rustc_session::Session;
|
||||
@ -1462,7 +1463,8 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
|
||||
_ => return false,
|
||||
}
|
||||
}
|
||||
(Res::Def(DefKind::Ctor(_, CtorKind::Fn), def_id), _) if ns == ValueNS => {
|
||||
(Res::Def(DefKind::Ctor(_, CtorKind::Fn), ctor_def_id), _) if ns == ValueNS => {
|
||||
let def_id = self.r.parent(ctor_def_id);
|
||||
if let Some(span) = self.def_span(def_id) {
|
||||
err.span_label(span, &format!("`{}` defined here", path_str));
|
||||
}
|
||||
@ -1953,7 +1955,8 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
|
||||
));
|
||||
}
|
||||
} else {
|
||||
let needs_placeholder = |def_id: DefId, kind: CtorKind| {
|
||||
let needs_placeholder = |ctor_def_id: DefId, kind: CtorKind| {
|
||||
let def_id = self.r.parent(ctor_def_id);
|
||||
let has_no_fields = self.r.field_names.get(&def_id).map_or(false, |f| f.is_empty());
|
||||
match kind {
|
||||
CtorKind::Const => false,
|
||||
|
@ -538,9 +538,12 @@ impl Session {
|
||||
pub fn has_errors(&self) -> Option<ErrorGuaranteed> {
|
||||
self.diagnostic().has_errors()
|
||||
}
|
||||
pub fn has_errors_or_delayed_span_bugs(&self) -> bool {
|
||||
pub fn has_errors_or_delayed_span_bugs(&self) -> Option<ErrorGuaranteed> {
|
||||
self.diagnostic().has_errors_or_delayed_span_bugs()
|
||||
}
|
||||
pub fn is_compilation_going_to_fail(&self) -> Option<ErrorGuaranteed> {
|
||||
self.diagnostic().is_compilation_going_to_fail()
|
||||
}
|
||||
pub fn abort_if_errors(&self) {
|
||||
self.diagnostic().abort_if_errors();
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
use crate::errors::AutoDerefReachedRecursionLimit;
|
||||
use crate::infer::InferCtxtExt as _;
|
||||
use crate::traits::query::evaluate_obligation::InferCtxtExt;
|
||||
use crate::traits::{self, TraitEngine, TraitEngineExt};
|
||||
use rustc_hir as hir;
|
||||
@ -137,16 +138,14 @@ impl<'a, 'tcx> Autoderef<'a, 'tcx> {
|
||||
return None;
|
||||
}
|
||||
|
||||
let mut fulfillcx = <dyn TraitEngine<'tcx>>::new_in_snapshot(tcx);
|
||||
let normalized_ty = fulfillcx.normalize_projection_type(
|
||||
&self.infcx,
|
||||
self.param_env,
|
||||
ty::ProjectionTy {
|
||||
item_def_id: tcx.lang_items().deref_target()?,
|
||||
substs: trait_ref.substs,
|
||||
},
|
||||
let normalized_ty = self.infcx.partially_normalize_associated_types_in(
|
||||
cause,
|
||||
self.param_env,
|
||||
tcx.mk_projection(tcx.lang_items().deref_target()?, trait_ref.substs),
|
||||
);
|
||||
let mut fulfillcx = <dyn TraitEngine<'tcx>>::new_in_snapshot(tcx);
|
||||
let normalized_ty =
|
||||
normalized_ty.into_value_registering_obligations(self.infcx, &mut *fulfillcx);
|
||||
let errors = fulfillcx.select_where_possible(&self.infcx);
|
||||
if !errors.is_empty() {
|
||||
// This shouldn't happen, except for evaluate/fulfill mismatches,
|
||||
|
@ -4,11 +4,11 @@ use crate::infer::canonical::OriginalQueryValues;
|
||||
use crate::infer::InferCtxt;
|
||||
use crate::traits::query::NoSolution;
|
||||
use crate::traits::{
|
||||
ChalkEnvironmentAndGoal, FulfillmentError, FulfillmentErrorCode, ObligationCause,
|
||||
PredicateObligation, SelectionError, TraitEngine,
|
||||
ChalkEnvironmentAndGoal, FulfillmentError, FulfillmentErrorCode, PredicateObligation,
|
||||
SelectionError, TraitEngine,
|
||||
};
|
||||
use rustc_data_structures::fx::{FxHashMap, FxIndexSet};
|
||||
use rustc_middle::ty::{self, Ty, TypeVisitable};
|
||||
use rustc_middle::ty::{self, TypeVisitable};
|
||||
|
||||
pub struct FulfillmentContext<'tcx> {
|
||||
obligations: FxIndexSet<PredicateObligation<'tcx>>,
|
||||
@ -33,16 +33,6 @@ impl FulfillmentContext<'_> {
|
||||
}
|
||||
|
||||
impl<'tcx> TraitEngine<'tcx> for FulfillmentContext<'tcx> {
|
||||
fn normalize_projection_type(
|
||||
&mut self,
|
||||
infcx: &InferCtxt<'tcx>,
|
||||
_param_env: ty::ParamEnv<'tcx>,
|
||||
projection_ty: ty::ProjectionTy<'tcx>,
|
||||
_cause: ObligationCause<'tcx>,
|
||||
) -> Ty<'tcx> {
|
||||
infcx.tcx.mk_ty(ty::Projection(projection_ty))
|
||||
}
|
||||
|
||||
fn register_predicate_obligation(
|
||||
&mut self,
|
||||
infcx: &InferCtxt<'tcx>,
|
||||
|
@ -2112,10 +2112,7 @@ impl<'tcx> InferCtxtPrivExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
};
|
||||
|
||||
let obligation = obligation.with(self.tcx, trait_ref.to_poly_trait_predicate());
|
||||
let mut selcx = SelectionContext::with_query_mode(
|
||||
&self,
|
||||
crate::traits::TraitQueryMode::Standard,
|
||||
);
|
||||
let mut selcx = SelectionContext::new(&self);
|
||||
match selcx.select_from_obligation(&obligation) {
|
||||
Ok(None) => {
|
||||
let impls = ambiguity::recompute_applicable_impls(self.infcx, &obligation);
|
||||
|
@ -4,12 +4,12 @@ use rustc_data_structures::obligation_forest::ProcessResult;
|
||||
use rustc_data_structures::obligation_forest::{Error, ForestObligation, Outcome};
|
||||
use rustc_data_structures::obligation_forest::{ObligationForest, ObligationProcessor};
|
||||
use rustc_infer::traits::ProjectionCacheKey;
|
||||
use rustc_infer::traits::{SelectionError, TraitEngine, TraitEngineExt as _, TraitObligation};
|
||||
use rustc_infer::traits::{SelectionError, TraitEngine, TraitObligation};
|
||||
use rustc_middle::mir::interpret::ErrorHandled;
|
||||
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
|
||||
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
||||
use rustc_middle::ty::subst::SubstsRef;
|
||||
use rustc_middle::ty::{self, Binder, Const, Ty, TypeVisitable};
|
||||
use rustc_middle::ty::{self, Binder, Const, TypeVisitable};
|
||||
use std::marker::PhantomData;
|
||||
|
||||
use super::const_evaluatable;
|
||||
@ -20,9 +20,9 @@ use super::CodeAmbiguity;
|
||||
use super::CodeProjectionError;
|
||||
use super::CodeSelectionError;
|
||||
use super::EvaluationResult;
|
||||
use super::PredicateObligation;
|
||||
use super::Unimplemented;
|
||||
use super::{FulfillmentError, FulfillmentErrorCode};
|
||||
use super::{ObligationCause, PredicateObligation};
|
||||
|
||||
use crate::traits::project::PolyProjectionObligation;
|
||||
use crate::traits::project::ProjectionCacheKeyExt as _;
|
||||
@ -126,42 +126,6 @@ impl<'a, 'tcx> FulfillmentContext<'tcx> {
|
||||
}
|
||||
|
||||
impl<'tcx> TraitEngine<'tcx> for FulfillmentContext<'tcx> {
|
||||
/// "Normalize" a projection type `<SomeType as SomeTrait>::X` by
|
||||
/// creating a fresh type variable `$0` as well as a projection
|
||||
/// predicate `<SomeType as SomeTrait>::X == $0`. When the
|
||||
/// inference engine runs, it will attempt to find an impl of
|
||||
/// `SomeTrait` or a where-clause that lets us unify `$0` with
|
||||
/// something concrete. If this fails, we'll unify `$0` with
|
||||
/// `projection_ty` again.
|
||||
#[instrument(level = "debug", skip(self, infcx, param_env, cause))]
|
||||
fn normalize_projection_type(
|
||||
&mut self,
|
||||
infcx: &InferCtxt<'tcx>,
|
||||
param_env: ty::ParamEnv<'tcx>,
|
||||
projection_ty: ty::ProjectionTy<'tcx>,
|
||||
cause: ObligationCause<'tcx>,
|
||||
) -> Ty<'tcx> {
|
||||
debug_assert!(!projection_ty.has_escaping_bound_vars());
|
||||
|
||||
// FIXME(#20304) -- cache
|
||||
|
||||
let mut selcx = SelectionContext::new(infcx);
|
||||
let mut obligations = vec![];
|
||||
let normalized_ty = project::normalize_projection_type(
|
||||
&mut selcx,
|
||||
param_env,
|
||||
projection_ty,
|
||||
cause,
|
||||
0,
|
||||
&mut obligations,
|
||||
);
|
||||
self.register_predicate_obligations(infcx, obligations);
|
||||
|
||||
debug!(?normalized_ty);
|
||||
|
||||
normalized_ty.ty().unwrap()
|
||||
}
|
||||
|
||||
fn register_predicate_obligation(
|
||||
&mut self,
|
||||
infcx: &InferCtxt<'tcx>,
|
||||
|
@ -2,9 +2,7 @@ use rustc_middle::ty;
|
||||
|
||||
use crate::infer::canonical::OriginalQueryValues;
|
||||
use crate::infer::InferCtxt;
|
||||
use crate::traits::{
|
||||
EvaluationResult, OverflowError, PredicateObligation, SelectionContext, TraitQueryMode,
|
||||
};
|
||||
use crate::traits::{EvaluationResult, OverflowError, PredicateObligation, SelectionContext};
|
||||
|
||||
pub trait InferCtxtExt<'tcx> {
|
||||
fn predicate_may_hold(&self, obligation: &PredicateObligation<'tcx>) -> bool;
|
||||
@ -97,7 +95,7 @@ impl<'tcx> InferCtxtExt<'tcx> for InferCtxt<'tcx> {
|
||||
match self.evaluate_obligation(obligation) {
|
||||
Ok(result) => result,
|
||||
Err(OverflowError::Canonical) => {
|
||||
let mut selcx = SelectionContext::with_query_mode(&self, TraitQueryMode::Standard);
|
||||
let mut selcx = SelectionContext::new(&self);
|
||||
selcx.evaluate_root_obligation(obligation).unwrap_or_else(|r| match r {
|
||||
OverflowError::Canonical => {
|
||||
span_bug!(
|
||||
|
@ -902,6 +902,12 @@ impl str {
|
||||
///
|
||||
/// assert_eq!(None, iter.next());
|
||||
/// ```
|
||||
///
|
||||
/// If the string is empty or all whitespace, the iterator yields no string slices:
|
||||
/// ```
|
||||
/// assert_eq!("".split_whitespace().next(), None);
|
||||
/// assert_eq!(" ".split_whitespace().next(), None);
|
||||
/// ```
|
||||
#[must_use = "this returns the split string as an iterator, \
|
||||
without modifying the original"]
|
||||
#[stable(feature = "split_whitespace", since = "1.1.0")]
|
||||
@ -946,6 +952,12 @@ impl str {
|
||||
///
|
||||
/// assert_eq!(None, iter.next());
|
||||
/// ```
|
||||
///
|
||||
/// If the string is empty or all ASCII whitespace, the iterator yields no string slices:
|
||||
/// ```
|
||||
/// assert_eq!("".split_ascii_whitespace().next(), None);
|
||||
/// assert_eq!(" ".split_ascii_whitespace().next(), None);
|
||||
/// ```
|
||||
#[must_use = "this returns the split string as an iterator, \
|
||||
without modifying the original"]
|
||||
#[stable(feature = "split_ascii_whitespace", since = "1.34.0")]
|
||||
|
@ -784,8 +784,7 @@ table,
|
||||
margin-top: 0;
|
||||
white-space: nowrap;
|
||||
/* flex layout allows shrinking the <select> appropriately if it becomes too large */
|
||||
display: inline-flex;
|
||||
max-width: 100%;
|
||||
display: flex;
|
||||
/* make things look like in a line, despite the fact that we're using a layout
|
||||
with boxes (i.e. from the flex layout) */
|
||||
align-items: baseline;
|
||||
|
@ -22,7 +22,8 @@ size: (900, 900)
|
||||
|
||||
// First we check the current width, height and position.
|
||||
assert-css: ("#crate-search", {"width": "223px"})
|
||||
assert-css: (".search-results-title", {"height": "44px", "width": "336px"})
|
||||
assert-css: (".search-results-title", {"height": "44px", "width": "640px"})
|
||||
assert-css: ("#search", {"width": "640px"})
|
||||
|
||||
// Then we update the text of one of the `<option>`.
|
||||
text: (
|
||||
|
@ -4,8 +4,8 @@ fn main() {
|
||||
let _ = [(); {
|
||||
let mut n = 113383; // #20 in https://oeis.org/A006884
|
||||
while n != 0 {
|
||||
n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
|
||||
//~^ ERROR evaluation of constant value failed
|
||||
n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
|
||||
}
|
||||
n
|
||||
}];
|
||||
|
@ -1,8 +1,8 @@
|
||||
error[E0080]: evaluation of constant value failed
|
||||
--> $DIR/infinite_loop.rs:7:20
|
||||
--> $DIR/infinite_loop.rs:6:15
|
||||
|
|
||||
LL | n = if n % 2 == 0 { n/2 } else { 3*n + 1 };
|
||||
| ^^^^^^^^^^ exceeded interpreter step limit (see `#[const_eval_limit]`)
|
||||
LL | while n != 0 {
|
||||
| ^^^^^^ exceeded interpreter step limit (see `#[const_eval_limit]`)
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
4
src/test/ui/consts/issue-104768.rs
Normal file
4
src/test/ui/consts/issue-104768.rs
Normal file
@ -0,0 +1,4 @@
|
||||
const A: &_ = 0_u32;
|
||||
//~^ ERROR: the placeholder `_` is not allowed within types on item signatures for constants
|
||||
|
||||
fn main() {}
|
12
src/test/ui/consts/issue-104768.stderr
Normal file
12
src/test/ui/consts/issue-104768.stderr
Normal file
@ -0,0 +1,12 @@
|
||||
error[E0121]: the placeholder `_` is not allowed within types on item signatures for constants
|
||||
--> $DIR/issue-104768.rs:1:10
|
||||
|
|
||||
LL | const A: &_ = 0_u32;
|
||||
| ^^
|
||||
| |
|
||||
| not allowed in type signatures
|
||||
| help: replace with the correct type: `u32`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0121`.
|
18
src/test/ui/lint/unused/issue-104397.rs
Normal file
18
src/test/ui/lint/unused/issue-104397.rs
Normal file
@ -0,0 +1,18 @@
|
||||
// check-pass
|
||||
|
||||
#![warn(unused)]
|
||||
#![deny(warnings)]
|
||||
|
||||
struct Inv<'a>(&'a mut &'a ());
|
||||
|
||||
trait Trait {}
|
||||
impl Trait for for<'a> fn(Inv<'a>) {}
|
||||
|
||||
fn with_bound()
|
||||
where
|
||||
(for<'a> fn(Inv<'a>)): Trait,
|
||||
{}
|
||||
|
||||
fn main() {
|
||||
with_bound();
|
||||
}
|
6
src/test/ui/typeck/issue-104513-ice.rs
Normal file
6
src/test/ui/typeck/issue-104513-ice.rs
Normal file
@ -0,0 +1,6 @@
|
||||
struct S;
|
||||
fn f() {
|
||||
let _: S<impl Oops> = S; //~ ERROR cannot find trait `Oops` in this scope
|
||||
//~^ ERROR `impl Trait` only allowed in function and inherent method return types
|
||||
}
|
||||
fn main() {}
|
18
src/test/ui/typeck/issue-104513-ice.stderr
Normal file
18
src/test/ui/typeck/issue-104513-ice.stderr
Normal file
@ -0,0 +1,18 @@
|
||||
error[E0405]: cannot find trait `Oops` in this scope
|
||||
--> $DIR/issue-104513-ice.rs:3:19
|
||||
|
|
||||
LL | fn f() {
|
||||
| - help: you might be missing a type parameter: `<Oops>`
|
||||
LL | let _: S<impl Oops> = S;
|
||||
| ^^^^ not found in this scope
|
||||
|
||||
error[E0562]: `impl Trait` only allowed in function and inherent method return types, not in variable binding
|
||||
--> $DIR/issue-104513-ice.rs:3:14
|
||||
|
|
||||
LL | let _: S<impl Oops> = S;
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0405, E0562.
|
||||
For more information about an error, try `rustc --explain E0405`.
|
Loading…
Reference in New Issue
Block a user