Constexpr if with a non-bool condition

  • A+
Category:Languages

I seem to have found something that clang and gcc disagree on. Here's the code:

int main() {   if constexpr (2) {} } 

This successfully compiles with gcc 7.4.0 but fails with clang 7.0.0 with this error message:

test.cpp:3:17: error: constexpr if condition evaluates to 2, which cannot be narrowed to type 'bool'       [-Wc++11-narrowing]   if constexpr (2) {}                 ^ 1 error generated. 

cppreference doesn't seem to mention "narrowing" so this seems like a clang bug but I'm not entirely certain. If this is a bug with either compiler, has it already been reported?

 


Clang is diagnosing under these paragraphs

[stmt.if] (emphasis mine)

2 If the if statement is of the form if constexpr, the value of the condition shall be a contextually converted constant expression of type bool; this form is called a constexpr if statement.

[expr.const]

4 A converted constant expression of type T is an expression, implicitly converted to type T, where the converted expression is a constant expression and the implicit conversion sequence contains only

  • integral conversions other than narrowing conversions,

Now, when it comes to integral conversions, a conversion to bool is listed as an integral conversion. And it is narrowing, in the strictest sense of the word, since a bool cannot represent all the values of an int. So the diagnostic is not without grounds.

But I think it's also quite reasonable to consider the fact a conversion to bool is usually intended to check for "truthiness", and so the narrowing nature of it shouldn't matter. It looks like a minor bug in the standard1, with GCC taking the common-sense route, and Clang adhering to the dry letter of the law in the strictest sense.


1 - And a proposal exists to change it, courtesy of Rakete1111 - https://wg21.link/p1401

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: