@@ -23,7 +23,9 @@ use rustc_index::IndexVec;
2323use rustc_macros:: { Decodable , Encodable , HashStable_Generic } ;
2424use rustc_span:: def_id:: LocalDefId ;
2525use rustc_span:: source_map:: Spanned ;
26- use rustc_span:: { BytePos , DUMMY_SP , ErrorGuaranteed , Ident , Span , Symbol , kw, sym} ;
26+ use rustc_span:: {
27+ BytePos , DUMMY_SP , DesugaringKind , ErrorGuaranteed , Ident , Span , Symbol , kw, sym,
28+ } ;
2729use rustc_target:: asm:: InlineAsmRegOrRegClass ;
2830use smallvec:: SmallVec ;
2931use thin_vec:: ThinVec ;
@@ -2600,102 +2602,21 @@ impl Expr<'_> {
26002602 ) => path1. res == path2. res ,
26012603 (
26022604 ExprKind :: Struct (
2603- QPath :: LangItem ( LangItem :: RangeTo , _) ,
2604- [ val1] ,
2605- StructTailExpr :: None ,
2606- ) ,
2607- ExprKind :: Struct (
2608- QPath :: LangItem ( LangItem :: RangeTo , _) ,
2609- [ val2] ,
2610- StructTailExpr :: None ,
2611- ) ,
2612- )
2613- | (
2614- ExprKind :: Struct (
2615- QPath :: LangItem ( LangItem :: RangeToInclusive , _) ,
2616- [ val1] ,
2617- StructTailExpr :: None ,
2618- ) ,
2619- ExprKind :: Struct (
2620- QPath :: LangItem ( LangItem :: RangeToInclusive , _) ,
2621- [ val2] ,
2622- StructTailExpr :: None ,
2623- ) ,
2624- )
2625- | (
2626- ExprKind :: Struct (
2627- QPath :: LangItem ( LangItem :: RangeToInclusiveCopy , _) ,
2628- [ val1] ,
2629- StructTailExpr :: None ,
2630- ) ,
2631- ExprKind :: Struct (
2632- QPath :: LangItem ( LangItem :: RangeToInclusiveCopy , _) ,
2633- [ val2] ,
2634- StructTailExpr :: None ,
2635- ) ,
2636- )
2637- | (
2638- ExprKind :: Struct (
2639- QPath :: LangItem ( LangItem :: RangeFrom , _) ,
2640- [ val1] ,
2641- StructTailExpr :: None ,
2642- ) ,
2643- ExprKind :: Struct (
2644- QPath :: LangItem ( LangItem :: RangeFrom , _) ,
2645- [ val2] ,
2646- StructTailExpr :: None ,
2647- ) ,
2648- )
2649- | (
2650- ExprKind :: Struct (
2651- QPath :: LangItem ( LangItem :: RangeFromCopy , _) ,
2652- [ val1] ,
2605+ & QPath :: Resolved ( None , & Path { res : Res :: Def ( _, path1_def_id) , .. } ) ,
2606+ args1,
26532607 StructTailExpr :: None ,
26542608 ) ,
26552609 ExprKind :: Struct (
2656- QPath :: LangItem ( LangItem :: RangeFromCopy , _) ,
2657- [ val2] ,
2658- StructTailExpr :: None ,
2659- ) ,
2660- ) => val1. expr . equivalent_for_indexing ( val2. expr ) ,
2661- (
2662- ExprKind :: Struct (
2663- QPath :: LangItem ( LangItem :: Range , _) ,
2664- [ val1, val3] ,
2665- StructTailExpr :: None ,
2666- ) ,
2667- ExprKind :: Struct (
2668- QPath :: LangItem ( LangItem :: Range , _) ,
2669- [ val2, val4] ,
2670- StructTailExpr :: None ,
2671- ) ,
2672- )
2673- | (
2674- ExprKind :: Struct (
2675- QPath :: LangItem ( LangItem :: RangeCopy , _) ,
2676- [ val1, val3] ,
2677- StructTailExpr :: None ,
2678- ) ,
2679- ExprKind :: Struct (
2680- QPath :: LangItem ( LangItem :: RangeCopy , _) ,
2681- [ val2, val4] ,
2682- StructTailExpr :: None ,
2683- ) ,
2684- )
2685- | (
2686- ExprKind :: Struct (
2687- QPath :: LangItem ( LangItem :: RangeInclusiveCopy , _) ,
2688- [ val1, val3] ,
2689- StructTailExpr :: None ,
2690- ) ,
2691- ExprKind :: Struct (
2692- QPath :: LangItem ( LangItem :: RangeInclusiveCopy , _) ,
2693- [ val2, val4] ,
2610+ & QPath :: Resolved ( None , & Path { res : Res :: Def ( _, path2_def_id) , .. } ) ,
2611+ args2,
26942612 StructTailExpr :: None ,
26952613 ) ,
26962614 ) => {
2697- val1. expr . equivalent_for_indexing ( val2. expr )
2698- && val3. expr . equivalent_for_indexing ( val4. expr )
2615+ path2_def_id == path1_def_id
2616+ && is_range_literal ( self )
2617+ && is_range_literal ( other)
2618+ && std:: iter:: zip ( args1, args2)
2619+ . all ( |( a, b) | a. expr . equivalent_for_indexing ( b. expr ) )
26992620 }
27002621 _ => false ,
27012622 }
@@ -2713,30 +2634,29 @@ impl Expr<'_> {
27132634/// Checks if the specified expression is a built-in range literal.
27142635/// (See: `LoweringContext::lower_expr()`).
27152636pub fn is_range_literal ( expr : & Expr < ' _ > ) -> bool {
2716- match expr. kind {
2717- // All built-in range literals but `..=` and `..` desugar to `Struct`s.
2718- ExprKind :: Struct ( ref qpath, _, _) => matches ! (
2719- * * qpath,
2720- QPath :: LangItem (
2721- LangItem :: Range
2722- | LangItem :: RangeTo
2723- | LangItem :: RangeFrom
2724- | LangItem :: RangeFull
2725- | LangItem :: RangeToInclusive
2726- | LangItem :: RangeCopy
2727- | LangItem :: RangeFromCopy
2728- | LangItem :: RangeInclusiveCopy
2729- | LangItem :: RangeToInclusiveCopy ,
2730- ..
2731- )
2732- ) ,
2733-
2734- // `..=` desugars into `::std::ops::RangeInclusive::new(...)`.
2735- ExprKind :: Call ( ref func, _) => {
2736- matches ! ( func. kind, ExprKind :: Path ( QPath :: LangItem ( LangItem :: RangeInclusiveNew , ..) ) )
2737- }
2738-
2739- _ => false ,
2637+ if let ExprKind :: Struct ( QPath :: Resolved ( None , path) , _, StructTailExpr :: None ) = expr. kind
2638+ && let [ .., segment] = path. segments
2639+ && let sym:: RangeFrom
2640+ | sym:: RangeFull
2641+ | sym:: Range
2642+ | sym:: RangeToInclusive
2643+ | sym:: RangeTo
2644+ | sym:: RangeFromCopy
2645+ | sym:: RangeCopy
2646+ | sym:: RangeInclusiveCopy
2647+ | sym:: RangeToInclusiveCopy = segment. ident . name
2648+ && expr. span . is_desugaring ( DesugaringKind :: RangeExpr )
2649+ {
2650+ true
2651+ } else if let ExprKind :: Call ( func, _) = & expr. kind
2652+ && let ExprKind :: Path ( QPath :: Resolved ( None , path) ) = func. kind
2653+ && let [ .., segment] = path. segments
2654+ && let sym:: range_inclusive_new = segment. ident . name
2655+ && expr. span . is_desugaring ( DesugaringKind :: RangeExpr )
2656+ {
2657+ true
2658+ } else {
2659+ false
27402660 }
27412661}
27422662
0 commit comments