[CodeComplete] Fix the crash in code completion on access checking
authorIlya Biryukov <ibiryukov@google.com>
Mon, 30 Jul 2018 15:19:05 +0000 (15:19 +0000)
committerIlya Biryukov <ibiryukov@google.com>
Mon, 30 Jul 2018 15:19:05 +0000 (15:19 +0000)
Started crashing in r337453. See the added test case for the crash repro.

The fix reverts part of r337453 that causes the crash and does
not actually break anything when reverted.

llvm-svn: 338255

clang/lib/Sema/SemaCodeComplete.cpp
clang/test/Index/complete-access-checks-crash.cpp [new file with mode: 0644]

index 4e571eba17e960ef2920dad11348a8bbb5544cb4..30af826ef6cc0b1c07f34125fdaa9a69ae146bf1 100644 (file)
@@ -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/clang/test/Index/complete-access-checks-crash.cpp b/clang/test/Index/complete-access-checks-crash.cpp
new file mode 100644 (file)
index 0000000..c7ac4d6
--- /dev/null
@@ -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)
+  }
+};