[clang-tools-extra] e0f2d4a - [clangd] Fix the crash in getQualification
Kirill Bobyrev via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 2 00:08:42 PDT 2021
Author: Kirill Bobyrev
Date: 2021-08-02T09:08:25+02:00
New Revision: e0f2d4af031c93b46f0920620ab6a798113b4b6e
URL: https://github.com/llvm/llvm-project/commit/e0f2d4af031c93b46f0920620ab6a798113b4b6e
DIFF: https://github.com/llvm/llvm-project/commit/e0f2d4af031c93b46f0920620ab6a798113b4b6e.diff
LOG: [clangd] Fix the crash in getQualification
Happens when DestContext is LinkageSpecDecl and hense CurContext happens to be
both not TagDecl and NamespaceDecl.
Minimal reproducer: trigger define outline in
```
namespace ns {
extern "C" {
typedef int foo;
}
foo Fo^o(int id) { return id; }
}
```
Reviewed By: kadircet
Differential Revision: https://reviews.llvm.org/D107047
Added:
Modified:
clang-tools-extra/clangd/AST.cpp
clang-tools-extra/clangd/unittests/ASTTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/AST.cpp b/clang-tools-extra/clangd/AST.cpp
index 32bae42a07976..778b945c47ca9 100644
--- a/clang-tools-extra/clangd/AST.cpp
+++ b/clang-tools-extra/clangd/AST.cpp
@@ -119,14 +119,17 @@ getQualification(ASTContext &Context, const DeclContext *DestContext,
(void)ReachedNS;
NNS = NestedNameSpecifier::Create(Context, nullptr, false,
TD->getTypeForDecl());
- } else {
+ } else if (auto *NSD = llvm::dyn_cast<NamespaceDecl>(CurContext)) {
ReachedNS = true;
- auto *NSD = llvm::cast<NamespaceDecl>(CurContext);
NNS = NestedNameSpecifier::Create(Context, nullptr, NSD);
- // Anonymous and inline namespace names are not spelled while qualifying a
- // name, so skip those.
+ // Anonymous and inline namespace names are not spelled while qualifying
+ // a name, so skip those.
if (NSD->isAnonymousNamespace() || NSD->isInlineNamespace())
continue;
+ } else {
+ // Other types of contexts cannot be spelled in code, just skip over
+ // them.
+ continue;
}
// Stop if this namespace is already visible at DestContext.
if (IsVisible(NNS))
diff --git a/clang-tools-extra/clangd/unittests/ASTTests.cpp b/clang-tools-extra/clangd/unittests/ASTTests.cpp
index 7b662189eaaf3..67ce927bf765b 100644
--- a/clang-tools-extra/clangd/unittests/ASTTests.cpp
+++ b/clang-tools-extra/clangd/unittests/ASTTests.cpp
@@ -259,6 +259,18 @@ TEST(ClangdAST, GetQualification) {
{"ns2::", "ns2::", ""},
{"ns1::"},
},
+ {
+ R"cpp(
+ namespace ns {
+ extern "C" {
+ typedef int Foo;
+ }
+ }
+ void insert(); // ns::Foo
+ )cpp",
+ {"ns::"},
+ {},
+ },
};
for (const auto &Case : Cases) {
Annotations Test(Case.Test);
More information about the cfe-commits
mailing list