help-bison
[Top][All Lists]
Advanced

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

Re: Possible to declare move constructor of basic_symbol as noexcept?


From: Adrian
Subject: Re: Possible to declare move constructor of basic_symbol as noexcept?
Date: Thu, 7 Jan 2021 04:40:35 -0500

Hi Akim,

Yes, that was what I was referring to. Since
basic_symbol(basic_symbol&&) calls semantic_type::move<T>, a concern
is if that might throw. But I checked semantic_type::move<T> calls
semantic_type::emplace<T, U...> which is what calls the constructor,
semantic_type::as<T> which is already declared noexcept, and
semantic_type::destroy<T> which calls the destructor of T, which I
think could be throwing, but pretty sure having a potentially throwing
constructor is a Very Bad Thing To Do.

Another concern is the need for the <type_traits> header for
std::is_nothrow_move_constructible, which is/can be implemented in
terms of std::is_nothrow_constructible, which I don't think can be
implemented without intrinsics? Since Bison currently doesn't depend
on (as far as I could find) <type_traits>, introducing this dependency
for such a niche case is probably undesirable. Maybe it could only be
enabled with a Bison declaration, but then that's extra maintenance
baggage. So I wasn't sure if this would be something you would be open
to

Thanks for your time!

Kind regards,
Adrian

On Thu, Jan 7, 2021 at 12:30 AM Akim Demaille <akim@lrde.epita.fr> wrote:
>
> Hi Adrian,
>
> > Le 6 janv. 2021 à 20:43, Adrian <withoutpointk@gmail.com> a écrit :
> >
> > Hello,
> >
> > Is there any possibility we can declare the move constructor of
> > basic_symbol as noexcept (if the semantic_types are noexcept
> > moveable)?
> >
> > I have a semantic value that is non-copyable (moveable only) and I
> > want an std::vector<symbol_type>. std::vector only calls the move
> > constructor when resizing if the move constructor is declared noexcept
> >
> > It seems to me that the issue might be that you would require all of
> > the semantic types to be noexcept moveable. You would need a
> > (potentially huge) noexcept predicate, but since it's generated code
> > maybe it's ok
>
> My C++ is rusting.  What exactly are you asking for?  From
>
> > #if 201103L <= YY_CPLUSPLUS
> >       /// Move constructor.
> >       basic_symbol (basic_symbol&& that)
> >         : Base (std::move (that))
> >         , value ()
> >       {
> >         switch (this->kind ())
> >     {
> >       case symbol_kind::S_NUMBER: // NUMBER
> >         value.move< int > (std::move (that.value));
> >         break;
> >
> >       case symbol_kind::S_TEXT: // TEXT
> >       case symbol_kind::S_item: // item
> >         value.move< std::string > (std::move (that.value));
> >         break;
> >
> >       case symbol_kind::S_list: // list
> >         value.move< std::vector<std::string> > (std::move (that.value));
> >         break;
> >
> >       default:
> >         break;
> >     }
> >
> >       }
> > #endif
>
> to go to
>
> > #if 201103L <= YY_CPLUSPLUS
> >       /// Move constructor.
> >       basic_symbol (basic_symbol&& that)
> >         noexcept (
> >           std::is_nothrow_move_constructible< int >::value
> >           && std::is_nothrow_move_constructible< std::string >::value
> >           && std::is_nothrow_move_constructible< std::vector<std::string> 
> > >::value
> >
> >         )
> >         : Base (std::move (that))
> >         , value ()
>
> right?



reply via email to

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