https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80756
--- Comment #1 from Vincent Lefèvre <vincent-gcc at vinc17 dot net> --- The cause seems to be that the functions are builtins: $ gcc-snapshot -std=c99 -c tst-cst.c tst-cst.c: In function 'f': tst-cst.c:7:21: error: initializer element is not constant static double x = fabs (3.0); ^~~~ tst-cst.c:8:21: error: initializer element is not constant 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); ^~~ But I think that this is wrong. The use of -std=c99 shouldn't allow builtin functions when they would give a different result (and even without -std=c99, as this would be confusing). On this point, Clang has the same issue.