Disallow presentation_type `c` in combination with `bool` arg 
This fixes #3726 by throwing an error in the case that std::format is used with an arg type of `bool` and presentation type of `c`/character format. Added a test as well.
{"label": "fmtlib:master", "ref": "master", "sha": "f5750892436a667fe622e5ecc8a02c15a5d9bc88"}
While applying massive random tests with generated format-specs, it turned out that the `c` presentation-type is allowed for `bool`. 

```cpp
    std::string_view constexpr formatString{"{:X<#9c}"}; // invalid format string
    std::cout << fmt::format(formatString, false) << std::endl; // accepted, compile error expected
    std::cout << std::format(formatString, false) << std::endl; // rejected, compiler error as expected
```

[godbolt](https://www.godbolt.org/z/xzbsdq49o)

While writing for `false` the value is missing
```cpp
    std::string_view constexpr formatString{"{:X<#2c}"};
    auto const s1{fmt::format(formatString, false)};
    std::cout << s1 << std::endl; // prints "X"
```
[godbolt](https://www.godbolt.org/z/ccz388zMr)

for `true` the output seems to include uninitialized memory (unprintable chars)
```cpp
    std::string_view constexpr formatString{"{:X<#2c}"};
    auto const s1{fmt::format(formatString, false)};
    std::cout << s1 << std::endl; // prints "?X", where ? is an unprintable char
```
[godbolt](https://www.godbolt.org/z/W5dGjK5h9)
presentation_type `c` accepted in combination with `bool`
diff --git a/include/fmt/core.h b/include/fmt/core.h
index 2fcaf845ba5f..b19abf37095d 100644
--- a/include/fmt/core.h
+++ b/include/fmt/core.h
@@ -2429,6 +2429,7 @@ FMT_CONSTEXPR FMT_INLINE auto parse_format_specs(
     case 'G':
       return parse_presentation_type(pres::general_upper, float_set);
     case 'c':
+      if (arg_type == type::bool_type) throw_format_error("invalid format specifier");
       return parse_presentation_type(pres::chr, integral_set);
     case 's':
       return parse_presentation_type(pres::string,

diff --git a/test/format-test.cc b/test/format-test.cc
index 34eb28a3374c..0a9924bf9bf9 100644
--- a/test/format-test.cc
+++ b/test/format-test.cc
@@ -1159,6 +1159,8 @@ TEST(format_test, format_bool) {
   EXPECT_EQ("true", fmt::format("{:s}", true));
   EXPECT_EQ("false", fmt::format("{:s}", false));
   EXPECT_EQ("false ", fmt::format("{:6s}", false));
+  EXPECT_THROW_MSG((void)fmt::format(runtime("{:c}"), false), format_error,
+                   "invalid format specifier");
 }
 
 TEST(format_test, format_short) {

{"format-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"compile-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "ostream-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "ranges-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "std-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "core-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "scan-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "color-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "chrono-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "gtest-extra-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "args-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "compile-fp-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "unicode-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "assert-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "posix-mock-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "printf-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "enforce-checks-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "format-impl-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "os-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}, "xchar-test": {"run": "PASS", "test": "PASS", "fix": "PASS"}}
{"format-test": {"run": "PASS", "test": "NONE", "fix": "PASS"}}
{"passed_count": 20, "failed_count": 0, "skipped_count": 0, "passed_tests": ["compile-test", "core-test", "chrono-test", "gtest-extra-test", "compile-fp-test", "unicode-test", "assert-test", "enforce-checks-test", "format-impl-test", "os-test", "xchar-test", "ostream-test", "ranges-test", "std-test", "scan-test", "color-test", "format-test", "args-test", "posix-mock-test", "printf-test"], "failed_tests": [], "skipped_tests": []}
{"passed_count": 19, "failed_count": 0, "skipped_count": 0, "passed_tests": ["compile-test", "core-test", "chrono-test", "gtest-extra-test", "compile-fp-test", "unicode-test", "assert-test", "enforce-checks-test", "format-impl-test", "os-test", "xchar-test", "ostream-test", "ranges-test", "std-test", "scan-test", "color-test", "args-test", "posix-mock-test", "printf-test"], "failed_tests": [], "skipped_tests": []}
{"passed_count": 20, "failed_count": 0, "skipped_count": 0, "passed_tests": ["compile-test", "core-test", "chrono-test", "gtest-extra-test", "compile-fp-test", "unicode-test", "assert-test", "enforce-checks-test", "format-impl-test", "os-test", "xchar-test", "ostream-test", "ranges-test", "std-test", "scan-test", "color-test", "format-test", "args-test", "posix-mock-test", "printf-test"], "failed_tests": [], "skipped_tests": []}