From: Sam McCall Date: Wed, 14 Dec 2022 16:26:14 +0000 (+0100) Subject: [CodeComplete] Provide designated-init completions in (const) reference context X-Git-Tag: upstream/17.0.6~23807 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bd672e2fc03823e536866da6721b9f053cfd586b;p=platform%2Fupstream%2Fllvm.git [CodeComplete] Provide designated-init completions in (const) reference context Differential Revision: https://reviews.llvm.org/D140029 --- diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index d18b0bd..0745677 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -5122,7 +5122,8 @@ static void AddRecordMembersCompletionResults( // Returns the RecordDecl inside the BaseType, falling back to primary template // in case of specializations. Since we might not have a decl for the // instantiation/specialization yet, e.g. dependent code. -static RecordDecl *getAsRecordDecl(const QualType BaseType) { +static RecordDecl *getAsRecordDecl(QualType BaseType) { + BaseType = BaseType.getNonReferenceType(); if (auto *RD = BaseType->getAsRecordDecl()) { if (const auto *CTSD = llvm::dyn_cast(RD)) { diff --git a/clang/test/CodeCompletion/desig-init.cpp b/clang/test/CodeCompletion/desig-init.cpp index 76f6d2d..49a461d 100644 --- a/clang/test/CodeCompletion/desig-init.cpp +++ b/clang/test/CodeCompletion/desig-init.cpp @@ -29,13 +29,17 @@ void foo() { // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:25:11 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC2 %s // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:26:13 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC2 %s // CHECK-CC2: COMPLETION: t : [#int#]t + auto zr = [](const Base &B) {}; + zr({.t = 1}); + // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:33:8 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-REF %s + // CHECK-REF: COMPLETION: t : [#int#]t Foo G1{.b = {.t = 0}}; Foo G2{.b{.t = 0}}; Foo G3{b: {.t = 0}}; - // RUN: %clang_cc1 -code-completion-at=%s:33:17 -fsyntax-only -code-completion-patterns %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-NESTED-2 %s - // RUN: %clang_cc1 -code-completion-at=%s:34:14 -fsyntax-only -code-completion-patterns %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-NESTED-2 %s - // RUN: %clang_cc1 -code-completion-at=%s:35:15 -fsyntax-only -code-completion-patterns %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-NESTED-2 %s + // RUN: %clang_cc1 -code-completion-at=%s:37:17 -fsyntax-only -code-completion-patterns %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-NESTED-2 %s + // RUN: %clang_cc1 -code-completion-at=%s:38:14 -fsyntax-only -code-completion-patterns %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-NESTED-2 %s + // RUN: %clang_cc1 -code-completion-at=%s:39:15 -fsyntax-only -code-completion-patterns %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-NESTED-2 %s // CHECK-NESTED-2: COMPLETION: t : [#int#]t } @@ -49,10 +53,10 @@ struct Test { }; void bar() { Test T{.x = 2}; - // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:51:17 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC3 %s + // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:55:17 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC3 %s // CHECK-CC3: COMPLETION: x : [#T#]x Test X{.x = 2}; - // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:54:16 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC4 %s + // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:58:16 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC4 %s // CHECK-CC4: COMPLETION: x : [#int#]x // CHECK-CC4-NEXT: COMPLETION: y : [#char#]y } @@ -60,7 +64,7 @@ void bar() { template void aux() { Test X{.x = T(2)}; - // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:62:14 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC3 %s + // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:66:14 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC3 %s } namespace signature_regression { @@ -71,7 +75,7 @@ namespace signature_regression { int rightFunction(); int dummy = wrongFunction({1}); int x = rightFunction(); - // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:73:25 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-SIGNATURE-REGRESSION %s + // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:77:25 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-SIGNATURE-REGRESSION %s // CHECK-SIGNATURE-REGRESSION-NOT: OVERLOAD: [#int#]wrongFunction // CHECK-SIGNATURE-REGRESSION: OVERLOAD: [#int#]rightFunction // CHECK-SIGNATURE-REGRESSION-NOT: OVERLOAD: [#int#]wrongFunction @@ -82,6 +86,6 @@ struct WithAnon { struct { int inner; }; }; auto TestWithAnon = WithAnon { .inner = 2 }; - // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:84:33 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC5 %s + // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:88:33 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC5 %s // CHECK-CC5: COMPLETION: inner : [#int#]inner // CHECK-CC5: COMPLETION: outer : [#int#]outer