mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 05:40:09 +00:00
[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 256a0b298c
, 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)
This commit is contained in:
parent
a88b998f8e
commit
b12a742c20
@ -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.
|
||||
|
30
clang/test/AST/ast-crash-doc-function-template.cpp
Normal file
30
clang/test/AST/ast-crash-doc-function-template.cpp
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user