These are patches cherry-picked from upstream.
They are applied inline, rather than as separate patches, so that they
automatically go away once the upstream release containing them is merged in.
--- mir-2.9.0.orig/CMakeLists.txt
+++ mir-2.9.0/CMakeLists.txt
@@ -74,6 +74,8 @@ if(MIR_FATAL_COMPILE_WARNINGS)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
 endif()
 
+set(MIR_COMPILER_QUIRKS "" CACHE STRING "List of compiler quirks to enable")
+
 include(CheckCXXCompilerFlag)
 check_cxx_compiler_flag(-Wmismatched-tags HAS_W_MISMATCHED_TAGS)
 
--- mir-2.9.0.orig/tests/mir_test_framework/CMakeLists.txt
+++ mir-2.9.0/tests/mir_test_framework/CMakeLists.txt
@@ -61,6 +61,12 @@ set_property(
     SOURCE udev_environment.cpp
     PROPERTY COMPILE_OPTIONS -Wno-variadic-macros)
 
+if ("libinput_environment.cpp:restrict" IN_LIST MIR_COMPILER_QUIRKS)
+  set_property(
+    SOURCE libinput_environment.cpp
+    PROPERTY COMPILE_OPTIONS -Wno-error=restrict)
+endif()
+
 # Umockdev uses glib, which uses the deprecated "register" storage qualifier
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Dregister=")
 
--- mir-2.9.0.orig/tests/unit-tests/CMakeLists.txt
+++ mir-2.9.0/tests/unit-tests/CMakeLists.txt
@@ -141,6 +141,13 @@ set_property(
   SOURCE graphics/test_platform_prober.cpp
   PROPERTY COMPILE_OPTIONS -Wno-variadic-macros)
 
+if ("test_linearising_executor.cpp:use-after-free" IN_LIST MIR_COMPILER_QUIRKS)
+  set_property(
+    SOURCE test_linearising_executor.cpp
+    PROPERTY COMPILE_OPTIONS -Wno-error=use-after-free  # riscv64 spuriously warns here
+  )
+endif()
+
 if (MIR_USE_PRECOMPILED_HEADERS)
   target_precompile_headers(
     mir_unit_tests
