Author: aaronballman Date: Tue Apr 24 12:21:04 2018 New Revision: 330759 URL: http://llvm.org/viewvc/llvm-project?rev=330759&view=rev Log: Improve -Warray-bounds to handle multiple array extents rather than only handling the top-most array extent.
Patch by Bevin Hansson. Modified: cfe/trunk/lib/Sema/SemaChecking.cpp cfe/trunk/test/SemaCXX/array-bounds.cpp cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp Modified: cfe/trunk/lib/Sema/SemaChecking.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=330759&r1=330758&r2=330759&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaChecking.cpp (original) +++ cfe/trunk/lib/Sema/SemaChecking.cpp Tue Apr 24 12:21:04 2018 @@ -11277,7 +11277,12 @@ void Sema::CheckArrayAccess(const Expr * const ArraySubscriptExpr *ASE = cast<ArraySubscriptExpr>(expr); CheckArrayAccess(ASE->getBase(), ASE->getIdx(), ASE, AllowOnePastEnd > 0); - return; + expr = ASE->getBase(); + break; + } + case Stmt::MemberExprClass: { + expr = cast<MemberExpr>(expr)->getBase(); + break; } case Stmt::OMPArraySectionExprClass: { const OMPArraySectionExpr *ASE = cast<OMPArraySectionExpr>(expr); Modified: cfe/trunk/test/SemaCXX/array-bounds.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/array-bounds.cpp?rev=330759&r1=330758&r2=330759&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/array-bounds.cpp (original) +++ cfe/trunk/test/SemaCXX/array-bounds.cpp Tue Apr 24 12:21:04 2018 @@ -269,3 +269,18 @@ int test_operator_overload_struct_array_ struct P x[10] = {0}; // expected-note {{array 'x' declared here}} return x[1] + x[11]; // expected-warning {{array index 11 is past the end of the array (which contains 10 elements)}} } + +int multi[2][2][2]; // expected-note 3 {{array 'multi' declared here}} +int test_multiarray() { + return multi[2][0][0] + // expected-warning {{array index 2 is past the end of the array (which contains 2 elements)}} + multi[0][2][0] + // expected-warning {{array index 2 is past the end of the array (which contains 2 elements)}} + multi[0][0][2]; // expected-warning {{array index 2 is past the end of the array (which contains 2 elements)}} +} + +struct multi_s { + int arr[4]; +}; +struct multi_s multi2[4]; // expected-note {{array 'multi2' declared here}} +int test_struct_multiarray() { + return multi2[4].arr[0]; // expected-warning {{array index 4 is past the end of the array (which contains 4 elements)}} +} Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp?rev=330759&r1=330758&r2=330759&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp (original) +++ cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp Tue Apr 24 12:21:04 2018 @@ -528,7 +528,7 @@ constexpr int xs6 = p[3]; // expected-er constexpr int xs0 = p[-3]; // ok constexpr int xs_1 = p[-4]; // expected-error {{constant expression}} expected-note {{cannot refer to element -1}} -constexpr int zs[2][2][2][2] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; +constexpr int zs[2][2][2][2] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; // expected-note {{array 'zs' declared here}} static_assert(zs[0][0][0][0] == 1, ""); static_assert(zs[1][1][1][1] == 16, ""); static_assert(zs[0][0][0][2] == 3, ""); // expected-error {{constant expression}} expected-note {{read of dereferenced one-past-the-end pointer}} @@ -536,7 +536,10 @@ static_assert((&zs[0][0][0][2])[-1] == 2 static_assert(**(**(zs + 1) + 1) == 11, ""); static_assert(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][-1] + 1) == 11, ""); // expected-error {{constant expression}} expected-note {{cannot refer to element -1 of array of 2 elements in a constant expression}} static_assert(*(&(&(*(*&(&zs[2] - 1)[0] + 2 - 2))[2])[-1][2] - 2) == 11, ""); -constexpr int err_zs_1_2_0_0 = zs[1][2][0][0]; // expected-error {{constant expression}} expected-note {{cannot access array element of pointer past the end}} +constexpr int err_zs_1_2_0_0 = zs[1][2][0][0]; // \ +expected-error {{constant expression}} \ +expected-note {{cannot access array element of pointer past the end}} \ +expected-warning {{array index 2 is past the end of the array (which contains 2 elements)}} constexpr int fail(const int &p) { return (&p)[64]; // expected-note {{cannot refer to element 64 of array of 2 elements}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits