- Notifications
You must be signed in to change notification settings - Fork14.5k
Closed
Description
Consider the code:
#include<type_traits>#include<cmath>#include<iostream>template<classInteger>constexpr Integerbitwise_sqrt(const Integer& x){// TODO put real code here, doesn't need it for the bug case thoughreturn0;}template<classInteger>constexpr Integerfast_sqrt(const Integer& x){returnstatic_cast<Integer>(std::sqrt(static_cast<double>(x)));}template<classInteger>constexpr Integerget_sqrt(const Integer& x){if(std::is_constant_evaluated())returnbitwise_sqrt(x);returnfast_sqrt(x);}intmain(){unsigned i; std::cin >> i; i =get_sqrt(i); std::cout << i << std::endl;}
Input comes fromstd::cin
, I assume we can all agree that in this contextget_sqrt()
can not be a constant context. However,std::is_constant_evaluated()
is returning true.
Note that:
- The issue only occurs when compiling with
-std=c++2b
. - The issue does not occur prior to clang-14.
- The issue does not occur if we use
__builtin_is_constant_evaluated()
directly. - Reproduced on Ubuntu-22 with
ubuntu clang version 14.0.0-1ubuntu1
This is a reduced test case fromBoost.Multiprecision
BTW.