jcsxky updated this revision to Diff 546301. jcsxky added a comment. update patch for pass unittests
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D156693/new/ https://reviews.llvm.org/D156693 Files: clang/lib/AST/ASTImporter.cpp clang/test/Analysis/Inputs/ctu-friend-template-other.cpp clang/test/Analysis/Inputs/ctu-friend-template.cpp.externalDefMap-dump.txt clang/test/Analysis/Inputs/ctu-friend-template.h clang/test/Analysis/ctu-friend-template.cpp Index: clang/test/Analysis/ctu-friend-template.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/ctu-friend-template.cpp @@ -0,0 +1,21 @@ +// RUN: rm -rf %t && mkdir %t +// RUN: mkdir -p %t/ctudir +// RUN: %clang_cc1 -std=c++14 -triple x86_64-pc-linux-gnu \ +// RUN: -emit-pch -o %t/ctudir/ctu-friend-template-other.cpp.ast %S/Inputs/ctu-friend-template-other.cpp +// RUN: cp %S/Inputs/ctu-friend-template.cpp.externalDefMap-dump.txt %t/ctudir/externalDefMap.txt +// RUN: %clang_analyze_cc1 -std=c++14 -triple x86_64-pc-linux-gnu \ +// RUN: -analyzer-checker=core,debug.ExprInspection \ +// RUN: -analyzer-config experimental-enable-naive-ctu-analysis=true \ +// RUN: -analyzer-config ctu-dir=%t/ctudir \ +// RUN: -Werror=ctu \ +// RUN: -verify %s + +// CHECK: CTU loaded AST file + +#include "Inputs/ctu-friend-template.h" + +void bar(); + +int main(){ + bar(); // expected-no-diagnostics +} Index: clang/test/Analysis/Inputs/ctu-friend-template.h =================================================================== --- /dev/null +++ clang/test/Analysis/Inputs/ctu-friend-template.h @@ -0,0 +1,20 @@ +namespace __1{ + +template<class T, T U> +class A; + +template<class T, T U> +class A{ +public: + template<class P, P Q> + friend class A; + + A(T x):x(x){} + + void foo(){} + +private: + T x; +}; + +} Index: clang/test/Analysis/Inputs/ctu-friend-template.cpp.externalDefMap-dump.txt =================================================================== --- /dev/null +++ clang/test/Analysis/Inputs/ctu-friend-template.cpp.externalDefMap-dump.txt @@ -0,0 +1 @@ +9:c:@F@bar# ctu-friend-template-other.cpp.ast Index: clang/test/Analysis/Inputs/ctu-friend-template-other.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/Inputs/ctu-friend-template-other.cpp @@ -0,0 +1,6 @@ +#include "ctu-friend-template.h" + +void bar(){ + __1::A<int,3> a1(0); + a1.foo(); +} Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ clang/lib/AST/ASTImporter.cpp @@ -44,6 +44,7 @@ #include "clang/AST/TypeLoc.h" #include "clang/AST/TypeVisitor.h" #include "clang/AST/UnresolvedSet.h" +#include "clang/AST/ParentMapContext.h" #include "clang/Basic/Builtins.h" #include "clang/Basic/ExceptionSpecificationType.h" #include "clang/Basic/FileManager.h" @@ -5812,7 +5813,6 @@ if (FoundTemplate) { if (!hasSameVisibilityContextAndLinkage(FoundTemplate, D)) continue; - if (IsStructuralMatch(D, FoundTemplate)) { ClassTemplateDecl *TemplateWithDef = getTemplateDefinition(FoundTemplate); @@ -5824,6 +5824,11 @@ // see ASTTests test ImportExistingFriendClassTemplateDef. continue; } + auto Parents = FoundDecl->getASTContext().getParents(*FoundDecl); + if (!Parents.empty() && nullptr != Parents.begin()->get<FriendDecl>() && + FoundTemplate->getName() == D->getName()) { + continue; + } ConflictingDecls.push_back(FoundDecl); } }
Index: clang/test/Analysis/ctu-friend-template.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/ctu-friend-template.cpp @@ -0,0 +1,21 @@ +// RUN: rm -rf %t && mkdir %t +// RUN: mkdir -p %t/ctudir +// RUN: %clang_cc1 -std=c++14 -triple x86_64-pc-linux-gnu \ +// RUN: -emit-pch -o %t/ctudir/ctu-friend-template-other.cpp.ast %S/Inputs/ctu-friend-template-other.cpp +// RUN: cp %S/Inputs/ctu-friend-template.cpp.externalDefMap-dump.txt %t/ctudir/externalDefMap.txt +// RUN: %clang_analyze_cc1 -std=c++14 -triple x86_64-pc-linux-gnu \ +// RUN: -analyzer-checker=core,debug.ExprInspection \ +// RUN: -analyzer-config experimental-enable-naive-ctu-analysis=true \ +// RUN: -analyzer-config ctu-dir=%t/ctudir \ +// RUN: -Werror=ctu \ +// RUN: -verify %s + +// CHECK: CTU loaded AST file + +#include "Inputs/ctu-friend-template.h" + +void bar(); + +int main(){ + bar(); // expected-no-diagnostics +} Index: clang/test/Analysis/Inputs/ctu-friend-template.h =================================================================== --- /dev/null +++ clang/test/Analysis/Inputs/ctu-friend-template.h @@ -0,0 +1,20 @@ +namespace __1{ + +template<class T, T U> +class A; + +template<class T, T U> +class A{ +public: + template<class P, P Q> + friend class A; + + A(T x):x(x){} + + void foo(){} + +private: + T x; +}; + +} Index: clang/test/Analysis/Inputs/ctu-friend-template.cpp.externalDefMap-dump.txt =================================================================== --- /dev/null +++ clang/test/Analysis/Inputs/ctu-friend-template.cpp.externalDefMap-dump.txt @@ -0,0 +1 @@ +9:c:@F@bar# ctu-friend-template-other.cpp.ast Index: clang/test/Analysis/Inputs/ctu-friend-template-other.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/Inputs/ctu-friend-template-other.cpp @@ -0,0 +1,6 @@ +#include "ctu-friend-template.h" + +void bar(){ + __1::A<int,3> a1(0); + a1.foo(); +} Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ clang/lib/AST/ASTImporter.cpp @@ -44,6 +44,7 @@ #include "clang/AST/TypeLoc.h" #include "clang/AST/TypeVisitor.h" #include "clang/AST/UnresolvedSet.h" +#include "clang/AST/ParentMapContext.h" #include "clang/Basic/Builtins.h" #include "clang/Basic/ExceptionSpecificationType.h" #include "clang/Basic/FileManager.h" @@ -5812,7 +5813,6 @@ if (FoundTemplate) { if (!hasSameVisibilityContextAndLinkage(FoundTemplate, D)) continue; - if (IsStructuralMatch(D, FoundTemplate)) { ClassTemplateDecl *TemplateWithDef = getTemplateDefinition(FoundTemplate); @@ -5824,6 +5824,11 @@ // see ASTTests test ImportExistingFriendClassTemplateDef. continue; } + auto Parents = FoundDecl->getASTContext().getParents(*FoundDecl); + if (!Parents.empty() && nullptr != Parents.begin()->get<FriendDecl>() && + FoundTemplate->getName() == D->getName()) { + continue; + } ConflictingDecls.push_back(FoundDecl); } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits