1 // RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s 2 3 struct one { char c[1]; }; 4 struct two { char c[2]; }; 5 6 namespace aggregate { 7 // Direct list initialization does NOT allow braces to be elided! 8 struct S { 9 int ar[2]; 10 struct T { 11 int i1; 12 int i2; 13 } t; 14 struct U { 15 int i1; 16 } u[2]; 17 struct V { 18 int var[2]; 19 } v; 20 }; 21 bracing()22 void bracing() { 23 S s1 = { 1, 2, 3 ,4, 5, 6, 7, 8 }; // no-error 24 S s2{ {1, 2}, {3, 4}, { {5}, {6} }, { {7, 8} } }; // completely braced 25 S s3{ 1, 2, 3, 4, 5, 6 }; // expected-error 5 {{cannot omit braces}} 26 S s4{ {1, 2}, {3, 4}, {5, 6}, { {7, 8} } }; // expected-error 2 {{cannot omit braces}} 27 S s5{ {1, 2}, {3, 4}, { {5}, {6} }, {7, 8} }; // expected-error {{cannot omit braces}} 28 } 29 bracing_new()30 void bracing_new() { 31 new S{ {1, 2}, {3, 4}, { {5}, {6} }, { {7, 8} } }; // completely braced 32 new S{ 1, 2, 3, 4, 5, 6 }; // expected-error 5 {{cannot omit braces}} 33 new S{ {1, 2}, {3, 4}, {5, 6}, { {7, 8} } }; // expected-error 2 {{cannot omit braces}} 34 new S{ {1, 2}, {3, 4}, { {5}, {6} }, {7, 8} }; // expected-error {{cannot omit braces}} 35 } 36 bracing_construct()37 void bracing_construct() { 38 (void) S{ {1, 2}, {3, 4}, { {5}, {6} }, { {7, 8} } }; // completely braced 39 (void) S{ 1, 2, 3, 4, 5, 6 }; // expected-error 5 {{cannot omit braces}} 40 (void) S{ {1, 2}, {3, 4}, {5, 6}, { {7, 8} } }; // expected-error 2 {{cannot omit braces}} 41 (void) S{ {1, 2}, {3, 4}, { {5}, {6} }, {7, 8} }; // expected-error {{cannot omit braces}} 42 } 43 44 struct String { 45 String(const char*); 46 }; 47 48 struct A { 49 int m1; 50 int m2; 51 }; 52 function_call()53 void function_call() { 54 void takes_A(A); 55 takes_A({1, 2}); 56 } 57 58 struct B { 59 int m1; 60 String m2; 61 }; 62 overloaded_call()63 void overloaded_call() { 64 one overloaded(A); 65 two overloaded(B); 66 67 static_assert(sizeof(overloaded({1, 2})) == sizeof(one), "bad overload"); 68 static_assert(sizeof(overloaded({1, "two"})) == sizeof(two), 69 "bad overload"); 70 // String is not default-constructible 71 static_assert(sizeof(overloaded({1})) == sizeof(one), "bad overload"); 72 } 73 Caggregate::C74 struct C { int a[2]; C():a({1, 2}) { } }; // expected-error {{parenthesized initialization of a member array is a GNU extension}} 75 } 76 77 namespace array_explicit_conversion { 78 typedef int test1[2]; 79 typedef int test2[]; 80 template<int x> struct A { int a[x]; }; // expected-error {{'a' declared as an array with a negative size}} 81 typedef A<1> test3[]; 82 typedef A<-1> test4[]; f()83 void f() { 84 (void)test1{1}; 85 (void)test2{1}; 86 (void)test3{{{1}}}; 87 (void)test4{{{1}}}; // expected-note {{in instantiation of template class 'array_explicit_conversion::A<-1>' requested here}} 88 } 89 } 90 91 namespace sub_constructor { 92 struct DefaultConstructor { // expected-note 2 {{not viable}} 93 DefaultConstructor(); // expected-note {{not viable}} 94 int x; 95 }; 96 struct NoDefaultConstructor1 { // expected-note 2 {{not viable}} 97 NoDefaultConstructor1(int); // expected-note {{not viable}} 98 int x; 99 }; 100 struct NoDefaultConstructor2 { // expected-note 4 {{not viable}} 101 NoDefaultConstructor2(int,int); // expected-note 2 {{not viable}} 102 int x; 103 }; 104 105 struct Aggr { 106 DefaultConstructor a; 107 NoDefaultConstructor1 b; 108 NoDefaultConstructor2 c; 109 }; 110 111 Aggr ok1 { {}, {0} , {0,0} }; 112 Aggr ok2 = { {}, {0} , {0,0} }; 113 Aggr too_many { {0} , {0} , {0,0} }; // expected-error {{no matching constructor for initialization}} 114 Aggr too_few { {} , {0} , {0} }; // expected-error {{no matching constructor for initialization}} 115 Aggr invalid { {} , {&ok1} , {0,0} }; // expected-error {{no matching constructor for initialization}} 116 NoDefaultConstructor2 array_ok[] = { {0,0} , {0,1} }; 117 NoDefaultConstructor2 array_error[] = { {0,0} , {0} }; // expected-error {{no matching constructor for initialization}} 118 }