Переглянути джерело

* use the correctly typecasted reference in a_bit_set_reg_ref

git-svn-id: trunk@32463 -
Jonas Maebe 9 роки тому
батько
коміт
688b9c0a69
3 змінених файлів з 14 додано та 4 видалено
  1. 1 1
      compiler/hlcgobj.pas
  2. 12 1
      compiler/ncgcal.pas
  3. 1 2
      compiler/ncnv.pas

+ 1 - 1
compiler/hlcgobj.pas

@@ -1768,7 +1768,7 @@ implementation
     begin
       href:=ref;
       g_ptrtypecast_ref(list,cpointerdef.getreusable(tosize),cpointerdef.getreusable(u8inttype),href);
-      a_load_const_subsetref(list,u8inttype,ord(doset),get_bit_reg_ref_sref(list,fromsize,tosize,bitnumber,ref));
+      a_load_const_subsetref(list,u8inttype,ord(doset),get_bit_reg_ref_sref(list,fromsize,tosize,bitnumber,href));
     end;
 
   procedure thlcgobj.a_bit_set_reg_loc(list: TAsmList; doset: boolean; regsize, tosize: tdef; bitnumber: tregister; const loc: tlocation);

+ 12 - 1
compiler/ncgcal.pas

@@ -154,10 +154,21 @@ implementation
 
 
     procedure tcgcallparanode.push_addr_para;
+      var
+        valuedef: tdef;
       begin
         if not(left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE]) then
           internalerror(200304235);
-        hlcg.a_loadaddr_ref_cgpara(current_asmdata.CurrAsmList,left.resultdef,left.location.reference,tempcgpara);
+        { see the call to keep_para_array_range in ncal: if that call returned
+          true, we overwrite the resultdef of left with its original resultdef
+          (to keep track of the range of the original arrat); we inserted a type
+          conversion to parasym.vardef, so that is the type this value actually
+          has }
+        if paramanager.keep_para_array_range(parasym.varspez,parasym.vardef,aktcallnode.procdefinition.proccalloption) then
+          valuedef:=parasym.vardef
+        else
+          valuedef:=left.resultdef;
+        hlcg.a_loadaddr_ref_cgpara(current_asmdata.CurrAsmList,valuedef,left.location.reference,tempcgpara);
       end;
 
 

+ 1 - 2
compiler/ncnv.pas

@@ -1606,13 +1606,12 @@ implementation
       begin
         { a dynamic array is a pointer to an array, so to convert it to }
         { an open array, we have to dereference it (JM)                 }
-        result := ctypeconvnode.create_internal(left,voidpointertype);
+        result := ctypeconvnode.create_internal(left,cpointerdef.getreusable(resultdef));
         typecheckpass(result);
         { left is reused }
         left := nil;
         result := cderefnode.create(result);
         include(result.flags,nf_no_checkpointer);
-        result.resultdef := resultdef;
       end;