Index: cfe/trunk/lib/Sema/SemaChecking.cpp =================================================================== --- cfe/trunk/lib/Sema/SemaChecking.cpp +++ cfe/trunk/lib/Sema/SemaChecking.cpp @@ -12522,6 +12522,8 @@ return; const Type *BaseType = ArrayTy->getElementType().getTypePtr(); + if (EffectiveType->isDependentType() || BaseType->isDependentType()) + return; Expr::EvalResult Result; if (!IndexExpr->EvaluateAsInt(Result, Context, Expr::SE_AllowSideEffects)) Index: cfe/trunk/test/SemaCXX/array-bounds.cpp =================================================================== --- cfe/trunk/test/SemaCXX/array-bounds.cpp +++ cfe/trunk/test/SemaCXX/array-bounds.cpp @@ -296,3 +296,16 @@ // We can still diagnose this. C &h() { return reinterpret_cast(xxx)[-1]; } // expected-warning {{array index -1 is before the beginning of the array}} } + +namespace PR41087 { + template void foo() { + Ty buffer[2]; // expected-note 3{{array 'buffer' declared here}} + ((char *)buffer)[2] = 'A'; // expected-warning 1{{array index 2 is past the end of the array (which contains 2 elements)}} + ((char *)buffer)[-1] = 'A'; // expected-warning 2{{array index -1 is before the beginning of the array}} + } + + void f() { + foo(); // expected-note 1{{in instantiation of function template specialization}} + foo(); // expected-note 1{{in instantiation of function template specialization}} + }; +}