public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug fortran/47805] New: [OOP] Overridding hidden (private) TPB is rejected @ 2011-02-18 17:06 burnus at gcc dot gnu.org 2011-02-18 17:07 ` [Bug fortran/47805] " burnus at gcc dot gnu.org ` (4 more replies) 0 siblings, 5 replies; 6+ messages in thread From: burnus at gcc dot gnu.org @ 2011-02-18 17:06 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47805 Summary: [OOP] Overridding hidden (private) TPB is rejected Product: gcc Version: 4.6.0 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: fortran AssignedTo: unassigned@gcc.gnu.org ReportedBy: burnus@gcc.gnu.org CC: janus@gcc.gnu.org See http://j3-fortran.org/doc/year/11/11-141.txt and watch out for updates (11-141r1.txt etc.), approved by J3 meeting. Overriding a TBP seems to OK, if the TBP is hidden through accessibility (PRIVATE). Note (cf. example 2 in the IR): Abstract DT with private deferred TBP cannot be extended as one cannot implement the deferred TBP. The first example given in the file is rejected with: PROCEDURE,NOPASS :: p => p2 ! (2). 1 Error: 'p' at (1) must have the same number of formal arguments as the overridden procedure MODULE example1_m1 TYPE t1 CONTAINS PROCEDURE,PRIVATE,NOPASS :: p ! (1). END TYPE CONTAINS SUBROUTINE p PRINT *,'p' END SUBROUTINE SUBROUTINE do_p(x) CLASS(t1) x CALL x%p END SUBROUTINE END MODULE MODULE example1_m2 USE example1_m1 TYPE,EXTENDS(t1) :: t2 CONTAINS PROCEDURE,NOPASS :: p => p2 ! (2). END TYPE CONTAINS SUBROUTINE p2(n) PRINT *,'p2',n END SUBROUTINE END MODULE PROGRAM example1 USE example1_m2 TYPE(t2),TARGET :: x CLASS(t1),POINTER :: y y => x CALL do_p(x) ! (3): I expect this to print 'p'. CALL do_p(y) ! (4): I expect this to print 'p'. CALL x%p(13) ! (5): I expect this to print 'p2 13'. END PROGRAM ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug fortran/47805] [OOP] Overridding hidden (private) TPB is rejected 2011-02-18 17:06 [Bug fortran/47805] New: [OOP] Overridding hidden (private) TPB is rejected burnus at gcc dot gnu.org @ 2011-02-18 17:07 ` burnus at gcc dot gnu.org 2011-02-19 11:26 ` janus at gcc dot gnu.org ` (3 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: burnus at gcc dot gnu.org @ 2011-02-18 17:07 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47805 --- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> 2011-02-18 17:05:35 UTC --- Forgot to link to http://j3-fortran.org/pipermail/j3/2011-February/004197.html which is about the J3 ballot of those items; it also contains an updated version of the paper. The IR has been approved by the J3 meeting and currently a J3 ballot is running (cf. link); if accepted, it moves on to June's WG5 meeting in Garching. ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug fortran/47805] [OOP] Overridding hidden (private) TPB is rejected 2011-02-18 17:06 [Bug fortran/47805] New: [OOP] Overridding hidden (private) TPB is rejected burnus at gcc dot gnu.org 2011-02-18 17:07 ` [Bug fortran/47805] " burnus at gcc dot gnu.org @ 2011-02-19 11:26 ` janus at gcc dot gnu.org 2011-02-19 14:23 ` janus at gcc dot gnu.org ` (2 subsequent siblings) 4 siblings, 0 replies; 6+ messages in thread From: janus at gcc dot gnu.org @ 2011-02-19 11:26 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47805 janus at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |pault at gcc dot gnu.org --- Comment #2 from janus at gcc dot gnu.org 2011-02-19 10:41:13 UTC --- (In reply to comment #0) > Overriding a TBP seems to OK, if the TBP is hidden through accessibility > (PRIVATE). Huh, tricky thing. > The first example given in the file is rejected with: > > PROCEDURE,NOPASS :: p => p2 ! (2). > 1 > Error: 'p' at (1) must have the same number of formal arguments as the > overridden procedure One can get rid of this error message e.g. by ... (warning: not regtested) Index: class.c =================================================================== --- class.c (revision 170290) +++ class.c (working copy) @@ -639,21 +639,24 @@ res = gfc_find_symtree (root, name); if (res && res->n.tb && !res->n.tb->error) { - /* We found one. */ - if (t) - *t = SUCCESS; - if (!noaccess && derived->attr.use_assoc && res->n.tb->access == ACCESS_PRIVATE) { if (where) - gfc_error ("'%s' of '%s' is PRIVATE at %L", - name, derived->name, where); + { + gfc_error ("'%s' of '%s' is PRIVATE at %L", + name, derived->name, where); + return res; + } + } + else + { + /* We found one. */ if (t) - *t = FAILURE; + *t = SUCCESS; + + return res; } - - return res; } /* Otherwise, recurse on parent type if derived is an extension. */ Index: resolve.c =================================================================== --- resolve.c (revision 170290) +++ resolve.c (working copy) @@ -11194,8 +11194,8 @@ if (super_type) { gfc_symtree* overridden; - overridden = gfc_find_typebound_proc (super_type, NULL, - stree->name, true, NULL); + overridden = gfc_find_typebound_proc (super_type, NULL, stree->name, + false, NULL); if (overridden && overridden->n.tb) stree->n.tb->overridden = overridden->n.tb; However, one then gets different results than indicated in (3)-(5), i.e. gfortran always calls 'p2'. It seems our current run-time mechanisms are not able to cope with this case. The only way I can see out of this is to resolve the call in 'do_p' not to the polymorphic version 'x->_vptr->p', but to a static call to the subroutine 'p' (since 'p' is effectively not overridable, at least not outside the module). But then it gets really tricky if we put 't2' in the same module. Then 'p' *will* be overridden, and we have to get back to the dynamic vtable call again to get it right. Then be so nasty to add another type 't3' in a different module, which defines a new TBP 'p' which does *not* override t1%p. And, bang!, we're in trouble again. So, I'm clueless. Does it help to put the type-name into the binding name? Say, have the call in 'do_p' resolve to 'x->_vptr->t1_p' (to honor the fact that the base type for the call is t1). ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug fortran/47805] [OOP] Overridding hidden (private) TPB is rejected 2011-02-18 17:06 [Bug fortran/47805] New: [OOP] Overridding hidden (private) TPB is rejected burnus at gcc dot gnu.org 2011-02-18 17:07 ` [Bug fortran/47805] " burnus at gcc dot gnu.org 2011-02-19 11:26 ` janus at gcc dot gnu.org @ 2011-02-19 14:23 ` janus at gcc dot gnu.org 2012-10-01 13:49 ` burnus at gcc dot gnu.org 2015-10-13 16:55 ` dominiq at lps dot ens.fr 4 siblings, 0 replies; 6+ messages in thread From: janus at gcc dot gnu.org @ 2011-02-19 14:23 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47805 --- Comment #3 from janus at gcc dot gnu.org 2011-02-19 13:57:09 UTC --- (In reply to comment #2) > One can get rid of this error message e.g. by ... (warning: not regtested) Side note: This patch does not cause any regressions in the test suite. However, it makes no sense to apply it without any run-time support for this feature (which will be less trivial to implement). Also one should probably wait for the final result of the interpretation request, which means this will probably not make it into 4.6. ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug fortran/47805] [OOP] Overridding hidden (private) TPB is rejected 2011-02-18 17:06 [Bug fortran/47805] New: [OOP] Overridding hidden (private) TPB is rejected burnus at gcc dot gnu.org ` (2 preceding siblings ...) 2011-02-19 14:23 ` janus at gcc dot gnu.org @ 2012-10-01 13:49 ` burnus at gcc dot gnu.org 2015-10-13 16:55 ` dominiq at lps dot ens.fr 4 siblings, 0 replies; 6+ messages in thread From: burnus at gcc dot gnu.org @ 2012-10-01 13:49 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47805 Tobias Burnus <burnus at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |burnus at gcc dot gnu.org --- Comment #4 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-10-01 13:48:48 UTC --- Updated version: F08/0052 at ftp://ftp.nag.co.uk/sc22wg5/N1901-N1950/N1907.txt (incorporated in Corrigendum 1 to F2008). ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug fortran/47805] [OOP] Overridding hidden (private) TPB is rejected 2011-02-18 17:06 [Bug fortran/47805] New: [OOP] Overridding hidden (private) TPB is rejected burnus at gcc dot gnu.org ` (3 preceding siblings ...) 2012-10-01 13:49 ` burnus at gcc dot gnu.org @ 2015-10-13 16:55 ` dominiq at lps dot ens.fr 4 siblings, 0 replies; 6+ messages in thread From: dominiq at lps dot ens.fr @ 2015-10-13 16:55 UTC (permalink / raw) To: gcc-bugs https://gcc.gnu.org/bugzilla/show_bug.cgi?id=47805 Dominique d'Humieres <dominiq at lps dot ens.fr> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2015-10-13 Ever confirmed|0 |1 --- Comment #5 from Dominique d'Humieres <dominiq at lps dot ens.fr> --- For what it worth, updated link in comment 1: http://mailman.j3-fortran.org/pipermail/j3/2011-February/004197.html The problems are still there at r228753. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-10-13 16:55 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2011-02-18 17:06 [Bug fortran/47805] New: [OOP] Overridding hidden (private) TPB is rejected burnus at gcc dot gnu.org 2011-02-18 17:07 ` [Bug fortran/47805] " burnus at gcc dot gnu.org 2011-02-19 11:26 ` janus at gcc dot gnu.org 2011-02-19 14:23 ` janus at gcc dot gnu.org 2012-10-01 13:49 ` burnus at gcc dot gnu.org 2015-10-13 16:55 ` dominiq at lps dot ens.fr
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).