Author: Sam McCall Date: 2021-08-13T10:38:52+02:00 New Revision: 7d65cc98f3508750fcf12240cab625c6e1d5c4ed
URL: https://github.com/llvm/llvm-project/commit/7d65cc98f3508750fcf12240cab625c6e1d5c4ed DIFF: https://github.com/llvm/llvm-project/commit/7d65cc98f3508750fcf12240cab625c6e1d5c4ed.diff LOG: [clangd] Guard against null Attrs in the AST Added: Modified: clang-tools-extra/clangd/AST.cpp clang-tools-extra/clangd/unittests/SelectionTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/AST.cpp b/clang-tools-extra/clangd/AST.cpp index a47a5a1aab1d..3b5956037746 100644 --- a/clang-tools-extra/clangd/AST.cpp +++ b/clang-tools-extra/clangd/AST.cpp @@ -488,15 +488,22 @@ std::vector<const Attr *> getAttributes(const DynTypedNode &N) { if (const auto *TL = N.get<TypeLoc>()) { for (AttributedTypeLoc ATL = TL->getAs<AttributedTypeLoc>(); !ATL.isNull(); ATL = ATL.getModifiedLoc().getAs<AttributedTypeLoc>()) { - Result.push_back(ATL.getAttr()); + if (const Attr *A = ATL.getAttr()) + Result.push_back(A); assert(!ATL.getModifiedLoc().isNull()); } } - if (const auto *S = N.get<AttributedStmt>()) + if (const auto *S = N.get<AttributedStmt>()) { for (; S != nullptr; S = dyn_cast<AttributedStmt>(S->getSubStmt())) - llvm::copy(S->getAttrs(), std::back_inserter(Result)); - if (const auto *D = N.get<Decl>()) - llvm::copy(D->attrs(), std::back_inserter(Result)); + for (const Attr *A : S->getAttrs()) + if (A) + Result.push_back(A); + } + if (const auto *D = N.get<Decl>()) { + for (const Attr *A : D->attrs()) + if (A) + Result.push_back(A); + } return Result; } diff --git a/clang-tools-extra/clangd/unittests/SelectionTests.cpp b/clang-tools-extra/clangd/unittests/SelectionTests.cpp index 3898388d1ad2..5a45e5bde8fa 100644 --- a/clang-tools-extra/clangd/unittests/SelectionTests.cpp +++ b/clang-tools-extra/clangd/unittests/SelectionTests.cpp @@ -465,7 +465,15 @@ TEST(SelectionTest, CommonAncestor) { // Digraph syntax for attributes to avoid accidental annotations. class <:[gsl::Owner([[in^t]])]:> X{}; )cpp", - "BuiltinTypeLoc"}}; + "BuiltinTypeLoc"}, + + // This case used to crash - AST has a null Attr + {R"cpp( + @interface I + [[@property(retain, nonnull) <:[My^Object2]:> *x]]; // error-ok + @end + )cpp", + "ObjCPropertyDecl"}}; for (const Case &C : Cases) { trace::TestTracer Tracer; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits