sharebrained / portapack-hackrf

Portability Add-On for the HackRF Software-Defined Radio.
GNU General Public License v2.0
976 stars 407 forks source link

Cannot compile with GCC10 #172

Open olewales opened 3 years ago

olewales commented 3 years ago

Trying to compile firmware with gcc 10 yields following error:

(...)
/home/olewales/portapack-hackrf/firmware/baseband/spectrum_collector.cpp: In instantiation of 'typename T::value_type spectrum_window_hamming_3(const T&, size_t) [with T = std::array<std::complex<float>, 256>; typename T::value_type = std::complex<float>; size_t = unsigned int]':
/home/olewales/portapack-hackrf/firmware/baseband/spectrum_collector.cpp:142:79:   required from here
/home/olewales/portapack-hackrf/firmware/baseband/spectrum_collector.cpp:114:28: error: non-constant condition for static assertion
  114 |  static_assert(power_of_two(s.size()), "Array size must be power of 2");
      |                ~~~~~~~~~~~~^~~~~~~~~~
/home/olewales/portapack-hackrf/firmware/baseband/spectrum_collector.cpp:114:28: error: 's' is not a constant expression
/home/olewales/portapack-hackrf/firmware/baseband/spectrum_collector.cpp:115:19: error: 's' is not a constant expression
  115 |  constexpr size_t mask = s.size() - 1;
      |                   ^~~~
make[2]: *** [firmware/baseband/CMakeFiles/baseband_shared.dir/build.make:1135: firmware/baseband/CMakeFiles/baseband_shared.dir/spectrum_collector.cpp.obj] Error 1
make[1]: *** [CMakeFiles/Makefile2:991: firmware/baseband/CMakeFiles/baseband_shared.dir/all] Error 2
make: *** [Makefile:103: all] Error 2

Code may be made to compile by removing constexpr and assertion but there should be a better way to fix this

diff --git a/firmware/baseband/spectrum_collector.cpp b/firmware/baseband/spectrum_collector.cpp
index ebe55a2..dd52da2 100644
--- a/firmware/baseband/spectrum_collector.cpp
+++ b/firmware/baseband/spectrum_collector.cpp
@@ -111,8 +111,8 @@ static typename T::value_type spectrum_window_none(const T& s, const size_t i) {

 template<typename T>
 static typename T::value_type spectrum_window_hamming_3(const T& s, const size_t i) {
-       static_assert(power_of_two(s.size()), "Array size must be power of 2");
-       constexpr size_t mask = s.size() - 1;
+       //static_assert(power_of_two(s.size()), "Array size must be power of 2");
+       const size_t mask = s.size() - 1;
        // Three point Hamming window.
        return s[i] * 0.54f + (s[(i-1) & mask] + s[(i+1) & mask]) * -0.23f;
 };

I believe this is related to a bug fixed in GCC10: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66477

GCC version:

$ arm-none-eabi-gcc -v
Using built-in specs.
COLLECT_GCC=arm-none-eabi-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-none-eabi/10.2.0/lto-wrapper
Target: arm-none-eabi
Configured with: /build/arm-none-eabi-gcc/src/gcc-10.2.0/configure --target=arm-none-eabi --prefix=/usr --with-sysroot=/usr/arm-none-eabi --with-native-system-header-dir=/include --libexecdir=/usr/lib --enable-languages=c,c++ --enable-plugins --disable-decimal-float --disable-libffi --disable-libgomp --disable-libmudflap --disable-libquadmath --disable-libssp --disable-libstdcxx-pch --disable-nls --disable-shared --disable-threads --disable-tls --with-gnu-as --with-gnu-ld --with-system-zlib --with-newlib --with-headers=/usr/arm-none-eabi/include --with-python-dir=share/gcc-arm-none-eabi --with-gmp --with-mpfr --with-mpc --with-isl --with-libelf --enable-gnu-indirect-function --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-pkgversion='Arch Repository' --with-bugurl=https://bugs.archlinux.org/ --with-multilib-list=rmprofile
Thread model: single
Supported LTO compression algorithms: zlib zstd
gcc version 10.2.0 (Arch Repository)