[clang] Handle indexes (PR #130528)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Mar 9 17:06:33 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: AZero13 (AZero13)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/130528.diff
1 Files Affected:
- (modified) clang/lib/AST/DeclCXX.cpp (+22-1)
``````````diff
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
index 7eff776882629..ecba340f0425a 100644
--- a/clang/lib/AST/DeclCXX.cpp
+++ b/clang/lib/AST/DeclCXX.cpp
@@ -1689,7 +1689,7 @@ static NamedDecl* getLambdaCallOperatorHelper(const CXXRecordDecl &RD) {
// auto L = [](T) { }; // But A's call operator would want A's here.
// }
//
- // Walk the call operator’s redecl chain to find the one that belongs
+ // Walk the call operator's redecl chain to find the one that belongs
// to this module.
//
// TODO: We need to fix this properly (see
@@ -2465,6 +2465,27 @@ CXXMethodDecl *CXXMethodDecl::getDevirtualizedMethod(const Expr *Base,
if (Base->isPRValue() && Base->getType()->isRecordType())
return this;
+ // Handle array subscripts with constant indices when the pointee type is known
+ if (const auto *ASE = dyn_cast<ArraySubscriptExpr>(Base)) {
+ QualType BaseTy = ASE->getBase()->getType();
+
+ // Check if it's a pointer to a record type
+ if (BaseTy->isPointerType() &&
+ BaseTy->getPointeeType()->isRecordType()) {
+ // For C++17 and later, we can devirtualize array access beyond p[0]
+ // According to [expr.add]/6, if the array element type and the pointee
+ // type are not similar, behavior is undefined, so we can assume they are
+ // the same type
+ const ASTContext &Context = getParent()->getASTContext();
+ const LangOptions &LangOpts = Context.getLangOpts();
+ if (LangOpts.CPlusPlus17 &&
+ ASE->getIdx()->isIntegerConstantExpr(Context)) {
+ // It's a constant index, so it's safe to devirtualize
+ return this;
+ }
+ }
+ }
+
// If we don't even know what we would call, we can't devirtualize.
const CXXRecordDecl *BestDynamicDecl = Base->getBestDynamicClassType();
if (!BestDynamicDecl)
``````````
</details>
https://github.com/llvm/llvm-project/pull/130528
More information about the cfe-commits
mailing list