aboutsummaryrefslogtreecommitdiff
path: root/clang
diff options
context:
space:
mode:
authorShanzhi <chenshanzhi@huawei.com>2024-01-29 19:17:13 +0800
committerTom Stellard <tstellar@redhat.com>2024-02-08 15:59:07 -0800
commitb12a742c20ae548c5d84f1719f9199577b382ccd (patch)
treeca07e9d28dbfcf2db72db12ecab4f18cb3d3e377 /clang
parenta88b998f8e526719a5643b665f3de444c22f2c66 (diff)
downloadllvm-b12a742c20ae548c5d84f1719f9199577b382ccd.zip
llvm-b12a742c20ae548c5d84f1719f9199577b382ccd.tar.gz
llvm-b12a742c20ae548c5d84f1719f9199577b382ccd.tar.bz2
[Clang][AST] Fix a crash on attaching doc comments (#78716)
This crash is basically caused by calling `ASTContext::getRawCommentForDeclNoCacheImp` with its input arguments `RepresentativeLocForDecl` and `CommentsInTheFile` refering to different files. A reduced reproducer is provided in this patch. After the source locations for instantiations of funtion template are corrected in the commit 256a0b298c68b89688b80350b034daf2f7785b67, the variable `CommitsInThisFile` in the function `ASTContext::attachCommentsToJustParsedDecls` would refer to the source file rather than the header file for implicit function template instantiation. Therefore, in the first loop in `ASTContext::attachCommentsToJustParsedDecls`, `D` should also be adjusted for relevant scenarios like the second loop. Fixes #67979 Fixes #68524 Fixes #70550 (cherry picked from commit 5f4ee5a2dfa97fe32ee62d1d67aa1413d5a059e6)
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/AST/ASTContext.cpp6
-rw-r--r--clang/test/AST/ast-crash-doc-function-template.cpp30
2 files changed, 35 insertions, 1 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index ab16ca1..cc5de9a 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -498,7 +498,11 @@ void ASTContext::attachCommentsToJustParsedDecls(ArrayRef<Decl *> Decls,
return;
FileID File;
- for (Decl *D : Decls) {
+ for (const Decl *D : Decls) {
+ if (D->isInvalidDecl())
+ continue;
+
+ D = &adjustDeclToTemplate(*D);
SourceLocation Loc = D->getLocation();
if (Loc.isValid()) {
// See if there are any new comments that are not attached to a decl.
diff --git a/clang/test/AST/ast-crash-doc-function-template.cpp b/clang/test/AST/ast-crash-doc-function-template.cpp
new file mode 100644
index 0000000..d48eb0d
--- /dev/null
+++ b/clang/test/AST/ast-crash-doc-function-template.cpp
@@ -0,0 +1,30 @@
+// RUN: rm -rf %t
+// RUN: split-file %s %t
+
+// RUN: %clang_cc1 -x c++ -Wdocumentation -fsyntax-only -ast-dump-all %t/t.cpp
+
+//--- t.h
+/// MyClass in the header file
+class MyClass {
+public:
+ template <typename T>
+ void Foo() const;
+
+ /// Bar
+ void Bar() const;
+};
+
+//--- t.cpp
+#include "t.h"
+
+/// MyClass::Bar: Foo<int>() is implicitly instantiated and called here.
+void MyClass::Bar() const {
+ Foo<int>();
+}
+
+/// MyClass::Foo
+template <typename T>
+void MyClass::Foo() const {
+}
+
+// CHECK: TranslationUnitDecl