Author: Kadir Cetinkaya Date: 2020-12-01T12:06:48+01:00 New Revision: e98d3be11c2991c7d446d5c7c714d0384f3b7432
URL: https://github.com/llvm/llvm-project/commit/e98d3be11c2991c7d446d5c7c714d0384f3b7432 DIFF: https://github.com/llvm/llvm-project/commit/e98d3be11c2991c7d446d5c7c714d0384f3b7432.diff LOG: [clang] Enable code completion of designated initializers in Compound Literal Expressions PreferedType were not set when parsing compound literals, hence designated initializers were not available as code completion suggestions. This patch sets the preferedtype to parsed type for the following initializer list. Fixes https://github.com/clangd/clangd/issues/142. Differential Revision: https://reviews.llvm.org/D92370 Added: Modified: clang/lib/Parse/ParseExpr.cpp clang/test/CodeCompletion/desig-init.cpp Removed: ################################################################################ diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index b3dae626fb0f..d993d9ce4bdb 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -3111,6 +3111,7 @@ Parser::ParseCompoundLiteralExpression(ParsedType Ty, assert(Tok.is(tok::l_brace) && "Not a compound literal!"); if (!getLangOpts().C99) // Compound literals don't exist in C90. Diag(LParenLoc, diag::ext_c99_compound_literal); + PreferredType.enterTypeCast(Tok.getLocation(), Ty.get()); ExprResult Result = ParseInitializer(); if (!Result.isInvalid() && Ty) return Actions.ActOnCompoundLiteral(LParenLoc, Ty, RParenLoc, Result.get()); diff --git a/clang/test/CodeCompletion/desig-init.cpp b/clang/test/CodeCompletion/desig-init.cpp index ebfd63266397..fbcaeb303e50 100644 --- a/clang/test/CodeCompletion/desig-init.cpp +++ b/clang/test/CodeCompletion/desig-init.cpp @@ -23,9 +23,11 @@ void foo() { auto z = [](Base B) {}; z({.t = 1}); z(Base{.t = 2}); + z((Base){.t = 2}); // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:22:14 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC2 %s // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:24:7 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC2 %s // 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 } @@ -39,10 +41,10 @@ struct Test<int> { }; void bar() { Test<char> T{.x = 2}; - // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:41:17 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC3 %s + // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:43:17 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC3 %s // CHECK-CC3: COMPLETION: x : [#T#]x Test<int> X{.x = 2}; - // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:44:16 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC4 %s + // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:46: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 } @@ -50,5 +52,5 @@ void bar() { template <typename T> void aux() { Test<T> X{.x = T(2)}; - // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:52:14 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC3 %s + // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:54:14 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC3 %s } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits