On Tue, Mar 22, 2016 at 1:09 AM, Justin Lebar via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: jlebar > Date: Mon Mar 21 19:09:25 2016 > New Revision: 264008 > > URL: http://llvm.org/viewvc/llvm-project?rev=264008&view=rev > Log: > [sema] [CUDA] Use std algorithms in EraseUnwantedCUDAMatchesImpl. > > Summary: NFC > > Reviewers: tra > > Subscribers: cfe-commits > > Differential Revision: http://reviews.llvm.org/D18327 > > Modified: > cfe/trunk/lib/Sema/SemaCUDA.cpp > > Modified: cfe/trunk/lib/Sema/SemaCUDA.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCUDA.cpp?rev=264008&r1=264007&r2=264008&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaCUDA.cpp (original) > +++ cfe/trunk/lib/Sema/SemaCUDA.cpp Mon Mar 21 19:09:25 2016 > @@ -210,31 +210,28 @@ bool Sema::CheckCUDATarget(const Functio > return false; > } > > -template <typename T, typename FetchDeclFn> > -static void EraseUnwantedCUDAMatchesImpl(Sema &S, const FunctionDecl *Caller, > - llvm::SmallVectorImpl<T> &Matches, > - FetchDeclFn FetchDecl) { > +template <typename T> > +static void EraseUnwantedCUDAMatchesImpl( > + Sema &S, const FunctionDecl *Caller, llvm::SmallVectorImpl<T> &Matches, > + std::function<const FunctionDecl *(const T &)> FetchDecl) { > assert(S.getLangOpts().CUDATargetOverloads && > "Should not be called w/o enabled target overloads."); > if (Matches.size() <= 1) > return; > > + // Gets the CUDA function preference for a call from Caller to Match. > + auto GetCFP = [&](const T &Match) { > + return S.IdentifyCUDAPreference(Caller, FetchDecl(Match)); > + }; > + > // Find the best call preference among the functions in Matches. > - Sema::CUDAFunctionPreference P, BestCFP = Sema::CFP_Never; > - for (auto const &Match : Matches) { > - P = S.IdentifyCUDAPreference(Caller, FetchDecl(Match)); > - if (P > BestCFP) > - BestCFP = P; > - } > + Sema::CUDAFunctionPreference BestCFP = GetCFP(*std::max_element( > + Matches.begin(), Matches.end(), > + [&](const T &M1, const T &M2) { return GetCFP(M1) < GetCFP(M2); })); > > // Erase all functions with lower priority. > - for (unsigned I = 0, N = Matches.size(); I != N;) > - if (S.IdentifyCUDAPreference(Caller, FetchDecl(Matches[I])) < BestCFP) { > - Matches[I] = Matches[--N]; > - Matches.resize(N); > - } else { > - ++I; > - } > + Matches.erase(llvm::remove_if( > + Matches, [&](const T &Match) { return GetCFP(Match) < BestCFP; }));
This is the single-element form of SmallVector::erase, so it won't remove ALL functions with lower priority. I sense a lack of test case here. > } > > void Sema::EraseUnwantedCUDAMatches(const FunctionDecl *Caller, > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits