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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits