diff options
| author | Shotaro Yamada <sinkuu@sinkuu.xyz> | 2018-03-07 07:16:25 +0900 |
|---|---|---|
| committer | Shotaro Yamada <sinkuu@sinkuu.xyz> | 2018-03-07 08:48:36 +0900 |
| commit | f5a3efee88b3a2bf2d69b74f2d5a7eb75049f5ef (patch) | |
| tree | 4c411e8614ea983682f8ef9ae931881767f86038 /src | |
| parent | c92630a04a90b66af2fe14de5f29ff823878bea7 (diff) | |
| download | rust-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.rs | 17 | ||||
| -rw-r--r-- | src/test/run-make/save-analysis-fail/foo.rs | 3 |
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; } |
