Blob Blame History Raw
ArcMap stores a reference to the key along with the value.  The test code in
this file creates temporary Arc objects as the keys.  Therefore the ArcMap has
a reference to an object that the compiler is free to stomp on at any time.
With GCC 9.0, we find that the compiler in fact does so, leading to test
failures.  The same happens with temporary ReaderConverter and WriterConverter
objects, which are passed by reference into the various maps.

The fix is to pass references to named stack objects that stay in scope for
the duration of the test.

diff -up lemon-1.3.1/test/lgf_reader_writer_test.cc.orig lemon-1.3.1/test/lgf_reader_writer_test.cc
--- lemon-1.3.1/test/lgf_reader_writer_test.cc.orig	2014-07-07 08:40:24.980315892 -0600
+++ lemon-1.3.1/test/lgf_reader_writer_test.cc	2019-04-02 16:18:11.597915989 -0600
@@ -51,12 +51,13 @@ void checkDigraphReaderCompile() {
   int attr;
 
   lemon::DigraphReader<Digraph> reader(digraph, "filename");
+  ReaderConverter readerConverter;
   reader.nodeMap("node_map", node_map);
-  reader.nodeMap("node_map", node_map, ReaderConverter());
+  reader.nodeMap("node_map", node_map, readerConverter);
   reader.arcMap("arc_map", arc_map);
-  reader.arcMap("arc_map", arc_map, ReaderConverter());
+  reader.arcMap("arc_map", arc_map, readerConverter);
   reader.attribute("attr", attr);
-  reader.attribute("attr", attr, ReaderConverter());
+  reader.attribute("attr", attr, readerConverter);
   reader.node("node", node);
   reader.arc("arc", arc);
 
@@ -64,10 +65,11 @@ void checkDigraphReaderCompile() {
   reader.arcs("alt_arcs_caption");
   reader.attributes("alt_attrs_caption");
 
+  WriterConverter writerConverter;
   reader.useNodes(node_map);
-  reader.useNodes(node_map, WriterConverter());
+  reader.useNodes(node_map, writerConverter);
   reader.useArcs(arc_map);
-  reader.useArcs(arc_map, WriterConverter());
+  reader.useArcs(arc_map, writerConverter);
 
   reader.skipNodes();
   reader.skipArcs();
@@ -87,12 +89,13 @@ void checkDigraphWriterCompile() {
   int attr;
 
   lemon::DigraphWriter<Digraph> writer(digraph, "filename");
+  WriterConverter writerConverter;
   writer.nodeMap("node_map", node_map);
-  writer.nodeMap("node_map", node_map, WriterConverter());
+  writer.nodeMap("node_map", node_map, writerConverter);
   writer.arcMap("arc_map", arc_map);
-  writer.arcMap("arc_map", arc_map, WriterConverter());
+  writer.arcMap("arc_map", arc_map, writerConverter);
   writer.attribute("attr", attr);
-  writer.attribute("attr", attr, WriterConverter());
+  writer.attribute("attr", attr, writerConverter);
   writer.node("node", node);
   writer.arc("arc", arc);
 
@@ -119,14 +122,15 @@ void checkGraphReaderCompile() {
   int attr;
 
   lemon::GraphReader<Graph> reader(graph, "filename");
+  ReaderConverter readerConverter;
   reader.nodeMap("node_map", node_map);
-  reader.nodeMap("node_map", node_map, ReaderConverter());
+  reader.nodeMap("node_map", node_map, readerConverter);
   reader.arcMap("arc_map", arc_map);
-  reader.arcMap("arc_map", arc_map, ReaderConverter());
+  reader.arcMap("arc_map", arc_map, readerConverter);
   reader.edgeMap("edge_map", edge_map);
-  reader.edgeMap("edge_map", edge_map, ReaderConverter());
+  reader.edgeMap("edge_map", edge_map, readerConverter);
   reader.attribute("attr", attr);
-  reader.attribute("attr", attr, ReaderConverter());
+  reader.attribute("attr", attr, readerConverter);
   reader.node("node", node);
   reader.arc("arc", arc);
 
@@ -134,10 +138,11 @@ void checkGraphReaderCompile() {
   reader.edges("alt_edges_caption");
   reader.attributes("alt_attrs_caption");
 
+  WriterConverter writerConverter;
   reader.useNodes(node_map);
-  reader.useNodes(node_map, WriterConverter());
+  reader.useNodes(node_map, writerConverter);
   reader.useEdges(edge_map);
-  reader.useEdges(edge_map, WriterConverter());
+  reader.useEdges(edge_map, writerConverter);
 
   reader.skipNodes();
   reader.skipEdges();
@@ -159,14 +164,15 @@ void checkGraphWriterCompile() {
   int attr;
 
   lemon::GraphWriter<Graph> writer(graph, "filename");
+  WriterConverter writerConverter;
   writer.nodeMap("node_map", node_map);
-  writer.nodeMap("node_map", node_map, WriterConverter());
+  writer.nodeMap("node_map", node_map, writerConverter);
   writer.arcMap("arc_map", arc_map);
-  writer.arcMap("arc_map", arc_map, WriterConverter());
+  writer.arcMap("arc_map", arc_map, writerConverter);
   writer.edgeMap("edge_map", edge_map);
-  writer.edgeMap("edge_map", edge_map, WriterConverter());
+  writer.edgeMap("edge_map", edge_map, writerConverter);
   writer.attribute("attr", attr);
-  writer.attribute("attr", attr, WriterConverter());
+  writer.attribute("attr", attr, writerConverter);
   writer.node("node", node);
   writer.arc("arc", arc);
   writer.edge("edge", edge);
@@ -200,18 +206,19 @@ void checkBpGraphReaderCompile() {
   int attr;
 
   lemon::BpGraphReader<BpGraph> reader(graph, "filename");
+  ReaderConverter readerConverter;
   reader.nodeMap("node_map", node_map);
-  reader.nodeMap("node_map", node_map, ReaderConverter());
+  reader.nodeMap("node_map", node_map, readerConverter);
   reader.redNodeMap("red_node_map", red_node_map);
-  reader.redNodeMap("red_node_map", red_node_map, ReaderConverter());
+  reader.redNodeMap("red_node_map", red_node_map, readerConverter);
   reader.blueNodeMap("blue_node_map", blue_node_map);
-  reader.blueNodeMap("blue_node_map", blue_node_map, ReaderConverter());
+  reader.blueNodeMap("blue_node_map", blue_node_map, readerConverter);
   reader.arcMap("arc_map", arc_map);
-  reader.arcMap("arc_map", arc_map, ReaderConverter());
+  reader.arcMap("arc_map", arc_map, readerConverter);
   reader.edgeMap("edge_map", edge_map);
-  reader.edgeMap("edge_map", edge_map, ReaderConverter());
+  reader.edgeMap("edge_map", edge_map, readerConverter);
   reader.attribute("attr", attr);
-  reader.attribute("attr", attr, ReaderConverter());
+  reader.attribute("attr", attr, readerConverter);
   reader.node("node", node);
   reader.redNode("red_node", red_node);
   reader.blueNode("blue_node", blue_node);
@@ -221,10 +228,11 @@ void checkBpGraphReaderCompile() {
   reader.edges("alt_edges_caption");
   reader.attributes("alt_attrs_caption");
 
+  WriterConverter writerConverter;
   reader.useNodes(node_map);
-  reader.useNodes(node_map, WriterConverter());
+  reader.useNodes(node_map, writerConverter);
   reader.useEdges(edge_map);
-  reader.useEdges(edge_map, WriterConverter());
+  reader.useEdges(edge_map, writerConverter);
 
   reader.skipNodes();
   reader.skipEdges();
@@ -250,18 +258,19 @@ void checkBpGraphWriterCompile() {
   int attr;
 
   lemon::BpGraphWriter<BpGraph> writer(graph, "filename");
+  WriterConverter writerConverter;
   writer.nodeMap("node_map", node_map);
-  writer.nodeMap("node_map", node_map, WriterConverter());
+  writer.nodeMap("node_map", node_map, writerConverter);
   writer.redNodeMap("red_node_map", red_node_map);
-  writer.redNodeMap("red_node_map", red_node_map, WriterConverter());
+  writer.redNodeMap("red_node_map", red_node_map, writerConverter);
   writer.blueNodeMap("blue_node_map", blue_node_map);
-  writer.blueNodeMap("blue_node_map", blue_node_map, WriterConverter());
+  writer.blueNodeMap("blue_node_map", blue_node_map, writerConverter);
   writer.arcMap("arc_map", arc_map);
-  writer.arcMap("arc_map", arc_map, WriterConverter());
+  writer.arcMap("arc_map", arc_map, writerConverter);
   writer.edgeMap("edge_map", edge_map);
-  writer.edgeMap("edge_map", edge_map, WriterConverter());
+  writer.edgeMap("edge_map", edge_map, writerConverter);
   writer.attribute("attr", attr);
-  writer.attribute("attr", attr, WriterConverter());
+  writer.attribute("attr", attr, writerConverter);
   writer.node("node", node);
   writer.redNode("red_node", red_node);
   writer.blueNode("blue_node", blue_node);
@@ -302,15 +311,16 @@ void checkDigraphReaderWriter() {
 
   std::ostringstream os;
   lemon::DigraphWriter<Digraph> writer(digraph, os);
+  WriterConverter writerConverter;
 
   writer.nodeMap("node_map1", node_map);
-  writer.nodeMap("node_map2", node_map, WriterConverter());
+  writer.nodeMap("node_map2", node_map, writerConverter);
   writer.arcMap("arc_map1", arc_map);
-  writer.arcMap("arc_map2", arc_map, WriterConverter());
+  writer.arcMap("arc_map2", arc_map, writerConverter);
   writer.node("node", n2);
   writer.arc("arc", a1);
   writer.attribute("attr1", attr);
-  writer.attribute("attr2", attr, WriterConverter());
+  writer.attribute("attr2", attr, writerConverter);
 
   writer.run();
 
@@ -327,15 +337,16 @@ void checkDigraphReaderWriter() {
 
   std::istringstream is(os.str());
   lemon::DigraphReader<ExpDigraph> reader(exp_digraph, is);
+  ReaderConverter readerConverter;
 
   reader.nodeMap("node_map1", exp_node_map1);
-  reader.nodeMap("node_map2", exp_node_map2, ReaderConverter());
+  reader.nodeMap("node_map2", exp_node_map2, readerConverter);
   reader.arcMap("arc_map1", exp_arc_map1);
-  reader.arcMap("arc_map2", exp_arc_map2, ReaderConverter());
+  reader.arcMap("arc_map2", exp_arc_map2, readerConverter);
   reader.node("node", exp_n2);
   reader.arc("arc", exp_a1);
   reader.attribute("attr1", exp_attr1);
-  reader.attribute("attr2", exp_attr2, ReaderConverter());
+  reader.attribute("attr2", exp_attr2, readerConverter);
 
   reader.run();
 
@@ -368,28 +379,34 @@ void checkGraphReaderWriter() {
   edge_map[e1] = 21;
   edge_map[e2] = 22;
 
+  Graph::Arc a1 = graph.direct(e1, true);
+  Graph::Arc a2 = graph.direct(e1, false);
+  Graph::Arc a3 = graph.direct(e2, true);
+  Graph::Arc a4 = graph.direct(e2, false);
+
   Graph::ArcMap<int> arc_map(graph);
-  arc_map[graph.direct(e1, true)] = 211;
-  arc_map[graph.direct(e1, false)] = 212;
-  arc_map[graph.direct(e2, true)] = 221;
-  arc_map[graph.direct(e2, false)] = 222;
+  arc_map[a1] = 211;
+  arc_map[a2] = 212;
+  arc_map[a3] = 221;
+  arc_map[a4] = 222;
 
   int attr = 100;
 
   std::ostringstream os;
   lemon::GraphWriter<Graph> writer(graph, os);
+  WriterConverter writerConverter;
 
   writer.nodeMap("node_map1", node_map);
-  writer.nodeMap("node_map2", node_map, WriterConverter());
+  writer.nodeMap("node_map2", node_map, writerConverter);
   writer.edgeMap("edge_map1", edge_map);
-  writer.edgeMap("edge_map2", edge_map, WriterConverter());
+  writer.edgeMap("edge_map2", edge_map, writerConverter);
   writer.arcMap("arc_map1", arc_map);
-  writer.arcMap("arc_map2", arc_map, WriterConverter());
+  writer.arcMap("arc_map2", arc_map, writerConverter);
   writer.node("node", n2);
   writer.edge("edge", e1);
-  writer.arc("arc", graph.direct(e1, false));
+  writer.arc("arc", a2);
   writer.attribute("attr1", attr);
-  writer.attribute("attr2", attr, WriterConverter());
+  writer.attribute("attr2", attr, writerConverter);
 
   writer.run();
 
@@ -409,18 +426,19 @@ void checkGraphReaderWriter() {
 
   std::istringstream is(os.str());
   lemon::GraphReader<ExpGraph> reader(exp_graph, is);
+  ReaderConverter readerConverter;
 
   reader.nodeMap("node_map1", exp_node_map1);
-  reader.nodeMap("node_map2", exp_node_map2, ReaderConverter());
+  reader.nodeMap("node_map2", exp_node_map2, readerConverter);
   reader.edgeMap("edge_map1", exp_edge_map1);
-  reader.edgeMap("edge_map2", exp_edge_map2, ReaderConverter());
+  reader.edgeMap("edge_map2", exp_edge_map2, readerConverter);
   reader.arcMap("arc_map1", exp_arc_map1);
-  reader.arcMap("arc_map2", exp_arc_map2, ReaderConverter());
+  reader.arcMap("arc_map2", exp_arc_map2, readerConverter);
   reader.node("node", exp_n2);
   reader.edge("edge", exp_e1);
   reader.arc("arc", exp_a1);
   reader.attribute("attr1", exp_attr1);
-  reader.attribute("attr2", exp_attr2, ReaderConverter());
+  reader.attribute("attr2", exp_attr2, readerConverter);
 
   reader.run();
 
@@ -470,34 +488,40 @@ void checkBpGraphReaderWriter() {
   edge_map[e1] = 21;
   edge_map[e2] = 22;
 
+  Graph::Arc a1 = graph.direct(e1, true);
+  Graph::Arc a2 = graph.direct(e1, false);
+  Graph::Arc a3 = graph.direct(e2, true);
+  Graph::Arc a4 = graph.direct(e2, false);
+
   Graph::ArcMap<int> arc_map(graph);
-  arc_map[graph.direct(e1, true)] = 211;
-  arc_map[graph.direct(e1, false)] = 212;
-  arc_map[graph.direct(e2, true)] = 221;
-  arc_map[graph.direct(e2, false)] = 222;
+  arc_map[a1] = 211;
+  arc_map[a2] = 212;
+  arc_map[a3] = 221;
+  arc_map[a4] = 222;
 
   int attr = 100;
 
   std::ostringstream os;
   lemon::BpGraphWriter<Graph> writer(graph, os);
+  WriterConverter writerConverter;
 
   writer.nodeMap("node_map1", node_map);
-  writer.nodeMap("node_map2", node_map, WriterConverter());
+  writer.nodeMap("node_map2", node_map, writerConverter);
   writer.nodeMap("red_node_map1", red_node_map);
-  writer.nodeMap("red_node_map2", red_node_map, WriterConverter());
+  writer.nodeMap("red_node_map2", red_node_map, writerConverter);
   writer.nodeMap("blue_node_map1", blue_node_map);
-  writer.nodeMap("blue_node_map2", blue_node_map, WriterConverter());
+  writer.nodeMap("blue_node_map2", blue_node_map, writerConverter);
   writer.edgeMap("edge_map1", edge_map);
-  writer.edgeMap("edge_map2", edge_map, WriterConverter());
+  writer.edgeMap("edge_map2", edge_map, writerConverter);
   writer.arcMap("arc_map1", arc_map);
-  writer.arcMap("arc_map2", arc_map, WriterConverter());
+  writer.arcMap("arc_map2", arc_map, writerConverter);
   writer.node("node", n);
   writer.redNode("red_node", rn1);
   writer.blueNode("blue_node", bn2);
   writer.edge("edge", e1);
-  writer.arc("arc", graph.direct(e1, false));
+  writer.arc("arc", a2);
   writer.attribute("attr1", attr);
-  writer.attribute("attr2", attr, WriterConverter());
+  writer.attribute("attr2", attr, writerConverter);
 
   writer.run();
 
@@ -523,24 +547,25 @@ void checkBpGraphReaderWriter() {
 
   std::istringstream is(os.str());
   lemon::BpGraphReader<ExpGraph> reader(exp_graph, is);
+  ReaderConverter readerConverter;
 
   reader.nodeMap("node_map1", exp_node_map1);
-  reader.nodeMap("node_map2", exp_node_map2, ReaderConverter());
+  reader.nodeMap("node_map2", exp_node_map2, readerConverter);
   reader.redNodeMap("red_node_map1", exp_red_node_map1);
-  reader.redNodeMap("red_node_map2", exp_red_node_map2, ReaderConverter());
+  reader.redNodeMap("red_node_map2", exp_red_node_map2, readerConverter);
   reader.blueNodeMap("blue_node_map1", exp_blue_node_map1);
-  reader.blueNodeMap("blue_node_map2", exp_blue_node_map2, ReaderConverter());
+  reader.blueNodeMap("blue_node_map2", exp_blue_node_map2, readerConverter);
   reader.edgeMap("edge_map1", exp_edge_map1);
-  reader.edgeMap("edge_map2", exp_edge_map2, ReaderConverter());
+  reader.edgeMap("edge_map2", exp_edge_map2, readerConverter);
   reader.arcMap("arc_map1", exp_arc_map1);
-  reader.arcMap("arc_map2", exp_arc_map2, ReaderConverter());
+  reader.arcMap("arc_map2", exp_arc_map2, readerConverter);
   reader.node("node", exp_n);
   reader.redNode("red_node", exp_rn1);
   reader.blueNode("blue_node", exp_bn2);
   reader.edge("edge", exp_e1);
   reader.arc("arc", exp_a1);
   reader.attribute("attr1", exp_attr1);
-  reader.attribute("attr2", exp_attr2, ReaderConverter());
+  reader.attribute("attr2", exp_attr2, readerConverter);
 
   reader.run();