You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Joshua L (Jira)" <ji...@apache.org> on 2021/09/28 19:04:00 UTC

[jira] [Created] (THRIFT-5465) TEnumIterator lacks equality operator and fails when used in gcc debug containers.

Joshua L created THRIFT-5465:
--------------------------------

             Summary: TEnumIterator lacks equality operator and fails when used in gcc debug containers.
                 Key: THRIFT-5465
                 URL: https://issues.apache.org/jira/browse/THRIFT-5465
             Project: Thrift
          Issue Type: Bug
          Components: C++ - Library
         Environment: Compiler: (GCC) 11.1.0

OS: Arch Linux
            Reporter: Joshua L


When compiling Apache arrow parquet like so:
{code:java}
cmake ../ -DCMAKE_BUILD_TYPE=DEBUG -DARROW_CXXFLAGS="-D_GLIBCXX_DEBUG" -DARROW_PARQUET=1 {code}
The following error occurs in thrift compiler generated code:
{code:java}
/usr/include/c++/11.1.0/debug/map.h:151:5:   required from ‘std::__debug::map<_Key, _Tp, _Cmp, _Allocator>::map(_InputIterator, _InputIterator, const _Compare&, const _Allocator&) [with _InputIterator = apache::thrift::TEnumIterator; _Key = int; _Tp = co
nst char*; _Compare = std::less<int>; _Allocator = std::allocator<std::pair<const int, const char*> >]’                        
/home/snapcore/arrow/cpp/src/generated/parquet_types.cpp:36:166:   required from here                                                                                                                                                                         
/usr/include/c++/11.1.0/debug/helper_functions.h:174:22: error: no match for ‘operator==’ (operand types are ‘apache::thrift::TEnumIterator’ and ‘apache::thrift::TEnumIterator’)                                                                             
  174 |       return __first == __last                                                
{code}
This is because the type TEnumIterator is being stored in a stl debug map:
{code:java}
const std::map<int, const char*> _Type_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(8, _kTypeValues, _kTypeNames), ::apache::thrift::TEnumIterator(-1, NULL, NULL));
{code}
that does an equality comparison on types stored for validity, but TEnumIterator lacks a comparison operator on non-windows platforms it seems:

A very simple solution here is to add to Thrift.h:

{code:java}
#include <thrift/windows/Operators.h>{code}
which includes a dummy comparison operator I believe. Probably not ideal, but that is the current workaround I found.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)