Fix overloaded operators in bigint.

Assignment and increment/decrement operators should return values.

PiperOrigin-RevId: 254821537
Change-Id: I85d2fe7669474cb27850b7e4196edb424dd87ad1
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/56891
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/third_party/bigint/BigInteger.cc b/third_party/bigint/BigInteger.cc
index 93b57e4..476f3e6 100644
--- a/third_party/bigint/BigInteger.cc
+++ b/third_party/bigint/BigInteger.cc
@@ -6,14 +6,15 @@
 
 #include "BigInteger.hh"
 
-void BigInteger::operator =(const BigInteger &x) {
+BigInteger& BigInteger::operator =(const BigInteger &x) {
 	// Calls like a = a have no effect
 	if (this == &x)
-		return;
+		return *this;
 	// Copy sign
 	sign = x.sign;
 	// Copy the rest
 	mag = x.mag;
+	return *this;
 }
 
 BigInteger::BigInteger(const Blk *b, Index blen, Sign s) : mag(b, blen) {
@@ -374,7 +375,7 @@
 // INCREMENT/DECREMENT OPERATORS
 
 // Prefix increment
-void BigInteger::operator ++() {
+BigInteger& BigInteger::operator ++() {
 	if (sign == negative) {
 		mag--;
 		if (mag == 0)
@@ -383,15 +384,18 @@
 		mag++;
 		sign = positive; // if not already
 	}
+	return *this;
 }
 
-// Postfix increment: same as prefix
-void BigInteger::operator ++(int) {
+// Postfix increment
+BigInteger BigInteger::operator ++(int) {
+	BigInteger temp(*this);
 	operator ++();
+	return temp;
 }
 
 // Prefix decrement
-void BigInteger::operator --() {
+BigInteger& BigInteger::operator --() {
 	if (sign == positive) {
 		mag--;
 		if (mag == 0)
@@ -400,10 +404,13 @@
 		mag++;
 		sign = negative;
 	}
+	return *this;
 }
 
-// Postfix decrement: same as prefix
-void BigInteger::operator --(int) {
+// Postfix decrement
+BigInteger BigInteger::operator --(int) {
+	BigInteger temp(*this);
 	operator --();
+	return temp;
 }
 
diff --git a/third_party/bigint/BigInteger.hh b/third_party/bigint/BigInteger.hh
index 35a2b6b..b5d3518 100644
--- a/third_party/bigint/BigInteger.hh
+++ b/third_party/bigint/BigInteger.hh
@@ -41,7 +41,7 @@
 	BigInteger(const BigInteger &x) : sign(x.sign), mag(x.mag) {}
 
 	// Assignment operator
-	void operator=(const BigInteger &x);
+	BigInteger& operator=(const BigInteger &x);
 
 	// Constructor that copies from a given array of blocks with a sign.
 	BigInteger(const Blk *b, Index blen, Sign s);
@@ -129,18 +129,18 @@
 	BigInteger operator %(const BigInteger &x) const;
 	BigInteger operator -() const;
 
-	void operator +=(const BigInteger &x);
-	void operator -=(const BigInteger &x);
-	void operator *=(const BigInteger &x);
-	void operator /=(const BigInteger &x);
-	void operator %=(const BigInteger &x);
+	BigInteger& operator +=(const BigInteger &x);
+	BigInteger& operator -=(const BigInteger &x);
+	BigInteger& operator *=(const BigInteger &x);
+	BigInteger& operator /=(const BigInteger &x);
+	BigInteger& operator %=(const BigInteger &x);
 	void flipSign();
 
 	// INCREMENT/DECREMENT OPERATORS
-	void operator ++(   );
-	void operator ++(int);
-	void operator --(   );
-	void operator --(int);
+	BigInteger& operator ++(   );
+	BigInteger operator ++(int);
+	BigInteger& operator --(   );
+	BigInteger operator --(int);
 };
 
 // NORMAL OPERATORS
@@ -191,16 +191,19 @@
  * belongs to the put-here operations.  See Assignment Operators in
  * BigUnsigned.hh.
  */
-inline void BigInteger::operator +=(const BigInteger &x) {
+inline BigInteger& BigInteger::operator +=(const BigInteger &x) {
 	add(*this, x);
+	return *this;
 }
-inline void BigInteger::operator -=(const BigInteger &x) {
+inline BigInteger& BigInteger::operator -=(const BigInteger &x) {
 	subtract(*this, x);
+	return *this;
 }
-inline void BigInteger::operator *=(const BigInteger &x) {
+inline BigInteger& BigInteger::operator *=(const BigInteger &x) {
 	multiply(*this, x);
+	return *this;
 }
-inline void BigInteger::operator /=(const BigInteger &x) {
+inline BigInteger& BigInteger::operator /=(const BigInteger &x) {
 	if (x.isZero())
         abort();
 	/* The following technique is slightly faster than copying *this first
@@ -209,13 +212,15 @@
 	divideWithRemainder(x, q);
 	// *this contains the remainder, but we overwrite it with the quotient.
 	*this = q;
+	return *this;
 }
-inline void BigInteger::operator %=(const BigInteger &x) {
+inline BigInteger& BigInteger::operator %=(const BigInteger &x) {
 	if (x.isZero())
         abort();
 	BigInteger q;
 	// Mods *this by x.  Don't care about quotient left in q.
 	divideWithRemainder(x, q);
+	return *this;
 }
 // This one is trivial
 inline void BigInteger::flipSign() {
diff --git a/third_party/bigint/BigUnsigned.cc b/third_party/bigint/BigUnsigned.cc
index e38e4aa..0713632 100644
--- a/third_party/bigint/BigUnsigned.cc
+++ b/third_party/bigint/BigUnsigned.cc
@@ -659,7 +659,7 @@
 // INCREMENT/DECREMENT OPERATORS
 
 // Prefix increment
-void BigUnsigned::operator ++() {
+BigUnsigned& BigUnsigned::operator ++() {
 	Index i;
 	bool carry = true;
 	for (i = 0; i < len && carry; i++) {
@@ -672,15 +672,18 @@
 		len++;
 		blk[i] = 1;
 	}
+	return *this;
 }
 
-// Postfix increment: same as prefix
-void BigUnsigned::operator ++(int) {
+// Postfix increment
+BigUnsigned BigUnsigned::operator ++(int) {
+	BigUnsigned temp(*this);
 	operator ++();
+	return temp;
 }
 
 // Prefix decrement
-void BigUnsigned::operator --() {
+BigUnsigned& BigUnsigned::operator --() {
 	if (len == 0)
         abort();
 	Index i;
@@ -692,9 +695,12 @@
 	// Zap possible leading zero (there can only be one)
 	if (blk[len - 1] == 0)
 		len--;
+	return *this;
 }
 
-// Postfix decrement: same as prefix
-void BigUnsigned::operator --(int) {
+// Postfix decrement
+BigUnsigned BigUnsigned::operator --(int) {
+	BigUnsigned temp(*this);
 	operator --();
+	return temp;
 }
diff --git a/third_party/bigint/BigUnsigned.hh b/third_party/bigint/BigUnsigned.hh
index de4c18e..56da651 100644
--- a/third_party/bigint/BigUnsigned.hh
+++ b/third_party/bigint/BigUnsigned.hh
@@ -46,8 +46,9 @@
 	BigUnsigned(const BigUnsigned &x) : NumberlikeArray<Blk>(x) {}
 
 	// Assignment operator
-	void operator=(const BigUnsigned &x) {
+	BigUnsigned& operator=(const BigUnsigned &x) {
 		NumberlikeArray<Blk>::operator =(x);
+		return *this;
 	}
 
 	// Constructor that copies from a given array of blocks.
@@ -218,24 +219,24 @@
 	BigUnsigned operator >>(int b) const;
 
 	// OVERLOADED ASSIGNMENT OPERATORS
-	void operator +=(const BigUnsigned &x);
-	void operator -=(const BigUnsigned &x);
-	void operator *=(const BigUnsigned &x);
-	void operator /=(const BigUnsigned &x);
-	void operator %=(const BigUnsigned &x);
-	void operator &=(const BigUnsigned &x);
-	void operator |=(const BigUnsigned &x);
-	void operator ^=(const BigUnsigned &x);
-	void operator <<=(int b);
-	void operator >>=(int b);
+	BigUnsigned& operator +=(const BigUnsigned &x);
+	BigUnsigned& operator -=(const BigUnsigned &x);
+	BigUnsigned& operator *=(const BigUnsigned &x);
+	BigUnsigned& operator /=(const BigUnsigned &x);
+	BigUnsigned& operator %=(const BigUnsigned &x);
+	BigUnsigned& operator &=(const BigUnsigned &x);
+	BigUnsigned& operator |=(const BigUnsigned &x);
+	BigUnsigned& operator ^=(const BigUnsigned &x);
+	BigUnsigned& operator <<=(int b);
+	BigUnsigned& operator >>=(int b);
 
 	/* INCREMENT/DECREMENT OPERATORS
 	 * To discourage messy coding, these do not return *this, so prefix
 	 * and postfix behave the same. */
-	void operator ++(   );
-	void operator ++(int);
-	void operator --(   );
-	void operator --(int);
+	BigUnsigned& operator ++(   );
+	BigUnsigned operator ++(int);
+	BigUnsigned& operator --(   );
+	BigUnsigned operator --(int);
 
 	// Helper function that needs access to BigUnsigned internals
 	friend Blk getShiftedBlock(const BigUnsigned &num, Index x,
@@ -307,16 +308,19 @@
 	return ans;
 }
 
-inline void BigUnsigned::operator +=(const BigUnsigned &x) {
+inline BigUnsigned& BigUnsigned::operator +=(const BigUnsigned &x) {
 	add(*this, x);
+	return *this;
 }
-inline void BigUnsigned::operator -=(const BigUnsigned &x) {
+inline BigUnsigned& BigUnsigned::operator -=(const BigUnsigned &x) {
 	subtract(*this, x);
+	return *this;
 }
-inline void BigUnsigned::operator *=(const BigUnsigned &x) {
+inline BigUnsigned& BigUnsigned::operator *=(const BigUnsigned &x) {
 	multiply(*this, x);
+	return *this;
 }
-inline void BigUnsigned::operator /=(const BigUnsigned &x) {
+inline BigUnsigned& BigUnsigned::operator /=(const BigUnsigned &x) {
 	if (x.isZero())
         abort();
 	/* The following technique is slightly faster than copying *this first
@@ -325,28 +329,35 @@
 	divideWithRemainder(x, q);
 	// *this contains the remainder, but we overwrite it with the quotient.
 	*this = q;
+	return *this;
 }
-inline void BigUnsigned::operator %=(const BigUnsigned &x) {
+inline BigUnsigned& BigUnsigned::operator %=(const BigUnsigned &x) {
 	if (x.isZero())
         abort();
 	BigUnsigned q;
 	// Mods *this by x.  Don't care about quotient left in q.
 	divideWithRemainder(x, q);
+	return *this;
 }
-inline void BigUnsigned::operator &=(const BigUnsigned &x) {
+inline BigUnsigned& BigUnsigned::operator &=(const BigUnsigned &x) {
 	bitAnd(*this, x);
+	return *this;
 }
-inline void BigUnsigned::operator |=(const BigUnsigned &x) {
+inline BigUnsigned& BigUnsigned::operator |=(const BigUnsigned &x) {
 	bitOr(*this, x);
+	return *this;
 }
-inline void BigUnsigned::operator ^=(const BigUnsigned &x) {
+inline BigUnsigned& BigUnsigned::operator ^=(const BigUnsigned &x) {
 	bitXor(*this, x);
+	return *this;
 }
-inline void BigUnsigned::operator <<=(int b) {
+inline BigUnsigned& BigUnsigned::operator <<=(int b) {
 	bitShiftLeft(*this, b);
+	return *this;
 }
-inline void BigUnsigned::operator >>=(int b) {
+inline BigUnsigned& BigUnsigned::operator >>=(int b) {
 	bitShiftRight(*this, b);
+	return *this;
 }
 
 /* Templates for conversions of BigUnsigned to and from primitive integers.
diff --git a/third_party/bigint/NumberlikeArray.hh b/third_party/bigint/NumberlikeArray.hh
index f791780..df58dae 100644
--- a/third_party/bigint/NumberlikeArray.hh
+++ b/third_party/bigint/NumberlikeArray.hh
@@ -70,7 +70,7 @@
 	NumberlikeArray(const NumberlikeArray<Blk> &x);
 
 	// Assignment operator
-	void operator=(const NumberlikeArray<Blk> &x);
+	NumberlikeArray<Blk>& operator=(const NumberlikeArray<Blk> &x);
 
 	// Constructor that copies from a given array of blocks
 	NumberlikeArray(const Blk *b, Index blen);
@@ -139,11 +139,11 @@
 }
 
 template <class Blk>
-void NumberlikeArray<Blk>::operator=(const NumberlikeArray<Blk> &x) {
+NumberlikeArray<Blk>& NumberlikeArray<Blk>::operator=(const NumberlikeArray<Blk> &x) {
 	/* Calls like a = a have no effect; catch them before the aliasing
 	 * causes a problem */
 	if (this == &x)
-		return;
+		return *this;
 	// Copy length
 	len = x.len;
 	// Expand array if necessary
@@ -152,6 +152,7 @@
 	Index i;
 	for (i = 0; i < len; i++)
 		blk[i] = x.blk[i];
+	return *this;
 }
 
 template <class Blk>