https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102916
Bug ID: 102916
Summary: cmath constexpr can lead to ODR violations/incorrect
results
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: Darrell.Wright at gmail dot com
Target Milestone: ---
Because many of the cmath functions are constexpr, even in conformance mode of
the compiler, this can lead to ODR issues. It is detectable in C++20 and gives
incorrect results.
#include <cmath>
template<auto F>
consteval auto foo( ) {
if constexpr (requires {
[]<int>() {}.template operator()<(F(), void(), 0)>();
}) {
return 0;
} else {
return 1;
}
}
auto a = foo<[]{ return std::sqrt( 4.0 ); }>( );
https://gcc.godbolt.org/z/M6zGTbTfM
gcc returns 0, clang/libstdc++ and MSVC return 1.
I believe that in conformance -std=c++20 -pedantic mode that gcc should not
mark these methods as constexpr