180 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Wno-reorder -Wno-c99-designator -Winitializer-overrides %s2// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -Wno-reorder -Wno-c99-designator -Woverride-init %s3 4template <typename T> struct Foo {5 struct SubFoo {6 int bar1;7 int bar2;8 };9 10 static void Test() { SubFoo sf = {.bar1 = 10, .bar2 = 20}; } // Expected no warning11};12 13void foo() {14 Foo<int>::Test();15 Foo<bool>::Test();16 Foo<float>::Test();17}18 19template <typename T> struct Bar {20 struct SubFoo {21 int bar1;22 int bar2;23 };24 25 static void Test() { SubFoo sf = {.bar1 = 10, // expected-note 2 {{previous initialization is here}}26 .bar1 = 20}; } // expected-warning 2 {{initializer overrides prior initialization of this subobject}}27};28 29void bar() {30 Bar<int>::Test(); // expected-note {{in instantiation of member function 'Bar<int>::Test' requested here}}31 Bar<bool>::Test(); // expected-note {{in instantiation of member function 'Bar<bool>::Test' requested here}}32}33 34namespace Reorder {35 struct X {36 X(int n);37 private:38 int i;39 };40 41 struct foo {42 X x;43 X y;44 };45 46 foo n = {.y = 4, .x = 5};47 X arr[2] = {[1] = 1, [0] = 2};48}49 50namespace Reorder2 {51 struct S {52 S();53 S(const S &);54 ~S();55 };56 57 struct EF {58 S s;59 };60 61 struct PN {62 PN(const PN &);63 };64 extern PN pn;65 66 struct FLN {67 EF ef;68 int it;69 PN pn;70 };71 72 void f() {73 FLN new_elem = {74 .ef = EF(),75 .pn = pn,76 .it = 0,77 };78 }79}80 81namespace Reorder3 {82 struct S {83 int a, &b, &c; // expected-note 2{{here}}84 };85 S s1 = {86 .a = 1, .c = s1.a, .b = s1.a87 };88 S s2 = {89 .a = 1, .c = s2.a90 }; // expected-error {{uninitialized}}91 S s3 = {92 .b = s3.a, .a = 1,93 }; // expected-error {{uninitialized}}94}95 96// Check that we don't even think about whether holes in a designated97// initializer are zero-initializable if the holes are filled later.98namespace NoCheckingFilledHoles {99 template<typename T> struct Error { using type = typename T::type; }; // expected-error 3{{'::'}}100 101 template<int N>102 struct DefaultInitIsError {103 DefaultInitIsError(Error<int[N]> = {}); // expected-note 3{{instantiation}} expected-note 3{{passing}}104 DefaultInitIsError(int, int);105 };106 107 template<int N>108 struct X {109 int a;110 DefaultInitIsError<N> e;111 int b;112 };113 X<1> x1 = {114 .b = 2,115 .a = 1,116 {4, 4}117 };118 X<2> x2 = {119 .e = {4, 4},120 .b = 2,121 .a = 1122 };123 X<3> x3 = {124 .b = 2,125 .a = 1126 }; // expected-note {{default function argument}}127 X<4> x4 = {128 .a = 1,129 .b = 2130 }; // expected-note {{default function argument}}131 X<5> x5 = {132 .e = {4, 4},133 .a = 1,134 .b = 2135 };136 X<6> x6 = {137 .a = 1,138 .b = 2,139 .e = {4, 4}140 };141 142 template<int N> struct Y { X<N> x; };143 Y<7> y7 = {144 .x = {.a = 1, .b = 2}, // expected-note {{default function argument}}145 .x.e = {3, 4}146 };147 Y<8> y8 = {148 .x = {.e = {3, 4}},149 .x.a = 1,150 .x.b = 2151 };152}153 154namespace LargeArrayDesignator {155 struct X {156 int arr[1000000000];157 };158 struct Y {159 int arr[3];160 };161 void f(X x);162 void f(Y y) = delete;163 void g() {164 f({.arr[4] = 1});165 }166}167 168namespace ADL {169 struct A {};170 void f(A, int);171 172 namespace X {173 void f(A, int);174 // OK. Would fail if checking {} against type A set the type of the175 // initializer list to A, because ADL would find ADL::f, resulting in176 // ambiguity.177 void g() { f({}, {}); }178 }179}180