summarylogtreecommitdiffstats
path: root/sun-cc.patch
blob: 89fc5f6c39ae109f9baa3bbddce68f9be27ce4ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
commit 952416114729b95209dccfc4edacfc1ff13b4e82
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..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 "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,29 +194,25 @@ 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;
+
+  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<std::string> strings_type;
       return o << ')';
     }
   }
+}
 
-  // Conversion to string.
-  template <typename T>
-    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 <typename T>
+      inline
+      std::string
+      to_string (const T& t)
+    {
+      std::ostringstream o;
+      o << t;
+      return o.str ();
+    }
   }
 }
 
@@ -252,10 +259,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>;
 %%