1
- // ignore-tidy-filelength
2
-
3
1
//! MIR datatypes and passes. See the [rustc guide] for more info.
4
2
//!
5
3
//! [rustc guide]: https://rust-lang.github.io/rustc-guide/mir/index.html
@@ -23,14 +21,12 @@ use polonius_engine::Atom;
23
21
use rustc_data_structures::fx::FxHashSet;
24
22
use rustc_data_structures::graph::dominators::Dominators;
25
23
use rustc_data_structures::graph::{self, GraphSuccessors};
26
- use rustc_data_structures::sync::Lrc;
27
24
use rustc_index::bit_set::BitMatrix;
28
25
use rustc_index::vec::{Idx, IndexVec};
29
26
use rustc_macros::HashStable;
30
27
use rustc_serialize::{Decodable, Encodable};
31
28
use rustc_span::symbol::Symbol;
32
29
use rustc_span::{Span, DUMMY_SP};
33
- use smallvec::SmallVec;
34
30
use std::borrow::Cow;
35
31
use std::fmt::{self, Debug, Display, Formatter, Write};
36
32
use std::ops::Index;
@@ -39,13 +35,15 @@ use std::{iter, mem, option, u32};
39
35
pub use syntax::ast::Mutability;
40
36
use syntax::ast::Name;
41
37
42
- pub use crate::mir::cache::{BodyAndCache, ReadOnlyBodyAndCache};
43
- pub use crate::mir::interpret::AssertMessage;
38
+ pub use self::cache::{BodyAndCache, ReadOnlyBodyAndCache};
39
+ pub use self::interpret::AssertMessage;
40
+ pub use self::query::*;
44
41
pub use crate::read_only;
45
42
46
43
mod cache;
47
44
pub mod interpret;
48
45
pub mod mono;
46
+ mod query;
49
47
pub mod tcx;
50
48
pub mod traversal;
51
49
pub mod visit;
@@ -2581,221 +2579,6 @@ impl Location {
2581
2579
}
2582
2580
}
2583
2581
2584
- #[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, HashStable)]
2585
- pub enum UnsafetyViolationKind {
2586
- General,
2587
- /// Permitted both in `const fn`s and regular `fn`s.
2588
- GeneralAndConstFn,
2589
- BorrowPacked(hir::HirId),
2590
- }
2591
-
2592
- #[derive(Copy, Clone, PartialEq, RustcEncodable, RustcDecodable, HashStable)]
2593
- pub struct UnsafetyViolation {
2594
- pub source_info: SourceInfo,
2595
- pub description: Symbol,
2596
- pub details: Symbol,
2597
- pub kind: UnsafetyViolationKind,
2598
- }
2599
-
2600
- #[derive(Clone, RustcEncodable, RustcDecodable, HashStable)]
2601
- pub struct UnsafetyCheckResult {
2602
- /// Violations that are propagated *upwards* from this function.
2603
- pub violations: Lrc<[UnsafetyViolation]>,
2604
- /// `unsafe` blocks in this function, along with whether they are used. This is
2605
- /// used for the "unused_unsafe" lint.
2606
- pub unsafe_blocks: Lrc<[(hir::HirId, bool)]>,
2607
- }
2608
-
2609
- rustc_index::newtype_index! {
2610
- pub struct GeneratorSavedLocal {
2611
- derive [HashStable]
2612
- DEBUG_FORMAT = "_{}",
2613
- }
2614
- }
2615
-
2616
- /// The layout of generator state.
2617
- #[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable, TypeFoldable)]
2618
- pub struct GeneratorLayout<'tcx> {
2619
- /// The type of every local stored inside the generator.
2620
- pub field_tys: IndexVec<GeneratorSavedLocal, Ty<'tcx>>,
2621
-
2622
- /// Which of the above fields are in each variant. Note that one field may
2623
- /// be stored in multiple variants.
2624
- pub variant_fields: IndexVec<VariantIdx, IndexVec<Field, GeneratorSavedLocal>>,
2625
-
2626
- /// Which saved locals are storage-live at the same time. Locals that do not
2627
- /// have conflicts with each other are allowed to overlap in the computed
2628
- /// layout.
2629
- pub storage_conflicts: BitMatrix<GeneratorSavedLocal, GeneratorSavedLocal>,
2630
- }
2631
-
2632
- #[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)]
2633
- pub struct BorrowCheckResult<'tcx> {
2634
- pub closure_requirements: Option<ClosureRegionRequirements<'tcx>>,
2635
- pub used_mut_upvars: SmallVec<[Field; 8]>,
2636
- }
2637
-
2638
- /// The result of the `mir_const_qualif` query.
2639
- ///
2640
- /// Each field corresponds to an implementer of the `Qualif` trait in
2641
- /// `librustc_mir/transform/check_consts/qualifs.rs`. See that file for more information on each
2642
- /// `Qualif`.
2643
- #[derive(Clone, Copy, Debug, Default, RustcEncodable, RustcDecodable, HashStable)]
2644
- pub struct ConstQualifs {
2645
- pub has_mut_interior: bool,
2646
- pub needs_drop: bool,
2647
- }
2648
-
2649
- /// After we borrow check a closure, we are left with various
2650
- /// requirements that we have inferred between the free regions that
2651
- /// appear in the closure's signature or on its field types. These
2652
- /// requirements are then verified and proved by the closure's
2653
- /// creating function. This struct encodes those requirements.
2654
- ///
2655
- /// The requirements are listed as being between various
2656
- /// `RegionVid`. The 0th region refers to `'static`; subsequent region
2657
- /// vids refer to the free regions that appear in the closure (or
2658
- /// generator's) type, in order of appearance. (This numbering is
2659
- /// actually defined by the `UniversalRegions` struct in the NLL
2660
- /// region checker. See for example
2661
- /// `UniversalRegions::closure_mapping`.) Note that we treat the free
2662
- /// regions in the closure's type "as if" they were erased, so their
2663
- /// precise identity is not important, only their position.
2664
- ///
2665
- /// Example: If type check produces a closure with the closure substs:
2666
- ///
2667
- /// ```text
2668
- /// ClosureSubsts = [
2669
- /// i8, // the "closure kind"
2670
- /// for<'x> fn(&'a &'x u32) -> &'x u32, // the "closure signature"
2671
- /// &'a String, // some upvar
2672
- /// ]
2673
- /// ```
2674
- ///
2675
- /// here, there is one unique free region (`'a`) but it appears
2676
- /// twice. We would "renumber" each occurrence to a unique vid, as follows:
2677
- ///
2678
- /// ```text
2679
- /// ClosureSubsts = [
2680
- /// i8, // the "closure kind"
2681
- /// for<'x> fn(&'1 &'x u32) -> &'x u32, // the "closure signature"
2682
- /// &'2 String, // some upvar
2683
- /// ]
2684
- /// ```
2685
- ///
2686
- /// Now the code might impose a requirement like `'1: '2`. When an
2687
- /// instance of the closure is created, the corresponding free regions
2688
- /// can be extracted from its type and constrained to have the given
2689
- /// outlives relationship.
2690
- ///
2691
- /// In some cases, we have to record outlives requirements between
2692
- /// types and regions as well. In that case, if those types include
2693
- /// any regions, those regions are recorded as `ReClosureBound`
2694
- /// instances assigned one of these same indices. Those regions will
2695
- /// be substituted away by the creator. We use `ReClosureBound` in
2696
- /// that case because the regions must be allocated in the global
2697
- /// `TyCtxt`, and hence we cannot use `ReVar` (which is what we use
2698
- /// internally within the rest of the NLL code).
2699
- #[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)]
2700
- pub struct ClosureRegionRequirements<'tcx> {
2701
- /// The number of external regions defined on the closure. In our
2702
- /// example above, it would be 3 -- one for `'static`, then `'1`
2703
- /// and `'2`. This is just used for a sanity check later on, to
2704
- /// make sure that the number of regions we see at the callsite
2705
- /// matches.
2706
- pub num_external_vids: usize,
2707
-
2708
- /// Requirements between the various free regions defined in
2709
- /// indices.
2710
- pub outlives_requirements: Vec<ClosureOutlivesRequirement<'tcx>>,
2711
- }
2712
-
2713
- /// Indicates an outlives-constraint between a type or between two
2714
- /// free regions declared on the closure.
2715
- #[derive(Copy, Clone, Debug, RustcEncodable, RustcDecodable, HashStable)]
2716
- pub struct ClosureOutlivesRequirement<'tcx> {
2717
- // This region or type ...
2718
- pub subject: ClosureOutlivesSubject<'tcx>,
2719
-
2720
- // ... must outlive this one.
2721
- pub outlived_free_region: ty::RegionVid,
2722
-
2723
- // If not, report an error here ...
2724
- pub blame_span: Span,
2725
-
2726
- // ... due to this reason.
2727
- pub category: ConstraintCategory,
2728
- }
2729
-
2730
- /// Outlives-constraints can be categorized to determine whether and why they
2731
- /// are interesting (for error reporting). Order of variants indicates sort
2732
- /// order of the category, thereby influencing diagnostic output.
2733
- ///
2734
- /// See also [rustc_mir::borrow_check::nll::constraints].
2735
- #[derive(
2736
- Copy,
2737
- Clone,
2738
- Debug,
2739
- Eq,
2740
- PartialEq,
2741
- PartialOrd,
2742
- Ord,
2743
- Hash,
2744
- RustcEncodable,
2745
- RustcDecodable,
2746
- HashStable
2747
- )]
2748
- pub enum ConstraintCategory {
2749
- Return,
2750
- Yield,
2751
- UseAsConst,
2752
- UseAsStatic,
2753
- TypeAnnotation,
2754
- Cast,
2755
-
2756
- /// A constraint that came from checking the body of a closure.
2757
- ///
2758
- /// We try to get the category that the closure used when reporting this.
2759
- ClosureBounds,
2760
- CallArgument,
2761
- CopyBound,
2762
- SizedBound,
2763
- Assignment,
2764
- OpaqueType,
2765
-
2766
- /// A "boring" constraint (caused by the given location) is one that
2767
- /// the user probably doesn't want to see described in diagnostics,
2768
- /// because it is kind of an artifact of the type system setup.
2769
- /// Example: `x = Foo { field: y }` technically creates
2770
- /// intermediate regions representing the "type of `Foo { field: y
2771
- /// }`", and data flows from `y` into those variables, but they
2772
- /// are not very interesting. The assignment into `x` on the other
2773
- /// hand might be.
2774
- Boring,
2775
- // Boring and applicable everywhere.
2776
- BoringNoLocation,
2777
-
2778
- /// A constraint that doesn't correspond to anything the user sees.
2779
- Internal,
2780
- }
2781
-
2782
- /// The subject of a `ClosureOutlivesRequirement` -- that is, the thing
2783
- /// that must outlive some region.
2784
- #[derive(Copy, Clone, Debug, RustcEncodable, RustcDecodable, HashStable)]
2785
- pub enum ClosureOutlivesSubject<'tcx> {
2786
- /// Subject is a type, typically a type parameter, but could also
2787
- /// be a projection. Indicates a requirement like `T: 'a` being
2788
- /// passed to the caller, where the type here is `T`.
2789
- ///
2790
- /// The type here is guaranteed not to contain any free regions at
2791
- /// present.
2792
- Ty(Ty<'tcx>),
2793
-
2794
- /// Subject is a free region from the closure. Indicates a requirement
2795
- /// like `'a: 'b` being passed to the caller; the region here is `'a`.
2796
- Region(ty::RegionVid),
2797
- }
2798
-
2799
2582
/*
2800
2583
* `TypeFoldable` implementations for MIR types
2801
2584
*/
0 commit comments