diff options
| author | Bruno Ricci <riccibrun@gmail.com> | 2019-03-25 21:37:10 +0000 |
|---|---|---|
| committer | Bruno Ricci <riccibrun@gmail.com> | 2019-03-25 21:37:10 +0000 |
| commit | 95550e412f3a998797d08463f4fac6b782f4766b (patch) | |
| tree | b089f7d3a5a5eeeddb4b253ce0bf05611063de34 /clang | |
| parent | 77bf2e3704c4b1f27804d5bc08836cd0a3d8486f (diff) | |
| download | bcm5719-llvm-95550e412f3a998797d08463f4fac6b782f4766b.tar.gz bcm5719-llvm-95550e412f3a998797d08463f4fac6b782f4766b.zip | |
[Sema] Don't check for array bounds when the types in the base expression are dependent
Bail-out of CheckArrayAccess when the types of the base expression before
and after eventual casts are dependent. We will get another chance to check
for array bounds during instantiation. Fixes PR41087.
Differential Revision: https://reviews.llvm.org/D59776
Reviewed By: efriedma
llvm-svn: 356957
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 2 | ||||
| -rw-r--r-- | clang/test/SemaCXX/array-bounds.cpp | 13 |
2 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 8f710cad6ff..b9b14a0ede5 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -12522,6 +12522,8 @@ void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr, return; const Type *BaseType = ArrayTy->getElementType().getTypePtr(); + if (EffectiveType->isDependentType() || BaseType->isDependentType()) + return; Expr::EvalResult Result; if (!IndexExpr->EvaluateAsInt(Result, Context, Expr::SE_AllowSideEffects)) diff --git a/clang/test/SemaCXX/array-bounds.cpp b/clang/test/SemaCXX/array-bounds.cpp index 6ebff8c9920..495ccaf71bd 100644 --- a/clang/test/SemaCXX/array-bounds.cpp +++ b/clang/test/SemaCXX/array-bounds.cpp @@ -296,3 +296,16 @@ namespace PR39746 { // We can still diagnose this. C &h() { return reinterpret_cast<C *>(xxx)[-1]; } // expected-warning {{array index -1 is before the beginning of the array}} } + +namespace PR41087 { + template <typename Ty> 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<char>(); // expected-note 1{{in instantiation of function template specialization}} + foo<int>(); // expected-note 1{{in instantiation of function template specialization}} + }; +} |

