diff --git a/TestSuite/patterns-extended-is-generic.pas b/TestSuite/patterns-extended-is-generic.pas new file mode 100644 index 000000000..e5ef3ac65 --- /dev/null +++ b/TestSuite/patterns-extended-is-generic.pas @@ -0,0 +1,14 @@ +type + t1 = class end; + +procedure p1(l: List); +where T: t1; +begin + l.RemoveAll(o->(o is T(var a))); +end; + +begin + var l := Lst(new t1, nil); + p1&(l); + assert(l[0] = nil); +end. \ No newline at end of file diff --git a/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs b/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs index 01d309297..99dc7da6f 100644 --- a/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs +++ b/TreeConverter/TreeConversion/SyntaxTreeVisitorNodes/Patterns.cs @@ -126,7 +126,9 @@ namespace PascalABCCompiler.TreeConverter if (genericDeduceNeeded && (candidateParameter.is_generic_parameter || candidateParameter.is_generic_type_instance)) candidateParameter = InstantiateParameter(candidateParameter, deducedGenerics); - if (givenParameter != null && !AreTheSameType(candidateParameter, givenParameter)) + if (givenParameter != null && !AreTheSameType(candidateParameter, givenParameter) + && !(candidateParameter != null && givenParameter != null && candidateParameter.is_generic_parameter + && givenParameter.is_generic_parameter && candidateParameter.name == givenParameter.name && givenParameter.base_type == candidateParameter.base_type)) return false; parameterTypes[i] = candidateParameter;