Strange skill sort error in GGC 8 compile
< Newer Topic
:: Older Topic >
Pages:<< prev 1 next >>
#1 Mar 17, 2020 1:40 am
Black Hand
GroupAdministrators
Posts3,706
JoinedJan 1, 2002
I'm preparing an update for AFKMud that will clean up the compile for GCC 8 and ran into something really strange that I don't understand with the skills.cpp file. Here's the error:
Yeah, a big fat mess, right? The Makefile currently includes the -std=c++1z directive, which it turns out is responsible for this. Backing off to -std=c++17 returns the same error, but -std=c++14 doesn't and the entire codebase will compile.
What I don't get is why this is happening, and why only on the one line. Here's the function:
Here's the entire skill_index.h file for reference:
What I don't get is that it complains only about skill_table__index but none of the rest of the index tables in the function.
Note that I didn't write this indexing code so I have no idea what the error is even trying to tell me.
Building AFKMud.... make -j2 -s afkmud Compiling o/skills.o.... In file included from /usr/include/c++/8/map:60, from mud.h:37, from skills.cpp:33: /usr/include/c++/8/bits/stl_tree.h: In instantiation of ‘static const _Key& std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_S_key(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Link_type) [with _Key = std::__cxx11::basic_string<char>; _Val = std::pair<const std::__cxx11::basic_string<char>, int>; _KeyOfValue = std::_Select1st<std::pair<const std::__cxx11::basic_string<char>, int> >; _Compare = string_sort; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Const_Link_type = const std::_Rb_tree_node<std::pair<const std::__cxx11::basic_string<char>, int> >*]’: /usr/include/c++/8/bits/stl_tree.h:2425:62: required from ‘std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_emplace_hint_unique(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator, _Args&& ...) [with _Args = {const std::piecewise_construct_t&, std::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>, std::tuple<>}; _Key = std::__cxx11::basic_string<char>; _Val = std::pair<const std::__cxx11::basic_string<char>, int>; _KeyOfValue = std::_Select1st<std::pair<const std::__cxx11::basic_string<char>, int> >; _Compare = string_sort; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, int> >; std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator<std::pair<const std::__cxx11::basic_string<char>, int> >]’ /usr/include/c++/8/bits/stl_map.h:499:8: required from ‘std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type& [with _Key = std::__cxx11::basic_string<char>; _Tp = int; _Compare = string_sort; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::__cxx11::basic_string<char>]’ skills.cpp:728:26: required from here /usr/include/c++/8/bits/stl_tree.h:777:8: error: static assertion failed: comparison object must be invocable as const is_invocable_v<const _Compare&, const _Key&, const _Key&>, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Makefile:191: recipe for target 'o/skills.o' failed make[1]: *** [o/skills.o] Error 1 Makefile:128: recipe for target 'all' failed make: *** [all] Error 2
Yeah, a big fat mess, right? The Makefile currently includes the -std=c++1z directive, which it turns out is responsible for this. Backing off to -std=c++17 returns the same error, but -std=c++14 doesn't and the entire codebase will compile.
What I don't get is why this is happening, and why only on the one line. Here's the function:
void update_skill_index( skill_type * skill, int sn ) { string buf = strlower( skill->name ); skill_table__index[buf] = sn; <---- This is line 728, the one throwing that huge error. switch ( skill->type ) { default: bug( "%s: Invalid skill type %d", __func__, skill->type ); break; case SKILL_SPELL: skill_table__spell[buf] = sn; break; case SKILL_SKILL: skill_table__skill[buf] = sn; break; case SKILL_RACIAL: skill_table__racial[buf] = sn; break; case SKILL_COMBAT: skill_table__combat[buf] = sn; break; case SKILL_TONGUE: skill_table__tongue[buf] = sn; break; case SKILL_LORE: skill_table__lore[buf] = sn; break; } }
Here's the entire skill_index.h file for reference:
// This probably isn't necessary, but prefer to sort by the contents of the // string rather than the binary value that std::less uses. class string_sort { public: string_sort( ); bool operator( ) ( const string &, const string & ); }; #if defined(__APPLE__) //Just deciding to go with default std:less for MacOSX typedef map < string, int > SKILL_INDEX; #else typedef map < string, int, string_sort > SKILL_INDEX; #endif extern SKILL_INDEX skill_table__index; extern SKILL_INDEX skill_table__spell; extern SKILL_INDEX skill_table__skill; extern SKILL_INDEX skill_table__racial; extern SKILL_INDEX skill_table__combat; extern SKILL_INDEX skill_table__tongue; extern SKILL_INDEX skill_table__lore; class find__skill_prefix { public: string value; char_data *actor; find__skill_prefix( char_data *, const string & ); bool operator( ) ( pair < string, int >compare ); }; class find__skill_exact { public: string value; char_data *actor; find__skill_exact( char_data *, const string & ); bool operator( ) ( pair < string, int >compare ); };
What I don't get is that it complains only about skill_table__index but none of the rest of the index tables in the function.
Note that I didn't write this indexing code so I have no idea what the error is even trying to tell me.
#2 Mar 17, 2020 2:25 am
Black Hand
GroupAdministrators
Posts3,706
JoinedJan 1, 2002
Ok, so, I don't know why this was necessary (cryptic errors suck) but the fix to get it compiling again was simple:
skill_index.h
skills.cpp
Sometimes going down the rabbit hole on Google leads to a good guess at a fix
skill_index.h
class string_sort { public: string_sort( ); bool operator( ) ( const string &, const string & ) const; };
skills.cpp
bool string_sort::operator( ) ( const string & left, const string & right ) const { return ( left.compare( right ) < 0 ); }
Sometimes going down the rabbit hole on Google leads to a good guess at a fix
Pages:<< prev 1 next >>