diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -6344,7 +6344,15 @@ CodeCompleter->getCodeCompletionTUInfo(), CCC); Results.EnterNewScope(); - for (const auto *FD : RD->fields()) { + for (const Decl *D : RD->decls()) { + const FieldDecl *FD; + if (auto *IFD = dyn_cast(D)) + FD = IFD->getAnonField(); + else if (auto *DFD = dyn_cast(D)) + FD = DFD; + else + continue; + // FIXME: Make use of previous designators to mark any fields before those // inaccessible, and also compute the next initializer priority. ResultBuilder::Result Result(FD, Results.getBasePriority(FD)); diff --git a/clang/test/CodeCompletion/desig-init.cpp b/clang/test/CodeCompletion/desig-init.cpp --- a/clang/test/CodeCompletion/desig-init.cpp +++ b/clang/test/CodeCompletion/desig-init.cpp @@ -77,3 +77,11 @@ // CHECK-SIGNATURE-REGRESSION-NOT: OVERLOAD: [#int#]wrongFunction } +struct WithAnon { + int outer; + 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 + // CHECK-CC5: COMPLETION: inner : [#int#]inner + // CHECK-CC5: COMPLETION: outer : [#int#]outer