@@ -244,17 +244,17 @@ static bool fillRanges(MemoryBuffer *Code,
244244 DiagnosticsEngine Diagnostics (
245245 IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs), DiagOpts);
246246 SourceManager Sources (Diagnostics, Files);
247- FileID ID = createInMemoryFile (" <irrelevant>" , *Code, Sources, Files,
248- InMemoryFileSystem.get ());
247+ const auto ID = createInMemoryFile (" <irrelevant>" , *Code, Sources, Files,
248+ InMemoryFileSystem.get ());
249249 if (!LineRanges.empty ()) {
250250 if (!Offsets.empty () || !Lengths.empty ()) {
251251 errs () << " error: cannot use -lines with -offset/-length\n " ;
252252 return true ;
253253 }
254254
255- for (unsigned i = 0 , e = LineRanges. size (); i < e; ++i ) {
255+ for (const auto &LineRange : LineRanges) {
256256 unsigned FromLine, ToLine;
257- if (parseLineRange (LineRanges[i] , FromLine, ToLine)) {
257+ if (parseLineRange (LineRange , FromLine, ToLine)) {
258258 errs () << " error: invalid <start line>:<end line> pair\n " ;
259259 return true ;
260260 }
@@ -266,45 +266,41 @@ static bool fillRanges(MemoryBuffer *Code,
266266 errs () << " error: start line should not exceed end line\n " ;
267267 return true ;
268268 }
269- SourceLocation Start = Sources.translateLineCol (ID, FromLine, 1 );
270- SourceLocation End = Sources.translateLineCol (ID, ToLine, UINT_MAX);
269+ const auto Start = Sources.translateLineCol (ID, FromLine, 1 );
270+ const auto End = Sources.translateLineCol (ID, ToLine, UINT_MAX);
271271 if (Start.isInvalid () || End.isInvalid ())
272272 return true ;
273- unsigned Offset = Sources.getFileOffset (Start);
274- unsigned Length = Sources.getFileOffset (End) - Offset;
273+ const auto Offset = Sources.getFileOffset (Start);
274+ const auto Length = Sources.getFileOffset (End) - Offset;
275275 Ranges.push_back (tooling::Range (Offset, Length));
276276 }
277277 return false ;
278278 }
279279
280280 if (Offsets.empty ())
281281 Offsets.push_back (0 );
282- if (Offsets.size () != Lengths.size () &&
283- !(Offsets.size () == 1 && Lengths.empty ())) {
282+ const bool EmptyLengths = Lengths.empty ();
283+ unsigned Length = 0 ;
284+ if (Offsets.size () == 1 && EmptyLengths) {
285+ Length = Sources.getFileOffset (Sources.getLocForEndOfFile (ID)) - Offsets[0 ];
286+ } else if (Offsets.size () != Lengths.size ()) {
284287 errs () << " error: number of -offset and -length arguments must match.\n " ;
285288 return true ;
286289 }
287- for (unsigned i = 0 , e = Offsets.size (); i != e; ++i) {
288- if (Offsets[i] >= Code->getBufferSize ()) {
289- errs () << " error: offset " << Offsets[i] << " is outside the file\n " ;
290+ for (unsigned I = 0 , E = Offsets.size (), CodeSize = Code->getBufferSize ();
291+ I < E; ++I) {
292+ const auto Offset = Offsets[I];
293+ if (Offset >= CodeSize) {
294+ errs () << " error: offset " << Offset << " is outside the file\n " ;
290295 return true ;
291296 }
292- SourceLocation Start =
293- Sources.getLocForStartOfFile (ID).getLocWithOffset (Offsets[i]);
294- SourceLocation End;
295- if (i < Lengths.size ()) {
296- if (Offsets[i] + Lengths[i] > Code->getBufferSize ()) {
297- errs () << " error: invalid length " << Lengths[i]
298- << " , offset + length (" << Offsets[i] + Lengths[i]
299- << " ) is outside the file.\n " ;
300- return true ;
301- }
302- End = Start.getLocWithOffset (Lengths[i]);
303- } else {
304- End = Sources.getLocForEndOfFile (ID);
297+ if (!EmptyLengths)
298+ Length = Lengths[I];
299+ if (Offset + Length > CodeSize) {
300+ errs () << " error: invalid length " << Length << " , offset + length ("
301+ << Offset + Length << " ) is outside the file.\n " ;
302+ return true ;
305303 }
306- unsigned Offset = Sources.getFileOffset (Start);
307- unsigned Length = Sources.getFileOffset (End) - Offset;
308304 Ranges.push_back (tooling::Range (Offset, Length));
309305 }
310306 return false ;
0 commit comments