This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[fortran,patch] Extend symbol.c's check_conflict (PR29657)


:ADDPATCH fortran:

This patch adds the following conflicts:

* FUNCTION name conflicts with SAVE
* SUBROUTINE name conflicts with DIMENSION
* PROGRAM and MODULE names conflicts with DIMENSION
Those should be obvious. I couldn't find a good reference, though.


* DUMMY ARGUMENTS conflict with ENTRY
This is explicitly forbidden in Fortran 2003
C1255

* DUMMY ARGUMENTS conflict with INTRINSIC
It it not stated as allowed - contrary to EXTERNAL where it is
explicitly allowed (see 12.3.2.2)

Test case tested with NAG f95, ifort, sunf95, which find all those
conflicts.

Bootstrapped and regtested on x86_64-unknown-linux-gnu.

Tobias


fortran/
2006-11-11  Tobias Burnus  <burnus@net-b.de>

    * symbol.c (check_conflict): Add further conflicts.

testsuite/
2006-11-11  Tobias Burnus  <burnus@net-b.de>

    * gfortran.dg/conflicts.f90: Add.
Index: gcc/fortran/symbol.c
===================================================================
*** gcc/fortran/symbol.c	(Revision 118703)
--- gcc/fortran/symbol.c	(Arbeitskopie)
*************** check_conflict (symbol_attribute * attr,
*** 318,323 ****
--- 318,325 ----
  	}
      }
  
+   conf (dummy, entry);
+   conf (dummy, intrinsic);
    conf (dummy, save);
    conf (dummy, threadprivate);
    conf (pointer, target);
*************** check_conflict (symbol_attribute * attr,
*** 427,432 ****
--- 429,435 ----
      case FL_BLOCK_DATA:
      case FL_MODULE:
      case FL_LABEL:
+       conf2 (dimension);
        conf2 (dummy);
        conf2 (save);
        conf2 (pointer);
*************** check_conflict (symbol_attribute * attr,
*** 448,462 ****
  
      case FL_PROCEDURE:
        conf2 (intent);
  
        if (attr->subroutine)
  	{
- 	  conf2(save);
  	  conf2(pointer);
  	  conf2(target);
  	  conf2(allocatable);
  	  conf2(result);
  	  conf2(in_namelist);
  	  conf2(function);
  	  conf2(threadprivate);
  	}
--- 451,466 ----
  
      case FL_PROCEDURE:
        conf2 (intent);
+       conf2(save);
  
        if (attr->subroutine)
  	{
  	  conf2(pointer);
  	  conf2(target);
  	  conf2(allocatable);
  	  conf2(result);
  	  conf2(in_namelist);
+ 	  conf2(dimension);
  	  conf2(function);
  	  conf2(threadprivate);
  	}
--- /dev/null	2006-10-21 23:34:46.000000000 +0200
+++ gcc/testsuite/gfortran.dg/conflicts.f90	2006-11-11 22:15:10.000000000 +0100
@@ -0,0 +1,51 @@
+! { dg-do compile }
+! Check for conflicts
+! PR fortran/29657
+
+function f1() ! { dg-error "has no IMPLICIT type" }
+  implicit none
+  real, save :: f1 ! { dg-error "PROCEDURE attribute conflicts with SAVE attribute" }
+  f1 = 1.0
+end function f1
+
+function f2()
+  implicit none
+  real :: f2
+  save f2 ! { dg-error "PROCEDURE attribute conflicts with SAVE attribute" }
+  f2 = 1.0
+end function f2
+
+subroutine f3()
+  implicit none
+  dimension f3(3) ! { dg-error "PROCEDURE attribute conflicts with DIMENSION attribute" }
+end subroutine f3
+
+subroutine f4(b)
+  implicit none
+  real :: b
+  entry b ! { dg-error "DUMMY attribute conflicts with ENTRY attribute" }
+end subroutine f4
+
+function f5(a)
+  implicit none
+  real :: a,f5
+  entry a ! { dg-error "DUMMY attribute conflicts with ENTRY attribute" }
+  f5 = 3.4
+end function f5
+
+subroutine f6(cos)
+  implicit none
+  real :: cos
+  intrinsic cos ! { dg-error "DUMMY attribute conflicts with INTRINSIC attribute" }
+end subroutine f6
+
+subroutine f7(sin)
+  implicit none
+  real :: sin
+  external sin
+end subroutine f7
+
+program test
+  implicit none
+  dimension test(3) ! { dg-error "PROGRAM attribute conflicts with DIMENSION attribute" }
+end program test

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]