clang emits calls to consexpr function.

Hi Devs,

consider below testcase

$cat test.cpp

constexpr int product()
{

return 10*20;
}
int main()
{
const int x = product();
return 0;
}

$./clang test.cpp -std=c++11 -S
$./clang -v
clang version 9.0.0
Target: x86_64-unknown-linux-gnu

$cat test.s

main:
.cfi_startproc

%bb.0:

pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
movl $0, -4(%rbp)
callq _Z7productv //here you can see the calls to product function
xorl %ecx, %ecx
movl %eax, -8(%rbp)
movl %ecx, %eax
addq $16, %rsp
popq %rbp
.cfi_def_cfa %rsp, 8
retq

while g++ do not emits calls to constexpr function
$g++ test.cpp -std=c++11
$cat test.s
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $200, -4(%rbp)
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc

is this bug in clang compiler?

It's not a bug. constexpr just means the value can be used as a
constant, it doesn't mean the compiler *has to* compute it as a
constant. If you turn on some optimization, the call will get inlined
and constant folded: https://gcc.godbolt.org/z/M806yO

And if you define "x" as constexpr instead of const, you will force the
compiler to compute product at compile-time without opimizations
enabled.