Skip to content

Commit 7191333

Browse files
committed
[CodeCompletion] Fix use of dangling pointers to stack memory
These pointers were already dangling, but after the recent change to cleanup ErrorType values, we would actually dereference them while walking the expressions. In debug builds, this manifest as crashes.
1 parent c6a5223 commit 7191333

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "swift/ClangImporter/ClangModule.h"
2727
#include "swift/Parse/CodeCompletionCallbacks.h"
2828
#include "swift/Sema/IDETypeChecking.h"
29+
#include "swift/Basic/Defer.h" // must be included after Tokens.def.
2930
#include "swift/Subsystems.h"
3031
#include "llvm/ADT/SmallSet.h"
3132
#include "llvm/ADT/SmallString.h"
@@ -42,6 +43,8 @@
4243
#include <algorithm>
4344
#include <string>
4445

46+
#undef defer // for Tokens.def; use defer_impl instead.
47+
4548
using namespace swift;
4649
using namespace ide;
4750

@@ -3246,6 +3249,13 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
32463249
CodeCompletionExpr CCE((SourceRange()));
32473250
sequence.back() = &CCE;
32483251

3252+
defer_impl {
3253+
// Reset sequence.
3254+
SE->setElement(SE->getNumElements() - 1, nullptr);
3255+
SE->setElement(SE->getNumElements() - 2, nullptr);
3256+
eraseErrorTypes(SE);
3257+
};
3258+
32493259
Expr *expr = SE;
32503260
if (!typeCheckCompletionSequence(const_cast<DeclContext *>(CurrDeclContext),
32513261
expr)) {
@@ -3336,13 +3346,8 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
33363346
tryPostfixOperator(LHS, cast<PostfixOperatorDecl>(op));
33373347
break;
33383348
case DeclKind::InfixOperator:
3339-
if (seenInfixOperators.insert(op->getName()).second) {
3349+
if (seenInfixOperators.insert(op->getName()).second)
33403350
tryInfixOperatorCompletion(cast<InfixOperatorDecl>(op), SE);
3341-
// Reset sequence.
3342-
eraseErrorTypes(SE);
3343-
SE->setElement(SE->getNumElements() - 1, nullptr);
3344-
SE->setElement(SE->getNumElements() - 2, nullptr);
3345-
}
33463351
break;
33473352
default:
33483353
llvm_unreachable("unexpected operator kind");

0 commit comments

Comments
 (0)