Sebastian Redl | c223518 | 2011-10-16 18:19:28 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s |
| 2 | |
Sebastian Redl | cc7a648 | 2011-11-01 15:53:09 +0000 | [diff] [blame] | 3 | struct one { char c[1]; }; |
| 4 | struct two { char c[2]; }; |
| 5 | |
Sebastian Redl | c223518 | 2011-10-16 18:19:28 +0000 | [diff] [blame] | 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 | |
Sebastian Redl | cc7a648 | 2011-11-01 15:53:09 +0000 | [diff] [blame] | 22 | void bracing() { |
Sebastian Redl | c223518 | 2011-10-16 18:19:28 +0000 | [diff] [blame] | 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 | } |
Sebastian Redl | cc7a648 | 2011-11-01 15:53:09 +0000 | [diff] [blame] | 29 | |
Sebastian Redl | 6dc00f6 | 2012-02-12 18:41:05 +0000 | [diff] [blame] | 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 | |
Sebastian Redl | 20ff0e2 | 2012-02-13 19:55:43 +0000 | [diff] [blame] | 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 | |
Sebastian Redl | cc7a648 | 2011-11-01 15:53:09 +0000 | [diff] [blame] | 44 | struct String { |
| 45 | String(const char*); |
| 46 | }; |
| 47 | |
| 48 | struct A { |
| 49 | int m1; |
| 50 | int m2; |
| 51 | }; |
| 52 | |
| 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 | |
| 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 | } |
Sebastian Redl | 3a45c0e | 2012-02-12 16:37:36 +0000 | [diff] [blame] | 73 | |
Richard Smith | 9f02d6d | 2012-02-16 00:54:02 +0000 | [diff] [blame] | 74 | struct C { int a[2]; C():a({1, 2}) { } }; // expected-error {{parenthesized initialization of a member array is a GNU extension}} |
Sebastian Redl | c223518 | 2011-10-16 18:19:28 +0000 | [diff] [blame] | 75 | } |
Eli Friedman | c60ccf5 | 2012-02-29 00:00:28 +0000 | [diff] [blame] | 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[]; |
| 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 | } |
Richard Smith | 2059939 | 2012-07-07 08:35:56 +0000 | [diff] [blame] | 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 | } |