Fix for Mantis #22428.

* pgenutil.pas, generate_specialization:
  * return a generrordef instead of Nil when returning because of an error
  * always check "genname" for a generic count string as a mode ObjFPC generic specialized in a mode Delphi unit will already contain a "$X" suffix and only symname will be set.
+ add (corrected) test

git-svn-id: trunk@22462 -
This commit is contained in:
svenbarth 2012-09-26 15:03:37 +00:00
parent e3b97d99c6
commit 54c1e638ad
4 changed files with 62 additions and 5 deletions

2
.gitattributes vendored
View File

@ -12857,6 +12857,7 @@ tests/webtbs/tw22331.pp svneol=native#text/plain
tests/webtbs/tw22344.pp svneol=native#text/plain
tests/webtbs/tw2242.pp svneol=native#text/plain
tests/webtbs/tw22427.pp svneol=native#text/pascal
tests/webtbs/tw22428.pp svneol=native#text/pascal
tests/webtbs/tw22490.pp svneol=native#text/plain
tests/webtbs/tw2250.pp svneol=native#text/plain
tests/webtbs/tw22502.pp svneol=native#text/plain
@ -13676,6 +13677,7 @@ tests/webtbs/uw22160b2.pp svneol=native#text/pascal
tests/webtbs/uw22160b3.pp svneol=native#text/pascal
tests/webtbs/uw22427a.pp svneol=native#text/pascal
tests/webtbs/uw22427b.pp svneol=native#text/pascal
tests/webtbs/uw22428.pp svneol=native#text/pascal
tests/webtbs/uw2266a.inc svneol=native#text/plain
tests/webtbs/uw2266b.pas svneol=native#text/plain
tests/webtbs/uw2269.inc svneol=native#text/plain

View File

@ -105,6 +105,7 @@ uses
found,
first,
err : boolean;
errval,
i,
gencount : longint;
crc : cardinal;
@ -198,6 +199,7 @@ uses
(srsym.typ<>typesym) then
begin
identifier_not_found(genname);
tt:=generrordef;
exit;
end;
tt:=ttypesym(srsym).typedef;
@ -224,18 +226,17 @@ uses
if err then
begin
try_to_consume(_RSHARPBRACKET);
tt:=generrordef;
exit;
end;
{ search a generic with the given count of params }
countstr:='';
str(genericdeflist.Count,countstr);
{ use the name of the symbol as procvars return a user friendly version
of the name }
if symname='' then
genname:=ttypesym(genericdef.typesym).realname
else
genname:=symname;
{ in case of non-Delphi mode the type name could already be a generic
def (but maybe the wrong one) }
if assigned(genericdef) and
@ -257,7 +258,27 @@ uses
genname:=copy(genname,1,i-1);
break;
end;
end;
end
else
{ search for a potential suffix }
for i:=length(genname) downto 1 do
if genname[i]='$' then
begin
{ if the part right of the $ is a number we assume that the left
part is the name of the generic, otherwise we assume that the
complete name is the name of the generic }
countstr:=copy(genname,i+1,length(genname)-i);
gencount:=0;
val(countstr,gencount,errval);
if errval=0 then
genname:=copy(genname,1,i-1);
break;
end;
{ search a generic with the given count of params }
countstr:='';
str(genericdeflist.Count,countstr);
genname:=genname+'$'+countstr;
ugenname:=upper(genname);
@ -276,6 +297,7 @@ uses
identifier_not_found(genname);
genericdeflist.Free;
generictypelist.Free;
tt:=generrordef;
exit;
end;
@ -317,7 +339,6 @@ uses
end;
end;
{ Special case if we are referencing the current defined object }
if assigned(current_structdef) and
(current_structdef.objname^=ufinalspecializename) then

14
tests/webtbs/tw22428.pp Normal file
View File

@ -0,0 +1,14 @@
unit tw22428;
{$MODE DELPHI}
interface
uses uw22428;
implementation
initialization
TWrapper<Byte>.Test;
end.

20
tests/webtbs/uw22428.pp Normal file
View File

@ -0,0 +1,20 @@
unit uw22428;
{$MODE OBJFPC}
{$modeswitch advancedrecords}
interface
type
generic TWrapper<T> = record
class procedure Test; static;
end;
implementation
class procedure TWrapper.Test;
begin
end;
end.