commit dd1988282def42ac7d859d747ce3ff5cd9b3cb91
Author: Akim Demaille <akim@lrde.epita.fr>
Date:   Mon Jan 26 18:23:12 2015 +0100

    tests: c++: fix symbol lookup issue
    
    Sun C 5.13 SunOS_sparc 2014/10/20 reports errors on tests 430-432.
    
    Reported by Dennis Clarke.
    <http://lists.gnu.org/archive/html/bug-bison/2015-01/msg00087.html>
    
    * tests/c++.at (Variants): Be sure to emit operator<< before using it:
    use "%code top" rather than "%code".
    Prefer std::vector to std::list.
    Do not define anything in std::, to avoid undefined behavior.

diff --git a/tests/c++.at b/tests/c++.at
index 55d7d40..ecefb80 100644
--- a/tests/c++.at
+++ b/tests/c++.at
@@ -96,7 +96,7 @@ AT_SETUP([C++ Variant-based Symbols])
 AT_KEYWORDS([variant])
 
 AT_BISON_OPTION_PUSHDEFS([%skeleton "lalr1.cc" %debug $1])
-# Store strings and integers in a list of strings.
+# Store strings and integers in a vector of strings.
 AT_DATA_GRAMMAR([list.y],
 [[%skeleton "lalr1.cc"
 %define api.value.type variant
@@ -114,20 +114,20 @@ AT_DATA_GRAMMAR([list.y],
 }
 
 %token <int> INT "int"
-%type < std::list<int> > exp
+%type < std::vector<int> > exp
 
 %printer { yyo << $$; } <int>
 %printer
   {
-    for (std::list<int>::const_iterator i = $$.begin (); i != $$.end (); ++i)
+    for (std::vector<int>::const_iterator i = $$.begin (); i != $$.end (); ++i)
       {
         if (i != $$.begin ())
           yyo << ", ";
         yyo << *i;
       }
-  } < std::list<int> >
+  } < std::vector<int> >
 
-%code requires { #include <list> }
+%code requires { #include <vector> }
 %code { int yylex (yy::parser::semantic_type* yylval); }
 
 %%
@@ -185,7 +185,7 @@ m4_pushdef([AT_TEST],
 [AT_SETUP([Variants $1])
 
 AT_BISON_OPTION_PUSHDEFS([%debug $1])
-# Store strings and integers in a list of strings.
+# Store strings and integers in a vector of strings.
 AT_DATA_GRAMMAR([list.y],
 [[%debug
 %define api.value.type variant
@@ -194,41 +194,33 @@ AT_DATA_GRAMMAR([list.y],
 
 %code requires // code for the .hh file
 {
-#include <list>
+#include <vector>
 #include <string>
-typedef std::list<std::string> strings_type;
+typedef std::vector<std::string> strings_type;
 }
 
-%code // code for the .cc file
+%code top // code for the .cc file
 {
 #include <cstdlib> // abort, getenv
 #include <iostream>
+#include <vector>
 #include <sstream>
+#include <string>
 
-  namespace yy
-  {
-    static]AT_TOKEN_CTOR_IF([[
-    parser::symbol_type yylex ()]], [[
-    parser::token_type yylex (parser::semantic_type* yylval]AT_LOCATION_IF([,
-                              parser::location_type* yylloc])[)]])[;
-  }
 
-  // Printing a list of strings (for %printer).
-  // Koening look up will look into std, since that's an std::list.
-  namespace std
+  typedef std::vector<std::string> strings_type;
+
+  std::ostream&
+  operator<<(std::ostream& o, const strings_type& s)
   {
-    std::ostream&
-    operator<<(std::ostream& o, const strings_type& s)
-    {
-      o << '(';
-      for (strings_type::const_iterator i = s.begin (); i != s.end (); ++i)
-        {
-          if (i != s.begin ())
-            o << ", ";
-          o << *i;
-        }
-      return o << ')';
-    }
+    o << '(';
+    for (strings_type::const_iterator i = s.begin (); i != s.end (); ++i)
+      {
+        if (i != s.begin ())
+          o << ", ";
+        o << *i;
+      }
+    return o << ')';
   }
 
   // Conversion to string.
@@ -243,6 +235,17 @@ typedef std::list<std::string> strings_type;
   }
 }
 
+%code
+{
+  namespace yy
+  {
+    static]AT_TOKEN_CTOR_IF([[
+    parser::symbol_type yylex ()]], [[
+    parser::token_type yylex (parser::semantic_type* yylval]AT_LOCATION_IF([,
+                              parser::location_type* yylloc])[)]])[;
+  }
+}
+
 %token <::std::string> TEXT;
 %token <int> NUMBER;
 %token END_OF_FILE 0;
@@ -252,10 +255,10 @@ typedef std::list<std::string> strings_type;
 // Using the template type to exercize its parsing.
 // Starting with :: to ensure we don't output "<::" which starts by the
 // digraph for the left square bracket.
-%type <::std::list<std::string>> list;
+%type <::std::vector<std::string>> list;
 
 %printer { yyo << $$; }
-  <int> <::std::string> <::std::list<std::string>>;
+  <int> <::std::string> <::std::vector<std::string>>;
 %destructor { std::cerr << "Destroy: " << $$ << '\n'; } <*>;
 %destructor { std::cerr << "Destroy: \"" << $$ << "\"\n"; } <::std::string>;
 %%
