Prof A Olowofoyeku wrote:
I converted one small project from using OBJECTs to using CLASSes.
The test program compiles and runs okay under Delphi, Virtual Pascal, and FreePascal.
The new GPC snapshot comes up with some compilation errors. You can see the error log in the attached zip file. Also in the zip file are the sources, and the test program's outputs when compiled with Delphi 7 (d7.txt), FreePascal (fpc.txt), and Virtual Pascal (vp.txt).
: baseobj.pas:52: method `init', overrides parent method : baseobj.pas:253: method `init', overrides parent method
The two errors above (and more in the following) are because GPC is more strict by default. You can write:
CONSTRUCTOR init ( Owner : TClass ); override;
or
CONSTRUCTOR init ( Owner : TClass ); reintroduce;
to specify the intent (to say the truth both mean the same for static methods). Or you may use `-fdelphi-method-shadowing' to silently accept your original code.
: baseobj.pas: In constructor `TBaseList.init': : baseobj.pas:437: expression used as a statement : baseobj.pas: In destructor `TBaseList.done': : baseobj.pas:454: Delphi/OOE continuing destructor activation unsupported
The patch below should fix those (with the patch I was able to compile your test program and got the same results as in enclsed output files)
Index: p/objects.c =================================================================== RCS file: /mn/a8/cvsroot/gpc/p/objects.c,v retrieving revision 1.4 diff -u -r1.4 objects.c --- p/objects.c 4 Nov 2005 01:00:21 -0000 1.4 +++ p/objects.c 5 Nov 2005 18:01:27 -0000 @@ -145,11 +145,18 @@ if (TREE_CODE (obj) == TYPE_DECL) { tree cmeth = current_method (); - if (PASCAL_CONSTRUCTOR_METHOD (fun) - && PASCAL_TYPE_CLASS (TREE_TYPE (obj))) + int is_class = PASCAL_TYPE_CLASS (TREE_TYPE (obj)); + if (PASCAL_CONSTRUCTOR_METHOD (fun) && is_class) constructor_call = tree_cons (NULL_TREE, obj, tree_cons (NULL_TREE, cref, args));
+ if (is_class && PASCAL_DESTRUCTOR_METHOD (fun) && + (!cmeth || !PASCAL_DESTRUCTOR_METHOD (cmeth))) + { + error("Delphi/OOE continuing destructor activation outside a destructor"); + return error_mark_node; + } + if (!cmeth) /* Somebody is looking for the address of this method. Give them the FUNCTION_DECL. */ { @@ -173,9 +180,10 @@ return error_mark_node; obj = build_indirect_ref (lookup_name (self_id), "`Self' reference"); is_virtual = 0; + is_destructor = 0; } - - is_destructor = PASCAL_DESTRUCTOR_METHOD (fun) + else + is_destructor = PASCAL_DESTRUCTOR_METHOD (fun) && TYPE_POINTER_TO (TREE_TYPE (obj)) && PASCAL_TYPE_CLASS (TYPE_POINTER_TO (TREE_TYPE (obj)));
@@ -218,14 +226,8 @@ tree vobj; gcc_assert (TREE_CODE (obj) == INDIRECT_REF); vobj = TREE_OPERAND (obj, 0); - if (!cmeth || !PASCAL_DESTRUCTOR_METHOD (cmeth)) - return build_predef_call (p_Dispose, tree_cons (NULL_TREE, vobj, + return build_predef_call (p_Dispose, tree_cons (NULL_TREE, vobj, build_tree_list (NULL_TREE, fun))); - else - { - error("Delphi/OOE continuing destructor activation unsupported"); - return error_mark_node; - } }
return fun; Index: p/statements.c =================================================================== RCS file: /mn/a8/cvsroot/gpc/p/statements.c,v retrieving revision 1.3 diff -u -r1.3 statements.c --- p/statements.c 28 Oct 2005 20:00:56 -0000 1.3 +++ p/statements.c 5 Nov 2005 17:33:00 -0000 @@ -1083,7 +1083,10 @@ function_called = 1; } if (TREE_CODE (t) == PASCAL_CONSTRUCTOR_CALL) - t = convert (void_type_node, TREE_OPERAND (t, 1)); + { + t = convert (void_type_node, TREE_OPERAND (t, 1)); + function_called = 1; + } if (!EM (t)) { if (PASCAL_TREE_IGNORABLE (t))
On 5 Nov 2005 at 19:08, Waldek Hebisch wrote:
Prof A Olowofoyeku wrote:
I converted one small project from using OBJECTs to using CLASSes.
The test program compiles and runs okay under Delphi, Virtual Pascal, and FreePascal.
The new GPC snapshot comes up with some compilation errors. You can see the error log in the attached zip file. Also in the zip file are the sources, and the test program's outputs when compiled with Delphi 7 (d7.txt), FreePascal (fpc.txt), and Virtual Pascal (vp.txt).
: baseobj.pas:52: method `init', overrides parent method : baseobj.pas:253: method `init', overrides parent method
The two errors above (and more in the following) are because GPC is more strict by default. You can write:
CONSTRUCTOR init ( Owner : TClass ); override;
I couldn't do it. The constructor in the ancestor was static, not virtual. And couldn't do it if the ancestor was virtual either - because the declarations were not identical.
or
CONSTRUCTOR init ( Owner : TClass ); reintroduce;
Reintroduce didn't seem appropriate (although Delphi 7 accepts it here). I didn't think it applied when what you are replacing is a static method ...
[...]
: baseobj.pas: In constructor `TBaseList.init': : baseobj.pas:437: expression used as a statement : baseobj.pas: In destructor `TBaseList.done': : baseobj.pas:454: Delphi/OOE continuing destructor activation unsupported
The patch below should fix those (with the patch I was able to compile your test program and got the same results as in enclsed output files)
[...]
Works here as well - thanks ...
Best regards, The Chief -------- Prof. Abimbola A. Olowofoyeku (The African Chief) web: http://www.greatchief.plus.com/