From 527935f371415eab4994e9f8ad7f8f68c2dee243 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Wed, 15 Jun 2022 11:40:11 -0700 Subject: [PATCH] Removed assumption of `class` on delegate constraint --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 2 +- IDEHelper/Tests/src/Generics2.bf | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 68ad26a4..aad9e58e 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -515,7 +515,7 @@ bool BfModule::AreConstraintsSubset(BfGenericParamInstance* checkInner, BfGeneri outerFlags = (BfGenericParamFlags)(outerFlags | BfGenericParamFlag_Struct); else if (checkOuter->mTypeConstraint->IsStructOrStructPtr()) outerFlags = (BfGenericParamFlags)(outerFlags | BfGenericParamFlag_StructPtr); - else if (checkOuter->mTypeConstraint->IsObject()) + else if ((checkOuter->mTypeConstraint->IsObject()) && (!checkOuter->mTypeConstraint->IsDelegate())) outerFlags = (BfGenericParamFlags)(outerFlags | BfGenericParamFlag_Class); else if (checkOuter->mTypeConstraint->IsEnum()) outerFlags = (BfGenericParamFlags)(outerFlags | BfGenericParamFlag_Enum | BfGenericParamFlag_Struct); diff --git a/IDEHelper/Tests/src/Generics2.bf b/IDEHelper/Tests/src/Generics2.bf index 22c7694f..93eb8ee9 100644 --- a/IDEHelper/Tests/src/Generics2.bf +++ b/IDEHelper/Tests/src/Generics2.bf @@ -178,6 +178,23 @@ namespace Tests Runtime.FatalError(); } + public static int TestOverload(TProc proc) + where TProc : class, delegate void() + { + return 1; + } + + public static int TestOverload(TProc proc) + where TProc : delegate void() + { + return 2; + } + + public static int TestOverload2(function void() proc) + { + return 3; + } + [Test] public static void TestBasics() { @@ -204,6 +221,13 @@ namespace Tests Test.Assert(gci.test == 2); Test.Assert(GenClassMethodC(gci) == 3); Test.Assert(gci.test == 3); + + delegate void() dlg = scope () => {}; + function void() func = () => {}; + Test.Assert(TestOverload(dlg) == 1); + Test.Assert(TestOverload(() => {}) == 2); + Test.Assert(TestOverload(func) == 2); + Test.Assert(TestOverload2(func) == 3); } } }