Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test/streams_tests.cpp fails to compile on SunOS / illumos #29884

Closed
hebasto opened this issue Apr 15, 2024 · 4 comments · Fixed by #29907
Closed

test/streams_tests.cpp fails to compile on SunOS / illumos #29884

hebasto opened this issue Apr 15, 2024 · 4 comments · Fixed by #29907

Comments

@hebasto
Copy link
Member

hebasto commented Apr 15, 2024

While testing #29484, which seems not related to this bug, I've notice the following failure:

$ ./autogen.sh
$ ./configure
$ gmake -C src test/test_bitcoin
...
  CXX      test/test_bitcoin-streams_tests.o
In file included from test/streams_tests.cpp:5:
./streams.h: In instantiation of 'SpanReader& SpanReader::operator>>(T&&) [with T = signed char&]':
test/streams_tests.cpp:148:15:   required from here
./streams.h:114:22: error: no matching function for call to 'Unserialize(SpanReader&, signed char&)'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
In file included from ./streams.h:9:
./serialize.h:284:48: note: candidate: 'template<class Stream, class V>  requires  CharNotInt8<V> void Unserialize(Stream&, V)' (deleted)
  284 | template <typename Stream, CharNotInt8 V> void Unserialize(Stream&, V) = delete; // char serialization forbidden. Use uint8_t or int8_t
      |                                                ^~~~~~~~~~~
./serialize.h:284:48: note:   template argument deduction/substitution failed:
./serialize.h:284:48: note: constraints not satisfied
In file included from /usr/gcc/13/include/c++/13.2.0/compare:37,
                 from /usr/gcc/13/include/c++/13.2.0/bits/stl_pair.h:65,
                 from /usr/gcc/13/include/c++/13.2.0/bits/stl_algobase.h:64,
                 from /usr/gcc/13/include/c++/13.2.0/algorithm:60,
                 from ./prevector.h:13,
                 from ./serialize.h:12:
/usr/gcc/13/include/c++/13.2.0/concepts: In substitution of 'template<class Stream, class V>  requires  CharNotInt8<V> void Unserialize(Stream&, V) [with Stream = SpanReader; V = signed char]':
./streams.h:114:22:   required from 'SpanReader& SpanReader::operator>>(T&&) [with T = signed char&]'
test/streams_tests.cpp:148:15:   required from here
/usr/gcc/13/include/c++/13.2.0/concepts:57:15:   required for the satisfaction of '__same_as<_Tp, _Up>' [with _Tp = signed char; _Up = char]
/usr/gcc/13/include/c++/13.2.0/concepts:62:13:   required for the satisfaction of 'same_as<T, char>' [with T = signed char]
./serialize.h:268:9:   required for the satisfaction of 'CharNotInt8<V>' [with V = signed char]
/usr/gcc/13/include/c++/13.2.0/concepts:57:32: note: the expression 'is_same_v<_Tp, _Up> [with _Tp = signed char; _Up = char]' evaluated to 'false'
   57 |       concept __same_as = std::is_same_v<_Tp, _Up>;
      |                           ~~~~~^~~~~~~~~~~~~~~~~~~
./streams.h: In instantiation of 'SpanReader& SpanReader::operator>>(T&&) [with T = signed char&]':
test/streams_tests.cpp:148:15:   required from here
./serialize.h:285:33: note: candidate: 'template<class Stream> void Unserialize(Stream&, std::byte&)'
  285 | template <typename Stream> void Unserialize(Stream& s, std::byte& a) { a = std::byte{ser_readdata8(s)}; }
      |                                 ^~~~~~~~~~~
./serialize.h:285:33: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   cannot convert 'obj' (type 'signed char') to type 'std::byte&'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:286:39: note: candidate: 'template<class Stream> void Unserialize(Stream&, int8_t&)'
  286 | template<typename Stream> inline void Unserialize(Stream& s, int8_t& a  ) { a = ser_readdata8(s); }
      |                                       ^~~~~~~~~~~
./serialize.h:286:39: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   cannot convert 'obj' (type 'signed char') to type 'int8_t&' {aka 'char&'}
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:287:39: note: candidate: 'template<class Stream> void Unserialize(Stream&, uint8_t&)'
  287 | template<typename Stream> inline void Unserialize(Stream& s, uint8_t& a ) { a = ser_readdata8(s); }
      |                                       ^~~~~~~~~~~
./serialize.h:287:39: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   cannot convert 'obj' (type 'signed char') to type 'uint8_t&' {aka 'unsigned char&'}
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:288:39: note: candidate: 'template<class Stream> void Unserialize(Stream&, int16_t&)'
  288 | template<typename Stream> inline void Unserialize(Stream& s, int16_t& a ) { a = ser_readdata16(s); }
      |                                       ^~~~~~~~~~~
./serialize.h:288:39: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   cannot convert 'obj' (type 'signed char') to type 'int16_t&' {aka 'short int&'}
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:289:39: note: candidate: 'template<class Stream> void Unserialize(Stream&, uint16_t&)'
  289 | template<typename Stream> inline void Unserialize(Stream& s, uint16_t& a) { a = ser_readdata16(s); }
      |                                       ^~~~~~~~~~~
./serialize.h:289:39: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   cannot convert 'obj' (type 'signed char') to type 'uint16_t&' {aka 'short unsigned int&'}
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:290:39: note: candidate: 'template<class Stream> void Unserialize(Stream&, int32_t&)'
  290 | template<typename Stream> inline void Unserialize(Stream& s, int32_t& a ) { a = ser_readdata32(s); }
      |                                       ^~~~~~~~~~~
./serialize.h:290:39: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   cannot convert 'obj' (type 'signed char') to type 'int32_t&' {aka 'int&'}
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:291:39: note: candidate: 'template<class Stream> void Unserialize(Stream&, uint32_t&)'
  291 | template<typename Stream> inline void Unserialize(Stream& s, uint32_t& a) { a = ser_readdata32(s); }
      |                                       ^~~~~~~~~~~
./serialize.h:291:39: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   cannot convert 'obj' (type 'signed char') to type 'uint32_t&' {aka 'unsigned int&'}
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:292:39: note: candidate: 'template<class Stream> void Unserialize(Stream&, int64_t&)'
  292 | template<typename Stream> inline void Unserialize(Stream& s, int64_t& a ) { a = ser_readdata64(s); }
      |                                       ^~~~~~~~~~~
./serialize.h:292:39: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   cannot convert 'obj' (type 'signed char') to type 'int64_t&' {aka 'long int&'}
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:293:39: note: candidate: 'template<class Stream> void Unserialize(Stream&, uint64_t&)'
  293 | template<typename Stream> inline void Unserialize(Stream& s, uint64_t& a) { a = ser_readdata64(s); }
      |                                       ^~~~~~~~~~~
./serialize.h:293:39: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   cannot convert 'obj' (type 'signed char') to type 'uint64_t&' {aka 'long unsigned int&'}
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:294:53: note: candidate: 'template<class Stream, class B, int N>  requires  BasicByte<B> void Unserialize(Stream&, B (&)[N])'
  294 | template <typename Stream, BasicByte B, int N> void Unserialize(Stream& s, B (&a)[N]) { s.read(MakeWritableByteSpan(a)); }
      |                                                     ^~~~~~~~~~~
./serialize.h:294:53: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   mismatched types 'B [N]' and 'signed char'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:295:61: note: candidate: 'template<class Stream, class B, long unsigned int N>  requires  BasicByte<B> void Unserialize(Stream&, std::array<_Tp, _Nm>&)'
  295 | template <typename Stream, BasicByte B, std::size_t N> void Unserialize(Stream& s, std::array<B, N>& a) { s.read(MakeWritableByteSpan(a)); }
      |                                                             ^~~~~~~~~~~
./serialize.h:295:61: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   mismatched types 'std::array<_Tp, _Nm>' and 'signed char'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:296:46: note: candidate: 'template<class Stream, class B>  requires  BasicByte<B> void Unserialize(Stream&, Span<O>)'
  296 | template <typename Stream, BasicByte B> void Unserialize(Stream& s, Span<B> span) { s.read(AsWritableBytes(span)); }
      |                                              ^~~~~~~~~~~
./serialize.h:296:46: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   mismatched types 'Span<O>' and 'signed char'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:299:40: note: candidate: 'template<class Stream> void Unserialize(Stream&, bool&)'
  299 | template <typename Stream> inline void Unserialize(Stream& s, bool& a) { uint8_t f = ser_readdata8(s); a = f; }
      |                                        ^~~~~~~~~~~
./serialize.h:299:40: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   cannot convert 'obj' (type 'signed char') to type 'bool&'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:809:6: note: candidate: 'template<class Stream, class C> void Unserialize(Stream&, std::__cxx11::basic_string<C>&)'
  809 | void Unserialize(Stream& is, std::basic_string<C>& str)
      |      ^~~~~~~~~~~
./serialize.h:809:6: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   mismatched types 'std::__cxx11::basic_string<C>' and 'signed char'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:835:6: note: candidate: 'template<class Stream, unsigned int N, class T> void Unserialize(Stream&, prevector<N, T>&)'
  835 | void Unserialize(Stream& is, prevector<N, T>& v)
      |      ^~~~~~~~~~~
./serialize.h:835:6: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   mismatched types 'prevector<N, T>' and 'signed char'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:878:6: note: candidate: 'template<class Stream, class T, class A> void Unserialize(Stream&, std::vector<_ValT, _Allocator>&)'
  878 | void Unserialize(Stream& is, std::vector<T, A>& v)
      |      ^~~~~~~~~~~
./serialize.h:878:6: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   mismatched types 'std::vector<_ValT, _Allocator>' and 'signed char'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:908:6: note: candidate: 'template<class Stream, class K, class T> void Unserialize(Stream&, std::pair<_Tp1, _Tp2>&)'
  908 | void Unserialize(Stream& is, std::pair<K, T>& item)
      |      ^~~~~~~~~~~
./serialize.h:908:6: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   mismatched types 'std::pair<_Tp1, _Tp2>' and 'signed char'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:928:6: note: candidate: 'template<class Stream, class K, class T, class Pred, class A> void Unserialize(Stream&, std::map<K, T, Pred, A>&)'
  928 | void Unserialize(Stream& is, std::map<K, T, Pred, A>& m)
      |      ^~~~~~~~~~~
./serialize.h:928:6: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   mismatched types 'std::map<K, T, Pred, A>' and 'signed char'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:955:6: note: candidate: 'template<class Stream, class K, class Pred, class A> void Unserialize(Stream&, std::set<K, Pred, A>&)'
  955 | void Unserialize(Stream& is, std::set<K, Pred, A>& m)
      |      ^~~~~~~~~~~
./serialize.h:955:6: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   mismatched types 'std::set<K, Pred, A>' and 'signed char'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:997:6: note: candidate: 'template<class Stream, class T> void Unserialize(Stream&, std::shared_ptr<const T>&)'
  997 | void Unserialize(Stream& is, std::shared_ptr<const T>& p)
      |      ^~~~~~~~~~~
./serialize.h:997:6: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   mismatched types 'std::shared_ptr<const T>' and 'signed char'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:980:6: note: candidate: 'template<class Stream, class T> void Unserialize(Stream&, std::unique_ptr<const T>&)'
  980 | void Unserialize(Stream& is, std::unique_ptr<const T>& p)
      |      ^~~~~~~~~~~
./serialize.h:980:6: note:   template argument deduction/substitution failed:
./streams.h:114:22: note:   mismatched types 'std::unique_ptr<const T>' and 'signed char'
  114 |         ::Unserialize(*this, obj);
      |         ~~~~~~~~~~~~~^~~~~~~~~~~~
./serialize.h:774:6: note: candidate: 'template<class Stream, class T>  requires  Unserializable<T, Stream> void Unserialize(Stream&, T&&)'
  774 | void Unserialize(Stream& is, T&& a)
      |      ^~~~~~~~~~~
./serialize.h:774:6: note:   template argument deduction/substitution failed:
./serialize.h:774:6: note: constraints not satisfied
./serialize.h: In substitution of 'template<class Stream, class T>  requires  Unserializable<T, Stream> void Unserialize(Stream&, T&&) [with Stream = SpanReader; T = signed char&]':
./streams.h:114:22:   required from 'SpanReader& SpanReader::operator>>(T&&) [with T = signed char&]'
test/streams_tests.cpp:148:15:   required from here
./serialize.h:771:9:   required for the satisfaction of 'Unserializable<T, Stream>' [with T = signed char&; Stream = SpanReader]
./serialize.h:771:26:   in requirements with 'T a', 'Stream s' [with T = signed char&; Stream = SpanReader]
./serialize.h:771:65: note: the required expression 'a.Unserialize(s)' is invalid
  771 | concept Unserializable = requires(T a, Stream s) { a.Unserialize(s); };
      |                                                    ~~~~~~~~~~~~~^~~
./streams.h: In instantiation of 'SpanReader& SpanReader::operator>>(T&&) [with T = signed char&]':
test/streams_tests.cpp:148:15:   required from here
...

I believe, it has been broken since #12254.


System and compiler details:

$ uname -a
SunOS openindiana 5.11 illumos-064d431af1 i86pc i386 i86pc
$ g++ --version
g++ (OpenIndiana 13.2.0-oi-3) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

@maflcko
Copy link
Member

maflcko commented Apr 16, 2024

Using char is not allowed in serialization code, because the sign of char is unknown/unclear. However, on some systems, int8_t==char, which means that signed char has no serialization helper.

This could be fixed in the serialization code by replacing int8_t by a concept of !CharNotInt8 || std::same_as<T, signed char>. However, my preference would be to completely avoid signed char and just use int8_t in the serialization code. That is, fix the test to use int8_t.

@hebasto
Copy link
Member Author

hebasto commented Apr 16, 2024

However, my preference would be to completely avoid signed char and just use int8_t in the serialization code. That is, fix the test to use int8_t.

I lean to agree, considering that signed char is used in tests only.

@maflcko
Copy link
Member

maflcko commented Apr 16, 2024

Happy to review a pull, if someone creates one.

@hebasto
Copy link
Member Author

hebasto commented Apr 18, 2024

Happy to review a pull, if someone creates one.

Please see #29907.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants