================ @@ -420,25 +420,63 @@ AST_MATCHER(ArraySubscriptExpr, isSafeArraySubscript) { // already duplicated // - call both from Sema and from here - const auto *BaseDRE = - dyn_cast<DeclRefExpr>(Node.getBase()->IgnoreParenImpCasts()); - if (!BaseDRE) + if (const auto *BaseDRE = + dyn_cast<DeclRefExpr>(Node.getBase()->IgnoreParenImpCasts())) { + if (!BaseDRE->getDecl()) + return false; + if (const auto *CATy = Finder->getASTContext().getAsConstantArrayType( + BaseDRE->getDecl()->getType())) { + if (const auto *IdxLit = dyn_cast<IntegerLiteral>(Node.getIdx())) { ---------------- haoNoQ wrote:
I suspect that this could have been a: ```c++ const Expr *BaseE = Node.getBase()->IgnoreParenImpCasts(); if (isa<DeclRefExpr, StringLiteral>(BaseE)) { if (const auto *CATy = Finder->getASTContext().getAsConstantArrayType(BaseE->getType())) { ... } } ``` Which would also eliminate duplication. (Unless `DeclRefExpr->getDecl()->getType()` is somehow significantly different from `DeclRefExpr->getType()`.) Another thing we can try is to simply eliminate the `isa` entirely. Like, we know that it's "an" expression, and its type is a constant-size array type. Do we really need more? Why not simply trust the type system? (It's not like the C type system has ever lied to us right? 😅) https://github.com/llvm/llvm-project/pull/92432 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits