diff --git a/lang/c++/impl/FileStream.cc b/lang/c++/impl/FileStream.cc index 9063cf1f734..debe87c0110 100644 --- a/lang/c++/impl/FileStream.cc +++ b/lang/c++/impl/FileStream.cc @@ -205,8 +205,15 @@ class BufferCopyInInputStream : public SeekableInputStream { void seek(int64_t position) final { // BufferCopyIn::seek is relative to byteCount_, whereas position is // absolute. - in_->seek(position - byteCount_ - available_); - byteCount_ = position; + int64_t offset = position - static_cast(byteCount_) - static_cast(available_); + if (offset < 0) { + throw Exception("Negative offset in seek"); + } + in_->seek(static_cast(offset)); + if (position < 0) { + throw Exception("Negative position not allowed"); + } + byteCount_ = static_cast(position); available_ = 0; } diff --git a/lang/c++/impl/parsing/Symbol.cc b/lang/c++/impl/parsing/Symbol.cc index fe87c5205b4..9322fc60bf9 100644 --- a/lang/c++/impl/parsing/Symbol.cc +++ b/lang/c++/impl/parsing/Symbol.cc @@ -88,7 +88,12 @@ Symbol Symbol::enumAdjustSymbol(const NodePtr &writer, const NodePtr &reader) { adj.push_back(static_cast(-pos)); err.push_back(s); } else { - adj.push_back(static_cast(it - rs.begin())); + auto index = it - rs.begin(); + if constexpr (std::is_same_v) { + adj.push_back(index); // 32-bit: already int + } else { + adj.push_back(static_cast(index)); // 64-bit: long to int + } } } return Symbol(Kind::EnumAdjust, make_pair(adj, err));