about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorShotaro Yamada <sinkuu@sinkuu.xyz>2018-03-07 07:16:25 +0900
committerShotaro Yamada <sinkuu@sinkuu.xyz>2018-03-07 08:48:36 +0900
commitf5a3efee88b3a2bf2d69b74f2d5a7eb75049f5ef (patch)
tree4c411e8614ea983682f8ef9ae931881767f86038 /src
parentc92630a04a90b66af2fe14de5f29ff823878bea7 (diff)
downloadrust-f5a3efee88b3a2bf2d69b74f2d5a7eb75049f5ef.tar.gz
rust-f5a3efee88b3a2bf2d69b74f2d5a7eb75049f5ef.zip
Do not panic on tuple struct access out of bounds
Diffstat (limited to 'src')
-rw-r--r--src/librustc_save_analysis/dump_visitor.rs17
-rw-r--r--src/test/run-make/save-analysis-fail/foo.rs3
2 files changed, 13 insertions, 7 deletions
diff --git a/src/librustc_save_analysis/dump_visitor.rs b/src/librustc_save_analysis/dump_visitor.rs
index d4d76ff786f..d92025a6787 100644
--- a/src/librustc_save_analysis/dump_visitor.rs
+++ b/src/librustc_save_analysis/dump_visitor.rs
@@ -1665,13 +1665,16 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> Visitor<'l> for DumpVisitor<'l, 'tc
                         if !self.span.filter_generated(sub_span, ex.span) {
                             let span =
                                 self.span_from_span(sub_span.expect("No span found for var ref"));
-                            let ref_id =
-                                ::id_from_def_id(def.non_enum_variant().fields[idx.node].did);
-                            self.dumper.dump_ref(Ref {
-                                kind: RefKind::Variable,
-                                span,
-                                ref_id,
-                            });
+                            if let Some(field) = def.non_enum_variant().fields.get(idx.node) {
+                                let ref_id = ::id_from_def_id(field.did);
+                                self.dumper.dump_ref(Ref {
+                                    kind: RefKind::Variable,
+                                    span,
+                                    ref_id,
+                                });
+                            } else {
+                                return;
+                            }
                         }
                     }
                     ty::TyTuple(..) => {}
diff --git a/src/test/run-make/save-analysis-fail/foo.rs b/src/test/run-make/save-analysis-fail/foo.rs
index f123c3a812d..b844f2e49e7 100644
--- a/src/test/run-make/save-analysis-fail/foo.rs
+++ b/src/test/run-make/save-analysis-fail/foo.rs
@@ -462,4 +462,7 @@ fn new(f: u32) -> Rls699 {
 
 fn invalid_tuple_struct_access() {
     bar.0;
+
+    struct S;
+    S.0;
 }