This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[fortran,patch] Extend symbol.c's check_conflict (PR29657)
- From: Tobias Burnus <burnus at net-b dot de>
- To: "'fortran at gcc dot gnu dot org'" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Sun, 12 Nov 2006 00:07:22 +0100
- Subject: [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