Got lots of compilation errors when I switch to gnu++20

My platformio.ini

[env:esp32-c3-devkitm-1]
platform = espressif32
platform_packages =
	toolchain-riscv32-esp@12.2.0+20230208
board = esp32-c3-devkitm-1
framework = arduino
lib_deps = 
	arduino-libraries/ArduinoMqttClient@^0.1.8
	bblanchon/ArduinoJson@^7.0.3
monitor_speed = 9600
build_unflags =
    -std=gnu++11
    -std=gnu++14
    -std=gnu++17
build_flags = 
	-D ARDUINO_USB_MODE=1
	-D ARDUINO_USB_CDC_ON_BOOT=1
	-D MQTT_CLIENT_STD_FUNCTION_CALLBACK=1
	-std=gnu++20

build output:

Dependency Graph
|-- ArduinoMqttClient @ 0.1.8
|-- ArduinoJson @ 7.0.3      
|-- Bemfa
|-- BoringLight
|-- HomeAssistant
|-- PT8041
Building in release mode
Compiling .pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_pulse.c.o
In file included from C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/freertos/portable.h:51,
                 from C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/include/freertos/FreeRTOS.h:63,
                 from C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/cores/esp32/Arduino.h:33,     
                 from C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/cores/esp32/wiring_private.h:31,
                 from C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/cores/esp32/wiring_pulse.c:18:C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/port/riscv/include/freertos/portmacro.h:440:1: warning: ignoring attribute 'section (".iram1.24")' because it conflicts with previous 'section (".iram1.22")' [-Wattributes]
  440 | {
      | ^
C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/freertos/port/riscv/include/freertos/portmacro.h:271:30: note: previous declaration here
  271 | static inline bool IRAM_ATTR xPortCanYield(void);
      |                              ^~~~~~~~~~~~~
C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include/hal/cpu_ll.h: Assembler messages:
C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include/hal/cpu_ll.h:54: Error: unrecognized opcode `csrr s2,0x7e2', extension `zicsr' required
C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include/hal/cpu_ll.h:54: Error: unrecognized opcode `csrr s3,0x7e2', extension `zicsr' required
C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include/hal/cpu_ll.h:54: Error: unrecognized opcode `csrr a0,0x7e2', extension `zicsr' required
C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include/hal/cpu_ll.h:54: Error: unrecognized opcode `csrr a5,0x7e2', extension `zicsr' required
C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include/hal/cpu_ll.h:54: Error: unrecognized opcode `csrr a5,0x7e2', extension `zicsr' required
C:/Users/yuki/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32c3/include/hal/esp32c3/include/hal/cpu_ll.h:54: Error: unrecognized opcode `csrr a5,0x7e2', extension `zicsr' required
*** [.pio\build\esp32-c3-devkitm-1\FrameworkArduino\wiring_pulse.c.o] Error 1
============================================ [FAILED] Took 5.92 seconds ============================================

I have no problem when I use gnu++17, but there are some new features from gnu++20 I wan to try.

I came back to an esp32-C3 project after a few months of other things and attempting to build it also fails with

Error: unrecognized opcode csrrs a5,0x805,a5’, extension zicsr' required

while compiling .pio/build/espC3/driver/deprecated/timer_legacy.o

Not sure what changed that triggered the failure.

Looking at the verbose compile output, there are two versions of march specified, should there only be the first one?

riscv32-esp-elf-gcc -o .pio/build/espC3/driver/sigma_delta/sdm.o -c -std=gnu17 -O2 -march=rv32imc_zicsr_zifencei -march=rv32imc

“something” updated after I touched platformio.ini and the problem has gone away. All good I guess.

1 Like

Have you tried gnu++20?

No, I haven’t, or at least not intentionally. A lot happens under the covers with platformio and I don’t usually go digging on the options being used until something breaks.