cmif_serialization: enforce const for references
This commit is contained in:
		@@ -115,6 +115,11 @@ struct ArgumentTraits {
 | 
			
		||||
    static constexpr ArgumentType Type = ArgumentType::InData;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename... Ts>
 | 
			
		||||
consteval bool ConstIfReference() {
 | 
			
		||||
    return ((!std::is_reference_v<Ts> || std::is_const_v<std::remove_reference_t<Ts>>) && ... && true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct RequestLayout {
 | 
			
		||||
    u32 copy_handle_count;
 | 
			
		||||
    u32 move_handle_count;
 | 
			
		||||
@@ -435,6 +440,7 @@ void CmifReplyWrapImpl(HLERequestContext& ctx, T& t, Result (T::*f)(A...)) {
 | 
			
		||||
    }
 | 
			
		||||
    const bool is_domain = Domain ? ctx.GetManager()->IsDomain() : false;
 | 
			
		||||
 | 
			
		||||
    static_assert(ConstIfReference<A...>(), "Arguments taken by reference must be const");
 | 
			
		||||
    using MethodArguments = std::tuple<std::remove_cvref_t<A>...>;
 | 
			
		||||
 | 
			
		||||
    OutTemporaryBuffers buffers{};
 | 
			
		||||
 
 | 
			
		||||
@@ -4,10 +4,9 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <span>
 | 
			
		||||
 | 
			
		||||
#include "common/common_funcs.h"
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "core/hle/service/hle_ipc.h"
 | 
			
		||||
 | 
			
		||||
namespace Service {
 | 
			
		||||
 | 
			
		||||
@@ -22,8 +21,10 @@ class Out {
 | 
			
		||||
public:
 | 
			
		||||
    using Type = T;
 | 
			
		||||
 | 
			
		||||
    /* implicit */ Out(const Out& t) : raw(t.raw) {}
 | 
			
		||||
    /* implicit */ Out(AutoOut<Type>& t) : raw(&t.raw) {}
 | 
			
		||||
    /* implicit */ Out(Type* t) : raw(t) {}
 | 
			
		||||
    Out& operator=(const Out&) = delete;
 | 
			
		||||
 | 
			
		||||
    Type* Get() const {
 | 
			
		||||
        return raw;
 | 
			
		||||
@@ -37,6 +38,10 @@ public:
 | 
			
		||||
        return raw;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator Type*() const {
 | 
			
		||||
        return raw;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    Type* raw;
 | 
			
		||||
};
 | 
			
		||||
@@ -113,8 +118,10 @@ class OutCopyHandle {
 | 
			
		||||
public:
 | 
			
		||||
    using Type = T*;
 | 
			
		||||
 | 
			
		||||
    /* implicit */ OutCopyHandle(const OutCopyHandle& t) : raw(t.raw) {}
 | 
			
		||||
    /* implicit */ OutCopyHandle(AutoOut<Type>& t) : raw(&t.raw) {}
 | 
			
		||||
    /* implicit */ OutCopyHandle(Type* t) : raw(t) {}
 | 
			
		||||
    OutCopyHandle& operator=(const OutCopyHandle&) = delete;
 | 
			
		||||
 | 
			
		||||
    Type* Get() const {
 | 
			
		||||
        return raw;
 | 
			
		||||
@@ -128,6 +135,10 @@ public:
 | 
			
		||||
        return raw;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator Type*() const {
 | 
			
		||||
        return raw;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    Type* raw;
 | 
			
		||||
};
 | 
			
		||||
@@ -137,8 +148,10 @@ class OutMoveHandle {
 | 
			
		||||
public:
 | 
			
		||||
    using Type = T*;
 | 
			
		||||
 | 
			
		||||
    /* implicit */ OutMoveHandle(const OutMoveHandle& t) : raw(t.raw) {}
 | 
			
		||||
    /* implicit */ OutMoveHandle(AutoOut<Type>& t) : raw(&t.raw) {}
 | 
			
		||||
    /* implicit */ OutMoveHandle(Type* t) : raw(t) {}
 | 
			
		||||
    OutMoveHandle& operator=(const OutMoveHandle&) = delete;
 | 
			
		||||
 | 
			
		||||
    Type* Get() const {
 | 
			
		||||
        return raw;
 | 
			
		||||
@@ -152,6 +165,10 @@ public:
 | 
			
		||||
        return raw;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator Type*() const {
 | 
			
		||||
        return raw;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    Type* raw;
 | 
			
		||||
};
 | 
			
		||||
@@ -248,8 +265,10 @@ public:
 | 
			
		||||
    static constexpr BufferAttr Attr = static_cast<BufferAttr>(A | BufferAttr_In | BufferAttr_FixedSize);
 | 
			
		||||
    using Type = T;
 | 
			
		||||
 | 
			
		||||
    /* implicit */ OutLargeData(const OutLargeData& t) : raw(t.raw) {}
 | 
			
		||||
    /* implicit */ OutLargeData(Type* t) : raw(t) {}
 | 
			
		||||
    /* implicit */ OutLargeData(AutoOut<T>& t) : raw(&t.raw) {}
 | 
			
		||||
    OutLargeData& operator=(const OutLargeData&) = delete;
 | 
			
		||||
 | 
			
		||||
    Type* Get() const {
 | 
			
		||||
        return raw;
 | 
			
		||||
@@ -263,6 +282,10 @@ public:
 | 
			
		||||
        return raw;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    operator Type*() const {
 | 
			
		||||
        return raw;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    Type* raw;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user