* Do not create SEH finalization procedures in generic methods, their similarity with nested procedures causes compilation errors because actual nested procedures are not allowed for generics. Not creating them doesn't hurt because generic node tree is not used for code generation. Resolves .

git-svn-id: trunk@23519 -
This commit is contained in:
sergei 2013-01-25 18:50:04 +00:00
parent d8902af3d6
commit cb1098c26c

View File

@ -186,7 +186,14 @@ function copy_parasize(var n: tnode; arg: pointer): foreachnoderesult;
constructor tx64tryfinallynode.create(l, r: TNode);
begin
inherited create(l,r);
if (target_info.system<>system_x86_64_win64) then
if (target_info.system<>system_x86_64_win64) or (
{ Don't create child procedures for generic methods, their nested-like
behavior causes compilation errors because real nested procedures
aren't allowed for generics. Not creating them doesn't harm because
generic node tree is discarded without generating code. }
assigned(current_procinfo.procdef.struct) and
(df_generic in current_procinfo.procdef.struct.defoptions)
) then
exit;
finalizepi:=tcgprocinfo(cprocinfo.create(current_procinfo));
finalizepi.force_nested;
@ -205,6 +212,11 @@ constructor tx64tryfinallynode.create_implicit(l, r, _t1: TNode);
inherited create_implicit(l, r, _t1);
if (target_info.system<>system_x86_64_win64) then
exit;
if assigned(current_procinfo.procdef.struct) and
(df_generic in current_procinfo.procdef.struct.defoptions) then
InternalError(2013012501);
finalizepi:=tcgprocinfo(cprocinfo.create(current_procinfo));
finalizepi.force_nested;
finalizepi.procdef:=create_pd;