[clang] b7a7aee - [clang] Qualify auto in range-based for loops (NFC)
David Blaikie via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 12 09:17:37 PDT 2022
On Sat, Sep 10, 2022 at 3:01 PM Kazu Hirata <kazu at google.com> wrote:
>
> Thank you Aaron and David for your inputs.
>
> First and foremost, I apologize if I made your job harder by increasing the number of commits you have to peel to get to the real author.
>
> I hear that we are moving toward github pull requests. A casual search tells me that there are some add-ons to integrate clang-tidy into the code review platform, so I am hoping we can use something like that to get each patch right first time.
>
> Going forward, I'll take git churn and the difficulty of backsliding as big factors in doing future clenaups. For example, it's probably a good idea to delete a function that hasn't been used for many years (excluding dump functions and such). Library standardization (like the recent removal of llvm::array_lengthof in favor of std::size) is less good in terms of git churn, but it's very unlikely for somebody to re-introduce llvm::array_lengthof.
I think API deprecations (where the API can be completely removed
eventually, and marked as deprecated/all in-tree usage removed within
O(weeks/months)) especially for cases like the core/support libraries
with relatively many uses, and relatively small APIs are great - if we
get into the territory of naming convention cleanup, that gets more
debatable because there's wide APIs with many naming violations and
then we need more community discussion about what direction we're
going (there are multiple lingering naming conventions, some
discussions about moving to different ones in the future, so maybe
churn to meet the current letter of the style guide would be better
spent after changing the style guide with those directions in mind,
etc).
For stylistic things like range-based-for conversion, const auto*, etc
- yeah, there's some wriggle room depending on how uncontentious the
conversion is, I think.
(there's also some way to mark certain changes as ignorable by git?
Maybe using that more frequently would help lower the cost of these
sort of changes - broader discussion on discourse about ways to
enable/lower the cost of these sort of changes would probably be good
- I think as much as we can make these sort of changes cheaper/less
problematic, to make them more encouraged, is a really good thing to
do)
>
> Thanks,
>
> Kazu Hirata
>
>
> On Fri, Sep 9, 2022 at 5:27 AM Aaron Ballman <aaron at aaronballman.com> wrote:
>>
>> On Thu, Sep 8, 2022 at 12:37 PM David Blaikie <dblaikie at gmail.com> wrote:
>> >
>> > Mixed feelings here - Kazu's made a lot of cleanup/stylistic changes
>> > across the LLVM project for a while now, most, at least I think, are
>> > quite welcome (things like switching to range-based-for, std
>> > algorithms over llvm ones, llvm algorithms over manually written
>> > loops, etc). But yeah, there's some threshold below which the churn
>> > might not be worth the benefit - especially if the change doesn't come
>> > along with tooling to enforce the invariant is maintained in the
>> > future (if it's easy to make mistakes like this one - we'll regress it
>> > and need to do cleanup again in the future)
>>
>> Thanks for speaking up, because I also waffled a bit on whether I
>> called this out or not. :-)
>>
>> > Also, for this particular one, I wonder if in some cases this sort of
>> > automatic transformation isn't ideal - if something is a pointer, but
>> > that's an implementation detail, rather than an intentional feature of
>> > an API (eg: the pointer-ness might be hidden behind a typedef and used
>> > as an opaque handle, without any dereferencing, etc)
>>
>> Agreed.
>>
>> > I think it'd be really good to have some discussion on discourse about
>> > if/how some of these cleanups could be formed into a way to
>> > enforce/encourage the invariant to be maintained going forward -
>> > clang-tidy (assuming that's the basis for the tooling Kazu's using to
>> > make these changes in the first place) integration into the LLVM build
>> > in some way, etc.
>>
>> I think that's a good idea! We want to encourage cleanups, but we
>> don't want to encourage churn, and I think it's somewhat subjective
>> where to draw that line. Having some more community awareness around
>> that would be beneficial. I'm especially interested in how we balance
>> between making incremental style improvements to the project and
>> keeping our git blame logs useful. I'm seeing a lot more git blames
>> that require several steps to get to an interesting commit because of
>> the number of NFCs and reverts/recommits. Unfortunately, the tooling
>> around viewing git blames of large files (like Clang tends to have)
>> makes these sorts of commits surprisingly painful when you do have to
>> dig to see where changes came from. (So I find myself having far less
>> concern when TransGCAttrs.cpp (~350LoC) gets a cleanup like this
>> compared to SemaExpr.cpp (~21kLoC), which suggests to me we should
>> maybe strongly consider splitting more of these massive files up so
>> that churn is less painful.)
>>
>> > & yeah, adding the `const` too if/when that's relevant would've
>> > improved the quality/value/justification for a cleanup change like
>> > this.
>>
>> It also would have matched our coding style. (We document it somewhat
>> poorly as an example showing "observe" and "change", but reviewers who
>> call for cleanups with auto are pretty consistent about asking to make
>> qualifiers explicit.)
>>
>> ~Aaron
>>
>> >
>> > On Sun, Sep 4, 2022 at 5:58 AM Aaron Ballman via cfe-commits
>> > <cfe-commits at lists.llvm.org> wrote:
>> > >
>> > > FWIW, sweeping NFC changes like this cause a fair amount of code churn
>> > > (which makes tools like git blame a bit harder to use) for a
>> > > relatively small improvement to code readability, which is why our
>> > > developer policy asks that you "Avoid committing formatting- or
>> > > whitespace-only changes outside of code you plan to make subsequent
>> > > changes to." In the future, I'd caution against doing such large-scale
>> > > sweeping NFC changes outside of areas you're actively working on
>> > > unless there's some wider discussion with the community first. That
>> > > said, all of your changes are all improvements, so thank you for them!
>> > >
>> > > Some of the changes you made would have ideally made it more clear
>> > > when the deduced type is a pointer to a const object instead of hiding
>> > > the qualifier behind the deduction. I've pointed out a couple such
>> > > places below, but don't feel obligated to go back and change anything
>> > > unless you're going to be touching other code in the area.
>> > >
>> > > ~Aaron
>> > >
>> > >
>> > > On Sun, Sep 4, 2022 at 2:27 AM Kazu Hirata via cfe-commits
>> > > <cfe-commits at lists.llvm.org> wrote:
>> > > >
>> > > >
>> > > > Author: Kazu Hirata
>> > > > Date: 2022-09-03T23:27:27-07:00
>> > > > New Revision: b7a7aeee90cffefd0f73b8d9f44ab4d1d5123d05
>> > > >
>> > > > URL: https://github.com/llvm/llvm-project/commit/b7a7aeee90cffefd0f73b8d9f44ab4d1d5123d05
>> > > > DIFF: https://github.com/llvm/llvm-project/commit/b7a7aeee90cffefd0f73b8d9f44ab4d1d5123d05.diff
>> > > >
>> > > > LOG: [clang] Qualify auto in range-based for loops (NFC)
>> > > >
>> > > > Added:
>> > > >
>> > > >
>> > > > Modified:
>> > > > clang/lib/ARCMigrate/ObjCMT.cpp
>> > > > clang/lib/ARCMigrate/TransGCAttrs.cpp
>> > > > clang/lib/AST/ASTContext.cpp
>> > > > clang/lib/AST/ASTImporter.cpp
>> > > > clang/lib/AST/Decl.cpp
>> > > > clang/lib/AST/DeclObjC.cpp
>> > > > clang/lib/AST/ODRHash.cpp
>> > > > clang/lib/AST/OpenMPClause.cpp
>> > > > clang/lib/AST/StmtProfile.cpp
>> > > > clang/lib/AST/Type.cpp
>> > > > clang/lib/Analysis/CFG.cpp
>> > > > clang/lib/Analysis/ThreadSafetyCommon.cpp
>> > > > clang/lib/CodeGen/CGBlocks.cpp
>> > > > clang/lib/CodeGen/CGCall.cpp
>> > > > clang/lib/CodeGen/CGClass.cpp
>> > > > clang/lib/CodeGen/CGDebugInfo.cpp
>> > > > clang/lib/CodeGen/CGDeclCXX.cpp
>> > > > clang/lib/CodeGen/CGExpr.cpp
>> > > > clang/lib/CodeGen/CGObjCGNU.cpp
>> > > > clang/lib/CodeGen/CGObjCMac.cpp
>> > > > clang/lib/CodeGen/CodeGenFunction.cpp
>> > > > clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp
>> > > > clang/lib/CodeGen/SwiftCallingConv.cpp
>> > > > clang/lib/Driver/Compilation.cpp
>> > > > clang/lib/Driver/Driver.cpp
>> > > > clang/lib/Driver/ToolChains/Clang.cpp
>> > > > clang/lib/Driver/ToolChains/CommonArgs.cpp
>> > > > clang/lib/Driver/ToolChains/Gnu.cpp
>> > > > clang/lib/Driver/ToolChains/HIPAMD.cpp
>> > > > clang/lib/Format/Format.cpp
>> > > > clang/lib/Frontend/FrontendActions.cpp
>> > > > clang/lib/Index/USRGeneration.cpp
>> > > > clang/lib/Sema/IdentifierResolver.cpp
>> > > > clang/lib/Sema/Sema.cpp
>> > > > clang/lib/Sema/SemaCodeComplete.cpp
>> > > > clang/lib/Sema/SemaDecl.cpp
>> > > > clang/lib/Sema/SemaDeclAttr.cpp
>> > > > clang/lib/Sema/SemaDeclCXX.cpp
>> > > > clang/lib/Sema/SemaDeclObjC.cpp
>> > > > clang/lib/Sema/SemaExpr.cpp
>> > > > clang/lib/Sema/SemaExprCXX.cpp
>> > > > clang/lib/Sema/SemaInit.cpp
>> > > > clang/lib/Sema/SemaLambda.cpp
>> > > > clang/lib/Sema/SemaLookup.cpp
>> > > > clang/lib/Sema/SemaObjCProperty.cpp
>> > > > clang/lib/Sema/SemaOpenMP.cpp
>> > > > clang/lib/Sema/SemaOverload.cpp
>> > > > clang/lib/Sema/SemaTemplateDeduction.cpp
>> > > > clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
>> > > > clang/lib/Serialization/ASTReader.cpp
>> > > > clang/lib/Serialization/ASTWriterDecl.cpp
>> > > > clang/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp
>> > > > clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp
>> > > > clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp
>> > > > clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp
>> > > > clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
>> > > > clang/lib/StaticAnalyzer/Core/CallEvent.cpp
>> > > > clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
>> > > > clang/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp
>> > > > clang/lib/Tooling/Tooling.cpp
>> > > >
>> > > > Removed:
>> > > >
>> > > >
>> > > >
>> > > > ################################################################################
>> > > > diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp
>> > > > index 26f751b77f86a..fe0ce4c5cdc3a 100644
>> > > > --- a/clang/lib/ARCMigrate/ObjCMT.cpp
>> > > > +++ b/clang/lib/ARCMigrate/ObjCMT.cpp
>> > > > @@ -792,7 +792,7 @@ static bool UseNSOptionsMacro(Preprocessor &PP, ASTContext &Ctx,
>> > > > bool PowerOfTwo = true;
>> > > > bool AllHexdecimalEnumerator = true;
>> > > > uint64_t MaxPowerOfTwoVal = 0;
>> > > > - for (auto Enumerator : EnumDcl->enumerators()) {
>> > > > + for (auto *Enumerator : EnumDcl->enumerators()) {
>> > > > const Expr *InitExpr = Enumerator->getInitExpr();
>> > > > if (!InitExpr) {
>> > > > PowerOfTwo = false;
>> > > >
>> > > > diff --git a/clang/lib/ARCMigrate/TransGCAttrs.cpp b/clang/lib/ARCMigrate/TransGCAttrs.cpp
>> > > > index 99a61e0842a76..b94aee2de573e 100644
>> > > > --- a/clang/lib/ARCMigrate/TransGCAttrs.cpp
>> > > > +++ b/clang/lib/ARCMigrate/TransGCAttrs.cpp
>> > > > @@ -158,7 +158,7 @@ class GCAttrsCollector : public RecursiveASTVisitor<GCAttrsCollector> {
>> > > > if (!D)
>> > > > return false;
>> > > >
>> > > > - for (auto I : D->redecls())
>> > > > + for (auto *I : D->redecls())
>> > > > if (!isInMainFile(I->getLocation()))
>> > > > return false;
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
>> > > > index 52e7eeca665ab..20fcc8fea4b79 100644
>> > > > --- a/clang/lib/AST/ASTContext.cpp
>> > > > +++ b/clang/lib/AST/ASTContext.cpp
>> > > > @@ -7568,7 +7568,7 @@ std::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const {
>> > > > // FIXME: There might(should) be a better way of doing this computation!
>> > > > CharUnits PtrSize = getTypeSizeInChars(VoidPtrTy);
>> > > > CharUnits ParmOffset = PtrSize;
>> > > > - for (auto PI : Decl->parameters()) {
>> > > > + for (auto *PI : Decl->parameters()) {
>> > > > QualType PType = PI->getType();
>> > > > CharUnits sz = getObjCEncodingTypeSize(PType);
>> > > > if (sz.isZero())
>> > > > @@ -7583,7 +7583,7 @@ std::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const {
>> > > >
>> > > > // Argument types.
>> > > > ParmOffset = PtrSize;
>> > > > - for (auto PVDecl : Decl->parameters()) {
>> > > > + for (auto *PVDecl : Decl->parameters()) {
>> > > > QualType PType = PVDecl->getOriginalType();
>> > > > if (const auto *AT =
>> > > > dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
>> > > > @@ -7612,7 +7612,7 @@ ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const {
>> > > > getObjCEncodingForType(Decl->getReturnType(), S);
>> > > > CharUnits ParmOffset;
>> > > > // Compute size of all parameters.
>> > > > - for (auto PI : Decl->parameters()) {
>> > > > + for (auto *PI : Decl->parameters()) {
>> > > > QualType PType = PI->getType();
>> > > > CharUnits sz = getObjCEncodingTypeSize(PType);
>> > > > if (sz.isZero())
>> > > > @@ -7626,7 +7626,7 @@ ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl) const {
>> > > > ParmOffset = CharUnits::Zero();
>> > > >
>> > > > // Argument types.
>> > > > - for (auto PVDecl : Decl->parameters()) {
>> > > > + for (auto *PVDecl : Decl->parameters()) {
>> > >
>> > > Because `Decl` is `const FunctionDecl *`, the parameters should
>> > > (notionally at least) be const as well.
>> > >
>> > > > QualType PType = PVDecl->getOriginalType();
>> > > > if (const auto *AT =
>> > > > dyn_cast<ArrayType>(PType->getCanonicalTypeInternal())) {
>> > > > @@ -9724,7 +9724,7 @@ void getIntersectionOfProtocols(ASTContext &Context,
>> > > > llvm::SmallPtrSet<ObjCProtocolDecl *, 8> LHSProtocolSet;
>> > > >
>> > > > // Start with the protocol qualifiers.
>> > > > - for (auto proto : LHS->quals()) {
>> > > > + for (auto *proto : LHS->quals()) {
>> > > > Context.CollectInheritedProtocols(proto, LHSProtocolSet);
>> > > > }
>> > > >
>> > > > @@ -9735,7 +9735,7 @@ void getIntersectionOfProtocols(ASTContext &Context,
>> > > > llvm::SmallPtrSet<ObjCProtocolDecl *, 8> RHSProtocolSet;
>> > > >
>> > > > // Start with the protocol qualifiers.
>> > > > - for (auto proto : RHS->quals()) {
>> > > > + for (auto *proto : RHS->quals()) {
>> > > > Context.CollectInheritedProtocols(proto, RHSProtocolSet);
>> > > > }
>> > > >
>> > > > @@ -9743,7 +9743,7 @@ void getIntersectionOfProtocols(ASTContext &Context,
>> > > > Context.CollectInheritedProtocols(RHS->getInterface(), RHSProtocolSet);
>> > > >
>> > > > // Compute the intersection of the collected protocol sets.
>> > > > - for (auto proto : LHSProtocolSet) {
>> > > > + for (auto *proto : LHSProtocolSet) {
>> > > > if (RHSProtocolSet.count(proto))
>> > > > IntersectionSet.push_back(proto);
>> > > > }
>> > > >
>> > > > diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
>> > > > index c368a61577cba..bd78ece6efa98 100644
>> > > > --- a/clang/lib/AST/ASTImporter.cpp
>> > > > +++ b/clang/lib/AST/ASTImporter.cpp
>> > > > @@ -3592,7 +3592,7 @@ ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) {
>> > > >
>> > > > // Import the function parameters.
>> > > > SmallVector<ParmVarDecl *, 8> Parameters;
>> > > > - for (auto P : D->parameters()) {
>> > > > + for (auto *P : D->parameters()) {
>> > > > if (Expected<ParmVarDecl *> ToPOrErr = import(P))
>> > > > Parameters.push_back(*ToPOrErr);
>> > > > else
>> > > >
>> > > > diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp
>> > > > index 7dc0fec46d421..957610ef36b74 100644
>> > > > --- a/clang/lib/AST/Decl.cpp
>> > > > +++ b/clang/lib/AST/Decl.cpp
>> > > > @@ -1527,7 +1527,7 @@ LinkageInfo LinkageComputer::getLVForDecl(const NamedDecl *D,
>> > > > // that all other computed linkages match, check that the one we just
>> > > > // computed also does.
>> > > > NamedDecl *Old = nullptr;
>> > > > - for (auto I : D->redecls()) {
>> > > > + for (auto *I : D->redecls()) {
>> > >
>> > > Similar here for the redeclarations of a `const NamedDecl *`.
>> > >
>> > > > auto *T = cast<NamedDecl>(I);
>> > > > if (T == D)
>> > > > continue;
>> > > > @@ -1825,7 +1825,7 @@ bool NamedDecl::declarationReplaces(NamedDecl *OldD, bool IsKnownNewer) const {
>> > > > // Check whether this is actually newer than OldD. We want to keep the
>> > > > // newer declaration. This loop will usually only iterate once, because
>> > > > // OldD is usually the previous declaration.
>> > > > - for (auto D : redecls()) {
>> > > > + for (auto *D : redecls()) {
>> > > > if (D == OldD)
>> > > > break;
>> > > >
>> > > > @@ -2273,7 +2273,7 @@ VarDecl *VarDecl::getActingDefinition() {
>> > > >
>> > > > VarDecl *VarDecl::getDefinition(ASTContext &C) {
>> > > > VarDecl *First = getFirstDecl();
>> > > > - for (auto I : First->redecls()) {
>> > > > + for (auto *I : First->redecls()) {
>> > > > if (I->isThisDeclarationADefinition(C) == Definition)
>> > > > return I;
>> > > > }
>> > > > @@ -2284,7 +2284,7 @@ VarDecl::DefinitionKind VarDecl::hasDefinition(ASTContext &C) const {
>> > > > DefinitionKind Kind = DeclarationOnly;
>> > > >
>> > > > const VarDecl *First = getFirstDecl();
>> > > > - for (auto I : First->redecls()) {
>> > > > + for (auto *I : First->redecls()) {
>> > > > Kind = std::max(Kind, I->isThisDeclarationADefinition(C));
>> > > > if (Kind == Definition)
>> > > > break;
>> > > > @@ -2294,7 +2294,7 @@ VarDecl::DefinitionKind VarDecl::hasDefinition(ASTContext &C) const {
>> > > > }
>> > > >
>> > > > const Expr *VarDecl::getAnyInitializer(const VarDecl *&D) const {
>> > > > - for (auto I : redecls()) {
>> > > > + for (auto *I : redecls()) {
>> > > > if (auto Expr = I->getInit()) {
>> > > > D = I;
>> > > > return Expr;
>> > > > @@ -2330,7 +2330,7 @@ Stmt **VarDecl::getInitAddress() {
>> > > >
>> > > > VarDecl *VarDecl::getInitializingDeclaration() {
>> > > > VarDecl *Def = nullptr;
>> > > > - for (auto I : redecls()) {
>> > > > + for (auto *I : redecls()) {
>> > > > if (I->hasInit())
>> > > > return I;
>> > > >
>> > > > @@ -3015,7 +3015,7 @@ FunctionDecl::getDefaultedFunctionInfo() const {
>> > > > }
>> > > >
>> > > > bool FunctionDecl::hasBody(const FunctionDecl *&Definition) const {
>> > > > - for (auto I : redecls()) {
>> > > > + for (auto *I : redecls()) {
>> > > > if (I->doesThisDeclarationHaveABody()) {
>> > > > Definition = I;
>> > > > return true;
>> > > > @@ -3686,7 +3686,7 @@ bool FunctionDecl::isInlineDefinitionExternallyVisible() const {
>> > > >
>> > > > // If any declaration is 'inline' but not 'extern', then this definition
>> > > > // is externally visible.
>> > > > - for (auto Redecl : redecls()) {
>> > > > + for (auto *Redecl : redecls()) {
>> > > > if (Redecl->isInlineSpecified() &&
>> > > > Redecl->getStorageClass() != SC_Extern)
>> > > > return true;
>> > > > @@ -3703,7 +3703,7 @@ bool FunctionDecl::isInlineDefinitionExternallyVisible() const {
>> > > > // [...] If all of the file scope declarations for a function in a
>> > > > // translation unit include the inline function specifier without extern,
>> > > > // then the definition in that translation unit is an inline definition.
>> > > > - for (auto Redecl : redecls()) {
>> > > > + for (auto *Redecl : redecls()) {
>> > > > if (RedeclForcesDefC99(Redecl))
>> > > > return true;
>> > > > }
>> > > > @@ -4408,7 +4408,7 @@ void TagDecl::startDefinition() {
>> > > > if (auto *D = dyn_cast<CXXRecordDecl>(this)) {
>> > > > struct CXXRecordDecl::DefinitionData *Data =
>> > > > new (getASTContext()) struct CXXRecordDecl::DefinitionData(D);
>> > > > - for (auto I : redecls())
>> > > > + for (auto *I : redecls())
>> > > > cast<CXXRecordDecl>(I)->DefinitionData = Data;
>> > > > }
>> > > > }
>> > > > @@ -4441,7 +4441,7 @@ TagDecl *TagDecl::getDefinition() const {
>> > > > if (const auto *CXXRD = dyn_cast<CXXRecordDecl>(this))
>> > > > return CXXRD->getDefinition();
>> > > >
>> > > > - for (auto R : redecls())
>> > > > + for (auto *R : redecls())
>> > > > if (R->isCompleteDefinition())
>> > > > return R;
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp
>> > > > index 15c545b59c819..5475d0c841f64 100644
>> > > > --- a/clang/lib/AST/DeclObjC.cpp
>> > > > +++ b/clang/lib/AST/DeclObjC.cpp
>> > > > @@ -864,7 +864,7 @@ bool ObjCMethodDecl::isDesignatedInitializerForTheInterface(
>> > > > }
>> > > >
>> > > > bool ObjCMethodDecl::hasParamDestroyedInCallee() const {
>> > > > - for (auto param : parameters()) {
>> > > > + for (auto *param : parameters()) {
>> > > > if (param->isDestroyedInCallee())
>> > > > return true;
>> > > > }
>> > > > @@ -1496,7 +1496,7 @@ ObjCTypeParamList *ObjCTypeParamList::create(
>> > > > void ObjCTypeParamList::gatherDefaultTypeArgs(
>> > > > SmallVectorImpl<QualType> &typeArgs) const {
>> > > > typeArgs.reserve(size());
>> > > > - for (auto typeParam : *this)
>> > > > + for (auto *typeParam : *this)
>> > > > typeArgs.push_back(typeParam->getUnderlyingType());
>> > > > }
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/AST/ODRHash.cpp b/clang/lib/AST/ODRHash.cpp
>> > > > index 04cbb09356d7b..51f806429f67a 100644
>> > > > --- a/clang/lib/AST/ODRHash.cpp
>> > > > +++ b/clang/lib/AST/ODRHash.cpp
>> > > > @@ -564,7 +564,7 @@ void ODRHash::AddFunctionDecl(const FunctionDecl *Function,
>> > > > AddQualType(Function->getReturnType());
>> > > >
>> > > > ID.AddInteger(Function->param_size());
>> > > > - for (auto Param : Function->parameters())
>> > > > + for (auto *Param : Function->parameters())
>> > > > AddSubDecl(Param);
>> > > >
>> > > > if (SkipBody) {
>> > > > @@ -934,7 +934,7 @@ class ODRTypeVisitor : public TypeVisitor<ODRTypeVisitor> {
>> > > >
>> > > > auto Protocols = T->getProtocols();
>> > > > ID.AddInteger(Protocols.size());
>> > > > - for (auto Protocol : Protocols) {
>> > > > + for (auto *Protocol : Protocols) {
>> > > > AddDecl(Protocol);
>> > > > }
>> > > >
>> > > > @@ -952,7 +952,7 @@ class ODRTypeVisitor : public TypeVisitor<ODRTypeVisitor> {
>> > > > AddDecl(T->getDecl());
>> > > > auto Protocols = T->getProtocols();
>> > > > ID.AddInteger(Protocols.size());
>> > > > - for (auto Protocol : Protocols) {
>> > > > + for (auto *Protocol : Protocols) {
>> > > > AddDecl(Protocol);
>> > > > }
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp
>> > > > index 214ae5bd6be48..adfc1d542bb34 100644
>> > > > --- a/clang/lib/AST/OpenMPClause.cpp
>> > > > +++ b/clang/lib/AST/OpenMPClause.cpp
>> > > > @@ -1702,7 +1702,7 @@ void OMPClausePrinter::VisitOMPSimdlenClause(OMPSimdlenClause *Node) {
>> > > > void OMPClausePrinter::VisitOMPSizesClause(OMPSizesClause *Node) {
>> > > > OS << "sizes(";
>> > > > bool First = true;
>> > > > - for (auto Size : Node->getSizesRefs()) {
>> > > > + for (auto *Size : Node->getSizesRefs()) {
>> > > > if (!First)
>> > > > OS << ", ";
>> > > > Size->printPretty(OS, nullptr, Policy, 0);
>> > > >
>> > > > diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp
>> > > > index 92a8b18cf68a3..6af2beefc7926 100644
>> > > > --- a/clang/lib/AST/StmtProfile.cpp
>> > > > +++ b/clang/lib/AST/StmtProfile.cpp
>> > > > @@ -472,7 +472,7 @@ void OMPClauseProfiler::VisitOMPSimdlenClause(const OMPSimdlenClause *C) {
>> > > > }
>> > > >
>> > > > void OMPClauseProfiler::VisitOMPSizesClause(const OMPSizesClause *C) {
>> > > > - for (auto E : C->getSizesRefs())
>> > > > + for (auto *E : C->getSizesRefs())
>> > > > if (E)
>> > > > Profiler->VisitExpr(E);
>> > > > }
>> > > >
>> > > > diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp
>> > > > index 136af191f3c04..ec6003fe6559d 100644
>> > > > --- a/clang/lib/AST/Type.cpp
>> > > > +++ b/clang/lib/AST/Type.cpp
>> > > > @@ -3539,7 +3539,7 @@ TagType::TagType(TypeClass TC, const TagDecl *D, QualType can)
>> > > > decl(const_cast<TagDecl *>(D)) {}
>> > > >
>> > > > static TagDecl *getInterestingTagDecl(TagDecl *decl) {
>> > > > - for (auto I : decl->redecls()) {
>> > > > + for (auto *I : decl->redecls()) {
>> > > > if (I->isCompleteDefinition() || I->isBeingDefined())
>> > > > return I;
>> > > > }
>> > > > @@ -3780,7 +3780,7 @@ void ObjCObjectTypeImpl::Profile(llvm::FoldingSetNodeID &ID,
>> > > > for (auto typeArg : typeArgs)
>> > > > ID.AddPointer(typeArg.getAsOpaquePtr());
>> > > > ID.AddInteger(protocols.size());
>> > > > - for (auto proto : protocols)
>> > > > + for (auto *proto : protocols)
>> > > > ID.AddPointer(proto);
>> > > > ID.AddBoolean(isKindOf);
>> > > > }
>> > > > @@ -3798,7 +3798,7 @@ void ObjCTypeParamType::Profile(llvm::FoldingSetNodeID &ID,
>> > > > ID.AddPointer(OTPDecl);
>> > > > ID.AddPointer(CanonicalType.getAsOpaquePtr());
>> > > > ID.AddInteger(protocols.size());
>> > > > - for (auto proto : protocols)
>> > > > + for (auto *proto : protocols)
>> > > > ID.AddPointer(proto);
>> > > > }
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp
>> > > > index 5aaf2fb74318b..f042468ebba72 100644
>> > > > --- a/clang/lib/Analysis/CFG.cpp
>> > > > +++ b/clang/lib/Analysis/CFG.cpp
>> > > > @@ -2994,7 +2994,7 @@ CFGBlock *CFGBuilder::VisitDeclSubExpr(DeclStmt *DS) {
>> > > > // If we bind to a tuple-like type, we iterate over the HoldingVars, and
>> > > > // create a DeclStmt for each of them.
>> > > > if (const auto *DD = dyn_cast<DecompositionDecl>(VD)) {
>> > > > - for (auto BD : llvm::reverse(DD->bindings())) {
>> > > > + for (auto *BD : llvm::reverse(DD->bindings())) {
>> > > > if (auto *VD = BD->getHoldingVar()) {
>> > > > DeclGroupRef DG(VD);
>> > > > DeclStmt *DSNew =
>> > > >
>> > > > diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp
>> > > > index 66413f84907a3..06b61b4de92f8 100644
>> > > > --- a/clang/lib/Analysis/ThreadSafetyCommon.cpp
>> > > > +++ b/clang/lib/Analysis/ThreadSafetyCommon.cpp
>> > > > @@ -637,7 +637,7 @@ SExprBuilder::translateAbstractConditionalOperator(
>> > > > til::SExpr *
>> > > > SExprBuilder::translateDeclStmt(const DeclStmt *S, CallingContext *Ctx) {
>> > > > DeclGroupRef DGrp = S->getDeclGroup();
>> > > > - for (auto I : DGrp) {
>> > > > + for (auto *I : DGrp) {
>> > > > if (auto *VD = dyn_cast_or_null<VarDecl>(I)) {
>> > > > Expr *E = VD->getInit();
>> > > > til::SExpr* SE = translate(E, Ctx);
>> > > >
>> > > > diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp
>> > > > index ff6ca0914e0d1..4061fa805d800 100644
>> > > > --- a/clang/lib/CodeGen/CGBlocks.cpp
>> > > > +++ b/clang/lib/CodeGen/CGBlocks.cpp
>> > > > @@ -521,7 +521,7 @@ static void initializeForBlockHeader(CodeGenModule &CGM, CGBlockInfo &info,
>> > > > unsigned BlockAlign = GenPtrAlign.getQuantity();
>> > > > if (auto *Helper =
>> > > > CGM.getTargetCodeGenInfo().getTargetOpenCLBlockHelper()) {
>> > > > - for (auto I : Helper->getCustomFieldTypes()) /* custom fields */ {
>> > > > + for (auto *I : Helper->getCustomFieldTypes()) /* custom fields */ {
>> > > > // TargetOpenCLBlockHelp needs to make sure the struct is packed.
>> > > > // If necessary, add padding fields to the custom fields.
>> > > > unsigned Align = CGM.getDataLayout().getABITypeAlignment(I);
>> > > > @@ -1356,7 +1356,7 @@ static llvm::Constant *buildGlobalBlock(CodeGenModule &CGM,
>> > > > fields.add(buildBlockDescriptor(CGM, blockInfo));
>> > > > } else if (auto *Helper =
>> > > > CGM.getTargetCodeGenInfo().getTargetOpenCLBlockHelper()) {
>> > > > - for (auto I : Helper->getCustomFieldValues(CGM, blockInfo)) {
>> > > > + for (auto *I : Helper->getCustomFieldValues(CGM, blockInfo)) {
>> > > > fields.add(I);
>> > > > }
>> > > > }
>> > > >
>> > > > diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
>> > > > index 90b1270dc8abc..ff39289d68b30 100644
>> > > > --- a/clang/lib/CodeGen/CGCall.cpp
>> > > > +++ b/clang/lib/CodeGen/CGCall.cpp
>> > > > @@ -1723,7 +1723,7 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI) {
>> > > >
>> > > > case ABIArgInfo::CoerceAndExpand: {
>> > > > auto ArgTypesIter = ArgTypes.begin() + FirstIRArg;
>> > > > - for (auto EltTy : ArgInfo.getCoerceAndExpandTypeSequence()) {
>> > > > + for (auto *EltTy : ArgInfo.getCoerceAndExpandTypeSequence()) {
>> > > > *ArgTypesIter++ = EltTy;
>> > > > }
>> > > > assert(ArgTypesIter == ArgTypes.begin() + FirstIRArg + NumIRArgs);
>> > > >
>> > > > diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
>> > > > index 4a952b9abd555..bf20c206e1e1f 100644
>> > > > --- a/clang/lib/CodeGen/CGClass.cpp
>> > > > +++ b/clang/lib/CodeGen/CGClass.cpp
>> > > > @@ -2995,7 +2995,7 @@ void CodeGenFunction::EmitLambdaBlockInvokeBody() {
>> > > > CallArgs.add(RValue::get(ThisPtr.getPointer()), ThisType);
>> > > >
>> > > > // Add the rest of the parameters.
>> > > > - for (auto param : BD->parameters())
>> > > > + for (auto *param : BD->parameters())
>> > > > EmitDelegateCallArg(CallArgs, param, param->getBeginLoc());
>> > > >
>> > > > assert(!Lambda->isGenericLambda() &&
>> > > > @@ -3015,7 +3015,7 @@ void CodeGenFunction::EmitLambdaDelegatingInvokeBody(const CXXMethodDecl *MD) {
>> > > > CallArgs.add(RValue::get(ThisPtr.getPointer()), ThisType);
>> > > >
>> > > > // Add the rest of the parameters.
>> > > > - for (auto Param : MD->parameters())
>> > > > + for (auto *Param : MD->parameters())
>> > > > EmitDelegateCallArg(CallArgs, Param, Param->getBeginLoc());
>> > > >
>> > > > const CXXMethodDecl *CallOp = Lambda->getLambdaCallOperator();
>> > > >
>> > > > diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
>> > > > index 4b7e290f6480c..49dcf7781d03a 100644
>> > > > --- a/clang/lib/CodeGen/CGDebugInfo.cpp
>> > > > +++ b/clang/lib/CodeGen/CGDebugInfo.cpp
>> > > > @@ -3894,7 +3894,7 @@ llvm::DISubprogram *CGDebugInfo::getFunctionDeclaration(const Decl *D) {
>> > > > return SP;
>> > > > }
>> > > >
>> > > > - for (auto NextFD : FD->redecls()) {
>> > > > + for (auto *NextFD : FD->redecls()) {
>> > > > auto MI = SPCache.find(NextFD->getCanonicalDecl());
>> > > > if (MI != SPCache.end()) {
>> > > > auto *SP = dyn_cast_or_null<llvm::DISubprogram>(MI->second);
>> > > >
>> > > > diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp
>> > > > index 2075857848656..df17e0b52815c 100644
>> > > > --- a/clang/lib/CodeGen/CGDeclCXX.cpp
>> > > > +++ b/clang/lib/CodeGen/CGDeclCXX.cpp
>> > > > @@ -707,7 +707,7 @@ void CodeGenModule::EmitCXXModuleInitFunc(Module *Primary) {
>> > > > }
>> > > >
>> > > > // Now append the ones without specified priority.
>> > > > - for (auto F : CXXGlobalInits)
>> > > > + for (auto *F : CXXGlobalInits)
>> > > > ModuleInits.push_back(F);
>> > > > CXXGlobalInits.clear();
>> > > >
>> > > > @@ -844,7 +844,7 @@ CodeGenModule::EmitCXXGlobalInitFunc() {
>> > > >
>> > > > // Prepend the module inits to the highest priority set.
>> > > > if (!ModuleInits.empty()) {
>> > > > - for (auto F : ModuleInits)
>> > > > + for (auto *F : ModuleInits)
>> > > > LocalCXXGlobalInits.push_back(F);
>> > > > ModuleInits.clear();
>> > > > }
>> > > > @@ -862,7 +862,7 @@ CodeGenModule::EmitCXXGlobalInitFunc() {
>> > > > CXXGlobalInits.empty())
>> > > > return;
>> > > >
>> > > > - for (auto F : CXXGlobalInits)
>> > > > + for (auto *F : CXXGlobalInits)
>> > > > ModuleInits.push_back(F);
>> > > > CXXGlobalInits.clear();
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
>> > > > index 324eb56167b56..6878255c48acb 100644
>> > > > --- a/clang/lib/CodeGen/CGExpr.cpp
>> > > > +++ b/clang/lib/CodeGen/CGExpr.cpp
>> > > > @@ -3760,7 +3760,7 @@ static Address emitArraySubscriptGEP(CodeGenFunction &CGF, Address addr,
>> > > > const llvm::Twine &name = "arrayidx") {
>> > > > // All the indices except that last must be zero.
>> > > > #ifndef NDEBUG
>> > > > - for (auto idx : indices.drop_back())
>> > > > + for (auto *idx : indices.drop_back())
>> > > > assert(isa<llvm::ConstantInt>(idx) &&
>> > > > cast<llvm::ConstantInt>(idx)->isZero());
>> > > > #endif
>> > > > @@ -4297,7 +4297,7 @@ unsigned CodeGenFunction::getDebugInfoFIndex(const RecordDecl *Rec,
>> > > > unsigned FieldIndex) {
>> > > > unsigned I = 0, Skipped = 0;
>> > > >
>> > > > - for (auto F : Rec->getDefinition()->fields()) {
>> > > > + for (auto *F : Rec->getDefinition()->fields()) {
>> > > > if (I == FieldIndex)
>> > > > break;
>> > > > if (F->isUnnamedBitfield())
>> > > >
>> > > > diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp
>> > > > index 7bbe9af7ed593..c734a539cbfbf 100644
>> > > > --- a/clang/lib/CodeGen/CGObjCGNU.cpp
>> > > > +++ b/clang/lib/CodeGen/CGObjCGNU.cpp
>> > > > @@ -3316,7 +3316,7 @@ llvm::Constant *CGObjCGNU::MakeBitField(ArrayRef<bool> bits) {
>> > > > auto fields = builder.beginStruct();
>> > > > fields.addInt(Int32Ty, values.size());
>> > > > auto array = fields.beginArray();
>> > > > - for (auto v : values) array.add(v);
>> > > > + for (auto *v : values) array.add(v);
>> > > > array.finishAndAddTo(fields);
>> > > >
>> > > > llvm::Constant *GS =
>> > > >
>> > > > diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
>> > > > index 2d704cec05761..7a972152e1144 100644
>> > > > --- a/clang/lib/CodeGen/CGObjCMac.cpp
>> > > > +++ b/clang/lib/CodeGen/CGObjCMac.cpp
>> > > > @@ -1171,7 +1171,7 @@ class ProtocolMethodLists {
>> > > > static ProtocolMethodLists get(const ObjCProtocolDecl *PD) {
>> > > > ProtocolMethodLists result;
>> > > >
>> > > > - for (auto MD : PD->methods()) {
>> > > > + for (auto *MD : PD->methods()) {
>> > > > size_t index = (2 * size_t(MD->isOptional()))
>> > > > + (size_t(MD->isClassMethod()));
>> > > > result.Methods[index].push_back(MD);
>> > > > @@ -3454,7 +3454,7 @@ static bool hasWeakMember(QualType type) {
>> > > > }
>> > > >
>> > > > if (auto recType = type->getAs<RecordType>()) {
>> > > > - for (auto field : recType->getDecl()->fields()) {
>> > > > + for (auto *field : recType->getDecl()->fields()) {
>> > > > if (hasWeakMember(field->getType()))
>> > > > return true;
>> > > > }
>> > > >
>> > > > diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
>> > > > index 81c687e4530f4..caf14868078ec 100644
>> > > > --- a/clang/lib/CodeGen/CodeGenFunction.cpp
>> > > > +++ b/clang/lib/CodeGen/CodeGenFunction.cpp
>> > > > @@ -725,7 +725,7 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
>> > > > const bool SanitizeBounds = SanOpts.hasOneOf(SanitizerKind::Bounds);
>> > > > bool NoSanitizeCoverage = false;
>> > > >
>> > > > - for (auto Attr : D->specific_attrs<NoSanitizeAttr>()) {
>> > > > + for (auto *Attr : D->specific_attrs<NoSanitizeAttr>()) {
>> > > > // Apply the no_sanitize* attributes to SanOpts.
>> > > > SanitizerMask mask = Attr->getMask();
>> > > > SanOpts.Mask &= ~mask;
>> > > >
>> > > > diff --git a/clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp b/clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp
>> > > > index f6eaa35b48738..677b66d3e1dcb 100644
>> > > > --- a/clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp
>> > > > +++ b/clang/lib/CodeGen/ObjectFilePCHContainerOperations.cpp
>> > > > @@ -107,7 +107,7 @@ class PCHContainerGenerator : public ASTConsumer {
>> > > > return true;
>> > > >
>> > > > SmallVector<QualType, 16> ArgTypes;
>> > > > - for (auto i : D->parameters())
>> > > > + for (auto *i : D->parameters())
>> > > > ArgTypes.push_back(i->getType());
>> > > > QualType RetTy = D->getReturnType();
>> > > > QualType FnTy = Ctx.getFunctionType(RetTy, ArgTypes,
>> > > > @@ -126,7 +126,7 @@ class PCHContainerGenerator : public ASTConsumer {
>> > > > ArgTypes.push_back(D->getSelfType(Ctx, D->getClassInterface(),
>> > > > selfIsPseudoStrong, selfIsConsumed));
>> > > > ArgTypes.push_back(Ctx.getObjCSelType());
>> > > > - for (auto i : D->parameters())
>> > > > + for (auto *i : D->parameters())
>> > > > ArgTypes.push_back(i->getType());
>> > > > QualType RetTy = D->getReturnType();
>> > > > QualType FnTy = Ctx.getFunctionType(RetTy, ArgTypes,
>> > > >
>> > > > diff --git a/clang/lib/CodeGen/SwiftCallingConv.cpp b/clang/lib/CodeGen/SwiftCallingConv.cpp
>> > > > index e42859af05a2b..a7d7c9357272d 100644
>> > > > --- a/clang/lib/CodeGen/SwiftCallingConv.cpp
>> > > > +++ b/clang/lib/CodeGen/SwiftCallingConv.cpp
>> > > > @@ -124,7 +124,7 @@ void SwiftAggLowering::addTypedData(const RecordDecl *record, CharUnits begin,
>> > > > const ASTRecordLayout &layout) {
>> > > > // Unions are a special case.
>> > > > if (record->isUnion()) {
>> > > > - for (auto field : record->fields()) {
>> > > > + for (auto *field : record->fields()) {
>> > > > if (field->isBitField()) {
>> > > > addBitFieldData(field, begin, 0);
>> > > > } else {
>> > > > @@ -161,7 +161,7 @@ void SwiftAggLowering::addTypedData(const RecordDecl *record, CharUnits begin,
>> > > > }
>> > > >
>> > > > // Add fields.
>> > > > - for (auto field : record->fields()) {
>> > > > + for (auto *field : record->fields()) {
>> > > > auto fieldOffsetInBits = layout.getFieldOffset(field->getFieldIndex());
>> > > > if (field->isBitField()) {
>> > > > addBitFieldData(field, begin, fieldOffsetInBits);
>> > > >
>> > > > diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp
>> > > > index ecf3da284b2a7..90d2e0659a39a 100644
>> > > > --- a/clang/lib/Driver/Compilation.cpp
>> > > > +++ b/clang/lib/Driver/Compilation.cpp
>> > > > @@ -102,7 +102,7 @@ Compilation::getArgsForToolChain(const ToolChain *TC, StringRef BoundArch,
>> > > > }
>> > > >
>> > > > // Add allocated arguments to the final DAL.
>> > > > - for (auto ArgPtr : AllocatedArgs)
>> > > > + for (auto *ArgPtr : AllocatedArgs)
>> > > > Entry->AddSynthesizedArg(ArgPtr);
>> > > > }
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
>> > > > index ba359a1d31a53..0a61b5e2d62d4 100644
>> > > > --- a/clang/lib/Driver/Driver.cpp
>> > > > +++ b/clang/lib/Driver/Driver.cpp
>> > > > @@ -3715,7 +3715,7 @@ class OffloadingActionBuilder final {
>> > > > /*BoundArch=*/nullptr);
>> > > > // Propagate active offloading kinds for each input to the link action.
>> > > > // Each input may have
>> > > > diff erent active offloading kind.
>> > > > - for (auto A : HostAction->inputs()) {
>> > > > + for (auto *A : HostAction->inputs()) {
>> > > > auto ArgLoc = HostActionToInputArgMap.find(A);
>> > > > if (ArgLoc == HostActionToInputArgMap.end())
>> > > > continue;
>> > > >
>> > > > diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
>> > > > index 2dd9ac01b3ef9..99a8642cfd85b 100644
>> > > > --- a/clang/lib/Driver/ToolChains/Clang.cpp
>> > > > +++ b/clang/lib/Driver/ToolChains/Clang.cpp
>> > > > @@ -4974,13 +4974,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
>> > > > // Since we can't access frontend flags through hasArg, let's manually iterate
>> > > > // through them.
>> > > > bool FoundAnalyzerConfig = false;
>> > > > - for (auto Arg : Args.filtered(options::OPT_Xclang))
>> > > > + for (auto *Arg : Args.filtered(options::OPT_Xclang))
>> > > > if (StringRef(Arg->getValue()) == "-analyzer-config") {
>> > > > FoundAnalyzerConfig = true;
>> > > > break;
>> > > > }
>> > > > if (!FoundAnalyzerConfig)
>> > > > - for (auto Arg : Args.filtered(options::OPT_Xanalyzer))
>> > > > + for (auto *Arg : Args.filtered(options::OPT_Xanalyzer))
>> > > > if (StringRef(Arg->getValue()) == "-analyzer-config") {
>> > > > FoundAnalyzerConfig = true;
>> > > > break;
>> > > > @@ -6924,7 +6924,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
>> > > > // do not pass it to other cc1 commands when save-temps is enabled
>> > > > if (C.getDriver().isSaveTempsEnabled() &&
>> > > > !isa<PreprocessJobAction>(JA)) {
>> > > > - for (auto Arg : Args.filtered(options::OPT_Xclang)) {
>> > > > + for (auto *Arg : Args.filtered(options::OPT_Xclang)) {
>> > > > Arg->claim();
>> > > > if (StringRef(Arg->getValue()) != "-finclude-default-header")
>> > > > CmdArgs.push_back(Arg->getValue());
>> > > >
>> > > > diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
>> > > > index 3b084dfdbfa2c..4760a6f528627 100644
>> > > > --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
>> > > > +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
>> > > > @@ -2161,7 +2161,7 @@ void tools::addHIPRuntimeLibArgs(const ToolChain &TC,
>> > > > TC.AddHIPRuntimeLibArgs(Args, CmdArgs);
>> > > > } else {
>> > > > // Claim "no HIP libraries" arguments if any
>> > > > - for (auto Arg : Args.filtered(options::OPT_no_hip_rt)) {
>> > > > + for (auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
>> > > > Arg->claim();
>> > > > }
>> > > > }
>> > > >
>> > > > diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
>> > > > index 9730109dd993f..047ec67f95e12 100644
>> > > > --- a/clang/lib/Driver/ToolChains/Gnu.cpp
>> > > > +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
>> > > > @@ -1369,7 +1369,7 @@ static bool findMipsMtiMultilibs(const Multilib::flags_list &Flags,
>> > > > {"/../../../../mips-mti-linux-gnu/lib" + M.gccSuffix()});
>> > > > });
>> > > > }
>> > > > - for (auto Candidate : {&MtiMipsMultilibsV1, &MtiMipsMultilibsV2}) {
>> > > > + for (auto *Candidate : {&MtiMipsMultilibsV1, &MtiMipsMultilibsV2}) {
>> > > > if (Candidate->select(Flags, Result.SelectedMultilib)) {
>> > > > Result.Multilibs = *Candidate;
>> > > > return true;
>> > > > @@ -1462,7 +1462,7 @@ static bool findMipsImgMultilibs(const Multilib::flags_list &Flags,
>> > > > {"/../../../../mips-img-linux-gnu/lib" + M.gccSuffix()});
>> > > > });
>> > > > }
>> > > > - for (auto Candidate : {&ImgMultilibsV1, &ImgMultilibsV2}) {
>> > > > + for (auto *Candidate : {&ImgMultilibsV1, &ImgMultilibsV2}) {
>> > > > if (Candidate->select(Flags, Result.SelectedMultilib)) {
>> > > > Result.Multilibs = *Candidate;
>> > > > return true;
>> > > >
>> > > > diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp
>> > > > index 35728ffb0b55a..7791074d7c92a 100644
>> > > > --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
>> > > > +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
>> > > > @@ -202,7 +202,7 @@ HIPAMDToolChain::HIPAMDToolChain(const Driver &D, const llvm::Triple &Triple,
>> > > > if (!Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
>> > > > true))
>> > > > return;
>> > > > - for (auto A : Args.filtered(options::OPT_fsanitize_EQ)) {
>> > > > + for (auto *A : Args.filtered(options::OPT_fsanitize_EQ)) {
>> > > > SanitizerMask K = parseSanitizerValue(A->getValue(), /*AllowGroups=*/false);
>> > > > if (K != SanitizerKind::Address)
>> > > > D.getDiags().Report(clang::diag::warn_drv_unsupported_option_for_target)
>> > > >
>> > > > diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
>> > > > index 1108a02407e4f..8197fccd2f3e3 100644
>> > > > --- a/clang/lib/Format/Format.cpp
>> > > > +++ b/clang/lib/Format/Format.cpp
>> > > > @@ -2539,7 +2539,7 @@ class ObjCHeaderStyleGuesser : public TokenAnalyzer {
>> > > > "UIView",
>> > > > };
>> > > >
>> > > > - for (auto Line : AnnotatedLines) {
>> > > > + for (auto *Line : AnnotatedLines) {
>> > > > if (Line->First && (Line->First->TokenText.startswith("#") ||
>> > > > Line->First->TokenText == "__pragma" ||
>> > > > Line->First->TokenText == "_Pragma")) {
>> > > >
>> > > > diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp
>> > > > index f833541caa25c..cff61d7929a1b 100644
>> > > > --- a/clang/lib/Frontend/FrontendActions.cpp
>> > > > +++ b/clang/lib/Frontend/FrontendActions.cpp
>> > > > @@ -920,12 +920,12 @@ void DumpModuleInfoAction::ExecuteAction() {
>> > > > if (Primary) {
>> > > > if (!Primary->submodules().empty())
>> > > > Out << " Sub Modules:\n";
>> > > > - for (auto MI : Primary->submodules()) {
>> > > > + for (auto *MI : Primary->submodules()) {
>> > > > PrintSubMapEntry(MI->Name, MI->Kind);
>> > > > }
>> > > > if (!Primary->Imports.empty())
>> > > > Out << " Imports:\n";
>> > > > - for (auto IMP : Primary->Imports) {
>> > > > + for (auto *IMP : Primary->Imports) {
>> > > > PrintSubMapEntry(IMP->Name, IMP->Kind);
>> > > > }
>> > > > if (!Primary->Exports.empty())
>> > > >
>> > > > diff --git a/clang/lib/Index/USRGeneration.cpp b/clang/lib/Index/USRGeneration.cpp
>> > > > index a206642e4b587..c1120058235c6 100644
>> > > > --- a/clang/lib/Index/USRGeneration.cpp
>> > > > +++ b/clang/lib/Index/USRGeneration.cpp
>> > > > @@ -258,7 +258,7 @@ void USRGenerator::VisitFunctionDecl(const FunctionDecl *D) {
>> > > > }
>> > > >
>> > > > // Mangle in type information for the arguments.
>> > > > - for (auto PD : D->parameters()) {
>> > > > + for (auto *PD : D->parameters()) {
>> > > > Out << '#';
>> > > > VisitType(PD->getType());
>> > > > }
>> > > >
>> > > > diff --git a/clang/lib/Sema/IdentifierResolver.cpp b/clang/lib/Sema/IdentifierResolver.cpp
>> > > > index 9081714c893f5..4ee10f9fddfbe 100644
>> > > > --- a/clang/lib/Sema/IdentifierResolver.cpp
>> > > > +++ b/clang/lib/Sema/IdentifierResolver.cpp
>> > > > @@ -287,7 +287,7 @@ static DeclMatchKind compareDeclarations(NamedDecl *Existing, NamedDecl *New) {
>> > > >
>> > > > // If the existing declaration is somewhere in the previous declaration
>> > > > // chain of the new declaration, then prefer the new declaration.
>> > > > - for (auto RD : New->redecls()) {
>> > > > + for (auto *RD : New->redecls()) {
>> > > > if (RD == Existing)
>> > > > return DMK_Replace;
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp
>> > > > index 1158685681af1..5215b60defe8a 100644
>> > > > --- a/clang/lib/Sema/Sema.cpp
>> > > > +++ b/clang/lib/Sema/Sema.cpp
>> > > > @@ -1315,7 +1315,7 @@ void Sema::ActOnEndOfTranslationUnit() {
>> > > > Consumer.CompleteTentativeDefinition(VD);
>> > > > }
>> > > >
>> > > > - for (auto D : ExternalDeclarations) {
>> > > > + for (auto *D : ExternalDeclarations) {
>> > > > if (!D || D->isInvalidDecl() || D->getPreviousDecl() || !D->isUsed())
>> > > > continue;
>> > > >
>> > > > @@ -1784,7 +1784,7 @@ void Sema::emitDeferredDiags() {
>> > > > return;
>> > > >
>> > > > DeferredDiagnosticsEmitter DDE(*this);
>> > > > - for (auto D : DeclsToCheckForDeferredDiags)
>> > > > + for (auto *D : DeclsToCheckForDeferredDiags)
>> > > > DDE.checkRecordedDecl(D);
>> > > > }
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
>> > > > index 6d5769a396277..c80605ba7f5a7 100644
>> > > > --- a/clang/lib/Sema/SemaCodeComplete.cpp
>> > > > +++ b/clang/lib/Sema/SemaCodeComplete.cpp
>> > > > @@ -4201,7 +4201,7 @@ static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext,
>> > > >
>> > > > // We need to have names for all of the parameters, if we're going to
>> > > > // generate a forwarding call.
>> > > > - for (auto P : Method->parameters())
>> > > > + for (auto *P : Method->parameters())
>> > > > if (!P->getDeclName())
>> > > > return;
>> > > >
>> > > > @@ -4229,7 +4229,7 @@ static void MaybeAddOverrideCalls(Sema &S, DeclContext *InContext,
>> > > > Results.getAllocator().CopyString(Overridden->getNameAsString()));
>> > > > Builder.AddChunk(CodeCompletionString::CK_LeftParen);
>> > > > bool FirstParam = true;
>> > > > - for (auto P : Method->parameters()) {
>> > > > + for (auto *P : Method->parameters()) {
>> > > > if (FirstParam)
>> > > > FirstParam = false;
>> > > > else
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
>> > > > index 1a29e6bb86f39..3a84761616163 100644
>> > > > --- a/clang/lib/Sema/SemaDecl.cpp
>> > > > +++ b/clang/lib/Sema/SemaDecl.cpp
>> > > > @@ -8088,7 +8088,7 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
>> > > > if (shadowedVar->isExternC()) {
>> > > > // For shadowing external vars, make sure that we point to the global
>> > > > // declaration, not a locally scoped extern declaration.
>> > > > - for (auto I : shadowedVar->redecls())
>> > > > + for (auto *I : shadowedVar->redecls())
>> > > > if (I->isFileVarDecl()) {
>> > > > ShadowedDecl = I;
>> > > > break;
>> > > > @@ -10463,7 +10463,7 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
>> > > > }
>> > > >
>> > > > llvm::SmallPtrSet<const Type *, 16> ValidTypes;
>> > > > - for (auto Param : NewFD->parameters())
>> > > > + for (auto *Param : NewFD->parameters())
>> > > > checkIsValidOpenCLKernelParameter(*this, D, Param, ValidTypes);
>> > > >
>> > > > if (getLangOpts().OpenCLCPlusPlus) {
>> > > > @@ -11972,7 +11972,7 @@ namespace {
>> > > > // Track and increment the index here.
>> > > > isInitList = true;
>> > > > InitFieldIndex.push_back(0);
>> > > > - for (auto Child : InitList->children()) {
>> > > > + for (auto *Child : InitList->children()) {
>> > > > CheckExpr(cast<Expr>(Child));
>> > > > ++InitFieldIndex.back();
>> > > > }
>> > > > @@ -12453,7 +12453,7 @@ void Sema::checkNonTrivialCUnionInInitializer(const Expr *Init,
>> > > > InitType.hasNonTrivialToPrimitiveCopyCUnion()) &&
>> > > > "shouldn't be called if type doesn't have a non-trivial C struct");
>> > > > if (auto *ILE = dyn_cast<InitListExpr>(Init)) {
>> > > > - for (auto I : ILE->inits()) {
>> > > > + for (auto *I : ILE->inits()) {
>> > > > if (!I->getType().hasNonTrivialToPrimitiveDefaultInitializeCUnion() &&
>> > > > !I->getType().hasNonTrivialToPrimitiveCopyCUnion())
>> > > > continue;
>> > > > @@ -14915,7 +14915,7 @@ Decl *Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, Decl *D,
>> > > > }
>> > > >
>> > > > // Introduce our parameters into the function scope
>> > > > - for (auto Param : FD->parameters()) {
>> > > > + for (auto *Param : FD->parameters()) {
>> > > > Param->setOwningFunction(FD);
>> > > >
>> > > > // If this has an identifier, add it to the scope stack.
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
>> > > > index 0e9b27fff180a..580ecf8995db1 100644
>> > > > --- a/clang/lib/Sema/SemaDeclAttr.cpp
>> > > > +++ b/clang/lib/Sema/SemaDeclAttr.cpp
>> > > > @@ -7256,7 +7256,7 @@ static void handleAVRSignalAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
>> > > >
>> > > > static void handleBPFPreserveAIRecord(Sema &S, RecordDecl *RD) {
>> > > > // Add preserve_access_index attribute to all fields and inner records.
>> > > > - for (auto D : RD->decls()) {
>> > > > + for (auto *D : RD->decls()) {
>> > > > if (D->hasAttr<BPFPreserveAccessIndexAttr>())
>> > > > continue;
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
>> > > > index 7c70255fd3e5d..f7e20759e3d6e 100644
>> > > > --- a/clang/lib/Sema/SemaDeclCXX.cpp
>> > > > +++ b/clang/lib/Sema/SemaDeclCXX.cpp
>> > > > @@ -3777,7 +3777,7 @@ namespace {
>> > > >
>> > > > void CheckInitListExpr(InitListExpr *ILE) {
>> > > > InitFieldIndex.push_back(0);
>> > > > - for (auto Child : ILE->children()) {
>> > > > + for (auto *Child : ILE->children()) {
>> > > > if (InitListExpr *SubList = dyn_cast<InitListExpr>(Child)) {
>> > > > CheckInitListExpr(SubList);
>> > > > } else {
>> > > > @@ -3848,7 +3848,7 @@ namespace {
>> > > > Expr *Callee = E->getCallee();
>> > > > if (isa<MemberExpr>(Callee)) {
>> > > > HandleValue(Callee, false /*AddressOf*/);
>> > > > - for (auto Arg : E->arguments())
>> > > > + for (auto *Arg : E->arguments())
>> > > > Visit(Arg);
>> > > > return;
>> > > > }
>> > > > @@ -3873,7 +3873,7 @@ namespace {
>> > > > return Inherited::VisitCXXOperatorCallExpr(E);
>> > > >
>> > > > Visit(Callee);
>> > > > - for (auto Arg : E->arguments())
>> > > > + for (auto *Arg : E->arguments())
>> > > > HandleValue(Arg->IgnoreParenImpCasts(), false /*AddressOf*/);
>> > > > }
>> > > >
>> > > > @@ -15582,7 +15582,7 @@ ExprResult Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) {
>> > > > ClassPattern->lookup(Field->getDeclName());
>> > > >
>> > > > FieldDecl *Pattern = nullptr;
>> > > > - for (auto L : Lookup) {
>> > > > + for (auto *L : Lookup) {
>> > > > if (isa<FieldDecl>(L)) {
>> > > > Pattern = cast<FieldDecl>(L);
>> > > > break;
>> > > > @@ -15931,7 +15931,7 @@ bool Sema::CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl) {
>> > > > diag::err_operator_overload_static) << FnDecl->getDeclName();
>> > > > } else {
>> > > > bool ClassOrEnumParam = false;
>> > > > - for (auto Param : FnDecl->parameters()) {
>> > > > + for (auto *Param : FnDecl->parameters()) {
>> > > > QualType ParamType = Param->getType().getNonReferenceType();
>> > > > if (ParamType->isDependentType() || ParamType->isRecordType() ||
>> > > > ParamType->isEnumeralType()) {
>> > > > @@ -15954,7 +15954,7 @@ bool Sema::CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl) {
>> > > > // operator (CWG2507) allow default arguments.
>> > > > if (Op != OO_Call) {
>> > > > ParmVarDecl *FirstDefaultedParam = nullptr;
>> > > > - for (auto Param : FnDecl->parameters()) {
>> > > > + for (auto *Param : FnDecl->parameters()) {
>> > > > if (Param->hasDefaultArg()) {
>> > > > FirstDefaultedParam = Param;
>> > > > break;
>> > > > @@ -16260,7 +16260,7 @@ bool Sema::CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl) {
>> > > >
>> > > > // A parameter-declaration-clause containing a default argument is not
>> > > > // equivalent to any of the permitted forms.
>> > > > - for (auto Param : FnDecl->parameters()) {
>> > > > + for (auto *Param : FnDecl->parameters()) {
>> > > > if (Param->hasDefaultArg()) {
>> > > > Diag(Param->getDefaultArgRange().getBegin(),
>> > > > diag::err_literal_operator_default_argument)
>> > > > @@ -17968,7 +17968,7 @@ bool Sema::DefineUsedVTables() {
>> > > > // definition.
>> > > > bool IsExplicitInstantiationDeclaration =
>> > > > ClassTSK == TSK_ExplicitInstantiationDeclaration;
>> > > > - for (auto R : Class->redecls()) {
>> > > > + for (auto *R : Class->redecls()) {
>> > > > TemplateSpecializationKind TSK
>> > > > = cast<CXXRecordDecl>(R)->getTemplateSpecializationKind();
>> > > > if (TSK == TSK_ExplicitInstantiationDeclaration)
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp
>> > > > index ed33d9ffe8312..c55cb7842072b 100644
>> > > > --- a/clang/lib/Sema/SemaDeclObjC.cpp
>> > > > +++ b/clang/lib/Sema/SemaDeclObjC.cpp
>> > > > @@ -782,7 +782,7 @@ ObjCTypeParamList *Sema::actOnObjCTypeParamList(Scope *S,
>> > > > // scope until later (after the instance variable block), but we want the
>> > > > // diagnostics to occur right after we parse the type parameter list.
>> > > > llvm::SmallDenseMap<IdentifierInfo *, ObjCTypeParamDecl *> knownParams;
>> > > > - for (auto typeParam : typeParams) {
>> > > > + for (auto *typeParam : typeParams) {
>> > > > auto known = knownParams.find(typeParam->getIdentifier());
>> > > > if (known != knownParams.end()) {
>> > > > Diag(typeParam->getLocation(), diag::err_objc_type_param_redecl)
>> > > > @@ -803,7 +803,7 @@ ObjCTypeParamList *Sema::actOnObjCTypeParamList(Scope *S,
>> > > > }
>> > > >
>> > > > void Sema::popObjCTypeParamList(Scope *S, ObjCTypeParamList *typeParamList) {
>> > > > - for (auto typeParam : *typeParamList) {
>> > > > + for (auto *typeParam : *typeParamList) {
>> > > > if (!typeParam->isInvalidDecl()) {
>> > > > S->RemoveDecl(typeParam);
>> > > > IdResolver.RemoveDecl(typeParam);
>> > > > @@ -1029,7 +1029,7 @@ ObjCInterfaceDecl *Sema::ActOnStartClassInterface(
>> > > >
>> > > > // Clone the type parameter list.
>> > > > SmallVector<ObjCTypeParamDecl *, 4> clonedTypeParams;
>> > > > - for (auto typeParam : *prevTypeParamList) {
>> > > > + for (auto *typeParam : *prevTypeParamList) {
>> > > > clonedTypeParams.push_back(
>> > > > ObjCTypeParamDecl::Create(
>> > > > Context,
>> > > > @@ -1502,7 +1502,7 @@ void Sema::actOnObjCTypeArgsOrProtocolQualifiers(
>> > > > llvm::SmallPtrSet<ObjCProtocolDecl*, 8> knownProtocols;
>> > > > Context.CollectInheritedProtocols(baseClass, knownProtocols);
>> > > > bool allProtocolsDeclared = true;
>> > > > - for (auto proto : protocols) {
>> > > > + for (auto *proto : protocols) {
>> > > > if (knownProtocols.count(static_cast<ObjCProtocolDecl *>(proto)) == 0) {
>> > > > allProtocolsDeclared = false;
>> > > > break;
>> > > > @@ -3855,7 +3855,7 @@ static void DiagnoseVariableSizedIvars(Sema &S, ObjCContainerDecl *OCD) {
>> > > >
>> > > > // Check if variable sized ivar is in interface and visible to subclasses.
>> > > > if (!isa<ObjCInterfaceDecl>(OCD)) {
>> > > > - for (auto ivar : Ivars) {
>> > > > + for (auto *ivar : Ivars) {
>> > > > if (!ivar->isInvalidDecl() && IsVariableSizedType(ivar->getType())) {
>> > > > S.Diag(ivar->getLocation(), diag::warn_variable_sized_ivar_visibility)
>> > > > << ivar->getDeclName() << ivar->getType();
>> > > > @@ -3990,7 +3990,7 @@ Decl *Sema::ActOnAtEnd(Scope *S, SourceRange AtEnd, ArrayRef<Decl *> allMethods,
>> > > > // they are overridden by an explicit method that is encountered
>> > > > // later.
>> > > > if (auto *OID = dyn_cast<ObjCImplementationDecl>(CurContext)) {
>> > > > - for (auto PropImpl : OID->property_impls()) {
>> > > > + for (auto *PropImpl : OID->property_impls()) {
>> > > > if (auto *Getter = PropImpl->getGetterMethodDecl())
>> > > > if (Getter->isSynthesizedAccessorStub())
>> > > > OID->addDecl(Getter);
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
>> > > > index f124ad3bc08d0..43c27c0ddd5e9 100644
>> > > > --- a/clang/lib/Sema/SemaExpr.cpp
>> > > > +++ b/clang/lib/Sema/SemaExpr.cpp
>> > > > @@ -136,7 +136,7 @@ void Sema::NoteDeletedFunction(FunctionDecl *Decl) {
>> > > > /// Determine whether a FunctionDecl was ever declared with an
>> > > > /// explicit storage class.
>> > > > static bool hasAnyExplicitStorageClass(const FunctionDecl *D) {
>> > > > - for (auto I : D->redecls()) {
>> > > > + for (auto *I : D->redecls()) {
>> > > > if (I->getStorageClass() != SC_None)
>> > > > return true;
>> > > > }
>> > > > @@ -16289,7 +16289,7 @@ void Sema::ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo,
>> > > > ProcessDeclAttributes(CurScope, CurBlock->TheDecl, ParamInfo);
>> > > >
>> > > > // Put the parameter variables in scope.
>> > > > - for (auto AI : CurBlock->TheDecl->parameters()) {
>> > > > + for (auto *AI : CurBlock->TheDecl->parameters()) {
>> > > > AI->setOwningFunction(CurBlock->TheDecl);
>> > > >
>> > > > // If this has an identifier, add it to the scope stack.
>> > > > @@ -17670,7 +17670,7 @@ HandleImmediateInvocations(Sema &SemaRef,
>> > > > for (auto CE : Rec.ImmediateInvocationCandidates)
>> > > > if (!CE.getInt())
>> > > > EvaluateAndDiagnoseImmediateInvocation(SemaRef, CE);
>> > > > - for (auto DR : Rec.ReferenceToConsteval) {
>> > > > + for (auto *DR : Rec.ReferenceToConsteval) {
>> > > > auto *FD = cast<FunctionDecl>(DR->getDecl());
>> > > > SemaRef.Diag(DR->getBeginLoc(), diag::err_invalid_consteval_take_address)
>> > > > << FD;
>> > > > @@ -18111,7 +18111,7 @@ void Sema::MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func,
>> > > > }
>> > > > } else {
>> > > > // Walk redefinitions, as some of them may be instantiable.
>> > > > - for (auto i : Func->redecls()) {
>> > > > + for (auto *i : Func->redecls()) {
>> > > > if (!i->isUsed(false) && i->isImplicitlyInstantiable())
>> > > > MarkFunctionReferenced(Loc, i, MightBeOdrUse);
>> > > > }
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
>> > > > index c43c9dc21bd5e..bc950ab7c4a7a 100644
>> > > > --- a/clang/lib/Sema/SemaExprCXX.cpp
>> > > > +++ b/clang/lib/Sema/SemaExprCXX.cpp
>> > > > @@ -8467,7 +8467,7 @@ class TransformTypos : public TreeTransform<TransformTypos> {
>> > > > ///
>> > > > /// Returns true if there are any untried correction combinations.
>> > > > bool CheckAndAdvanceTypoExprCorrectionStreams() {
>> > > > - for (auto TE : TypoExprs) {
>> > > > + for (auto *TE : TypoExprs) {
>> > > > auto &State = SemaRef.getTypoExprState(TE);
>> > > > TransformCache.erase(TE);
>> > > > if (!State.Consumer->hasMadeAnyCorrectionProgress())
>> > > > @@ -8534,7 +8534,7 @@ class TransformTypos : public TreeTransform<TransformTypos> {
>> > > > // TypoExprs were created recursively and thus won't be in our
>> > > > // Sema's TypoExprs - they were created in our `RecursiveTransformLoop`.
>> > > > auto &SemaTypoExprs = SemaRef.TypoExprs;
>> > > > - for (auto TE : TypoExprs) {
>> > > > + for (auto *TE : TypoExprs) {
>> > > > TransformCache.erase(TE);
>> > > > SemaRef.clearDelayedTypo(TE);
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
>> > > > index b5cf96af07afa..8f21cf5cc7d7a 100644
>> > > > --- a/clang/lib/Sema/SemaInit.cpp
>> > > > +++ b/clang/lib/Sema/SemaInit.cpp
>> > > > @@ -5977,7 +5977,7 @@ void InitializationSequence::InitializeFrom(Sema &S,
>> > > > !Context.hasSameUnqualifiedType(SourceType, DestType))) {
>> > > >
>> > > > llvm::SmallVector<Expr *> InitArgs;
>> > > > - for (auto Arg : Args) {
>> > > > + for (auto *Arg : Args) {
>> > > > if (Arg->getType()->isExtVectorType()) {
>> > > > const auto *VTy = Arg->getType()->castAs<ExtVectorType>();
>> > > > unsigned Elm = VTy->getNumElements();
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaLambda.cpp b/clang/lib/Sema/SemaLambda.cpp
>> > > > index aca0b7a147730..1cf44bd694c54 100644
>> > > > --- a/clang/lib/Sema/SemaLambda.cpp
>> > > > +++ b/clang/lib/Sema/SemaLambda.cpp
>> > > > @@ -418,7 +418,7 @@ CXXMethodDecl *Sema::startLambdaDefinition(CXXRecordDecl *Class,
>> > > > CheckParmsForFunctionDef(Params,
>> > > > /*CheckParameterNames=*/false);
>> > > >
>> > > > - for (auto P : Method->parameters())
>> > > > + for (auto *P : Method->parameters())
>> > > > P->setOwningFunction(Method);
>> > > > }
>> > > >
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp
>> > > > index 22d72c3251a0c..70a32bd737160 100644
>> > > > --- a/clang/lib/Sema/SemaLookup.cpp
>> > > > +++ b/clang/lib/Sema/SemaLookup.cpp
>> > > > @@ -156,7 +156,7 @@ namespace {
>> > > > void addUsingDirectives(DeclContext *DC, DeclContext *EffectiveDC) {
>> > > > SmallVector<DeclContext*, 4> queue;
>> > > > while (true) {
>> > > > - for (auto UD : DC->using_directives()) {
>> > > > + for (auto *UD : DC->using_directives()) {
>> > > > DeclContext *NS = UD->getNominatedNamespace();
>> > > > if (SemaRef.isVisible(UD) && visited.insert(NS).second) {
>> > > > addUsingDirective(UD, EffectiveDC);
>> > > > @@ -2018,7 +2018,7 @@ static NamedDecl *findAcceptableDecl(Sema &SemaRef, NamedDecl *D,
>> > > > unsigned IDNS) {
>> > > > assert(!LookupResult::isAvailableForLookup(SemaRef, D) && "not in slow case");
>> > > >
>> > > > - for (auto RD : D->redecls()) {
>> > > > + for (auto *RD : D->redecls()) {
>> > > > // Don't bother with extra checks if we already know this one isn't visible.
>> > > > if (RD == D)
>> > > > continue;
>> > > > @@ -2362,7 +2362,7 @@ static bool LookupQualifiedNameInUsingDirectives(Sema &S, LookupResult &R,
>> > > > continue;
>> > > > }
>> > > >
>> > > > - for (auto I : ND->using_directives()) {
>> > > > + for (auto *I : ND->using_directives()) {
>> > > > NamespaceDecl *Nom = I->getNominatedNamespace();
>> > > > if (S.isVisible(I) && Visited.insert(Nom).second)
>> > > > Queue.push_back(Nom);
>> > > > @@ -4161,7 +4161,7 @@ class LookupVisibleHelper {
>> > > > // Traverse using directives for qualified name lookup.
>> > > > if (QualifiedNameLookup) {
>> > > > ShadowContextRAII Shadow(Visited);
>> > > > - for (auto I : Ctx->using_directives()) {
>> > > > + for (auto *I : Ctx->using_directives()) {
>> > > > if (!Result.getSema().isVisible(I))
>> > > > continue;
>> > > > lookupInDeclContext(I->getNominatedNamespace(), Result,
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp
>> > > > index 118afb81dd722..e915c7ed88a84 100644
>> > > > --- a/clang/lib/Sema/SemaObjCProperty.cpp
>> > > > +++ b/clang/lib/Sema/SemaObjCProperty.cpp
>> > > > @@ -1028,7 +1028,7 @@ static bool hasWrittenStorageAttribute(ObjCPropertyDecl *Prop,
>> > > >
>> > > > // Find the corresponding property in the primary class definition.
>> > > > auto OrigClass = Category->getClassInterface();
>> > > > - for (auto Found : OrigClass->lookup(Prop->getDeclName())) {
>> > > > + for (auto *Found : OrigClass->lookup(Prop->getDeclName())) {
>> > > > if (ObjCPropertyDecl *OrigProp = dyn_cast<ObjCPropertyDecl>(Found))
>> > > > return OrigProp->getPropertyAttributesAsWritten() & OwnershipMask;
>> > > > }
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
>> > > > index a8de8c2f2c829..d05380b30e47f 100644
>> > > > --- a/clang/lib/Sema/SemaOpenMP.cpp
>> > > > +++ b/clang/lib/Sema/SemaOpenMP.cpp
>> > > > @@ -18422,7 +18422,7 @@ static T filterLookupForUDReductionAndMapper(
>> > > > static NamedDecl *findAcceptableDecl(Sema &SemaRef, NamedDecl *D) {
>> > > > assert(!LookupResult::isVisible(SemaRef, D) && "not in slow case");
>> > > >
>> > > > - for (auto RD : D->redecls()) {
>> > > > + for (auto *RD : D->redecls()) {
>> > > > // Don't bother with extra checks if we already know this one isn't visible.
>> > > > if (RD == D)
>> > > > continue;
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
>> > > > index 91e308d0d0fee..352738c850f23 100644
>> > > > --- a/clang/lib/Sema/SemaOverload.cpp
>> > > > +++ b/clang/lib/Sema/SemaOverload.cpp
>> > > > @@ -14204,7 +14204,7 @@ ExprResult Sema::CreateOverloadedArraySubscriptExpr(SourceLocation LLoc,
>> > > > MultiExprArg ArgExpr) {
>> > > > SmallVector<Expr *, 2> Args;
>> > > > Args.push_back(Base);
>> > > > - for (auto e : ArgExpr) {
>> > > > + for (auto *e : ArgExpr) {
>> > > > Args.push_back(e);
>> > > > }
>> > > > DeclarationName OpName =
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
>> > > > index e8837d88f97dd..3419eb1eec6b4 100644
>> > > > --- a/clang/lib/Sema/SemaTemplateDeduction.cpp
>> > > > +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
>> > > > @@ -3147,7 +3147,7 @@ Sema::SubstituteExplicitTemplateArguments(
>> > > > if (ExplicitTemplateArgs.size() == 0) {
>> > > > // No arguments to substitute; just copy over the parameter types and
>> > > > // fill in the function type.
>> > > > - for (auto P : Function->parameters())
>> > > > + for (auto *P : Function->parameters())
>> > > > ParamTypes.push_back(P->getType());
>> > > >
>> > > > if (FunctionType)
>> > > >
>> > > > diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
>> > > > index 24ea3254cb272..b0256a16babe7 100644
>> > > > --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
>> > > > +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
>> > > > @@ -6398,7 +6398,7 @@ void Sema::PerformPendingInstantiations(bool LocalOnly) {
>> > > >
>> > > > void Sema::PerformDependentDiagnostics(const DeclContext *Pattern,
>> > > > const MultiLevelTemplateArgumentList &TemplateArgs) {
>> > > > - for (auto DD : Pattern->ddiags()) {
>> > > > + for (auto *DD : Pattern->ddiags()) {
>> > > > switch (DD->getKind()) {
>> > > > case DependentDiagnostic::Access:
>> > > > HandleDependentAccessCheck(*DD, TemplateArgs);
>> > > >
>> > > > diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
>> > > > index eef8f9fdb07f1..5d1ee45c10de5 100644
>> > > > --- a/clang/lib/Serialization/ASTReader.cpp
>> > > > +++ b/clang/lib/Serialization/ASTReader.cpp
>> > > > @@ -8032,7 +8032,7 @@ IdentifierInfo *ASTReader::get(StringRef Name) {
>> > > > // lookups). Perform the lookup in PCH files, though, since we don't build
>> > > > // a complete initial identifier table if we're carrying on from a PCH.
>> > > > if (PP.getLangOpts().CPlusPlus) {
>> > > > - for (auto F : ModuleMgr.pch_modules())
>> > > > + for (auto *F : ModuleMgr.pch_modules())
>> > > > if (Visitor(*F))
>> > > > break;
>> > > > } else {
>> > > > @@ -9645,7 +9645,7 @@ void ASTReader::diagnoseOdrViolations() {
>> > > > bool Found = false;
>> > > > const Decl *DCanon = D->getCanonicalDecl();
>> > > >
>> > > > - for (auto RI : D->redecls()) {
>> > > > + for (auto *RI : D->redecls()) {
>> > > > if (RI->getLexicalDeclContext() == CanonDef) {
>> > > > Found = true;
>> > > > break;
>> > > >
>> > > > diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp
>> > > > index 35b8db27bd0eb..14985cc32d0e4 100644
>> > > > --- a/clang/lib/Serialization/ASTWriterDecl.cpp
>> > > > +++ b/clang/lib/Serialization/ASTWriterDecl.cpp
>> > > > @@ -167,7 +167,7 @@ namespace clang {
>> > > > }
>> > > >
>> > > > Record.push_back(typeParams->size());
>> > > > - for (auto typeParam : *typeParams) {
>> > > > + for (auto *typeParam : *typeParams) {
>> > > > Record.AddDeclRef(typeParam);
>> > > > }
>> > > > Record.AddSourceLocation(typeParams->getLAngleLoc());
>> > > > @@ -661,7 +661,7 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) {
>> > > > }
>> > > >
>> > > > Record.push_back(D->param_size());
>> > > > - for (auto P : D->parameters())
>> > > > + for (auto *P : D->parameters())
>> > > > Record.AddDeclRef(P);
>> > > > Code = serialization::DECL_FUNCTION;
>> > > > }
>> > > >
>> > > > diff --git a/clang/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp
>> > > > index fea35d03cb813..c9b17a56b224d 100644
>> > > > --- a/clang/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp
>> > > > +++ b/clang/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp
>> > > > @@ -118,7 +118,7 @@ void CFErrorFunctionChecker::checkASTDecl(const FunctionDecl *D,
>> > > > II = &D->getASTContext().Idents.get("CFErrorRef");
>> > > >
>> > > > bool hasCFError = false;
>> > > > - for (auto I : D->parameters()) {
>> > > > + for (auto *I : D->parameters()) {
>> > > > if (IsCFError(I->getType(), II)) {
>> > > > hasCFError = true;
>> > > > break;
>> > > >
>> > > > diff --git a/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp
>> > > > index 1d8835f6b4741..8b4004d059e81 100644
>> > > > --- a/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp
>> > > > +++ b/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp
>> > > > @@ -907,7 +907,7 @@ void NullabilityChecker::checkPostObjCMessage(const ObjCMethodCall &M,
>> > > > // this class of methods reduced the emitted diagnostics by about 30% on
>> > > > // some projects (and all of that was false positives).
>> > > > if (Name.contains("String")) {
>> > > > - for (auto Param : M.parameters()) {
>> > > > + for (auto *Param : M.parameters()) {
>> > > > if (Param->getName() == "encoding") {
>> > > > State = State->set<NullabilityMap>(ReturnRegion,
>> > > > Nullability::Contradicted);
>> > > >
>> > > > diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp
>> > > > index 1aa665f0ef45d..fb90fc9c91ea3 100644
>> > > > --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp
>> > > > +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp
>> > > > @@ -368,7 +368,7 @@ class StreamChecker : public Checker<check::PreCall, eval::Call,
>> > > > // (and matching name) as stream functions.
>> > > > if (!Call.isGlobalCFunction())
>> > > > return nullptr;
>> > > > - for (auto P : Call.parameters()) {
>> > > > + for (auto *P : Call.parameters()) {
>> > > > QualType T = P->getType();
>> > > > if (!T->isIntegralOrEnumerationType() && !T->isPointerType())
>> > > > return nullptr;
>> > > >
>> > > > diff --git a/clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp
>> > > > index 05f8f6084c0b6..0fa3d6043971f 100644
>> > > > --- a/clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp
>> > > > +++ b/clang/lib/StaticAnalyzer/Checkers/UndefinedAssignmentChecker.cpp
>> > > > @@ -92,7 +92,7 @@ void UndefinedAssignmentChecker::checkBind(SVal location, SVal val,
>> > > > if (const auto *CD =
>> > > > dyn_cast<CXXConstructorDecl>(C.getStackFrame()->getDecl())) {
>> > > > if (CD->isImplicit()) {
>> > > > - for (auto I : CD->inits()) {
>> > > > + for (auto *I : CD->inits()) {
>> > > > if (I->getInit()->IgnoreImpCasts() == StoreE) {
>> > > > OS << "Value assigned to field '" << I->getMember()->getName()
>> > > > << "' in implicit constructor is garbage or undefined";
>> > > >
>> > > > diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
>> > > > index 97f75135bf922..6b4615e189bcd 100644
>> > > > --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
>> > > > +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoUncountedMembersChecker.cpp
>> > > > @@ -69,7 +69,7 @@ class NoUncountedMemberChecker
>> > > > if (shouldSkipDecl(RD))
>> > > > return;
>> > > >
>> > > > - for (auto Member : RD->fields()) {
>> > > > + for (auto *Member : RD->fields()) {
>> > > > const Type *MemberType = Member->getType().getTypePtrOrNull();
>> > > > if (!MemberType)
>> > > > continue;
>> > > >
>> > > > diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
>> > > > index 3a8d69df7a641..57591960a1401 100644
>> > > > --- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
>> > > > +++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
>> > > > @@ -1124,7 +1124,7 @@ static const ObjCMethodDecl *findDefiningRedecl(const ObjCMethodDecl *MD) {
>> > > >
>> > > > // Find the redeclaration that defines the method.
>> > > > if (!MD->hasBody()) {
>> > > > - for (auto I : MD->redecls())
>> > > > + for (auto *I : MD->redecls())
>> > > > if (I->hasBody())
>> > > > MD = cast<ObjCMethodDecl>(I);
>> > > > }
>> > > >
>> > > > diff --git a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
>> > > > index de90f4a71be00..994de60a732a2 100644
>> > > > --- a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
>> > > > +++ b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp
>> > > > @@ -616,7 +616,7 @@ void CoreEngine::enqueue(ExplodedNodeSet &Set,
>> > > > }
>> > > >
>> > > > void CoreEngine::enqueueEndOfFunction(ExplodedNodeSet &Set, const ReturnStmt *RS) {
>> > > > - for (auto I : Set) {
>> > > > + for (auto *I : Set) {
>> > > > // If we are in an inlined call, generate CallExitBegin node.
>> > > > if (I->getLocationContext()->getParent()) {
>> > > > I = generateCallExitBeginNode(I, RS);
>> > > >
>> > > > diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp
>> > > > index 5a55e81497b03..25c36e9aea24d 100644
>> > > > --- a/clang/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp
>> > > > +++ b/clang/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp
>> > > > @@ -206,7 +206,7 @@ void ExprEngine::VisitObjCMessage(const ObjCMessageExpr *ME,
>> > > > ExplodedNodeSet dstPostCheckers;
>> > > > getCheckerManager().runCheckersForObjCMessageNil(dstPostCheckers, Pred,
>> > > > *Msg, *this);
>> > > > - for (auto I : dstPostCheckers)
>> > > > + for (auto *I : dstPostCheckers)
>> > > > finishArgumentConstruction(Dst, I, *Msg);
>> > > > return;
>> > > > }
>> > > > @@ -270,7 +270,7 @@ void ExprEngine::VisitObjCMessage(const ObjCMessageExpr *ME,
>> > > >
>> > > > // If there were constructors called for object-type arguments, clean them up.
>> > > > ExplodedNodeSet dstArgCleanup;
>> > > > - for (auto I : dstEval)
>> > > > + for (auto *I : dstEval)
>> > > > finishArgumentConstruction(dstArgCleanup, I, *Msg);
>> > > >
>> > > > ExplodedNodeSet dstPostvisit;
>> > > >
>> > > > diff --git a/clang/lib/Tooling/Tooling.cpp b/clang/lib/Tooling/Tooling.cpp
>> > > > index 65d8508424320..a76046ae79193 100644
>> > > > --- a/clang/lib/Tooling/Tooling.cpp
>> > > > +++ b/clang/lib/Tooling/Tooling.cpp
>> > > > @@ -98,7 +98,7 @@ static bool ignoreExtraCC1Commands(const driver::Compilation *Compilation) {
>> > > > OffloadCompilation = true;
>> > > >
>> > > > if (Jobs.size() > 1) {
>> > > > - for (auto A : Actions){
>> > > > + for (auto *A : Actions){
>> > > > // On MacOSX real actions may end up being wrapped in BindArchAction
>> > > > if (isa<driver::BindArchAction>(A))
>> > > > A = *A->input_begin();
>> > > >
>> > > >
>> > > >
>> > > > _______________________________________________
>> > > > cfe-commits mailing list
>> > > > cfe-commits at lists.llvm.org
>> > > > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>> > > _______________________________________________
>> > > cfe-commits mailing list
>> > > cfe-commits at lists.llvm.org
>> > > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list