Sfoglia il codice sorgente

* taking the address of an absolute var sym with constant address evaluates into a const. pointer, resolves #17118

git-svn-id: trunk@15723 -
florian 15 anni fa
parent
commit
683ac0ea45
3 ha cambiato i file con 34 aggiunte e 1 eliminazioni
  1. 1 0
      .gitattributes
  2. 14 1
      compiler/nmem.pas
  3. 19 0
      tests/webtbs/tw17118.pp

+ 1 - 0
.gitattributes

@@ -10585,6 +10585,7 @@ tests/webtbs/tw16954.pp svneol=native#text/plain
 tests/webtbs/tw1696.pp svneol=native#text/plain
 tests/webtbs/tw1699.pp svneol=native#text/plain
 tests/webtbs/tw1709.pp svneol=native#text/plain
+tests/webtbs/tw17118.pp svneol=native#text/plain
 tests/webtbs/tw1720.pp svneol=native#text/plain
 tests/webtbs/tw1735.pp svneol=native#text/plain
 tests/webtbs/tw1737.pp svneol=native#text/plain

+ 14 - 1
compiler/nmem.pas

@@ -499,7 +499,20 @@ implementation
               end
             else
 {$endif i386}
-              if (nf_internal in flags) or
+            if (hp.nodetype=loadn) and
+               (tloadnode(hp).symtableentry.typ=absolutevarsym) and
+{$ifdef i386}
+               not(tabsolutevarsym(tloadnode(hp).symtableentry).absseg) and
+{$endif i386}
+               (tabsolutevarsym(tloadnode(hp).symtableentry).abstyp=toaddr) then
+               begin
+                 if nf_typedaddr in flags then
+                   result:=cpointerconstnode.create(tabsolutevarsym(tloadnode(hp).symtableentry).addroffset,tpointerdef.create(left.resultdef))
+                 else
+                   result:=cpointerconstnode.create(tabsolutevarsym(tloadnode(hp).symtableentry).addroffset,voidpointertype);
+                 exit;
+               end
+              else if (nf_internal in flags) or
                  valid_for_addr(left,true) then
                 begin
                   if not(nf_typedaddr in flags) then

+ 19 - 0
tests/webtbs/tw17118.pp

@@ -0,0 +1,19 @@
+type
+ TRecord = record
+  P1,
+  P2: pointer;
+ end;
+
+var
+ var1: longint;
+ varabs: longint absolute 1234;
+const
+ info: TRecord = (P1: @var1; // Works
+                  P2: @varabs); // Won't work
+
+begin
+  if ptrint(info.p2)<>1234 then
+    halt(1);
+  writeln('ok');
+end.
+