OSDN Git Service

2011-10-19 Janus Weil <janus@gcc.gnu.org>
authorjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 Oct 2011 22:05:23 +0000 (22:05 +0000)
committerjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 19 Oct 2011 22:05:23 +0000 (22:05 +0000)
PR fortran/47023
* check.c (gfc_check_sizeof): Reject procedures as argument of SIZEOF.
* intrinsinc.texi (SIZEOF): Document it.
(STORAGE_SIZE): Fix special characters. Fix line breaks.

2011-10-19  Janus Weil  <janus@gcc.gnu.org>

PR fortran/47023
* gfortran.dg/sizeof_proc.f90: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180210 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/check.c
gcc/fortran/intrinsic.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/sizeof_proc.f90 [new file with mode: 0644]

index f7a793f..a350ff2 100644 (file)
@@ -1,3 +1,10 @@
+2011-10-19  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/47023
+       * check.c (gfc_check_sizeof): Reject procedures as argument of SIZEOF.
+       * intrinsinc.texi (SIZEOF): Document it.
+       (STORAGE_SIZE): Fix special characters. Fix line breaks.
+
 2011-10-18  Mikael Morin  <mikael@gcc.gnu.org>
 
        PR fortran/50420
index eb8b3e1..bf45592 100644 (file)
@@ -3444,8 +3444,15 @@ gfc_check_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
 
 
 gfc_try
-gfc_check_sizeof (gfc_expr *arg ATTRIBUTE_UNUSED)
+gfc_check_sizeof (gfc_expr *arg)
 {
+  if (arg->ts.type == BT_PROCEDURE)
+    {
+      gfc_error ("'%s' argument of '%s' intrinsic at %L may not be a procedure",
+                gfc_current_intrinsic_arg[0]->name, gfc_current_intrinsic,
+                &arg->where);
+      return FAILURE;
+    }
   return SUCCESS;
 }
 
index 11f87a5..084cd15 100644 (file)
@@ -11459,7 +11459,8 @@ number of bytes occupied by the argument.  If the argument has the
 to is returned.  If the argument is of a derived type with @code{POINTER}
 or @code{ALLOCATABLE} components, the return value doesn't account for
 the sizes of the data pointed to by these components. If the argument is
-polymorphic, the size according to the declared type is returned.
+polymorphic, the size according to the declared type is returned. The argument
+may not be a procedure or procedure pointer.
 
 @item @emph{Example}:
 @smallexample
@@ -11816,8 +11817,10 @@ Inquiry function
 @end multitable
 
 @item @emph{Return Value}:
-The result is a scalar integer with the kind type parameter specified by KIND (or default integer type if KIND is missing). The result value is the size expressed in bits for an element of an array that
-has the dynamic type and type parameters of A.
+The result is a scalar integer with the kind type parameter specified by KIND
+(or default integer type if KIND is missing). The result value is the size
+expressed in bits for an element of an array that has the dynamic type and type
+parameters of A.
 
 @item @emph{See also}:
 @ref{C_SIZEOF}, @ref{SIZEOF}
index 4b0d3bf..23f1e5f 100644 (file)
@@ -1,3 +1,8 @@
+2011-10-19  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/47023
+       * gfortran.dg/sizeof_proc.f90: New.
+
 2011-10-19  Joseph Myers  <joseph@codesourcery.com>
 
        * g++.dg/compat/struct-layout-1_generate.c: Also pass -mno-mmx
diff --git a/gcc/testsuite/gfortran.dg/sizeof_proc.f90 b/gcc/testsuite/gfortran.dg/sizeof_proc.f90
new file mode 100644 (file)
index 0000000..b4a2d73
--- /dev/null
@@ -0,0 +1,28 @@
+! { dg-do compile }
+!
+! PR 47023: C_Sizeof: Rejects valid code
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+use iso_c_binding
+procedure(real) :: proc
+procedure(real), pointer :: pp
+pp => sin
+
+print *,sizeof(proc)    ! { dg-error "may not be a procedure" }
+print *,sizeof(pp)      ! { dg-error "may not be a procedure" }
+print *,sizeof(pp(0.))
+print *,sizeof(sub)     ! { dg-error "may not be a procedure" }
+print *,sizeof(func)    ! { dg-error "may not be a procedure" }
+print *,sizeof(func())
+
+contains
+
+  subroutine sub
+  end subroutine
+
+  real function func()
+    func = 0.
+  end function
+
+end