]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/47023 (C_Sizeof: Rejects valid code)
authorJanus Weil <janus@gcc.gnu.org>
Wed, 19 Oct 2011 22:05:23 +0000 (00:05 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Wed, 19 Oct 2011 22:05:23 +0000 (00:05 +0200)
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-19  Janus Weil  <janus@gcc.gnu.org>

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

From-SVN: r180210

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 f7a793f056cfa7f32624b09c0905daa88c8d20de..a350ff29a38ffdf3dbe671a09a7cb5650f225a91 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 eb8b3e1b2a21e4bad76801d3c3a9d1fca25e4645..bf4559203b1b9efc28a79ba944917dd797225ccc 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 11f87a57308278cc3f3c92583afe963dc68602c4..084cd15ea6f4931d3c2d8d47532c9aa38cddece3 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 4b0d3bfbf8ae89655bc36cd262a850255edb853d..23f1e5fff1feb4231921f7f26adf01aa4e9a8175 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