Commit 56bedf42 by Tobias Burnus Committed by Tobias Burnus

[multiple changes]

2007-07-08  Tobias Burnus  <burnus@net-b.de>

       * module.c (gfc_match_use): Support renaming of operators
       in USE statements.
       * gfortran.texi (Fortran 2003 Status): Document support of
       renaming of operators.

2007-03-08  Tobias Burnus  <burnus@net-b.de>

       * gfortran.dg/use_5.f90: New test.
       * gfortran.dg/use_6.f90: Ditto.
       * gfortran.dg/use_7.f90: Ditto.

From-SVN: r122699
parent ac497e6a
2007-07-08 Tobias Burnus <burnus@net-b.de> 2007-07-08 Tobias Burnus <burnus@net-b.de>
* module.c (gfc_match_use): Support renaming of operators
in USE statements.
* gfortran.texi (Fortran 2003 Status): Document support of
renaming of operators.
2007-07-08 Tobias Burnus <burnus@net-b.de>
PR fortran/30973 PR fortran/30973
* module.c (read_module): Always import module name as symbol. * module.c (read_module): Always import module name as symbol.
(gfc_match_use): Disallow module name in the only clause of (gfc_match_use): Disallow module name in the only clause of
......
...@@ -764,6 +764,9 @@ host-associated derived types. ...@@ -764,6 +764,9 @@ host-associated derived types.
attribute; supported intrinsic modules: @code{ISO_FORTRAN_ENV}, attribute; supported intrinsic modules: @code{ISO_FORTRAN_ENV},
@code{OMP_LIB} and @code{OMP_LIB_KINDS}. @code{OMP_LIB} and @code{OMP_LIB_KINDS}.
@item
Renaming of operators in the @code{USE} statement.
@end itemize @end itemize
......
...@@ -488,7 +488,7 @@ gfc_match_use (void) ...@@ -488,7 +488,7 @@ gfc_match_use (void)
{ {
char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1]; char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
gfc_use_rename *tail = NULL, *new; gfc_use_rename *tail = NULL, *new;
interface_type type; interface_type type, type2;
gfc_intrinsic_op operator; gfc_intrinsic_op operator;
match m; match m;
...@@ -588,9 +588,16 @@ gfc_match_use (void) ...@@ -588,9 +588,16 @@ gfc_match_use (void)
gfc_error ("Missing generic specification in USE statement at %C"); gfc_error ("Missing generic specification in USE statement at %C");
goto cleanup; goto cleanup;
case INTERFACE_USER_OP:
case INTERFACE_GENERIC: case INTERFACE_GENERIC:
m = gfc_match (" =>"); m = gfc_match (" =>");
if (type == INTERFACE_USER_OP && m == MATCH_YES
&& (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: Renaming "
"operators in USE statements at %C")
== FAILURE))
goto cleanup;
if (only_flag) if (only_flag)
{ {
if (m != MATCH_YES) if (m != MATCH_YES)
...@@ -598,8 +605,9 @@ gfc_match_use (void) ...@@ -598,8 +605,9 @@ gfc_match_use (void)
else else
{ {
strcpy (new->local_name, name); strcpy (new->local_name, name);
m = gfc_match_generic_spec (&type2, new->use_name, &operator);
m = gfc_match_name (new->use_name); if (type != type2)
goto syntax;
if (m == MATCH_NO) if (m == MATCH_NO)
goto syntax; goto syntax;
if (m == MATCH_ERROR) if (m == MATCH_ERROR)
...@@ -612,7 +620,9 @@ gfc_match_use (void) ...@@ -612,7 +620,9 @@ gfc_match_use (void)
goto syntax; goto syntax;
strcpy (new->local_name, name); strcpy (new->local_name, name);
m = gfc_match_name (new->use_name); m = gfc_match_generic_spec (&type2, new->use_name, &operator);
if (type != type2)
goto syntax;
if (m == MATCH_NO) if (m == MATCH_NO)
goto syntax; goto syntax;
if (m == MATCH_ERROR) if (m == MATCH_ERROR)
...@@ -627,11 +637,10 @@ gfc_match_use (void) ...@@ -627,11 +637,10 @@ gfc_match_use (void)
goto cleanup; goto cleanup;
} }
break; if (type == INTERFACE_USER_OP)
new->operator = operator;
case INTERFACE_USER_OP: break;
strcpy (new->use_name, name);
/* Fall through */
case INTERFACE_INTRINSIC_OP: case INTERFACE_INTRINSIC_OP:
new->operator = operator; new->operator = operator;
......
2007-03-08 Tobias Burnus <burnus@net-b.de> 2007-03-08 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/use_5.f90: New test.
* gfortran.dg/use_6.f90: Ditto.
* gfortran.dg/use_7.f90: Ditto.
2007-03-08 Tobias Burnus <burnus@net-b.de>
PR fortran/30973 PR fortran/30973
* gfortran.dg/use_4.f90: New test. * gfortran.dg/use_4.f90: New test.
* gfortran.dg/used_dummy_types_7.f90: Correct ambiguous symbol. * gfortran.dg/used_dummy_types_7.f90: Correct ambiguous symbol.
! { dg-do "run" }
! Renaming of operators
module z
interface operator(.addfive.)
module procedure sub2
end interface
contains
function sub2(x)
integer :: sub
integer,intent(in) :: x
sub2 = x + 5
end function sub2
end module z
module y
interface operator(.addfive.)
module procedure sub
end interface
contains
function sub(x)
integer :: sub
integer,intent(in) :: x
sub = x + 15
end function sub
end module y
module x
interface operator(.addfive.)
module procedure sub
end interface
contains
function sub(x)
integer :: sub
integer,intent(in) :: x
sub = x + 25
end function sub
end module x
use x, only : operator(.bar.) => operator(.addfive.)
use y, operator(.my.) => operator(.addfive.)
use z
integer :: i
i = 2
if ((.bar. i) /= 2+25) call abort ()
if ((.my. i) /= 2+15) call abort ()
if ((.addfive. i) /= 2+5) call abort ()
end
! { dg-final { cleanup-tree-dump "x y z" } }
! { dg-do "compile" }
! { dg-options "-std=f95" }
! Renaming of operators
module z
interface operator(.addfive.)
module procedure sub2
end interface
contains
function sub2(x)
integer :: sub
integer,intent(in) :: x
sub2 = x + 5
end function sub2
end module z
module y
interface operator(.addfive.)
module procedure sub
end interface
contains
function sub(x)
integer :: sub
integer,intent(in) :: x
sub = x + 15
end function sub
end module y
module x
interface operator(.addfive.)
module procedure sub
end interface
contains
function sub(x)
integer :: sub
integer,intent(in) :: x
sub = x + 25
end function sub
end module x
use x, only : operator(.bar.) => operator(.addfive.) ! { dg-error "Fortran 2003: Renaming operators in USE statements" }
use y, operator(.my.) => operator(.addfive.) ! { dg-error "Fortran 2003: Renaming operators in USE statements" }
use z
end
! { dg-final { cleanup-tree-dump "x y z" } }
! { dg-do "compile" }
! Renaming of operators
module z
type myT
integer :: t
end type myT
interface operator(+)
module procedure sub2
end interface
contains
function sub2(x)
type(myT) :: sub2
type(myT),intent(in) :: x
sub2%t = x%t + 5
end function sub2
end module z
module y
interface operator(.addfive.)
module procedure sub
end interface
contains
function sub(x)
integer :: sub
integer,intent(in) :: x
sub = x + 15
end function sub
end module y
module x
interface operator(.addfive.)
module procedure sub
end interface
contains
function sub(x)
integer :: sub
integer,intent(in) :: x
sub = x + 25
end function sub
end module x
use z, operator(-) => operator(+) ! { dg-error "Syntax error in USE statement" }
use z, operator(.op.) => operator(+) ! { dg-error "Syntax error in USE statement" }
use x, only : bar => operator(.addfive.) ! { dg-error "Syntax error in USE statement" }
use y, operator(.my.) => sub ! { dg-error "Syntax error in USE statement" }
use y, operator(+) => operator(.addfive.) ! { dg-error "Syntax error in USE statement" }
end
! { dg-final { cleanup-tree-dump "x y z" } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment