[clangd][Hover] Dont crash on null types

Reviewers: hokein, sammccall

Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D82701
This commit is contained in:
Kadir Cetinkaya 2020-06-27 11:12:51 +02:00
parent 8f73c4432b
commit 117b9230a7
No known key found for this signature in database
GPG Key ID: E39E36B8D2057ED6
2 changed files with 14 additions and 11 deletions

View File

@ -124,8 +124,8 @@ std::string printType(QualType QT, const PrintingPolicy &Policy) {
// TypePrinter doesn't resolve decltypes, so resolve them here.
// FIXME: This doesn't handle composite types that contain a decltype in them.
// We should rather have a printing policy for that.
while (const auto *DT = QT->getAs<DecltypeType>())
QT = DT->getUnderlyingType();
while (!QT.isNull() && QT->isDecltypeType())
QT = QT->getAs<DecltypeType>()->getUnderlyingType();
return QT.getAsString(Policy);
}
@ -297,15 +297,7 @@ void fillFunctionTypeAndParams(HoverInfo &HI, const Decl *D,
for (const ParmVarDecl *PVD : FD->parameters()) {
HI.Parameters->emplace_back();
auto &P = HI.Parameters->back();
if (!PVD->getType().isNull()) {
P.Type = printType(PVD->getType(), Policy);
} else {
std::string Param;
llvm::raw_string_ostream OS(Param);
PVD->dump(OS);
OS.flush();
elog("Got param with null type: {0}", Param);
}
P.Type = printType(PVD->getType(), Policy);
if (!PVD->getName().empty())
P.Name = PVD->getNameAsString();
if (const Expr *DefArg = getDefaultArg(PVD)) {

View File

@ -708,6 +708,17 @@ class Foo {})cpp";
HI.Definition = "X x";
HI.Type = "struct X";
}},
{// Don't crash on null types.
R"cpp(auto [^[[x]]] = 1; /*error-ok*/)cpp",
[](HoverInfo &HI) {
HI.Name = "x";
HI.Kind = index::SymbolKind::Variable;
HI.NamespaceScope = "";
HI.Definition = "";
HI.Type = "NULL TYPE";
// Bindings are in theory public members of an anonymous struct.
HI.AccessSpecifier = "public";
}},
};
for (const auto &Case : Cases) {
SCOPED_TRACE(Case.Code);