Skip to content

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

@Talkless

Description

@Talkless

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions