kadircet created this revision. kadircet added reviewers: sammccall, hokein, adamcz. Herald added subscribers: cfe-commits, usaxena95. Herald added a project: clang. kadircet requested review of this revision. Herald added a subscriber: ilya-biryukov.
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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D92370 Files: clang/lib/Parse/ParseExpr.cpp clang/test/CodeCompletion/desig-init.cpp Index: clang/test/CodeCompletion/desig-init.cpp =================================================================== --- clang/test/CodeCompletion/desig-init.cpp +++ clang/test/CodeCompletion/desig-init.cpp @@ -23,9 +23,11 @@ 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 @@ }; 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 @@ 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 } Index: clang/lib/Parse/ParseExpr.cpp =================================================================== --- clang/lib/Parse/ParseExpr.cpp +++ clang/lib/Parse/ParseExpr.cpp @@ -3111,6 +3111,7 @@ 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());
Index: clang/test/CodeCompletion/desig-init.cpp =================================================================== --- clang/test/CodeCompletion/desig-init.cpp +++ clang/test/CodeCompletion/desig-init.cpp @@ -23,9 +23,11 @@ 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 @@ }; 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 @@ 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 } Index: clang/lib/Parse/ParseExpr.cpp =================================================================== --- clang/lib/Parse/ParseExpr.cpp +++ clang/lib/Parse/ParseExpr.cpp @@ -3111,6 +3111,7 @@ 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());
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits