Ver código fonte

* typecast second_proc_to_procvar() results for llvm if the generic code
performed a simple location_copy() from one complex procvar type to
another

git-svn-id: trunk@32426 -

Jonas Maebe 9 anos atrás
pai
commit
72c7cb2770
1 arquivos alterados com 17 adições e 1 exclusões
  1. 17 1
      compiler/llvm/nllvmcnv.pas

+ 17 - 1
compiler/llvm/nllvmcnv.pas

@@ -45,7 +45,7 @@ interface
          procedure second_int_to_real;override;
          procedure second_int_to_real;override;
          { procedure second_real_to_real;override; }
          { procedure second_real_to_real;override; }
          { procedure second_cord_to_pointer;override; }
          { procedure second_cord_to_pointer;override; }
-         { procedure second_proc_to_procvar;override; }
+         procedure second_proc_to_procvar;override;
          procedure second_nil_to_methodprocvar; override;
          procedure second_nil_to_methodprocvar; override;
          procedure second_bool_to_int;override;
          procedure second_bool_to_int;override;
          procedure second_int_to_bool;override;
          procedure second_int_to_bool;override;
@@ -155,6 +155,22 @@ procedure tllvmtypeconvnode.second_int_to_real;
   end;
   end;
 
 
 
 
+procedure tllvmtypeconvnode.second_proc_to_procvar;
+  begin
+    inherited;
+    if not tabstractprocdef(resultdef).is_addressonly and
+       not tabstractprocdef(left.resultdef).is_addressonly then
+      begin
+        if location.loc<>LOC_REFERENCE then
+          internalerror(2015111902);
+        hlcg.g_ptrtypecast_ref(current_asmdata.CurrAsmList,
+          cpointerdef.getreusable(left.resultdef),
+          cpointerdef.getreusable(resultdef),
+          location.reference);
+      end;
+  end;
+
+
 procedure tllvmtypeconvnode.second_nil_to_methodprocvar;
 procedure tllvmtypeconvnode.second_nil_to_methodprocvar;
   var
   var
     href: treference;
     href: treference;