X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=unittests%2FSupport%2FYAMLIOTest.cpp;h=43d8397d1ed0346ed8aff87701ab09cc2a96b43d;hb=90c782a9ca9bc9325e9a1f075890311c15dfeb0e;hp=a39fbebf295d2f7c378bae54d2230359b708ecc5;hpb=5e1b31bf5588cd9ea0b16e94fcc1d908e40027e2;p=oota-llvm.git diff --git a/unittests/Support/YAMLIOTest.cpp b/unittests/Support/YAMLIOTest.cpp index a39fbebf295..43d8397d1ed 100644 --- a/unittests/Support/YAMLIOTest.cpp +++ b/unittests/Support/YAMLIOTest.cpp @@ -600,9 +600,9 @@ TEST(YAMLIO, TestReadWriteMyFlowSequence) { map.numbers.push_back(1024); llvm::raw_string_ostream ostr(intermediate); - Output yout(ostr); + Output yout(ostr); yout << map; - + // Verify sequences were written in flow style ostr.flush(); llvm::StringRef flowOut(intermediate); @@ -782,18 +782,16 @@ namespace yaml { struct MappingTraits { static void mapping(IO &io, KindAndFlags& kf) { io.mapRequired("kind", kf.kind); - // type of flags field varies depending on kind field - + // Type of "flags" field varies depending on "kind" field. // Use memcpy here to avoid breaking strict aliasing rules. - if ( kf.kind == kindA ) { - AFlags aflags; - memcpy(&aflags, &kf.flags, sizeof(aflags)); + if (kf.kind == kindA) { + AFlags aflags = static_cast(kf.flags); io.mapRequired("flags", aflags); - } - else { - BFlags bflags; - memcpy(&bflags, &kf.flags, sizeof(bflags)); + kf.flags = aflags; + } else { + BFlags bflags = static_cast(kf.flags); io.mapRequired("flags", bflags); + kf.flags = bflags; } } }; @@ -1299,3 +1297,66 @@ TEST(YAMLIO, TestReadBuiltInTypesHex64Error) { EXPECT_TRUE(yin.error()); } +struct OptionalTest { + std::vector Numbers; +}; + +struct OptionalTestSeq { + std::vector Tests; +}; + +LLVM_YAML_IS_SEQUENCE_VECTOR(OptionalTest) +namespace llvm { +namespace yaml { + template <> + struct MappingTraits { + static void mapping(IO& IO, OptionalTest &OT) { + IO.mapOptional("Numbers", OT.Numbers); + } + }; + + template <> + struct MappingTraits { + static void mapping(IO &IO, OptionalTestSeq &OTS) { + IO.mapOptional("Tests", OTS.Tests); + } + }; +} +} + +TEST(YAMLIO, SequenceElideTest) { + // Test that writing out a purely optional structure with its fields set to + // default followed by other data is properly read back in. + OptionalTestSeq Seq; + OptionalTest One, Two, Three, Four; + int N[] = {1, 2, 3}; + Three.Numbers.assign(N, N + 3); + Seq.Tests.push_back(One); + Seq.Tests.push_back(Two); + Seq.Tests.push_back(Three); + Seq.Tests.push_back(Four); + + std::string intermediate; + { + llvm::raw_string_ostream ostr(intermediate); + Output yout(ostr); + yout << Seq; + } + + Input yin(intermediate); + OptionalTestSeq Seq2; + yin >> Seq2; + + EXPECT_FALSE(yin.error()); + + EXPECT_EQ(4UL, Seq2.Tests.size()); + + EXPECT_TRUE(Seq2.Tests[0].Numbers.empty()); + EXPECT_TRUE(Seq2.Tests[1].Numbers.empty()); + + EXPECT_EQ(1, Seq2.Tests[2].Numbers[0]); + EXPECT_EQ(2, Seq2.Tests[2].Numbers[1]); + EXPECT_EQ(3, Seq2.Tests[2].Numbers[2]); + + EXPECT_TRUE(Seq2.Tests[3].Numbers.empty()); +}