142e9478eSKadir Cetinkaya struct Base {
242e9478eSKadir Cetinkaya   int t;
342e9478eSKadir Cetinkaya };
442e9478eSKadir Cetinkaya struct Foo : public Base {
542e9478eSKadir Cetinkaya   int x;
642e9478eSKadir Cetinkaya   Base b;
742e9478eSKadir Cetinkaya   void foo();
842e9478eSKadir Cetinkaya };
942e9478eSKadir Cetinkaya 
foo()1042e9478eSKadir Cetinkaya void foo() {
1142e9478eSKadir Cetinkaya   Foo F{.x = 2, .b.t = 0};
1242e9478eSKadir Cetinkaya   // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:11:10 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC1 %s
1342e9478eSKadir Cetinkaya   // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:11:18 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-CC1 %s
1442e9478eSKadir Cetinkaya   // CHECK-CC1: COMPLETION: b : [#Base#]b
1542e9478eSKadir Cetinkaya   // CHECK-CC1-NEXT: COMPLETION: x : [#int#]x
1642e9478eSKadir Cetinkaya   // CHECK-CC1-NOT: foo
1742e9478eSKadir Cetinkaya   // CHECK-CC1-NOT: t
1842e9478eSKadir Cetinkaya 
19eb4ab335SSam McCall   // RUN: %clang_cc1 -fsyntax-only -code-completion-patterns -code-completion-at=%s:11:20 %s -o - | FileCheck -check-prefix=CHECK-NESTED %s
20eb4ab335SSam McCall   // CHECK-NESTED: COMPLETION: t : [#int#]t
2142e9478eSKadir Cetinkaya 
2242e9478eSKadir Cetinkaya   Base B = {.t = 2};
2342e9478eSKadir Cetinkaya   auto z = [](Base B) {};
2442e9478eSKadir Cetinkaya   z({.t = 1});
2542e9478eSKadir Cetinkaya   z(Base{.t = 2});
26e98d3be1SKadir Cetinkaya   z((Base){.t = 2});
2742e9478eSKadir Cetinkaya   // 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
2842e9478eSKadir Cetinkaya   // 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
2942e9478eSKadir Cetinkaya   // 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
30e98d3be1SKadir Cetinkaya   // 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
3142e9478eSKadir Cetinkaya   // CHECK-CC2: COMPLETION: t : [#int#]t
32eb4ab335SSam McCall 
33eb4ab335SSam McCall   Foo G1{.b = {.t = 0}};
34eb4ab335SSam McCall   Foo G2{.b{.t = 0}};
35eb4ab335SSam McCall   Foo G3{b: {.t = 0}};
36eb4ab335SSam McCall   // 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
37eb4ab335SSam McCall   // 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
38eb4ab335SSam McCall   // 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
39eb4ab335SSam McCall   // CHECK-NESTED-2: COMPLETION: t : [#int#]t
4042e9478eSKadir Cetinkaya }
4142e9478eSKadir Cetinkaya 
4242e9478eSKadir Cetinkaya // Handle templates
4342e9478eSKadir Cetinkaya template <typename T>
4442e9478eSKadir Cetinkaya struct Test { T x; };
4542e9478eSKadir Cetinkaya template <>
4642e9478eSKadir Cetinkaya struct Test<int> {
4742e9478eSKadir Cetinkaya   int x;
4842e9478eSKadir Cetinkaya   char y;
4942e9478eSKadir Cetinkaya };
bar()5042e9478eSKadir Cetinkaya void bar() {
5142e9478eSKadir Cetinkaya   Test<char> T{.x = 2};
52eb4ab335SSam McCall   // 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
5342e9478eSKadir Cetinkaya   // CHECK-CC3: COMPLETION: x : [#T#]x
5442e9478eSKadir Cetinkaya   Test<int> X{.x = 2};
55eb4ab335SSam McCall   // 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
5642e9478eSKadir Cetinkaya   // CHECK-CC4: COMPLETION: x : [#int#]x
5742e9478eSKadir Cetinkaya   // CHECK-CC4-NEXT: COMPLETION: y : [#char#]y
5842e9478eSKadir Cetinkaya }
5942e9478eSKadir Cetinkaya 
6042e9478eSKadir Cetinkaya template <typename T>
aux()6142e9478eSKadir Cetinkaya void aux() {
6242e9478eSKadir Cetinkaya   Test<T> X{.x = T(2)};
63eb4ab335SSam McCall   // 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
6442e9478eSKadir Cetinkaya }
65128ce70eSSam McCall 
66128ce70eSSam McCall namespace signature_regression {
67128ce70eSSam McCall   // Verify that an old bug is gone: passing an init-list as a constructor arg
68128ce70eSSam McCall   // would emit overloads as a side-effect.
69128ce70eSSam McCall   struct S{int x;};
70128ce70eSSam McCall   int wrongFunction(S);
71128ce70eSSam McCall   int rightFunction();
72128ce70eSSam McCall   int dummy = wrongFunction({1});
73128ce70eSSam McCall   int x = rightFunction();
74128ce70eSSam McCall   // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:73:25 %s -o - -std=c++2a | FileCheck -check-prefix=CHECK-SIGNATURE-REGRESSION %s
75128ce70eSSam McCall   // CHECK-SIGNATURE-REGRESSION-NOT: OVERLOAD: [#int#]wrongFunction
76128ce70eSSam McCall   // CHECK-SIGNATURE-REGRESSION:     OVERLOAD: [#int#]rightFunction
77128ce70eSSam McCall   // CHECK-SIGNATURE-REGRESSION-NOT: OVERLOAD: [#int#]wrongFunction
78128ce70eSSam McCall }
79128ce70eSSam McCall 
80*bbf234b5SSam McCall struct WithAnon {
81*bbf234b5SSam McCall   int outer;
82*bbf234b5SSam McCall   struct { int inner; };
83*bbf234b5SSam McCall };
84*bbf234b5SSam McCall auto TestWithAnon = WithAnon { .inner = 2 };
85*bbf234b5SSam McCall   // 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
86*bbf234b5SSam McCall   // CHECK-CC5: COMPLETION: inner : [#int#]inner
87*bbf234b5SSam McCall   // CHECK-CC5: COMPLETION: outer : [#int#]outer
88