Removing GCC compiler warnings from fabsf(), sqrtf()...

C

Charlie Zender

Hi,

First, this may be a GCC or Linux-specific problem, I'm not sure.

I am unable to compile a large body of code with extremely pedantic
compile time checks activate, so that warnings cause errors.
With GCC 3.3.1, I do this with

gcc -I/usr/local/include -g -O2 -std=c99 -pedantic -pedantic
-D_BSD_SOURCE -Wall -Wunused -W -Wmissing-prototypes -Wconversion
-Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings
bug.c -o bug -lm

(This is basically what GSL recommendsd for scientific codes.)

The current problem I have is that the following code (bug.c)

#include <stdio.h>
#include <math.h>
int main()
{
/* float fabsf(float); */
float foo,bar=-9;
foo=fabsf(bar);
fprintf(stdout,"foo = %g\n",foo);
}

produces this warning:

bug.c:7: warning: passing arg 1 of `fabsf' as `float' rather than
`double' due to prototype

_regardless_ of whether the correct fabsf() prototype
(float fabsf(float);) is commented out or not.
Yes, my GNU/Linux system does have fabsf() etc. in libm.a.
Yes, the intrinsics powf(), fabsf(), sqrtf()... cause the same warning.

1. How do I use powf(), fabsf(), sqrtf() etc. with causing compiler
warnings with the above compiler switches?

Thanks to all who have answered my previous three posts!
You've helped me de-lint 90% of my code...if I can fix this
present problem then compiling it with -Werror should work
and thus make catching new bugs at compile time much easier.

Any help appreciated,
Charlie
 
K

Kevin Goodsell

Charlie said:
Hi,

First, this may be a GCC or Linux-specific problem, I'm not sure.

I am unable to compile a large body of code with extremely pedantic
compile time checks activate, so that warnings cause errors.
With GCC 3.3.1, I do this with

gcc -I/usr/local/include -g -O2 -std=c99 -pedantic -pedantic
-D_BSD_SOURCE -Wall -Wunused -W -Wmissing-prototypes -Wconversion
-Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings
bug.c -o bug -lm

This appears to be a gcc issue, not a C issue, which makes it off-topic
in comp.lang.c.
(This is basically what GSL recommendsd for scientific codes.)

The current problem I have is that the following code (bug.c)

#include <stdio.h>
#include <math.h>
int main()
{
/* float fabsf(float); */
float foo,bar=-9;
foo=fabsf(bar);
fprintf(stdout,"foo = %g\n",foo);
}

produces this warning:

bug.c:7: warning: passing arg 1 of `fabsf' as `float' rather than
`double' due to prototype

This warning appears to be a result of the -Wconversion option. You
should probably read up on what the options you are using do.
-Wconversion doesn't look like a good one to use in general (and may be
completely useless in c99 mode).
_regardless_ of whether the correct fabsf() prototype
(float fabsf(float);) is commented out or not.

Yes, my GNU/Linux system does have fabsf() etc. in libm.a.
Yes, the intrinsics powf(), fabsf(), sqrtf()... cause the same warning.

1. How do I use powf(), fabsf(), sqrtf() etc. with causing compiler
warnings with the above compiler switches?

That would seem to be impossible. -Wconversion will result in a warning
for absolutely any code that calls a function that takes a 'float' (or
'short' or 'char'), if I understand correctly.

-Kevin
 
K

Kevin Goodsell

Kevin said:
The correct prototype is in <math.h>. You should almost never provide
prototypes for standard functions.

I should clarify this. You should almost never provide prototypes for
standard functions any way other than by #including the correct standard
header.

-Kevin
 
F

Fred L. Kleinschmidt

Charlie said:
Hi,

First, this may be a GCC or Linux-specific problem, I'm not sure.

I am unable to compile a large body of code with extremely pedantic
compile time checks activate, so that warnings cause errors.
With GCC 3.3.1, I do this with

gcc -I/usr/local/include -g -O2 -std=c99 -pedantic -pedantic
-D_BSD_SOURCE -Wall -Wunused -W -Wmissing-prototypes -Wconversion
-Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings
bug.c -o bug -lm

(This is basically what GSL recommendsd for scientific codes.)

The current problem I have is that the following code (bug.c)

#include <stdio.h>
#include <math.h>
int main()
{
/* float fabsf(float); */
float foo,bar=-9;
foo=fabsf(bar);
fprintf(stdout,"foo = %g\n",foo);
}

produces this warning:

bug.c:7: warning: passing arg 1 of `fabsf' as `float' rather than
`double' due to prototype

_regardless_ of whether the correct fabsf() prototype
(float fabsf(float);) is commented out or not.
Yes, my GNU/Linux system does have fabsf() etc. in libm.a.
Yes, the intrinsics powf(), fabsf(), sqrtf()... cause the same warning.

1. How do I use powf(), fabsf(), sqrtf() etc. with causing compiler
warnings with the above compiler switches?

Thanks to all who have answered my previous three posts!
You've helped me de-lint 90% of my code...if I can fix this
present problem then compiling it with -Werror should work
and thus make catching new bugs at compile time much easier.

Any help appreciated,
Charlie
--
Charlie Zender, (e-mail address removed), (949) 824-2987, Department of Earth
System Science, University of California, Irvine CA 92697-3100
Visiting NCAR 12/13/03--1/17/04: ***********************************
Voice/FAX: (303) 497-1724/1348, Office: Mesa Lab 259b **************

When you write
float func1(float);

float ff, gg;
...
ff = func1(gg);

the compiler will probably still promote gg to a double in the call to
func1 unless your compiler has a switch that specifies not to perform
such promotions.

I have long ago decided never to use floats in a C program - much
simpler and less hassle to always use doubles.
 
C

Charlie Zender

Thanks for the insight. This is very consistent with what's happening.
If true, then there is probably no viable workaround for me.

Charlie
 
B

Barry Schwarz

When you write
float func1(float);

float ff, gg;
...
ff = func1(gg);

the compiler will probably still promote gg to a double in the call to
func1 unless your compiler has a switch that specifies not to perform
such promotions.

It better not. The only time floats are implicitly converted to
doubles is for variadic functions.
I have long ago decided never to use floats in a C program - much
simpler and less hassle to always use doubles.



<<Remove the del for email>>
 
B

Ben Pfaff

Barry Schwarz said:
It better not. The only time floats are implicitly converted to
doubles is for variadic functions.

Expressions: 1.0f + 1;
Initializations: double foo = 1.0f;
Assignments: foo = 1.0f;
etc.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,016
Latest member
TatianaCha

Latest Threads

Top