[PATCH] D156693: [clang][ASTImporter]Skip check friend template declaration in VisitClassTemplateDecl
Qizhi Hu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 1 20:20:01 PDT 2023
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 at 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);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D156693.546301.patch
Type: text/x-patch
Size: 3185 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230802/57e573d5/attachment.bin>
More information about the cfe-commits
mailing list