summaryrefslogtreecommitdiff
path: root/tests/headers.at
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2020-04-11 17:59:55 +0200
committerAkim Demaille <akim.demaille@gmail.com>2020-04-12 13:56:21 +0200
commitecd5cae2d467a30174c5ac182ddb52547639dc60 (patch)
treea2d99c7c0665b9a4c6946f8fe3f1e931ec8a3d55 /tests/headers.at
parent8dcc25a1e49bbb8757cdf55b8cb49007a5799c81 (diff)
downloadbison-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.at8
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])