]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[multiple changes]
authorTobias Burnus <burnus@net-b.de>
Thu, 8 Mar 2007 13:11:54 +0000 (14:11 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Thu, 8 Mar 2007 13:11:54 +0000 (14:11 +0100)
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

gcc/fortran/ChangeLog
gcc/fortran/gfortran.texi
gcc/fortran/module.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/use_5.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/use_6.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/use_7.f90 [new file with mode: 0644]

index 3580963bdef337ef5fc9d9800003d83adf655596..b7e4c4ad34c7e3856e7ef6d7b06856a6bed8b474 100644 (file)
@@ -1,3 +1,10 @@
+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
index 3f4a14943c24a5ae602c6e190ee6022c7e16ec3e..52b4c2c1c8c0d8bb3f1eb2dbefef4eb99ed7cf8b 100644 (file)
@@ -764,6 +764,9 @@ host-associated derived types.
 attribute; supported intrinsic modules: @code{ISO_FORTRAN_ENV},
 @code{OMP_LIB} and @code{OMP_LIB_KINDS}.
 
+@item
+Renaming of operators in the @code{USE} statement.
+
 @end itemize
 
 
index fcae6bd7d3f7671d861f4beca342d1ea56b846b7..5b8bd550f9a351c6a3e5e91672817fd0175f3163 100644 (file)
@@ -488,7 +488,7 @@ gfc_match_use (void)
 {
   char name[GFC_MAX_SYMBOL_LEN + 1], module_nature[GFC_MAX_SYMBOL_LEN + 1];
   gfc_use_rename *tail = NULL, *new;
-  interface_type type;
+  interface_type type, type2;
   gfc_intrinsic_op operator;
   match m;
 
@@ -588,9 +588,16 @@ gfc_match_use (void)
          gfc_error ("Missing generic specification in USE statement at %C");
          goto cleanup;
 
+       case INTERFACE_USER_OP:
        case INTERFACE_GENERIC:
          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 (m != MATCH_YES)
@@ -598,8 +605,9 @@ gfc_match_use (void)
              else
                {
                  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)
                    goto syntax;
                  if (m == MATCH_ERROR)
@@ -612,7 +620,9 @@ gfc_match_use (void)
                goto syntax;
              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)
                goto syntax;
              if (m == MATCH_ERROR)
@@ -627,11 +637,10 @@ gfc_match_use (void)
              goto cleanup;
            }
 
-         break;
+         if (type == INTERFACE_USER_OP)
+           new->operator = operator;
 
-       case INTERFACE_USER_OP:
-         strcpy (new->use_name, name);
-         /* Fall through */
+         break;
 
        case INTERFACE_INTRINSIC_OP:
          new->operator = operator;
index dbc2c1fe91b859767456def23eee684dd57a96ed..cef80b0e2548c7abd563dbff95ea3f644644fcac 100644 (file)
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/testsuite/gfortran.dg/use_5.f90 b/gcc/testsuite/gfortran.dg/use_5.f90
new file mode 100644 (file)
index 0000000..6d2de04
--- /dev/null
@@ -0,0 +1,49 @@
+! { 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" } }
diff --git a/gcc/testsuite/gfortran.dg/use_6.f90 b/gcc/testsuite/gfortran.dg/use_6.f90
new file mode 100644 (file)
index 0000000..f0b133e
--- /dev/null
@@ -0,0 +1,45 @@
+! { 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" } }
diff --git a/gcc/testsuite/gfortran.dg/use_7.f90 b/gcc/testsuite/gfortran.dg/use_7.f90
new file mode 100644 (file)
index 0000000..3973176
--- /dev/null
@@ -0,0 +1,49 @@
+! { 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" } }