From 0d0469bd058590876afc29c019226ffe198db9aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Fri, 21 Feb 2025 02:17:54 -0300 Subject: [PATCH] don't allow changing out-ness of parameters in virtual overrides --- src/common/objects/dobjtype.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/common/objects/dobjtype.cpp b/src/common/objects/dobjtype.cpp index 0d1bfdf9a8..eac10469a4 100644 --- a/src/common/objects/dobjtype.cpp +++ b/src/common/objects/dobjtype.cpp @@ -672,15 +672,36 @@ bool ShouldAllowGameSpecificVirtual(FName name, unsigned index, PType* arg, PTyp int PClass::FindVirtualIndex(FName name, PFunction::Variant *variant, PFunction *parentfunc, bool exactReturnType, bool ignorePointerReadOnly) { auto proto = variant->Proto; + auto &flags = variant->ArgFlags; for (unsigned i = 0; i < Virtuals.Size(); i++) { if (Virtuals[i]->Name == name) { auto vproto = Virtuals[i]->Proto; - if (vproto->ReturnTypes.Size() != proto->ReturnTypes.Size() || + auto &vflags = Virtuals[i]->ArgFlags; + + int n = flags.size(); + + bool flagsOk = true; + + for(int i = 0; i < n; i++) + { + int argA = i >= vflags.size() ? 0 : vflags[i]; + int argB = i >= flags.size() ? 0 : flags[i]; + + bool AisRef = argA & (VARF_Out | VARF_Ref); + bool BisRef = argB & (VARF_Out | VARF_Ref); + + if(AisRef != BisRef) + { + flagsOk = false; + break; + } + } + + if (!flagsOk || vproto->ReturnTypes.Size() != proto->ReturnTypes.Size() || vproto->ArgumentTypes.Size() < proto->ArgumentTypes.Size()) { - continue; // number of parameters does not match, so it's incompatible } bool fail = false;