Thank you, Peter! I'll take a look.
Unfortunately, there were no any buildbot e-mail complains about it so I didn't even notice the issue.

20.12.2017 04:48, Peter Collingbourne пишет:
Hi,

I reverted this change in r321139 because it causes a test failure on Windows. e.g. https://logs.chromium.org/v/?s=chromium%2Fbb%2Ftryserver.chromium.win%2Fwin_upload_clang%2F277%2F%2B%2Frecipes%2Fsteps%2Fpackage_clang%2F0%2Fstdout
Please let me know if you have trouble reproducing.

Thanks,
Peter

On Sun, Dec 17, 2017 at 6:16 AM, Aleksei Sidorin via cfe-commits <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:

    Author: a.sidorin
    Date: Sun Dec 17 06:16:17 2017
    New Revision: 320942

    URL: http://llvm.org/viewvc/llvm-project?rev=320942&view=rev
    <http://llvm.org/viewvc/llvm-project?rev=320942&view=rev>
    Log:
    [ASTImporter] Support importing FunctionTemplateDecl and
    CXXDependentScopeMemberExpr

    * Also introduces ImportTemplateArgumentListInfo facility (A. Sidorin)

    Patch by Peter Szecsi!

    Differential Revision: https://reviews.llvm.org/D38692
    <https://reviews.llvm.org/D38692>

    Modified:
        cfe/trunk/lib/AST/ASTImporter.cpp
        cfe/trunk/unittests/AST/ASTImporterTest.cpp

    Modified: cfe/trunk/lib/AST/ASTImporter.cpp
    URL:
    
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=320942&r1=320941&r2=320942&view=diff
    
<http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTImporter.cpp?rev=320942&r1=320941&r2=320942&view=diff>
    
==============================================================================
    --- cfe/trunk/lib/AST/ASTImporter.cpp (original)
    +++ cfe/trunk/lib/AST/ASTImporter.cpp Sun Dec 17 06:16:17 2017
    @@ -134,12 +134,17 @@ namespace clang {
         bool ImportTemplateArguments(const TemplateArgument *FromArgs,
                                      unsigned NumFromArgs,
                                    SmallVectorImpl<TemplateArgument>
    &ToArgs);
    +    template <typename InContainerTy>
    +    bool ImportTemplateArgumentListInfo(const InContainerTy
    &Container,
    + TemplateArgumentListInfo &ToTAInfo);
         bool IsStructuralMatch(RecordDecl *FromRecord, RecordDecl
    *ToRecord,
                                bool Complain = true);
         bool IsStructuralMatch(VarDecl *FromVar, VarDecl *ToVar,
                                bool Complain = true);
         bool IsStructuralMatch(EnumDecl *FromEnum, EnumDecl *ToRecord);
         bool IsStructuralMatch(EnumConstantDecl *FromEC,
    EnumConstantDecl *ToEC);
    +    bool IsStructuralMatch(FunctionTemplateDecl *From,
    +                           FunctionTemplateDecl *To);
         bool IsStructuralMatch(ClassTemplateDecl *From,
    ClassTemplateDecl *To);
         bool IsStructuralMatch(VarTemplateDecl *From, VarTemplateDecl
    *To);
         Decl *VisitDecl(Decl *D);
    @@ -195,6 +200,7 @@ namespace clang {
     ClassTemplateSpecializationDecl *D);
         Decl *VisitVarTemplateDecl(VarTemplateDecl *D);
         Decl
    *VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D);
    +    Decl *VisitFunctionTemplateDecl(FunctionTemplateDecl *D);

         // Importing statements
         DeclGroupRef ImportDeclGroup(DeclGroupRef DG);
    @@ -280,6 +286,7 @@ namespace clang {
         Expr *VisitCXXDeleteExpr(CXXDeleteExpr *E);
         Expr *VisitCXXConstructExpr(CXXConstructExpr *E);
         Expr *VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
    +    Expr
    *VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
         Expr *VisitExprWithCleanups(ExprWithCleanups *EWC);
         Expr *VisitCXXThisExpr(CXXThisExpr *E);
         Expr *VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
    @@ -1247,6 +1254,18 @@ bool ASTNodeImporter::ImportTemplateArgu
       return false;
     }

    +template <typename InContainerTy>
    +bool ASTNodeImporter::ImportTemplateArgumentListInfo(
    +    const InContainerTy &Container, TemplateArgumentListInfo
    &ToTAInfo) {
    +  for (const auto &FromLoc : Container) {
    +    if (auto ToLoc = ImportTemplateArgumentLoc(FromLoc))
    +      ToTAInfo.addArgument(*ToLoc);
    +    else
    +      return true;
    +  }
    +  return false;
    +}
    +
     bool ASTNodeImporter::IsStructuralMatch(RecordDecl *FromRecord,
                                             RecordDecl *ToRecord,
    bool Complain) {
       // Eliminate a potential failure point where we attempt to
    re-import
    @@ -1280,6 +1299,14 @@ bool ASTNodeImporter::IsStructuralMatch(
       return Ctx.IsStructurallyEquivalent(FromEnum, ToEnum);
     }

    +bool ASTNodeImporter::IsStructuralMatch(FunctionTemplateDecl *From,
    + FunctionTemplateDecl *To) {
    +  StructuralEquivalenceContext Ctx(
    +      Importer.getFromContext(), Importer.getToContext(),
    +      Importer.getNonEquivalentDecls(), false, false);
    +  return Ctx.IsStructurallyEquivalent(From, To);
    +}
    +
     bool ASTNodeImporter::IsStructuralMatch(EnumConstantDecl *FromEC,
                                             EnumConstantDecl *ToEC)
     {
    @@ -4197,6 +4224,64 @@ Decl *ASTNodeImporter::VisitVarTemplateS
       return D2;
     }

    +Decl
    *ASTNodeImporter::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
    +  DeclContext *DC, *LexicalDC;
    +  DeclarationName Name;
    +  SourceLocation Loc;
    +  NamedDecl *ToD;
    +
    +  if (ImportDeclParts(D, DC, LexicalDC, Name, ToD, Loc))
    +    return nullptr;
    +
    +  if (ToD)
    +    return ToD;
    +
    +  // Try to find a function in our own ("to") context with the
    same name, same
    +  // type, and in the same context as the function we're importing.
    +  if (!LexicalDC->isFunctionOrMethod()) {
    +    unsigned IDNS = Decl::IDNS_Ordinary;
    +    SmallVector<NamedDecl *, 2> FoundDecls;
    +    DC->getRedeclContext()->localUncachedLookup(Name, FoundDecls);
    +    for (unsigned I = 0, N = FoundDecls.size(); I != N; ++I) {
    +      if (!FoundDecls[I]->isInIdentifierNamespace(IDNS))
    +        continue;
    +
    +      if (FunctionTemplateDecl *FoundFunction =
    +              dyn_cast<FunctionTemplateDecl>(FoundDecls[I])) {
    +        if (FoundFunction->hasExternalFormalLinkage() &&
    +            D->hasExternalFormalLinkage()) {
    +          if (IsStructuralMatch(D, FoundFunction)) {
    +            Importer.Imported(D, FoundFunction);
    +            // FIXME: Actually try to merge the body and other
    attributes.
    +            return FoundFunction;
    +          }
    +        }
    +      }
    +    }
    +  }
    +
    +  TemplateParameterList *Params =
    +      ImportTemplateParameterList(D->getTemplateParameters());
    +  if (!Params)
    +    return nullptr;
    +
    +  FunctionDecl *TemplatedFD =
    +     
    cast_or_null<FunctionDecl>(Importer.Import(D->getTemplatedDecl()));
    +  if (!TemplatedFD)
    +    return nullptr;
    +
    +  FunctionTemplateDecl *ToFunc = FunctionTemplateDecl::Create(
    +      Importer.getToContext(), DC, Loc, Name, Params, TemplatedFD);
    +
    +  TemplatedFD->setDescribedFunctionTemplate(ToFunc);
    +  ToFunc->setAccess(D->getAccess());
    +  ToFunc->setLexicalDeclContext(LexicalDC);
    +  Importer.Imported(D, ToFunc);
    +
    +  LexicalDC->addDeclInternal(ToFunc);
    +  return ToFunc;
    +}
    +
     
//----------------------------------------------------------------------------
     // Import Statements
     
//----------------------------------------------------------------------------
    @@ -5759,6 +5844,47 @@ Expr *ASTNodeImporter::VisitCXXPseudoDes
             Importer.Import(E->getTildeLoc()), Storage);
     }

    +Expr *ASTNodeImporter::VisitCXXDependentScopeMemberExpr(
    +    CXXDependentScopeMemberExpr *E) {
    +  Expr *Base = nullptr;
    +  if (!E->isImplicitAccess()) {
    +    Base = Importer.Import(E->getBase());
    +    if (!Base)
    +      return nullptr;
    +  }
    +
    +  QualType BaseType = Importer.Import(E->getBaseType());
    +  if (BaseType.isNull())
    +    return nullptr;
    +
    +  TemplateArgumentListInfo
    ToTAInfo(Importer.Import(E->getLAngleLoc()),
    +                                   
    Importer.Import(E->getRAngleLoc()));
    +  TemplateArgumentListInfo *ResInfo = nullptr;
    +  if (E->hasExplicitTemplateArgs()) {
    +    if (ImportTemplateArgumentListInfo(E->template_arguments(),
    ToTAInfo))
    +      return nullptr;
    +    ResInfo = &ToTAInfo;
    +  }
    +
    +  DeclarationName Name = Importer.Import(E->getMember());
    +  if (!E->getMember().isEmpty() && Name.isEmpty())
    +    return nullptr;
    +
    +  DeclarationNameInfo MemberNameInfo(Name,
    Importer.Import(E->getMemberLoc()));
    +  // Import additional name location/type info.
    +  ImportDeclarationNameLoc(E->getMemberNameInfo(), MemberNameInfo);
    +  auto ToFQ = Importer.Import(E->getFirstQualifierFoundInScope());
    +  if (!ToFQ && E->getFirstQualifierFoundInScope())
    +    return nullptr;
    +
    +  return CXXDependentScopeMemberExpr::Create(
    +      Importer.getToContext(), Base, BaseType, E->isArrow(),
    +      Importer.Import(E->getOperatorLoc()),
    +      Importer.Import(E->getQualifierLoc()),
    +      Importer.Import(E->getTemplateKeywordLoc()),
    +      cast_or_null<NamedDecl>(ToFQ), MemberNameInfo, ResInfo);
    +}
    +
     Expr *ASTNodeImporter::VisitCallExpr(CallExpr *E) {
       QualType T = Importer.Import(E->getType());
       if (T.isNull())

    Modified: cfe/trunk/unittests/AST/ASTImporterTest.cpp
    URL:
    
http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/ASTImporterTest.cpp?rev=320942&r1=320941&r2=320942&view=diff
    
<http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/ASTImporterTest.cpp?rev=320942&r1=320941&r2=320942&view=diff>
    
==============================================================================
    --- cfe/trunk/unittests/AST/ASTImporterTest.cpp (original)
    +++ cfe/trunk/unittests/AST/ASTImporterTest.cpp Sun Dec 17
    06:16:17 2017
    @@ -504,6 +504,35 @@ TEST(ImportType, ImportTypeAliasTemplate
    declRefExpr()))))))))));
     }

    +TEST(ImportDecl, ImportFunctionTemplateDecl) {
    +  MatchVerifier<Decl> Verifier;
    +  EXPECT_TRUE(testImport("template <typename T> void
    declToImport() { };",
    +                         Lang_CXX, "", Lang_CXX, Verifier,
    +                         functionTemplateDecl()));
    +}
    +
    +const internal::VariadicDynCastAllOfMatcher<Expr,
    CXXDependentScopeMemberExpr>
    +    cxxDependentScopeMemberExpr;
    +
    +TEST(ImportExpr, ImportCXXDependentScopeMemberExpr) {
    +  MatchVerifier<Decl> Verifier;
    +  EXPECT_TRUE(testImport("template <typename T> class C { T t; };"
    +                         "template <typename T> void
    declToImport() {"
    +                         "  C<T> d;"
    +                         "  d.t;"
    +                         "}",
    +                         Lang_CXX, "", Lang_CXX, Verifier,
    +                       
     functionTemplateDecl(has(functionDecl(has(compoundStmt(
    +                           
     has(cxxDependentScopeMemberExpr()))))))));
    +  EXPECT_TRUE(testImport("template <typename T> class C { T t; };"
    +                         "template <typename T> void
    declToImport() {"
    +                         "  C<T> d;"
    +                         "  (&d)->t;"
    +                         "}",
    +                         Lang_CXX, "", Lang_CXX, Verifier,
    +                       
     functionTemplateDecl(has(functionDecl(has(compoundStmt(
    +                           
     has(cxxDependentScopeMemberExpr()))))))));
    +}

     TEST(ImportType, ImportPackExpansion) {
       MatchVerifier<Decl> Verifier;


    _______________________________________________
    cfe-commits mailing list
    cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>
    http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
    <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>




--
--
Peter


--
Best regards,
Aleksei Sidorin,
SRR, Samsung Electronics

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to