[clang] 4dd71b3 - [clang] Give priority to Class context while parsing declarations

Kadir Cetinkaya via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 17 01:07:09 PDT 2022


Author: Furkan Usta
Date: 2022-08-17T10:06:39+02:00
New Revision: 4dd71b3cb9473e960d06f5c4c60f0817bd5b9cf6

URL: https://github.com/llvm/llvm-project/commit/4dd71b3cb9473e960d06f5c4c60f0817bd5b9cf6
DIFF: https://github.com/llvm/llvm-project/commit/4dd71b3cb9473e960d06f5c4c60f0817bd5b9cf6.diff

LOG: [clang] Give priority to Class context while parsing declarations

Fixes https://github.com/clangd/clangd/issues/290.

Reviewed By: kadircet

Differential Revision: https://reviews.llvm.org/D130363

Added: 
    

Modified: 
    clang/lib/Parse/ParseDecl.cpp
    clang/test/CodeCompletion/overrides.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 39ba93ee33859..769809c9c9c4f 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -3266,13 +3266,14 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS,
         return;
       }
 
-      if (getCurScope()->getFnParent() || getCurScope()->getBlockParent())
-        CCC = Sema::PCC_LocalDeclarationSpecifiers;
-      else if (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate)
+      // Class context can appear inside a function/block, so prioritise that.
+      if (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate)
         CCC = DSContext == DeclSpecContext::DSC_class ? Sema::PCC_MemberTemplate
                                                       : Sema::PCC_Template;
       else if (DSContext == DeclSpecContext::DSC_class)
         CCC = Sema::PCC_Class;
+      else if (getCurScope()->getFnParent() || getCurScope()->getBlockParent())
+        CCC = Sema::PCC_LocalDeclarationSpecifiers;
       else if (CurParsedObjCImpl)
         CCC = Sema::PCC_ObjCImplementation;
 

diff  --git a/clang/test/CodeCompletion/overrides.cpp b/clang/test/CodeCompletion/overrides.cpp
index 6645569d82a77..543c67fac7db4 100644
--- a/clang/test/CodeCompletion/overrides.cpp
+++ b/clang/test/CodeCompletion/overrides.cpp
@@ -11,7 +11,7 @@ void vfunc(bool param, int p) override;
 class C : public B {
  public:
   void vfunc(bool param) override;
-  vf
+  vf;
 };
 
 // Runs completion at ^vf
@@ -31,3 +31,13 @@ class C : public B {
 // CHECK-CC3-NOT: COMPLETION: Pattern : int ttt(bool param, int x = 3) const override{{$}}
 // CHECK-CC3-NOT: COMPLETION: Pattern : void vfunc(bool param, int p) override{{$}}
 // CHECK-CC3-NOT: COMPLETION: Pattern : void vfunc(bool param) override{{$}}
+
+void func() {
+  class D : public A {
+
+  };
+}
+
+// Runs completion at empty line on line 37.
+// RUN: not %clang_cc1 -fsyntax-only -code-completion-at=%s:37:1 %s -o - | FileCheck -check-prefix=CHECK-CC4 %s
+// CHECK-CC4: COMPLETION: Pattern : void vfunc(bool param, int p) override{{$}}


        


More information about the cfe-commits mailing list