>Submitter-Id:  net
>Originator:    Matteo Frigo
>Organization:  
>Confidential:  no
>Synopsis:      gcc -Wconversion should warn on implicit 64-bit => 32-bit 
>integral conversions
>Severity:      non-critical
>Priority:      low
>Category:      c
>Class:         change-request 
>Release:       4.0.3 20051201 (prerelease) (Debian 4.0.2-5) (Debian 
>testing/unstable)
>Environment:
System: Linux glauke 2.6.15 #1 Tue Jan 3 20:46:04 CST 2006 ppc GNU/Linux
Architecture: ppc

host: powerpc-unknown-linux-gnu
build: powerpc-unknown-linux-gnu
target: powerpc-unknown-linux-gnu
configured with: ../src/configure -v 
--enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr 
--enable-shared --with-system-zlib --libexecdir=/usr/lib 
--without-included-gettext --enable-threads=posix --enable-nls 
--program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu 
--enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo 
--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr 
--disable-softfloat --enable-targets=powerpc-linux,powerpc64-linux 
--with-cpu=default32 --disable-werror --enable-checking=release 
powerpc-linux-gnu
>Description:

This report suggests a feature that would aid making 32-bit
applications 64-bit clean.

Specifically, consider the following program fragment:

int foo(char *p, char *q)
{
     return p - q;
}

The return type should be ptrdiff_t, but legacy 32-bit code did not
distinguish int from ptrdiff_t.  The implicit conversion ptrdiff_t ->
int is a no-op on ILP32, but loses significant bits on LP64, and most
likely does not correspond to the programmer's intent.

Currently, gcc -m64 -O -Wall -W -Wconversion does not issue any
warning in such situations.  I maintain that a warning would be
useful, and that gcc should support some flag to enable such a
warning. (I emphasize that, with gcc-4.0.3, -Wconversion is not
sufficient.)

I attach below a patch that issues a warning upon problematic implicit
conversions.  (The second warning is probably too obnoxious and should
only be enabled with -pedantic or similar flags.)

I found this patch useful in making fftw 64-bit clean, and I believe
that other programmers would benefit from such a feature.  I noted
that Linus uses the ``sparse'' tool to find problematic narrowing
conversions in the linux kernel, and that even VC++ offers such a
warning.  gcc ought to offer this feature as well.

Thanks for your time.

Regards,
Matteo Frigo

>How-To-Repeat:

>Fix:

--- /tmp/c-common.c     2005-09-01 11:46:46.000000000 -0500
+++ gcc/c-common.c      2006-01-09 22:36:45.000000000 -0600
@@ -987,6 +987,19 @@
 convert_and_check (tree type, tree expr)
 {
   tree t = convert (type, expr);
+
+  if (warn_conversion) {
+       if (TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (expr))) {
+           if (TYPE_PRECISION (type) == 32 &&
+               TYPE_PRECISION (TREE_TYPE (expr)) == 64 &&
+               INTEGRAL_TYPE_P (TREE_TYPE (expr))) {
+                warning ("implicit conversion from integral 64-bit to 32-bit 
type");
+           } else {
+                warning ("implicit conversion to narrower type");
+           }
+       }
+  }
+
   if (TREE_CODE (t) == INTEGER_CST)
     {
       if (TREE_OVERFLOW (t))


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to