[cfe-commits] r133671 - in /cfe/trunk: lib/Sema/SemaLookup.cpp test/SemaCXX/using-decl-assignment-cache.cpp

Chandler Carruth chandlerc at google.com
Wed Jun 22 18:39:08 PDT 2011


To relay some comments I made to Sean in person...

On Wed, Jun 22, 2011 at 5:26 PM, Sean Hunt <scshunt at csclub.uwaterloo.ca>wrote:

> Author: coppro
> Date: Wed Jun 22 19:26:20 2011
> New Revision: 133671
>
> URL: http://llvm.org/viewvc/llvm-project?rev=133671&view=rev
> Log:
> Clean up the heart of the caching code and miss fewer edge cases.
>
> Added:
>    cfe/trunk/test/SemaCXX/using-decl-assignment-cache.cpp
> 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=133671&r1=133670&r2=133671&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaLookup.cpp Wed Jun 22 19:26:20 2011
> @@ -2240,7 +2240,7 @@
>     ThisTy.addConst();
>   if (VolatileThis)
>     ThisTy.addVolatile();
> -  Expr::Classification ObjectClassification =
> +  Expr::Classification Classification =
>     (new (Context) OpaqueValueExpr(SourceLocation(), ThisTy,
>                                    RValueThis ? VK_RValue : VK_LValue))->
>         Classify(Context);
> @@ -2256,12 +2256,21 @@
>   assert((I != E) &&
>          "lookup for a constructor or assignment operator was empty");
>   for ( ; I != E; ++I) {
> -    if ((*I)->isInvalidDecl())
> +    Decl *DD = *I;
>

Please, a better name than 'DD'... =[


> +
> +    if (UsingShadowDecl *U = dyn_cast<UsingShadowDecl>(D))
> +      DD = U->getTargetDecl();
>

Is this always safe to do without checking that U is valid?

+
> +    if (DD->isInvalidDecl())
>       continue;
>
> -    if (CXXMethodDecl *M = dyn_cast<CXXMethodDecl>(*I)) {
> -      AddOverloadCandidate(M, DeclAccessPair::make(M, AS_public), &Arg,
> NumArgs,
> -                           OCS, true);
> +    if (CXXMethodDecl *M = dyn_cast<CXXMethodDecl>(DD)) {
> +      if (SM == CXXCopyAssignment || SM == CXXMoveAssignment)
> +        AddMethodCandidate(M, DeclAccessPair::make(M, AS_public), D,
> ThisTy,
> +                           Classification, &Arg, NumArgs, OCS, true);
> +      else
> +        AddOverloadCandidate(M, DeclAccessPair::make(M, AS_public), &Arg,
> +                             NumArgs, OCS, true);
>
>       // Here we're looking for a const parameter to speed up creation of
>       // implicit copy methods.
> @@ -2274,9 +2283,14 @@
>           Result->setConstParamMatch(true);
>       }
>     } else if (FunctionTemplateDecl *Tmpl =
> -                 dyn_cast<FunctionTemplateDecl>(*I)) {
> -      AddTemplateOverloadCandidate(Tmpl, DeclAccessPair::make(Tmpl,
> AS_public),
> -                                   0, &Arg, NumArgs, OCS, true);
> +                 dyn_cast<FunctionTemplateDecl>(DD)) {
> +      if (SM == CXXCopyAssignment || SM == CXXMoveAssignment)
> +        AddMethodTemplateCandidate(Tmpl, DeclAccessPair::make(Tmpl,
> AS_public),
> +                                   D, 0, ThisTy, Classification, &Arg,
> NumArgs,
> +                                   OCS, true);
> +      else
> +        AddTemplateOverloadCandidate(Tmpl, DeclAccessPair::make(Tmpl,
> AS_public),
> +                                     0, &Arg, NumArgs, OCS, true);
>     }
>   }
>
>
> Added: cfe/trunk/test/SemaCXX/using-decl-assignment-cache.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/using-decl-assignment-cache.cpp?rev=133671&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/using-decl-assignment-cache.cpp (added)
> +++ cfe/trunk/test/SemaCXX/using-decl-assignment-cache.cpp Wed Jun 22
> 19:26:20 2011
> @@ -0,0 +1,16 @@
> +// RUN: %clang_cc1 -std=c++0x -fsyntax-only %s
> +
> +struct D;
> +struct B {
> +  D& operator = (const D&);
> +};
> +struct D : B {
> +  using B::operator=;
> +};
> +struct F : D {
> +};
> +
> +void H () {
> +  F f;
> +  f = f;
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20110622/867d1cc1/attachment.html>


More information about the cfe-commits mailing list