diff --git a/llvm/include/llvm/Support/YAMLTraits.h b/llvm/include/llvm/Support/YAMLTraits.h --- a/llvm/include/llvm/Support/YAMLTraits.h +++ b/llvm/include/llvm/Support/YAMLTraits.h @@ -1159,6 +1159,12 @@ static QuotingType mustQuote(StringRef) { return QuotingType::None; } }; +template <> struct ScalarTraits { + static void output(const char &, void *, raw_ostream &); + static StringRef input(StringRef, void *, char &); + static QuotingType mustQuote(StringRef S) { return needsQuotes(S); } +}; + template<> struct ScalarTraits { static void output(const StringRef &, void *, raw_ostream &); diff --git a/llvm/lib/Support/YAMLTraits.cpp b/llvm/lib/Support/YAMLTraits.cpp --- a/llvm/lib/Support/YAMLTraits.cpp +++ b/llvm/lib/Support/YAMLTraits.cpp @@ -864,6 +864,17 @@ return "invalid boolean"; } +void ScalarTraits::output(const char &Val, void *, raw_ostream &Out) { + Out << Val; +} + +StringRef ScalarTraits::input(StringRef Scalar, void *, char &Val) { + if (Scalar.size() != 1) + return "invalid character"; + Val = Scalar[0]; + return StringRef(); +} + void ScalarTraits::output(const StringRef &Val, void *, raw_ostream &Out) { Out << Val; diff --git a/llvm/unittests/Support/YAMLIOTest.cpp b/llvm/unittests/Support/YAMLIOTest.cpp --- a/llvm/unittests/Support/YAMLIOTest.cpp +++ b/llvm/unittests/Support/YAMLIOTest.cpp @@ -333,6 +333,7 @@ uint16_t u16; uint8_t u8; bool b; + char c; int64_t s64; int32_t s32; int16_t s16; @@ -357,6 +358,7 @@ io.mapRequired("u16", bt.u16); io.mapRequired("u8", bt.u8); io.mapRequired("b", bt.b); + io.mapRequired("c", bt.c); io.mapRequired("s64", bt.s64); io.mapRequired("s32", bt.s32); io.mapRequired("s16", bt.s16); @@ -386,6 +388,7 @@ "u16: 65000\n" "u8: 255\n" "b: false\n" + "c: 'c'\n" "s64: -5000000000\n" "s32: -2000000000\n" "s16: -32000\n" @@ -396,7 +399,7 @@ "h16: 0x8765\n" "h32: 0xFEDCBA98\n" "h64: 0xFEDCBA9876543210\n" - "...\n"); + "...\n"); yin >> map; EXPECT_FALSE(yin.error()); @@ -407,6 +410,7 @@ EXPECT_EQ(map.u16, 65000); EXPECT_EQ(map.u8, 255); EXPECT_EQ(map.b, false); + EXPECT_EQ(map.c, 'c'); EXPECT_EQ(map.s64, -5000000000LL); EXPECT_EQ(map.s32, -2000000000L); EXPECT_EQ(map.s16, -32000); @@ -434,6 +438,7 @@ map.u16 = 50000; map.u8 = 254; map.b = true; + map.c = 'd'; map.s64 = -6000000000LL; map.s32 = -2000000000; map.s16 = -32000; @@ -463,6 +468,7 @@ EXPECT_EQ(map.u16, 50000); EXPECT_EQ(map.u8, 254); EXPECT_EQ(map.b, true); + EXPECT_EQ(map.c, 'd'); EXPECT_EQ(map.s64, -6000000000LL); EXPECT_EQ(map.s32, -2000000000L); EXPECT_EQ(map.s16, -32000);