[PATCH] PR16182 - Visit parameter declaration of implicitly declared copy assignment operator.

Michael Han fragmentshaders at gmail.com
Thu Aug 1 13:59:59 PDT 2013


Ping.

To recap: this patch fixes PR16182 (
http://llvm.org/bugs/show_bug.cgi?id=16182). OK to commit?

Thanks.


On Tue, Jun 11, 2013 at 1:31 PM, Michael Han <fragmentshaders at gmail.com>wrote:

> Hi klimek, rsmith,
>
> This patch fixes PR16182
> http://llvm.org/bugs/show_bug.cgi?id=16182
>
> A valid TypeSourceInfo of a function is required for the RAV to visit the
> parameter declaration of the function, and previously we don't have a valid
> TypeSourceInfo when creating the function declaration of implicit copy
> assignment operator.
>
> This patch fixes this by building a TypeSourceInfo from the function
> prototype of copy assignment operator and associate its ParmVarDecl with
> this function type location.
>
> The test is done by matching that an empty name (we don't have a name for
> the parameter of the implicit copy assignment function) appears at expect
> location, which is the source location of the class that is also used as
> the location of the implicit copy assignment function.
>
>
> http://llvm-reviews.chandlerc.com/D958
>
> Files:
>   unittests/Tooling/TestVisitor.h
>   unittests/Tooling/RecursiveASTVisitorTest.cpp
>   lib/Sema/SemaDeclCXX.cpp
>
> Index: unittests/Tooling/TestVisitor.h
> ===================================================================
> --- unittests/Tooling/TestVisitor.h
> +++ unittests/Tooling/TestVisitor.h
> @@ -31,7 +31,7 @@
>  /// This is a drop-in replacement for RecursiveASTVisitor itself, with the
>  /// additional capability of running it over a snippet of code.
>  ///
> -/// Visits template instantiations (but not implicit code) by default.
> +/// Visits template instantiations and implicit code by default.
>  template <typename T>
>  class TestVisitor : public RecursiveASTVisitor<T> {
>  public:
> @@ -55,6 +55,10 @@
>      return true;
>    }
>
> +  bool shouldVisitImplicitCode() const {
> +    return true;
> +  }
> +
>  protected:
>    virtual ASTFrontendAction* CreateTestAction() {
>      return new TestAction(this);
> Index: unittests/Tooling/RecursiveASTVisitorTest.cpp
> ===================================================================
> --- unittests/Tooling/RecursiveASTVisitorTest.cpp
> +++ unittests/Tooling/RecursiveASTVisitorTest.cpp
> @@ -35,6 +35,14 @@
>   }
>  };
>
> +class ParmVarDeclVisitor : public
> ExpectedLocationVisitor<ParmVarDeclVisitor> {
> +public:
> +  bool VisitParmVarDecl(ParmVarDecl *ParamVar) {
> +    Match(ParamVar->getNameAsString(), ParamVar->getLocStart());
> +    return true;
> +  }
> +};
> +
>  class CXXMemberCallVisitor
>    : public ExpectedLocationVisitor<CXXMemberCallVisitor> {
>  public:
> @@ -106,6 +114,14 @@
>    }
>  };
>
> +TEST(RecursiveASTVisitor, VisitsParmVarDecl) {
> +  ParmVarDeclVisitor Visitor;
> +  Visitor.ExpectMatch("", 1, 7);
> +  EXPECT_TRUE(Visitor.runOver(
> +    "class X {};\n"
> +    "void foo(X a, X b) {a = b;}"));
> +}
> +
>  TEST(RecursiveASTVisitor, VisitsBaseClassDeclarations) {
>    TypeLocVisitor Visitor;
>    Visitor.ExpectMatch("class X", 1, 30);
> Index: lib/Sema/SemaDeclCXX.cpp
> ===================================================================
> --- lib/Sema/SemaDeclCXX.cpp
> +++ lib/Sema/SemaDeclCXX.cpp
> @@ -8788,14 +8788,24 @@
>    FunctionProtoType::ExtProtoInfo EPI;
>    EPI.ExceptionSpecType = EST_Unevaluated;
>    EPI.ExceptionSpecDecl = CopyAssignment;
> -  CopyAssignment->setType(Context.getFunctionType(RetType, ArgType, EPI));
> +  QualType T = Context.getFunctionType(RetType, ArgType, EPI);
> +  CopyAssignment->setType(T);
>
> +  // PR16182. Build type source info for copy assignment operator. RAV
> relies on
> +  // type source info to traverse parameter declaration of implicit
> +  // declared copy assignment operator.
> +  TypeSourceInfo *TSInfo = Context.getTrivialTypeSourceInfo(T, ClassLoc);
> +  CopyAssignment->setTypeSourceInfo(TSInfo);
> +  UnqualTypeLoc UnQualTL = TSInfo->getTypeLoc().getUnqualifiedLoc();
> +  FunctionTypeLoc FTL = UnQualTL.getAs<FunctionTypeLoc>();
> +
>    // Add the parameter to the operator.
>    ParmVarDecl *FromParam = ParmVarDecl::Create(Context, CopyAssignment,
>                                                 ClassLoc, ClassLoc,
> /*Id=*/0,
>                                                 ArgType, /*TInfo=*/0,
>                                                 SC_None, 0);
>    CopyAssignment->setParams(FromParam);
> +  FTL.setArg(0, FromParam);
>
>    AddOverriddenMethods(ClassDecl, CopyAssignment);
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130801/e6574615/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: implicit.patch
Type: application/octet-stream
Size: 3623 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130801/e6574615/attachment.obj>


More information about the cfe-commits mailing list