Constexpr if with a non-bool conditionIs a compiler forced to reject invalid constexpr?clang 3.3 and...
What game did these black and yellow dice come from?
Why did Democrats in the Senate oppose the Born-Alive Abortion Survivors Protection Act (2019 S.130)?
Constexpr if with a non-bool condition
How does Leonard in "Memento" remember reading and writing?
A curious equality of integrals involving the prime counting function?
Is the child responsible for the Parent PLUS Loan when the parent has passed away?
Early credit roll before the end of the film
Why zero tolerance on nudity in space?
How to politely refuse in-office gym instructor for steroids and protein
What is the difference between "...", '...', $'...', and $"..." quotes?
Hilchos Shabbos English Sefer
Why do we have to make "peinlich" start with a capital letter and also end with -s in this sentence?
Is "the fire consumed everything on its way" correct?
Why avoid shared user accounts?
Does Skippy chunky peanut butter contain trans fat?
How much mayhem could I cause as a fish?
Why is Agricola named as such?
Why are all my replica super soldiers young adults or old teenagers?
A starship is travelling at 0.9c and collides with a small rock. Will it leave a clean hole through, or will more happen?
After checking in online, how do I know whether I need to go show my passport at airport check-in?
Square Root Distance from Integers
Citing paywalled articles accessed via illegal web sharing
How do you catch Smeargle in Pokemon Go?
Is there a defined priority for pattern matching?
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
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?
c++ language-lawyer c++17 implicit-conversion compiler-bug
add a comment |
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?
c++ language-lawyer c++17 implicit-conversion compiler-bug
What if you doif constexpr (!!2) {}
?
– Jesper Juhl
1 hour ago
(!!2) will work, but 2 should work too.
– ivan.ukr
1 hour ago
I just checked.!!2
works with clang
– Kerndog73
1 hour ago
add a comment |
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?
c++ language-lawyer c++17 implicit-conversion compiler-bug
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?
c++ language-lawyer c++17 implicit-conversion compiler-bug
c++ language-lawyer c++17 implicit-conversion compiler-bug
asked 1 hour ago
Kerndog73Kerndog73
577724
577724
What if you doif constexpr (!!2) {}
?
– Jesper Juhl
1 hour ago
(!!2) will work, but 2 should work too.
– ivan.ukr
1 hour ago
I just checked.!!2
works with clang
– Kerndog73
1 hour ago
add a comment |
What if you doif constexpr (!!2) {}
?
– Jesper Juhl
1 hour ago
(!!2) will work, but 2 should work too.
– ivan.ukr
1 hour ago
I just checked.!!2
works with clang
– Kerndog73
1 hour ago
What if you do
if constexpr (!!2) {}
?– Jesper Juhl
1 hour ago
What if you do
if constexpr (!!2) {}
?– Jesper Juhl
1 hour ago
(!!2) will work, but 2 should work too.
– ivan.ukr
1 hour ago
(!!2) will work, but 2 should work too.
– ivan.ukr
1 hour ago
I just checked.
!!2
works with clang– Kerndog73
1 hour ago
I just checked.
!!2
works with clang– Kerndog73
1 hour ago
add a comment |
2 Answers
2
active
oldest
votes
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
A bug in the standard! LOL
– Kerndog73
1 hour ago
1
There is a proposal for this, P1401
– Rakete1111
8 mins ago
@Rakete1111 - shamelessly added to the answer :) Thank you!
– StoryTeller
4 mins ago
add a comment |
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.
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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
A bug in the standard! LOL
– Kerndog73
1 hour ago
1
There is a proposal for this, P1401
– Rakete1111
8 mins ago
@Rakete1111 - shamelessly added to the answer :) Thank you!
– StoryTeller
4 mins ago
add a comment |
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
A bug in the standard! LOL
– Kerndog73
1 hour ago
1
There is a proposal for this, P1401
– Rakete1111
8 mins ago
@Rakete1111 - shamelessly added to the answer :) Thank you!
– StoryTeller
4 mins ago
add a comment |
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
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
edited 5 mins ago
answered 1 hour ago
StoryTellerStoryTeller
99.9k12201271
99.9k12201271
A bug in the standard! LOL
– Kerndog73
1 hour ago
1
There is a proposal for this, P1401
– Rakete1111
8 mins ago
@Rakete1111 - shamelessly added to the answer :) Thank you!
– StoryTeller
4 mins ago
add a comment |
A bug in the standard! LOL
– Kerndog73
1 hour ago
1
There is a proposal for this, P1401
– Rakete1111
8 mins ago
@Rakete1111 - shamelessly added to the answer :) Thank you!
– StoryTeller
4 mins ago
A bug in the standard! LOL
– Kerndog73
1 hour ago
A bug in the standard! LOL
– Kerndog73
1 hour ago
1
1
There is a proposal for this, P1401
– Rakete1111
8 mins ago
There is a proposal for this, P1401
– Rakete1111
8 mins ago
@Rakete1111 - shamelessly added to the answer :) Thank you!
– StoryTeller
4 mins ago
@Rakete1111 - shamelessly added to the answer :) Thank you!
– StoryTeller
4 mins ago
add a comment |
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.
add a comment |
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.
add a comment |
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.
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.
answered 1 hour ago
T.C.T.C.
107k14220326
107k14220326
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
What if you do
if constexpr (!!2) {}
?– Jesper Juhl
1 hour ago
(!!2) will work, but 2 should work too.
– ivan.ukr
1 hour ago
I just checked.
!!2
works with clang– Kerndog73
1 hour ago