This Go frontend patch by Nikhil Benesch fixes the file reading logic in the Stream_from_file class. That class is almost never used, and I guess nobody noticed these problems. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
500c2690e24054730a2ecf9989720e9d501c9eb1 diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 94827406df1..701b2d427e3 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -801c458a562d22260ff176c26d65639dd32c8a90 +d00febdab0535546ccbf1ef634be1f23b09c8b77 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/import.cc b/gcc/go/gofrontend/import.cc index c63ae24f533..081afefa083 100644 --- a/gcc/go/gofrontend/import.cc +++ b/gcc/go/gofrontend/import.cc @@ -1487,7 +1487,7 @@ Stream_from_file::~Stream_from_file() bool Stream_from_file::do_peek(size_t length, const char** bytes) { - if (this->data_.length() <= length) + if (this->data_.length() >= length) { *bytes = this->data_.data(); return true; @@ -1504,7 +1504,7 @@ Stream_from_file::do_peek(size_t length, const char** bytes) return false; } - if (lseek(this->fd_, - got, SEEK_CUR) != 0) + if (lseek(this->fd_, - got, SEEK_CUR) < 0) { if (!this->saw_error()) go_fatal_error(Linemap::unknown_location(), "lseek failed: %m"); @@ -1524,7 +1524,7 @@ Stream_from_file::do_peek(size_t length, const char** bytes) void Stream_from_file::do_advance(size_t skip) { - if (lseek(this->fd_, skip, SEEK_CUR) != 0) + if (lseek(this->fd_, skip, SEEK_CUR) < 0) { if (!this->saw_error()) go_fatal_error(Linemap::unknown_location(), "lseek failed: %m"); @@ -1532,7 +1532,7 @@ Stream_from_file::do_advance(size_t skip) } if (!this->data_.empty()) { - if (this->data_.length() < skip) + if (this->data_.length() > skip) this->data_.erase(0, skip); else this->data_.clear();