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

"error: '__pstr__' declared 'static' in 'constexpr' function" when building in Arduino for ESP8266 (GCC gcc10.3) #72

Open
Talkless opened this issue Nov 27, 2024 · 2 comments

Comments

@Talkless
Copy link

I tried including expected.hpp (latest 0.8.0) like this:

#define nsel_CPLUSPLUS 199711L
#define nsel_CONFIG_NO_EXCEPTIONS 1
#include "3rdparty/nonstd/expected.hpp"

but get built errors:

In file included from /home/vincas/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/xtensa-lx106-elf/include/assert.h:10,
                 from /home/vincas/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/3.1.0-gcc10.3-e5f9fec/xtensa-lx106-elf/include/c++/10.3.0/cassert:44,
                 from /somewhere/3rdparty/nonstd/expected.hpp:255,
                 from /somewhere/sha256.hpp:3,
                 from /somewhere/sha256.cpp:1:
/somewhere/3rdparty/nonstd/expected.hpp: In member function 'constexpr const value_type* nonstd::expected_lite::expected<T, E>::operator->() const':
/somewhere/3rdparty/nonstd/expected.hpp:2158:16: error: '__pstr__' declared 'static' in 'constexpr' function
 2158 |         return assert( has_value() ), contained.value_ptr();
      |                ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp:2158:16: error: '__pstr__' declared 'static' in 'constexpr' function
 2158 |         return assert( has_value() ), contained.value_ptr();
      |                ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp: In member function 'constexpr const value_type& nonstd::expected_lite::expected<T, E>::operator*() const &':
/somewhere/3rdparty/nonstd/expected.hpp:2168:16: error: '__pstr__' declared 'static' in 'constexpr' function
 2168 |         return assert( has_value() ), contained.value();
      |                ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp:2168:16: error: '__pstr__' declared 'static' in 'constexpr' function
 2168 |         return assert( has_value() ), contained.value();
      |                ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp: In member function 'constexpr const value_type&& nonstd::expected_lite::expected<T, E>::operator*() const &&':
/somewhere/3rdparty/nonstd/expected.hpp:2180:29: error: '__pstr__' declared 'static' in 'constexpr' function
 2180 |         return std::move( ( assert( has_value() ), contained.value() ) );
      |                             ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp:2180:29: error: '__pstr__' declared 'static' in 'constexpr' function
 2180 |         return std::move( ( assert( has_value() ), contained.value() ) );
      |                             ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp: In member function 'constexpr const error_type& nonstd::expected_lite::expected<T, E>::error() const &':
/somewhere/3rdparty/nonstd/expected.hpp:2237:16: error: '__pstr__' declared 'static' in 'constexpr' function
 2237 |         return assert( ! has_value() ), contained.error();
      |                ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp:2237:16: error: '__pstr__' declared 'static' in 'constexpr' function
 2237 |         return assert( ! has_value() ), contained.error();
      |                ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp: In member function 'constexpr const error_type&& nonstd::expected_lite::expected<T, E>::error() const &&':
/somewhere/3rdparty/nonstd/expected.hpp:2249:29: error: '__pstr__' declared 'static' in 'constexpr' function
 2249 |         return std::move( ( assert( ! has_value() ), contained.error() ) );
      |                             ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp:2249:29: error: '__pstr__' declared 'static' in 'constexpr' function
 2249 |         return std::move( ( assert( ! has_value() ), contained.error() ) );
      |                             ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp: In member function 'constexpr const error_type& nonstd::expected_lite::expected<void, E>::error() const &':
/somewhere/3rdparty/nonstd/expected.hpp:2819:16: error: '__pstr__' declared 'static' in 'constexpr' function
 2819 |         return assert( ! has_value() ), contained.error();
      |                ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp:2819:16: error: '__pstr__' declared 'static' in 'constexpr' function
 2819 |         return assert( ! has_value() ), contained.error();
      |                ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp: In member function 'constexpr const error_type&& nonstd::expected_lite::expected<void, E>::error() const &&':
/somewhere/3rdparty/nonstd/expected.hpp:2831:29: error: '__pstr__' declared 'static' in 'constexpr' function
 2831 |         return std::move( ( assert( ! has_value() ), contained.error() ) );
      |                             ^~~~~~
/somewhere/3rdparty/nonstd/expected.hpp:2831:29: error: '__pstr__' declared 'static' in 'constexpr' function
 2831 |         return std::move( ( assert( ! has_value() ), contained.error() ) );
      |    

Any ideas how to workaround that? Well, it's kinda just experiment "for fun", it's nice to use some latest C++ features on "bare metal", but I guess some compiler features are missing?

I can use costepxr, [[nodiscard]], but I guess some other feature missing?

P.S. to reproduce:

  • Download Arduino 2.3.3.
  • Add http://arduino.esp8266.com/stable/package_esp8266com_index.json in Preferences -> Additional boards manager URLs.
  • Install esp32 by Espressif Systems in Tools -> Board -> Boards Manager....
  • Select LOLIN(WeMos) D1 R1 in Tools -> Board -> esp8266
  • Paste expected.hpp in same folder where Arduino Sketch (.ino) is and #include it.
@martinmoene
Copy link
Owner

Like the: Well, it's kinda just experiment "for fun", it's nice to use some latest C++ features on "bare metal" :)

To me, the implementation of assert() seems to collide with constexpr.

Perhaps you can try and see what compiling without assertions (defining NDEBUG) results in [1] ?

I do appreciate the steps to reproduce you provide, however it may be a bit much to perform these myself at the moment.

[1] cassert on cppreference.

@Talkless
Copy link
Author

Perhaps you can try and see what compiling without assertions (defining NDEBUG) results in [1] ?

I've did this:

#define NDEBUG
#include "src/3rdparty/expected.hpp"

And it builds!

Thanks!

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

No branches or pull requests

2 participants