[CodeComplete] Provide completion in decls even for incomplete types
authorIlya Biryukov <ibiryukov@google.com>
Mon, 14 May 2018 13:50:36 +0000 (13:50 +0000)
committerIlya Biryukov <ibiryukov@google.com>
Mon, 14 May 2018 13:50:36 +0000 (13:50 +0000)
Summary:
This change fixes lack of completions in the following case
('^'designates completion points) :

    void f(^);
    struct Incomplete;
    Incomplete g(^);

Reviewers: bkramer, aaron.ballman, sammccall

Reviewed By: aaron.ballman

Subscribers: cfe-commits

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

llvm-svn: 332244

clang/lib/Sema/SemaCodeComplete.cpp
clang/test/CodeCompletion/incomplete-ret-type.cpp [new file with mode: 0644]

index 4ed9d49..66b48e7 100644 (file)
@@ -4493,10 +4493,8 @@ void Sema::CodeCompleteConstructor(Scope *S, QualType Type, SourceLocation Loc,
     return;
 
   // A complete type is needed to lookup for constructors.
-  if (!isCompleteType(Loc, Type))
-    return;
-
-  CXXRecordDecl *RD = Type->getAsCXXRecordDecl();
+  CXXRecordDecl *RD =
+      isCompleteType(Loc, Type) ? Type->getAsCXXRecordDecl() : nullptr;
   if (!RD) {
     CodeCompleteExpression(S, Type);
     return;
diff --git a/clang/test/CodeCompletion/incomplete-ret-type.cpp b/clang/test/CodeCompletion/incomplete-ret-type.cpp
new file mode 100644 (file)
index 0000000..669105e
--- /dev/null
@@ -0,0 +1,13 @@
+struct IncompleteType;
+int int_value;
+typedef int int_typedef;
+
+void f(in);
+IncompleteType g(in);
+// Completing should produce results even if types are incomplete.
+// Note that clang is expected to return an error code since 'in' does not resolve.
+// RUN: not %clang_cc1 -fsyntax-only -code-completion-at=%s:5:9 %s -o - | FileCheck %s
+// RUN: not %clang_cc1 -fsyntax-only -code-completion-at=%s:6:19 %s -o - | FileCheck %s
+// CHECK: COMPLETION: int{{$}}
+// CHECK: COMPLETION: int_typedef
+// CHECK: COMPLETION: int_value