https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90753
Bug ID: 90753 Summary: missing -Warray-bounds with an extern index in out-of-bounds range Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- Only the out-of-bounds access in f() below is diagnosed. The same invalid access in g() is not. The $ cat a.c && gcc -O2 -S -Wall -Wextra a.c extern char a[4]; int f (int i) { if (i < 9 || 99 < i) i = 9; return a[i]; } int g (void) { extern int i; if (i < 9 || 99 < i) i = 9; return a[i]; } a.c: In function ‘f’: a.c:8:11: warning: array subscript 9 is above array bounds of ‘char[4]’ [-Warray-bounds] 8 | return a[i]; | ~^~~ a.c:1:13: note: while referencing ‘a’ 1 | extern char a[4]; | ^ The VRP dump for f shows i_4: int [9, 99] ... <bb 4> [local count: 1073741824]: # i_4 = PHI <9(2), i_5(D)(3)> _3 = a[i_4]; _7 = (int) _3; return _7; } while the same dump for g: i.3_4: VARYING ... <bb 4> [local count: 1073741824]: i.3_4 = i; _5 = a[i.3_4]; _9 = (int) _5; return _9; } For some reason the range for the index is not available in g.