diff options
author | Akim Demaille <akim.demaille@gmail.com> | 2020-04-11 17:59:55 +0200 |
---|---|---|
committer | Akim Demaille <akim.demaille@gmail.com> | 2020-04-12 13:56:21 +0200 |
commit | ecd5cae2d467a30174c5ac182ddb52547639dc60 (patch) | |
tree | a2d99c7c0665b9a4c6946f8fe3f1e931ec8a3d55 /tests/headers.at | |
parent | 8dcc25a1e49bbb8757cdf55b8cb49007a5799c81 (diff) | |
download | bison-ecd5cae2d467a30174c5ac182ddb52547639dc60.tar.gz |
c++: fix generated headers
A forthcoming commit (tokens: properly define the "error" token kind)
revealed a problem in the C++ generated headers: they are not
self-contained. With this file:
%language "c++"
%define api.value.type variant
%code {
static int yylex (yy::parser::semantic_type *lvalp);
}
%token <int> X
%%
exp:
X { printf ("x\n"); }
;
%%
void
yy::parser::error (const std::string& m)
{
std::cerr << m << '\n';
}
static
int yylex (yy::parser::semantic_type *lvalp)
{
static int const input[] = {yy::parser::token::X, 0};
static int toknum = 0;
return input[toknum++];
}
int
main (int argc, char const* argv[])
{
yy::parser p;
return p.parse ();
}
the generated header fails to compile cleanly (foo.cc just #includes
the generated header):
$ clang++-mp-9.0 -c -Wundefined-func-template foo.cc
In file included from foo.cc:1:
bar.tab.hh:550:12: warning: instantiation of function 'yy::parser::basic_symbol<yy::parser::by_type>::basic_symbol' required here, but no definition is available
[-Wundefined-func-template]
struct symbol_type : basic_symbol<by_type>
^
bar.tab.hh:436:7: note: forward declaration of template entity is here
basic_symbol (basic_symbol&& that);
^
bar.tab.hh:550:12: note: add an explicit instantiation declaration to suppress this warning if 'yy::parser::basic_symbol<yy::parser::by_type>::basic_symbol' is explicitly instantiated
in another translation unit
struct symbol_type : basic_symbol<by_type>
^
1 warning generated.
* data/skeletons/c++.m4 (b4_public_types_define): Move the
implementation of the basic_symbol move-ctor to...
(b4_public_types_define): here, its declaration.
* tests/headers.at (Sane headers): Use a declared token so that the
corresponding token constructor is declared. Which triggers the
aforementioned issue.
Diffstat (limited to 'tests/headers.at')
-rw-r--r-- | tests/headers.at | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/tests/headers.at b/tests/headers.at index f1cb7316..20a9e4c5 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -125,7 +125,9 @@ AT_BISON_OPTION_PUSHDEFS([$1]) AT_DATA_GRAMMAR([input.y], [[$1 %define parse.error verbose -]AT_VARIANT_IF([%token <int> 'x'], [%union {int integer;}])[ +]AT_VARIANT_IF([%token <int> X], +[%union {int integer;} +%token <integer> X])[ %code { #include <stdio.h> /* printf. */ ]AT_PUSH_IF([[ @@ -138,12 +140,12 @@ AT_DATA_GRAMMAR([input.y], } %% exp: - 'x' { printf ("x\n"); } + X { printf ("x\n"); } ; %% ]AT_YYERROR_DEFINE[ -]AT_YYLEX_DEFINE(["x"])[ +]AT_YYLEX_DEFINE([{AT_CXX_IF([yy::parser::token::])X, 0}])[ ]]) AT_BISON_CHECK([-d -o input.AT_LANG_EXT input.y]) |