C++23 fixes when SWIFTSHADER_LLVM_VERSION=16.0

I was mostly testing llvm-10.0 before, this CL fixes llvm-16.0 too.
There is one follow-up to [1] in llvm-10.0: replace the
s/insert/push_back manual changes I mentioned with actual iterator fixes
in PredIterator and SuccIterator.

[1] https://swiftshader-review.googlesource.com/c/SwiftShader/+/76548

Bug: chromium:388068055
Change-Id: Ia9001f8109b4020c63a85778d7c213f3df4c7e73
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/76589
Reviewed-by: Corentin Wallez <cwallez@google.com>
Commit-Queue: Corentin Wallez <cwallez@google.com>
Tested-by: Corentin Wallez <cwallez@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
diff --git a/third_party/llvm-10.0/llvm/include/llvm/Analysis/LoopInfoImpl.h b/third_party/llvm-10.0/llvm/include/llvm/Analysis/LoopInfoImpl.h
index 3bcb7d0..99f192a 100644
--- a/third_party/llvm-10.0/llvm/include/llvm/Analysis/LoopInfoImpl.h
+++ b/third_party/llvm-10.0/llvm/include/llvm/Analysis/LoopInfoImpl.h
@@ -440,9 +440,9 @@
       if (PredBB == L->getHeader())
         continue;
       // Push all block predecessors on the worklist.
-      for (auto it = InvBlockTraits::child_begin(PredBB); it != InvBlockTraits::child_end(PredBB); it++) {
-        ReverseCFGWorklist.push_back(*it);
-      }
+      ReverseCFGWorklist.insert(ReverseCFGWorklist.end(),
+                                InvBlockTraits::child_begin(PredBB),
+                                InvBlockTraits::child_end(PredBB));
     } else {
       // This is a discovered block. Find its outermost discovered loop.
       while (LoopT *Parent = Subloop->getParentLoop())
diff --git a/third_party/llvm-10.0/llvm/include/llvm/IR/CFG.h b/third_party/llvm-10.0/llvm/include/llvm/IR/CFG.h
index f9dc638..9046af4 100644
--- a/third_party/llvm-10.0/llvm/include/llvm/IR/CFG.h
+++ b/third_party/llvm-10.0/llvm/include/llvm/IR/CFG.h
@@ -56,9 +56,9 @@
 
 public:
   using iterator_category = std::forward_iterator_tag;
-  using value_type = Ptr;
+  using value_type = Ptr*;
   using difference_type = ptrdiff_t;
-  using pointer = Ptr*;
+  using pointer = Ptr**;
   using reference = Ptr*;
 
   PredIterator() = default;
@@ -138,7 +138,8 @@
                                   std::random_access_iterator_tag, BlockT, int,
                                   BlockT *, BlockT *> {
 public:
-  using difference_type = int;
+  using value_type = BlockT *;
+  using difference_type = std::ptrdiff_t;
   using pointer = BlockT *;
   using reference = BlockT *;
 
diff --git a/third_party/llvm-10.0/llvm/lib/Analysis/LazyValueInfo.cpp b/third_party/llvm-10.0/llvm/lib/Analysis/LazyValueInfo.cpp
index 3581842..bad2de9 100644
--- a/third_party/llvm-10.0/llvm/lib/Analysis/LazyValueInfo.cpp
+++ b/third_party/llvm-10.0/llvm/lib/Analysis/LazyValueInfo.cpp
@@ -345,9 +345,7 @@
 
     if (!changed) continue;
 
-    for (auto it = succ_begin(ToUpdate); it != succ_end(ToUpdate); it++) {
-      worklist.push_back(*it);
-    }
+    worklist.insert(worklist.end(), succ_begin(ToUpdate), succ_end(ToUpdate));
   }
 }
 
diff --git a/third_party/llvm-16.0/llvm/include/llvm/ADT/APFloat.h b/third_party/llvm-16.0/llvm/include/llvm/ADT/APFloat.h
index 3f85a51..780e824 100644
--- a/third_party/llvm-16.0/llvm/include/llvm/ADT/APFloat.h
+++ b/third_party/llvm-16.0/llvm/include/llvm/ADT/APFloat.h
@@ -646,9 +646,9 @@
   bool needsCleanup() const { return Floats != nullptr; }
 
   inline APFloat &getFirst();
-  inline const APFloat &getFirst();
+  inline const APFloat &getFirst() const;
   inline APFloat &getSecond();
-  inline const APFloat &getSecond();
+  inline const APFloat &getSecond() const;
 
   opStatus add(const DoubleAPFloat &RHS, roundingMode RM);
   opStatus subtract(const DoubleAPFloat &RHS, roundingMode RM);
diff --git a/third_party/llvm-16.0/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h b/third_party/llvm-16.0/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
index ea6ed32..c9263e6 100644
--- a/third_party/llvm-16.0/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
+++ b/third_party/llvm-16.0/llvm/include/llvm/CodeGen/GlobalISel/MIPatternMatch.h
@@ -338,7 +338,7 @@
 };
 
 template <> struct bind_helper<LLT> {
-  static bool bind(const MachineRegisterInfo &MRI, LLT Ty, Register Reg) {
+  static bool bind(const MachineRegisterInfo &MRI, LLT &Ty, Register Reg) {
     Ty = MRI.getType(Reg);
     if (Ty.isValid())
       return true;
@@ -368,7 +368,7 @@
 
 inline bind_ty<Register> m_Reg(Register &R) { return R; }
 inline bind_ty<MachineInstr *> m_MInstr(MachineInstr *&MI) { return MI; }
-inline bind_ty<LLT> m_Type(LLT Ty) { return Ty; }
+inline bind_ty<LLT> m_Type(LLT& Ty) { return Ty; }
 inline bind_ty<CmpInst::Predicate> m_Pred(CmpInst::Predicate &P) { return P; }
 inline operand_type_match m_Pred() { return operand_type_match(); }
 
diff --git a/third_party/llvm-16.0/llvm/include/llvm/IR/CFG.h b/third_party/llvm-16.0/llvm/include/llvm/IR/CFG.h
index 12ca1b1..a8db93d 100644
--- a/third_party/llvm-16.0/llvm/include/llvm/IR/CFG.h
+++ b/third_party/llvm-16.0/llvm/include/llvm/IR/CFG.h
@@ -42,9 +42,9 @@
 class PredIterator {
 public:
   using iterator_category = std::forward_iterator_tag;
-  using value_type = Ptr;
+  using value_type = Ptr *;
   using difference_type = std::ptrdiff_t;
-  using pointer = Ptr *;
+  using pointer = Ptr **;
   using reference = Ptr *;
 
 protected:
@@ -140,7 +140,8 @@
                                   std::random_access_iterator_tag, BlockT, int,
                                   BlockT *, BlockT *> {
 public:
-  using difference_type = int;
+  using value_type = BlockT *;
+  using difference_type = std::ptrdiff_t;
   using pointer = BlockT *;
   using reference = BlockT *;
 
diff --git a/third_party/llvm-16.0/llvm/include/llvm/ProfileData/InstrProfCorrelator.h b/third_party/llvm-16.0/llvm/include/llvm/ProfileData/InstrProfCorrelator.h
index 2e26a21..6e0b761 100644
--- a/third_party/llvm-16.0/llvm/include/llvm/ProfileData/InstrProfCorrelator.h
+++ b/third_party/llvm-16.0/llvm/include/llvm/ProfileData/InstrProfCorrelator.h
@@ -13,6 +13,7 @@
 #define LLVM_PROFILEDATA_INSTRPROFCORRELATOR_H
 
 #include "llvm/ADT/DenseSet.h"
+#include "llvm/DebugInfo/DWARF/DWARFContext.h"
 #include "llvm/ProfileData/InstrProf.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/MemoryBuffer.h"
diff --git a/third_party/llvm-16.0/llvm/include/llvm/Support/ScopedPrinter.h b/third_party/llvm-16.0/llvm/include/llvm/Support/ScopedPrinter.h
index b91acb5..2841344 100644
--- a/third_party/llvm-16.0/llvm/include/llvm/Support/ScopedPrinter.h
+++ b/third_party/llvm-16.0/llvm/include/llvm/Support/ScopedPrinter.h
@@ -519,7 +519,13 @@
   startLine() << Label << ": " << hex(Value) << "\n";
 }
 
-struct DelimitedScope;
+struct DelimitedScope {
+  DelimitedScope(ScopedPrinter &W) : W(&W) {}
+  DelimitedScope() : W(nullptr) {}
+  virtual ~DelimitedScope() = default;
+  virtual void setPrinter(ScopedPrinter &W) = 0;
+  ScopedPrinter *W;
+};
 
 class JSONScopedPrinter : public ScopedPrinter {
 private:
@@ -798,14 +804,6 @@
   }
 };
 
-struct DelimitedScope {
-  DelimitedScope(ScopedPrinter &W) : W(&W) {}
-  DelimitedScope() : W(nullptr) {}
-  virtual ~DelimitedScope() = default;
-  virtual void setPrinter(ScopedPrinter &W) = 0;
-  ScopedPrinter *W;
-};
-
 struct DictScope : DelimitedScope {
   explicit DictScope() = default;
   explicit DictScope(ScopedPrinter &W) : DelimitedScope(W) { W.objectBegin(); }
diff --git a/third_party/llvm-16.0/llvm/lib/Remarks/BitstreamRemarkParser.cpp b/third_party/llvm-16.0/llvm/lib/Remarks/BitstreamRemarkParser.cpp
index 6dd032f..b8e510a 100644
--- a/third_party/llvm-16.0/llvm/lib/Remarks/BitstreamRemarkParser.cpp
+++ b/third_party/llvm-16.0/llvm/lib/Remarks/BitstreamRemarkParser.cpp
@@ -82,6 +82,15 @@
   return Error::success();
 }
 
+BitstreamRemarkParser::BitstreamRemarkParser(StringRef Buf)
+    : RemarkParser(Format::Bitstream), ParserHelper(Buf) {}
+
+BitstreamRemarkParser::BitstreamRemarkParser(StringRef Buf,
+                                             ParsedStringTable StrTab)
+    : RemarkParser(Format::Bitstream),
+      ParserHelper(Buf),
+      StrTab(std::move(StrTab)) {}
+
 BitstreamRemarkParserHelper::BitstreamRemarkParserHelper(
     BitstreamCursor &Stream)
     : Stream(Stream) {}
diff --git a/third_party/llvm-16.0/llvm/lib/Remarks/BitstreamRemarkParser.h b/third_party/llvm-16.0/llvm/lib/Remarks/BitstreamRemarkParser.h
index fc786fc..08e189c 100644
--- a/third_party/llvm-16.0/llvm/lib/Remarks/BitstreamRemarkParser.h
+++ b/third_party/llvm-16.0/llvm/lib/Remarks/BitstreamRemarkParser.h
@@ -45,13 +45,10 @@
 
   /// Create a parser that expects to find a string table embedded in the
   /// stream.
-  explicit BitstreamRemarkParser(StringRef Buf)
-      : RemarkParser(Format::Bitstream), ParserHelper(Buf) {}
+  explicit BitstreamRemarkParser(StringRef Buf);
 
   /// Create a parser that uses a pre-parsed string table.
-  BitstreamRemarkParser(StringRef Buf, ParsedStringTable StrTab)
-      : RemarkParser(Format::Bitstream), ParserHelper(Buf),
-        StrTab(std::move(StrTab)) {}
+  BitstreamRemarkParser(StringRef Buf, ParsedStringTable StrTab);
 
   Expected<std::unique_ptr<Remark>> next() override;