Avoid or warn on implicit conversion from const char* to bool in GCC












22















Consider the following code:



void foo(bool parameter) {
std::cout << parameter << "n";
}

int main() {
foo("const char *argument");
}


I want the compiler to raise a warning when passing const char* instead of bool as a parameter to function foo.



But GCC implicitly converts it. I tried -Wall, -Wextra, and -Wpedantic, but none of these issue a warning. Is there a flag that could catch such an implicit conversion (invalid parameter type)?



Ignore the fact that the function has an argument of type bool, which some may see as bad code style. I can't refactor that part.



The standard just mentions such an implicit conversion will occur:




A prvalue of integral, floating-point, unscoped enumeration, pointer, and pointer-to-member types can be converted to a prvalue of type bool.




I know such behavior is very convenient in if (ptr) statements, but for me, in the case of passing parameters, it is clearly wrong and a source of bugs.










share|improve this question




















  • 7





    ...and good for bad surprises: If there is a function which accepts std::string and another which accepts bool instead, guess which one is chosen for "const char *argument". (Spoiler alert: yes the second - and it drove me crazy until I got a clue.) ;-)

    – Scheff
    15 hours ago






  • 2





    a bit offtopic, but I am puzzled why you think having a bool parameter would be bad coding-style..

    – user463035818
    15 hours ago






  • 1





    @user463035818 "Uncle Bob said so" could be a good reason. He argues that function with bool parameter never has a single responsibility. Uncle Bob has many strong opinions about coding though.

    – Yksisarvinen
    15 hours ago











  • @Yksisarvinen you mean that there should be a fooTrue and a fooFalse instead? Hum, maybe i could agree in some cases, but not in general, though if Bob said so there must be some truth to it

    – user463035818
    15 hours ago











  • You may have another overload void foo(const char *parameter).

    – Hi I'm Frogatto
    15 hours ago
















22















Consider the following code:



void foo(bool parameter) {
std::cout << parameter << "n";
}

int main() {
foo("const char *argument");
}


I want the compiler to raise a warning when passing const char* instead of bool as a parameter to function foo.



But GCC implicitly converts it. I tried -Wall, -Wextra, and -Wpedantic, but none of these issue a warning. Is there a flag that could catch such an implicit conversion (invalid parameter type)?



Ignore the fact that the function has an argument of type bool, which some may see as bad code style. I can't refactor that part.



The standard just mentions such an implicit conversion will occur:




A prvalue of integral, floating-point, unscoped enumeration, pointer, and pointer-to-member types can be converted to a prvalue of type bool.




I know such behavior is very convenient in if (ptr) statements, but for me, in the case of passing parameters, it is clearly wrong and a source of bugs.










share|improve this question




















  • 7





    ...and good for bad surprises: If there is a function which accepts std::string and another which accepts bool instead, guess which one is chosen for "const char *argument". (Spoiler alert: yes the second - and it drove me crazy until I got a clue.) ;-)

    – Scheff
    15 hours ago






  • 2





    a bit offtopic, but I am puzzled why you think having a bool parameter would be bad coding-style..

    – user463035818
    15 hours ago






  • 1





    @user463035818 "Uncle Bob said so" could be a good reason. He argues that function with bool parameter never has a single responsibility. Uncle Bob has many strong opinions about coding though.

    – Yksisarvinen
    15 hours ago











  • @Yksisarvinen you mean that there should be a fooTrue and a fooFalse instead? Hum, maybe i could agree in some cases, but not in general, though if Bob said so there must be some truth to it

    – user463035818
    15 hours ago











  • You may have another overload void foo(const char *parameter).

    – Hi I'm Frogatto
    15 hours ago














22












22








22


2






Consider the following code:



void foo(bool parameter) {
std::cout << parameter << "n";
}

int main() {
foo("const char *argument");
}


I want the compiler to raise a warning when passing const char* instead of bool as a parameter to function foo.



But GCC implicitly converts it. I tried -Wall, -Wextra, and -Wpedantic, but none of these issue a warning. Is there a flag that could catch such an implicit conversion (invalid parameter type)?



Ignore the fact that the function has an argument of type bool, which some may see as bad code style. I can't refactor that part.



The standard just mentions such an implicit conversion will occur:




A prvalue of integral, floating-point, unscoped enumeration, pointer, and pointer-to-member types can be converted to a prvalue of type bool.




I know such behavior is very convenient in if (ptr) statements, but for me, in the case of passing parameters, it is clearly wrong and a source of bugs.










share|improve this question
















Consider the following code:



void foo(bool parameter) {
std::cout << parameter << "n";
}

int main() {
foo("const char *argument");
}


I want the compiler to raise a warning when passing const char* instead of bool as a parameter to function foo.



But GCC implicitly converts it. I tried -Wall, -Wextra, and -Wpedantic, but none of these issue a warning. Is there a flag that could catch such an implicit conversion (invalid parameter type)?



Ignore the fact that the function has an argument of type bool, which some may see as bad code style. I can't refactor that part.



The standard just mentions such an implicit conversion will occur:




A prvalue of integral, floating-point, unscoped enumeration, pointer, and pointer-to-member types can be converted to a prvalue of type bool.




I know such behavior is very convenient in if (ptr) statements, but for me, in the case of passing parameters, it is clearly wrong and a source of bugs.







c++ gcc implicit-conversion gcc-warning






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 9 mins ago









Cody Gray

192k35377464




192k35377464










asked 15 hours ago









Szymon ZimnowodaSzymon Zimnowoda

1215




1215








  • 7





    ...and good for bad surprises: If there is a function which accepts std::string and another which accepts bool instead, guess which one is chosen for "const char *argument". (Spoiler alert: yes the second - and it drove me crazy until I got a clue.) ;-)

    – Scheff
    15 hours ago






  • 2





    a bit offtopic, but I am puzzled why you think having a bool parameter would be bad coding-style..

    – user463035818
    15 hours ago






  • 1





    @user463035818 "Uncle Bob said so" could be a good reason. He argues that function with bool parameter never has a single responsibility. Uncle Bob has many strong opinions about coding though.

    – Yksisarvinen
    15 hours ago











  • @Yksisarvinen you mean that there should be a fooTrue and a fooFalse instead? Hum, maybe i could agree in some cases, but not in general, though if Bob said so there must be some truth to it

    – user463035818
    15 hours ago











  • You may have another overload void foo(const char *parameter).

    – Hi I'm Frogatto
    15 hours ago














  • 7





    ...and good for bad surprises: If there is a function which accepts std::string and another which accepts bool instead, guess which one is chosen for "const char *argument". (Spoiler alert: yes the second - and it drove me crazy until I got a clue.) ;-)

    – Scheff
    15 hours ago






  • 2





    a bit offtopic, but I am puzzled why you think having a bool parameter would be bad coding-style..

    – user463035818
    15 hours ago






  • 1





    @user463035818 "Uncle Bob said so" could be a good reason. He argues that function with bool parameter never has a single responsibility. Uncle Bob has many strong opinions about coding though.

    – Yksisarvinen
    15 hours ago











  • @Yksisarvinen you mean that there should be a fooTrue and a fooFalse instead? Hum, maybe i could agree in some cases, but not in general, though if Bob said so there must be some truth to it

    – user463035818
    15 hours ago











  • You may have another overload void foo(const char *parameter).

    – Hi I'm Frogatto
    15 hours ago








7




7





...and good for bad surprises: If there is a function which accepts std::string and another which accepts bool instead, guess which one is chosen for "const char *argument". (Spoiler alert: yes the second - and it drove me crazy until I got a clue.) ;-)

– Scheff
15 hours ago





...and good for bad surprises: If there is a function which accepts std::string and another which accepts bool instead, guess which one is chosen for "const char *argument". (Spoiler alert: yes the second - and it drove me crazy until I got a clue.) ;-)

– Scheff
15 hours ago




2




2





a bit offtopic, but I am puzzled why you think having a bool parameter would be bad coding-style..

– user463035818
15 hours ago





a bit offtopic, but I am puzzled why you think having a bool parameter would be bad coding-style..

– user463035818
15 hours ago




1




1





@user463035818 "Uncle Bob said so" could be a good reason. He argues that function with bool parameter never has a single responsibility. Uncle Bob has many strong opinions about coding though.

– Yksisarvinen
15 hours ago





@user463035818 "Uncle Bob said so" could be a good reason. He argues that function with bool parameter never has a single responsibility. Uncle Bob has many strong opinions about coding though.

– Yksisarvinen
15 hours ago













@Yksisarvinen you mean that there should be a fooTrue and a fooFalse instead? Hum, maybe i could agree in some cases, but not in general, though if Bob said so there must be some truth to it

– user463035818
15 hours ago





@Yksisarvinen you mean that there should be a fooTrue and a fooFalse instead? Hum, maybe i could agree in some cases, but not in general, though if Bob said so there must be some truth to it

– user463035818
15 hours ago













You may have another overload void foo(const char *parameter).

– Hi I'm Frogatto
15 hours ago





You may have another overload void foo(const char *parameter).

– Hi I'm Frogatto
15 hours ago












2 Answers
2






active

oldest

votes


















25














You could declare an overload of foo for pointers as deleted:



template <class T>
void foo(T*) = delete;


Or better yet, as @Ted comments, simply declare a vanilla overload to not compile any implicit conversions:



template <class T>
void foo(T) = delete;





share|improve this answer





















  • 2





    Not wrong but in a real world example these are probably (multiple) functions (maybe even from other files/sources) and that could make this seem quite exhausting.

    – Stack Danny
    15 hours ago






  • 3





    Starting from C++11, you shoul actually declare it as deleted… this will generate earlier and more meaningful error messages. Alternatively, declare it with a body that raises a static_assert if T is not bool (template is ill-formed if it always raises a static_assert, that's the only reason for this check).

    – Arne Vogel
    15 hours ago






  • 2





    ... or just void foo(T) = delete; to delete all implicit conversions.

    – Ted Lyngmo
    14 hours ago



















15















I want the compiler to raise a warning when passing const char* instead of bool as a parameter to function foo. ... I tried -Wall, -Wextra, and -Wpedantic




You need to add -Wconversion to your compiler flags. Note that seems to work with clang (recent or older version), but not with gcc.



If this triggers too many warnings that you don't want to handle, you can selectively enable -Wstring-conversion (clang only).






share|improve this answer





















  • 1





    I tried but without luck: Live Demo on coliru. Did I oversee something?

    – Scheff
    15 hours ago






  • 1





    @Scheff Weird, it seems to be handled differently in clang and gcc. Updated the answer accordingly.

    – lubgr
    15 hours ago








  • 1





    I just found this The new Wconversion option and in fact the implicit conversion from const char* to bool isn't mentioned at all. Looks like it isn't covered in gcc...

    – Scheff
    15 hours ago











  • @Scheff fwiw also no error/warning for uniform initialization of a bool with a const char*

    – user463035818
    15 hours 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%2f54515792%2favoid-or-warn-on-implicit-conversion-from-const-char-to-bool-in-gcc%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









25














You could declare an overload of foo for pointers as deleted:



template <class T>
void foo(T*) = delete;


Or better yet, as @Ted comments, simply declare a vanilla overload to not compile any implicit conversions:



template <class T>
void foo(T) = delete;





share|improve this answer





















  • 2





    Not wrong but in a real world example these are probably (multiple) functions (maybe even from other files/sources) and that could make this seem quite exhausting.

    – Stack Danny
    15 hours ago






  • 3





    Starting from C++11, you shoul actually declare it as deleted… this will generate earlier and more meaningful error messages. Alternatively, declare it with a body that raises a static_assert if T is not bool (template is ill-formed if it always raises a static_assert, that's the only reason for this check).

    – Arne Vogel
    15 hours ago






  • 2





    ... or just void foo(T) = delete; to delete all implicit conversions.

    – Ted Lyngmo
    14 hours ago
















25














You could declare an overload of foo for pointers as deleted:



template <class T>
void foo(T*) = delete;


Or better yet, as @Ted comments, simply declare a vanilla overload to not compile any implicit conversions:



template <class T>
void foo(T) = delete;





share|improve this answer





















  • 2





    Not wrong but in a real world example these are probably (multiple) functions (maybe even from other files/sources) and that could make this seem quite exhausting.

    – Stack Danny
    15 hours ago






  • 3





    Starting from C++11, you shoul actually declare it as deleted… this will generate earlier and more meaningful error messages. Alternatively, declare it with a body that raises a static_assert if T is not bool (template is ill-formed if it always raises a static_assert, that's the only reason for this check).

    – Arne Vogel
    15 hours ago






  • 2





    ... or just void foo(T) = delete; to delete all implicit conversions.

    – Ted Lyngmo
    14 hours ago














25












25








25







You could declare an overload of foo for pointers as deleted:



template <class T>
void foo(T*) = delete;


Or better yet, as @Ted comments, simply declare a vanilla overload to not compile any implicit conversions:



template <class T>
void foo(T) = delete;





share|improve this answer















You could declare an overload of foo for pointers as deleted:



template <class T>
void foo(T*) = delete;


Or better yet, as @Ted comments, simply declare a vanilla overload to not compile any implicit conversions:



template <class T>
void foo(T) = delete;






share|improve this answer














share|improve this answer



share|improve this answer








edited 13 hours ago









Ted Lyngmo

2,5211317




2,5211317










answered 15 hours ago









Paul EvansPaul Evans

19k32038




19k32038








  • 2





    Not wrong but in a real world example these are probably (multiple) functions (maybe even from other files/sources) and that could make this seem quite exhausting.

    – Stack Danny
    15 hours ago






  • 3





    Starting from C++11, you shoul actually declare it as deleted… this will generate earlier and more meaningful error messages. Alternatively, declare it with a body that raises a static_assert if T is not bool (template is ill-formed if it always raises a static_assert, that's the only reason for this check).

    – Arne Vogel
    15 hours ago






  • 2





    ... or just void foo(T) = delete; to delete all implicit conversions.

    – Ted Lyngmo
    14 hours ago














  • 2





    Not wrong but in a real world example these are probably (multiple) functions (maybe even from other files/sources) and that could make this seem quite exhausting.

    – Stack Danny
    15 hours ago






  • 3





    Starting from C++11, you shoul actually declare it as deleted… this will generate earlier and more meaningful error messages. Alternatively, declare it with a body that raises a static_assert if T is not bool (template is ill-formed if it always raises a static_assert, that's the only reason for this check).

    – Arne Vogel
    15 hours ago






  • 2





    ... or just void foo(T) = delete; to delete all implicit conversions.

    – Ted Lyngmo
    14 hours ago








2




2





Not wrong but in a real world example these are probably (multiple) functions (maybe even from other files/sources) and that could make this seem quite exhausting.

– Stack Danny
15 hours ago





Not wrong but in a real world example these are probably (multiple) functions (maybe even from other files/sources) and that could make this seem quite exhausting.

– Stack Danny
15 hours ago




3




3





Starting from C++11, you shoul actually declare it as deleted… this will generate earlier and more meaningful error messages. Alternatively, declare it with a body that raises a static_assert if T is not bool (template is ill-formed if it always raises a static_assert, that's the only reason for this check).

– Arne Vogel
15 hours ago





Starting from C++11, you shoul actually declare it as deleted… this will generate earlier and more meaningful error messages. Alternatively, declare it with a body that raises a static_assert if T is not bool (template is ill-formed if it always raises a static_assert, that's the only reason for this check).

– Arne Vogel
15 hours ago




2




2





... or just void foo(T) = delete; to delete all implicit conversions.

– Ted Lyngmo
14 hours ago





... or just void foo(T) = delete; to delete all implicit conversions.

– Ted Lyngmo
14 hours ago













15















I want the compiler to raise a warning when passing const char* instead of bool as a parameter to function foo. ... I tried -Wall, -Wextra, and -Wpedantic




You need to add -Wconversion to your compiler flags. Note that seems to work with clang (recent or older version), but not with gcc.



If this triggers too many warnings that you don't want to handle, you can selectively enable -Wstring-conversion (clang only).






share|improve this answer





















  • 1





    I tried but without luck: Live Demo on coliru. Did I oversee something?

    – Scheff
    15 hours ago






  • 1





    @Scheff Weird, it seems to be handled differently in clang and gcc. Updated the answer accordingly.

    – lubgr
    15 hours ago








  • 1





    I just found this The new Wconversion option and in fact the implicit conversion from const char* to bool isn't mentioned at all. Looks like it isn't covered in gcc...

    – Scheff
    15 hours ago











  • @Scheff fwiw also no error/warning for uniform initialization of a bool with a const char*

    – user463035818
    15 hours ago
















15















I want the compiler to raise a warning when passing const char* instead of bool as a parameter to function foo. ... I tried -Wall, -Wextra, and -Wpedantic




You need to add -Wconversion to your compiler flags. Note that seems to work with clang (recent or older version), but not with gcc.



If this triggers too many warnings that you don't want to handle, you can selectively enable -Wstring-conversion (clang only).






share|improve this answer





















  • 1





    I tried but without luck: Live Demo on coliru. Did I oversee something?

    – Scheff
    15 hours ago






  • 1





    @Scheff Weird, it seems to be handled differently in clang and gcc. Updated the answer accordingly.

    – lubgr
    15 hours ago








  • 1





    I just found this The new Wconversion option and in fact the implicit conversion from const char* to bool isn't mentioned at all. Looks like it isn't covered in gcc...

    – Scheff
    15 hours ago











  • @Scheff fwiw also no error/warning for uniform initialization of a bool with a const char*

    – user463035818
    15 hours ago














15












15








15








I want the compiler to raise a warning when passing const char* instead of bool as a parameter to function foo. ... I tried -Wall, -Wextra, and -Wpedantic




You need to add -Wconversion to your compiler flags. Note that seems to work with clang (recent or older version), but not with gcc.



If this triggers too many warnings that you don't want to handle, you can selectively enable -Wstring-conversion (clang only).






share|improve this answer
















I want the compiler to raise a warning when passing const char* instead of bool as a parameter to function foo. ... I tried -Wall, -Wextra, and -Wpedantic




You need to add -Wconversion to your compiler flags. Note that seems to work with clang (recent or older version), but not with gcc.



If this triggers too many warnings that you don't want to handle, you can selectively enable -Wstring-conversion (clang only).







share|improve this answer














share|improve this answer



share|improve this answer








edited 13 hours ago









Peter Mortensen

13.6k1984111




13.6k1984111










answered 15 hours ago









lubgrlubgr

11.5k21846




11.5k21846








  • 1





    I tried but without luck: Live Demo on coliru. Did I oversee something?

    – Scheff
    15 hours ago






  • 1





    @Scheff Weird, it seems to be handled differently in clang and gcc. Updated the answer accordingly.

    – lubgr
    15 hours ago








  • 1





    I just found this The new Wconversion option and in fact the implicit conversion from const char* to bool isn't mentioned at all. Looks like it isn't covered in gcc...

    – Scheff
    15 hours ago











  • @Scheff fwiw also no error/warning for uniform initialization of a bool with a const char*

    – user463035818
    15 hours ago














  • 1





    I tried but without luck: Live Demo on coliru. Did I oversee something?

    – Scheff
    15 hours ago






  • 1





    @Scheff Weird, it seems to be handled differently in clang and gcc. Updated the answer accordingly.

    – lubgr
    15 hours ago








  • 1





    I just found this The new Wconversion option and in fact the implicit conversion from const char* to bool isn't mentioned at all. Looks like it isn't covered in gcc...

    – Scheff
    15 hours ago











  • @Scheff fwiw also no error/warning for uniform initialization of a bool with a const char*

    – user463035818
    15 hours ago








1




1





I tried but without luck: Live Demo on coliru. Did I oversee something?

– Scheff
15 hours ago





I tried but without luck: Live Demo on coliru. Did I oversee something?

– Scheff
15 hours ago




1




1





@Scheff Weird, it seems to be handled differently in clang and gcc. Updated the answer accordingly.

– lubgr
15 hours ago







@Scheff Weird, it seems to be handled differently in clang and gcc. Updated the answer accordingly.

– lubgr
15 hours ago






1




1





I just found this The new Wconversion option and in fact the implicit conversion from const char* to bool isn't mentioned at all. Looks like it isn't covered in gcc...

– Scheff
15 hours ago





I just found this The new Wconversion option and in fact the implicit conversion from const char* to bool isn't mentioned at all. Looks like it isn't covered in gcc...

– Scheff
15 hours ago













@Scheff fwiw also no error/warning for uniform initialization of a bool with a const char*

– user463035818
15 hours ago





@Scheff fwiw also no error/warning for uniform initialization of a bool with a const char*

– user463035818
15 hours 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%2f54515792%2favoid-or-warn-on-implicit-conversion-from-const-char-to-bool-in-gcc%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

Knooppunt Holsloot

Altaar (religie)

Gregoriusmis