https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121242

            Bug ID: 121242
           Summary: [GCOV] Wrong coverage for "break" inside
                    switch-structure.
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: gcov-profile
          Assignee: unassigned at gcc dot gnu.org
          Reporter: njuwy at smail dot nju.edu.cn
  Target Milestone: ---

gcc version:
gcc version 16.0.0 20250704 (experimental) (GCC) 

cmd:
gcc --coverage -std=c2x -lm -O0 test.c -o test
./test
gcov ./*.gcda -t > test.c.gcov

$ cat test.c
#include <stdlib.h>
#include <assert.h>
int main(void) {
    struct Point {
        int x, y;
    };
    struct Point origin = { .y = 0 }, *p = &(struct Point){ .x = 1, .y = 2 };
    for (int i = 0; i < 3; i++) {
        switch (i) {
            case 0: 
                p = &origin; 
                break;
            case 1: 
                p = &(struct Point){ .x = 3, .y = 4 }; 
                break;
            default: p = &(struct Point){ .x = 5, .y = 6 };
        }
    }
    return 0;
}

$ cat test.c.gcov
        -:    1:#include <stdlib.h>
        -:    2:#include <assert.h>
        1:    3:int main(void) {
        -:    4:    struct Point {
        -:    5:        int x, y;
        -:    6:    };
        1:    7:    struct Point origin = { .y = 0 }, *p = &(struct Point){ .x
= 1, .y = 2 };
        4:    8:    for (int i = 0; i < 3; i++) {
        3:    9:        switch (i) {
        1:   10:            case 0: 
        1:   11:                p = &origin; 
        2:   12:                break;
        1:   13:            case 1: 
        1:   14:                p = &(struct Point){ .x = 3, .y = 4 }; 
        1:   15:                break;
        1:   16:            default: p = &(struct Point){ .x = 5, .y = 6 };
        -:   17:        }
        -:   18:    }
        1:   19:    return 0;
        -:   20:}


Line 12 was only executed once but its cov was wrongly marked as 2.

Reply via email to