<div dir="ltr">On Mon, Sep 9, 2013 at 7:20 PM, fil <span dir="ltr"><<a href="mailto:fil@pobox.com" target="_blank">fil@pobox.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Sebastian Redl wrote<br>
<div class="im">> I believe the simple test that makes the code above not compile does not<br>
> evaluate potential results of conditional expressions: only one branch<br>
> needs to be a constant expression, and the test does not reason about<br>
> "value == value" always taking one branch. So the version with the<br>
> tautological test will compile by itself, but you'll never be able to use<br>
> it in a constexpr context, versus the simple function above is recognized<br>
> as not being constexpr.<br>
><br>
> Making built-in functions with simple arithmetic meanings constexpr is a<br>
> different issue.<br>
<br>
</div>Thanks for the reply. Two questions:<br>
<br>
1. know of a way to use builtin functions (like clz) in a constexpr context?<br>
I am figuring I need to re-implement it, no way to use the CPU instruction<br>
at compile time (?)<br></blockquote><div><br></div><div>__builtin_clz works in constant expressions in recent Clang revisions. You only need to upgrade =)</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

2. why does a branch allow it to be compiled? I would have thought that the<br>
compiler would inspect both branches and insist they both be a const<br>
friendly.<br></blockquote><div><br></div><div>The compiler does inspect both branches, but it only insists that *one* of them is constexpr-friendly. It's valid for a ?: to select between a potentially-constant expression and a never-constant expression within a constexpr function.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
So, I should expect the branched version compile to fail if I actually use<br>
it in a constexpr context?</blockquote><div><br></div><div>Yes.</div></div></div></div>