diff --git a/include/libcamera/base/log.h b/include/libcamera/base/log.h
index 620930125..b3050eedb 100644
--- a/include/libcamera/base/log.h
+++ b/include/libcamera/base/log.h
@@ -61,8 +61,6 @@ public:
 	LogMessage(const char *fileName, unsigned int line,
 		   const LogCategory &category, LogSeverity severity,
 		   const std::string &prefix = std::string());
-
-	LogMessage(LogMessage &&);
 	~LogMessage();
 
 	std::ostream &stream() { return msgStream_; }
@@ -75,7 +73,7 @@ public:
 	const std::string msg() const { return msgStream_.str(); }
 
 private:
-	LIBCAMERA_DISABLE_COPY(LogMessage)
+	LIBCAMERA_DISABLE_COPY_AND_MOVE(LogMessage)
 
 	void init(const char *fileName, unsigned int line);
 
diff --git a/src/libcamera/base/log.cpp b/src/libcamera/base/log.cpp
index 72e0db859..009f6c737 100644
--- a/src/libcamera/base/log.cpp
+++ b/src/libcamera/base/log.cpp
@@ -866,25 +866,6 @@ LogMessage::LogMessage(const char *fileName, unsigned int line,
 	init(fileName, line);
 }
 
-/**
- * \brief Move-construct a log message
- * \param[in] other The other message
- *
- * The move constructor is meant to support the _log() functions. Thanks to copy
- * elision it will likely never be called, but C++11 only permits copy elision,
- * it doesn't enforce it unlike C++17. To avoid potential link errors depending
- * on the compiler type and version, and optimization level, the move
- * constructor is defined even if it will likely never be called, and ensures
- * that the destructor of the \a other message will not output anything to the
- * log by setting the severity to LogInvalid.
- */
-LogMessage::LogMessage(LogMessage &&other)
-	: msgStream_(std::move(other.msgStream_)), category_(other.category_),
-	  severity_(other.severity_)
-{
-	other.severity_ = LogInvalid;
-}
-
 void LogMessage::init(const char *fileName, unsigned int line)
 {
 	/* Log the timestamp, severity and file information. */
