#10154·Arduino

Confusion caused by use of -fpermissive in AVR and megaAVR compilation recipes

Author: allnickCreated May 6, 2020Updated Jun 11, 2025
LabelsType: BugComponent: Compilation

Hi. There is the problem.

=============================================================

void setup() {
 Serial.begin(9600);
 Serial.println("Start");
}

void loop() {
 char ch = Serial.read();
 switch(ch){
  case '1':
   Serial.println("Block 1 starts executing");
   // Some block 1
   break;
  case '2':
   Serial.println("Block 2 starts executing");
   byte b;
   b = 0; // It's OK.
   // Some block 2
   break;
  case '3':
   Serial.println("Block 3 starts executing");
   // Some block 3
   break;
  case '4':
   Serial.println("Block 4 starts executing");
   // Some block 4
   break;
 }
}

Sketch uses 1668 bytes (5%) of program storage space… Global variables use 294 bytes (14%) of dynamic memory…

=============================================================

void setup() {
 Serial.begin(9600);
 Serial.println("Start");
}

void loop() {
 char ch = Serial.read();
 switch(ch){
  case '1':
   Serial.println("Block 1 starts executing");
   // Some block 1
   break;
  case '2':
   Serial.println("Block 2 starts executing");
   byte b = 0; // This causes the problem! All blocks below the 2nd are never executed !!!
            // However, the value of the local variable in the 2nd block remains correct!
   // Some block 2
   break;
  case '3':
   Serial.println("Block 3 starts executing");
   // Some block 3
   break;
  case '4':
   Serial.println("Block 4 starts executing");
   // Some block 4
   break;
 }
}

Sketch uses 1596 bytes (4%) of program storage space… Global variables use 244 bytes (11%) of dynamic memory…

=============================================================

Note the noticeably smaller code size in the second case. Moreover, this does not depend on the number of blocks below the second one! It looks like the linker just doesn't include them in the final code!

Additional context

Additional reports