From d67f31a0e10003c735f9c4fd33a6e40da3f12c74 Mon Sep 17 00:00:00 2001 From: florian Date: Fri, 9 Nov 2012 20:46:30 +0000 Subject: [PATCH] * allow type parameters variables being passed to new/dispose, resolves #23270 git-svn-id: trunk@22963 - --- .gitattributes | 1 + compiler/pinline.pas | 24 ++++++++++++++++++++++-- tests/webtbs/tw23270.pp | 23 +++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 tests/webtbs/tw23270.pp diff --git a/.gitattributes b/.gitattributes index cdbc409731..7779dcba4b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12985,6 +12985,7 @@ tests/webtbs/tw23185.pp svneol=native#text/pascal tests/webtbs/tw2318b.pp svneol=native#text/plain tests/webtbs/tw23212.pp svneol=native#text/plain tests/webtbs/tw2323.pp svneol=native#text/plain +tests/webtbs/tw23270.pp svneol=native#text/pascal tests/webtbs/tw2328.pp svneol=native#text/plain tests/webtbs/tw2332.pp svneol=native#text/plain tests/webtbs/tw2351.pp svneol=native#text/plain diff --git a/compiler/pinline.pas b/compiler/pinline.pas index d2f7ec863e..df2431fd88 100644 --- a/compiler/pinline.pas +++ b/compiler/pinline.pas @@ -159,6 +159,16 @@ implementation destructorpos:=current_tokenpos; consume(_ID); + if is_typeparam(p.resultdef) then + begin + p.free; + p:=factor(false,false); + p.free; + consume(_RKLAMMER); + new_dispose_statement:=cnothingnode.create; + exit; + end; + if (p.resultdef.typ<>pointerdef) then begin Message1(type_e_pointer_type_expected,p.resultdef.typename); @@ -278,8 +288,18 @@ implementation begin if (p.resultdef.typ<>pointerdef) then Begin - Message1(type_e_pointer_type_expected,p.resultdef.typename); - new_dispose_statement:=cerrornode.create; + if is_typeparam(p.resultdef) then + begin + p.free; + consume(_RKLAMMER); + new_dispose_statement:=cnothingnode.create; + exit; + end + else + begin + Message1(type_e_pointer_type_expected,p.resultdef.typename); + new_dispose_statement:=cerrornode.create; + end; end else begin diff --git a/tests/webtbs/tw23270.pp b/tests/webtbs/tw23270.pp new file mode 100644 index 0000000000..f2adccf469 --- /dev/null +++ b/tests/webtbs/tw23270.pp @@ -0,0 +1,23 @@ +{$MODE DELPHI} + +type + TSmallWrapper = record + Value: TValue; + end; + + TWrapper = class + strict private + class var FSmallWrapper: TSmallWrapper; + public + class procedure Z; static; + end; + +class procedure TWrapper.Z; +begin + FSmallWrapper.Value := New(PInteger); + Dispose(FSmallWrapper.Value); { Error: pointer type expected, but ... } +end; + +begin + TWrapper.Z; +end.