diff --git a/src/nodebuilder.cpp b/src/nodebuilder.cpp index aed6581..837dfdb 100644 --- a/src/nodebuilder.cpp +++ b/src/nodebuilder.cpp @@ -97,8 +97,9 @@ void NodeBuilder::OnMapEnd() { assert(m_mapDepth > 0); detail::node& collection = *m_stack.back(); auto& toMerge = *m_mergeDicts.rbegin(); - for (detail::node* n : toMerge) { - MergeMapCollection(collection, *n, m_pMemory); + /// The elements for merging should be traversed in reverse order to prefer last values. + for (auto it = toMerge.rbegin(); it != toMerge.rend(); ++it) { + MergeMapCollection(collection, **it, m_pMemory); } m_mapDepth--; m_mergeDicts.pop_back(); diff --git a/test/integration/load_node_test.cpp b/test/integration/load_node_test.cpp index 8ca2d35..f6dab49 100644 --- a/test/integration/load_node_test.cpp +++ b/test/integration/load_node_test.cpp @@ -199,6 +199,23 @@ TEST(LoadNodeTest, MergeKeyAIterator) { ASSERT_EQ(z_b_keys, 1); } +TEST(LoadNodeTest, MergeKeyTwoOverrides) { + Node node = Load(R"( +trait1: &t1 + foo: 1 + +trait2: &t2 + foo: 2 + +merged: + <<: *t1 + <<: *t2 +)"); + EXPECT_EQ(NodeType::Map, node["merged"].Type()); + EXPECT_FALSE(node["merged"]["<<"]); + EXPECT_EQ(2, node["merged"]["foo"].as()); +} + TEST(LoadNodeTest, MergeKeyB) { Node node = Load( "{x: &foo {a : 1,b : 1,c : 1}, y: &bar {d: 2, e : 2, f : 2, a : 2}, z: " @@ -211,7 +228,7 @@ TEST(LoadNodeTest, MergeKeyB) { EXPECT_EQ(3, node["z"]["b"].as()); EXPECT_EQ(1, node["z"]["c"].as()); - EXPECT_EQ(1, node["w"]["a"].as()); + EXPECT_EQ(2, node["w"]["a"].as()); EXPECT_EQ(3, node["w"]["b"].as()); EXPECT_EQ(4, node["w"]["c"].as()); EXPECT_EQ(2, node["w"]["d"].as());