Closed
Description
Bugzilla Link | 52194 |
Version | trunk |
OS | Linux |
CC | @Kered13,@zygoloid |
Extended Description
Minimal example:
constexpr int func(int a)
{
int sum;
sum += a;
return sum;
}
constexpr int val = func(4);
When I compile this on Godbolt using the "x86-64 clang (trunk)" branch and the -std=c++20 flag I get the following error message:
<source>:7:15: error: constexpr variable 'val' must be initialized by a constant expression
constexpr int val = func(4);
^ ~~~~~~~
<source>:4:6: note: subexpression not valid in a constant expression
sum += a;
^
<source>:7:21: note: in call to 'func(4)'
constexpr int val = func(4);
^
1 error generated.
This is misleading because the actual problem is that sum was not initialized. If sum is initialized with sum=0 then there is no error. This problem exists for other modify and assign operators as well. Using separate assignment and equality operators does not have this problem. For example:
constexpr int func(int a)
{
int sum;
sum = sum + a;
return sum;
}
constexpr int val = func(4);
Give this error message:
<source>:7:15: error: constexpr variable 'val' must be initialized by a constant expression
constexpr int val = func(4);
^ ~~~~~~~
<source>:4:8: note: read of uninitialized object is not allowed in a constant expression
sum = sum + a;
^
<source>:7:21: note: in call to 'func(4)'
constexpr int val = func(4);
^
1 error generated.
Which correctly identifies that the problem is that sum is uninitialized.