forked from OSchip/llvm-project
[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:
parent
8f73c4432b
commit
117b9230a7
|
@ -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)) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue