r338255 - [CodeComplete] Fix the crash in code completion on access checking

Ilya Biryukov via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 30 08:19:05 PDT 2018


Author: ibiryukov
Date: Mon Jul 30 08:19:05 2018
New Revision: 338255

URL: http://llvm.org/viewvc/llvm-project?rev=338255&view=rev
Log:
[CodeComplete] Fix the crash in code completion on access checking

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.

Added:
    cfe/trunk/test/Index/complete-access-checks-crash.cpp
Modified:
    cfe/trunk/lib/Sema/SemaCodeComplete.cpp

Modified: cfe/trunk/lib/Sema/SemaCodeComplete.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCodeComplete.cpp?rev=338255&r1=338254&r2=338255&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaCodeComplete.cpp (original)
+++ cfe/trunk/lib/Sema/SemaCodeComplete.cpp Mon Jul 30 08:19:05 2018
@@ -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);

Added: cfe/trunk/test/Index/complete-access-checks-crash.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/complete-access-checks-crash.cpp?rev=338255&view=auto
==============================================================================
--- cfe/trunk/test/Index/complete-access-checks-crash.cpp (added)
+++ cfe/trunk/test/Index/complete-access-checks-crash.cpp Mon Jul 30 08:19:05 2018
@@ -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)
+  }
+};




More information about the cfe-commits mailing list