From d35d1ed357fb5e80ce27d55ef419fe7a7ffc580e Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 26 Jun 2011 15:02:37 +0000 Subject: [PATCH] + initial support for pascal booleans with sizes 2, 4 and 8 git-svn-id: branches/pasboolxx@17836 - --- compiler/dbgdwarf.pas | 39 ++++++++++++++- compiler/dbgstabs.pas | 10 +++- compiler/defcmp.pas | 11 +++-- compiler/defutil.pas | 7 +-- compiler/htypechk.pas | 3 +- compiler/nadd.pas | 108 ++++++++++++++++++++--------------------- compiler/ncal.pas | 4 +- compiler/ncgrtti.pas | 15 +++--- compiler/ncnv.pas | 8 +-- compiler/nflw.pas | 8 +-- compiler/ninl.pas | 31 +++++++++--- compiler/nmat.pas | 7 ++- compiler/nset.pas | 12 ++--- compiler/pdecsub.pas | 2 +- compiler/pdecvar.pas | 2 +- compiler/pexpr.pas | 4 +- compiler/psystem.pas | 19 +++++--- compiler/ptconst.pas | 5 +- compiler/ptype.pas | 7 +-- compiler/symconst.pas | 3 +- compiler/symdef.pas | 17 +++++-- compiler/x86/cgx86.pas | 2 +- 22 files changed, 203 insertions(+), 121 deletions(-) diff --git a/compiler/dbgdwarf.pas b/compiler/dbgdwarf.pas index 4e617bd203..0b887fca2e 100644 --- a/compiler/dbgdwarf.pas +++ b/compiler/dbgdwarf.pas @@ -1418,8 +1418,7 @@ implementation ]); finish_entry; end; - pasbool, - bool8bit : + pasbool8 : begin append_entry(DW_TAG_base_type,false,[ DW_AT_name,DW_FORM_string,'Boolean'#0, @@ -1428,6 +1427,24 @@ implementation ]); finish_entry; end; + bool8bit : + begin + append_entry(DW_TAG_base_type,false,[ + DW_AT_name,DW_FORM_string,'ByteBool'#0, + DW_AT_encoding,DW_FORM_data1,DW_ATE_boolean, + DW_AT_byte_size,DW_FORM_data1,1 + ]); + finish_entry; + end; + pasbool16 : + begin + append_entry(DW_TAG_base_type,false,[ + DW_AT_name,DW_FORM_string,'Boolean16'#0, + DW_AT_encoding,DW_FORM_data1,DW_ATE_boolean, + DW_AT_byte_size,DW_FORM_data1,2 + ]); + finish_entry; + end; bool16bit : begin append_entry(DW_TAG_base_type,false,[ @@ -1437,6 +1454,15 @@ implementation ]); finish_entry; end; + pasbool32 : + begin + append_entry(DW_TAG_base_type,false,[ + DW_AT_name,DW_FORM_string,'Boolean32'#0, + DW_AT_encoding,DW_FORM_data1,DW_ATE_boolean, + DW_AT_byte_size,DW_FORM_data1,4 + ]); + finish_entry; + end; bool32bit : begin append_entry(DW_TAG_base_type,false,[ @@ -1446,6 +1472,15 @@ implementation ]); finish_entry; end; + pasbool64 : + begin + append_entry(DW_TAG_base_type,false,[ + DW_AT_name,DW_FORM_string,'Boolean64'#0, + DW_AT_encoding,DW_FORM_data1,DW_ATE_boolean, + DW_AT_byte_size,DW_FORM_data1,8 + ]); + finish_entry; + end; bool64bit : begin append_entry(DW_TAG_base_type,false,[ diff --git a/compiler/dbgstabs.pas b/compiler/dbgstabs.pas index 50f0b22404..57cac65b68 100644 --- a/compiler/dbgstabs.pas +++ b/compiler/dbgstabs.pas @@ -624,7 +624,10 @@ implementation case def.ordtype of uvoid : ss:=def_stab_number(def); - pasbool, + pasbool8, + pasbool16, + pasbool32, + pasbool64, bool8bit, bool16bit, bool32bit, @@ -647,13 +650,16 @@ implementation ss:='-20;'; uwidechar : ss:='-30;'; - pasbool, + pasbool8, bool8bit : ss:='-21;'; + pasbool16, bool16bit : ss:='-22;'; + pasbool32, bool32bit : ss:='-23;'; + pasbool64, bool64bit : { no clue if this is correct (FK) } ss:='-23;'; diff --git a/compiler/defcmp.pas b/compiler/defcmp.pas index d0f6821ba8..9dfe90e5ea 100644 --- a/compiler/defcmp.pas +++ b/compiler/defcmp.pas @@ -166,7 +166,8 @@ implementation (bvoid, bint,bint,bint,bint, bint,bint,bint,bint, - bbool,bbool,bbool,bbool,bbool, + bbool,bbool,bbool,bbool, + bbool,bbool,bbool,bbool, bchar,bchar,bint); basedefconvertsimplicit : array[tbasedef,tbasedef] of tconverttype = @@ -241,7 +242,8 @@ implementation end; end; uvoid, - pasbool,bool8bit,bool16bit,bool32bit,bool64bit: + pasbool8,pasbool16,pasbool32,pasbool64, + bool8bit,bool16bit,bool32bit,bool64bit: eq:=te_equal; else internalerror(200210061); @@ -1551,8 +1553,9 @@ implementation u8bit,u16bit,u32bit,u64bit, s8bit,s16bit,s32bit,s64bit : is_subequal:=(torddef(def2).ordtype in [s64bit,u64bit,s32bit,u32bit,u8bit,s8bit,s16bit,u16bit]); - pasbool,bool8bit,bool16bit,bool32bit,bool64bit : - is_subequal:=(torddef(def2).ordtype in [pasbool,bool8bit,bool16bit,bool32bit,bool64bit]); + pasbool8,pasbool16,pasbool32,pasbool64, + bool8bit,bool16bit,bool32bit,bool64bit : + is_subequal:=(torddef(def2).ordtype in [pasbool8,pasbool16,pasbool32,pasbool64,bool8bit,bool16bit,bool32bit,bool64bit]); uchar : is_subequal:=(torddef(def2).ordtype=uchar); uwidechar : diff --git a/compiler/defutil.pas b/compiler/defutil.pas index 1ed4345302..fa0b447624 100644 --- a/compiler/defutil.pas +++ b/compiler/defutil.pas @@ -387,7 +387,8 @@ implementation is_ordinal:=dt in [uchar,uwidechar, u8bit,u16bit,u32bit,u64bit, s8bit,s16bit,s32bit,s64bit, - pasbool,bool8bit,bool16bit,bool32bit,bool64bit]; + pasbool8,pasbool16,pasbool32,pasbool64, + bool8bit,bool16bit,bool32bit,bool64bit]; end; enumdef : is_ordinal:=true; @@ -444,14 +445,14 @@ implementation function is_boolean(def : tdef) : boolean; begin result:=(def.typ=orddef) and - (torddef(def).ordtype in [pasbool,bool8bit,bool16bit,bool32bit,bool64bit]); + (torddef(def).ordtype in [pasbool8,pasbool16,pasbool32,pasbool64,bool8bit,bool16bit,bool32bit,bool64bit]); end; function is_pasbool(def : tdef) : boolean; begin result:=(def.typ=orddef) and - (torddef(def).ordtype = pasbool); + (torddef(def).ordtype in [pasbool8,pasbool16,pasbool32,pasbool64]); end; { true if def is a C-style boolean (non-zero value = true, zero = false) } diff --git a/compiler/htypechk.pas b/compiler/htypechk.pas index b448d50124..b298ac9eab 100644 --- a/compiler/htypechk.pas +++ b/compiler/htypechk.pas @@ -2477,7 +2477,8 @@ implementation variantorddef_cl: array[tordtype] of tvariantequaltype = (tve_incompatible,tve_byte,tve_word,tve_cardinal,tve_chari64, tve_shortint,tve_smallint,tve_longint,tve_chari64, - tve_boolformal,tve_boolformal,tve_boolformal,tve_boolformal,tve_boolformal, + tve_boolformal,tve_boolformal,tve_boolformal,tve_boolformal, + tve_boolformal,tve_boolformal,tve_boolformal,tve_boolformal, tve_chari64,tve_chari64,tve_dblcurrency); { TODO: fixme for 128 bit floats } variantfloatdef_cl: array[tfloattype] of tvariantequaltype = diff --git a/compiler/nadd.pas b/compiler/nadd.pas index f470e1afee..71f2e62c77 100644 --- a/compiler/nadd.pas +++ b/compiler/nadd.pas @@ -334,17 +334,17 @@ implementation else t:=cordconstnode.create(lv and rv,resultdef,true); ltn : - t:=cordconstnode.create(ord(lvrv),booltype,true); + t:=cordconstnode.create(ord(lv>rv),pasbool8type,true); gten : - t:=cordconstnode.create(ord(lv>=rv),booltype,true); + t:=cordconstnode.create(ord(lv>=rv),pasbool8type,true); equaln : - t:=cordconstnode.create(ord(lv=rv),booltype,true); + t:=cordconstnode.create(ord(lv=rv),pasbool8type,true); unequaln : - t:=cordconstnode.create(ord(lv<>rv),booltype,true); + t:=cordconstnode.create(ord(lv<>rv),pasbool8type,true); slashn : begin { int/int becomes a real } @@ -387,30 +387,30 @@ implementation case nodetype of ltn: if lv=high then - t:=Cordconstnode.create(0,booltype,true); + t:=Cordconstnode.create(0,pasbool8type,true); lten: if lv<=low then - t:=Cordconstnode.create(1,booltype,true) + t:=Cordconstnode.create(1,pasbool8type,true) else if lv>high then - t:=Cordconstnode.create(0,booltype,true); + t:=Cordconstnode.create(0,pasbool8type,true); gtn: if lv<=low then - t:=Cordconstnode.create(0,booltype,true) + t:=Cordconstnode.create(0,pasbool8type,true) else if lv>high then - t:=Cordconstnode.create(1,booltype,true); + t:=Cordconstnode.create(1,pasbool8type,true); gten : if lv=high then - t:=Cordconstnode.create(1,booltype,true); + t:=Cordconstnode.create(1,pasbool8type,true); equaln: if (lvhigh) then - t:=Cordconstnode.create(0,booltype,true); + t:=Cordconstnode.create(0,pasbool8type,true); unequaln: if (lvhigh) then - t:=Cordconstnode.create(1,booltype,true); + t:=Cordconstnode.create(1,pasbool8type,true); end; if t<>nil then begin @@ -436,30 +436,30 @@ implementation case nodetype of ltn: if high=rv then - t:=Cordconstnode.create(0,booltype,true); + t:=Cordconstnode.create(0,pasbool8type,true); lten: if high<=rv then - t:=Cordconstnode.create(1,booltype,true) + t:=Cordconstnode.create(1,pasbool8type,true) else if low>rv then - t:=Cordconstnode.create(0,booltype,true); + t:=Cordconstnode.create(0,pasbool8type,true); gtn: if high<=rv then - t:=Cordconstnode.create(0,booltype,true) + t:=Cordconstnode.create(0,pasbool8type,true) else if low>rv then - t:=Cordconstnode.create(1,booltype,true); + t:=Cordconstnode.create(1,pasbool8type,true); gten: if high=rv then - t:=Cordconstnode.create(1,booltype,true); + t:=Cordconstnode.create(1,pasbool8type,true); equaln: if (rvhigh) then - t:=Cordconstnode.create(0,booltype,true); + t:=Cordconstnode.create(0,pasbool8type,true); unequaln: if (rvhigh) then - t:=Cordconstnode.create(1,booltype,true); + t:=Cordconstnode.create(1,pasbool8type,true); end; if t<>nil then begin @@ -563,17 +563,17 @@ implementation slashn : t:=crealconstnode.create(lvd/rvd,resultrealdef); ltn : - t:=cordconstnode.create(ord(lvdrvd),booltype,true); + t:=cordconstnode.create(ord(lvd>rvd),pasbool8type,true); gten : - t:=cordconstnode.create(ord(lvd>=rvd),booltype,true); + t:=cordconstnode.create(ord(lvd>=rvd),pasbool8type,true); equaln : - t:=cordconstnode.create(ord(lvd=rvd),booltype,true); + t:=cordconstnode.create(ord(lvd=rvd),pasbool8type,true); unequaln : - t:=cordconstnode.create(ord(lvd<>rvd),booltype,true); + t:=cordconstnode.create(ord(lvd<>rvd),pasbool8type,true); else internalerror(2008022102); end; @@ -602,17 +602,17 @@ implementation t:=cstringconstnode.createwstr(ws1); end; ltn : - t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<0),booltype,true); + t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<0),pasbool8type,true); lten : - t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<=0),booltype,true); + t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<=0),pasbool8type,true); gtn : - t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)>0),booltype,true); + t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)>0),pasbool8type,true); gten : - t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)>=0),booltype,true); + t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)>=0),pasbool8type,true); equaln : - t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)=0),booltype,true); + t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)=0),pasbool8type,true); unequaln : - t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<>0),booltype,true); + t:=cordconstnode.create(byte(comparewidestrings(ws1,ws2)<>0),pasbool8type,true); else internalerror(2008022103); end; @@ -676,17 +676,17 @@ implementation tstringconstnode(t).changestringtype(resultdef); end; ltn : - t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<0),booltype,true); + t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<0),pasbool8type,true); lten : - t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<=0),booltype,true); + t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<=0),pasbool8type,true); gtn : - t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)>0),booltype,true); + t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)>0),pasbool8type,true); gten : - t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)>=0),booltype,true); + t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)>=0),pasbool8type,true); equaln : - t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)=0),booltype,true); + t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)=0),pasbool8type,true); unequaln : - t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<>0),booltype,true); + t:=cordconstnode.create(byte(compareansistrings(s1,s2,l1,l2)<>0),pasbool8type,true); else internalerror(2008022104); end; @@ -724,22 +724,22 @@ implementation unequaln : begin b:=tsetconstnode(right).value_set^ <> tsetconstnode(left).value_set^; - t:=cordconstnode.create(byte(b),booltype,true); + t:=cordconstnode.create(byte(b),pasbool8type,true); end; equaln : begin b:=tsetconstnode(right).value_set^ = tsetconstnode(left).value_set^; - t:=cordconstnode.create(byte(b),booltype,true); + t:=cordconstnode.create(byte(b),pasbool8type,true); end; lten : begin b:=tsetconstnode(left).value_set^ <= tsetconstnode(right).value_set^; - t:=cordconstnode.create(byte(b),booltype,true); + t:=cordconstnode.create(byte(b),pasbool8type,true); end; gten : begin b:=tsetconstnode(left).value_set^ >= tsetconstnode(right).value_set^; - t:=cordconstnode.create(byte(b),booltype,true); + t:=cordconstnode.create(byte(b),pasbool8type,true); end; else internalerror(2008022105); @@ -1027,12 +1027,12 @@ implementation begin if not is_boolean(ld) then begin - inserttypeconv(left,booltype); + inserttypeconv(left,pasbool8type); ld := left.resultdef; end; if not is_boolean(rd) then begin - inserttypeconv(right,booltype); + inserttypeconv(right,pasbool8type); rd := right.resultdef; end; end; @@ -1857,7 +1857,7 @@ implementation begin case nodetype of ltn,lten,gtn,gten,equaln,unequaln : - resultdef:=booltype; + resultdef:=pasbool8type; slashn : resultdef:=resultrealdef; addn: @@ -2327,7 +2327,7 @@ implementation { otherwise, create the parameters for the helper } right := ccallparanode.create( - cordconstnode.create(ord(cs_check_overflow in current_settings.localswitches),booltype,true), + cordconstnode.create(ord(cs_check_overflow in current_settings.localswitches),pasbool8type,true), ccallparanode.create(right,ccallparanode.create(left,nil))); left := nil; { only qword needs the unsigned code, the @@ -2457,7 +2457,7 @@ implementation if not(target_info.system in systems_wince) then begin if nodetype in [ltn,lten,gtn,gten,equaln,unequaln] then - resultdef:=booltype; + resultdef:=pasbool8type; result:=ctypeconvnode.create_internal(ccallnode.createintern(procname,ccallparanode.create( ctypeconvnode.create_internal(right,fdef), ccallparanode.create( @@ -2618,7 +2618,7 @@ implementation internalerror(2011022301); end; result := ccallnode.createintern(procname, - ccallparanode.create(cordconstnode.create(0,booltype,false), + ccallparanode.create(cordconstnode.create(0,pasbool8type,false), ccallparanode.create(right, ccallparanode.create(left,nil)))); left := nil; diff --git a/compiler/ncal.pas b/compiler/ncal.pas index ee895f39d7..299d7287f1 100644 --- a/compiler/ncal.pas +++ b/compiler/ncal.pas @@ -2340,12 +2340,12 @@ implementation else if vo_is_range_check in para.parasym.varoptions then begin - para.left:=cordconstnode.create(Ord(cs_check_range in current_settings.localswitches),booltype,false); + para.left:=cordconstnode.create(Ord(cs_check_range in current_settings.localswitches),pasbool8type,false); end else if vo_is_overflow_check in para.parasym.varoptions then begin - para.left:=cordconstnode.create(Ord(cs_check_overflow in current_settings.localswitches),booltype,false); + para.left:=cordconstnode.create(Ord(cs_check_overflow in current_settings.localswitches),pasbool8type,false); end else if vo_is_msgsel in para.parasym.varoptions then diff --git a/compiler/ncgrtti.pas b/compiler/ncgrtti.pas index 990a3d0b26..9301cbd63e 100644 --- a/compiler/ncgrtti.pas +++ b/compiler/ncgrtti.pas @@ -452,7 +452,7 @@ implementation end; { we need to align by Tconstptruint here to satisfy the alignment rules set by records: in the typinfo unit we overlay a TTypeData record on this data, which at - the innermost variant record needs an alignment of TConstPtrUint due to e.g. + the innermost variant record needs an alignment of TConstPtrUint due to e.g. the "CompType" member for tkSet (also the "BaseType" member for tkEnumeration). We need to adhere to this, otherwise things will break. Note that other code (e.g. enumdef_rtti_calcstringtablestart()) relies on the @@ -490,7 +490,8 @@ implementation (otUByte{otNone}, otUByte,otUWord,otULong,otUByte{otNone}, otSByte,otSWord,otSLong,otUByte{otNone}, - otUByte,otSByte,otSWord,otSLong,otSByte, + otUByte,otUWord,otULong,otUByte, + otSByte,otSWord,otSLong,otSByte, otUByte,otUWord,otUByte); begin write_header(def,typekind); @@ -523,7 +524,7 @@ implementation { high } current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_64bit(def.high.svalue)); end; - pasbool: + pasbool8: dointeger(tkBool); uchar: dointeger(tkChar); @@ -698,18 +699,18 @@ implementation potype_class_constructor: methodkind:=mkClassConstructor; potype_class_destructor: methodkind:=mkClassDestructor; potype_operator: methodkind:=mkOperatorOverload; - potype_procedure: - if po_classmethod in def.procoptions then + potype_procedure: + if po_classmethod in def.procoptions then methodkind:=mkClassProcedure else methodkind:=mkProcedure; potype_function: - if po_classmethod in def.procoptions then + if po_classmethod in def.procoptions then methodkind:=mkClassFunction else methodkind:=mkFunction; else - begin + begin if def.returndef = voidtype then methodkind:=mkProcedure else diff --git a/compiler/ncnv.pas b/compiler/ncnv.pas index df1657b5d3..ab262e1c02 100644 --- a/compiler/ncnv.pas +++ b/compiler/ncnv.pas @@ -913,7 +913,7 @@ implementation addstatement(newstat,restemp); addstatement(newstat,ccallnode.createintern('fpc_'+chartype+'array_to_shortstr', ccallparanode.create(cordconstnode.create( - ord(tarraydef(left.resultdef).lowrange=0),booltype,false), + ord(tarraydef(left.resultdef).lowrange=0),pasbool8type,false), ccallparanode.create(left,ccallparanode.create( ctemprefnode.create(restemp),nil))))); addstatement(newstat,ctempdeletenode.create_normal_temp(restemp)); @@ -924,7 +924,7 @@ implementation result:=ccallnode.createinternres( 'fpc_'+chartype+'array_to_'+tstringdef(resultdef).stringtypname, ccallparanode.create(cordconstnode.create( - ord(tarraydef(left.resultdef).lowrange=0),booltype,false), + ord(tarraydef(left.resultdef).lowrange=0),pasbool8type,false), ccallparanode.create(left,nil)),resultdef); left:=nil; end; @@ -3347,7 +3347,7 @@ implementation CGMessage1(type_e_class_or_cominterface_type_expected,left.resultdef.typename); case nodetype of isn: - resultdef:=booltype; + resultdef:=pasbool8type; asn: resultdef:=tclassrefdef(right.resultdef).pointeddef; end; @@ -3361,7 +3361,7 @@ implementation case nodetype of isn: - resultdef:=booltype; + resultdef:=pasbool8type; asn: resultdef:=right.resultdef; end; diff --git a/compiler/nflw.pas b/compiler/nflw.pas index 7a1b5757fb..cb47d59a65 100644 --- a/compiler/nflw.pas +++ b/compiler/nflw.pas @@ -457,7 +457,7 @@ implementation one } hp:=cwhilerepeatnode.create( { repeat .. until false } - cordconstnode.create(0,booltype,false),innerloop,false,true); + cordconstnode.create(0,pasbool8type,false),innerloop,false,true); addstatement(outerloopbodystatement,hp); { create the outer repeat/until and add it to the the main body } @@ -1074,7 +1074,7 @@ implementation not(is_typeparam(left.resultdef)) then begin if left.resultdef.typ=variantdef then - inserttypeconv(left,booltype) + inserttypeconv(left,pasbool8type) else CGMessage1(type_e_boolean_expr_expected,left.resultdef.typename); end; @@ -1311,7 +1311,7 @@ implementation end; if not is_constboolnode(condition) then aktstate.store_fact(condition, - cordconstnode.create(byte(checknegate),booltype,true)) + cordconstnode.create(byte(checknegate),pasbool8type,true)) else condition.destroy; end; @@ -1387,7 +1387,7 @@ implementation not(is_typeparam(left.resultdef)) then begin if left.resultdef.typ=variantdef then - inserttypeconv(left,booltype) + inserttypeconv(left,pasbool8type) else Message1(type_e_boolean_expr_expected,left.resultdef.typename); end; diff --git a/compiler/ninl.pas b/compiler/ninl.pas index 852a83c8be..431b12f4ad 100644 --- a/compiler/ninl.pas +++ b/compiler/ninl.pas @@ -314,7 +314,8 @@ implementation scurrency, s64bit: procname := procname + 'int64'; - pasbool,bool8bit,bool16bit,bool32bit,bool64bit: + pasbool8,pasbool16,pasbool32,pasbool64, + bool8bit,bool16bit,bool32bit,bool64bit: procname := procname + 'bool'; {$endif} else @@ -511,7 +512,10 @@ implementation readfunctype:=s64currencytype; is_real:=true; end; - pasbool, + pasbool8, + pasbool16, + pasbool32, + pasbool64, bool8bit, bool16bit, bool32bit, @@ -524,7 +528,7 @@ implementation else begin name := procprefixes[do_read]+'boolean'; - readfunctype:=booltype; + readfunctype:=pasbool8type; end else begin @@ -746,7 +750,7 @@ implementation { zero-based } if para.left.resultdef.typ=arraydef then para := ccallparanode.create(cordconstnode.create( - ord(tarraydef(para.left.resultdef).lowrange=0),booltype,false),para); + ord(tarraydef(para.left.resultdef).lowrange=0),pasbool8type,false),para); { create the call statement } addstatement(Tstatementnode(newstatement), ccallnode.createintern(name,para)); @@ -1635,7 +1639,7 @@ implementation else hp:=create_simplified_ord_const(sqr(vl.uvalue),resultdef,forinline); in_const_odd : - hp:=cordconstnode.create(qword(odd(int64(vl))),booltype,true); + hp:=cordconstnode.create(qword(odd(int64(vl))),pasbool8type,true); in_const_swap_word : hp:=cordconstnode.create((vl and $ff) shl 8+(vl shr 8),left.resultdef,true); in_const_swap_long : @@ -1691,19 +1695,32 @@ implementation orddef : begin case torddef(left.resultdef).ordtype of - pasbool, + pasbool8, uchar: begin { change to byte() } result:=ctypeconvnode.create_internal(left,u8inttype); left:=nil; end; + pasbool16, uwidechar : begin { change to word() } result:=ctypeconvnode.create_internal(left,u16inttype); left:=nil; end; + pasbool32 : + begin + { change to dword() } + result:=ctypeconvnode.create_internal(left,u32inttype); + left:=nil; + end; + pasbool64 : + begin + { change to qword() } + result:=ctypeconvnode.create_internal(left,u64inttype); + left:=nil; + end; bool8bit: begin { change to shortint() } @@ -2357,7 +2374,7 @@ implementation in procvar handling between FPC and Delphi handling, so handle specially } set_varstate(tcallparanode(left).left,vs_read,[vsf_must_be_valid]); - resultdef:=booltype; + resultdef:=pasbool8type; end; in_ofs_x : diff --git a/compiler/nmat.pas b/compiler/nmat.pas index 13efe91991..3efd33e482 100644 --- a/compiler/nmat.pas +++ b/compiler/nmat.pas @@ -884,14 +884,17 @@ implementation v:=tordconstnode(left).value; def:=left.resultdef; case torddef(left.resultdef).ordtype of - pasbool, + pasbool8, + pasbool16, + pasbool32, + pasbool64, bool8bit, bool16bit, bool32bit, bool64bit: begin v:=byte(not(boolean(int64(v)))); - if (torddef(left.resultdef).ordtype<>pasbool) then + if is_cbool(left.resultdef) then v:=-v; end; uchar, diff --git a/compiler/nset.pas b/compiler/nset.pas index 13d8f05960..acc1871968 100644 --- a/compiler/nset.pas +++ b/compiler/nset.pas @@ -213,7 +213,7 @@ implementation begin result:=nil; - resultdef:=booltype; + resultdef:=pasbool8type; typecheckpass(right); set_varstate(right,vs_read,[vsf_must_be_valid]); if codegenerror then @@ -256,7 +256,7 @@ implementation } if ( (left.resultdef.typ = orddef) and not - (torddef(left.resultdef).ordtype in [s8bit,u8bit,uchar,pasbool,bool8bit]) + (torddef(left.resultdef).ordtype in [s8bit,u8bit,uchar,pasbool8,bool8bit]) ) or ( @@ -294,7 +294,7 @@ implementation ((right.nodetype = setconstn) and (tnormalset(tsetconstnode(right).value_set^) = [])) then begin - t:=cordconstnode.create(0,booltype,false); + t:=cordconstnode.create(0,pasbool8type,false); typecheckpass(t); result:=t; exit; @@ -321,10 +321,10 @@ implementation { into account } if Tordconstnode(left).value.signed then t:=cordconstnode.create(byte(tordconstnode(left).value.svalue in Tsetconstnode(right).value_set^), - booltype,true) + pasbool8type,true) else t:=cordconstnode.create(byte(tordconstnode(left).value.uvalue in Tsetconstnode(right).value_set^), - booltype,true); + pasbool8type,true); typecheckpass(t); result:=t; exit; @@ -334,7 +334,7 @@ implementation if (Tordconstnode(left).valueint64(Tsetdef(right.resultdef).setmax)) then begin - t:=cordconstnode.create(0, booltype, true); + t:=cordconstnode.create(0, pasbool8type, true); typecheckpass(t); result:=t; exit; diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index d16034740d..61ec0091fc 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -1468,7 +1468,7 @@ implementation end; if (optoken in [_EQ,_NE,_GT,_LT,_GTE,_LTE,_OP_IN]) and ((pd.returndef.typ<>orddef) or - (torddef(pd.returndef).ordtype<>pasbool)) then + (torddef(pd.returndef).ordtype<>pasbool8)) then Message(parser_e_comparative_operator_return_boolean); if (optoken in [_ASSIGNMENT,_OP_EXPLICIT]) and equal_defs(pd.returndef,tparavarsym(pd.parast.SymList[0]).vardef) and diff --git a/compiler/pdecvar.pas b/compiler/pdecvar.pas index 8de78aade4..ca74751f3f 100644 --- a/compiler/pdecvar.pas +++ b/compiler/pdecvar.pas @@ -674,7 +674,7 @@ implementation storedprocdef:=tprocvardef.create(normal_function_level); include(storedprocdef.procoptions,po_methodpointer); { Return type must be boolean } - storedprocdef.returndef:=booltype; + storedprocdef.returndef:=pasbool8type; { Add index parameter if needed } if ppo_indexed in p.propoptions then begin diff --git a/compiler/pexpr.pas b/compiler/pexpr.pas index c1190a7abe..a00c5b352e 100644 --- a/compiler/pexpr.pas +++ b/compiler/pexpr.pas @@ -2745,13 +2745,13 @@ implementation _TRUE : begin consume(_TRUE); - p1:=cordconstnode.create(1,booltype,false); + p1:=cordconstnode.create(1,pasbool8type,false); end; _FALSE : begin consume(_FALSE); - p1:=cordconstnode.create(0,booltype,false); + p1:=cordconstnode.create(0,pasbool8type,false); end; _NIL : diff --git a/compiler/psystem.pas b/compiler/psystem.pas index 83de85fac5..aaff48d7ad 100644 --- a/compiler/psystem.pas +++ b/compiler/psystem.pas @@ -154,7 +154,10 @@ implementation s32inttype:=torddef.create(s32bit,int64(low(longint)),int64(high(longint))); u64inttype:=torddef.create(u64bit,low(qword),high(qword)); s64inttype:=torddef.create(s64bit,low(int64),high(int64)); - booltype:=torddef.create(pasbool,0,1); + pasbool8type:=torddef.create(pasbool8,0,1); + pasbool16type:=torddef.create(pasbool16,0,1); + pasbool32type:=torddef.create(pasbool32,0,1); + pasbool64type:=torddef.create(pasbool64,0,1); bool8type:=torddef.create(bool8bit,low(int64),high(int64)); bool16type:=torddef.create(bool16bit,low(int64),high(int64)); bool32type:=torddef.create(bool32bit,low(int64),high(int64)); @@ -293,7 +296,7 @@ implementation addtype('UnicodeString',cunicodestringtype); addtype('OpenString',openshortstringtype); - addtype('Boolean',booltype); + addtype('Boolean',pasbool8type); addtype('ByteBool',bool8type); addtype('WordBool',bool16type); addtype('LongBool',bool32type); @@ -333,7 +336,7 @@ implementation addtype('$widestring',cwidestringtype); addtype('$unicodestring',cunicodestringtype); addtype('$openshortstring',openshortstringtype); - addtype('$boolean',booltype); + addtype('$boolean',pasbool8type); addtype('$boolean8',bool8type); addtype('$boolean16',bool16type); addtype('$boolean32',bool32type); @@ -438,11 +441,11 @@ implementation loadtype('sc80real',sc80floattype); end; loadtype('s64currency',s64currencytype); - loadtype('boolean',booltype); - loadtype('boolean8',bool8type); - loadtype('boolean16',bool16type); - loadtype('boolean32',bool32type); - loadtype('boolean64',bool64type); + loadtype('boolean',pasbool8type); + loadtype('boolean8',pasbool8type); + loadtype('boolean16',pasbool16type); + loadtype('boolean32',pasbool32type); + loadtype('boolean64',pasbool64type); loadtype('void_pointer',voidpointertype); loadtype('char_pointer',charpointertype); loadtype('widechar_pointer',widecharpointertype); diff --git a/compiler/ptconst.pas b/compiler/ptconst.pas index fc1ec32e83..ea1fb20e43 100644 --- a/compiler/ptconst.pas +++ b/compiler/ptconst.pas @@ -196,7 +196,7 @@ implementation if is_cbool(def) then inserttypeconv(n,def); case def.ordtype of - pasbool, + pasbool8, bool8bit : begin if is_constboolnode(n) then @@ -204,6 +204,7 @@ implementation else do_error; end; + pasbool16, bool16bit : begin if is_constboolnode(n) then @@ -211,6 +212,7 @@ implementation else do_error; end; + pasbool32, bool32bit : begin if is_constboolnode(n) then @@ -218,6 +220,7 @@ implementation else do_error; end; + pasbool64, bool64bit : begin if is_constboolnode(n) then diff --git a/compiler/ptype.pas b/compiler/ptype.pas index ef810d3d3e..6f0e5d7372 100644 --- a/compiler/ptype.pas +++ b/compiler/ptype.pas @@ -685,7 +685,7 @@ implementation member_blocktype:=bt_type; { local and anonymous records can not have inner types. skip top record symtable } - if (current_structdef.objname^='') or + if (current_structdef.objname^='') or not(symtablestack.stack^.next^.symtable.symtabletype in [globalsymtable,staticsymtable,objectsymtable,recordsymtable]) then Message(parser_e_no_types_in_local_anonymous_records); end; @@ -1052,7 +1052,7 @@ implementation def:=torddef.create(uchar,lv,hv) else if is_boolean(pt1.resultdef) then - def:=torddef.create(pasbool,lv,hv) + def:=torddef.create(pasbool8,lv,hv) else if is_signed(pt1.resultdef) then def:=torddef.create(range_to_basetype(lv,hv),lv,hv) else @@ -1172,7 +1172,8 @@ implementation {$ifdef cpu64bitaddr} u32bit,s64bit, {$endif cpu64bitaddr} - pasbool,bool8bit,bool16bit,bool32bit,bool64bit, + pasbool8,pasbool16,pasbool32,pasbool64, + bool8bit,bool16bit,bool32bit,bool64bit, uwidechar] then begin lowval:=torddef(def).low; diff --git a/compiler/symconst.pas b/compiler/symconst.pas index 48674a7f58..dc2ef05303 100644 --- a/compiler/symconst.pas +++ b/compiler/symconst.pas @@ -210,7 +210,8 @@ type uvoid, u8bit,u16bit,u32bit,u64bit, s8bit,s16bit,s32bit,s64bit, - pasbool,bool8bit,bool16bit,bool32bit,bool64bit, + pasbool8,pasbool16,pasbool32,pasbool64, + bool8bit,bool16bit,bool32bit,bool64bit, uchar,uwidechar,scurrency ); diff --git a/compiler/symdef.pas b/compiler/symdef.pas index 07bfae013c..e0b1661056 100644 --- a/compiler/symdef.pas +++ b/compiler/symdef.pas @@ -677,7 +677,10 @@ interface voidtype, { Void (procedure) } cchartype, { Char } cwidechartype, { WideChar } - booltype, { boolean type } + pasbool8type, { boolean type } + pasbool16type, + pasbool32type, + pasbool64type, bool8type, bool16type, bool32type, @@ -1766,7 +1769,8 @@ implementation 0, 1,2,4,8, 1,2,4,8, - 1,1,2,4,8, + 1,2,4,8, + 1,2,4,8, 1,2,8 ); begin @@ -1815,7 +1819,8 @@ implementation varUndefined, varbyte,varword,varlongword,varqword, varshortint,varsmallint,varinteger,varint64, - varboolean,varboolean,varboolean,varUndefined,varUndefined, + varboolean,varboolean,varboolean,varboolean, + varboolean,varboolean,varUndefined,varUndefined, varUndefined,varUndefined,varCurrency); begin result:=basetype2vardef[ordtype]; @@ -1844,7 +1849,8 @@ implementation 'untyped', 'Byte','Word','DWord','QWord', 'ShortInt','SmallInt','LongInt','Int64', - 'Boolean','ByteBool','WordBool','LongBool','QWordBool', + 'Boolean','Boolean16','Boolean32','Boolean64', + 'ByteBool','WordBool','LongBool','QWordBool', 'Char','WideChar','Currency'); begin @@ -3929,7 +3935,8 @@ implementation 'v', 'h','t','j','y', 'a','s','i','x', - 'b','b','b','b','b', + 'b','b','b','b', + 'b','b','b','b', 'c','w','x'); floattype2str : array[tfloattype] of string[1] = ( diff --git a/compiler/x86/cgx86.pas b/compiler/x86/cgx86.pas index 0c1718575f..06457ce78e 100644 --- a/compiler/x86/cgx86.pas +++ b/compiler/x86/cgx86.pas @@ -2208,7 +2208,7 @@ unit cgx86; current_asmdata.getjumplabel(hl); if not ((def.typ=pointerdef) or ((def.typ=orddef) and - (torddef(def).ordtype in [u64bit,u16bit,u32bit,u8bit,uchar,pasbool]))) then + (torddef(def).ordtype in [u64bit,u16bit,u32bit,u8bit,uchar,pasbool8,pasbool16,pasbool32,pasbool64]))) then cond:=C_NO else cond:=C_NB;