[Bug c++/99985] New: [11 Regression] bits/hashtable.h:483:9: error: body of ‘constexpr’ function ... not a return-statement since g:1cbba49e3417d9b0661e70301d6fb7a7f52fd360

marxin at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Apr 9 08:34:59 GMT 2021


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99985

            Bug ID: 99985
           Summary: [11 Regression] bits/hashtable.h:483:9: error: body of
                    ‘constexpr’ function ... not a return-statement since
                    g:1cbba49e3417d9b0661e70301d6fb7a7f52fd360
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: marxin at gcc dot gnu.org
  Target Milestone: ---

I noticed that in botan, inkscape and mariadb packages:

$ cat oid.C
#include <string>
#include <unordered_map>
struct OID {};
std::unordered_map< std::string, OID > load_str2oid_map() {
  return std::unordered_map< std::string, OID >{};
}

$ cat oid.C
#include <string>
#include <unordered_map>
struct OID {};
std::unordered_map< std::string, OID > load_str2oid_map() {
  return std::unordered_map< std::string, OID >{};
}

$ g++ oid.C -c -std=c++11
In file included from /home/marxin/bin/gcc/include/c++/11.0.1/unordered_map:46,
                 from oid.C:2:
/home/marxin/bin/gcc/include/c++/11.0.1/bits/hashtable.h: In instantiation of
‘static constexpr bool std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey,
_Equal, _Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::_S_nothrow_move()
[with bool _No_realloc = true; _Key = std::__cxx11::basic_string<char>; _Value
= std::pair<const std::__cxx11::basic_string<char>, OID>; _Alloc =
std::allocator<std::pair<const std::__cxx11::basic_string<char>, OID> >;
_ExtractKey = std::__detail::_Select1st; _Equal =
std::equal_to<std::__cxx11::basic_string<char> >; _Hash =
std::hash<std::__cxx11::basic_string<char> >; _RangeHash =
std::__detail::_Mod_range_hashing; _Unused =
std::__detail::_Default_ranged_hash; _RehashPolicy =
std::__detail::_Prime_rehash_policy; _Traits =
std::__detail::_Hashtable_traits<true, false, true>]’:
oid.C:5:49:   recursively required from ‘std::unordered_map<_Key, _Tp, _Hash,
_Pred, _Alloc>::unordered_map(std::unordered_map<_Key, _Tp, _Hash, _Pred,
_Alloc>&&) [with _Key = std::__cxx11::basic_string<char>; _Tp = OID; _Hash =
std::hash<std::__cxx11::basic_string<char> >; _Pred =
std::equal_to<std::__cxx11::basic_string<char> >; _Alloc =
std::allocator<std::pair<const std::__cxx11::basic_string<char>, OID> >]’
oid.C:5:49:   required from here
/home/marxin/bin/gcc/include/c++/11.0.1/bits/hashtable.h:483:9: error: body of
‘constexpr’ function ‘static constexpr bool std::_Hashtable<_Key, _Value,
_Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy,
_Traits>::_S_nothrow_move() [with bool _No_realloc = true; _Key =
std::__cxx11::basic_string<char>; _Value = std::pair<const
std::__cxx11::basic_string<char>, OID>; _Alloc = std::allocator<std::pair<const
std::__cxx11::basic_string<char>, OID> >; _ExtractKey =
std::__detail::_Select1st; _Equal =
std::equal_to<std::__cxx11::basic_string<char> >; _Hash =
std::hash<std::__cxx11::basic_string<char> >; _RangeHash =
std::__detail::_Mod_range_hashing; _Unused =
std::__detail::_Default_ranged_hash; _RehashPolicy =
std::__detail::_Prime_rehash_policy; _Traits =
std::__detail::_Hashtable_traits<true, false, true>]’ not a return-statement
  483 |         }
      |         ^
/home/marxin/bin/gcc/include/c++/11.0.1/bits/hashtable.h: In instantiation of
‘std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _Hash, _RangeHash,
_Unused, _RehashPolicy, _Traits>::_Hashtable(std::_Hashtable<_Key, _Value,
_Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy,
_Traits>&&) [with _Key = std::__cxx11::basic_string<char>; _Value =
std::pair<const std::__cxx11::basic_string<char>, OID>; _Alloc =
std::allocator<std::pair<const std::__cxx11::basic_string<char>, OID> >;
_ExtractKey = std::__detail::_Select1st; _Equal =
std::equal_to<std::__cxx11::basic_string<char> >; _Hash =
std::hash<std::__cxx11::basic_string<char> >; _RangeHash =
std::__detail::_Mod_range_hashing; _Unused =
std::__detail::_Default_ranged_hash; _RehashPolicy =
std::__detail::_Prime_rehash_policy; _Traits =
std::__detail::_Hashtable_traits<true, false, true>]’:
oid.C:5:49:   recursively required from ‘std::unordered_map<_Key, _Tp, _Hash,
_Pred, _Alloc>::unordered_map(std::unordered_map<_Key, _Tp, _Hash, _Pred,
_Alloc>&&) [with _Key = std::__cxx11::basic_string<char>; _Tp = OID; _Hash =
std::hash<std::__cxx11::basic_string<char> >; _Pred =
std::equal_to<std::__cxx11::basic_string<char> >; _Alloc =
std::allocator<std::pair<const std::__cxx11::basic_string<char>, OID> >]’
oid.C:5:49:   required from here
/home/marxin/bin/gcc/include/c++/11.0.1/bits/hashtable.h:520:33: error: ‘static
constexpr bool std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal,
_Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::_S_nothrow_move() [with
bool _No_realloc = true; _Key = std::__cxx11::basic_string<char>; _Value =
std::pair<const std::__cxx11::basic_string<char>, OID>; _Alloc =
std::allocator<std::pair<const std::__cxx11::basic_string<char>, OID> >;
_ExtractKey = std::__detail::_Select1st; _Equal =
std::equal_to<std::__cxx11::basic_string<char> >; _Hash =
std::hash<std::__cxx11::basic_string<char> >; _RangeHash =
std::__detail::_Mod_range_hashing; _Unused =
std::__detail::_Default_ranged_hash; _RehashPolicy =
std::__detail::_Prime_rehash_policy; _Traits =
std::__detail::_Hashtable_traits<true, false, true>]’ called in a constant
expression
  520 |         noexcept(_S_nothrow_move())
      |                  ~~~~~~~~~~~~~~~^~
/home/marxin/bin/gcc/include/c++/11.0.1/bits/hashtable.h:477:9: note: ‘static
constexpr bool std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal,
_Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::_S_nothrow_move() [with
bool _No_realloc = true; _Key = std::__cxx11::basic_string<char>; _Value =
std::pair<const std::__cxx11::basic_string<char>, OID>; _Alloc =
std::allocator<std::pair<const std::__cxx11::basic_string<char>, OID> >;
_ExtractKey = std::__detail::_Select1st; _Equal =
std::equal_to<std::__cxx11::basic_string<char> >; _Hash =
std::hash<std::__cxx11::basic_string<char> >; _RangeHash =
std::__detail::_Mod_range_hashing; _Unused =
std::__detail::_Default_ranged_hash; _RehashPolicy =
std::__detail::_Prime_rehash_policy; _Traits =
std::__detail::_Hashtable_traits<true, false, true>]’ is not usable as a
‘constexpr’ function because:
  477 |         _S_nothrow_move()
      |         ^~~~~~~~~~~~~~~
/home/marxin/bin/gcc/include/c++/11.0.1/bits/hashtable.h: In instantiation of
‘std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _Hash, _RangeHash,
_Unused, _RehashPolicy, _Traits>::_Hashtable(std::_Hashtable<_Key, _Value,
_Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy,
_Traits>&&, std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _Hash,
_RangeHash, _Unused, _RehashPolicy, _Traits>::__node_alloc_type&&,
std::true_type) [with _Key = std::__cxx11::basic_string<char>; _Value =
std::pair<const std::__cxx11::basic_string<char>, OID>; _Alloc =
std::allocator<std::pair<const std::__cxx11::basic_string<char>, OID> >;
_ExtractKey = std::__detail::_Select1st; _Equal =
std::equal_to<std::__cxx11::basic_string<char> >; _Hash =
std::hash<std::__cxx11::basic_string<char> >; _RangeHash =
std::__detail::_Mod_range_hashing; _Unused =
std::__detail::_Default_ranged_hash; _RehashPolicy =
std::__detail::_Prime_rehash_policy; _Traits =
std::__detail::_Hashtable_traits<true, false, true>; std::_Hashtable<_Key,
_Value, _Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy,
_Traits>::__node_alloc_type = std::_Hashtable<std::__cxx11::basic_string<char>,
std::pair<const std::__cxx11::basic_string<char>, OID>,
std::allocator<std::pair<const std::__cxx11::basic_string<char>, OID> >,
std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char> >,
std::hash<std::__cxx11::basic_string<char> >,
std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true,
false, true> >::__node_alloc_type; std::true_type =
std::integral_constant<bool, true>]’:
/home/marxin/bin/gcc/include/c++/11.0.1/bits/hashtable.h:522:17:   required
from ‘std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal, _Hash,
_RangeHash, _Unused, _RehashPolicy, _Traits>::_Hashtable(std::_Hashtable<_Key,
_Value, _Alloc, _ExtractKey, _Equal, _Hash, _RangeHash, _Unused, _RehashPolicy,
_Traits>&&) [with _Key = std::__cxx11::basic_string<char>; _Value =
std::pair<const std::__cxx11::basic_string<char>, OID>; _Alloc =
std::allocator<std::pair<const std::__cxx11::basic_string<char>, OID> >;
_ExtractKey = std::__detail::_Select1st; _Equal =
std::equal_to<std::__cxx11::basic_string<char> >; _Hash =
std::hash<std::__cxx11::basic_string<char> >; _RangeHash =
std::__detail::_Mod_range_hashing; _Unused =
std::__detail::_Default_ranged_hash; _RehashPolicy =
std::__detail::_Prime_rehash_policy; _Traits =
std::__detail::_Hashtable_traits<true, false, true>]’
/home/marxin/bin/gcc/include/c++/11.0.1/bits/unordered_map.h:184:7:   required
from here
/home/marxin/bin/gcc/include/c++/11.0.1/bits/hashtable.h:487:33: error: ‘static
constexpr bool std::_Hashtable<_Key, _Value, _Alloc, _ExtractKey, _Equal,
_Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::_S_nothrow_move() [with
bool _No_realloc = true; _Key = std::__cxx11::basic_string<char>; _Value =
std::pair<const std::__cxx11::basic_string<char>, OID>; _Alloc =
std::allocator<std::pair<const std::__cxx11::basic_string<char>, OID> >;
_ExtractKey = std::__detail::_Select1st; _Equal =
std::equal_to<std::__cxx11::basic_string<char> >; _Hash =
std::hash<std::__cxx11::basic_string<char> >; _RangeHash =
std::__detail::_Mod_range_hashing; _Unused =
std::__detail::_Default_ranged_hash; _RehashPolicy =
std::__detail::_Prime_rehash_policy; _Traits =
std::__detail::_Hashtable_traits<true, false, true>]’ called in a constant
expression
  487 |         noexcept(_S_nothrow_move());
      |                  ~~~~~~~~~~~~~~~^~


More information about the Gcc-bugs mailing list