Re: [Patch, Fortran] PR 52542 - Fix PROCEDURE() with Bind(C)
Dear Tobias, Apart from s/Contribute/Contributed/ this is OK for trunk. In fact, I would say that it is "obvious". Thanks for the patch. Paul On Sat, Mar 10, 2012 at 4:53 PM, Tobias Burnus wrote: > Tobias Burnus wrote: >> >> If the interface in a PROCEDURE() statement is Bind(C), also the procedure >> (pointer) declared in that statement is BIND(C). >> >> From the F2008 standard: "A proc-language-binding-spec without a NAME= is >> allowed, but is redundant with the proc-interface required by C1222." >> >> Build and currently regtested on x86-64-linux. >> OK for the trunk (if regtesting succeeded)? > > > Well, it didn't as I forgot to reset two variables - one then gets then an > error that one has specified an binding name - or the wrong binding name > might be used. > > Build and regtested on x86-64-linux. > OK? > > Tobias -- The knack of flying is learning how to throw yourself at the ground and miss. --Hitchhikers Guide to the Galaxy
Re: [Patch, Fortran] PR 52542 - Fix PROCEDURE() with Bind(C)
Tobias Burnus wrote: If the interface in a PROCEDURE() statement is Bind(C), also the procedure (pointer) declared in that statement is BIND(C). From the F2008 standard: "A proc-language-binding-spec without a NAME= is allowed, but is redundant with the proc-interface required by C1222." Build and currently regtested on x86-64-linux. OK for the trunk (if regtesting succeeded)? Well, it didn't as I forgot to reset two variables - one then gets then an error that one has specified an binding name - or the wrong binding name might be used. Build and regtested on x86-64-linux. OK? Tobias 2012-03-10 Tobias Burnus PR fortran/52542 * decl.c (match_procedure_decl): If the interface is bind(C), the procedure is as well. 2012-03-10 Tobias Burnus PR fortran/52542 * gfortran.dg/proc_ptr_35.f90: New. --- /dev/null 2012-03-09 19:41:57.079829322 +0100 +++ gcc/gcc/testsuite/gfortran.dg/proc_ptr_35.f90 2012-03-09 22:22:31.0 +0100 @@ -0,0 +1,16 @@ +! { dg-do compile } +! +! PR fortran/52542 +! +! Ensure that the procedure myproc is Bind(C). +! +! Contribute by Mat Cross of NAG +! +interface + subroutine s() bind(c) + end subroutine s +end interface +procedure(s) :: myproc +call myproc() +end +! { dg-final { scan-assembler-not "myproc_" } } diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 75b8a89..4da21c3 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -4855,6 +4855,13 @@ match_procedure_decl (void) if (m == MATCH_ERROR) return MATCH_ERROR; + if (proc_if && proc_if->attr.is_bind_c && !current_attr.is_bind_c) +{ + current_attr.is_bind_c = 1; + has_name_equals = 0; + curr_binding_label = NULL; +} + /* Get procedure symbols. */ for(num=1;;num++) {
[Patch, Fortran] PR 52542 - Fix PROCEDURE() with Bind(C)
If the interface in a PROCEDURE() statement is Bind(C), also the procedure (pointer) declared in that statement is BIND(C). From the F2008 standard: "A proc-language-binding-spec without a NAME= is allowed, but is redundant with the proc-interface required by C1222." Build and currently regtested on x86-64-linux. OK for the trunk (if regtesting succeeded)? Tobias 2012-03-10 Tobias Burnus PR fortran/52542 * decl.c (match_procedure_decl): If the interface is bind(C), the procedure is as well. 2012-03-10 Tobias Burnus PR fortran/52542 * gfortran.dg/proc_ptr_35.f90: New. --- /dev/null 2012-03-09 19:41:57.079829322 +0100 +++ gcc/gcc/testsuite/gfortran.dg/proc_ptr_35.f90 2012-03-09 22:22:31.0 +0100 @@ -0,0 +1,16 @@ +! { dg-do compile } +! +! PR fortran/52542 +! +! Ensure that the procedure myproc is Bind(C). +! +! Contribute by Mat Cross of NAG +! +interface + subroutine s() bind(c) + end subroutine s +end interface +procedure(s) :: myproc +call myproc() +end +! { dg-final { scan-assembler-not "myproc_" } } diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 75b8a89..7c5e518 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -4855,6 +4855,9 @@ match_procedure_decl (void) if (m == MATCH_ERROR) return MATCH_ERROR; + if (proc_if && proc_if->attr.is_bind_c) +current_attr.is_bind_c = 1; + /* Get procedure symbols. */ for(num=1;;num++) {