arduino-cli
arduino-cli copied to clipboard
Prototype not generated for function with inline attribute
Describe the problem
In order to make it easier for beginners to get started with writing Arduino sketches, and for the convenience of all users, Arduino CLI automatically generates and adds prototypes for functions defined in a .ino file of a sketch.
Attributes can be used to specify properties of a function. The attribute declaration may be placed at a variety of locations relative to a function definition.
🐛 A prototype is not generated for the function if the attribute declaration is placed between the type and name in the function definition.
To reproduce
Setup environment
$ arduino-cli version
arduino-cli Version: git-snapshot Commit: c5812eea6 Date: 2024-09-02T17:16:38Z
$ mkdir -p "/tmp/FooSketch"
$ printf '
void loop() {}
void setup() {
foo();
}
void __attribute__(()) foo() {}
' > "/tmp/FooSketch/FooSketch.ino"
Demo
$ arduino-cli compile --fqbn arduino:avr:uno "/tmp/FooSketch"
C:\Users\per\AppData\Local\Temp\FooSketch\FooSketch.ino: In function 'void setup()':
C:\Users\per\AppData\Local\Temp\FooSketch\FooSketch.ino:3:3: error: 'foo' was not declared in this scope
foo();
^~~
🐛 The compilation failed unexpectedly.
By looking at the C++ code generated by the Arduino sketch preprocessor, we can see the cause of the error:
$ arduino-cli compile --fqbn arduino:avr:uno --preprocess "/tmp/FooSketch"
#include <Arduino.h>
#line 1 "C:\\Users\\per\\AppData\\Local\\Temp\\FooSketch\\FooSketch.ino"
#line 1 "C:\\Users\\per\\AppData\\Local\\Temp\\FooSketch\\FooSketch.ino"
void loop();
#line 2 "C:\\Users\\per\\AppData\\Local\\Temp\\FooSketch\\FooSketch.ino"
void setup();
#line 1 "C:\\Users\\per\\AppData\\Local\\Temp\\FooSketch\\FooSketch.ino"
void loop() {}
void setup() {
foo();
}
void __attribute__(()) foo() {}
🐛 The compilation failure was caused by Arduino CLI not creating a prototype for the foo function.
Expected behavior
Prototypes are generated for functions with attribute declarations between the type and name.
Arduino CLI version
c5812eea68afdb0e4e774f4f15ec4a34f0c3100c
Operating system
Windows
Operating system version
11
Additional context
Originally reported by @JLBCS at https://forum.arduino.cc/t/iram-attr-questions/1297715
In the real world sketch shared there, IRAM_ATTR was used. This is a macro for an __attribute__ declaration, provided by Espressif's esp-idf framework.
Additional reports
- https://forum.arduino.cc/t/attachinterrupt-blows-up-in-my-simple-8266-sketch/1314984/3
Related
- https://github.com/arduino/arduino-cli/issues/1191
- https://github.com/arduino/arduino-cli/issues/1253
- https://github.com/arduino/arduino-cli/issues/1269
- https://github.com/arduino/arduino-cli/issues/1591
- https://github.com/arduino/arduino-cli/issues/1618
- https://github.com/arduino/arduino-cli/issues/1785
- https://github.com/arduino/arduino-cli/issues/1822
- https://github.com/arduino/arduino-cli/issues/2161
- https://github.com/arduino/arduino-cli/issues/2525
- https://forum.arduino.cc/t/is-the-location-of-a-global-function-important/996378/18
- https://forum.arduino.cc/t/ide-mistakes-javascript-function-for-type/953022
- https://forum.arduino.cc/t/c-super-quotes-compiler-bug/990071
- https://forum.arduino.cc/t/over-length-line-in-editor-forces-forward-declaration/955571
- https://forum.arduino.cc/t/solved-multiple-ide-tabs-issue/988086
- https://forum.arduino.cc/t/declaration-of-functions/687199/11
- https://forum.arduino.cc/t/tab-local-structs/689088
- https://forum.arduino.cc/t/include-in-multiple-sketches/1133645/11
- https://forum.arduino.cc/t/compiler-flaw-probably-deliberate-infuriating/1146637
- https://forum.arduino.cc/t/does-the-ardiuno-compiler-fully-support-templates/1274584
Workaround
Manually add a function prototype to the sketch:
void __attribute__(()) foo();
void loop() {}
void setup() {
foo();
}
void foo() {}
Issue checklist
- [X] I searched for previous reports in the issue tracker
- [X] I verified the problem still occurs when using the nightly build
- [X] My report contains all necessary details