2
0
Эх сурвалжийг харах

compiler: calculate offset of record fields in taddrnode also for bitpacked structures (Jonas comment in bug #0019357)

git-svn-id: trunk@23437 -
paul 12 жил өмнө
parent
commit
fe338013a5

+ 11 - 2
compiler/nmem.pas

@@ -587,9 +587,18 @@ implementation
                begin
                  offset:=tabsolutevarsym(tloadnode(hp).symtableentry).addroffset;
                  hp:=left;
-                 while assigned(hp) and (hp.nodetype=subscriptn) do
+                 while assigned(hp)and(hp.nodetype=subscriptn) do
                    begin
-                     inc(offset,tsubscriptnode(hp).vs.fieldoffset);
+                     hsym:=tsubscriptnode(hp).vs;
+                     if tabstractrecordsymtable(hsym.owner).is_packed then
+                       begin
+                         { can't calculate the address of a non-byte aligned field }
+                         if (hsym.fieldoffset mod 8)<>0 then
+                           exit;
+                         inc(offset,hsym.fieldoffset div 8)
+                       end
+                     else
+                       inc(offset,hsym.fieldoffset);
                      hp:=tunarynode(hp).left;
                    end;
                  if nf_typedaddr in flags then

+ 1 - 1
tests/webtbs/tw19357.pp

@@ -1,6 +1,6 @@
 program tw19357;
 type
-  TLvl0 = packed record
+  TLvl0 = bitpacked record
     a,b: longword;
   end;