bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

c++: fix generated headers


From: Akim Demaille
Subject: c++: fix generated headers
Date: Sun, 12 Apr 2020 13:57:11 +0200

commit ecd5cae2d467a30174c5ac182ddb52547639dc60
Author: Akim Demaille <address@hidden>
Date:   Sat Apr 11 17:59:55 2020 +0200

    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.

diff --git a/data/skeletons/c++.m4 b/data/skeletons/c++.m4
index a0dbbd97..b8512b44 100644
--- a/data/skeletons/c++.m4
+++ b/data/skeletons/c++.m4
@@ -301,7 +301,14 @@ m4_define([b4_symbol_type_define],
 
 #if 201103L <= YY_CPLUSPLUS
       /// Move constructor.
-      basic_symbol (basic_symbol&& that);
+      basic_symbol (basic_symbol&& that)
+        : Base (std::move (that))
+        , value (]b4_variant_if([], [std::move (that.value)]))b4_locations_if([
+        , location (std::move (that.location))])[
+      {]b4_variant_if([
+        b4_symbol_variant([this->type_get ()], [value], [move],
+                          [std::move (that.value)])
+      ])[}
 #endif
 
       /// Copy constructor.
@@ -417,18 +424,6 @@ m4_define([b4_symbol_type_define],
 # Provide the implementation needed by the public types.
 m4_define([b4_public_types_define],
 [[  // basic_symbol.
-#if 201103L <= YY_CPLUSPLUS
-  template <typename Base>
-  ]b4_parser_class[::basic_symbol<Base>::basic_symbol (basic_symbol&& that)
-    : Base (std::move (that))
-    , value (]b4_variant_if([], [std::move (that.value)]))b4_locations_if([
-    , location (std::move (that.location))])[
-  {]b4_variant_if([
-    b4_symbol_variant([this->type_get ()], [value], [move],
-                      [std::move (that.value)])
-  ])[}
-#endif
-
   template <typename Base>
   ]b4_parser_class[::basic_symbol<Base>::basic_symbol (const basic_symbol& 
that)
     : Base (that)
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])




reply via email to

[Prev in Thread] Current Thread [Next in Thread]