summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Sema/SemaCodeComplete.cpp30
-rw-r--r--test/Index/complete-access-checks-crash.cpp13
2 files changed, 15 insertions, 28 deletions
diff --git a/lib/Sema/SemaCodeComplete.cpp b/lib/Sema/SemaCodeComplete.cpp
index 4e571eba17..30af826ef6 100644
--- a/lib/Sema/SemaCodeComplete.cpp
+++ b/lib/Sema/SemaCodeComplete.cpp
@@ -1303,34 +1303,8 @@ namespace {
void FoundDecl(NamedDecl *ND, NamedDecl *Hiding, DeclContext *Ctx,
bool InBaseClass) override {
bool Accessible = true;
- if (Ctx) {
- DeclContext *AccessingCtx = Ctx;
- // If ND comes from a base class, set the naming class back to the
- // derived class if the search starts from the derived class (i.e.
- // InBaseClass is true).
- //
- // Example:
- // class B { protected: int X; }
- // class D : public B { void f(); }
- // void D::f() { this->^; }
- // The completion after "this->" will have `InBaseClass` set to true and
- // `Ctx` set to "B", when looking up in `B`. We need to set the actual
- // accessing context (i.e. naming class) to "D" so that access can be
- // calculated correctly.
- if (InBaseClass && isa<CXXRecordDecl>(Ctx)) {
- CXXRecordDecl *RC = nullptr;
- // Get the enclosing record.
- for (DeclContext *DC = CurContext; !DC->isFileContext();
- DC = DC->getParent()) {
- if ((RC = dyn_cast<CXXRecordDecl>(DC)))
- break;
- }
- if (RC)
- AccessingCtx = RC;
- }
- Accessible = Results.getSema().IsSimplyAccessible(ND, AccessingCtx);
- }
-
+ if (Ctx)
+ Accessible = Results.getSema().IsSimplyAccessible(ND, Ctx);
ResultBuilder::Result Result(ND, Results.getBasePriority(ND), nullptr,
false, Accessible, FixIts);
Results.AddResult(Result, CurContext, Hiding, InBaseClass);
diff --git a/test/Index/complete-access-checks-crash.cpp b/test/Index/complete-access-checks-crash.cpp
new file mode 100644
index 0000000000..c7ac4d6563
--- /dev/null
+++ b/test/Index/complete-access-checks-crash.cpp
@@ -0,0 +1,13 @@
+struct Base {
+protected:
+ bool bar();
+};
+struct Derived : Base {
+};
+
+struct X {
+ int foo() {
+ Derived(). // RUN: c-index-test -code-completion-at=%s:10:15 %s | FileCheck %s
+ // CHECK: bar{{.*}}(inaccessible)
+ }
+};