diff --git a/.gitattributes b/.gitattributes index 4bcfd43c6a..3e7dbadd89 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10213,6 +10213,7 @@ tests/tbs/tb0602.pp svneol=native#text/plain tests/tbs/tb0603.pp svneol=native#text/pascal tests/tbs/tb0604.pp svneol=native#text/pascal tests/tbs/tb0605.pp svneol=native#text/pascal +tests/tbs/tb0606.pp svneol=native#text/pascal tests/tbs/tb205.pp svneol=native#text/plain tests/tbs/tbs0594.pp svneol=native#text/pascal tests/tbs/ub0060.pp svneol=native#text/plain @@ -13900,6 +13901,7 @@ tests/webtbs/tw25551.pp svneol=native#text/plain tests/webtbs/tw25598.pp svneol=native#text/plain tests/webtbs/tw25600.pp svneol=native#text/pascal tests/webtbs/tw25603.pp svneol=native#text/pascal +tests/webtbs/tw25604.pp svneol=native#text/pascal tests/webtbs/tw25605.pp svneol=native#text/pascal tests/webtbs/tw2561.pp svneol=native#text/plain tests/webtbs/tw25610.pp -text svneol=native#text/plain diff --git a/compiler/nmat.pas b/compiler/nmat.pas index e9a1d37855..4af8ff48da 100644 --- a/compiler/nmat.pas +++ b/compiler/nmat.pas @@ -197,6 +197,14 @@ implementation result:=nil; typecheckpass(left); typecheckpass(right); + + { avoid any problems with type parameters later on } + if is_typeparam(left.resultdef) or is_typeparam(right.resultdef) then + begin + resultdef:=cundefinedtype; + exit; + end; + set_varstate(left,vs_read,[vsf_must_be_valid]); set_varstate(right,vs_read,[vsf_must_be_valid]); if codegenerror then @@ -644,6 +652,14 @@ implementation result:=nil; typecheckpass(left); typecheckpass(right); + + { avoid any problems with type parameters later on } + if is_typeparam(left.resultdef) or is_typeparam(right.resultdef) then + begin + resultdef:=cundefinedtype; + exit; + end; + set_varstate(right,vs_read,[vsf_must_be_valid]); set_varstate(left,vs_read,[vsf_must_be_valid]); if codegenerror then @@ -818,6 +834,14 @@ implementation begin result:=nil; typecheckpass(left); + + { avoid any problems with type parameters later on } + if is_typeparam(left.resultdef) then + begin + resultdef:=cundefinedtype; + exit; + end; + set_varstate(left,vs_read,[vsf_must_be_valid]); if codegenerror then exit; @@ -968,6 +992,14 @@ implementation begin result:=nil; typecheckpass(left); + + { avoid any problems with type parameters later on } + if is_typeparam(left.resultdef) then + begin + resultdef:=cundefinedtype; + exit; + end; + set_varstate(left,vs_read,[vsf_must_be_valid]); if codegenerror then exit; @@ -1144,6 +1176,14 @@ implementation begin result:=nil; typecheckpass(left); + + { avoid any problems with type parameters later on } + if is_typeparam(left.resultdef) then + begin + resultdef:=cundefinedtype; + exit; + end; + set_varstate(left,vs_read,[vsf_must_be_valid]); if codegenerror then exit; diff --git a/tests/tbs/tb0606.pp b/tests/tbs/tb0606.pp new file mode 100644 index 0000000000..b8bd24c34e --- /dev/null +++ b/tests/tbs/tb0606.pp @@ -0,0 +1,32 @@ +{ %NORUN } + +program tb0606; + +{$mode delphi} + +type + TTest = class + procedure Test; + end; + +procedure TTest.Test; +var + r: T; + i: LongInt; +begin + r := i div r; + r := r div i; + r := i mod r; + r := r mod i; + r := i shl r; + r := r shl i; + r := i shr r; + r := r shr i; + r := - r; + r := not r; + r := + r; +end; + +begin + +end. diff --git a/tests/webtbs/tw25604.pp b/tests/webtbs/tw25604.pp new file mode 100644 index 0000000000..b117977b32 --- /dev/null +++ b/tests/webtbs/tw25604.pp @@ -0,0 +1,24 @@ +{ %NORUN } + +program tw25604; + +{$MODE DELPHI} + +type + TA = class + private + F1, F2: T; + procedure Foo; + end; + +procedure TA.Foo; +var + b: Integer; +begin + b := (b and F1) shr F2; // pass + b := (b and not F1) or (b shl F2); // Error: Operator is not overloaded: "LongInt" shl "" +end; + +begin +end. +