commit 952416114729b95209dccfc4edacfc1ff13b4e82 Author: Akim Demaille 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. * 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..60292f4 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" -%type < std::list > exp +%type < std::vector > exp %printer { yyo << $$; } %printer { - for (std::list::const_iterator i = $$.begin (); i != $$.end (); ++i) + for (std::vector::const_iterator i = $$.begin (); i != $$.end (); ++i) { if (i != $$.begin ()) yyo << ", "; yyo << *i; } - } < std::list > + } < std::vector > -%code requires { #include } +%code requires { #include } %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,29 +194,25 @@ AT_DATA_GRAMMAR([list.y], %code requires // code for the .hh file { -#include +#include #include -typedef std::list strings_type; +typedef std::vector strings_type; } -%code // code for the .cc file +%code top // code for the .cc file. { #include // abort, getenv #include +#include #include +#include - 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 strings_type; + + namespace yy { + // Must be available early, as is used in %destructor. std::ostream& operator<<(std::ostream& o, const strings_type& s) { @@ -230,16 +226,27 @@ typedef std::list strings_type; return o << ')'; } } +} - // Conversion to string. - template - inline - std::string - to_string (const T& t) +%code // code for the .cc file. +{ + namespace yy { - std::ostringstream o; - o << t; - return o.str (); + static]AT_TOKEN_CTOR_IF([[ + parser::symbol_type yylex ()]], [[ + parser::token_type yylex (parser::semantic_type* yylval]AT_LOCATION_IF([, + parser::location_type* yylloc])[)]])[; + + // Conversion to string. + template + inline + std::string + to_string (const T& t) + { + std::ostringstream o; + o << t; + return o.str (); + } } } @@ -252,10 +259,10 @@ typedef std::list 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> list; +%type <::std::vector> list; %printer { yyo << $$; } - <::std::string> <::std::list>; + <::std::string> <::std::vector>; %destructor { std::cerr << "Destroy: " << $$ << '\n'; } <*>; %destructor { std::cerr << "Destroy: \"" << $$ << "\"\n"; } <::std::string>; %%