diff options
author | Shanzhi <chenshanzhi@huawei.com> | 2024-01-29 19:17:13 +0800 |
---|---|---|
committer | Tom Stellard <tstellar@redhat.com> | 2024-02-08 15:59:07 -0800 |
commit | b12a742c20ae548c5d84f1719f9199577b382ccd (patch) | |
tree | ca07e9d28dbfcf2db72db12ecab4f18cb3d3e377 | |
parent | a88b998f8e526719a5643b665f3de444c22f2c66 (diff) | |
download | llvm-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)
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 6 | ||||
-rw-r--r-- | clang/test/AST/ast-crash-doc-function-template.cpp | 30 |
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 |