* when looking for overloaded conversion (assignment) operators, only ignore

those for variants. All defined operators are guaranteed to be valid by
    the code that checks them when they are defined (mantis #17846)

git-svn-id: trunk@16449 -
This commit is contained in:
Jonas Maebe 2010-11-26 15:37:31 +00:00
parent fa0454afe2
commit edfb31c020
3 changed files with 50 additions and 2 deletions

1
.gitattributes vendored
View File

@ -10749,6 +10749,7 @@ tests/webtbs/tw17715.pp svneol=native#text/plain
tests/webtbs/tw1779.pp svneol=native#text/plain
tests/webtbs/tw1780.pp svneol=native#text/plain
tests/webtbs/tw17836.pp svneol=native#text/plain
tests/webtbs/tw17846.pp svneol=native#text/plain
tests/webtbs/tw17862.pp svneol=native#text/plain
tests/webtbs/tw17907/main/main.pas svneol=native#text/plain
tests/webtbs/tw17907/test.bat svneol=native#text/plain

View File

@ -1476,8 +1476,7 @@ implementation
{ Check for operators? }
(
(cdo_check_operator in cdoptions) and
((def_from.typ in [objectdef,recorddef,arraydef,stringdef]) or
(def_to.typ in [objectdef,recorddef,arraydef,stringdef]))
((def_from.typ<>variantdef) or (def_to.typ<>variantdef))
)
) then
begin

48
tests/webtbs/tw17846.pp Normal file
View File

@ -0,0 +1,48 @@
program opoverload;
{$mode objfpc}
const
IntValue1 = $1;
IntValue2 = $2;
IntValue3 = $4;
type
TMyEnum = (Value1, Value2, Value3);
TMySet = set of TMyEnum;
operator := (aRight: LongWord) aLeft: TMySet;
begin
aLeft := [];
if aRight and IntValue1 <> 0 then
Include(aLeft, Value1);
if aRight and IntValue2 <> 0 then
Include(aLeft, Value2);
if aRight and IntValue3 <> 0 then
Include(aLeft, Value3);
end;
operator := (aRight: TMySet) aLeft: LongWord;
begin
aLeft := 0;
if Value1 in aRight then
aLeft := aLeft or IntValue1;
if Value2 in aRight then
aLeft := aLeft or IntValue2;
if Value3 in aRight then
aLeft := aLeft or IntValue3;
end;
var
i: LongWord;
t: TMySet;
begin
i := IntValue1 or IntValue3;
t := i;
if t<>[value1,value3] then
halt(1);
i:=0;
i:=t;
if i<>(IntValue1 or IntValue3) then
halt(2);
end.