1d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrain// RUN: %clang_cc1 -verify -Warray-bounds-pointer-arithmetic %s
2d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrain
3d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrain// Test case from PR10615
4d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrainstruct ext2_super_block{
5d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrain  unsigned char s_uuid[8]; // expected-note {{declared here}}
6d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrain};
7d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrainvoid* ext2_statfs (struct ext2_super_block *es,int a)
8d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrain{
9d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrain	 return (void *)es->s_uuid + sizeof(int); // no-warning
10d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrain}
11d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrainvoid* broken (struct ext2_super_block *es,int a)
12d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrain{
13d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrain	 return (void *)es->s_uuid + 80; // expected-warning {{refers past the end of the array}}
14d10f4bc5a05ce0cdc1646dbb0f706bb9d3dfc0c5Kaelyn Uhrain}
1525b009a9d2a79929112d3c28c7dd1730bf5246c8Richard Smith
1625b009a9d2a79929112d3c28c7dd1730bf5246c8Richard Smith// Test case reduced from PR11594
1725b009a9d2a79929112d3c28c7dd1730bf5246c8Richard Smithstruct S { int n; };
1825b009a9d2a79929112d3c28c7dd1730bf5246c8Richard Smithvoid pr11594(struct S *s) {
1925b009a9d2a79929112d3c28c7dd1730bf5246c8Richard Smith  int a[10];
2025b009a9d2a79929112d3c28c7dd1730bf5246c8Richard Smith  int *p = a - s->n;
2125b009a9d2a79929112d3c28c7dd1730bf5246c8Richard Smith}
2200e1f6f5fed4f33f67181578be0232accd342282Ted Kremenek
2300e1f6f5fed4f33f67181578be0232accd342282Ted Kremenek// Test case reduced from <rdar://problem/11387038>.  This resulted in
2400e1f6f5fed4f33f67181578be0232accd342282Ted Kremenek// an assertion failure because of the typedef instead of an explicit
2500e1f6f5fed4f33f67181578be0232accd342282Ted Kremenek// constant array type.
2600e1f6f5fed4f33f67181578be0232accd342282Ted Kremenekstruct RDar11387038 {};
2700e1f6f5fed4f33f67181578be0232accd342282Ted Kremenektypedef struct RDar11387038 RDar11387038Array[1];
2800e1f6f5fed4f33f67181578be0232accd342282Ted Kremenekstruct RDar11387038_Table {
2900e1f6f5fed4f33f67181578be0232accd342282Ted Kremenek  RDar11387038Array z;
3000e1f6f5fed4f33f67181578be0232accd342282Ted Kremenek};
3100e1f6f5fed4f33f67181578be0232accd342282Ted Kremenektypedef struct RDar11387038_Table * TPtr;
3200e1f6f5fed4f33f67181578be0232accd342282Ted Kremenektypedef TPtr *TabHandle;
3300e1f6f5fed4f33f67181578be0232accd342282Ted Kremenekstruct RDar11387038_B { TabHandle x; };
3400e1f6f5fed4f33f67181578be0232accd342282Ted Kremenektypedef struct RDar11387038_B RDar11387038_B;
3500e1f6f5fed4f33f67181578be0232accd342282Ted Kremenek
3600e1f6f5fed4f33f67181578be0232accd342282Ted Kremenekvoid radar11387038() {
3700e1f6f5fed4f33f67181578be0232accd342282Ted Kremenek  RDar11387038_B *pRDar11387038_B;
3800e1f6f5fed4f33f67181578be0232accd342282Ted Kremenek  struct RDar11387038* y = &(*pRDar11387038_B->x)->z[4];
3900e1f6f5fed4f33f67181578be0232accd342282Ted Kremenek}
40