diff options
| author | Ilya Biryukov <ibiryukov@google.com> | 2019-12-11 09:38:14 +0100 |
|---|---|---|
| committer | Ilya Biryukov <ibiryukov@google.com> | 2019-12-11 09:43:28 +0100 |
| commit | f7c8ace4a52acecff7cd6ab61cbeaf677da1dd86 (patch) | |
| tree | c5bcfae1604fa33605be86cda5cbff8f04533157 | |
| parent | 8a7c52bc22c93747d9c8742e92d6ffc1ae17ef6c (diff) | |
| download | bcm5719-llvm-f7c8ace4a52acecff7cd6ab61cbeaf677da1dd86.tar.gz bcm5719-llvm-f7c8ace4a52acecff7cd6ab61cbeaf677da1dd86.zip | |
[CodeComplete] Fix a crash in preferred type and signature help
Summary: Null type pointers could be dereferenced in some cases.
Reviewers: kadircet, sammccall
Reviewed By: sammccall
Subscribers: cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71329
| -rw-r--r-- | clang/lib/Parse/ParseExprCXX.cpp | 9 | ||||
| -rw-r--r-- | clang/unittests/Sema/CodeCompleteTest.cpp | 8 |
2 files changed, 14 insertions, 3 deletions
diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp index 7dfe71fb9eb..fecd70b17e5 100644 --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/lib/Parse/ParseExprCXX.cpp @@ -1862,9 +1862,11 @@ Parser::ParseCXXTypeConstructExpression(const DeclSpec &DS) { CommaLocsTy CommaLocs; auto RunSignatureHelp = [&]() { - QualType PreferredType = Actions.ProduceConstructorSignatureHelp( - getCurScope(), TypeRep.get()->getCanonicalTypeInternal(), - DS.getEndLoc(), Exprs, T.getOpenLocation()); + QualType PreferredType; + if (TypeRep) + PreferredType = Actions.ProduceConstructorSignatureHelp( + getCurScope(), TypeRep.get()->getCanonicalTypeInternal(), + DS.getEndLoc(), Exprs, T.getOpenLocation()); CalledSignatureHelp = true; return PreferredType; }; @@ -3038,6 +3040,7 @@ Parser::ParseCXXNewExpression(bool UseGlobal, SourceLocation Start) { auto RunSignatureHelp = [&]() { ParsedType TypeRep = Actions.ActOnTypeName(getCurScope(), DeclaratorInfo).get(); + assert(TypeRep && "invalid types should be handled before"); QualType PreferredType = Actions.ProduceConstructorSignatureHelp( getCurScope(), TypeRep.get()->getCanonicalTypeInternal(), DeclaratorInfo.getEndLoc(), ConstructorArgs, ConstructorLParen); diff --git a/clang/unittests/Sema/CodeCompleteTest.cpp b/clang/unittests/Sema/CodeCompleteTest.cpp index ab1792ba637..a9441a679ca 100644 --- a/clang/unittests/Sema/CodeCompleteTest.cpp +++ b/clang/unittests/Sema/CodeCompleteTest.cpp @@ -481,4 +481,12 @@ TEST(PreferredTypeTest, FunctionArguments) { )cpp"; EXPECT_THAT(collectPreferredTypes(Code), Each("vector<int>")); } + +TEST(PreferredTypeTest, NoCrashOnInvalidTypes) { + StringRef Code = R"cpp( + auto x = decltype(&1)(^); + auto y = new decltype(&1)(^); + )cpp"; + EXPECT_THAT(collectPreferredTypes(Code), Each("NULL TYPE")); +} } // namespace |

