summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-05-16 07:23:47 +0000
committerflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2008-05-16 07:23:47 +0000
commitcbecc8dd176c8ba833b0aa961805d8f1e3e557f9 (patch)
treed65969c9db4610f541ee369fc65e8e38da45c679
parent9acc75b5a66aefb949946734067758426911687d (diff)
downloadfpc-cbecc8dd176c8ba833b0aa961805d8f1e3e557f9.tar.gz
Merged revisions 10957 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk ........ r10957 | florian | 2008-05-12 14:45:55 +0200 (Mon, 12 May 2008) | 2 lines * compare constant sets correctly while choosing an overloaded procedure, resolves #11288 ........ git-svn-id: http://svn.freepascal.org/svn/fpc/branches/fixes_2_2@10980 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--compiler/htypechk.pas12
-rw-r--r--tests/webtbs/tw11288.pp24
2 files changed, 36 insertions, 0 deletions
diff --git a/compiler/htypechk.pas b/compiler/htypechk.pas
index 091fe73218..dc2b8d2948 100644
--- a/compiler/htypechk.pas
+++ b/compiler/htypechk.pas
@@ -1974,6 +1974,7 @@ implementation
pdoper : tprocdef;
releasecurrpt : boolean;
cdoptions : tcompare_defs_options;
+ n : tnode;
{$ifopt r+}{$define ena_rq}{$q-}{$r-}{$endif}
const
@@ -2137,6 +2138,17 @@ implementation
objdef:=objdef.childof;
end;
end
+ { compare_defs_ext compares sets and array constructors very poorly because
+ it has too little information. So we do explicitly a detailed comparisation,
+ see also bug #11288 (FK)
+ }
+ else if (def_to.typ=setdef) and is_array_constructor(currpt.left.resultdef) then
+ begin
+ n:=currpt.left.getcopy;
+ arrayconstructor_to_set(n);
+ eq:=compare_defs_ext(n.resultdef,def_to,n.nodetype,convtype,pdoper,cdoptions);
+ n.free;
+ end
else
{ generic type comparision }
begin
diff --git a/tests/webtbs/tw11288.pp b/tests/webtbs/tw11288.pp
new file mode 100644
index 0000000000..770afa7ef1
--- /dev/null
+++ b/tests/webtbs/tw11288.pp
@@ -0,0 +1,24 @@
+program project1;
+
+{$mode delphi}
+
+type
+ TEnum1 = (en1, en2);
+ TEnum2 = (en3, en4);
+
+ TSet1 = set of TEnum1;
+ TSet2 = set of TEnum2;
+
+procedure DoSomethingWithSet(ASet: TSet1); overload;
+begin
+
+end;
+
+procedure DoSomethingWithSet(ASet: TSet2); overload;
+begin
+
+end;
+
+begin
+ DoSomethingWithSet([en1]);
+end.