https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104426
Bug ID: 104426
Summary: -fsanitize=undefined causes constexpr failures
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: pdimov at gmail dot com
Target Milestone: ---
The following program
```
struct category
{
constexpr bool failed() const noexcept
{
return true;
}
};
inline constexpr category s_cat;
struct condition
{
category const* cat_;
constexpr bool failed() const noexcept
{
if( cat_ )
{
return cat_->failed();
}
else
{
return false;
}
}
};
int main()
{
constexpr condition cond{ &s_cat };
static_assert( cond.failed() );
}
```
compiles without -fsanitize=undefined (https://godbolt.org/z/Pn9M5ocfz), but
fails with it (https://godbolt.org/z/KKc8Tb9qe) with
```
<source>: In function 'int main()':
<source>:31:31: error: non-constant condition for static assertion
31 | static_assert( cond.failed() );
| ~~~~~~~~~~~^~
<source>:31:31: in 'constexpr' expansion of 'cond.condition::failed()'
<source>:17:13: error: '((& s_cat) != 0)' is not a constant expression
17 | if( cat_ )
| ^~~~
```
This happens under all GCC versions starting from 7.
(The above is an extract from the test suite for
boost::system::error_condition.)