diff --git a/compiler/defcmp.pas b/compiler/defcmp.pas index 1d96b6c533..ae790403f3 100644 --- a/compiler/defcmp.pas +++ b/compiler/defcmp.pas @@ -663,22 +663,40 @@ implementation pointerdef : begin { ugly, but delphi allows it } - if (cdo_explicit in cdoptions) and - (m_delphi in current_settings.modeswitches) then + if cdo_explicit in cdoptions then begin - doconv:=tc_int_2_int; - eq:=te_convert_l1; + if target_info.system in [system_jvm_java32] then + begin + doconv:=tc_equal; + eq:=te_convert_l1; + end + else if m_delphi in current_settings.modeswitches then + begin + doconv:=tc_int_2_int; + eq:=te_convert_l1; + end end; end; objectdef: begin { ugly, but delphi allows it } - if (m_delphi in current_settings.modeswitches) and - is_class_or_interface_or_dispinterface(def_from) and - (cdo_explicit in cdoptions) then + if (cdo_explicit in cdoptions) and + is_class_or_interface_or_objc_or_java(def_from) then begin - doconv:=tc_int_2_int; - eq:=te_convert_l1; + { in Java enums /are/ class instances, and hence such + typecasts must not be treated as integer-like + conversions + } + if target_info.system in [system_jvm_java32] then + begin + doconv:=tc_equal; + eq:=te_convert_l1; + end + else if m_delphi in current_settings.modeswitches then + begin + doconv:=tc_int_2_int; + eq:=te_convert_l1; + end; end; end; end; @@ -1026,14 +1044,31 @@ implementation { allow explicit typecasts from enums to pointer. Support for delphi compatibility } + { in Java enums /are/ class instances, and hence such + typecasts must not be treated as integer-like conversions + } if (((cdo_explicit in cdoptions) and - (m_delphi in current_settings.modeswitches) - ) or + ((m_delphi in current_settings.modeswitches) or + (target_info.system in [system_jvm_java32]) + ) + ) or (cdo_internal in cdoptions) ) then begin - doconv:=tc_int_2_int; - eq:=te_convert_l1; + { in Java enums /are/ class instances, and hence such + typecasts must not be treated as integer-like + conversions + } + if target_info.system in [system_jvm_java32] then + begin + doconv:=tc_equal; + eq:=te_convert_l1; + end + else if m_delphi in current_settings.modeswitches then + begin + doconv:=tc_int_2_int; + eq:=te_convert_l1; + end; end; end; arraydef : @@ -1397,9 +1432,14 @@ implementation eq:=te_convert_l2; end { ugly, but delphi allows it } - else if (def_from.typ in [orddef,enumdef]) and - (m_delphi in current_settings.modeswitches) and - (cdo_explicit in cdoptions) then + { in Java enums /are/ class instances, and hence such + typecasts must not be treated as integer-like conversions + } + else if ((not(target_info.system in [system_jvm_java32]) and + (def_from.typ=enumdef)) or + (def_from.typ=orddef)) and + (m_delphi in current_settings.modeswitches) and + (cdo_explicit in cdoptions) then begin doconv:=tc_int_2_int; eq:=te_convert_l1;