Constexpr if with a non-bool conditionIs a compiler forced to reject invalid constexpr?clang 3.3 and...

How would an AI self awareness kill switch work?

Is there any risk in sharing info about technologies and products we use with a supplier?

How should I handle players who ignore the session zero agreement?

Early credit roll before the end of the film

Why would space fleets be aligned?

Alien invasion to probe us, why?

Can I announce prefix 161.117.25.0/24 even though I don't have all of /24 IPs?

How can I play a serial killer in a party of good PCs?

Scripture(s) saying not to look at the sun during his rising and setting time

How does Leonard in "Memento" remember reading and writing?

How do you catch Smeargle in Pokemon Go?

How much mayhem could I cause as a sentient fish?

Clues on how to solve these types of problems within 2-3 minutes for competitive exams

It took me a lot of time to make this, pls like. (YouTube Comments #1)

Why don't key signatures indicate the tonic?

What is the difference between rolling more dice versus fewer dice?

What is the data structure of $@ in shell?

Why zero tolerance on nudity in space?

A Missing Symbol for This Logo

Square Root Distance from Integers

Hilchos Shabbos English Sefer

What is a good reason for every spaceship to carry a weapon on board?

Is it a fallacy if someone claims they need an explanation for every word of your argument to the point where they don't understand common terms?

Is a new boolean field better than null reference when a value can be meaningfully absent?



Constexpr if with a non-bool condition


Is a compiler forced to reject invalid constexpr?clang 3.3 and constexpr constraintsconstexpr bug in clang but not in gcc?Is function pointer comparison in a constexpr function allowed?When is std::string_view::operator== really constexpr?GCC and Clang disagree about C++17 constexpr lambda captures“if constexpr” interaction with “try in constexpr function” warningNested constexpr-if statement in discarded branch is still evaluated?std::variant modification in constexprC++ constexpr function in return statement













18















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 it 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?










share|improve this question

























  • What if you do if constexpr (!!2) {} ?

    – Jesper Juhl
    7 hours ago











  • (!!2) will work, but 2 should work too.

    – ivan.ukr
    7 hours ago






  • 1





    I just checked. !!2 works with clang

    – Kerndog73
    7 hours ago











  • bugs.llvm.org/show_bug.cgi?id=39322 gcc.gnu.org/bugzilla/show_bug.cgi?id=87724#c1

    – Language Lawyer
    33 mins ago
















18















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 it 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?










share|improve this question

























  • What if you do if constexpr (!!2) {} ?

    – Jesper Juhl
    7 hours ago











  • (!!2) will work, but 2 should work too.

    – ivan.ukr
    7 hours ago






  • 1





    I just checked. !!2 works with clang

    – Kerndog73
    7 hours ago











  • bugs.llvm.org/show_bug.cgi?id=39322 gcc.gnu.org/bugzilla/show_bug.cgi?id=87724#c1

    – Language Lawyer
    33 mins ago














18












18








18








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 it 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?










share|improve this question
















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 it 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?







c++ language-lawyer c++17 implicit-conversion compiler-bug






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 1 hour ago









Peter Mortensen

13.7k1986112




13.7k1986112










asked 8 hours ago









Kerndog73Kerndog73

662825




662825













  • What if you do if constexpr (!!2) {} ?

    – Jesper Juhl
    7 hours ago











  • (!!2) will work, but 2 should work too.

    – ivan.ukr
    7 hours ago






  • 1





    I just checked. !!2 works with clang

    – Kerndog73
    7 hours ago











  • bugs.llvm.org/show_bug.cgi?id=39322 gcc.gnu.org/bugzilla/show_bug.cgi?id=87724#c1

    – Language Lawyer
    33 mins ago



















  • What if you do if constexpr (!!2) {} ?

    – Jesper Juhl
    7 hours ago











  • (!!2) will work, but 2 should work too.

    – ivan.ukr
    7 hours ago






  • 1





    I just checked. !!2 works with clang

    – Kerndog73
    7 hours ago











  • bugs.llvm.org/show_bug.cgi?id=39322 gcc.gnu.org/bugzilla/show_bug.cgi?id=87724#c1

    – Language Lawyer
    33 mins ago

















What if you do if constexpr (!!2) {} ?

– Jesper Juhl
7 hours ago





What if you do if constexpr (!!2) {} ?

– Jesper Juhl
7 hours ago













(!!2) will work, but 2 should work too.

– ivan.ukr
7 hours ago





(!!2) will work, but 2 should work too.

– ivan.ukr
7 hours ago




1




1





I just checked. !!2 works with clang

– Kerndog73
7 hours ago





I just checked. !!2 works with clang

– Kerndog73
7 hours ago













bugs.llvm.org/show_bug.cgi?id=39322 gcc.gnu.org/bugzilla/show_bug.cgi?id=87724#c1

– Language Lawyer
33 mins ago





bugs.llvm.org/show_bug.cgi?id=39322 gcc.gnu.org/bugzilla/show_bug.cgi?id=87724#c1

– Language Lawyer
33 mins ago












2 Answers
2






active

oldest

votes


















20














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






share|improve this answer





















  • 5





    A bug in the standard! LOL

    – Kerndog73
    7 hours ago






  • 5





    There is a proposal for this, P1401

    – Rakete1111
    6 hours ago






  • 3





    @Rakete1111 - shamelessly added to the answer :) Thank you!

    – StoryTeller
    6 hours ago





















5














We say it, but it's hidden. "contextually converted constant expression of type bool" is a standard term-of-art that excludes narrowing conversions.



Clang is correct.






share|improve this answer
























  • Did CWG agree that the current wording in the standard is intended?

    – Language Lawyer
    1 hour ago











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54899466%2fconstexpr-if-with-a-non-bool-condition%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









20














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






share|improve this answer





















  • 5





    A bug in the standard! LOL

    – Kerndog73
    7 hours ago






  • 5





    There is a proposal for this, P1401

    – Rakete1111
    6 hours ago






  • 3





    @Rakete1111 - shamelessly added to the answer :) Thank you!

    – StoryTeller
    6 hours ago


















20














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






share|improve this answer





















  • 5





    A bug in the standard! LOL

    – Kerndog73
    7 hours ago






  • 5





    There is a proposal for this, P1401

    – Rakete1111
    6 hours ago






  • 3





    @Rakete1111 - shamelessly added to the answer :) Thank you!

    – StoryTeller
    6 hours ago
















20












20








20







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






share|improve this answer















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







share|improve this answer














share|improve this answer



share|improve this answer








edited 6 hours ago

























answered 7 hours ago









StoryTellerStoryTeller

100k12202272




100k12202272








  • 5





    A bug in the standard! LOL

    – Kerndog73
    7 hours ago






  • 5





    There is a proposal for this, P1401

    – Rakete1111
    6 hours ago






  • 3





    @Rakete1111 - shamelessly added to the answer :) Thank you!

    – StoryTeller
    6 hours ago
















  • 5





    A bug in the standard! LOL

    – Kerndog73
    7 hours ago






  • 5





    There is a proposal for this, P1401

    – Rakete1111
    6 hours ago






  • 3





    @Rakete1111 - shamelessly added to the answer :) Thank you!

    – StoryTeller
    6 hours ago










5




5





A bug in the standard! LOL

– Kerndog73
7 hours ago





A bug in the standard! LOL

– Kerndog73
7 hours ago




5




5





There is a proposal for this, P1401

– Rakete1111
6 hours ago





There is a proposal for this, P1401

– Rakete1111
6 hours ago




3




3





@Rakete1111 - shamelessly added to the answer :) Thank you!

– StoryTeller
6 hours ago







@Rakete1111 - shamelessly added to the answer :) Thank you!

– StoryTeller
6 hours ago















5














We say it, but it's hidden. "contextually converted constant expression of type bool" is a standard term-of-art that excludes narrowing conversions.



Clang is correct.






share|improve this answer
























  • Did CWG agree that the current wording in the standard is intended?

    – Language Lawyer
    1 hour ago
















5














We say it, but it's hidden. "contextually converted constant expression of type bool" is a standard term-of-art that excludes narrowing conversions.



Clang is correct.






share|improve this answer
























  • Did CWG agree that the current wording in the standard is intended?

    – Language Lawyer
    1 hour ago














5












5








5







We say it, but it's hidden. "contextually converted constant expression of type bool" is a standard term-of-art that excludes narrowing conversions.



Clang is correct.






share|improve this answer













We say it, but it's hidden. "contextually converted constant expression of type bool" is a standard term-of-art that excludes narrowing conversions.



Clang is correct.







share|improve this answer












share|improve this answer



share|improve this answer










answered 7 hours ago









T.C.T.C.

107k14220326




107k14220326













  • Did CWG agree that the current wording in the standard is intended?

    – Language Lawyer
    1 hour ago



















  • Did CWG agree that the current wording in the standard is intended?

    – Language Lawyer
    1 hour ago

















Did CWG agree that the current wording in the standard is intended?

– Language Lawyer
1 hour ago





Did CWG agree that the current wording in the standard is intended?

– Language Lawyer
1 hour ago


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54899466%2fconstexpr-if-with-a-non-bool-condition%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Benedict Cumberbatch Contingut Inicis Debut professional Premis Filmografia bàsica Premis i...

Monticle de plataforma Contingut Est de Nord Amèrica Interpretacions Altres cultures Vegeu...

Escacs Janus Enllaços externs Menú de navegacióEscacs JanusJanusschachBrainKing.comChessV