]> git.saurik.com Git - bison.git/commit - data/c++.m4
m4: generate a basic_symbol constructor for each symbol type
authorTheophile Ranquet <ranquet@lrde.epita.fr>
Mon, 28 Jan 2013 17:26:04 +0000 (18:26 +0100)
committerTheophile Ranquet <ranquet@lrde.epita.fr>
Tue, 29 Jan 2013 10:37:04 +0000 (11:37 +0100)
commitee9cf8c4a6bf34fe291ed860e0d7779d78a5bcb0
tree6cef07b46225ce7e27938da526966612579f91d3
parent858666c44302b355ff0cad76b457d57659306d6f
m4: generate a basic_symbol constructor for each symbol type

Recently, there was a slightly vicious bug hidden in the make_ functions:

  parser::symbol_type
  parser::make_TEXT (const ::std::string& v)
  {
    return symbol_type (token::TOK_TEXT, v);
  }

The constructor for symbol_type doesn't take an ::std::string& as
argument, but a constant variant.  However, because there is a variant
constructor which takes an ::std::string&, this caused the implicit
construction of a built variant.  Considering that the variant argument
for the symbol_type constructor was cv-qualified, this temporary variant
was never destroyed.

As a temporary solution, the symbol was built in two stages:

  symbol_type res (token::TOK_TEXT);
  res.value.build< ::std::string&> (v);
  return res;

However, the solution introduced in this patch contributes to letting
the symbols handle themselves, by supplying them with constructors that
take a non-variant value and build the symbol's own variant with that
value.

* data/variant.hh (b4_symbol_constructor_define_): Use the new
constructors rather than building in a temporary symbol.
(b4_basic_symbol_constructor_declare,
b4_basic_symbol_constructor_define): New macros generating the
constructors.
* data/c++.m4 (basic_symbol): Invoke the macros here.
data/c++.m4
data/variant.hh