r245794 - Improve the performance of resolving a lookup result. We usually don't need to

Vassil Vassilev via cfe-commits cfe-commits at lists.llvm.org
Sat Feb 6 03:56:04 PST 2016


On 22/08/15 23:37, Richard Smith via cfe-commits wrote:
> Author: rsmith
> Date: Sat Aug 22 16:37:34 2015
> New Revision: 245794
>
> URL: http://llvm.org/viewvc/llvm-project?rev=245794&view=rev
> Log:
> Improve the performance of resolving a lookup result. We usually don't need to
> pick the most recent declaration, and we can often tell which declaration is
> more recent without walking the redeclaration chain. Do so when possible.
>
> Modified:
>      cfe/trunk/lib/Sema/SemaLookup.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=245794&r1=245793&r2=245794&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaLookup.cpp Sat Aug 22 16:37:34 2015
> @@ -356,7 +356,7 @@ static DeclContext *getContextForScopeMa
>   
>   /// \brief Determine whether \p D is a better lookup result than \p Existing,
>   /// given that they declare the same entity.
> -static bool isPreferredLookupResult(Sema::LookupNameKind Kind,
> +static bool isPreferredLookupResult(Sema &S, Sema::LookupNameKind Kind,
>                                       NamedDecl *D, NamedDecl *Existing) {
>     // When looking up redeclarations of a using declaration, prefer a using
>     // shadow declaration over any other declaration of the same entity.
> @@ -376,13 +376,46 @@ static bool isPreferredLookupResult(Sema
>       return false;
>     }
>   
> -  // If D is newer than Existing, prefer it.
> +  // Pick the function with more default arguments.
> +  // FIXME: In the presence of ambiguous default arguments, we should keep both,
> +  //        so we can diagnose the ambiguity if the default argument is needed.
> +  //        See C++ [over.match.best]p3.
> +  if (auto *DFD = dyn_cast<FunctionDecl>(DUnderlying)) {
> +    auto *EFD = cast<FunctionDecl>(EUnderlying);
> +    unsigned DMin = DFD->getMinRequiredArguments();
> +    unsigned EMin = EFD->getMinRequiredArguments();
> +    // If D has more default arguments, it is preferred.
> +    if (DMin != EMin)
> +      return DMin < EMin;
> +  }
> +
> +  // Pick the template with more default template arguments.
> +  if (auto *DTD = dyn_cast<TemplateDecl>(DUnderlying)) {
> +    auto *ETD = cast<TemplateDecl>(EUnderlying);
> +    unsigned DMin = DTD->getTemplateParameters()->getMinRequiredArguments();
> +    unsigned EMin = ETD->getTemplateParameters()->getMinRequiredArguments();
> +    // If D has more default arguments, it is preferred.
> +    if (DMin != EMin)
> +      return DMin < EMin;
> +  }
> +
> +  // For most kinds of declaration, it doesn't really matter which one we pick.
> +  if (!isa<FunctionDecl>(DUnderlying) && !isa<VarDecl>(DUnderlying)) {
> +    // If the existing declaration is hidden, prefer the new one. Otherwise,
> +    // keep what we've got.
> +    return !S.isVisible(Existing);
> +  }
> +
> +  // Pick the newer declaration; it might have a more precise type.
>     for (Decl *Prev = DUnderlying->getPreviousDecl(); Prev;
>          Prev = Prev->getPreviousDecl())
>       if (Prev == EUnderlying)
>         return true;
> -
>     return false;
> +
> +  // If the existing declaration is hidden, prefer the new one. Otherwise,
> +  // keep what we've got.
> +  return !S.isVisible(Existing);
It seems that this part is never executed. What am I missing something?
--Vassil
>   }
>   
>   /// Resolves the result kind of this lookup.
> @@ -462,7 +495,7 @@ void LookupResult::resolveKind() {
>       if (ExistingI) {
>         // This is not a unique lookup result. Pick one of the results and
>         // discard the other.
> -      if (isPreferredLookupResult(getLookupKind(), Decls[I],
> +      if (isPreferredLookupResult(getSema(), getLookupKind(), Decls[I],
>                                     Decls[*ExistingI]))
>           Decls[*ExistingI] = Decls[I];
>         Decls[I] = Decls[--N];
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list