[Bug c/80756] New: missing diagnostic on non-constant expression with function call such as fabs or fma in initializer
vincent-gcc at vinc17 dot net
gcc-bugzilla@gcc.gnu.org
Mon May 15 11:03:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80756
Bug ID: 80756
Summary: missing diagnostic on non-constant expression with
function call such as fabs or fma in initializer
Product: gcc
Version: 6.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: vincent-gcc at vinc17 dot net
Target Milestone: ---
GCC misses a diagnostic when the fabs() or fma() function is used in an
initializer. For instance, consider:
----------------------------------------
double fabs (double);
double fma (double, double, double);
double foo (double, double, double);
double f (void)
{
static double x = fabs (3.0);
static double y = fma (2.0, 3.0, 4.0);
static double z = foo (2.0, 3.0, 4.0);
return x + y + z;
}
----------------------------------------
$ gcc-snapshot -std=c99 -c tst-cst.c
tst-cst.c: In function 'f':
tst-cst.c:9:21: error: initializer element is not constant
static double z = foo (2.0, 3.0, 4.0);
^~~
where gcc-snapshot is:
gcc version 8.0.0 20170512 (experimental) [trunk revision 247986] (Debian
20170512-1)
I get the diagnostic as expected for foo(), but not for fabs() and fma().
Note that <math.h> is not included, so that fabs() and fma() must not be
regarded as special. But even when these functions are regarded as ISO C's
specified ones, the diagnostic should probably still be present (it seems that
the C standard does not make an exception for such functions, unfortunately).
Same problem with GCC 6.3.0. But GCC 5.4.1 gives:
$ gcc-5 -std=c99 -c tst-cst.c
tst-cst.c: In function ‘f’:
tst-cst.c:7:21: warning: initializer element is not a constant expression
static double x = fabs (3.0);
^
tst-cst.c:8:21: warning: initializer element is not a constant expression
static double y = fma (2.0, 3.0, 4.0);
^
tst-cst.c:9:21: error: initializer element is not constant
static double z = foo (2.0, 3.0, 4.0);
^
As far as the C standard is concerned, there are no differences between
warnings and errors (all diagnostics), so that this is much better. But this
should really be an error in all cases.
As a comparison, Clang gives 3 "error" diagnostics (tested 3.6 to 4.0 RC1):
$ clang-4.0 -c tst-cst.c
tst-cst.c:7:21: error: initializer element is not a compile-time constant
static double x = fabs (3.0);
^~~~~~~~~~
tst-cst.c:8:21: error: initializer element is not a compile-time constant
static double y = fma (2.0, 3.0, 4.0);
^~~~~~~~~~~~~~~~~~~
tst-cst.c:9:21: error: initializer element is not a compile-time constant
static double z = foo (2.0, 3.0, 4.0);
^~~~~~~~~~~~~~~~~~~
3 errors generated.
More information about the Gcc-bugs
mailing list