diff --git a/epoll_server/fake_simple_epoll_server.cc b/epoll_server/fake_simple_epoll_server.cc
index 7e55945..9f9eefd 100644
--- a/epoll_server/fake_simple_epoll_server.cc
+++ b/epoll_server/fake_simple_epoll_server.cc
@@ -17,7 +17,8 @@
 
 FakeSimpleEpollServer::~FakeSimpleEpollServer() = default;
 
-int FakeSimpleEpollServer::epoll_wait_impl(int epfd, struct epoll_event* events,
+int FakeSimpleEpollServer::epoll_wait_impl(int /*epfd*/,
+                                           struct epoll_event* events,
                                            int max_events, int timeout_in_ms) {
   int num_events = 0;
   while (!event_queue_.empty() && num_events < max_events &&
diff --git a/epoll_server/fake_simple_epoll_server.h b/epoll_server/fake_simple_epoll_server.h
index cd5bd3a..ae43588 100644
--- a/epoll_server/fake_simple_epoll_server.h
+++ b/epoll_server/fake_simple_epoll_server.h
@@ -95,14 +95,14 @@
  protected:  // functions
   // These functions do nothing here, as we're not actually
   // using the epoll_* syscalls.
-  void DelFD(int fd) const override {}
-  void AddFD(int fd, int event_mask) const override {}
-  void ModFD(int fd, int event_mask) const override {}
+  void DelFD(int /*fd*/) const override {}
+  void AddFD(int /*fd*/, int /*event_mask*/) const override {}
+  void ModFD(int /*fd*/, int /*event_mask*/) const override {}
 
   // Replaces the epoll_server's epoll_wait_impl.
   int epoll_wait_impl(int epfd, struct epoll_event* events, int max_events,
                       int timeout_in_ms) override;
-  void SetNonblocking(int fd) override {}
+  void SetNonblocking(int /*fd*/) override {}
 
  private:  // members
   EventQueue event_queue_;
diff --git a/epoll_server/simple_epoll_server.cc b/epoll_server/simple_epoll_server.cc
index 0117542..1da05ae 100644
--- a/epoll_server/simple_epoll_server.cc
+++ b/epoll_server/simple_epoll_server.cc
@@ -87,7 +87,7 @@
       data_read = read(fd, &data, sizeof(data));
     }
   }
-  void OnShutdown(SimpleEpollServer* eps, int fd) override {}
+  void OnShutdown(SimpleEpollServer* /*eps*/, int /*fd*/) override {}
   void OnRegistration(SimpleEpollServer*, int, int) override {}
   void OnModification(int, int) override {}     // COV_NF_LINE
   void OnUnregistration(int, bool) override {}  // COV_NF_LINE
@@ -790,7 +790,7 @@
 
 void EpollAlarm::OnUnregistration() { registered_ = false; }
 
-void EpollAlarm::OnShutdown(SimpleEpollServer* eps) {
+void EpollAlarm::OnShutdown(SimpleEpollServer* /*eps*/) {
   registered_ = false;
   eps_ = NULL;
 }
diff --git a/epoll_server/simple_epoll_server_test.cc b/epoll_server/simple_epoll_server_test.cc
index dbc3292..9ec2366 100644
--- a/epoll_server/simple_epoll_server_test.cc
+++ b/epoll_server/simple_epoll_server_test.cc
@@ -151,7 +151,8 @@
     delete recorder_;
   }
 
-  void OnRegistration(SimpleEpollServer* eps, int fd, int event_mask) override {
+  void OnRegistration(SimpleEpollServer* /*eps*/, int fd,
+                      int event_mask) override {
     recorder_->Record(this, REGISTRATION, fd, event_mask);
   }
 
@@ -565,7 +566,7 @@
     }
   }
 
-  void OnShutdown(SimpleEpollServer* eps) override {
+  void OnShutdown(SimpleEpollServer* /*eps*/) override {
     onshutdown_called_ = true;
     has_token_ = false;
   }
@@ -657,7 +658,7 @@
     parent_->OnShutdown(this, eps);
   }
   void OnRegistration(const SimpleEpollServer::AlarmRegToken& token,
-                      SimpleEpollServer* eps) override {
+                      SimpleEpollServer* /*eps*/) override {
     parent_->OnRegistration(this, token);
   }
 
@@ -766,7 +767,7 @@
     delete iterator_token_;
   }
 
-  void OnShutdown(SimpleEpollServer* eps) override {
+  void OnShutdown(SimpleEpollServer* /*eps*/) override {
     onshutdown_called_ = true;
   }
 
@@ -778,7 +779,7 @@
   }
 
   void OnRegistration(const SimpleEpollServer::AlarmRegToken& token,
-                      SimpleEpollServer* eps) override {
+                      SimpleEpollServer* /*eps*/) override {
     // Multiple iterator tokens are not maintained by this code,
     // so we should have reset the iterator_token in OnAlarm or
     // OnUnregistration.
@@ -1562,7 +1563,7 @@
   ~UnregisterCB() override {
   }
 
-  void OnShutdown(SimpleEpollServer* eps, int fd) override {
+  void OnShutdown(SimpleEpollServer* /*eps*/, int fd) override {
     eps_->UnregisterFD(fd_);
     eps_->UnregisterFD(fd);
     onshutdown_called_ = true;
@@ -1572,11 +1573,11 @@
   void set_epollserver(SimpleEpollServer* eps) { eps_ = eps; }
   bool onshutdown_called() { return onshutdown_called_; }
 
-  void OnRegistration(SimpleEpollServer* eps, int fd, int event_mask) override {
-  }
-  void OnModification(int fd, int event_mask) override {}
-  void OnEvent(int fd, EpollEvent* event) override {}
-  void OnUnregistration(int fd, bool replaced) override {}
+  void OnRegistration(SimpleEpollServer* /*eps*/, int /*fd*/,
+                      int /*event_mask*/) override {}
+  void OnModification(int /*fd*/, int /*event_mask*/) override {}
+  void OnEvent(int /*fd*/, EpollEvent* /*event*/) override {}
+  void OnUnregistration(int /*fd*/, bool /*replaced*/) override {}
 
   std::string Name() const override { return "UnregisterCB"; }
 
@@ -1680,10 +1681,10 @@
 
   ~EpollReader() override {}
 
-  void OnRegistration(SimpleEpollServer* eps, int fd, int event_mask) override {
-  }
+  void OnRegistration(SimpleEpollServer* /*eps*/, int /*fd*/,
+                      int /*event_mask*/) override {}
 
-  void OnModification(int fd, int event_mask) override {}
+  void OnModification(int /*fd*/, int /*event_mask*/) override {}
 
   void OnEvent(int fd, EpollEvent* event) override {
     if (event->in_events & EPOLLIN) {
@@ -1697,9 +1698,9 @@
     }
   }
 
-  void OnUnregistration(int fd, bool replaced) override {}
+  void OnUnregistration(int /*fd*/, bool /*replaced*/) override {}
 
-  void OnShutdown(SimpleEpollServer* eps, int fd) override {
+  void OnShutdown(SimpleEpollServer* /*eps*/, int /*fd*/) override {
     // None of the current tests involve having active callbacks when the
     // server shuts down.
     EPOLL_LOG(FATAL);
@@ -1934,12 +1935,12 @@
     }
   }
 
-  void OnUnregistration(int fd, bool replaced) override {
+  void OnUnregistration(int /*fd*/, bool /*replaced*/) override {
     EXPECT_TRUE(eps_ != nullptr);
     eps_ = nullptr;
   }
 
-  void OnShutdown(SimpleEpollServer* eps, int fd) override {
+  void OnShutdown(SimpleEpollServer* /*eps*/, int /*fd*/) override {
     // None of the current tests involve having active callbacks when the
     // server shuts down.
     EPOLL_LOG(FATAL);
@@ -2068,17 +2069,17 @@
   ~UnRegisterWhileProcessingCB() override {
   }
 
-  void OnShutdown(SimpleEpollServer* eps, int fd) override {}
+  void OnShutdown(SimpleEpollServer* /*eps*/, int /*fd*/) override {}
 
   void set_epoll_server(SimpleEpollServer* eps) { eps_ = eps; }
-  void OnRegistration(SimpleEpollServer* eps, int fd, int event_mask) override {
-  }
-  void OnModification(int fd, int event_mask) override {}
-  void OnEvent(int fd, EpollEvent* event) override {
+  void OnRegistration(SimpleEpollServer* /*eps*/, int /*fd*/,
+                      int /*event_mask*/) override {}
+  void OnModification(int /*fd*/, int /*event_mask*/) override {}
+  void OnEvent(int /*fd*/, EpollEvent* /*event*/) override {
     // This should cause no problems.
     eps_->UnregisterFD(fd_);
   }
-  void OnUnregistration(int fd, bool replaced) override {}
+  void OnUnregistration(int /*fd*/, bool /*replaced*/) override {}
   std::string Name() const override { return "UnRegisterWhileProcessingCB"; }
 
  protected:
@@ -2094,17 +2095,17 @@
   ~RegisterWhileProcessingCB() override {
   }
 
-  void OnShutdown(SimpleEpollServer* eps, int fd) override {}
+  void OnShutdown(SimpleEpollServer* /*eps*/, int /*fd*/) override {}
 
   void set_epoll_server(SimpleEpollServer* eps) { eps_ = eps; }
-  void OnRegistration(SimpleEpollServer* eps, int fd, int event_mask) override {
-  }
-  void OnModification(int fd, int event_mask) override {}
-  void OnEvent(int fd, EpollEvent* event) override {
+  void OnRegistration(SimpleEpollServer* /*eps*/, int /*fd*/,
+                      int /*event_mask*/) override {}
+  void OnModification(int /*fd*/, int /*event_mask*/) override {}
+  void OnEvent(int /*fd*/, EpollEvent* /*event*/) override {
     // This should cause no problems.
     eps_->RegisterFDForReadWrite(fd_, cb_);
   }
-  void OnUnregistration(int fd, bool replaced) override {}
+  void OnUnregistration(int /*fd*/, bool /*replaced*/) override {}
   std::string Name() const override { return "RegisterWhileProcessingCB"; }
 
  protected:
@@ -2180,21 +2181,21 @@
 
 class ReRegWhileReadyListOnEvent: public EpollCallbackInterface {
  public:
-  explicit ReRegWhileReadyListOnEvent(int fd) : eps_(nullptr) {}
+  explicit ReRegWhileReadyListOnEvent(int /*fd*/) : eps_(nullptr) {}
 
-  void OnShutdown(SimpleEpollServer* eps, int fd) override {}
+  void OnShutdown(SimpleEpollServer* /*eps*/, int /*fd*/) override {}
 
   void set_epoll_server(SimpleEpollServer* eps) { eps_ = eps; }
-  void OnRegistration(SimpleEpollServer* eps, int fd, int event_mask) override {
-  }
-  void OnModification(int fd, int event_mask) override {}
-  void OnEvent(int fd, EpollEvent* event) override {
+  void OnRegistration(SimpleEpollServer* /*eps*/, int /*fd*/,
+                      int /*event_mask*/) override {}
+  void OnModification(int /*fd*/, int /*event_mask*/) override {}
+  void OnEvent(int fd, EpollEvent* /*event_mask*/) override {
     // This should cause no problems.
     eps_->UnregisterFD(fd);
     eps_->RegisterFDForReadWrite(fd, this);
     eps_->UnregisterFD(fd);
   }
-  void OnUnregistration(int fd, bool replaced) override {}
+  void OnUnregistration(int /*fd*/, bool /*replaced*/) override {}
   std::string Name() const override { return "ReRegWhileReadyListOnEvent"; }
 
  protected:
@@ -2226,14 +2227,15 @@
   void set_fd_range(int fd_range) { fd_range_ = fd_range; }
   void set_num_called(int* num_called) { num_called_ = num_called; }
 
-  void OnShutdown(SimpleEpollServer* eps, int fd) override {}
+  void OnShutdown(SimpleEpollServer* /*eps*/, int /*fd*/) override {}
 
   void set_epoll_server(SimpleEpollServer* eps) { eps_ = eps; }
-  void OnRegistration(SimpleEpollServer* eps, int fd, int event_mask) override {
+  void OnRegistration(SimpleEpollServer* eps, int fd,
+                      int /*event_mask*/) override {
     eps->SetFDReady(fd, EPOLLIN);
   }
-  void OnModification(int fd, int event_mask) override {}
-  void OnEvent(int fd, EpollEvent* event) override {
+  void OnModification(int /*fd*/, int /*event_mask*/) override {}
+  void OnEvent(int /*fd*/, EpollEvent* /*event*/) override {
     // This should cause no problems.
     CHECK(num_called_ != nullptr);
     ++(*num_called_);
@@ -2247,7 +2249,7 @@
       eps_->UnregisterFD(i);
     }
   }
-  void OnUnregistration(int fd, bool replaced) override {}
+  void OnUnregistration(int /*fd*/, bool /*replaced*/) override {}
   std::string Name() const override {
     return "UnRegEverythingReadyListOnEvent";
   }
@@ -2306,10 +2308,10 @@
  public:
   ApproximateNowInUsecTestCB() : feps_(nullptr), called_(false) {}
 
-  void OnRegistration(SimpleEpollServer* eps, int fd, int event_mask) override {
-  }
-  void OnModification(int fd, int event_mask) override {}
-  void OnEvent(int fd, EpollEvent* event) override {
+  void OnRegistration(SimpleEpollServer* /*eps*/, int /*fd*/,
+                      int /*event_mask*/) override {}
+  void OnModification(int /*fd*/, int /*event_mask*/) override {}
+  void OnEvent(int /*fd*/, EpollEvent* /*event*/) override {
     EXPECT_EQ(feps_->ApproximateNowInUsec(), feps_->NowInUsec());
     feps_->AdvanceBy(1111);
     EXPECT_EQ(1 * 1111 + feps_->ApproximateNowInUsec(), feps_->NowInUsec());
@@ -2317,8 +2319,8 @@
     EXPECT_EQ(2 * 1111 + feps_->ApproximateNowInUsec(), feps_->NowInUsec());
     called_ = true;
   }
-  void OnUnregistration(int fd, bool replaced) override {}
-  void OnShutdown(SimpleEpollServer* eps, int fd) override {}
+  void OnUnregistration(int /*fd*/, bool /*replaced*/) override {}
+  void OnShutdown(SimpleEpollServer* /*eps*/, int /*fd*/) override {}
   std::string Name() const override { return "ApproximateNowInUsecTestCB"; }
 
   void set_fakeepollserver(FakeSimpleEpollServer* feps) { feps_ = feps; }
@@ -2374,18 +2376,18 @@
   ~RecordDelayOnEvent() override {
   }
 
-  void OnShutdown(SimpleEpollServer* eps, int fd) override {}
+  void OnShutdown(SimpleEpollServer* /*eps*/, int /*fd*/) override {}
 
   std::string Name() const override { return "RecordDelayOnEvent"; }
 
   void set_epoll_server(SimpleEpollServer* eps) { eps_ = eps; }
-  void OnRegistration(SimpleEpollServer* eps, int fd, int event_mask) override {
-  }
-  void OnModification(int fd, int event_mask) override {}
-  void OnEvent(int fd, EpollEvent* event) override {
+  void OnRegistration(SimpleEpollServer* /*eps*/, int /*fd*/,
+                      int /*event_mask*/) override {}
+  void OnModification(int /*fd*/, int /*event_mask*/) override {}
+  void OnEvent(int /*fd*/, EpollEvent* /*event*/) override {
     last_delay = eps_->LastDelayInUsec();
   }
-  void OnUnregistration(int fd, bool replaced) override {}
+  void OnUnregistration(int /*fd*/, bool /*replaced*/) override {}
 
   int64_t last_delay;
 
diff --git a/quic/core/frames/quic_stop_sending_frame.cc b/quic/core/frames/quic_stop_sending_frame.cc
index 7623f0d..20281e5 100644
--- a/quic/core/frames/quic_stop_sending_frame.cc
+++ b/quic/core/frames/quic_stop_sending_frame.cc
@@ -15,7 +15,7 @@
       ietf_error_code(
           GetQuicReloadableFlag(quic_stop_sending_uses_ietf_error_code)
               ? RstStreamErrorCodeToIetfResetStreamErrorCode(error_code)
-              : error_code) {
+              : static_cast<uint64_t>(error_code)) {
   if (GetQuicReloadableFlag(quic_stop_sending_uses_ietf_error_code)) {
     QUIC_RELOADABLE_FLAG_COUNT_N(quic_stop_sending_uses_ietf_error_code, 1, 2);
   }
diff --git a/quic/core/quic_config.cc b/quic/core/quic_config.cc
index 89a76af..bac4e18 100644
--- a/quic/core/quic_config.cc
+++ b/quic/core/quic_config.cc
@@ -1354,14 +1354,11 @@
     }
   }
 
-  bool google_params_already_parsed = false;
   if (params.initial_round_trip_time_us.value() > 0) {
-    google_params_already_parsed = true;
     initial_round_trip_time_us_.SetReceivedValue(
         params.initial_round_trip_time_us.value());
   }
   if (params.google_connection_options.has_value()) {
-    google_params_already_parsed = true;
     connection_options_.SetReceivedValues(
         params.google_connection_options.value());
   }
